2012-05-24 3 views
0

Я пытаюсь создать ключ RSA в моем Mac OS X приложение, я использую этот код:Mac OS X: kSecPublicKeyAttrs необъявленный идентификатор

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 это необъявленную идентификатор, я не может понять, почему. Может ли кто-нибудь помочь?

С уважением, Филипп

ответ

2

Во-первых, вы используете IOS пример кода на OS X. Каркасы похожи, но не идентичны. Но нет образца кода OS X, и пример кода кода iOS отображается в наборах OS X doc, поэтому я не уверен, что вас могут обвинить в этом ...

Между тем, хотя инфраструктура 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, будь то «частные» и «публичные» работы для вас или нет. И я предлагаю опубликовать об этом на Apple devforums, где сотрудник Apple может заметить и дать вам квази-официальное обходное решение.

+0

Благодарим за помощь. Вы правы, это из приложения iOS, и либо документация 10.7 SDK, либо фреймворк неверна. Так что спасибо за ваш комментарий, я попробую форумы Apple dev. – plaetzchen

 Смежные вопросы

  • Нет связанных вопросов^_^