スタック オーバーフローで既に尋ねようとしている質問と同様の質問がたくさんあることを認識していますが、どれも私のニーズを本当に満たす明確な回答を持っていないので、ここで説明します。
私のプログラムは、ネットワーク経由で ASN.1 でエンコードされた RSA 公開鍵を受け取ります。単純な NSData インスタンスにデータを格納しています。その公開鍵を使用して 16 バイトのデータをエンコードし、それらをネットワーク経由で返したいと考えています。私の調査によると、これを行う最善の方法は SecKeyRef を使用することです。Apple が提供する途方もなくあいまいなドキュメントによると、これはいくつかのコードを使用して行うことができます。ただし、彼らのコードには問題があります。公開鍵を使用するたびに、それをキーチェーンに追加して一意の識別子を付与する必要があります。これに関する問題は、このキーが1 回しか使用されないことです。キーチェーンになく、ASN.1 でエンコードされたキーから作成されたキーの SecKeyRef を取得する方法を探しています。
また、base64 エンコードで一般的な PEM に変換し、'-----BEGIN PUBLIC KEY-----' と '-----END PUBLIC KEY-----' でラップする可能性も検討しました。 ' そしてそれを SecKeyRef にロードしますが、これを行う方法も見たことがありません。
また、キーのタイプ、キーの形式などにあまり選択肢がありません。サードパーティのJavaサーバーからのものです。わーい。
私は現在、(おそらく)キーをキーチェーンに追加しないキーをロードするこの代替方法を持っていますが、キーは明らかに(試行錯誤による:D)DER形式ではないため、このようにロードできません。
SecCertificateRef certificateRef = SecCertificateCreateWithData(kCFAllocatorDefault, (__bridge CFDataRef)data); //data contains the public key - received over the network
SecPolicyRef policyRef = SecPolicyCreateBasicX509();
SecTrustRef trustRef;
OSStatus status = SecTrustCreateWithCertificates(certificateRef, policyRef, &trustRef);
NSAssert(status == errSecSuccess, @"SecTrustCreateWithCertificates failed.");
SecTrustResultType trustResult;
status = SecTrustEvaluate(trustRef, &trustResult);
NSAssert(status == errSecSuccess, @"SecTrustEvaluate failed.");
SecKeyRef publicKey = SecTrustCopyPublicKey(trustRef); //The Result :)
NSAssert(publicKey != NULL, @"SecTrustCopyPublicKey failed.");
if (certificateRef) CFRelease(certificateRef);
if (policyRef) CFRelease(policyRef);
if (trustRef) CFRelease(trustRef);
PS: なぜアップルはこれを難しくしているのですか? OpenSSL を静的にリンクするのは簡単ですが、そうするとあらゆる種類の輸出規制やその他の問題が適用されます。