github.com/ari-anchor/sei-tendermint@v0.0.0-20230519144642-dc826b7b56bb/crypto/sr25519/sr25519_test.go (about) 1 package sr25519_test 2 3 import ( 4 "encoding/base64" 5 "encoding/json" 6 "testing" 7 8 "github.com/stretchr/testify/assert" 9 "github.com/stretchr/testify/require" 10 11 "github.com/ari-anchor/sei-tendermint/crypto" 12 "github.com/ari-anchor/sei-tendermint/crypto/sr25519" 13 ) 14 15 func TestSignAndValidateSr25519(t *testing.T) { 16 privKey := sr25519.GenPrivKey() 17 pubKey := privKey.PubKey() 18 19 msg := crypto.CRandBytes(128) 20 sig, err := privKey.Sign(msg) 21 require.NoError(t, err) 22 23 // Test the signature 24 assert.True(t, pubKey.VerifySignature(msg, sig)) 25 assert.True(t, pubKey.VerifySignature(msg, sig)) 26 27 // Mutate the signature, just one bit. 28 // TODO: Replace this with a much better fuzzer, tendermint/ed25519/issues/10 29 sig[7] ^= byte(0x01) 30 31 assert.False(t, pubKey.VerifySignature(msg, sig)) 32 } 33 34 func TestBatchSafe(t *testing.T) { 35 v := sr25519.NewBatchVerifier() 36 vFail := sr25519.NewBatchVerifier() 37 for i := 0; i <= 38; i++ { 38 priv := sr25519.GenPrivKey() 39 pub := priv.PubKey() 40 41 var msg []byte 42 if i%2 == 0 { 43 msg = []byte("easter") 44 } else { 45 msg = []byte("egg") 46 } 47 48 sig, err := priv.Sign(msg) 49 require.NoError(t, err) 50 51 err = v.Add(pub, msg, sig) 52 require.NoError(t, err) 53 54 switch i % 2 { 55 case 0: 56 err = vFail.Add(pub, msg, sig) 57 case 1: 58 msg[2] ^= byte(0x01) 59 err = vFail.Add(pub, msg, sig) 60 } 61 require.NoError(t, err) 62 } 63 64 ok, valid := v.Verify() 65 require.True(t, ok, "failed batch verification") 66 for i, ok := range valid { 67 require.Truef(t, ok, "sig[%d] should be marked valid", i) 68 } 69 70 ok, valid = vFail.Verify() 71 require.False(t, ok, "succeeded batch verification (invalid batch)") 72 for i, ok := range valid { 73 expected := (i % 2) == 0 74 require.Equalf(t, expected, ok, "sig[%d] should be %v", i, expected) 75 } 76 } 77 78 func TestJSON(t *testing.T) { 79 privKey := sr25519.GenPrivKey() 80 81 t.Run("PrivKey", func(t *testing.T) { 82 b, err := json.Marshal(privKey) 83 require.NoError(t, err) 84 85 // b should be the base64 encoded MiniSecretKey, enclosed by doublequotes. 86 b64 := base64.StdEncoding.EncodeToString(privKey.Bytes()) 87 b64 = "\"" + b64 + "\"" 88 require.Equal(t, []byte(b64), b) 89 90 var privKey2 sr25519.PrivKey 91 err = json.Unmarshal(b, &privKey2) 92 require.NoError(t, err) 93 require.Len(t, privKey2.Bytes(), sr25519.PrivKeySize) 94 require.EqualValues(t, privKey.Bytes(), privKey2.Bytes()) 95 }) 96 97 // PubKeys are just []byte, so there is no special handling. 98 }