[libsecp256k1で確認完了] invert(e) * privの場所です。オーバーフローが原因だったため、格納できない分をあらかじめ引き、差を取ってから、引いた分を戻す(加える)操作で確認完了です。

AI-NFT

libsecp256k1で動かない理由がオーバーフローにある点を突き止めました。どうやら位数だとオーバーフローする仕様で、その位数から1を引いた数は格納できる内容でした。まさか、楕円曲線の定数がオーバフローするとは考えておらず、overflowフラグをNULLにしていたため、発見が遅れてしまいました。

つまり、位数から1を引いた数を、negの1(つまり-1)とみなして、この数からeを引き、引いておいた1を加えば問題ないことがわかりました。これで invert(e) * priv が実現できます。

実際、これで検証した結果、OpenSSLとぴったりな値となって、あらゆる鍵でSignとVerifyをパスできました。やや回避策のような感じですが、これで確実に動くことは間違いないため、問題なしといたしました。

タイトルとURLをコピーしました