github.com/hechain20/hechain@v0.0.0-20220316014945-b544036ba106/bccsp/utils/ecdsa_test.go (about) 1 /* 2 Copyright hechain. 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/require" 17 ) 18 19 func TestUnmarshalECDSASignature(t *testing.T) { 20 _, _, err := UnmarshalECDSASignature(nil) 21 require.Error(t, err) 22 require.Contains(t, err.Error(), "failed unmashalling signature [") 23 24 _, _, err = UnmarshalECDSASignature([]byte{}) 25 require.Error(t, err) 26 require.Contains(t, err.Error(), "failed unmashalling signature [") 27 28 _, _, err = UnmarshalECDSASignature([]byte{0}) 29 require.Error(t, err) 30 require.Contains(t, err.Error(), "failed unmashalling signature [") 31 32 sigma, err := MarshalECDSASignature(big.NewInt(-1), big.NewInt(1)) 33 require.NoError(t, err) 34 _, _, err = UnmarshalECDSASignature(sigma) 35 require.Error(t, err) 36 require.Contains(t, err.Error(), "invalid signature, R must be larger than zero") 37 38 sigma, err = MarshalECDSASignature(big.NewInt(0), big.NewInt(1)) 39 require.NoError(t, err) 40 _, _, err = UnmarshalECDSASignature(sigma) 41 require.Error(t, err) 42 require.Contains(t, err.Error(), "invalid signature, R must be larger than zero") 43 44 sigma, err = MarshalECDSASignature(big.NewInt(1), big.NewInt(0)) 45 require.NoError(t, err) 46 _, _, err = UnmarshalECDSASignature(sigma) 47 require.Error(t, err) 48 require.Contains(t, err.Error(), "invalid signature, S must be larger than zero") 49 50 sigma, err = MarshalECDSASignature(big.NewInt(1), big.NewInt(-1)) 51 require.NoError(t, err) 52 _, _, err = UnmarshalECDSASignature(sigma) 53 require.Error(t, err) 54 require.Contains(t, err.Error(), "invalid signature, S must be larger than zero") 55 56 sigma, err = MarshalECDSASignature(big.NewInt(1), big.NewInt(1)) 57 require.NoError(t, err) 58 R, S, err := UnmarshalECDSASignature(sigma) 59 require.NoError(t, err) 60 require.Equal(t, big.NewInt(1), R) 61 require.Equal(t, big.NewInt(1), S) 62 } 63 64 func TestIsLowS(t *testing.T) { 65 lowLevelKey, err := ecdsa.GenerateKey(elliptic.P256(), rand.Reader) 66 require.NoError(t, err) 67 68 lowS, err := IsLowS(&lowLevelKey.PublicKey, big.NewInt(0)) 69 require.NoError(t, err) 70 require.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 require.NoError(t, err) 77 require.True(t, lowS) 78 79 s = s.Add(s, big.NewInt(1)) 80 lowS, err = IsLowS(&lowLevelKey.PublicKey, s) 81 require.NoError(t, err) 82 require.False(t, lowS) 83 s, err = ToLowS(&lowLevelKey.PublicKey, s) 84 require.NoError(t, err) 85 lowS, err = IsLowS(&lowLevelKey.PublicKey, s) 86 require.NoError(t, err) 87 require.True(t, lowS) 88 } 89 90 func TestSignatureToLowS(t *testing.T) { 91 lowLevelKey, err := ecdsa.GenerateKey(elliptic.P256(), rand.Reader) 92 require.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 require.NoError(t, err) 100 require.False(t, lowS) 101 sigma, err := MarshalECDSASignature(big.NewInt(1), s) 102 require.NoError(t, err) 103 sigma2, err := SignatureToLowS(&lowLevelKey.PublicKey, sigma) 104 require.NoError(t, err) 105 _, s, err = UnmarshalECDSASignature(sigma2) 106 require.NoError(t, err) 107 lowS, err = IsLowS(&lowLevelKey.PublicKey, s) 108 require.NoError(t, err) 109 require.True(t, lowS) 110 }