GoBit icon indicating copy to clipboard operation
GoBit copied to clipboard

Issue in affineFromJacobian

Open MariusVanDerWijden opened this issue 3 years ago • 0 comments

Solution:

diff --git a/crypto/secp256k1/curve.go b/crypto/secp256k1/curve.go
index 5409ee1d2..c305f58da 100644
--- a/crypto/secp256k1/curve.go
+++ b/crypto/secp256k1/curve.go
@@ -116,6 +116,9 @@ func (BitCurve *BitCurve) IsOnCurve(x, y *big.Int) bool {
 // affineFromJacobian reverses the Jacobian transform. See the comment at the
 // top of the file.
 func (BitCurve *BitCurve) affineFromJacobian(x, y, z *big.Int) (xOut, yOut *big.Int) {
+       if z.Sign() == 0 {
+               return new(big.Int), new(big.Int)
+       }
        zinv := new(big.Int).ModInverse(z, BitCurve.P)
        zinvsq := new(big.Int).Mul(zinv, zinv)

Tests:

func TestAffine(t *testing.T) {
	x := new(big.Int)
	y := new(big.Int)
	z := new(big.Int)
	theCurve.affineFromJacobian(x, y, z)
}

func TestAdd(t *testing.T) {
	x := new(big.Int)
	y := new(big.Int)
	z := new(big.Int)
	w := new(big.Int)
	theCurve.Add(x, y, z, w)
}

see also: https://github.com/ethereum/go-ethereum/pull/18419

MariusVanDerWijden avatar Nov 17 '20 09:11 MariusVanDerWijden