Невозможно вызвать SecItemAdd успешно - PullRequest
0 голосов
/ 20 ноября 2018

Я пытаюсь добавить простой строковый секрет в связку ключей в macOS через API C ++.К сожалению, я не могу получить мой звонок на SecItemAdd на работу.Я знаю, это потому, что мое значение для клавиши kSecValueRef неправильного типа, но пока Google / Apple docs / существующих вопросов 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 docs написано:

Соответствующее значение, в зависимости от запрошенного класса элемента, имеет тип SecKeychainItem, SecKey, SecCertificate или SecIdentity.

Но у меня нет SecKeychainItem, потому что я еще не добавил элемент, а другие типы не подходят для обычной строки.

Мысли?

1 Ответ

0 голосов
/ 20 ноября 2018

Разобрался! Для простых данных, таких как строка, вы должны использовать клавишу 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" );
...