2

SecKeyRefからCFDataRefにエクスポートされた対称キーをラッピングまたは格納するため、または単に他のCocoaコードと共に使用するために、いくつか問題があります。対称キーのSecKeyRefアイテムをCFDataRefとしてエクスポートする

私は、次のコードをしている:私は私のログにで終わる

- (void)applicationDidFinishLaunching:(NSNotification *)aNotification 
{ 
    SecKeyRef sessionKey = [self generateRandomSymmetricKey]; 
    CFDataRef sessionKeyData = [self exportSymmetricKeyAsCFData:sessionKey]; 
} 

- (SecKeyRef)generateRandomSymmetricKey { 
    SecKeyRef cryptoKey = NULL; 
    CFErrorRef error = NULL; 

    // Create the dictionary of key parameters 
    CFMutableDictionaryRef parameters = (__bridge CFMutableDictionaryRef)[NSMutableDictionary dictionaryWithObjectsAndKeys:kSecAttrKeyTypeAES, kSecAttrKeyType, (__bridge CFNumberRef)[NSNumber numberWithInt:256], kSecAttrKeySizeInBits, nil]; 

    // Generate a symmetric key based on the parameters 
    cryptoKey = SecKeyGenerateSymmetric(parameters, &error); 

    return cryptoKey; 
} 

- (CFDataRef)exportSymmetricKeyAsCFData:(SecKeyRef)cryptoKey { 
    // Create and populate the parameters object with a basic set of values 
    SecItemImportExportKeyParameters params; 

    params.version = SEC_KEY_IMPORT_EXPORT_PARAMS_VERSION; 
    params.flags = 0; 
    params.passphrase = NULL; 
    params.alertTitle = NULL; 
    params.alertPrompt = NULL; 
    params.accessRef = NULL; 
    // These two values are for import 
    params.keyUsage = NULL; 
    params.keyAttributes = NULL; 

    // Create and populate the key usage array 
    CFMutableArrayRef keyUsage = (__bridge CFMutableArrayRef)[NSMutableArray arrayWithObjects:kSecAttrCanEncrypt, kSecAttrCanDecrypt, nil]; 

    // Create and populate the key attributes array 
    CFMutableArrayRef keyAttributes = (__bridge CFMutableArrayRef)[NSMutableArray array]; 

    // Set the keyUsage and keyAttributes in the params object 
    params.keyUsage = keyUsage; 
    params.keyAttributes = keyAttributes; 

    // Set the external format and flag values appropriately 
    SecExternalFormat externalFormat = kSecFormatUnknown; // Should result in the default appropriate external format for the given key. 
    int flags = 0; 

    // Export the CFData Key 
    CFDataRef keyData = NULL; 
    CFShow(cryptoKey); 
    OSStatus oserr = SecItemExport(cryptoKey, externalFormat, flags, &params, &keyData); 
    if (oserr) { 
     fprintf(stderr, "SecItemExport failed (oserr= %d)\n", oserr); 
     exit(-1); 
    } 

    NSLog(@"Exported Symmetric Key Data: %@", [(__bridge NSData *)keyData bytes]); 
    return keyData; 
} 

しかし、すべてを:

SecItemExportが失敗した(OSERR = -25316)

」 oserr = -25316」は、SecBase.hで次のように定義されています。

errSecDataNotAvailable = -25316、/ *このアイテムの内容は取得できません。 */

私はもともと、SecKeyRefが早い段階でリリースされたことを意味すると考えていましたが、ログからわかるように、SecKey自体は問題なく報告しています。

ここで私が行方不明または間違っていることについてのアイデアはありますか?ありがとう!

答えて

4

Appleと話をした後、それはこの問題は、「抽出可能」属性がNOに設定されることによって引き起こされているが判明したが、SecKeyGenerateSymmetric()

バグとそのパラメータを設定する方法を持たないことは提出されますが、基本的にまでされていますそのバグは解消されました。解決策は、償却方法SecKeyGenerate()を使用することです。私はこれが誰かの役に立てば幸い

- (SecKeyRef)generateRandomSymmetricKey { 
    SecKeyRef symmetricKey; 

    OSStatus oserr = SecKeyGenerate(NULL, CSSM_ALGID_AES, 256, 0, (CSSM_KEYUSE_DECRYPT | CSSM_KEYUSE_ENCRYPT), CSSM_KEYATTR_EXTRACTABLE, NULL, &symmetricKey); 
    if (oserr) { 
     NSLog(@"SecKeyGenerate failed: %@", (__bridge NSString *)SecCopyErrorMessageString(oserr, NULL)); 
     exit(-1); 
    } 

    return symmetricKey; 
} 

:代わりにこの使用上の- (SecKeyRef)generateRandomSymmetricKey方法の

関連する問題