github.com/cosmos/cosmos-sdk@v0.50.1/crypto/keys/internal/ecdsa/privkey_internal_test.go (about) 1 package ecdsa 2 3 import ( 4 "crypto/ecdsa" 5 "crypto/elliptic" 6 "crypto/sha256" 7 "math/big" 8 "testing" 9 10 "github.com/cometbft/cometbft/crypto" 11 "github.com/stretchr/testify/suite" 12 ) 13 14 func TestSKSuite(t *testing.T) { 15 suite.Run(t, new(SKSuite)) 16 } 17 18 type SKSuite struct{ CommonSuite } 19 20 func (suite *SKSuite) TestString() { 21 const prefix = "abc" 22 suite.Require().Equal(prefix+"{-}", suite.sk.String(prefix)) 23 } 24 25 func (suite *SKSuite) TestPubKey() { 26 pk := suite.sk.PubKey() 27 suite.True(suite.sk.PublicKey.Equal(&pk.PublicKey)) 28 } 29 30 func (suite *SKSuite) TestBytes() { 31 bz := suite.sk.Bytes() 32 suite.Len(bz, 32) 33 var sk *PrivKey 34 suite.Nil(sk.Bytes()) 35 } 36 37 func (suite *SKSuite) TestMarshal() { 38 require := suite.Require() 39 const size = 32 40 41 buffer := make([]byte, size) 42 _, err := suite.sk.MarshalTo(buffer) 43 require.NoError(err) 44 45 sk := new(PrivKey) 46 err = sk.Unmarshal(buffer, secp256r1, size) 47 require.NoError(err) 48 require.True(sk.Equal(&suite.sk.PrivateKey)) 49 } 50 51 func (suite *SKSuite) TestSign() { 52 require := suite.Require() 53 54 msg := crypto.CRandBytes(1000) 55 sig, err := suite.sk.Sign(msg) 56 require.NoError(err) 57 sigCpy := make([]byte, len(sig)) 58 copy(sigCpy, sig) 59 require.True(suite.pk.VerifySignature(msg, sigCpy)) 60 61 // Mutate the signature 62 for i := range sig { 63 sigCpy[i] ^= byte(i + 1) 64 require.False(suite.pk.VerifySignature(msg, sigCpy)) 65 } 66 67 // mutate the signature by scalar neg'ing the s value 68 // to give a high-s signature, valid ECDSA but should 69 // be invalid with Cosmos signatures. 70 // code mostly copied from privkey/pubkey.go 71 72 // extract the r, s values from sig 73 r := new(big.Int).SetBytes(sig[:32]) 74 lowS := new(big.Int).SetBytes(sig[32:64]) 75 76 // test that NormalizeS simply returns an already 77 // normalized s 78 require.Equal(NormalizeS(lowS), lowS) 79 80 // flip the s value into high order of curve P256 81 // leave r untouched! 82 highS := new(big.Int).Mod(new(big.Int).Neg(lowS), elliptic.P256().Params().N) 83 84 require.False(suite.pk.VerifySignature(msg, signatureRaw(r, highS))) 85 86 // Valid signature using low_s, but too long 87 sigCpy = make([]byte, len(sig)+2) 88 copy(sigCpy, sig) 89 sigCpy[65] = byte('A') 90 91 require.False(suite.pk.VerifySignature(msg, sigCpy)) 92 93 // check whether msg can be verified with same key, and high_s 94 // value using "regular" ecdsa signature 95 hash := sha256.Sum256(msg) 96 require.True(ecdsa.Verify(&suite.pk.PublicKey, hash[:], r, highS)) 97 98 // Mutate the message 99 msg[1] ^= byte(2) 100 require.False(suite.pk.VerifySignature(msg, sig)) 101 }