2015-11-11 14 views
8

プライベートキーがkSecAttrTokenIDSecureEnclaveで生成されるように私の頭を叩いて、プライベートキーがセキュアエンクレーブに生成されるようにします。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; 
    } 
} 
+0

"RSAでは正常に動作しますが、kSecAttrTokenIDSecureEnclaveとkSecAccessControlPrivateKeyUsageは指定できません。" [ここ](https://forums.developer.apple.com/thread/8030)から取られました。 kSecAttrTokenIDSecureEnclaveとのRSAペアを作成できませんか?それはどこに文書化されていますか? – Randomblue

答えて

5

エラーが表示される、-50は、パラメータエラーを示します。関数に渡すパラメータが間違っているか、操作に不適切です。あなたがSecItemヘッダーまたはを見れば、あなたが表示されます。 トークンの

kSecAttrTokenIDSecureEnclaveを指定し、よく知られた識別子は、デバイスのセキュアエンクレーブを使用して実装しました。 Secure Enclaveトークンでサポートされているキーチェーン項目 は、256ビットの楕円曲線キー (kSecAttrKeyTypeEC)のみです。 SecSecAttrTokenIDを に設定してSecKeyGenerateKeyPairコールを使用して、安全なエンクレーブに鍵を生成する必要があります。kSecAttrTokenIDSecureEnclaveトークンに事前生成された鍵をインポートすることはできません( )。

セキュアエンクレーブに秘密鍵を生成するとき、RSAは現在サポートされている暗号ではありません。 256ビットECキーに切り替えます。

これは、WWDC 2015セッション706 Security And Your Appsでカバーされています。 Appleのサンプルプロジェクト "KeychainTouchID"は、セキュアエンクレーブを使用して鍵を生成して使用するための正しいパラメータを示しています。

+0

アップデート:iOS 10以降['kSecAttrKeyTypeEC'](https://developer.apple.com/documentation/security/ksecattrkeytypeec?language=objc)は推奨されていません[' kSecAttrKeyTypeECSECPrimeRandom'](https:// developer .apple.com/documentation/security/ksecattrkeytypeecsecprimerandom?language = objc)。 –

関連する問題