Mac OS X:kSecPublicKeyAttrs未声明的标识符

时间:2012-05-24 16:20:52

标签: macos keychain commoncrypto

我正在尝试在Mac OS X App中生成RSA密钥,我使用此代码:

CFStringRef privateTag = (CFStringRef)@"com.example.privatekey";
CFStringRef publicTag = (CFStringRef)@"com.example.publickey";
int bits = 1024;
    CFMutableDictionaryRef publicAttr = CFDictionaryCreateMutable(kCFAllocatorDefault, 3, &kCFTypeDictionaryKeyCallBacks, &kCFTypeDictionaryValueCallBacks);
    CFDictionaryAddValue(publicAttr, kSecAttrIsPermanent, kCFBooleanTrue);
    CFDictionaryAddValue(publicAttr, kSecAttrApplicationTag, publicTag);

    CFMutableDictionaryRef privateAttr = CFDictionaryCreateMutable(kCFAllocatorDefault, 3, &kCFTypeDictionaryKeyCallBacks, &kCFTypeDictionaryValueCallBacks);
    CFDictionaryAddValue(privateAttr, kSecAttrIsPermanent, kCFBooleanTrue);
    CFDictionaryAddValue(privateAttr, kSecAttrApplicationTag, publicTag);

    CFMutableDictionaryRef keyPairAttr = CFDictionaryCreateMutable(kCFAllocatorDefault, 3, &kCFTypeDictionaryKeyCallBacks, &kCFTypeDictionaryValueCallBacks);
    CFDictionaryAddValue(keyPairAttr, kSecAttrKeyType, kSecAttrKeyTypeRSA);
    CFDictionaryAddValue(keyPairAttr, kSecAttrKeySizeInBits, CFNumberCreate( kCFAllocatorDefault, kCFNumberIntType, &bits));
    CFDictionaryAddValue(keyPairAttr, kSecPublicKeyAttrs, privateAttr);
    CFDictionaryAddValue(keyPairAttr, kSecPrivateKeyAttrs, publicAttr);

    status = SecKeyGeneratePair((CFDictionaryRef)keyPairAttr, &publicKey, &privateKey);

    if (status != noErr) {
        NSLog(@"something went wrong %d", (int)status);
    }else {
        NSLog(@"New key");
    }

如果我尝试构建kSecPublicKeyAttrs是一个未声明的标识符,我无法理解为什么。有人可以帮忙吗?

此致 菲利普

1 个答案:

答案 0 :(得分:2)

首先,您在OS X上使用iOS示例代码。框架类似,但不完全相同。但是没有OS X示例代码,并且iOS示例代码显示在OS X文档集中,因此我不确定您是否可以因此受到指责......

同时,虽然iOS框架有公共常量kSecPublicKeyAttrs和kSecPrivateKeyAttrs,但如果查看源代码(http://www.opensource.apple.com/source/libsecurity_keychain/libsecurity_keychain-55050.2/),OS X版本已经有了这些作为私有常量,隐藏在框架中:

/* Constants used by SecKeyGeneratePair() - in SecKey.h.  Never used in
any SecItem apis directly. */
SEC_CONST_DECL (kSecPrivateKeyAttrs, "private");
SEC_CONST_DECL (kSecPublicKeyAttrs, "public");

所以,显然你可以传递@“private”和@“public”(或者为它们创建自己的常量)和......好吧,我不保证它会起作用,但你至少应该尝试一下

与此同时,SecKeyGeneratePair的文档说:

  

此外,您还可以为public和。指定一些属性   私钥单独。您可以通过添加键值来实现   直接对词典,或通过添加其中一个或两个   密钥kSecPrivateKeyAttrs和kSecPublicKeyAttrs。

因此文档错误或框架错误;我建议向Apple提交一个错误,无论是@“private”还是@“public”都适合你。我建议在Apple devforums上发布此消息,Apple员工可能会注意到这一点并为您提供准官方解决方案。