From 4869843d1a5c799093f32ea2cb808bbcc744ad8b Mon Sep 17 00:00:00 2001 From: Cornel Rautenbach <corneliusr> Date: Thu, 15 Jun 2023 12:52:18 +0200 Subject: [PATCH] Added encryption and decryption of byte arays --- encryption/encryption.go | 54 ++++++++++++++++++++++++++++++++++++++++ 1 file changed, 54 insertions(+) diff --git a/encryption/encryption.go b/encryption/encryption.go index 9d06d05..8d6c99a 100644 --- a/encryption/encryption.go +++ b/encryption/encryption.go @@ -111,6 +111,60 @@ func DecryptStruct(encryptedStruct string, key string, object any) error { return nil } +func EncryptByteArray(byteArray []byte, key string) (string, error) { + if len(key) != 32 { + return "", errors.New("key should be 32 bytes") + } + + block, err := aes.NewCipher([]byte(key)) + if err != nil { + return "", err + } + + aesGcm, err := cipher.NewGCM(block) + if err != nil { + return "", err + } + + nonce := make([]byte, aesGcm.NonceSize()) + if _, err = io.ReadFull(rand.Reader, nonce); err != nil { + return "", err + } + + encryptedValue := string(aesGcm.Seal(nonce, nonce, byteArray, nil)) + return base64.StdEncoding.EncodeToString([]byte(encryptedValue)), nil +} + +func DecryptByteArray(encryptedByteArray []byte, key string, object any) error { + if len(key) != 32 { + return errors.New("key should be 32 bytes") + } + + block, err := aes.NewCipher([]byte(key)) + if err != nil { + return err + } + + aesGcm, err := cipher.NewGCM(block) + if err != nil { + return err + } + + nonceSize := aesGcm.NonceSize() + if len(encryptedByteArray) < nonceSize { + return errors.New("ciphertext too short") + } + + nonce, ciphertext := encryptedByteArray[:nonceSize], encryptedByteArray[nonceSize:] + value, err := aesGcm.Open(nil, nonce, ciphertext, nil) + + err = json.Unmarshal(value, object) + if err != nil { + return err + } + return nil +} + func Encrypt(plaintext string, key string) (string, error) { if len(key) != 32 { return "", errors.New("key should be 32 bytes") -- GitLab