RFC8292 にはこのgemが含まれています:
The "k" parameter includes an ECDSA public key [FIPS186] in
uncompressed form [X9.62] that is encoded using base64url encoding
[RFC7515].
少し下にそのようなキーの使用例があります:
Authorization: vapid
t=eyJ0eXAiOiJKV1QiLCJhbGciOiJFUzI1NiJ9.eyJhdWQiOiJodHRwczovL3
B1c2guZXhhbXBsZS5uZXQiLCJleHAiOjE0NTM1MjM3NjgsInN1YiI6Im1ha
Wx0bzpwdXNoQGV4YW1wbGUuY29tIn0.i3CYb7t4xfxCDquptFOepC9GAu_H
LGkMlMuCGSK2rpiUfnK9ojFwDXb1JrErtmysazNjjvW2L9OkSSHzvoD1oA,
k=BA1Hxzyi1RUM1b5wjxsn7nGxAszw2u61m164i3MrAIxHF6YK5h4SDYic-dR
uU_RCPCfA5aq9ojSwk5Y2EmClBPs
キーは、例ではk=
フィールドです。
これはASN.1形式ではないようです。
$ cat vapidkey
-----BEGIN PUBLIC KEY-----
BA1Hxzyi1RUM1b5wjxsn7nGxAszw2u61m164i3MrAIxHF6YK5h4SDYic-dRuU_RCPCfA5aq9ojSwk5Y2EmClBPs
-----END PUBLIC KEY-----
$ openssl asn1parse -in vapidkey -i
0:d=0 hl=2 l= 13 prim: OCTET STRING [HEX DUMP]:47C73CA2D5150CD5BE708F1B27
Error in encoding
139686682194112:error:0D07209B:asn1 encoding routines:ASN1_get_object:too long:../crypto/asn1/asn1_lib.c:91:
この形式を解析するにはどうすればよいですか?
残念ながら、X9.62標準はペイウォールの背後にあるようです。それは問題ありません。full標準は必要ありません。キーを読み取って、それに関連するビットを、その処理方法を知っているライブラリに渡すだけです。しかし、それは思ったより難しいように見えます。このフォーマットは、私が試したライブラリではすぐには理解されないので、自分で変換する必要があります。ただし、キーの形式がわからない場合は、かなり難しいです。
それは確かにASN.1ではありません。
(すべてのAFAIK)X9.62からのフォーマットは、SEC1で複製されます SECGから無料 2.3.3および2.3.4で曲線ポイント(メタデータを除く実際の公開鍵の値)を使用します。
あなたが持っている非圧縮のポイントフォーマットは、1つのオクテット04とそれに続くXとY座標のそれぞれが、カーブの基礎となるフィールドによって決定されるサイズの符号なしビエンディアン整数であり、すでに知っている必要があります-通常、公開鍵はX.509 SPKIに埋め込まれ(下記参照)、曲線を識別し、フィールドサイズを提供します。これも一般的な圧縮形式は、Yが偶数か奇数かを示す1オクテット02または03(素数特性曲線の場合、多くの場合、素数とFpと略記される)の後にXのみが続きます。
(X9.62)非圧縮ポイント形式を実装していないECCを実装するライブラリは見たことがありません。また、圧縮を実装していないライブラリもいくつかありません。 ECDSAsignatureの形式について意見の相違があることがより一般的ですが、それはあなたのケースではありません。
8292および7515で使用されているbase64url-unpaddedスキームは、OpenSSLで使用されている(従来の)PEM/SMIME base64と互換性がないことにも注意してください。 2つの「余分な」文字は異なり、OpenSSLが必要ですパディング(正確に3の倍数でない場合)。ほとんどの場合、改行が必要です。さらに、「PUBLIC KEY」のPEMタイプは、SEQUENCE、AlgorithmIdentifier、およびBIT STRINGのラッピングを含む、OpenSSL API(およびコード)でPUBKEYと呼ばれるX.509 SubjectPublicKeyInfo構造体であると想定されていますが、ここでは重要ではありません。任意のASN.1としてのみそれをキーとして読み取ろうとしないでください。
@ dave_thompson_085が提供する回答に少し追加。 X9.62で指定されている3番目のエンコード形式があり、これはSEC1で複製されません:ハイブリッド。
基本的には非圧縮エンコーディングですが、最初のバイトは圧縮形式と同様にyの均一性をエンコードします。最初のバイトの06と07で指定され、圧縮された02と03と同じ意味です。