2014年6月10日火曜日

gpg で pgp2.6.2i で作成した鍵を使う

きっかけは、Google が Chrome で OpenPGP をサポートするという話題。 pgp2.6.2i の時代に鍵を生成したことがあったので、それを GnuPG でも使用できるか気になった。

結論としては、Solaris 11.1 で提供される GnuPG 2.0.17 では不可。 以下のメッセージが表示される。

gpg: 保護アルゴリズム1 (IDEA)はサポートしていません

実際には GnuPG ではなく、 依存している libgcrypt 1.4.5 が特許の関係で IDEA をサポートしていない。 IDEA の特許は既に切れており、最新の libgcrypt は IDEA をサポートしている。

最新の GnuPG と依存パッケージ群をインストールしたところ、 gpg2.6.2i の時代に作成した鍵を使用できた。 使用したコンパイラは GCC 4.8.0。

PGP のソースコードは以下から入手。

GnuPG と依存パッケージ群のソースコードは以下から入手 。

PGP の構築

ソースコード展開後、ソースコードを修正し、make を実行。
  • getline() がシステム標準関数と衝突。機能が違うので、関数名を変更することで回避。
  • remove() がシステム標準関数と衝突。同じ機能なので、コードの削除で対応。
$ gmake sysv_386_gcc

libgpg-error の構築

$ ./configure --prefix=<prefix>
$ gmake
$ gmake check
$ gmake install

libgcryp の構築

AMD E-450 を使用しているので、未サポート機能を無効化。 無効化しない場合は次のエラーが発生。

libgcrypt.so.20 => <prefix>/lib/libgcrypt.so.20 - hardware capability (CA_SUNW_HW_1) unsupported: 0x18000000 [ XSAVE PCLMULQDQ ]

$ ./configure --prefix=<prefix> \
 --with-libgpg-error-prefix=<prefix> \
 --disable-pclmul-support \
 --disable-avx-support \
 --disable-avx2-support
$ gmake
$ gmake check
$ gmake install

libksba の構築

$ ./configure --prefix=<prefix> \
 --with-libgpg-error-prefix=<prefix>
$ gmake
$ gmake check
$ gmake install

libassuan の構築

$ ./configure --prefix=<prefix> \
 --with-libgpg-error-prefix=<prefix>
$ gmake
$ gmake check
$ gmake install

GnuPG の構築

$ ./configure --prefix=<prefix> \
 --with-pinentry-pgm=<prefix>/libexec/pinentry-gtk-2 \
 --with-libgpg-error-prefix=<prefix> \
 --with-libgcrypt-prefix=<prefix> \
 --with-libassuan-prefix=<prefix> \
 --with-ksba-prefix=<prefix>
$ gmake
$ gmake check
$ gmake install
$ sudo chown root <prefix>/bin/gpg2 
$ sudo chmod u+s <prefix>/bin/gpg2

ncurses の構築

Solaris 11.1 に含まれている pinentry には、 警告メッセージが表示されたり端末版で表示が乱れるなど、致命的ではない問題がある。 最新版の pinentry を普通に構築すると、 端末版でメッセージが表示されないなど、実用水準に達しないバイナリが生成される。 最新版の ncurses を構築し利用すると、 端末版の見栄えが比較的良好なバイナリが生成される。

--without-cxx-binding を指定しないと、構築に失敗する。

$ ./configure --prefix=<prefix> \
 --enable-widec \
 --with-shared \
 --with-terminfo-dirs=/usr/share/lib/terminfo \
 --with-default-terminfo-dir=/usr/share/lib/terminfo \
 --without-cxx-binding \
 --without-ada \
 --without-manpages \
 --without-progs 
$ gmake
$ gmake install.libs
$ gmake install.includes

pinentry の構築

$ ./configure --prefix=<prefix> \
 --bindir=<prefix>/libexec \
 --with-ncurses-include-dir=<prefix>/include/ncursesw
$ gmake INCLUDES=-I<prefix>/include/ncursesw
$ gmake install
$ sudo chown root <prefix>/libexec/pinentry-{gtk-2,curses}
$ sudo chmod u+s <prefix>/libexec/pinentry-{gtk-2,curses}

鍵の移行

GnuPG で新たに鍵を生成。

$ gpg2 --gen-key

PGP 2.6.2i で作成した鍵の署名状況を確認。 三つのIDが関係付けられており、そのうち一つが自分と二名の友人によって署名されていた。 他の二つのIDは未署名。

$ pgp -kv ~/.pgp/secring.pgp
...略...
鍵束: '<home>/.pgp/secring.pgp'
Type Bits/KeyID    Date       User ID
sec  1024/XXXXXXXX YYYY/MM/DD mypgpuid0
                              mypgpuid1
                              mypgpuid2
1つの対応した鍵を見つけました.
$ pgp -kvv 0xXXXXXXXX ~/.pgp/pubring.pgp
...略...
Type Bits/KeyID    Date       User ID
pub  1024/XXXXXXXX YYYY/MM/DD mypgpuid0
                              mypgpuid2
sig       XXXXXXXX             mypgpuid0
sig       YYYYYYYY             friend0uid
sig       ZZZZZZZZ             friend1uid
                              mypgpuid1
1つの対応した鍵を見つけました.

PGP 2.6.2i で作成した鍵を取り出す。自分の公開鍵に対しては、事前に自己署名を施す。 GnuPG の実装の関係で、主uidとしたい方を後で署名する必要がある。

$ cp ~/.pgp/pubring.pgp pubring.pgp
$ pgp -kx mypgpuid0 private.pgp ~/.pgp/secring.pgp
$ pgp -ks mypgpuid1 -u 0xXXXXXXXX pubring.pgp
$ pgp -ks mypgpuid0 -u 0xXXXXXXXX pubring.pgp
$ pgp -kvv 0xXXXXXXXX pubring.pgp
...略...
Type Bits/KeyID    Date       User ID
pub  1024/XXXXXXXX YYYY/MM/DD mypgpuid0
sig       XXXXXXXX             mypgpuid0
                              mypgpuid2
sig       XXXXXXXX             mypgpuid0
sig       YYYYYYYY             friend0uid
sig       ZZZZZZZZ             friend1uid
                              mypgpuid1
sig       XXXXXXXX             mypgpuid0
1つの対応した鍵を見つけました.
$ pgp -kx mypgpuid0 public.pgp pubring.pgp
$ pgp -kx friend0 public-friend.pgp
$ pgp -kx friend1 public-friend.pgp

GnuPG で、取り出した鍵を取り込む。

$ gpg2 --allow-weak-digest-algos --import private.pgp
gpg: 鍵XXXXXXXX: 秘密鍵をインポートしました
gpg: 鍵XXXXXXXX: 有効なユーザIDがありません
gpg: これはおそらく自己署名のないせいでしょう
gpg:         処理数の合計: 1
gpg:         ユーザIDなし: 1
gpg:     秘密鍵の読み込み: 1
gpg:   秘密鍵のインポート: 1
$ gpg2 --allow-weak-digest-algos --import public.pgp
gpg: 鍵XXXXXXXX: 公開鍵"<mypgpuid1>"をインポートしました
gpg:         処理数の合計: 1
gpg:           インポート: 1  (RSA: 1)
gpg: 「まぁまぁの信用」3、「全面的信用」1、PGP信用モデル
gpg: 深さ: 0  有効性:   1  署名:   0  信用: 0-, 0q, 0n, 0m, 0f, 1u
$ gpg2 --allow-weak-digest-algos \
 --allow-non-selfsigned-uid \
 --import public-friend.pgp
gpg: 鍵YYYYYYYY: 受理した未自己署名のユーザID"<friend0uid1>"
gpg: 鍵YYYYYYYY: 受理した未自己署名のユーザID"<friend0uid2>"
gpg: 鍵YYYYYYYY: 受理した未自己署名のユーザID"<friend0uid3>"
gpg: 鍵YYYYYYYY: 公開鍵"<friend0uid0>"をインポートしました
gpg: 鍵ZZZZZZZZ: 公開鍵"<friend1uid0>"をインポートしました
gpg:         処理数の合計: 2
gpg:           インポート: 2  (RSA: 2)
gpg: 「まぁまぁの信用」3、「全面的信用」1、PGP信用モデル
gpg: 深さ: 0  有効性:   1  署名:   0  信用: 0-, 0q, 0n, 0m, 0f, 1u

信用度を変更。trust サブコマンドを使用し、5 を指定。

$ gpg2 --edit-key mypgpuid0

移行した鍵の確認

鍵を表示。

$ pgp -kv
$ pgp -kvc
$ gpg2 --list-secret-keys
$ gpg2 --list-keys
$ gpg2 --fingerprint

PGP で平文に署名、GnuPG で確認。

$ pgp -s <file> -o <file>-s.pgp
$ gpg2 --pgp2 <file>-s.pgp

PGP で平文に平文のまま署名、GnuPG で確認。

$ pgp -sta <file> -o <file>-sta.asc
$ gpg2 --pgp2 <file>-sta.asc

PGP で平文に署名、受信者(自分)の公開鍵で暗号化、GnuPG で復号、確認。

$ pgp -es <file> <myname> 
$ pgp -es <file> -o <file>-es.pgp <myname> 
$ gpg2 --pgp2 <file>-es.pgp

PGP で慣用暗号だけを使用して暗号化、GnuPG で復号。

$ pgp -c <file> -o <file>-c.pgp
$ gpg2 <file>-c.pgp