まず、NSString を NSData に base64 デコードする必要があります。解決策については、この回答を参照してください。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 を使用して解放する必要があることに注意してください。