Smail/server/services/externalemail/vault_test.go

53 lines
1.5 KiB
Go

package externalemail
import (
"strings"
"testing"
)
func TestVaultEncryptsAndFingerprintsWithoutPlaintext(t *testing.T) {
vault := NewVaultWithKeys([]byte(strings.Repeat("a", 32)), []byte(strings.Repeat("b", 32)))
ciphertext, err := vault.Encrypt("User@example.com")
if err != nil {
t.Fatal(err)
}
if strings.Contains(ciphertext, "User@example.com") || strings.Contains(ciphertext, "user@example.com") {
t.Fatal("ciphertext contains plaintext email")
}
first, err := vault.Fingerprint("User@example.com")
if err != nil {
t.Fatal(err)
}
second, err := vault.Fingerprint("user@example.com")
if err != nil {
t.Fatal(err)
}
if !EqualFingerprint(first, second) {
t.Fatal("normalized fingerprints differ")
}
decrypted, err := vault.Decrypt(ciphertext)
if err != nil || decrypted != "user@example.com" {
t.Fatalf("decrypted email = %q, error = %v", decrypted, err)
}
}
func TestVaultRejectsTamperingAndInvalidEmail(t *testing.T) {
vault := NewVaultWithKeys([]byte(strings.Repeat("a", 32)), []byte(strings.Repeat("b", 32)))
if _, err := vault.Encrypt("bad"); err == nil {
t.Fatal("invalid email accepted")
}
ciphertext, err := vault.Encrypt("user@example.com")
if err != nil {
t.Fatal(err)
}
last := ciphertext[len(ciphertext)-1]
replacement := byte('A')
if last == replacement {
replacement = 'B'
}
tampered := ciphertext[:len(ciphertext)-1] + string(replacement)
if _, err := vault.Decrypt(tampered); err == nil {
t.Fatal("tampered ciphertext accepted")
}
}