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  }