Add data encryption / decryption utilities
This commit is contained in:
@@ -0,0 +1,70 @@
|
||||
// Package data provides utilities for interacting with database data
|
||||
// throughout Write.as.
|
||||
package data
|
||||
|
||||
import (
|
||||
"bytes"
|
||||
"crypto/rand"
|
||||
"strings"
|
||||
"testing"
|
||||
)
|
||||
|
||||
func TestEncDec(t *testing.T) {
|
||||
// Generate a random key with a valid length
|
||||
k := make([]byte, keyLen)
|
||||
_, err := rand.Read(k)
|
||||
if err != nil {
|
||||
t.Fatal(err)
|
||||
}
|
||||
|
||||
runEncDec(t, k, "this is my secret message™. 😄", nil)
|
||||
runEncDec(t, k, "mygreatemailaddress@gmail.com", nil)
|
||||
}
|
||||
|
||||
func TestAuthentication(t *testing.T) {
|
||||
// Generate a random key with a valid length
|
||||
k := make([]byte, keyLen)
|
||||
_, err := rand.Read(k)
|
||||
if err != nil {
|
||||
t.Fatal(err)
|
||||
}
|
||||
|
||||
runEncDec(t, k, "mygreatemailaddress@gmail.com", func(c []byte) []byte {
|
||||
c[0] = 'a'
|
||||
t.Logf("Modified: %s\n", c)
|
||||
return c
|
||||
})
|
||||
}
|
||||
|
||||
func runEncDec(t *testing.T, k []byte, plaintext string, transform func([]byte) []byte) {
|
||||
t.Logf("Plaintext: %s\n", plaintext)
|
||||
|
||||
// Encrypt the data
|
||||
ciphertext, err := Encrypt(k, plaintext)
|
||||
if err != nil {
|
||||
t.Fatal(err)
|
||||
}
|
||||
|
||||
t.Logf("Ciphertext: %s\n", ciphertext)
|
||||
|
||||
if transform != nil {
|
||||
ciphertext = transform(ciphertext)
|
||||
}
|
||||
|
||||
// Decrypt the data
|
||||
decryptedText, err := Decrypt(k, ciphertext)
|
||||
if err != nil {
|
||||
if transform != nil && strings.Contains(err.Error(), "message authentication failed") {
|
||||
// We modified the ciphertext; make sure we're getting the right error
|
||||
t.Logf("%v\n", err)
|
||||
return
|
||||
}
|
||||
t.Fatal(err)
|
||||
}
|
||||
|
||||
t.Logf("Decrypted: %s\n", string(decryptedText))
|
||||
|
||||
if !bytes.Equal([]byte(plaintext), decryptedText) {
|
||||
t.Errorf("Plaintext mismatch: got %x vs %x", plaintext, decryptedText)
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user