kSecAttrTokenIDSecureEnclave的文档在哪里可以找到?

9

我正在尝试使用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;
    }
}

使用RSA时一切正常,但是无法指定kSecAttrTokenIDSecureEnclave和kSecAccessControlPrivateKeyUsage。这段话摘自此处。我们不能使用kSecAttrTokenIDSecureEnclave来生成RSA密钥对吗?这在哪里有记录? - Randomblue
1个回答

7
你收到的错误代码-50表示参数错误。你传递给函数的参数是不正确或不适用于操作的。如果你查看SecItem头文件或者你会看到:

kSecAttrTokenIDSecureEnclave指定设备使用安全加密芯片实现的令牌的众所周知的标识符。仅支持由安全加密芯片实现的令牌的钥匙链项目是256位椭圆曲线密钥(kSecAttrKeyTypeEC)。密钥必须在安全加密芯片上使用SecKeyGenerateKeyPair调用生成,并将kSecAttrTokenID设置为参数字典中的kSecAttrTokenIDSecureEnclave,无法将预生成的密钥导入到kSecAttrTokenIDSecureEnclave令牌中。

在安全加密芯片中生成私钥时,RSA目前不支持。请切换到256位EC密钥。

这在WWDC 2015会议706中有涉及 Security And Your Apps。苹果的示例项目“KeychainTouchID”显示了使用安全加密芯片生成和使用密钥的正确参数。


3
更新: 截至iOS 10+,kSecAttrKeyTypeEC已被弃用,推荐使用kSecAttrKeyTypeECSECPrimeRandom - David Artmann

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接