cli/pkg/crypt/chachapoly/chachapoly_test.go
Vi dfd7c3ab2d feat(crypt): add LTHN, ChaCha20, RSA, PGP primitives (port from Enchantrix) (#346) (#354)
Co-authored-by: Claude <developers@lethean.io>
Co-authored-by: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-05 20:30:28 +00:00

93 lines
2.2 KiB
Go

package chachapoly
import (
"crypto/rand"
"testing"
"github.com/stretchr/testify/assert"
"github.com/stretchr/testify/require"
)
func generateKey(t *testing.T) []byte {
t.Helper()
key := make([]byte, 32)
_, err := rand.Read(key)
require.NoError(t, err)
return key
}
func TestEncryptDecrypt_Good(t *testing.T) {
key := generateKey(t)
plaintext := []byte("hello, XChaCha20-Poly1305!")
ciphertext, err := Encrypt(plaintext, key)
require.NoError(t, err)
assert.NotEqual(t, plaintext, ciphertext)
// Ciphertext should be longer than plaintext (nonce + overhead)
assert.Greater(t, len(ciphertext), len(plaintext))
decrypted, err := Decrypt(ciphertext, key)
require.NoError(t, err)
assert.Equal(t, plaintext, decrypted)
}
func TestEncryptDecrypt_Bad(t *testing.T) {
key1 := generateKey(t)
key2 := generateKey(t)
plaintext := []byte("secret data")
ciphertext, err := Encrypt(plaintext, key1)
require.NoError(t, err)
// Decrypting with a different key should fail
_, err = Decrypt(ciphertext, key2)
assert.Error(t, err)
}
func TestEncryptDecrypt_Ugly(t *testing.T) {
// Invalid key length should fail
shortKey := []byte("too-short")
_, err := Encrypt([]byte("data"), shortKey)
assert.Error(t, err)
_, err = Decrypt([]byte("data"), shortKey)
assert.Error(t, err)
// Ciphertext too short should fail
key := generateKey(t)
_, err = Decrypt([]byte("short"), key)
assert.Error(t, err)
}
func TestEncryptDecryptEmpty_Good(t *testing.T) {
key := generateKey(t)
plaintext := []byte{}
ciphertext, err := Encrypt(plaintext, key)
require.NoError(t, err)
decrypted, err := Decrypt(ciphertext, key)
require.NoError(t, err)
assert.Equal(t, plaintext, decrypted)
}
func TestEncryptNonDeterministic_Good(t *testing.T) {
key := generateKey(t)
plaintext := []byte("same input")
ct1, err := Encrypt(plaintext, key)
require.NoError(t, err)
ct2, err := Encrypt(plaintext, key)
require.NoError(t, err)
// Different nonces mean different ciphertexts
assert.NotEqual(t, ct1, ct2, "each encryption should produce unique ciphertext due to random nonce")
// Both should decrypt to the same plaintext
d1, err := Decrypt(ct1, key)
require.NoError(t, err)
d2, err := Decrypt(ct2, key)
require.NoError(t, err)
assert.Equal(t, d1, d2)
}