Я создаю специальную цепочку для ключей, а затем сохраняю в ней пароль следующим образом:
SecKeychainRef someKeychain; //keychain reference
SecKeychainItemRef someItem; //keychain key item reference
SecKeychainCreate([keychainPath UTF8String], (UInt32)strlen(keychainPass), keychainPass, FALSE, NULL, &someKeychain);
SecKeychainAddGenericPassword(someKeychain, (UInt32)strlen(someServiceName), someServiceName, (UInt32)strlen(someAccountName), someAccountName, (UInt32)strlen(encryptedPass), encryptedPass, &someItem);
Сейчас я хотел бы сделать добавленный someItem
доступным для любого приложения, которое знает keychainPass
, не предлагая пользователю разрешить. Я попробовал вот так:
SecACLRef aclList;
SecAccessRef itemAccessRef;
uid_t userid = 0;
gid_t groupid;
CFArrayRef aclListArr;
SecACLRef newAcl;
SecKeychainItemCopyAccess(someItem, &itemAccessRef);
SecAccessCopyOwnerAndACL(itemAccessRef, &userid, &groupid, (UInt32*)kSecUseOnlyUID, &aclListArr);
SecACLCreateWithSimpleContents(itemAccessRef, NULL, (__bridge CFStringRef)@"someTagName", kSecKeychainPromptInvalid, &newAcl);
Но:
- Я не знаю, подходит ли функция
SecACLCreateWithSimpleContents
для достижения этой цели - Если это так, я не знаю, как записать созданный с его помощью список ACL обратно в
someItem
- Я не знаю, как работать с этими CFArrays, которые он возвращает (я новичок в objective-c)
Я знаю, что это должно быть возможно, потому что, когда я импортирую только что созданную связку ключей в приложение Keychain Access OS X и отмечаю свойства someItem
как доступные для любого приложения, подсказка исчезает, и все работает. Я не знаю, как этого добиться программно. Я понимаю, что это может быть глупый вопрос, но не знаю, что делать.