2015-11-11 7 views
8

Sto sbattendo la testa cercando di generare una coppia di chiavi privata-pubblica con kSecAttrTokenIDSecureEnclave in modo che la chiave privata venga generata nell'enclave sicura.Dove è documentato kSecAttrTokenIDSecureEnclave?

Dove è documentato kSecAttrTokenIDSecureEnclave? Di seguito è riportato il mio codice, che non funziona con il codice di stato -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

"Le cose funzionano correttamente con RSA, ma non è possibile specificare kSecAttrTokenIDSecureEnclave e kSecAccessControlPrivateKeyUsage." Tratto da [qui] (https://forums.developer.apple.com/thread/8030). Quindi non possiamo avere coppie RSA con kSecAttrTokenIDSecureEnclave? Dove è documentato? Aggiornamento – Randomblue

risposta

5

L'errore riscontrato, -50, indica un errore di parametro. Un parametro che si sta trasmettendo alla funzione è errato o inappropriato per l'operazione. Se si guarda l'intestazione SecItem o la si vedrà:

kSecAttrTokenIDSecureEnclave Specifica noto identificativo del Token implementato utilizzando Enclave sicura del dispositivo. Gli unici articoli portachiavi supportati dal token Secure Enclave sono chiavi a curva ellittica a 256 bit (kSecAttrKeyTypeEC). Le chiavi devono essere generate sull'enclave sicura utilizzando la chiamata SecKeyGenerateKeyPair con kSecAttrTokenID impostata su kSecAttrTokenIDSecureEnclave nel dizionario dei parametri, non è possibile importare le chiavi pregenerate nel token kSecAttrTokenIDSecureEnclave.

RSA non è attualmente un cifrario supportato quando si genera una chiave privata nell'enclave protetta. Passare a una chiave EC a 256 bit.

Questo è stato coperto nella sessione WWDC 2015 706 Security And Your Apps. Il progetto di esempio Apple "KeychainTouchID" mostra i parametri corretti per generare e usare una chiave usando l'enclave sicura.

+0

: da iOS 10+ ['kSecAttrKeyTypeEC'] (https://developer.apple.com/documentation/security/ksecattrkeytypeec?language=objc) è deprecato a favore di [' kSecAttrKeyTypeECSECPrimeRandom'] (https: // developer .apple.com/documentazione/security/ksecattrkeytypeecsecprimerandom? language = objc). –