Я пытаюсь добавить простой строковый секрет к их цепочке для ключей в macOS через API C ++. К сожалению, я не могу позвонить SecItemAdd
работать. Я знаю, это потому, что моя ценность для kSecValueRef
ключ неправильного типа, но пока Google /Apple документы/существующие вопросы StackOverflow Мне еще предстоит раскрыть мне, какой тип я должен использовать, и как его создать. Вот что у меня так далеко:
CFStringRef keys[4];
keys[0] = kSecClass;
keys[1] = kSecValueRef;
keys[2] = kSecAttrAccount;
keys[3] = kSecAttrService;
CFTypeRef values[4];
values[0] = kSecClassGenericPassword;
values[1] = CFSTR("password");
values[2] = CFSTR( "account-1" );
values[3] = CFSTR( "service-1" );
CFDictionaryRef attributes = CFDictionaryCreate
(
( CFAllocatorRef )NULL,
( const void ** )keys,
( const void ** )values,
4,
&kCFTypeDictionaryKeyCallBacks,
&kCFTypeDictionaryValueCallBacks
);
CFShow(attributes);
OSStatus status = SecItemAdd(attributes, NULL);
Так что я должен положить для моего kSecValueRef
? Я пытался сделать ссылку на CFStringRef, но это не сработало. Я также вижу, что в Apple документы это говорит:
Соответствующее значение, в зависимости от запрошенного класса элемента, имеет тип SecKeychainItem, SecKey, SecCertificate или SecIdentity.
Но у меня нет SecKeychainItem
потому что я еще не добавил элемент, а другие типы не подходят для обычной строки.
Мысли?
Догадаться! Для простых данных, таких как строка, вы должны использовать kSecValueData
ключ. Это позволит вам просто пройти в CFStringRef
,
Пример:
CFStringRef keys[4];
keys[0] = kSecClass;
keys[1] = kSecAttrAccount;
keys[2] = kSecAttrService;
keys[3] = kSecValueData;
CFTypeRef values[4];
values[0] = kSecClassGenericPassword;
values[1] = CFSTR( "account-15" );
values[2] = CFSTR( "service-126" );
values[3] = CFSTR( "password" );
Других решений пока нет …