https://www.cs.auckland.ac.nz/~pgut001/ で配布されているASN.1の中身を見るツールdumpasn1
の使い方メモ。
インストール
上記URLからdumpasn1.c
を持ってきてコンパイル、$HOME/bin
にインストール。
あわせて上記URLからdumpasn1.cfg
もダウンロード、やはり$HOME/bin
に設置。
使い方(1) RSA公開鍵
検査対象をいちどDER形式のファイルに落とす必要があるらしい。少し面倒。
$ echo -n | openssl s_client -connect www.google.com:443 | openssl x509 -noout -pubkey | openssl rsa -pubin -outform der > /tmp/google_com_pubkey.der
まずこのようにして公開鍵をDER形式で保存。
$ dumpasn1 -al /tmp/google_com_pubkey.der
0 290: SEQUENCE {
4 13: SEQUENCE {
6 9: OBJECT IDENTIFIER rsaEncryption (1 2 840 113549 1 1 1)
: (PKCS #1)
17 0: NULL
: }
19 271: BIT STRING, encapsulates {
24 266: SEQUENCE {
28 257: INTEGER
: 00 97 A4 10 AC BC D8 D2 32 AF 6C 7F CB FC 46 2B
: 8C 5E E1 0A 47 BD 82 3F 0C F3 42 A8 CB EA 0C 45
: FE 1D A4 D6 83 63 9E 6D 03 E6 94 6F 1D C2 68 28
: 9F 35 7E 27 59 22 F5 8A 4E D4 1A AB A2 E8 13 81
: F9 5F DD 92 0E 4F 7E 12 EC FC D7 B7 4B 39 E4 03
: 50 C2 D0 E2 F9 F2 22 C4 3E 87 FA C9 98 B7 D6 4C
: D4 A5 EE F5 DF 37 20 63 6E 4D A4 8A 27 E8 F8 A7
: 7E 2C 95 4F DB 59 22 C5 7B 62 9A D5 7D 30 9D 1C
: 5F 0F 47 D5 34 9C A8 69 D3 BB E5 04 45 D5 4C 70
: 1F E4 4D 84 FE 5B 81 86 61 C9 A3 C7 CF 70 C3 6C
: DE 44 06 9E E7 A0 E5 61 A2 E7 85 B4 81 A0 95 E2
: 35 CF BF 1E 1E 68 CE B5 7B AC 8F 44 FE 50 8B 5B
: 37 18 F1 33 0A 20 08 26 7A A4 ED 15 38 C5 6F 5E
: 53 8A BA 8D 0C 35 87 97 C1 7A F9 F2 DF D0 01 7B
: 0C 2C 2E 35 8B 49 BB 9D FD 88 B3 37 43 AB 4D 51
: 09 75 69 67 59 43 5D DC E8 2F AA 52 A6 C6 F2 48
: A7
289 3: INTEGER 65537
: }
: }
: }
0 warnings, 0 errors.
読めました。やったね。
ファイルに保存せずにパイプで渡すと、なぜかBIT STRINGの内側を見せてくれない。不思議。
使い方(2) ECDSA公開鍵
OpenSSHフォーマットのECDSA公開鍵の中身を見てみる。
$ ssh-keygen -t ecdsa -f /tmp/id_ecdsa
$ cat /tmp/id_ecdsa.pub
ecdsa-sha2-nistp256 AAAAE2VjZHNhLXNoYTItbmlzdHAyNTYAAAAIbmlzdHAyNTYAAABBBPdtAjzYrqVRP+rxzp81vJgiaycY5E+jlSp1oQLJUYOl6VIEKoCPzcOPrG61xWfM8m/9xdWp6A9kShi96+GBhLE= hnw@localhost
$ ssh-keygen -e -m pkcs8 -f /tmp/id_ecdsa.pub > /tmp/id_ecdsa.pub.pem
$ openssl ec -in /tmp/id_ecdsa.pub.pem -pubin -outform DER -out /tmp/id_ecdsa.pub.der
DER形式に保存して dumpasn1
。
$ dumpasn1 /tmp/id_ecdsa.pub.der
0 331: SEQUENCE {
4 259: SEQUENCE {
8 7: OBJECT IDENTIFIER ecPublicKey (1 2 840 10045 2 1)
17 247: SEQUENCE {
20 1: INTEGER 1
23 44: SEQUENCE {
25 7: OBJECT IDENTIFIER prime-field (1 2 840 10045 1 1)
34 33: INTEGER
: 00 FF FF FF FF 00 00 00 01 00 00 00 00 00 00 00
: 00 00 00 00 00 FF FF FF FF FF FF FF FF FF FF FF
: FF
: }
69 91: SEQUENCE {
71 32: OCTET STRING
: FF FF FF FF 00 00 00 01 00 00 00 00 00 00 00 00
: 00 00 00 00 FF FF FF FF FF FF FF FF FF FF FF FC
105 32: OCTET STRING
: 5A C6 35 D8 AA 3A 93 E7 B3 EB BD 55 76 98 86 BC
: 65 1D 06 B0 CC 53 B0 F6 3B CE 3C 3E 27 D2 60 4B
139 21: BIT STRING C4 9D 36 08 86 E7 04 93 6A 66 78 E1 13 9D 26 B7 81 9F 7E 90
: }
162 65: OCTET STRING
: 04 6B 17 D1 F2 E1 2C 42 47 F8 BC E6 E5 63 A4 40
: F2 77 03 7D 81 2D EB 33 A0 F4 A1 39 45 D8 98 C2
: 96 4F E3 42 E2 FE 1A 7F 9B 8E E7 EB 4A 7C 0F 9E
: 16 2B CE 33 57 6B 31 5E CE CB B6 40 68 37 BF 51
: F5
229 33: INTEGER
: 00 FF FF FF FF 00 00 00 00 FF FF FF FF FF FF FF
: FF BC E6 FA AD A7 17 9E 84 F3 B9 CA C2 FC 63 25
: 51
264 1: INTEGER 1
: }
: }
267 66: BIT STRING
: 04 F7 6D 02 3C D8 AE A5 51 3F EA F1 CE 9F 35 BC
: 98 22 6B 27 18 E4 4F A3 95 2A 75 A1 02 C9 51 83
: A5 E9 52 04 2A 80 8F CD C3 8F AC 6E B5 C5 67 CC
: F2 6F FD C5 D5 A9 E8 0F 64 4A 18 BD EB E1 81 84
: B1
: }
0 warnings, 0 errors.
この公開鍵で使っている楕円曲線はsecp256r1。
「Mathematical routines for the NIST prime elliptic curves」の「4.3 Curve P-256」と見比べると下記のパラメータが対応していることがわかる。
- 21byte目: ?
- 35byte目: p
- 72byte目: a
- 106byte目: b
- 140byte目: seed(?)
- 163byte目: G(ベースポイント)
- 230byte目: q
- 265byte目: ?
- 268byte目: Q=dG(公開鍵)