У меня есть файл p12, из которого я извлекаю PrivateKey, PublicKey как SecKeyRef, так и сертификат как SecCertificateRef.Преобразование PrivateKey (SecRefKey) в NSData или Base64
В файле P12 есть ECDSA PrivateKey, который мне нужно использовать для подписи данных (ECC).
Поэтому я использую предложенную библиотеку: https://github.com/ricmoo/GMEllipticCurveCrypto
Но мне нужно кормить библиотеки с ключами на Base64 или NSData, я не могу кормить SecKeyRef. Мне удалось извлечь NSData для publicKey, используя предоставленные методы here, он работает.
Но я не могу найти способ конвертировать SecRefKey, который указывает на privateKey на NSData. Любые идеи о том, как это сделать, ИЛИ, подписывать и проверять данные в iOS, используя ECC с SecKeyRefs.
Для сравнения, этот метод преобразует P12 в 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;
}
}
Есть ли способ конвертировать данные обратно в SecKeyRef? –
@SerenadeX, быстрый поиск дает мне 'SecKeyCreateWithData'. –
Да, я пытаюсь это сделать, но потом он падает, вероятно, потому, что этот метод работает только с симметричными клавишами, и я уверен, что я генерирую асимметричные. –