在真实设备iOS上进行单元测试时,尝试生成随机密钥对时出错

问题描述

当我尝试在真实设备上运行单元测试时,它会失败。

返回的错误

-25293(“您输入的用户名或密码不正确。”)

这是我失败的代码

let accessControl = SecAccessControlCreateWithFlags(
  kcfAllocatorDefault,kSecAttrAccessibleAfterFirstUnlock,[.privateKeyUsage],nil)

let privateKeyAttrs = [
  kSecAttrIsPermanent as String    : true,kSecAttrApplicationTag as String : tag,kSecAttrAccessControl as String  : accessControl
  ] as [String : Any]

let generationQuery: [String: Any] = [
  kSecAttrKeyType as String       : kSecAttrKeyTypeRSA,kSecAttrKeySizeInBits as String : 2048,kSecPrivateKeyAttrs as String   : privateKeyAttrs]

var error: Unmanaged<CFError>?
    guard let privateKey = SecKeyCreaterandomKey(generationQuery as CFDictionary,&error) else {
        throw <MyError>
    }

即使我将Accessible保护更改为kSecAttrAccessibleAlways或kSecAttrAccessibleWhenUnlocked,并且我只是从我的privateKeyAttrs中删除了kSecAttrAccessControl,我的测试还是通过了,SecKeyCreaterandomKey仍然失败。

更多详细信息:如果我在模拟器上运行测试,它将通过;我正在使用 Xcode 11.6和Swift 5。

解决方法

.privateKeyUsage专用于创建存储在Secure Enclave中的密钥对:

尝试在Secure Enclave外部生成密钥对时使用此约束的尝试失败。

放弃该选项。如果您只是想在钥匙串中创建钥匙对,则不需要它(也不能使用它)。