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 }