github.com/e154/smart-home@v0.17.2-0.20240311175135-e530a6e5cd45/common/encryptor/chacha_test.go (about)

     1  // This file is part of the Smart Home
     2  // Program complex distribution https://github.com/e154/smart-home
     3  // Copyright (C) 2023, Filippov Alex
     4  //
     5  // This library is free software: you can redistribute it and/or
     6  // modify it under the terms of the GNU Lesser General Public
     7  // License as published by the Free Software Foundation; either
     8  // version 3 of the License, or (at your option) any later version.
     9  //
    10  // This library is distributed in the hope that it will be useful,
    11  // but WITHOUT ANY WARRANTY; without even the implied warranty of
    12  // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
    13  // Library General Public License for more details.
    14  //
    15  // You should have received a copy of the GNU Lesser General Public
    16  // License along with this library.  If not, see
    17  // <https://www.gnu.org/licenses/>.
    18  
    19  package encryptor
    20  
    21  import (
    22  	"bytes"
    23  	"crypto/rand"
    24  	"encoding/hex"
    25  	"testing"
    26  
    27  	"github.com/stretchr/testify/require"
    28  )
    29  
    30  // TestCreateEncryptorWithTooShortKey try to create encryptor with a too short key.
    31  func TestCreateEncryptorWithTooShortKey(t *testing.T) {
    32  
    33  	key := make([]byte, keyLength-1)
    34  	_, err := rand.Read(key)
    35  	require.NoError(t, err)
    36  	_, err = New(key)
    37  	require.Error(t, err)
    38  }
    39  
    40  // TestCreateEncryptorWithTooLongKey try to create encryptor with a too long key.
    41  func TestCreateEncryptorWithTooLongKey(t *testing.T) {
    42  
    43  	key := make([]byte, keyLength+1)
    44  	_, err := rand.Read(key)
    45  	require.NoError(t, err)
    46  	_, err = New(key)
    47  	require.Error(t, err)
    48  }
    49  
    50  // TestEncryptorEncryptDecrypt tests encryption and then correct decryption.
    51  func TestEncryptorEncryptDecrypt(t *testing.T) {
    52  
    53  	key := make([]byte, keyLength)
    54  	_, err := rand.Read(key)
    55  	require.NoError(t, err)
    56  	encryptor, err := New(key)
    57  	require.NoError(t, err)
    58  
    59  	hexbytes := make([]byte, 256)
    60  	_, err = rand.Read(hexbytes)
    61  	require.NoError(t, err)
    62  	valueStr := hex.EncodeToString(hexbytes)
    63  	valbytes := []byte(valueStr)
    64  
    65  	encrypted, err := encryptor.Encrypt(valbytes)
    66  	require.NoError(t, err)
    67  	require.False(t, bytes.Equal(valbytes, encrypted))
    68  
    69  	decrypted, err := encryptor.Decrypt(encrypted)
    70  	require.NoError(t, err)
    71  	require.False(t, bytes.Equal(encrypted, decrypted))
    72  	require.True(t, bytes.Equal(valbytes, decrypted))
    73  }
    74  
    75  func TestEncryptorEncryptDecryptString(t *testing.T) {
    76  	key = make([]byte, keyLength)
    77  	_, err := rand.Read(key)
    78  	require.NoError(t, err)
    79  
    80  	data, err := Encrypt("foobar")
    81  	require.NoError(t, err)
    82  
    83  	data, err = Decrypt(data)
    84  	require.NoError(t, err)
    85  	require.Equal(t, data, "foobar")
    86  }
    87  
    88  func BenchmarkEncryptor_Encrypt(t *testing.B) {
    89  	key := make([]byte, keyLength)
    90  	_, err := rand.Read(key)
    91  	require.NoError(t, err)
    92  
    93  	data := make([]byte, 16)
    94  	_, err = rand.Read(data)
    95  	require.NoError(t, err)
    96  
    97  	encryptor, err := New(key)
    98  	require.NoError(t, err)
    99  
   100  	t.ResetTimer()
   101  	t.ReportAllocs()
   102  	for i := 0; i < t.N; i++ {
   103  		_, err := encryptor.Encrypt(data)
   104  		require.NoError(t, err)
   105  	}
   106  }
   107  
   108  func BenchmarkEncryptor_Decrypt(t *testing.B) {
   109  	key := make([]byte, keyLength)
   110  	_, err := rand.Read(key)
   111  	require.NoError(t, err)
   112  
   113  	data := make([]byte, 16)
   114  	_, err = rand.Read(data)
   115  	require.NoError(t, err)
   116  
   117  	encryptor, err := New(key)
   118  	require.NoError(t, err)
   119  
   120  	ct, err := encryptor.Encrypt(data)
   121  	require.NoError(t, err)
   122  
   123  	t.ResetTimer()
   124  	t.ReportAllocs()
   125  	for i := 0; i < t.N; i++ {
   126  
   127  		pt, err := encryptor.Decrypt(ct)
   128  		require.NoError(t, err)
   129  		require.Equal(t, pt, data)
   130  	}
   131  }