dumpasn1の使い方メモ

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](http://koclab.cs.ucsb.edu/teaching/cren/docs/w02/nist-routines.pdf)」の「4.3 Curve P-256」と見比べると下記のパラメータが対応していることがわかる。

- 21byte目: ?
- 35byte目: p
- 72byte目: a
- 106byte目: b
- 140byte目: seed(?)
- 163byte目: G（ベースポイント）
- 230byte目: q
- 265byte目: ?
- 268byte目: Q=dG（公開鍵）