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 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なんて語句を知ったので、識者に聞いてみた。これも刑事の勘って言った所でしょうか? 俗に言う芋蔓で一網打尽モードだな。
Edwards-Curve Digital Signature Algorithm (EdDSA) RFC8032
RFCになって認知されるのかな。レファレンス実装として、python語の例が載ってた。それから、テストデータもURLが示されてた。
ヘーェ、そうなんだ。とんでもない物に手を出しちゃったな。
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は便利だな。
他にやる事が出てきたので、この案件はしばし棚上げします。