signify

連休前の事。いつもの農道を歩いていると、とあるビニールハウスの周辺に、やけに軽トラが止まっていた。農協主催の講習会でもやってるのかな?

おじさんに聞いてみた。何やってるんですか? 答えは、種もみと、超簡単な返答。詳しく聞くのも迷惑だろうと、知ったかぶりしたよ。頑張ってください。

なんだろう?種もみって。種籾 (たねもみ) の選別と種まき、これで疑問氷解。 昔の人の知恵ってすごいな。

翌日も同じコースを辿った。ハウスの中は、NASAご推奨(?)の銀色の保温シートですっかり覆われていた。

連休の後半、田に水がはいっていた。そしてハウスの中は? シートが取り除かれ、稲穂が育っていた。 田植機にそのまま載せられるようなサイズに仕切られていたぞ。なる程ね。

旨い酒の元を作ってください。期待してますよ。こちとら、何たってお米の国の人だもの。

syspatch

OpenBSDから、早速パッチが降ってきた。

ob$ doas syspatch
Get/Verify syspatch65-001_rip6cks... 100% |*************|   197 KB    00:00
Installing patch 001_rip6cksum
Relinking to create unique kernel... failed!

consoleにログを見ろって案内が出てた。

ob$ cat /usr/share/relink/kernel/GENERIC.MP/relink.log
(SHA256) /bsd: FAILED

Failed to verify /bsd's checksum, therefore a randomly linked kernel (KARL)
is not being built. KARL can be re-enabled for next boot by issuing as root:

sha256 -h /var/db/kernel.SHA256 /bsd

そう、vboxで使っていると時刻がずれるんで、修正してたんだ。sha256してから、カーネルを再リンク。それから下記を実施。

ob$ doas config -ef /bsd
OpenBSD 6.5 (GENERIC.MP) #0: Wed Apr 24 22:17:55 CEST 2019
    root@syspatch-65-i386.openbsd.org:/usr/src/sys/arch/i386/compile/GENERIC.MP
Enter 'help' for information
ukc> timezone -540
timezone = -540, dst = 0
ukc> quit
Saving modified kernel.

少々めんどくさい。できる事ならpatchの不作を願うぞ。

Xorg for OpenBSD on vbox

Virtual Box で、i386版を動かす理由は前回書いたように、マルチプロセッサーが動いたから。コンパイルする時にCPUが協力してくれるのが有り難いからね。

それにgdbを使って、Hex値を見る時、目が楽だからね。と、まったく年寄モード丸出しであります。

で、少々悔しいのがこれ。

doas rcctl -f start xenodm

なんてやると、xenodm ok なんて言ってくるんだけど、X loginが起動してこない。/var/log/Xorg.0.logを眺めると

[  8147.624] (II) VESA(0): initializing int10
[  8147.625] (EE) VESA(0): Cannot read int vect

こんなエラーが出て失敗してる。刑事魂発動で聞き込み開始。そしたら xf86(4)に何か手がかりがあるよと教えてくれる人がいた。

ob# sysctl -a | grep machdep.allowaperture
machdep.allowaperture=0

これを2とかに設定すると良さそう。sysctl.confに書いておくのが、OpenBSD流。だって、セキュリティー重要だから。 これにて、一件落着。

gdb with python

この日記と言うか雑記帳に非常によく登場するgdb。まだ入れてなかったので入れた。 付属品で、python 2.7.16が付いてきた。

すっかりpythonとは疎遠になっているんで、必要ないんだけどなー。100歩譲って、pythonが鎮座するにしても、3.7系ぐらいにして欲しかった。2系は、引退へのカウントダウンが始まっているからね。

GDBでPython scriptを実行する

gdb python scriptingの機能を使ってllvmをデバッグする

これを見ると、btした時の無闇に長い表示の整形に使えそうだな。試してみるか。 それより先にpython系は、どう定義されてるかな?

CONFIGURE_ARGS= --program-prefix=e \
                      :
                --with-python=${MODPY_BIN}

post-install:
        ${MODPY_BIN} -m compileall ${PREFIX}/share/gdb/python

gdbのMakefileは上記の様になってるけど、どんなpythonでも良いのかな? 先にqemuだったかを入れると、こいつにpython 3.6が付いてくる。これで代用できたりして。

MODPY_BINは何処に定義されてる?

/usr/ports/infrastructure/bin/portcheck

               if [[ $ic -lt ${#pyc_files[@]} &&
                      ${pyc_files[$ic]} == "$py"c ]]; then
                        ((++ic))
                else
                        err "${portref}Python module without" \
                            "compiled version, consider using" \
                            "\${MODPY_BIN} \${MODPY_LIBDIR}/compileall.py: $py"
                fi

本当に何処で定義してるの?

ed25519

足りないコマンドはオンデマンドで追加です。

ob$ doas pkg_add tree
quirks-3.124 signed on 2019-04-15T13:18:28Z
tree-0.62: ok

pkg_addする時にもsignifyのデータが使われているっぽい。そこで、pkg_* して、どんなコマンドが用意されてるか眺めてみた。 pkg_sign(1)より

SIGNATURE DETAILS
     The signature is stored within the gzip(1) comment, as plain text data,
     according to signify(1) -zS mode.  It contains the ed25519 signature,
     some meta-information, and SHA512/256 checksums for each 64K block of
     compressed data.

ed15519なんて語句を知ったので、識者に聞いてみた。これも刑事の勘って言った所でしょうか? 俗に言う芋蔓で一網打尽モードだな。

エドワーズ曲線デジタル署名アルゴリズム

rubyでed25519

Edwards-Curve Digital Signature Algorithm (EdDSA) RFC8032

RFCになって認知されるのかな。レファレンス実装として、python語の例が載ってた。それから、テストデータもURLが示されてた。

go 言語 でed25519ライブラリを使う

電子署名EdDSA(ed25519)の数的構造

ed25519のpython実装を紐解く その1数学編

ヘーェ、そうなんだ。とんでもない物に手を出しちゃったな。

HISTORY
     The pkg_sign command first appeared in OpenBSD 5.5.  The signature
     process was completely redesigned for OpenBSD 6.1.

上でRFCなんてのが出てきたんで、sha256のRFCが無いかと探したらなかった。お仲間のSHA2で検索したら、出てきた。SHA1は、ディスコンですかね。

5754 Using SHA2 Algorithms with Cryptographic Message Syntax. S. Turner.
     January 2010. (Format: TXT=21543 bytes) (Updates RFC3370) (Status:
     PROPOSED STANDARD) (DOI: 10.17487/RFC5754)
8009 AES Encryption with HMAC-SHA2 for Kerberos 5. M. Jenkins, M. Peck,
     K. Burgin. October 2016. (Format: TXT=34935 bytes) (Status:
     INFORMATIONAL) (DOI: 10.17487/RFC8009)

bt.py

前回やった、OpenBSDのディジタル署名コマンドsignifyの動きをgdbで追ってみる。

ob$ gdb -q signify
Reading symbols from signify...done.
(gdb) b crypto_sign_ed25519
Breakpoint 1 at 0x252ce: file mod_ed25519.c, line 65.
(gdb) set args  -S -s newkey.sec -m SHA256  -x msg.sig
(gdb) r
Starting program: /tmp/signify/signify -S -s newkey.sec -m SHA256  -x msg.sig
passphrase:

希望の所で止まった。

(gdb) bt
#0  crypto_sign_ed25519 (sm=0x5d661000 "", smlen=0xcf7e5a58,
    m=0x66c53a00 "SHA256 (bar.txt) = 7d865e959b2466918c9863afca942d0fb89d7c9ac0c99bafc3749504ded97730\nSHA256 (baz.txt) = bf07a7fbb825fc0aae7bf4a1177b2b31fcf8a3feeaf7092761e18c859ee52a9c\nSHA256 (foo.txt) = b5bb9d8014a0f"..., mlen=252,
    sk=0xcf7e64b8 "3\377\315\275y\264T\273\346m\266-N\217\330\275\237\225\260&=\r\343\314\372\025$*\206\213\337\360") at mod_ed25519.c:65
#1  0x1b7241b9 in signmsg (
    seckey=0xcf7e64b8 "3\377\315\275y\264T\273\346m\266-N\217\330\275\237\225\260&=\r\343\314\372\025$*\206\213\337\360",
    msg=0x66c53a00 "SHA256 (bar.txt) = 7d865e959b2466918c9863afca942d0fb89d7c9ac0c99bafc3749504ded97730\nSHA256 (baz.txt) = bf07a7fbb825fc0aae7bf4a1177b2b31fcf8a3feeaf7092761e18c859ee52a9c\nSHA256 (foo.txt) = b5bb9d8014a0f"...,
    msglen=252, sig=0xcf7e640a "") at signify.c:295
#2  0x1b723999 in createsig (seckeyfile=0xcf7e6b5b "newkey.sec",
    msgfile=0xcf7e6b69 "SHA256",
    msg=0x66c53a00 "SHA256 (bar.txt) = 7d865e959b2466918c9863afca942d0fb89d7c9ac0c99bafc3749504ded97730\nSHA256 (baz.txt) = bf07a7fbb825fc0aae7bf4a1177b2b31fcf8a3feeaf7092761e18c859ee52a9c\nSHA256 (foo.txt) = b5bb9d8014a0f"..., msglen=252)
    at signify.c:424
#3  0x1b725ca8 in sign (seckeyfile=0xcf7e6b5b "newkey.sec",
    msgfile=0xcf7e6b69 "SHA256", sigfile=0xcf7e6b73 "msg.sig", embedded=0)
    at signify.c:445
#4  0x1b725397 in main (argc=0, argv=0xcf7e6ab4) at signify.c:884

けど、がんばって表示してくれたおかげで、とっても醜い事に。そこで、pythonに整形と言うか、目移りする所をマスクしてもらおう。

#!/usr/bin/env python

bt = gdb.execute('bt', to_string=True)
L = bt.split('\n')
for id,line in enumerate(L):
  words = line.split(' ')
  if len(words) == 1:
    break
  if id == 0:
    print '%s %s(...)  %s' % (words[0], words[2], words[-1])
  else:
    print '%s %s(...)  %s' % (words[0], words[4], words[-1])

すっきりサッパリした。

(gdb) source bt.py
#0 crypto_sign_ed25519(...)  mod_ed25519.c:65
#1 signmsg(...)  signify.c:295
#2 createsig(...)  signify.c:424
#3 sign(...)  signify.c:445
#4 main(...)  signify.c:884

余りサッパリしすぎたと思ったら、注目部分だけを表示させれば良い。

(gdb) f 2
#2  0x1b723999 in createsig (seckeyfile=0xcf7e6b5b "newkey.sec",
    msgfile=0xcf7e6b69 "SHA256",
    msg=0x66c53a00 "SHA256 (bar.txt) = 7d865e959b2466918c9863afca942d0fb89d7c9ac0c99bafc3749504ded97730\nSHA256 (baz.txt) = bf07a7fbb825fc0aae7bf4a1177b2b31fcf8a3feeaf7092761e18c859ee52a9c\nSHA256 (foo.txt) = b5bb9d8014a0f"..., msglen=252)
    at signify.c:424
424             signmsg(enckey.seckey, msg, msglen, sig.sig);

passphrase って、どこで聞いてるんだろう? signifyを起動しておいて、別端末からアタッチして、アタックすれば良いな。

ob$ ps a | grep signify
52579 p1  I+p     0:00.01 ./signify -S -s newkey.sec -m SHA256 -x msg.sig
35773 p2  R+/0    0:00.00 grep signify
ob$ gdb -q signify 52579
Reading symbols from signify...done.
Attaching to program: /tmp/signify/signify, process 52579
Reading symbols from /usr/lib/libutil.so.13.0...done.
Reading symbols from /usr/lib/libc.so.95.0...done.
Reading symbols from /usr/libexec/ld.so...done.
[Switching to thread 165578]
_thread_sys_read () at -:3
3       -: No such file or directory.
(gdb) source bt.py
#0 _thread_sys_read(...)  -:3
#1 _libc_read_cancel(...)  /usr/src/lib/libc/sys/w_read.c:27
#2 _libc_readpassphrase(...)  /usr/src/lib/libc/gen/readpassphrase.c:116
#3 kdf(...)  signify.c:266
#4 createsig(...)  signify.c:412
#5 sign(...)  signify.c:445
#6 main(...)  signify.c:884

こういう時は、関数の呼び出し履歴さえ分ればいいんで、bt.pyは便利だな。

他にやる事が出てきたので、この案件はしばし棚上げします。