kSecAttrTokenIDSecureEnclave在哪里记录?

Ran*_*lue 9 security keychain ios

我正在试图生成一个私钥 - 公钥对,kSecAttrTokenIDSecureEnclave以便在安全区中生成私钥.

记录在哪里kSecAttrTokenIDSecureEnclave?下面是我的代码,它的状态代码为-50失败.

- (void)generateKeyPair {
    const UInt8 publicTagString[] = "public";
    const UInt8 privateTagString[] = "private";

    publicTag = CFDataCreate(0, publicTagString, sizeof(publicTagString));
    privateTag = CFDataCreate(0, privateTagString, sizeof(privateTagString));

    CFMutableDictionaryRef publicAttr = CFDictionaryCreateMutable(kCFAllocatorDefault, 0, NULL, NULL);
    CFDictionaryAddValue(publicAttr, kSecAttrApplicationTag, publicTag);
    // CFDictionaryAddValue(publicAttr, kSecAttrIsPermanent, kCFBooleanTrue);
    CFDictionaryAddValue(publicAttr, kSecAttrCanEncrypt, kCFBooleanFalse);
    CFDictionaryAddValue(publicAttr, kSecAttrCanDecrypt, kCFBooleanFalse);
    CFDictionaryAddValue(publicAttr, kSecAttrCanDerive, kCFBooleanFalse);
    CFDictionaryAddValue(publicAttr, kSecAttrCanSign, kCFBooleanFalse);
    CFDictionaryAddValue(publicAttr, kSecAttrCanVerify, kCFBooleanTrue);
    CFDictionaryAddValue(publicAttr, kSecAttrCanUnwrap, kCFBooleanFalse);

    CFMutableDictionaryRef privateAttr = CFDictionaryCreateMutable(kCFAllocatorDefault, 0, NULL, NULL);
    CFDictionaryAddValue(privateAttr, kSecAttrApplicationTag, privateTag);
    // CFDictionaryAddValue(privateAttr, kSecAttrIsPermanent, kCFBooleanTrue);
    CFDictionaryAddValue(privateAttr, kSecAttrCanEncrypt, kCFBooleanFalse);
    CFDictionaryAddValue(privateAttr, kSecAttrCanDecrypt, kCFBooleanFalse);
    CFDictionaryAddValue(privateAttr, kSecAttrCanDerive, kCFBooleanFalse);
    CFDictionaryAddValue(privateAttr, kSecAttrCanSign, kCFBooleanTrue);
    CFDictionaryAddValue(privateAttr, kSecAttrCanVerify, kCFBooleanFalse);
    CFDictionaryAddValue(privateAttr, kSecAttrCanUnwrap, kCFBooleanFalse);

    const void* parameterKeys[] = {
        kSecAttrKeyType,
        kSecAttrKeySizeInBits,
        kSecAttrTokenID,
        kSecPublicKeyAttrs,
        kSecPrivateKeyAttrs
    };

    int intKeySize = 512;
    CFNumberRef keySize = CFNumberCreate(kCFAllocatorDefault, kCFNumberIntType, &intKeySize);

    const void* parameterValues[] = {
        kSecAttrKeyTypeRSA,
        keySize,
        kSecAttrTokenIDSecureEnclave,
        publicAttr,
        privateAttr
    };

    CFDictionaryRef parameters = CFDictionaryCreate(
        kCFAllocatorDefault,
        parameterKeys,
        parameterValues,
        5, // ??? Make this programmatic
        NULL,
        NULL
    );

    OSStatus status = SecKeyGeneratePair(parameters, &publicKey, &privateKey);

    if(status != errSecSuccess) {
        [self logError:[NSString stringWithFormat:@"SecKeyGeneratePair status %d", (int)status] :nil];
        return;
    }
}
Run Code Online (Sandbox Code Playgroud)

que*_*ish 7

您收到的错误-50表示参数错误.传递给函数的参数不正确或不适合该操作.如果你看看SecItem标题,你会看到:

kSecAttrTokenIDSecureEnclave指定使用设备的Secure Enclave实现的令牌的众所周知的标识符.Secure Enclave令牌支持的唯一钥匙串项是256位椭圆曲线键(kSecAttrKeyTypeEC).必须使用SecKeyGenerateKeyPair调用在安全区域生成密钥,并在参数字典中将kSecAttrTokenID设置为kSecAttrTokenIDSecureEnclave,不能将预生成的密钥导入kSecAttrTokenIDSecureEnclave令牌.

在安全区域中生成私钥时,RSA当前不是受支持的密码.切换到256位EC密钥.

这已在WWDC 2015会议706 安全和您的应用程序中介绍.Apple示例项目"KeychainTouchID"显示使用安全区域生成和使用密钥的正确参数.

  • 更新:从iOS 10+ [`kSecAttrKeyTypeEC`](https://developer.apple.com/documentation/security/ksecattrkeytypeec?language=objc)不推荐使用[`kSecAttrKeyTypeECSECPrimeRandom`](https://开发人员. apple.com/documentation/security/ksecattrkeytypeecsecprimerandom?language=objc). (2认同)