// +build !libsecp256k1 package secp256k1 import ( "testing" secp256k1 "github.com/btcsuite/btcd/btcec" "github.com/stretchr/testify/require" ) // Ensure that signature verification works, and that // non-canonical signatures fail. // Note: run with CGO_ENABLED=0 or go test -tags !cgo. func TestSignatureVerificationAndRejectUpperS(t *testing.T) { msg := []byte("We have lingered long enough on the shores of the cosmic ocean.") for i := 0; i < 500; i++ { priv := GenPrivKey() sigStr, err := priv.Sign(msg) require.NoError(t, err) sig := signatureFromBytes(sigStr) require.False(t, sig.S.Cmp(secp256k1halfN) > 0) pub := priv.PubKey() require.True(t, pub.VerifyBytes(msg, sigStr)) // malleate: sig.S.Sub(secp256k1.S256().CurveParams.N, sig.S) require.True(t, sig.S.Cmp(secp256k1halfN) > 0) malSigStr := serializeSig(sig) require.False(t, pub.VerifyBytes(msg, malSigStr), "VerifyBytes incorrect with malleated & invalid S. sig=%v, key=%v", sig, priv, ) } }