mirror of https://github.com/restic/restic.git
80 lines
1.6 KiB
Go
80 lines
1.6 KiB
Go
package khepri
|
|
|
|
import (
|
|
"bytes"
|
|
"encoding/hex"
|
|
"testing"
|
|
)
|
|
|
|
var test_values = []struct {
|
|
ekey, skey []byte
|
|
ciphertext []byte
|
|
plaintext []byte
|
|
should_panic bool
|
|
}{
|
|
{
|
|
ekey: decode_hex("303e8687b1d7db18421bdc6bb8588ccadac4d59ee87b8ff70c44e635790cafef"),
|
|
skey: decode_hex("cc8d4b948ee0ebfe1d415de921d10353ef4d8824cb80b2bcc5fbff8a9b12a42c"),
|
|
ciphertext: decode_hex("154f582d77e6430409da392c3a09aa38e00a78bcc8919557fe18dd17f83e7b0b3053def59f4215b6e1c6b72ceb5acdddd8511ce3a853e054218de1e9f34637470d68f1f93ba8228e4d9817d7c9acfcd2"),
|
|
plaintext: []byte("Dies ist ein Test!"),
|
|
},
|
|
}
|
|
|
|
func decode_hex(s string) []byte {
|
|
d, _ := hex.DecodeString(s)
|
|
return d
|
|
}
|
|
|
|
// returns true if function called panic
|
|
func should_panic(f func()) (did_panic bool) {
|
|
defer func() {
|
|
if r := recover(); r != nil {
|
|
did_panic = true
|
|
}
|
|
}()
|
|
|
|
f()
|
|
|
|
return false
|
|
}
|
|
|
|
func TestCrypto(t *testing.T) {
|
|
r := &Key{}
|
|
|
|
for _, tv := range test_values {
|
|
// test encryption
|
|
r.master = &keys{
|
|
Encrypt: tv.ekey,
|
|
Sign: tv.skey,
|
|
}
|
|
|
|
msg, err := r.encrypt(r.master, tv.plaintext)
|
|
if err != nil {
|
|
t.Fatal(err)
|
|
}
|
|
|
|
// decrypt message
|
|
_, err = r.decrypt(r.master, msg)
|
|
if err != nil {
|
|
t.Fatal(err)
|
|
}
|
|
|
|
// change hmac, this must fail
|
|
msg[len(msg)-8] ^= 0x23
|
|
|
|
if _, err = r.decrypt(r.master, msg); err != ErrUnauthenticated {
|
|
t.Fatal("wrong HMAC value not detected")
|
|
}
|
|
|
|
// test decryption
|
|
p, err := r.decrypt(r.master, tv.ciphertext)
|
|
if err != nil {
|
|
t.Fatal(err)
|
|
}
|
|
|
|
if !bytes.Equal(p, tv.plaintext) {
|
|
t.Fatalf("wrong plaintext: expected %q but got %q\n", tv.plaintext, p)
|
|
}
|
|
}
|
|
}
|