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;
}
}
Gibt es eine Möglichkeit, die Daten zurück zu einem SecKeyRef zu konvertieren? –
@SerenadeX, schnelle Suche gibt mir 'SecKeyCreateWithData'. –
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. –