code.vegaprotocol.io/vega@v0.79.0/wallet/crypto/signature_test.go (about) 1 // Copyright (C) 2023 Gobalsky Labs Limited 2 // 3 // This program is free software: you can redistribute it and/or modify 4 // it under the terms of the GNU Affero General Public License as 5 // published by the Free Software Foundation, either version 3 of the 6 // License, or (at your option) any later version. 7 // 8 // This program is distributed in the hope that it will be useful, 9 // but WITHOUT ANY WARRANTY; without even the implied warranty of 10 // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 11 // GNU Affero General Public License for more details. 12 // 13 // You should have received a copy of the GNU Affero General Public License 14 // along with this program. If not, see <http://www.gnu.org/licenses/>. 15 16 package crypto_test 17 18 import ( 19 "crypto" 20 "testing" 21 22 wcrypto "code.vegaprotocol.io/vega/wallet/crypto" 23 24 "github.com/oasisprotocol/curve25519-voi/primitives/ed25519" 25 "github.com/stretchr/testify/assert" 26 "github.com/stretchr/testify/require" 27 ) 28 29 func TestSignature(t *testing.T) { 30 t.Run("create signature ed25519 success", testCreateEd25519SignatureOK) 31 t.Run("create signature ed25519 fail", testCreateSignatureFailureNotAnAlgo) 32 t.Run("verify success", testVerifyOK) 33 t.Run("verify fail wrong message", testVerifyFailWrongMessage) 34 t.Run("verify fail wrong pubkey", testVerifyFailWrongPubKey) 35 t.Run("sign fail bad key length", testSignBadKeyLength) 36 t.Run("verify fail bad key length", testVerifyBadKeyLength) 37 } 38 39 func testCreateEd25519SignatureOK(t *testing.T) { 40 _, err := wcrypto.NewSignatureAlgorithm(wcrypto.Ed25519, 1) 41 assert.NoError(t, err) 42 } 43 44 func testCreateSignatureFailureNotAnAlgo(t *testing.T) { 45 _, err := wcrypto.NewSignatureAlgorithm("not an algo", 1) 46 assert.ErrorIs(t, err, wcrypto.ErrUnsupportedSignatureAlgorithm) 47 } 48 49 func testVerifyOK(t *testing.T) { 50 s, err := wcrypto.NewSignatureAlgorithm(wcrypto.Ed25519, 1) 51 assert.NoError(t, err) 52 pub, priv := generateKey(t) 53 assert.NoError(t, err) 54 55 message := []byte("hello world") 56 57 sig, err := s.Sign(priv, message) 58 assert.NoError(t, err) 59 assert.NotEmpty(t, sig) 60 61 ok, err := s.Verify(pub, message, sig) 62 assert.NoError(t, err) 63 assert.True(t, ok) 64 } 65 66 func testSignBadKeyLength(t *testing.T) { 67 s, err := wcrypto.NewSignatureAlgorithm(wcrypto.Ed25519, 1) 68 assert.NoError(t, err) 69 _, priv := generateKey(t) 70 71 assert.NoError(t, err) 72 73 message := []byte("hello world") 74 75 // Chop one byte off the key 76 priv2, ok := priv.([]byte) 77 require.True(t, ok) 78 priv3 := priv2[0 : len(priv2)-1] 79 sig, err := s.Sign(crypto.PrivateKey(priv3), message) 80 assert.Error(t, err) 81 assert.Nil(t, sig) 82 } 83 84 func testVerifyBadKeyLength(t *testing.T) { 85 s, err := wcrypto.NewSignatureAlgorithm(wcrypto.Ed25519, 1) 86 assert.NoError(t, err) 87 pub, priv := generateKey(t) 88 89 assert.NoError(t, err) 90 91 message := []byte("hello world") 92 93 sig, err := s.Sign(priv, message) 94 assert.NoError(t, err) 95 assert.NotEmpty(t, sig) 96 97 // Chop one byte off the key 98 pub2, ok := pub.([]byte) 99 require.True(t, ok) 100 pub3 := pub2[0 : len(pub2)-1] 101 ok, err = s.Verify(crypto.PublicKey(pub3), message, sig) 102 assert.Error(t, err) 103 assert.False(t, ok) 104 } 105 106 func testVerifyFailWrongMessage(t *testing.T) { 107 s, err := wcrypto.NewSignatureAlgorithm(wcrypto.Ed25519, 1) 108 assert.NoError(t, err) 109 pub, priv := generateKey(t) 110 assert.NoError(t, err) 111 112 message := []byte("hello world") 113 wrongmessage := []byte("yolo") 114 115 sig, err := s.Sign(priv, message) 116 assert.NoError(t, err) 117 assert.NotEmpty(t, sig) 118 119 ok, err := s.Verify(pub, wrongmessage, sig) 120 assert.NoError(t, err) 121 assert.False(t, ok) 122 } 123 124 func testVerifyFailWrongPubKey(t *testing.T) { 125 s, err := wcrypto.NewSignatureAlgorithm(wcrypto.Ed25519, 1) 126 assert.NoError(t, err) 127 // gen 2 sets of keys 128 _, priv := generateKey(t) 129 assert.NoError(t, err) 130 pub, _ := generateKey(t) 131 assert.NoError(t, err) 132 133 message := []byte("hello world") 134 135 sig, err := s.Sign(priv, message) 136 assert.NoError(t, err) 137 assert.NotEmpty(t, sig) 138 139 ok, err := s.Verify(pub, message, sig) 140 assert.NoError(t, err) 141 assert.False(t, ok) 142 } 143 144 func generateKey(t *testing.T) (crypto.PublicKey, crypto.PrivateKey) { 145 t.Helper() 146 pub, priv, err := ed25519.GenerateKey(nil) 147 if err != nil { 148 t.Fatalf("couldn't generate key: %v", err) 149 } 150 151 return []byte(pub), []byte(priv) 152 }