1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148
|
package siv_aead
import (
"bytes"
"encoding/hex"
"testing"
"github.com/jacobsa/crypto/siv"
)
// Test all supported key lengths
func TestKeyLens(t *testing.T) {
keyLens := []int{32, 48, 64}
nonce := make([]byte, 16)
plaintext := []byte("foobar")
for _, keyLen := range keyLens {
key := make([]byte, keyLen)
a := new2(key)
ciphertext2 := a.Seal(nil, nonce, plaintext, nil)
ciphertext, err := siv.Encrypt(nil, key, plaintext, [][]byte{nil, nonce})
if err != nil {
t.Error(err)
} else if o := len(ciphertext) - len(plaintext); o != a.Overhead() {
t.Errorf("keyLen=%d, actual overhead: %d\n", keyLen, o)
}
if !bytes.Equal(ciphertext, ciphertext2) {
t.Errorf("siv and siv_aead produce different results")
}
}
}
// Test using a 32-byte key
func TestK32(t *testing.T) {
key := bytes.Repeat([]byte{1}, 32)
nonce := bytes.Repeat([]byte{2}, 16)
plaintext := []byte{1, 2, 3, 4, 5, 6, 7, 8, 9}
aData := make([]byte, 24)
// Compare siv and siv_aead results
sResult, err := siv.Encrypt(nonce, key, plaintext, [][]byte{aData, nonce})
if err != nil {
t.Fatal(err)
}
a := new2(key)
aResult := a.Seal(nonce, nonce, plaintext, aData)
if !bytes.Equal(sResult, aResult) {
t.Errorf("siv and siv_aead produce different results")
}
expectedResult, _ := hex.DecodeString(
"02020202020202020202020202020202ad7a4010649a84d8c1dd5f752e935eed57d45b8b10008f3834")
if !bytes.Equal(aResult, expectedResult) {
t.Error(hex.EncodeToString(aResult))
}
// Verify overhead
overhead := len(aResult) - len(plaintext) - len(nonce)
if overhead != a.Overhead() {
t.Errorf("Overhead() returns a wrong value")
}
// Decrypt
p1, err := a.Open(nil, aResult[:16], aResult[16:], aData)
if err != nil {
t.Error(err)
}
if !bytes.Equal(plaintext, p1) {
t.Errorf("wrong plaintext")
}
// Decrypt and append
dst := []byte{0xaa, 0xbb, 0xcc}
p2, err := a.Open(dst, aResult[:16], aResult[16:], aData)
if err != nil {
t.Error(err)
}
p2e := append(dst, plaintext...)
if !bytes.Equal(p2e, p2) {
t.Errorf("wrong plaintext: %s", hex.EncodeToString(p2))
}
// Decrypt corrupt
aResult[17] = 0
_, err = a.Open(nil, aResult[:16], aResult[16:], aData)
if err == nil {
t.Error("should have failed")
}
// Decrypt and append corrupt
aResult[17] = 0
_, err = a.Open(dst, aResult[:16], aResult[16:], aData)
if err == nil {
t.Error("should have failed")
}
}
// Test using a 64-byte key
func TestK64(t *testing.T) {
key := bytes.Repeat([]byte{1}, 64)
nonce := bytes.Repeat([]byte{2}, 16)
plaintext := []byte{1, 2, 3, 4, 5, 6, 7, 8, 9}
aData := make([]byte, 24)
// Compare siv and siv_aead results
sResult, err := siv.Encrypt(nonce, key, plaintext, [][]byte{aData, nonce})
if err != nil {
t.Fatal(err)
}
a := New(key)
aResult := a.Seal(nonce, nonce, plaintext, aData)
if !bytes.Equal(sResult, aResult) {
t.Errorf("siv and siv_aead produce different results")
}
expectedResult, _ := hex.DecodeString(
"02020202020202020202020202020202317b316f67c3ad336c01c9a01b4c5e552ba89e966bc4c1ade1")
if !bytes.Equal(aResult, expectedResult) {
t.Error(hex.EncodeToString(aResult))
}
// Verify overhead
overhead := len(aResult) - len(plaintext) - len(nonce)
if overhead != a.Overhead() {
t.Errorf("Overhead() returns a wrong value")
}
// Decrypt
p1, err := a.Open(nil, aResult[:16], aResult[16:], aData)
if err != nil {
t.Error(err)
}
if !bytes.Equal(plaintext, p1) {
t.Errorf("wrong plaintext")
}
// Decrypt and append
dst := []byte{0xaa, 0xbb, 0xcc}
p2, err := a.Open(dst, aResult[:16], aResult[16:], aData)
if err != nil {
t.Error(err)
}
p2e := append(dst, plaintext...)
if !bytes.Equal(p2e, p2) {
t.Errorf("wrong plaintext: %s", hex.EncodeToString(p2))
}
// Decrypt corrupt
aResult[17] = 0
_, err = a.Open(nil, aResult[:16], aResult[16:], aData)
if err == nil {
t.Error("should have failed")
}
// Decrypt and append corrupt
aResult[17] = 0
_, err = a.Open(dst, aResult[:16], aResult[16:], aData)
if err == nil {
t.Error("should have failed")
}
}
|