gpgpdump 0.3.0 をリリースした

no extension

OpenPGP パケットの内容を視覚化する gpgpdump の 0.3.0 をリリースした。

このバージョンでようやく pgpdump に近い出力ができるようになった。

$ cat sig
-----BEGIN PGP SIGNATURE-----
Version: GnuPG v2

iF4EARMIAAYFAlTDCN8ACgkQMfv9qV+7+hg2HwEA6h2iFFuCBv3VrsSf2BREQaT1
T1ZprZqwRPOjiLJg9AwA/ArTwCPz7c2vmxlv7sRlRLUI6CdsOqhuO1KfYXrq7idI
=ZOTN
-----END PGP SIGNATURE-----

$ cat sig | gpgpdump -u
Signature Packet (tag 2) (94 bytes)
    Version: 4 (new)
    Signiture Type: Signature of a canonical text document (0x01)
    Public-key Algorithm: ECDSA public key algorithm (pub 19)
    Hash Algorithm: SHA256 (hash 8)
    Hashed Subpacket (6 bytes)
        Signature Creation Time (sub 2): 2015-01-24T02:52:15Z
    Unhashed Subpacket (10 bytes)
        Issuer (sub 16): 0x31fbfda95fbbfa18
    Hash left 2 bytes
        36 1f
    ECDSA r (256 bits)
    ECDSA s (252 bits)

今までの TOML フォーマット出力を行うには -t または --toml オプションを付ければよい。

$ cat sig | gpgpdump -t -u
[[Packet]]
  name = "Signature Packet (tag 2)"
  note = "94 bytes"

  [[Packet.Item]]
    name = "Version"
    value = "4"
    note = "new"

  [[Packet.Item]]
    name = "Signiture Type"
    value = "Signature of a canonical text document (0x01)"

  [[Packet.Item]]
    name = "Public-key Algorithm"
    value = "ECDSA public key algorithm (pub 19)"

  [[Packet.Item]]
    name = "Hash Algorithm"
    value = "SHA256 (hash 8)"

  [[Packet.Item]]
    name = "Hashed Subpacket"
    note = "6 bytes"

    [[Packet.Item.Item]]
      name = "Signature Creation Time (sub 2)"
      value = "2015-01-24T02:52:15Z"

  [[Packet.Item]]
    name = "Unhashed Subpacket"
    note = "10 bytes"

    [[Packet.Item.Item]]
      name = "Issuer (sub 16)"
      value = "0x31fbfda95fbbfa18"

  [[Packet.Item]]
    name = "Hash left 2 bytes"
    dump = "36 1f"

  [[Packet.Item]]
    name = "ECDSA r"
    note = "256 bits"

  [[Packet.Item]]
    name = "ECDSA s"
    note = "252 bits"

あとは “Compressed Data Packet (Tag 8)” に対応したことか。 これもようやく。

$ gpgpdump -u sig2
Compressed Data Packet (tag 8) (149 bytes)
    Compression Algorithm: ZIP <RFC1951> (comp 1)
        One-Pass Signature Packet (tag 4) (13 bytes)
            Version: 3 (new)
            Signiture Type: Signature of a binary document (0x00)
            Hash Algorithm: SHA256 (hash 8)
            Public-key Algorithm: DSA (Digital Signature Algorithm) (pub 17)
            Key ID: 0xb4da3bae7e20b81c
            Encrypted session key: other than one pass signature (01)
        Literal Data Packet (tag 11) (19 bytes)
            Literal data format: b (binary)
            File name: <null>
            Modification time of a file: 2017-11-25T06:29:56Z
            Literal data (13 bytes)
        Signature Packet (tag 2) (117 bytes)
            Version: 4 (new)
            Signiture Type: Signature of a binary document (0x00)
            Public-key Algorithm: DSA (Digital Signature Algorithm) (pub 17)
            Hash Algorithm: SHA256 (hash 8)
            Hashed Subpacket (29 bytes)
                Issuer Fingerprint (sub 33) (21 bytes)
                    Version: 4 (need 20 octets length)
                    Fingerprint (20 bytes)
                        1b 52 02 db 4a 3e c7 76 f1 e0 ad 18 b4 da 3b ae 7e 20 b8 1c
                Signature Creation Time (sub 2): 2017-11-25T06:29:56Z
            Unhashed Subpacket (10 bytes)
                Issuer (sub 16): 0xb4da3bae7e20b81c
            Hash left 2 bytes
                73 3c
            DSA r (256 bits)
            DSA s (255 bits)

RFC 1951Go 言語でどうやって実装するのか分からなくてさ。 compress/flate パッケージを使えばいいと気づくまで試行錯誤しちゃったよ(自作しなくて済んだ)。 この辺は別の記事で紹介する。

現在のオプションはこんな感じ。

$ gpgpdump -h
Usage:
  gpgpdump [flags] [OpenPGP file]

Flags:
  -a, --armor     accepts ASCII input only
      --debug     for debug
  -h, --help      help for gpgpdump
  -i, --int       dumps multi-precision integers
  -j, --json      output with JSON format
  -l, --literal   dumps literal packets (tag 11)
  -m, --marker    dumps marker packets (tag 10)
  -p, --private   dumps private packets (tag 60-63)
  -t, --toml      output with TOML format
  -u, --utc       output with UTC time
  -v, --version   output version of gpgpdump

--debug オプションは主に私がテストするためののもの。 以前は隠し機能にしてたんだけど,正式なオプションとして昇格させた。 これを付けると出力がかなりウザいことになるので,普段はお勧めしない。

残りの TODO はこんな感じ。 欲しい機能はだいたい実装できたかな。

  • パケット解析の未テスト部分を埋める(古いフォーマットのパケットのテストどうしよう)
  • 実は ECC (RFC 6637) がよく分かってない。もしかしたら解釈を間違えているかもしれない

個人的には,これで pgpdump から置き換えてもいいかなぁ,ってところまできたかな。 テストが圧倒的に不足してるのでしばらくはデバッグに専念するけど。 でも,ようやく専念できるようになったよ(笑)

ブックマーク