2018/01/07

ECDSAの署名+αから公開鍵を算出したい (1)

前回の続きになる。
ECDSAの署名+αで公開鍵が算出できるらしい


まず、私が見たPythonのライブラリを見てみよう。
https://github.com/ludbb/secp256k1-py/blob/master/secp256k1/__init__.py#L396-L407

ハッシュを計算して、secp256k1_ecdsa_sign_recoverable()を呼び出しているだけのようだ。
呼び出しているライブラリは、これか。

https://github.com/bitcoin/bitcoin/blob/9ccafb1d7bdd172a9b963444072a844da379c4f7/src/secp256k1/include/secp256k1_recovery.h#L81-L88

Pythonのsecp256k1が入っているフォルダを見ても、_libsecp256k1.cpython-35m-x86_64-linux-gnu.soというファイルがあるだけだ。
上記のリンクはbitcoindの一部なのだけど、ライブラリとして独立しているようだから、たぶんビルドしたんだろう。


実装は、こちら。

https://github.com/bitcoin/bitcoin/blob/9ccafb1d7bdd172a9b963444072a844da379c4f7/src/secp256k1/src/modules/recovery/main_impl.h#L123-L168

見てみれば何かわかるんじゃなかろうかと期待したのだが・・・わからんね。
処理自体は、多くない。
直接関係している関数は、これらだけだ。

  • 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

https://github.com/bitcoin/bitcoin/blob/00d369239612c75548187d4da853bf6878a6f91f/src/secp256k1/src/secp256k1.c#L310-L340

データを固めてSHA256しているようだ。



よく出てくるsecp256k1_scalar_set_b32()は、これ。

https://github.com/bitcoin/bitcoin/blob/9ccafb1d7bdd172a9b963444072a844da379c4f7/src/secp256k1/src/scalar_low_impl.h#L47-L56

何をしているのだろう・・・。
overflowが非NULLであれば0を設定している、というのはわかるが、途中で抜けるルートはないので、!overflowは常に真だ。


しかし、EXHAUSTIVE_TEST_ORDERが出てこない。。。
テストで13という値を使っているところがあったが、これがそのまま使われているかどうかはわからん。
ビルドしてみれば分かるのだろうが、今日はやめておこう。

0 件のコメント:

コメントを投稿

コメントありがとうございます。
スパムかもしれない、と私が思ったら、
申し訳ないですが勝手に削除することもあります。