2017-07-16 12 views
1

秘密/公開鍵のペアが生成され、Secure Enclaveに格納されています。iOSから楕円曲線キーをエクスポートしてOpenSSLで作業する

これは256ビットの楕円曲線キーです。 (Secure Enclaveに格納できる唯一の鍵タイプ)。

私はSecKeyCreateWithDataSecKeyCopyExternalRepresentationを使用して、iOSデバイス間で公開鍵をインポート/エクスポートします。これは動作します。

ただし、エクスポートされたキーはOpenSSLでは動作しません。 このコマンドには常に'unable to load Key'が表示されるためです。

openssl ec -pubin -in public_key_file -text 

キーをエクスポートする方法は何ですか?だから私はOpenSSLでそれを使うことができます。

答えて

1

OpenSSLを使用するには、subject public key info (SPKI)DERまたはPEMのいずれかの形式が必要です。

SPKIには重要な情報が含まれています(例:key.typekey.parameterskey.value)。

SecKeyCopyExternalRepresentationは、key.value部分のみの生のキーバイナリを返します。

あなたはそのkey.valueからSPKIを作成する必要があります。これを行う通常の方法は、https://tools.ietf.org/html/rfc5480を読み込み、ASN.1構造体をバイナリコード化DER形式にエンコードすることです。


ただし、ここにはショートカットがあります。

セキュアエンクレーブは、256ビットECキーsecp256r1(OpenSSLではprime256v1と同等)の1つのキータイプのみをサポートしています。 DERフォーマットの

SPKIは、データを符号化されたバイナリであり、例えば、

3059301306072a8648ce3d020106082a8648ce3d03010703420004fad2e70b0f70f0bf80d7f7cbe8dd4237ca9e59357647e7a7cb90d71a71f6b57869069bcdd24272932c6bdd51895fe2180ea0748c737adecc1cefa3a02022164d 

それは常に2つの部分

  1. 固定スキーマヘッダ3059301306072a8648ce3d020106082a8648ce3d030107034200

  2. 生のキー値から成り04.......

これら2つの部分を組み合わせてSPKIを作成できます。

spki = fixed_schema_header + SecKeyCopyExternalRepresentation(...)


func createSubjectPublicKeyInfo(rawPublicKeyData: Data) -> Data { 
    let secp256r1Header = Data(bytes: [ 
     0x30, 0x59, 0x30, 0x13, 0x06, 0x07, 0x2a, 0x86, 0x48, 0xce, 0x3d, 0x02, 0x01, 0x06, 0x08, 0x2a, 
     0x86, 0x48, 0xce, 0x3d, 0x03, 0x01, 0x07, 0x03, 0x42, 0x00 
     ]) 
    return secp256r1Header + rawPublicKeyData 
} 

// Usage 
let rawPublicKeyData = SecKeyCopyExternalRepresentation(...)! 
let publicKeyDER = createSubjectPublicKeyInfo(rawPublicKeyData: rawPublicKeyData) 
write(publicKeyDER, to: "public_key.der") 

// Test with OpenSSL 
// openssl ec -pubin -in public_key.der -text -inform der 
関連する問題