github.com/0chain/gosdk@v1.17.11/zboxcore/encryption/pre_test.go (about)

     1  package encryption
     2  
     3  import (
     4  	"encoding/base64"
     5  	"math/rand"
     6  	"testing"
     7  
     8  	"github.com/0chain/gosdk/zboxcore/fileref"
     9  	"github.com/stretchr/testify/require"
    10  	"go.dedis.ch/kyber/v3/group/edwards25519"
    11  )
    12  
    13  func TestMnemonic(t *testing.T) {
    14  	mnemonic := "travel twenty hen negative fresh sentence hen flat swift embody increase juice eternal satisfy want vessel matter honey video begin dutch trigger romance assault"
    15  
    16  	encscheme := NewEncryptionScheme()
    17  
    18  	_, err := encscheme.Initialize(mnemonic)
    19  	require.NoError(t, err)
    20  
    21  	encscheme.InitForEncryption("filetype:audio")
    22  	pvk, _ := encscheme.GetPrivateKey()
    23  	expectedPvk := "XsQLPaRBOFS+3KfXq2/uyAPE+/qq3VW0OkW0T9q93wQ="
    24  	require.Equal(t, expectedPvk, pvk)
    25  	pubk, _ := encscheme.GetPublicKey()
    26  	expectedPubk := "PwpVIXgXbnt8NJmy+R4aSwG8HwJbsbT2JVQqa0bayZQ="
    27  	require.Equal(t, expectedPubk, pubk)
    28  
    29  }
    30  
    31  func TestEncryptDecrypt(t *testing.T) {
    32  	mnemonic := "travel twenty hen negative fresh sentence hen flat swift embody increase juice eternal satisfy want vessel matter honey video begin dutch trigger romance assault"
    33  	dataToEncrypt := "encrypted_data_uttam"
    34  
    35  	encscheme := NewEncryptionScheme()
    36  	_, err := encscheme.Initialize(mnemonic)
    37  	require.NoError(t, err)
    38  	encscheme.InitForEncryption("filetype:audio")
    39  
    40  	encMessage, err := encscheme.Encrypt([]byte(dataToEncrypt))
    41  	require.Nil(t, err)
    42  
    43  	decrypted, err := encscheme.Decrypt(encMessage)
    44  	require.Nil(t, err)
    45  
    46  	require.Equal(t, string(decrypted), dataToEncrypt)
    47  }
    48  
    49  func TestReEncryptionAndDecryptionForShareData(t *testing.T) {
    50  	client_mnemonic := "travel twenty hen negative fresh sentence hen flat swift embody increase juice eternal satisfy want vessel matter honey video begin dutch trigger romance assault"
    51  	client_encscheme := NewEncryptionScheme()
    52  	_, err := client_encscheme.Initialize(client_mnemonic)
    53  	require.Nil(t, err)
    54  	client_encscheme.InitForEncryption("filetype:audio")
    55  	client_enc_pub_key, err := client_encscheme.GetPublicKey()
    56  	require.Nil(t, err)
    57  
    58  	shared_client_mnemonic := "inside february piece turkey offer merry select combine tissue wave wet shift room afraid december gown mean brick speak grant gain become toy clown"
    59  	shared_client_encscheme := NewEncryptionScheme()
    60  	_, err = shared_client_encscheme.Initialize(shared_client_mnemonic)
    61  	require.Nil(t, err)
    62  	shared_client_encscheme.InitForEncryption("filetype:audio")
    63  
    64  	enc_msg, err := shared_client_encscheme.Encrypt([]byte("encrypted_data_uttam"))
    65  	require.Nil(t, err)
    66  	regenkey, err := shared_client_encscheme.GetReGenKey(client_enc_pub_key, "filetype:audio")
    67  	require.Nil(t, err)
    68  	enc_msg.ReEncryptionKey = regenkey
    69  
    70  	client_decryption_scheme := NewEncryptionScheme()
    71  	_, err = client_decryption_scheme.Initialize(client_mnemonic)
    72  	require.Nil(t, err)
    73  	err = client_decryption_scheme.InitForDecryption("filetype:audio", enc_msg.EncryptedKey)
    74  	require.Nil(t, err)
    75  
    76  	result, err := client_decryption_scheme.Decrypt(enc_msg)
    77  	require.Nil(t, err)
    78  	require.Equal(t, string(result), "encrypted_data_uttam")
    79  }
    80  
    81  func TestReEncryptionAndDecryptionForMarketplaceShare(t *testing.T) {
    82  	client_mnemonic := "travel twenty hen negative fresh sentence hen flat swift embody increase juice eternal satisfy want vessel matter honey video begin dutch trigger romance assault"
    83  	client_encscheme := NewEncryptionScheme()
    84  	_, err := client_encscheme.Initialize(client_mnemonic)
    85  	require.Nil(t, err)
    86  	client_encscheme.InitForEncryption("filetype:audio")
    87  	client_enc_pub_key, err := client_encscheme.GetPublicKey()
    88  	require.Nil(t, err)
    89  
    90  	// seller uploads and blobber encrypts the data
    91  	blobber_mnemonic := "inside february piece turkey offer merry select combine tissue wave wet shift room afraid december gown mean brick speak grant gain become toy clown"
    92  	blobber_encscheme := NewEncryptionScheme()
    93  	_, err = blobber_encscheme.Initialize(blobber_mnemonic)
    94  	require.Nil(t, err)
    95  	blobber_encscheme.InitForEncryption("filetype:audio")
    96  	data_to_encrypt := "encrypted_data_uttaencrypted_data_uttaencrypted_data_uttaencrypted_data_uttaencrypted_data_uttaencrypted_data_uttaencrypted_data_uttaencrypted_data_uttaencrypted_data_uttammmmmmmmmencrypted_data_uttam"
    97  	enc_msg, err := blobber_encscheme.Encrypt([]byte(data_to_encrypt))
    98  	require.Nil(t, err)
    99  
   100  	// buyer requests data from blobber, blobber reencrypts the data with regen key using buyer public key
   101  	blobber_encscheme = NewEncryptionScheme()
   102  	_, err = blobber_encscheme.Initialize(blobber_mnemonic)
   103  	require.Nil(t, err)
   104  	err = blobber_encscheme.InitForDecryption("filetype:audio", enc_msg.EncryptedKey)
   105  	require.Nil(t, err)
   106  	regenkey, err := blobber_encscheme.GetReGenKey(client_enc_pub_key, "filetype:audio")
   107  	require.Nil(t, err)
   108  	reenc_msg, err := blobber_encscheme.ReEncrypt(enc_msg, regenkey, client_enc_pub_key)
   109  	require.Nil(t, err)
   110  	// verify encrypted message size
   111  	d1, _ := reenc_msg.D1.MarshalBinary()
   112  	d4, _ := reenc_msg.D4.MarshalBinary()
   113  	d5, _ := reenc_msg.D5.MarshalBinary()
   114  	require.Equal(t, 44, len(base64.StdEncoding.EncodeToString(d1)))
   115  	require.Equal(t, 88, len(base64.StdEncoding.EncodeToString(reenc_msg.D3)))
   116  	require.Equal(t, 44, len(base64.StdEncoding.EncodeToString(d4)))
   117  	require.Equal(t, 44, len(base64.StdEncoding.EncodeToString(d5)))
   118  
   119  	client_decryption_scheme := NewEncryptionScheme()
   120  	_, err = client_decryption_scheme.Initialize(client_mnemonic)
   121  	require.Nil(t, err)
   122  	err = client_decryption_scheme.InitForDecryption("filetype:audio", enc_msg.EncryptedKey)
   123  	require.Nil(t, err)
   124  
   125  	result, err := client_decryption_scheme.ReDecrypt(reenc_msg)
   126  	require.Nil(t, err)
   127  	require.Equal(t, string(result), data_to_encrypt)
   128  }
   129  
   130  func TestKyberPointMarshal(t *testing.T) {
   131  	suite := edwards25519.NewBlakeSHA256Ed25519()
   132  	reenc := ReEncryptedMessage{
   133  		D1: suite.Point(),
   134  		D2: []byte("d2"),
   135  		D3: []byte("d3"),
   136  		D4: suite.Point(),
   137  		D5: suite.Point(),
   138  	}
   139  	marshalled, err := reenc.Marshal()
   140  	require.Nil(t, err)
   141  	newmsg := &ReEncryptedMessage{
   142  		D1: suite.Point(),
   143  		D4: suite.Point(),
   144  		D5: suite.Point(),
   145  	}
   146  	err = newmsg.Unmarshal(marshalled)
   147  	require.Nil(t, err)
   148  	require.Equal(t, newmsg.D2, reenc.D2)
   149  	require.Equal(t, newmsg.D3, reenc.D3)
   150  	require.Equal(t, newmsg.D1.String(), reenc.D1.String())
   151  	require.Equal(t, newmsg.D4.String(), reenc.D4.String())
   152  	require.Equal(t, newmsg.D5.String(), reenc.D5.String())
   153  }
   154  
   155  func BenchmarkMarshal(t *testing.B) {
   156  	suite := edwards25519.NewBlakeSHA256Ed25519()
   157  	for i := 0; i < 1000; i++ {
   158  		point := suite.Point().Pick(suite.RandomStream())
   159  		data, err := point.MarshalBinary()
   160  		require.Nil(t, err)
   161  		require.Equal(t, 44, len(base64.StdEncoding.EncodeToString(data)))
   162  	}
   163  }
   164  
   165  func BenchmarkEncrypt(t *testing.B) {
   166  	mnemonic := "inside february piece turkey offer merry select combine tissue wave wet shift room afraid december gown mean brick speak grant gain become toy clown"
   167  	encscheme := NewEncryptionScheme()
   168  	_, err := encscheme.Initialize(mnemonic)
   169  	require.Nil(t, err)
   170  	encscheme.InitForEncryption("filetype:audio")
   171  	for i := 0; i < 10000; i++ {
   172  		dataToEncrypt := make([]byte, fileref.CHUNK_SIZE)
   173  		rand.Read(dataToEncrypt)
   174  		_, err := encscheme.Encrypt(dataToEncrypt)
   175  		require.Nil(t, err)
   176  		require.Equal(t, len(dataToEncrypt), fileref.CHUNK_SIZE)
   177  	}
   178  }
   179  
   180  func BenchmarkReEncryptAndReDecrypt(t *testing.B) {
   181  	client_mnemonic := "travel twenty hen negative fresh sentence hen flat swift embody increase juice eternal satisfy want vessel matter honey video begin dutch trigger romance assault"
   182  	client_encscheme := NewEncryptionScheme()
   183  	_, err := client_encscheme.Initialize(client_mnemonic)
   184  	require.Nil(t, err)
   185  	client_encscheme.InitForEncryption("filetype:audio")
   186  	client_enc_pub_key, err := client_encscheme.GetPublicKey()
   187  	require.Nil(t, err)
   188  
   189  	// seller uploads and blobber encrypts the data
   190  	blobber_mnemonic := "inside february piece turkey offer merry select combine tissue wave wet shift room afraid december gown mean brick speak grant gain become toy clown"
   191  	blobber_encscheme := NewEncryptionScheme()
   192  	_, err = blobber_encscheme.Initialize(blobber_mnemonic)
   193  	require.Nil(t, err)
   194  	blobber_encscheme.InitForEncryption("filetype:audio")
   195  	// buyer requests data from blobber, blobber reencrypts the data with regen key using buyer public key
   196  	regenkey, err := blobber_encscheme.GetReGenKey(client_enc_pub_key, "filetype:audio")
   197  	require.Nil(t, err)
   198  	for i := 0; i < 10000; i++ {
   199  		dataToEncrypt := make([]byte, fileref.CHUNK_SIZE)
   200  		rand.Read(dataToEncrypt) //nolint
   201  		enc_msg, err := blobber_encscheme.Encrypt(dataToEncrypt)
   202  		require.Nil(t, err)
   203  		reenc_msg, err := blobber_encscheme.ReEncrypt(enc_msg, regenkey, client_enc_pub_key)
   204  		require.Nil(t, err)
   205  
   206  		client_decryption_scheme := NewEncryptionScheme()
   207  		_, err = client_decryption_scheme.Initialize(client_mnemonic)
   208  		require.Nil(t, err)
   209  		err = client_decryption_scheme.InitForDecryption("filetype:audio", enc_msg.EncryptedKey)
   210  		require.Nil(t, err)
   211  
   212  		_, err = client_decryption_scheme.ReDecrypt(reenc_msg)
   213  		require.Nil(t, err)
   214  	}
   215  }