github.com/lzy4123/fabric@v2.1.1+incompatible/bccsp/utils/ecdsa_test.go (about) 1 /* 2 Copyright IBM Corp. All Rights Reserved. 3 4 SPDX-License-Identifier: Apache-2.0 5 */ 6 7 package utils 8 9 import ( 10 "crypto/ecdsa" 11 "crypto/elliptic" 12 "crypto/rand" 13 "math/big" 14 "testing" 15 16 "github.com/stretchr/testify/assert" 17 ) 18 19 func TestUnmarshalECDSASignature(t *testing.T) { 20 _, _, err := UnmarshalECDSASignature(nil) 21 assert.Error(t, err) 22 assert.Contains(t, err.Error(), "failed unmashalling signature [") 23 24 _, _, err = UnmarshalECDSASignature([]byte{}) 25 assert.Error(t, err) 26 assert.Contains(t, err.Error(), "failed unmashalling signature [") 27 28 _, _, err = UnmarshalECDSASignature([]byte{0}) 29 assert.Error(t, err) 30 assert.Contains(t, err.Error(), "failed unmashalling signature [") 31 32 sigma, err := MarshalECDSASignature(big.NewInt(-1), big.NewInt(1)) 33 assert.NoError(t, err) 34 _, _, err = UnmarshalECDSASignature(sigma) 35 assert.Error(t, err) 36 assert.Contains(t, err.Error(), "invalid signature, R must be larger than zero") 37 38 sigma, err = MarshalECDSASignature(big.NewInt(0), big.NewInt(1)) 39 assert.NoError(t, err) 40 _, _, err = UnmarshalECDSASignature(sigma) 41 assert.Error(t, err) 42 assert.Contains(t, err.Error(), "invalid signature, R must be larger than zero") 43 44 sigma, err = MarshalECDSASignature(big.NewInt(1), big.NewInt(0)) 45 assert.NoError(t, err) 46 _, _, err = UnmarshalECDSASignature(sigma) 47 assert.Error(t, err) 48 assert.Contains(t, err.Error(), "invalid signature, S must be larger than zero") 49 50 sigma, err = MarshalECDSASignature(big.NewInt(1), big.NewInt(-1)) 51 assert.NoError(t, err) 52 _, _, err = UnmarshalECDSASignature(sigma) 53 assert.Error(t, err) 54 assert.Contains(t, err.Error(), "invalid signature, S must be larger than zero") 55 56 sigma, err = MarshalECDSASignature(big.NewInt(1), big.NewInt(1)) 57 assert.NoError(t, err) 58 R, S, err := UnmarshalECDSASignature(sigma) 59 assert.NoError(t, err) 60 assert.Equal(t, big.NewInt(1), R) 61 assert.Equal(t, big.NewInt(1), S) 62 } 63 64 func TestIsLowS(t *testing.T) { 65 lowLevelKey, err := ecdsa.GenerateKey(elliptic.P256(), rand.Reader) 66 assert.NoError(t, err) 67 68 lowS, err := IsLowS(&lowLevelKey.PublicKey, big.NewInt(0)) 69 assert.NoError(t, err) 70 assert.True(t, lowS) 71 72 s := new(big.Int) 73 s = s.Set(GetCurveHalfOrdersAt(elliptic.P256())) 74 75 lowS, err = IsLowS(&lowLevelKey.PublicKey, s) 76 assert.NoError(t, err) 77 assert.True(t, lowS) 78 79 s = s.Add(s, big.NewInt(1)) 80 lowS, err = IsLowS(&lowLevelKey.PublicKey, s) 81 assert.NoError(t, err) 82 assert.False(t, lowS) 83 s, err = ToLowS(&lowLevelKey.PublicKey, s) 84 assert.NoError(t, err) 85 lowS, err = IsLowS(&lowLevelKey.PublicKey, s) 86 assert.NoError(t, err) 87 assert.True(t, lowS) 88 } 89 90 func TestSignatureToLowS(t *testing.T) { 91 lowLevelKey, err := ecdsa.GenerateKey(elliptic.P256(), rand.Reader) 92 assert.NoError(t, err) 93 94 s := new(big.Int) 95 s = s.Set(GetCurveHalfOrdersAt(elliptic.P256())) 96 s = s.Add(s, big.NewInt(1)) 97 98 lowS, err := IsLowS(&lowLevelKey.PublicKey, s) 99 assert.NoError(t, err) 100 assert.False(t, lowS) 101 sigma, err := MarshalECDSASignature(big.NewInt(1), s) 102 assert.NoError(t, err) 103 sigma2, err := SignatureToLowS(&lowLevelKey.PublicKey, sigma) 104 assert.NoError(t, err) 105 _, s, err = UnmarshalECDSASignature(sigma2) 106 assert.NoError(t, err) 107 lowS, err = IsLowS(&lowLevelKey.PublicKey, s) 108 assert.NoError(t, err) 109 assert.True(t, lowS) 110 }