1// Copyright 2013 The Go Authors. All rights reserved.
2// Use of this source code is governed by a BSD-style
3// license that can be found in the LICENSE file.
4
5package cipher_test
6
7import (
8	"bytes"
9	"crypto/aes"
10	"crypto/cipher"
11	"crypto/des"
12	"testing"
13)
14
15func TestCryptBlocks(t *testing.T) {
16	buf := make([]byte, 16)
17	block, _ := aes.NewCipher(buf)
18
19	mode := cipher.NewCBCDecrypter(block, buf)
20	mustPanic(t, "crypto/cipher: input not full blocks", func() { mode.CryptBlocks(buf, buf[:3]) })
21	mustPanic(t, "crypto/cipher: output smaller than input", func() { mode.CryptBlocks(buf[:3], buf) })
22
23	mode = cipher.NewCBCEncrypter(block, buf)
24	mustPanic(t, "crypto/cipher: input not full blocks", func() { mode.CryptBlocks(buf, buf[:3]) })
25	mustPanic(t, "crypto/cipher: output smaller than input", func() { mode.CryptBlocks(buf[:3], buf) })
26}
27
28func mustPanic(t *testing.T, msg string, f func()) {
29	defer func() {
30		err := recover()
31		if err == nil {
32			t.Errorf("function did not panic, wanted %q", msg)
33		} else if err != msg {
34			t.Errorf("got panic %v, wanted %q", err, msg)
35		}
36	}()
37	f()
38}
39
40func TestEmptyPlaintext(t *testing.T) {
41	var key [16]byte
42	a, err := aes.NewCipher(key[:16])
43	if err != nil {
44		t.Fatal(err)
45	}
46	d, err := des.NewCipher(key[:8])
47	if err != nil {
48		t.Fatal(err)
49	}
50
51	s := 16
52	pt := make([]byte, s)
53	ct := make([]byte, s)
54	for i := 0; i < 16; i++ {
55		pt[i], ct[i] = byte(i), byte(i)
56	}
57
58	assertEqual := func(name string, got, want []byte) {
59		if !bytes.Equal(got, want) {
60			t.Fatalf("%s: got %v, want %v", name, got, want)
61		}
62	}
63
64	for _, b := range []cipher.Block{a, d} {
65		iv := make([]byte, b.BlockSize())
66		cbce := cipher.NewCBCEncrypter(b, iv)
67		cbce.CryptBlocks(ct, pt[:0])
68		assertEqual("CBC encrypt", ct, pt)
69
70		cbcd := cipher.NewCBCDecrypter(b, iv)
71		cbcd.CryptBlocks(ct, pt[:0])
72		assertEqual("CBC decrypt", ct, pt)
73
74		cfbe := cipher.NewCFBEncrypter(b, iv)
75		cfbe.XORKeyStream(ct, pt[:0])
76		assertEqual("CFB encrypt", ct, pt)
77
78		cfbd := cipher.NewCFBDecrypter(b, iv)
79		cfbd.XORKeyStream(ct, pt[:0])
80		assertEqual("CFB decrypt", ct, pt)
81
82		ctr := cipher.NewCTR(b, iv)
83		ctr.XORKeyStream(ct, pt[:0])
84		assertEqual("CTR", ct, pt)
85
86		ofb := cipher.NewOFB(b, iv)
87		ofb.XORKeyStream(ct, pt[:0])
88		assertEqual("OFB", ct, pt)
89	}
90}
91