2015-11-11 10 views
8

Ich hämmere meinen Kopf versuchen, ein Private-Public-Schlüsselpaar mit kSecAttrTokenIDSecureEnclave zu generieren, so dass der private Schlüssel in der sicheren Enklave generiert wird.Wo ist kSecAttrTokenIDSecureEnclave dokumentiert?

Wo ist kSecAttrTokenIDSecureEnclave dokumentiert? Unten ist mein Code, der mit dem Statuscode -50 fehlschlägt.

- (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

"Die Dinge funktionieren ordnungsgemäß mit RSA, aber dann kSecAttrTokenIDSecureEnclave und kSecAccessControlPrivateKeyUsage kann nicht angegeben werden." Entnommen von [hier] (https://forums.developer.apple.com/thread/8030). Können wir dann RSA-Paare mit kSecAttrTokenIDSecureEnclave nicht haben? Wo ist das dokumentiert? – Randomblue

Antwort

5

Der Fehler, den Sie erhalten, -50, zeigt einen Parameterfehler an. Ein Parameter, den Sie an die Funktion übergeben, ist für den Vorgang falsch oder ungeeignet. Wenn Sie den SecItem Header betrachten oder die Sie sehen:

kSecAttrTokenIDSecureEnclave Gibt bekannte Kennung des Token implementiert Gerät Secure Enclave verwenden. Die einzigen Keychain-Elemente , die vom Secure Enclave-Token unterstützt werden, sind 256-Bit-Ellipsenkurvenschlüssel (kSecAttrKeyTypeEC). Schlüssel müssen in der sicheren Enklave unter Verwendung von SecKeyGenerateKeyPair Anruf mit kSecAttrTokenID kSecAttrTokenIDSecureEnclave im Parameter-Wörterbuch generiert werden, es ist nicht möglich, vorgenerierte Schlüssel zu kSecAttrTokenIDSecureEnclave Token zu importieren.

RSA ist derzeit keine unterstützte Verschlüsselung, wenn ein privater Schlüssel in der sicheren Enklave generiert wird. Wechseln Sie zu einem 256-Bit-EC-Schlüssel.

Dies wurde in der WWDC 2015 Sitzung 706 Security And Your Apps abgedeckt. Das Apple-Beispielprojekt "KeychainTouchID" zeigt die korrekten Parameter zum Generieren und Verwenden eines Schlüssels unter Verwendung der sicheren Enklave.

+0

Update: ab iOS 10+ ['kSecAttrKeyTypeEC'] (https://developer.apple.com/documentation/security/ksecattrkeytypeec?language=objc) wird zu Gunsten von [' kSecAttrKeyTypeECSECPrimeRandom'] abgelehnt (https: // developer Englisch: www.apple.com/documentation/security/ksecattrkytypeecsecpriterandom? language = objc) Deutsch:. –

Verwandte Themen