github.com/Finschia/finschia-sdk@v0.48.1/crypto/keys/secp256k1/secp256k1_nocgo_test.go (about) 1 //go:build !libsecp256k1_sdk 2 // +build !libsecp256k1_sdk 3 4 package secp256k1 5 6 import ( 7 "testing" 8 9 secp256k1 "github.com/btcsuite/btcd/btcec" 10 "github.com/stretchr/testify/require" 11 ) 12 13 // Ensure that signature verification works, and that 14 // non-canonical signatures fail. 15 // Note: run with CGO_ENABLED=0 or go test -tags !cgo. 16 func TestSignatureVerificationAndRejectUpperS(t *testing.T) { 17 msg := []byte("We have lingered long enough on the shores of the cosmic ocean.") 18 for i := 0; i < 500; i++ { 19 priv := GenPrivKey() 20 sigStr, err := priv.Sign(msg) 21 require.NoError(t, err) 22 sig := signatureFromBytes(sigStr) 23 require.False(t, sig.S.Cmp(secp256k1halfN) > 0) 24 25 pub := priv.PubKey() 26 require.True(t, pub.VerifySignature(msg, sigStr)) 27 28 // malleate: 29 sig.S.Sub(secp256k1.S256().CurveParams.N, sig.S) 30 require.True(t, sig.S.Cmp(secp256k1halfN) > 0) 31 malSigStr := serializeSig(sig) 32 33 require.False(t, pub.VerifySignature(msg, malSigStr), 34 "VerifyBytes incorrect with malleated & invalid S. sig=%v, key=%v", 35 sig, 36 priv, 37 ) 38 } 39 }