github.com/status-im/status-go@v1.1.0/eth-node/crypto/crypto_test.go (about)

     1  package crypto
     2  
     3  import (
     4  	"encoding/hex"
     5  	"testing"
     6  
     7  	"github.com/stretchr/testify/require"
     8  )
     9  
    10  func TestExtractSignatures(t *testing.T) {
    11  	const content1 = "045a8cae84d8d139e887bb927d2b98cee481afae3770e0ee45f2dc19c6545e45921bc6a55ea92b705e45dfbbe47182c7b1d64a080a220d2781577163923d7cbb4b045a8cae84d8d139e887bb927d2b98cee481afae3770e0ee45f2dc19c6545e45921bc6a55ea92b705e45dfbbe47182c7b1d64a080a220d2781577163923d7cbb4b04ca82dd41fa592bf46ecf7e2eddae61013fc95a565b59c49f37f06b1b591ed3bd24e143495f2d1e241e151ab3572ac108d577be349d4b88d3d5a50c481ab35441"
    12  	const content2 = "045a8cae84d8d139e887bb927d2b98cee481afae3770e0ee45f2dc19c6545e45921bc6a55ea92b705e45dfbbe47182c7b1d64a080a220d2781577163923d7cbb4b045a8cae84d8d139e887bb927d2b98cee481afae3770e0ee45f2dc19c6545e45921bc6a55ea92b705e45dfbbe47182c7b1d64a080a220d2781577163923d7cbb4b04ca82dd41fa592bf46ecf7e2eddae61013fc95a565b59c49f37f06b1b591ed3bd24e143495f2d1e241e151ab3572ac108d577be349d4b88d3d5a50c481ab35440"
    13  
    14  	key1, err := GenerateKey()
    15  	require.NoError(t, err)
    16  
    17  	key2, err := GenerateKey()
    18  	require.NoError(t, err)
    19  
    20  	signature1, err := SignStringAsHex(content1, key1)
    21  	require.NoError(t, err)
    22  
    23  	signature2, err := SignStringAsHex(content2, key2)
    24  	require.NoError(t, err)
    25  
    26  	key1String := hex.EncodeToString(FromECDSAPub(&key1.PublicKey))
    27  	key2String := hex.EncodeToString(FromECDSAPub(&key2.PublicKey))
    28  
    29  	pair1 := [2]string{content1, signature1}
    30  	pair2 := [2]string{content2, signature2}
    31  
    32  	signaturePairs := [][2]string{pair1, pair2}
    33  
    34  	extractedSignatures, err := ExtractSignatures(signaturePairs)
    35  	require.NoError(t, err)
    36  	require.Equal(t, []string{key1String, key2String}, extractedSignatures)
    37  
    38  	// Test wrong content
    39  	pair3 := [2]string{content1, signature2}
    40  
    41  	signaturePairs = [][2]string{pair1, pair2, pair3}
    42  
    43  	extractedSignatures, err = ExtractSignatures(signaturePairs)
    44  	require.NoError(t, err)
    45  	// The public key is neither the one which generated the content, nor the one generated the signature
    46  	require.NotEqual(t, []string{key1String, key2String, key1String}, extractedSignatures)
    47  	require.NotEqual(t, []string{key1String, key2String, key2String}, extractedSignatures)
    48  }
    49  
    50  func TestVerifySignature(t *testing.T) {
    51  	const content1 = "045a8cae84d8d139e887bb927d2b98cee481afae3770e0ee45f2dc19c6545e45921bc6a55ea92b705e45dfbbe47182c7b1d64a080a220d2781577163923d7cbb4b045a8cae84d8d139e887bb927d2b98cee481afae3770e0ee45f2dc19c6545e45921bc6a55ea92b705e45dfbbe47182c7b1d64a080a220d2781577163923d7cbb4b04ca82dd41fa592bf46ecf7e2eddae61013fc95a565b59c49f37f06b1b591ed3bd24e143495f2d1e241e151ab3572ac108d577be349d4b88d3d5a50c481ab35441"
    52  	const content2 = "045a8cae84d8d139e887bb927d2b98cee481afae3770e0ee45f2dc19c6545e45921bc6a55ea92b705e45dfbbe47182c7b1d64a080a220d2781577163923d7cbb4b045a8cae84d8d139e887bb927d2b98cee481afae3770e0ee45f2dc19c6545e45921bc6a55ea92b705e45dfbbe47182c7b1d64a080a220d2781577163923d7cbb4b04ca82dd41fa592bf46ecf7e2eddae61013fc95a565b59c49f37f06b1b591ed3bd24e143495f2d1e241e151ab3572ac108d577be349d4b88d3d5a50c481ab35440"
    53  
    54  	key1, err := GenerateKey()
    55  	require.NoError(t, err)
    56  
    57  	key2, err := GenerateKey()
    58  	require.NoError(t, err)
    59  
    60  	signature1, err := SignStringAsHex(content1, key1)
    61  	require.NoError(t, err)
    62  
    63  	signature2, err := SignStringAsHex(content2, key2)
    64  	require.NoError(t, err)
    65  
    66  	key1String := hex.EncodeToString(FromECDSAPub(&key1.PublicKey))
    67  	key2String := hex.EncodeToString(FromECDSAPub(&key2.PublicKey))
    68  
    69  	pair1 := [3]string{content1, signature1, key1String}
    70  	pair2 := [3]string{content2, signature2, key2String}
    71  
    72  	signaturePairs := [][3]string{pair1, pair2}
    73  
    74  	err = VerifySignatures(signaturePairs)
    75  	require.NoError(t, err)
    76  
    77  	// Test wrong content
    78  	pair3 := [3]string{content1, signature2, key2String}
    79  
    80  	signaturePairs = [][3]string{pair1, pair2, pair3}
    81  
    82  	err = VerifySignatures(signaturePairs)
    83  	require.Error(t, err)
    84  
    85  	// Test wrong signature
    86  	pair3 = [3]string{content1, signature2, key1String}
    87  
    88  	signaturePairs = [][3]string{pair1, pair2, pair3}
    89  
    90  	err = VerifySignatures(signaturePairs)
    91  	require.Error(t, err)
    92  
    93  	// Test wrong pubkey
    94  	pair3 = [3]string{content1, signature1, key2String}
    95  
    96  	signaturePairs = [][3]string{pair1, pair2, pair3}
    97  
    98  	err = VerifySignatures(signaturePairs)
    99  	require.Error(t, err)
   100  }
   101  
   102  func TestSymmetricEncryption(t *testing.T) {
   103  	const rawKey = "0000000000000000000000000000000000000000000000000000000000000000"
   104  	expectedPlaintext := []byte("test")
   105  	key, err := hex.DecodeString(rawKey)
   106  	require.Nil(t, err, "Key should be generated without errors")
   107  
   108  	cyphertext1, err := EncryptSymmetric(key, expectedPlaintext)
   109  	require.Nil(t, err, "Cyphertext should be generated without errors")
   110  
   111  	cyphertext2, err := EncryptSymmetric(key, expectedPlaintext)
   112  	require.Nil(t, err, "Cyphertext should be generated without errors")
   113  
   114  	require.Equalf(
   115  		t,
   116  		32,
   117  		len(cyphertext1),
   118  		"Cyphertext with the correct length should be generated")
   119  
   120  	require.NotEqualf(
   121  		t,
   122  		cyphertext1,
   123  		cyphertext2,
   124  		"Same plaintext should not be encrypted in the same way")
   125  
   126  	plaintext, err := DecryptSymmetric(key, cyphertext1)
   127  	require.Nil(t, err, "Cyphertext should be decrypted without errors")
   128  
   129  	require.Equalf(
   130  		t,
   131  		expectedPlaintext,
   132  		plaintext,
   133  		"Cypther text should be decrypted successfully")
   134  }