前回の続きになる。
ECDSAの署名+αで公開鍵が算出できるらしい
まず、私が見たPythonのライブラリを見てみよう。
https://github.com/ludbb/secp256k1-py/blob/master/secp256k1/__init__.py#L396-L407
ハッシュを計算して、secp256k1_ecdsa_sign_recoverable()を呼び出しているだけのようだ。
呼び出しているライブラリは、これか。
Pythonのsecp256k1が入っているフォルダを見ても、_libsecp256k1.cpython-35m-x86_64-linux-gnu.soというファイルがあるだけだ。
上記のリンクはbitcoindの一部なのだけど、ライブラリとして独立しているようだから、たぶんビルドしたんだろう。
実装は、こちら。
見てみれば何かわかるんじゃなかろうかと期待したのだが・・・わからんね。
処理自体は、多くない。
直接関係している関数は、これらだけだ。
- secp256k1_nonce_function_default()
- secp256k1_scalar_set_b32()
- secp256k1_ecdsa_sig_sign()
- secp256k1_ecdsa_recoverable_signature_save()
secp256k1_scalar_is_zero()もあるが、これは値がゼロかどうかをチェックしているだけだろう。
うしろの2つは最後に1回だけ実行している。
つまり、secp256k1_scalar_set_b32()とsecp256k1_nonce_function_default()を繰り返して条件に合うnonceを探し、署名するときにR, S, recidを取得しているようだ。
nonce計算する関数は、nonce_function_rfc6979()のようだ。
https://github.com/bitcoin/bitcoin/blob/00d369239612c75548187d4da853bf6878a6f91f/src/secp256k1/src/secp256k1.c#L343
データを固めてSHA256しているようだ。
よく出てくるsecp256k1_scalar_set_b32()は、これ。
何をしているのだろう・・・。
overflowが非NULLであれば0を設定している、というのはわかるが、途中で抜けるルートはないので、!overflowは常に真だ。
しかし、EXHAUSTIVE_TEST_ORDERが出てこない。。。
テストで13という値を使っているところがあったが、これがそのまま使われているかどうかはわからん。
ビルドしてみれば分かるのだろうが、今日はやめておこう。
0 件のコメント:
コメントを投稿
コメントありがとうございます。
スパムかもしれない、と私が思ったら、
申し訳ないですが勝手に削除することもあります。
注: コメントを投稿できるのは、このブログのメンバーだけです。