schnorr署名、検証を完了しました。そこで、実装に手を加えて再検証です。Rを利用する計算手法の部分です。

やはりschnorr署名では、署名の際に無作為に決めたRのY座標が偶数で、そのX座標がハッシュから得たX座標と等しくなるという性質でした。そこで、Rを利用する計算手法を少し変えると、X座標とY座標の両方が一致する場合もあり、今、その両方が一致する場合を検証しています。セキュリティ的には、両方が一致するなら、その方が堅牢です。

そこでschnorr署名に、少し手を加えて再検証です。ところで、再検証を行う場合は、複数の環境で結果が一致し、さらに、署名を複数の環境でまたがってもValidが得られる状態を確認する必要があります。そのため、OpenSSLとlibsecp256k1に検証用のロジックを展開し、再検証を進めています。

それで、Rを利用する計算手法を変えるとなると、任意のヤコビ座標に対する四則演算(厳密には積と和)が必要となります。それで、libsecp256k1に任意の座標に対する積と和の演算がないみたいです。もともとこれはECDSA楕円曲線暗号専門のライブラリなので、Gに対する演算(Gに対するスカラー倍のちに和)は必須になるのでもちろんあります。でも、任意のヤコビ座標からの演算は、必要がないため、存在しないという感じです。もちろんアフィン座標にもないため、アフィン座標に座標変換してから、アフィンで処理するというわけにもいきません。

なお、OpenSSLは任意の座標からの計算も可能(積を実現するEC_POINT_mulは、Gに対するスカラー倍と、任意の座標に対するスカラー倍の両方を引数で兼任しています)なので、OpenSSLでRを利用する計算手法を変えながら、その方が良さげな場合、libsecp256k1のヤコビ座標に任意の点同士の積と和を追加するしかないかな、という流れになっております。その検証はOpenSSLと結果が一致するかどうかで、しっかり調査できます。