github.com/Finschia/finschia-sdk@v0.48.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/Finschia/ostracon/crypto" 11 12 "github.com/stretchr/testify/suite" 13 ) 14 15 func TestSKSuite(t *testing.T) { 16 suite.Run(t, new(SKSuite)) 17 } 18 19 type SKSuite struct{ CommonSuite } 20 21 func (suite *SKSuite) TestString() { 22 const prefix = "abc" 23 suite.Require().Equal(prefix+"{-}", suite.sk.String(prefix)) 24 } 25 26 func (suite *SKSuite) TestPubKey() { 27 pk := suite.sk.PubKey() 28 suite.True(suite.sk.PublicKey.Equal(&pk.PublicKey)) 29 } 30 31 func (suite *SKSuite) TestBytes() { 32 bz := suite.sk.Bytes() 33 suite.Len(bz, 32) 34 var sk *PrivKey 35 suite.Nil(sk.Bytes()) 36 } 37 38 func (suite *SKSuite) TestMarshal() { 39 require := suite.Require() 40 const size = 32 41 42 buffer := make([]byte, size) 43 suite.sk.MarshalTo(buffer) 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 low_s := new(big.Int).SetBytes(sig[32:64]) 75 76 // test that NormalizeS simply returns an already 77 // normalized s 78 require.Equal(NormalizeS(low_s), low_s) 79 80 // flip the s value into high order of curve P256 81 // leave r untouched! 82 high_s := new(big.Int).Mod(new(big.Int).Neg(low_s), elliptic.P256().Params().N) 83 84 require.False(suite.pk.VerifySignature(msg, signatureRaw(r, high_s))) 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([]byte(msg)) 96 require.True(ecdsa.Verify(&suite.pk.PublicKey, hash[:], r, high_s)) 97 98 // Mutate the message 99 msg[1] ^= byte(2) 100 require.False(suite.pk.VerifySignature(msg, sig)) 101 }