2017-01-19 7 views
2

Ich habe eine p12-Datei, aus der ich den PrivateKey, PublicKey sowohl als SecKeyRef als auch das Zertifikat als SecCertificateRef extrahiere.Einen PrivateKey (SecRefKey) in NSData oder Base64 konvertieren

Die P12-Datei hat einen ECDSA PrivateKey, den ich zum Signieren von Daten (ECC) verwenden muss.

So eine vorgeschlagene Bibliothek Ich verwende: https://github.com/ricmoo/GMEllipticCurveCrypto

Aber ich brauche die Bibliothek mit den Tasten auf Base64 oder NSData zu ernähren, kann ich füttern SecKeyRef nicht. Ich habe es geschafft, die NSData für den publicKey mit den Methoden here zu extrahieren, es funktioniert.

Aber ich kann keine Möglichkeit finden, einen SecRefKey zu konvertieren, der auf einen privaten Schlüssel zu NSData verweist. Irgendwelche Ideen, wie dies zu tun ist, ODER, signieren und verifizieren Daten in iOS mit ECC mit SecKeyRefs.


Als Referenz wandelt diese Methode das P12 in iOS SecRefs:

- (BOOL)storeDetailsForP12CertificateData:(NSData *)certData password:(NSString*)pass identifier:(NSString*)identifier{  
    SecKeyRef publicKey, privateKey; 
    SecCertificateRef certRef; 

    //Extract keys and Certificate 
    NSMutableDictionary * options = [[NSMutableDictionary alloc] init]; 
    [options setObject:pass forKey:(id)kSecImportExportPassphrase]; 

    CFArrayRef items = CFArrayCreate(NULL, 0, 0, NULL); 
    OSStatus securityError = SecPKCS12Import((CFDataRef) certData, 
              (CFDictionaryRef)options, &items); 

    CFDictionaryRef identityDict = CFArrayGetValueAtIndex(items, 0); 
    SecIdentityRef identityApp = 
    (SecIdentityRef)CFDictionaryGetValue(identityDict, 
             kSecImportItemIdentity); 

    assert(securityError == noErr); 

    //get private key 
    SecIdentityCopyPrivateKey(identityApp, &privateKey); 

    //get certificate 
    SecIdentityCopyCertificate(identityApp, &certRef); 

    //evaluate certificate. 
    CFArrayRef certs = CFArrayCreate(kCFAllocatorDefault, (const void **) &certRef, 1, NULL); 
    SecPolicyRef policy = SecPolicyCreateBasicX509(); 
    SecTrustRef trust; 
    SecTrustCreateWithCertificates(certs, policy, &trust); 
    (CFRelease(certs)); 
    SecTrustResultType trustResult; 
    SecTrustEvaluate(trust, &trustResult); 

    //get publickey 
    publicKey = SecTrustCopyPublicKey(trust); 

    //clean memory 
    (CFRelease(trust)); 
    (CFRelease(policy)); 

    if (!publicKey || !privateKey || !certRef) { 
     return NO; 
    } else { 
     KeyData *details = [[KeyData alloc] init]; 
     details.publicKey = publicKey; 
     details.privateKey = privateKey; 
     details.certificate = certRef; 
     details.fileData = certData; 

     return YES; 
    } 
} 

Antwort

0

Sieht aus wie Sie einfach SecKeyCopyExternalRepresentation verwenden müssen:

/*! 
    @function SecKeyCopyExternalRepresentation 
    @abstract Create an external representation for the given key suitable for the key's type. 
    @param key The key to be exported. 
    @param error On error, will be populated with an error object describing the failure. 
    See "Security Error Codes" (SecBase.h). 
    @result A CFData representing the key in a format suitable for that key type. 
    @discussion This function may fail if the key is not exportable (e.g., bound to a smart card or Secure Enclave). 
    The format in which the key will be exported depends on the type of key: 
    * kSecAttrKeyTypeRSA     PKCS#1 format 
    * kSecAttrKeyTypeECSECPrimeRandom SEC1 format (www.secg.org) 
*/ 
CFDataRef _Nullable SecKeyCopyExternalRepresentation(SecKeyRef key, CFErrorRef *error) 

Beachten Sie, dass CFDataRef gebührenfrei überbrückte ist zu NSData, so können Sie sie leicht konvertieren.

+0

Gibt es eine Möglichkeit, die Daten zurück zu einem SecKeyRef zu konvertieren? –

+0

@SerenadeX, schnelle Suche gibt mir 'SecKeyCreateWithData'. –

+0

Ja, ich versuche das, aber dann stürzt es ab, wahrscheinlich weil diese Methode nur mit symmetrischen Schlüsseln funktioniert und ich bin mir ziemlich sicher, dass ich asymmetrische erzeuge. –

Verwandte Themen