きっかけは、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