github.com/sykesm/fabric@v1.1.0-preview.0.20200129034918-2aa12b1a0181/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, modified, err := ToLowS(&lowLevelKey.PublicKey, s) 84 assert.NoError(t, err) 85 assert.True(t, modified) 86 lowS, err = IsLowS(&lowLevelKey.PublicKey, s) 87 assert.NoError(t, err) 88 assert.True(t, lowS) 89 } 90 91 func TestSignatureToLowS(t *testing.T) { 92 lowLevelKey, err := ecdsa.GenerateKey(elliptic.P256(), rand.Reader) 93 assert.NoError(t, err) 94 95 s := new(big.Int) 96 s = s.Set(GetCurveHalfOrdersAt(elliptic.P256())) 97 s = s.Add(s, big.NewInt(1)) 98 99 lowS, err := IsLowS(&lowLevelKey.PublicKey, s) 100 assert.NoError(t, err) 101 assert.False(t, lowS) 102 sigma, err := MarshalECDSASignature(big.NewInt(1), s) 103 assert.NoError(t, err) 104 sigma2, err := SignatureToLowS(&lowLevelKey.PublicKey, sigma) 105 assert.NoError(t, err) 106 _, s, err = UnmarshalECDSASignature(sigma2) 107 assert.NoError(t, err) 108 lowS, err = IsLowS(&lowLevelKey.PublicKey, s) 109 assert.NoError(t, err) 110 assert.True(t, lowS) 111 }