Ответ 1
Сначала вы должны base64 декодировать NSString в NSData:
См. этот ответ для решений. Если вы разрабатываете iOS 7, вы можете использовать initWithBase64EncodedString::options
.
Когда у вас есть строка, декодированная как NSData, вы можете попытаться создать с нее сертификат. Формат полученного вами сертификата - вы можете использовать DER (что является общим) или PKCS12. Вероятно, вы получите его как DER, так что я предполагаю, что вам нужно руководствоваться.
Создайте сертификат и политику:
SecCertificateRef cert = NULL;
SecPolicyRef policy = NULL;
cert = SecCertificateCreateWithData(kCFAllocatorDefault, data);
policy = SecPolicyCreateBasicX509();
Если данные о сертификате были в неправильном формате при передаче в SecCertificateCreateWithData
, вы получите результат NULL.
На этом этапе у вас есть сертификат, но не открытый ключ. Чтобы получить открытый ключ, вы должны создать ссылку доверия и оценить доверие сертификата.
OSStatus status = noErr;
SecKeyRef *publicKey = NULL;
SecTrustRef trust = NULL;
SecTrustResultType trustType = kSecTrustResultInvalid;
if (cert != NULL){
SecCertificateRef certArray[1] = {cert};
certs = CFArrayCreate(kCFAllocatorDefault, (void *)certArray, 1, NULL);
status = SecTrustCreateWithCertificates(certs, policy, &trust);
if (status == errSecSuccess){
status = SecTrustEvaluate(trust, &trustType);
// Evaulate the trust.
switch (trustType) {
case kSecTrustResultInvalid:
case kSecTrustResultConfirm:
case kSecTrustResultDeny:
case kSecTrustResultUnspecified:
case kSecTrustResultFatalTrustFailure:
case kSecTrustResultOtherError:
break;
case kSecTrustResultRecoverableTrustFailure:
*publicKey = SecTrustCopyPublicKey(trust);
break;
case kSecTrustResultProceed:
*publicKey = SecTrustCopyPublicKey(trust);
break;
}
}
}
Если все пойдет хорошо, теперь вы должны иметь заполненный SecKeyRef с открытым ключом. Если это не пойдет хорошо, у вас будет NULL SecKeyRef и OSStatus, указывающий, что пошло не так. SecBase.h
в области безопасности дает более подробную информацию об этих кодах ошибок.
Теперь, когда у вас есть SecKeyRef с открытым ключом, его использование для шифрования данных с помощью соответствующего закрытого ключа хорошо освещено руководство по программированию.
Обратите внимание, что вам придется освободить вещи, которые вы выделили выше (политика, сертификаты), используя ARC или CFRelease.