iOS keychain – errSecItemNotFound с iOS 9.2 beta 3

Я использую брелок для хранения конфиденциальных данных.

Поскольку iOS 9.2 beta 3, я не могу получить конфиденциальные данные, созданные из предыдущей версии iOS (например, iOS 9.1). У меня есть ошибка errSecItemNotFound при использовании SecItemCopyMatching. Нет проблем с iOS 9.1 (ни IOS 9.2 beta 2, ни iOS 7.x / 8.x / 9.0).

Очень странно: мой исходный код создает новые конфиденциальные данные, если он не существует, поэтому с iOS 9.2 beta 3 у меня есть новые конфиденциальные данные, но если я вернусь к iOS 9.1, я получу старые конфиденциальные данные и так далее когда вернемся к iOS 9.2 beta 3 … Поскольку я использую тот же самый запрос, кажется, что брелок дублируется …

Вот мой код для добавления конфиденциальных данных:

NSMutableDictionary *symmetricKeyAttr = [NSMutableDictionary dictionary]; [symmetricKeyAttr setObject:(__bridge id)kSecAttrAccessibleWhenUnlockedThisDeviceOnly forKey:(__bridge id)kSecAttrAccessible]; [symmetricKeyAttr setObject:(__bridge id)kSecClassKey forKey:(__bridge id)kSecClass]; [symmetricKeyAttr setObject:[NSNumber numberWithUnsignedInt:CSSM_ALGID_AES] forKey:(__bridge id)kSecAttrKeyType]; [symmetricKeyAttr setObject:[NSNumber numberWithUnsignedInt:(unsigned int)(kChosenCipherKeySize << 3)] forKey:(__bridge id)kSecAttrKeySizeInBits]; [symmetricKeyAttr setObject:[NSNumber numberWithUnsignedInt:(unsigned int)(kChosenCipherKeySize << 3)] forKey:(__bridge id)kSecAttrEffectiveKeySize]; [symmetricKeyAttr setObject:(id)kCFBooleanTrue forKey:(__bridge id)kSecAttrCanEncrypt]; [symmetricKeyAttr setObject:(id)kCFBooleanTrue forKey:(__bridge id)kSecAttrCanDecrypt]; [symmetricKeyAttr setObject:(id)kCFBooleanFalse forKey:(__bridge id)kSecAttrCanDerive]; [symmetricKeyAttr setObject:(id)kCFBooleanFalse forKey:(__bridge id)kSecAttrCanSign]; [symmetricKeyAttr setObject:(id)kCFBooleanFalse forKey:(__bridge id)kSecAttrCanVerify]; [symmetricKeyAttr setObject:(id)kCFBooleanFalse forKey:(__bridge id)kSecAttrCanWrap]; [symmetricKeyAttr setObject:(id)kCFBooleanFalse forKey:(__bridge id)kSecAttrCanUnwrap]; [symmetricKeyAttr setObject:accessGroup forKey:(__bridge id)kSecAttrAccessGroup]; [symmetricKeyAttr setObject:applicationTag forKey:(__bridge id)kSecAttrApplicationTag]; [symmetricKeyAttr setObject:sensitiveData forKey:(__bridge id)kSecValueData]; OSStatus sanityCheck = SecItemAdd((__bridge CFDictionaryRef) symmetricKeyAttr, NULL); 

Вот мой код для получения конфиденциальных данных:

 NSMutableDictionary * querySymmetricKey = [NSMutableDictionary dictionary]; [querySymmetricKey setObject:(__bridge id)kSecClassKey forKey:(__bridge id)kSecClass]; [querySymmetricKey setObject:[NSNumber numberWithUnsignedInt:CSSM_ALGID_AES] forKey:(__bridge id)kSecAttrKeyType]; [querySymmetricKey setObject:[NSNumber numberWithBool:YES] forKey:(__bridge id)kSecReturnData]; [querySymmetricKey setObject:applicationTag forKey:(__bridge id)kSecAttrApplicationTag]; [querySymmetricKey setObject:accessGroup forKey:(__bridge id)kSecAttrAccessGroup]; CFDataRef symmetricKeyDataRef = NULL; OSStatus sanityCheck = SecItemCopyMatching((__bridge CFDictionaryRef)querySymmetricKey, (CFTypeRef *)&symmetricKeyDataRef); 

Где:

  • sensitiveData – это конфиденциальные данные для хранения (например, <ac746cc2 80f72948 59d0d8b7 a5de4bad 5d9e9eb1 a400fba3 c85f3f2e 675d58bf>)
  • accessGroup – это объединение командного идентификатора и приложения
  • идентификатор (например, XXXXXXXXXX.com.toto.tata) applicationTag – это тег, относящийся к разумным данным (например, <746F746F>)

Дополнительные пункты:

  • Проблема возникает только с 64-битными устройствами, без проблем с 32-разрядными устройствами.
  • Замена CSSM_ALGID_AES с помощью CSSM_ALGID_NONE решает проблему (т. Е. Данные, созданные с помощью iOS 9.1, могут быть правильно загружены с помощью iOS 9.2 beta 3), но это неприемлемо, потому что я должен иметь возможность читать данные, созданные на iOS 9.1, с помощью CSSM_ALGID_AES.
  • Проблема не связана с kSecAttrAccessGroup: у меня все еще проблема, когда я удаляю это свойство.
  • Я «воспроизвел» проблему с образцом из Apple ( https://developer.apple.com/library/ios/samplecode/CryptoExercise ). В этом примере также используется CSSM_ALGID_AES, а не kSecAttrAccessGroup. Использование 64-разрядного устройства: ключ, созданный с iOS 9.1 (<bdd17fe1 f515e2b1 14de7c43 c4cb6a70>), найден с iOS 9.2 beta 3, но имеет другое значение (<73b205e2 46230f69 fa0f347c 2958e6b1>) !! Использование 32-разрядного устройства: ключ одинаковый между iOS 9.1 и iOS 9.2 beta 3.

Заметки:

  • Я уже разместил этот вопрос на форуме Apple, но не ответил от Apple … https://forums.developer.apple.com/message/87080
  • Я переключаюсь между iOS 9.1 и 9.2 beta 3 с помощью файлов IPSW без восстановления резервной копии, но у меня такая же проблема, сделав резервное восстановление.

Есть идеи?

У меня такая же проблема с официальной iOS9.2, я могу воспроизвести ее на любом устройстве, протестированном с iPhone 6, iPhone 5S и iPad Pro.

Нет проблем на iPhone 4S и iPad mini, я проверил это с каждым устройством.

Interesting Posts
Давайте будем гением компьютера.