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  }