Mac OS X: необъявленный идентификатор kSecPublicKeyAttrs

Я пытаюсь сгенерировать ключ RSA в приложении Mac OS X. Я использую этот код:

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 ответ

Во-первых, вы используете пример кода iOS на OS X. Фреймворки похожи, но не идентичны. Но пример кода 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 гласит:

Кроме того, вы можете указать ряд атрибутов для открытого и закрытого ключей индивидуально. Это можно сделать либо путем непосредственного добавления пар "ключ-значение" в словарь, либо путем добавления одного или обоих ключей kSecPrivateKeyAttrs и kSecPublicKeyAttrs.

Так что либо документация неверна, либо структура неверна; Я бы посоветовал подать сообщение об ошибке в Apple, независимо от того, работают ли у вас "private" и "public". И я бы посоветовал разместить об этом на деворумах Apple, где сотрудник Apple может заметить и дать вам полуофициальный обходной путь.

Другие вопросы по тегам