1// Copyright 2011 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 des_test
6
7import (
8	"bytes"
9	"crypto/cipher"
10	"crypto/des"
11	"testing"
12)
13
14type CryptTest struct {
15	key []byte
16	in  []byte
17	out []byte
18}
19
20// some custom tests for DES
21var encryptDESTests = []CryptTest{
22	{
23		[]byte{0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00},
24		[]byte{0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00},
25		[]byte{0x8c, 0xa6, 0x4d, 0xe9, 0xc1, 0xb1, 0x23, 0xa7}},
26	{
27		[]byte{0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00},
28		[]byte{0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff},
29		[]byte{0x35, 0x55, 0x50, 0xb2, 0x15, 0x0e, 0x24, 0x51}},
30	{
31		[]byte{0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00},
32		[]byte{0x01, 0x23, 0x45, 0x67, 0x89, 0xab, 0xcd, 0xef},
33		[]byte{0x61, 0x7b, 0x3a, 0x0c, 0xe8, 0xf0, 0x71, 0x00}},
34	{
35		[]byte{0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00},
36		[]byte{0xfe, 0xdc, 0xba, 0x98, 0x76, 0x54, 0x32, 0x10},
37		[]byte{0x92, 0x31, 0xf2, 0x36, 0xff, 0x9a, 0xa9, 0x5c}},
38	{
39		[]byte{0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff},
40		[]byte{0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00},
41		[]byte{0xca, 0xaa, 0xaf, 0x4d, 0xea, 0xf1, 0xdb, 0xae}},
42	{
43		[]byte{0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff},
44		[]byte{0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff},
45		[]byte{0x73, 0x59, 0xb2, 0x16, 0x3e, 0x4e, 0xdc, 0x58}},
46	{
47		[]byte{0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff},
48		[]byte{0x01, 0x23, 0x45, 0x67, 0x89, 0xab, 0xcd, 0xef},
49		[]byte{0x6d, 0xce, 0x0d, 0xc9, 0x00, 0x65, 0x56, 0xa3}},
50	{
51		[]byte{0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff},
52		[]byte{0xfe, 0xdc, 0xba, 0x98, 0x76, 0x54, 0x32, 0x10},
53		[]byte{0x9e, 0x84, 0xc5, 0xf3, 0x17, 0x0f, 0x8e, 0xff}},
54	{
55		[]byte{0x01, 0x23, 0x45, 0x67, 0x89, 0xab, 0xcd, 0xef},
56		[]byte{0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00},
57		[]byte{0xd5, 0xd4, 0x4f, 0xf7, 0x20, 0x68, 0x3d, 0x0d}},
58	{
59		[]byte{0x01, 0x23, 0x45, 0x67, 0x89, 0xab, 0xcd, 0xef},
60		[]byte{0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff},
61		[]byte{0x59, 0x73, 0x23, 0x56, 0xf3, 0x6f, 0xde, 0x06}},
62	{
63		[]byte{0x01, 0x23, 0x45, 0x67, 0x89, 0xab, 0xcd, 0xef},
64		[]byte{0x01, 0x23, 0x45, 0x67, 0x89, 0xab, 0xcd, 0xef},
65		[]byte{0x56, 0xcc, 0x09, 0xe7, 0xcf, 0xdc, 0x4c, 0xef}},
66	{
67		[]byte{0x01, 0x23, 0x45, 0x67, 0x89, 0xab, 0xcd, 0xef},
68		[]byte{0xfe, 0xdc, 0xba, 0x98, 0x76, 0x54, 0x32, 0x10},
69		[]byte{0x12, 0xc6, 0x26, 0xaf, 0x05, 0x8b, 0x43, 0x3b}},
70	{
71		[]byte{0xfe, 0xdc, 0xba, 0x98, 0x76, 0x54, 0x32, 0x10},
72		[]byte{0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00},
73		[]byte{0xa6, 0x8c, 0xdc, 0xa9, 0x0c, 0x90, 0x21, 0xf9}},
74	{
75		[]byte{0xfe, 0xdc, 0xba, 0x98, 0x76, 0x54, 0x32, 0x10},
76		[]byte{0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff},
77		[]byte{0x2a, 0x2b, 0xb0, 0x08, 0xdf, 0x97, 0xc2, 0xf2}},
78	{
79		[]byte{0xfe, 0xdc, 0xba, 0x98, 0x76, 0x54, 0x32, 0x10},
80		[]byte{0x01, 0x23, 0x45, 0x67, 0x89, 0xab, 0xcd, 0xef},
81		[]byte{0xed, 0x39, 0xd9, 0x50, 0xfa, 0x74, 0xbc, 0xc4}},
82	{
83		[]byte{0xfe, 0xdc, 0xba, 0x98, 0x76, 0x54, 0x32, 0x10},
84		[]byte{0xfe, 0xdc, 0xba, 0x98, 0x76, 0x54, 0x32, 0x10},
85		[]byte{0xa9, 0x33, 0xf6, 0x18, 0x30, 0x23, 0xb3, 0x10}},
86	{
87		[]byte{0x01, 0x23, 0x45, 0x67, 0x89, 0xab, 0xcd, 0xef},
88		[]byte{0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11},
89		[]byte{0x17, 0x66, 0x8d, 0xfc, 0x72, 0x92, 0x53, 0x2d}},
90	{
91		[]byte{0x01, 0x23, 0x45, 0x67, 0x89, 0xab, 0xcd, 0xef},
92		[]byte{0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01},
93		[]byte{0xb4, 0xfd, 0x23, 0x16, 0x47, 0xa5, 0xbe, 0xc0}},
94	{
95		[]byte{0x0e, 0x32, 0x92, 0x32, 0xea, 0x6d, 0x0d, 0x73},
96		[]byte{0x87, 0x87, 0x87, 0x87, 0x87, 0x87, 0x87, 0x87},
97		[]byte{0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}},
98	{
99		[]byte{0x73, 0x65, 0x63, 0x52, 0x33, 0x74, 0x24, 0x3b}, // "secR3t$;"
100		[]byte{0x61, 0x20, 0x74, 0x65, 0x73, 0x74, 0x31, 0x32}, // "a test12"
101		[]byte{0x37, 0x0d, 0xee, 0x2c, 0x1f, 0xb4, 0xf7, 0xa5}},
102	{
103		[]byte{0x61, 0x62, 0x63, 0x64, 0x65, 0x66, 0x67, 0x68}, // "abcdefgh"
104		[]byte{0x61, 0x62, 0x63, 0x64, 0x65, 0x66, 0x67, 0x68}, // "abcdefgh"
105		[]byte{0x2a, 0x8d, 0x69, 0xde, 0x9d, 0x5f, 0xdf, 0xf9}},
106	{
107		[]byte{0x61, 0x62, 0x63, 0x64, 0x65, 0x66, 0x67, 0x68}, // "abcdefgh"
108		[]byte{0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37, 0x38}, // "12345678"
109		[]byte{0x21, 0xc6, 0x0d, 0xa5, 0x34, 0x24, 0x8b, 0xce}},
110	{
111		[]byte{0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37, 0x38}, // "12345678"
112		[]byte{0x61, 0x62, 0x63, 0x64, 0x65, 0x66, 0x67, 0x68}, // "abcdefgh"
113		[]byte{0x94, 0xd4, 0x43, 0x6b, 0xc3, 0xb5, 0xb6, 0x93}},
114	{
115		[]byte{0x1f, 0x79, 0x90, 0x5f, 0x88, 0x01, 0xc8, 0x88}, // random
116		[]byte{0xc7, 0x46, 0x18, 0x73, 0xaf, 0x48, 0x5f, 0xb3}, // random
117		[]byte{0xb0, 0x93, 0x50, 0x88, 0xf9, 0x92, 0x44, 0x6a}},
118	{
119		[]byte{0xe6, 0xf4, 0xf2, 0xdb, 0x31, 0x42, 0x53, 0x01}, // random
120		[]byte{0xff, 0x3d, 0x25, 0x50, 0x12, 0xe3, 0x4a, 0xc5}, // random
121		[]byte{0x86, 0x08, 0xd3, 0xd1, 0x6c, 0x2f, 0xd2, 0x55}},
122	{
123		[]byte{0x69, 0xc1, 0x9d, 0xc1, 0x15, 0xc5, 0xfb, 0x2b}, // random
124		[]byte{0x1a, 0x22, 0x5c, 0xaf, 0x1f, 0x1d, 0xa3, 0xf9}, // random
125		[]byte{0x64, 0xba, 0x31, 0x67, 0x56, 0x91, 0x1e, 0xa7}},
126	{
127		[]byte{0x6e, 0x5e, 0xe2, 0x47, 0xc4, 0xbf, 0xf6, 0x51}, // random
128		[]byte{0x11, 0xc9, 0x57, 0xff, 0x66, 0x89, 0x0e, 0xf0}, // random
129		[]byte{0x94, 0xc5, 0x35, 0xb2, 0xc5, 0x8b, 0x39, 0x72}},
130}
131
132var weakKeyTests = []CryptTest{
133	{
134		[]byte{0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01},
135		[]byte{0x55, 0x74, 0xc0, 0xbd, 0x7c, 0xdf, 0xf7, 0x39}, // random
136		nil},
137	{
138		[]byte{0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe},
139		[]byte{0xe8, 0xe1, 0xa7, 0xc1, 0xde, 0x11, 0x89, 0xaa}, // random
140		nil},
141	{
142		[]byte{0xe0, 0xe0, 0xe0, 0xe0, 0xf1, 0xf1, 0xf1, 0xf1},
143		[]byte{0x50, 0x6a, 0x4b, 0x94, 0x3b, 0xed, 0x7d, 0xdc}, // random
144		nil},
145	{
146		[]byte{0x1f, 0x1f, 0x1f, 0x1f, 0x0e, 0x0e, 0x0e, 0x0e},
147		[]byte{0x88, 0x81, 0x56, 0x38, 0xec, 0x3b, 0x1c, 0x97}, // random
148		nil},
149	{
150		[]byte{0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00},
151		[]byte{0x17, 0xa0, 0x83, 0x62, 0x32, 0xfe, 0x9a, 0x0b}, // random
152		nil},
153	{
154		[]byte{0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff},
155		[]byte{0xca, 0x8f, 0xca, 0x1f, 0x50, 0xc5, 0x7b, 0x49}, // random
156		nil},
157	{
158		[]byte{0xe1, 0xe1, 0xe1, 0xe1, 0xf0, 0xf0, 0xf0, 0xf0},
159		[]byte{0xb1, 0xea, 0xad, 0x7d, 0xe7, 0xc3, 0x7a, 0x43}, // random
160		nil},
161	{
162		[]byte{0x1e, 0x1e, 0x1e, 0x1e, 0x0f, 0x0f, 0x0f, 0x0f},
163		[]byte{0xae, 0x74, 0x7d, 0x6f, 0xef, 0x16, 0xbb, 0x81}, // random
164		nil},
165}
166
167var semiWeakKeyTests = []CryptTest{
168	// key and out contain the semi-weak key pair
169	{
170		[]byte{0x01, 0x1f, 0x01, 0x1f, 0x01, 0x0e, 0x01, 0x0e},
171		[]byte{0x12, 0xfa, 0x31, 0x16, 0xf9, 0xc5, 0x0a, 0xe4}, // random
172		[]byte{0x1f, 0x01, 0x1f, 0x01, 0x0e, 0x01, 0x0e, 0x01}},
173	{
174		[]byte{0x01, 0xe0, 0x01, 0xe0, 0x01, 0xf1, 0x01, 0xf1},
175		[]byte{0xb0, 0x4c, 0x7a, 0xee, 0xd2, 0xe5, 0x4d, 0xb7}, // random
176		[]byte{0xe0, 0x01, 0xe0, 0x01, 0xf1, 0x01, 0xf1, 0x01}},
177	{
178		[]byte{0x01, 0xfe, 0x01, 0xfe, 0x01, 0xfe, 0x01, 0xfe},
179		[]byte{0xa4, 0x81, 0xcd, 0xb1, 0x64, 0x6f, 0xd3, 0xbc}, // random
180		[]byte{0xfe, 0x01, 0xfe, 0x01, 0xfe, 0x01, 0xfe, 0x01}},
181	{
182		[]byte{0x1f, 0xe0, 0x1f, 0xe0, 0x0e, 0xf1, 0x0e, 0xf1},
183		[]byte{0xee, 0x27, 0xdd, 0x88, 0x4c, 0x22, 0xcd, 0xce}, // random
184		[]byte{0xe0, 0x1f, 0xe0, 0x1f, 0xf1, 0x0e, 0xf1, 0x0e}},
185	{
186		[]byte{0x1f, 0xfe, 0x1f, 0xfe, 0x0e, 0xfe, 0x0e, 0xfe},
187		[]byte{0x19, 0x3d, 0xcf, 0x97, 0x70, 0xfb, 0xab, 0xe1}, // random
188		[]byte{0xfe, 0x1f, 0xfe, 0x1f, 0xfe, 0x0e, 0xfe, 0x0e}},
189	{
190		[]byte{0xe0, 0xfe, 0xe0, 0xfe, 0xf1, 0xfe, 0xf1, 0xfe},
191		[]byte{0x7c, 0x82, 0x69, 0xe4, 0x1e, 0x86, 0x99, 0xd7}, // random
192		[]byte{0xfe, 0xe0, 0xfe, 0xe0, 0xfe, 0xf1, 0xfe, 0xf1}},
193}
194
195// some custom tests for TripleDES
196var encryptTripleDESTests = []CryptTest{
197	{
198		[]byte{
199			0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
200			0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
201			0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00},
202		[]byte{0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00},
203		[]byte{0x92, 0x95, 0xb5, 0x9b, 0xb3, 0x84, 0x73, 0x6e}},
204	{
205		[]byte{
206			0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
207			0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
208			0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00},
209		[]byte{0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff},
210		[]byte{0xc1, 0x97, 0xf5, 0x58, 0x74, 0x8a, 0x20, 0xe7}},
211	{
212		[]byte{
213			0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
214			0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
215			0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff},
216		[]byte{0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00},
217		[]byte{0x3e, 0x68, 0x0a, 0xa7, 0x8b, 0x75, 0xdf, 0x18}},
218	{
219		[]byte{
220			0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
221			0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
222			0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff},
223		[]byte{0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff},
224		[]byte{0x6d, 0x6a, 0x4a, 0x64, 0x4c, 0x7b, 0x8c, 0x91}},
225	{
226		[]byte{ // "abcdefgh12345678ABCDEFGH"
227			0x61, 0x62, 0x63, 0x64, 0x65, 0x66, 0x67, 0x68,
228			0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37, 0x38,
229			0x41, 0x42, 0x43, 0x44, 0x45, 0x46, 0x47, 0x48},
230		[]byte{0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30}, // "00000000"
231		[]byte{0xe4, 0x61, 0xb7, 0x59, 0x68, 0x8b, 0xff, 0x66}},
232	{
233		[]byte{ // "abcdefgh12345678ABCDEFGH"
234			0x61, 0x62, 0x63, 0x64, 0x65, 0x66, 0x67, 0x68,
235			0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37, 0x38,
236			0x41, 0x42, 0x43, 0x44, 0x45, 0x46, 0x47, 0x48},
237		[]byte{0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37, 0x38}, // "12345678"
238		[]byte{0xdb, 0xd0, 0x92, 0xde, 0xf8, 0x34, 0xff, 0x58}},
239	{
240		[]byte{ // "abcdefgh12345678ABCDEFGH"
241			0x61, 0x62, 0x63, 0x64, 0x65, 0x66, 0x67, 0x68,
242			0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37, 0x38,
243			0x41, 0x42, 0x43, 0x44, 0x45, 0x46, 0x47, 0x48},
244		[]byte{0xf0, 0xc5, 0x82, 0x22, 0xd3, 0xe6, 0x12, 0xd2}, // random
245		[]byte{0xba, 0xe4, 0x41, 0xb1, 0x3c, 0x37, 0x4d, 0xf4}},
246	{
247		[]byte{ // random
248			0xd3, 0x7d, 0x45, 0xee, 0x22, 0xe9, 0xcf, 0x52,
249			0xf4, 0x65, 0xa2, 0x4f, 0x70, 0xd1, 0x81, 0x8a,
250			0x3d, 0xbe, 0x2f, 0x39, 0xc7, 0x71, 0xd2, 0xe9},
251		[]byte{0x49, 0x53, 0xc3, 0xe9, 0x78, 0xdf, 0x9f, 0xaf}, // random
252		[]byte{0x53, 0x40, 0x51, 0x24, 0xd8, 0x3c, 0xf9, 0x88}},
253	{
254		[]byte{ // random
255			0xcb, 0x10, 0x7d, 0xda, 0x7e, 0x96, 0x57, 0x0a,
256			0xe8, 0xeb, 0xe8, 0x07, 0x8e, 0x87, 0xd3, 0x57,
257			0xb2, 0x61, 0x12, 0xb8, 0x2a, 0x90, 0xb7, 0x2f},
258		[]byte{0xa3, 0xc2, 0x60, 0xb1, 0x0b, 0xb7, 0x28, 0x6e}, // random
259		[]byte{0x56, 0x73, 0x7d, 0xfb, 0xb5, 0xa1, 0xc3, 0xde}},
260}
261
262// NIST Special Publication 800-20, Appendix A
263// Key for use with Table A.1 tests
264var tableA1Key = []byte{
265	0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01,
266	0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01,
267	0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01,
268}
269
270// Table A.1 Resulting Ciphertext from the Variable Plaintext Known Answer Test
271var tableA1Tests = []CryptTest{
272	{nil, // 0
273		[]byte{0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00},
274		[]byte{0x95, 0xf8, 0xa5, 0xe5, 0xdd, 0x31, 0xd9, 0x00}},
275	{nil, // 1
276		[]byte{0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00},
277		[]byte{0xdd, 0x7f, 0x12, 0x1c, 0xa5, 0x01, 0x56, 0x19}},
278	{nil, // 2
279		[]byte{0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00},
280		[]byte{0x2e, 0x86, 0x53, 0x10, 0x4f, 0x38, 0x34, 0xea}},
281	{nil, // 3
282		[]byte{0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00},
283		[]byte{0x4b, 0xd3, 0x88, 0xff, 0x6c, 0xd8, 0x1d, 0x4f}},
284	{nil, // 4
285		[]byte{0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00},
286		[]byte{0x20, 0xb9, 0xe7, 0x67, 0xb2, 0xfb, 0x14, 0x56}},
287	{nil, // 5
288		[]byte{0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00},
289		[]byte{0x55, 0x57, 0x93, 0x80, 0xd7, 0x71, 0x38, 0xef}},
290	{nil, // 6
291		[]byte{0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00},
292		[]byte{0x6c, 0xc5, 0xde, 0xfa, 0xaf, 0x04, 0x51, 0x2f}},
293	{nil, // 7
294		[]byte{0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00},
295		[]byte{0x0d, 0x9f, 0x27, 0x9b, 0xa5, 0xd8, 0x72, 0x60}},
296	{nil, // 8
297		[]byte{0x00, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00},
298		[]byte{0xd9, 0x03, 0x1b, 0x02, 0x71, 0xbd, 0x5a, 0x0a}},
299	{nil, // 9
300		[]byte{0x00, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00},
301		[]byte{0x42, 0x42, 0x50, 0xb3, 0x7c, 0x3d, 0xd9, 0x51}},
302	{nil, // 10
303		[]byte{0x00, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00},
304		[]byte{0xb8, 0x06, 0x1b, 0x7e, 0xcd, 0x9a, 0x21, 0xe5}},
305	{nil, // 11
306		[]byte{0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00},
307		[]byte{0xf1, 0x5d, 0x0f, 0x28, 0x6b, 0x65, 0xbd, 0x28}},
308	{nil, // 12
309		[]byte{0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00},
310		[]byte{0xad, 0xd0, 0xcc, 0x8d, 0x6e, 0x5d, 0xeb, 0xa1}},
311	{nil, // 13
312		[]byte{0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00},
313		[]byte{0xe6, 0xd5, 0xf8, 0x27, 0x52, 0xad, 0x63, 0xd1}},
314	{nil, // 14
315		[]byte{0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00},
316		[]byte{0xec, 0xbf, 0xe3, 0xbd, 0x3f, 0x59, 0x1a, 0x5e}},
317	{nil, // 15
318		[]byte{0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00},
319		[]byte{0xf3, 0x56, 0x83, 0x43, 0x79, 0xd1, 0x65, 0xcd}},
320	{nil, // 16
321		[]byte{0x00, 0x00, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00},
322		[]byte{0x2b, 0x9f, 0x98, 0x2f, 0x20, 0x03, 0x7f, 0xa9}},
323	{nil, // 17
324		[]byte{0x00, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00},
325		[]byte{0x88, 0x9d, 0xe0, 0x68, 0xa1, 0x6f, 0x0b, 0xe6}},
326	{nil, // 18
327		[]byte{0x00, 0x00, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00},
328		[]byte{0xe1, 0x9e, 0x27, 0x5d, 0x84, 0x6a, 0x12, 0x98}},
329	{nil, // 19
330		[]byte{0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00},
331		[]byte{0x32, 0x9a, 0x8e, 0xd5, 0x23, 0xd7, 0x1a, 0xec}},
332	{nil, // 20
333		[]byte{0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00},
334		[]byte{0xe7, 0xfc, 0xe2, 0x25, 0x57, 0xd2, 0x3c, 0x97}},
335	{nil, // 21
336		[]byte{0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00},
337		[]byte{0x12, 0xa9, 0xf5, 0x81, 0x7f, 0xf2, 0xd6, 0x5d}},
338	{nil, // 22
339		[]byte{0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00},
340		[]byte{0xa4, 0x84, 0xc3, 0xad, 0x38, 0xdc, 0x9c, 0x19}},
341	{nil, // 23
342		[]byte{0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00},
343		[]byte{0xfb, 0xe0, 0x0a, 0x8a, 0x1e, 0xf8, 0xad, 0x72}},
344	{nil, // 24
345		[]byte{0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, 0x00},
346		[]byte{0x75, 0x0d, 0x07, 0x94, 0x07, 0x52, 0x13, 0x63}},
347	{nil, // 25
348		[]byte{0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00},
349		[]byte{0x64, 0xfe, 0xed, 0x9c, 0x72, 0x4c, 0x2f, 0xaf}},
350	{nil, // 26
351		[]byte{0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, 0x00},
352		[]byte{0xf0, 0x2b, 0x26, 0x3b, 0x32, 0x8e, 0x2b, 0x60}},
353	{nil, // 27
354		[]byte{0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00},
355		[]byte{0x9d, 0x64, 0x55, 0x5a, 0x9a, 0x10, 0xb8, 0x52}},
356	{nil, // 28
357		[]byte{0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00},
358		[]byte{0xd1, 0x06, 0xff, 0x0b, 0xed, 0x52, 0x55, 0xd7}},
359	{nil, // 29
360		[]byte{0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00},
361		[]byte{0xe1, 0x65, 0x2c, 0x6b, 0x13, 0x8c, 0x64, 0xa5}},
362	{nil, // 30
363		[]byte{0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00},
364		[]byte{0xe4, 0x28, 0x58, 0x11, 0x86, 0xec, 0x8f, 0x46}},
365	{nil, // 31
366		[]byte{0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00},
367		[]byte{0xae, 0xb5, 0xf5, 0xed, 0xe2, 0x2d, 0x1a, 0x36}},
368	{nil, // 32
369		[]byte{0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00},
370		[]byte{0xe9, 0x43, 0xd7, 0x56, 0x8a, 0xec, 0x0c, 0x5c}},
371	{nil, // 33
372		[]byte{0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00},
373		[]byte{0xdf, 0x98, 0xc8, 0x27, 0x6f, 0x54, 0xb0, 0x4b}},
374	{nil, // 34
375		[]byte{0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00},
376		[]byte{0xb1, 0x60, 0xe4, 0x68, 0x0f, 0x6c, 0x69, 0x6f}},
377	{nil, // 35
378		[]byte{0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00},
379		[]byte{0xfa, 0x07, 0x52, 0xb0, 0x7d, 0x9c, 0x4a, 0xb8}},
380	{nil, // 36
381		[]byte{0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00},
382		[]byte{0xca, 0x3a, 0x2b, 0x03, 0x6d, 0xbc, 0x85, 0x02}},
383	{nil, // 37
384		[]byte{0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00},
385		[]byte{0x5e, 0x09, 0x05, 0x51, 0x7b, 0xb5, 0x9b, 0xcf}},
386	{nil, // 38
387		[]byte{0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00},
388		[]byte{0x81, 0x4e, 0xeb, 0x3b, 0x91, 0xd9, 0x07, 0x26}},
389	{nil, // 39
390		[]byte{0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00},
391		[]byte{0x4d, 0x49, 0xdb, 0x15, 0x32, 0x91, 0x9c, 0x9f}},
392	{nil, // 40
393		[]byte{0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00},
394		[]byte{0x25, 0xeb, 0x5f, 0xc3, 0xf8, 0xcf, 0x06, 0x21}},
395	{nil, // 41
396		[]byte{0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00},
397		[]byte{0xab, 0x6a, 0x20, 0xc0, 0x62, 0x0d, 0x1c, 0x6f}},
398	{nil, // 42
399		[]byte{0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00},
400		[]byte{0x79, 0xe9, 0x0d, 0xbc, 0x98, 0xf9, 0x2c, 0xca}},
401	{nil, // 43
402		[]byte{0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00},
403		[]byte{0x86, 0x6e, 0xce, 0xdd, 0x80, 0x72, 0xbb, 0x0e}},
404	{nil, // 44
405		[]byte{0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00},
406		[]byte{0x8b, 0x54, 0x53, 0x6f, 0x2f, 0x3e, 0x64, 0xa8}},
407	{nil, // 45
408		[]byte{0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00},
409		[]byte{0xea, 0x51, 0xd3, 0x97, 0x55, 0x95, 0xb8, 0x6b}},
410	{nil, // 46
411		[]byte{0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00},
412		[]byte{0xca, 0xff, 0xc6, 0xac, 0x45, 0x42, 0xde, 0x31}},
413	{nil, // 47
414		[]byte{0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00},
415		[]byte{0x8d, 0xd4, 0x5a, 0x2d, 0xdf, 0x90, 0x79, 0x6c}},
416	{nil, // 48
417		[]byte{0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x00},
418		[]byte{0x10, 0x29, 0xd5, 0x5e, 0x88, 0x0e, 0xc2, 0xd0}},
419	{nil, // 49
420		[]byte{0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x00},
421		[]byte{0x5d, 0x86, 0xcb, 0x23, 0x63, 0x9d, 0xbe, 0xa9}},
422	{nil, // 50
423		[]byte{0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x00},
424		[]byte{0x1d, 0x1c, 0xa8, 0x53, 0xae, 0x7c, 0x0c, 0x5f}},
425	{nil, // 51
426		[]byte{0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00},
427		[]byte{0xce, 0x33, 0x23, 0x29, 0x24, 0x8f, 0x32, 0x28}},
428	{nil, // 52
429		[]byte{0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x00},
430		[]byte{0x84, 0x05, 0xd1, 0xab, 0xe2, 0x4f, 0xb9, 0x42}},
431	{nil, // 53
432		[]byte{0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00},
433		[]byte{0xe6, 0x43, 0xd7, 0x80, 0x90, 0xca, 0x42, 0x07}},
434	{nil, // 54
435		[]byte{0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00},
436		[]byte{0x48, 0x22, 0x1b, 0x99, 0x37, 0x74, 0x8a, 0x23}},
437	{nil, // 55
438		[]byte{0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00},
439		[]byte{0xdd, 0x7c, 0x0b, 0xbd, 0x61, 0xfa, 0xfd, 0x54}},
440	{nil, // 56
441		[]byte{0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80},
442		[]byte{0x2f, 0xbc, 0x29, 0x1a, 0x57, 0x0d, 0xb5, 0xc4}},
443	{nil, // 57
444		[]byte{0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40},
445		[]byte{0xe0, 0x7c, 0x30, 0xd7, 0xe4, 0xe2, 0x6e, 0x12}},
446	{nil, // 58
447		[]byte{0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20},
448		[]byte{0x09, 0x53, 0xe2, 0x25, 0x8e, 0x8e, 0x90, 0xa1}},
449	{nil, // 59
450		[]byte{0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10},
451		[]byte{0x5b, 0x71, 0x1b, 0xc4, 0xce, 0xeb, 0xf2, 0xee}},
452	{nil, // 60
453		[]byte{0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08},
454		[]byte{0xcc, 0x08, 0x3f, 0x1e, 0x6d, 0x9e, 0x85, 0xf6}},
455	{nil, // 61
456		[]byte{0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04},
457		[]byte{0xd2, 0xfd, 0x88, 0x67, 0xd5, 0x0d, 0x2d, 0xfe}},
458	{nil, // 62
459		[]byte{0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02},
460		[]byte{0x06, 0xe7, 0xea, 0x22, 0xce, 0x92, 0x70, 0x8f}},
461	{nil, // 63
462		[]byte{0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01},
463		[]byte{0x16, 0x6b, 0x40, 0xb4, 0x4a, 0xba, 0x4b, 0xd6}},
464}
465
466// Plaintext for use with Table A.2 tests
467var tableA2Plaintext = []byte{0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}
468
469// Table A.2 Resulting Ciphertext from the Variable Key Known Answer Test
470var tableA2Tests = []CryptTest{
471	{ // 0
472		[]byte{
473			0x80, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01,
474			0x80, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01,
475			0x80, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01},
476		nil,
477		[]byte{0x95, 0xa8, 0xd7, 0x28, 0x13, 0xda, 0xa9, 0x4d}},
478	{ // 1
479		[]byte{
480			0x40, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01,
481			0x40, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01,
482			0x40, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01},
483		nil,
484		[]byte{0x0e, 0xec, 0x14, 0x87, 0xdd, 0x8c, 0x26, 0xd5}},
485	{ // 2
486		[]byte{
487			0x20, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01,
488			0x20, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01,
489			0x20, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01},
490		nil,
491		[]byte{0x7a, 0xd1, 0x6f, 0xfb, 0x79, 0xc4, 0x59, 0x26}},
492	{ // 3
493		[]byte{
494			0x10, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01,
495			0x10, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01,
496			0x10, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01},
497		nil,
498		[]byte{0xd3, 0x74, 0x62, 0x94, 0xca, 0x6a, 0x6c, 0xf3}},
499	{ // 4
500		[]byte{
501			0x08, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01,
502			0x08, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01,
503			0x08, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01},
504		nil,
505		[]byte{0x80, 0x9f, 0x5f, 0x87, 0x3c, 0x1f, 0xd7, 0x61}},
506	{ // 5
507		[]byte{
508			0x04, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01,
509			0x04, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01,
510			0x04, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01},
511		nil,
512		[]byte{0xc0, 0x2f, 0xaf, 0xfe, 0xc9, 0x89, 0xd1, 0xfc}},
513	{ // 6
514		[]byte{
515			0x02, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01,
516			0x02, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01,
517			0x02, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01},
518		nil,
519		[]byte{0x46, 0x15, 0xaa, 0x1d, 0x33, 0xe7, 0x2f, 0x10}},
520	{ // 7
521		[]byte{
522			0x01, 0x80, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01,
523			0x01, 0x80, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01,
524			0x01, 0x80, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01},
525		nil,
526		[]byte{0x20, 0x55, 0x12, 0x33, 0x50, 0xc0, 0x08, 0x58}},
527	{ // 8
528		[]byte{
529			0x01, 0x40, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01,
530			0x01, 0x40, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01,
531			0x01, 0x40, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01},
532		nil,
533		[]byte{0xdf, 0x3b, 0x99, 0xd6, 0x57, 0x73, 0x97, 0xc8}},
534	{ // 9
535		[]byte{
536			0x01, 0x20, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01,
537			0x01, 0x20, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01,
538			0x01, 0x20, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01},
539		nil,
540		[]byte{0x31, 0xfe, 0x17, 0x36, 0x9b, 0x52, 0x88, 0xc9}},
541	{ // 10
542		[]byte{
543			0x01, 0x10, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01,
544			0x01, 0x10, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01,
545			0x01, 0x10, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01},
546		nil,
547		[]byte{0xdf, 0xdd, 0x3c, 0xc6, 0x4d, 0xae, 0x16, 0x42}},
548	{ // 11
549		[]byte{
550			0x01, 0x08, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01,
551			0x01, 0x08, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01,
552			0x01, 0x08, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01},
553		nil,
554		[]byte{0x17, 0x8c, 0x83, 0xce, 0x2b, 0x39, 0x9d, 0x94}},
555	{ // 12
556		[]byte{
557			0x01, 0x04, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01,
558			0x01, 0x04, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01,
559			0x01, 0x04, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01},
560		nil,
561		[]byte{0x50, 0xf6, 0x36, 0x32, 0x4a, 0x9b, 0x7f, 0x80}},
562	{ // 13
563		[]byte{
564			0x01, 0x02, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01,
565			0x01, 0x02, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01,
566			0x01, 0x02, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01},
567		nil,
568		[]byte{0xa8, 0x46, 0x8e, 0xe3, 0xbc, 0x18, 0xf0, 0x6d}},
569	{ // 14
570		[]byte{
571			0x01, 0x01, 0x80, 0x01, 0x01, 0x01, 0x01, 0x01,
572			0x01, 0x01, 0x80, 0x01, 0x01, 0x01, 0x01, 0x01,
573			0x01, 0x01, 0x80, 0x01, 0x01, 0x01, 0x01, 0x01},
574		nil,
575		[]byte{0xa2, 0xdc, 0x9e, 0x92, 0xfd, 0x3c, 0xde, 0x92}},
576	{ // 15
577		[]byte{
578			0x01, 0x01, 0x40, 0x01, 0x01, 0x01, 0x01, 0x01,
579			0x01, 0x01, 0x40, 0x01, 0x01, 0x01, 0x01, 0x01,
580			0x01, 0x01, 0x40, 0x01, 0x01, 0x01, 0x01, 0x01},
581		nil,
582		[]byte{0xca, 0xc0, 0x9f, 0x79, 0x7d, 0x03, 0x12, 0x87}},
583	{ // 16
584		[]byte{
585			0x01, 0x01, 0x20, 0x01, 0x01, 0x01, 0x01, 0x01,
586			0x01, 0x01, 0x20, 0x01, 0x01, 0x01, 0x01, 0x01,
587			0x01, 0x01, 0x20, 0x01, 0x01, 0x01, 0x01, 0x01},
588		nil,
589		[]byte{0x90, 0xba, 0x68, 0x0b, 0x22, 0xae, 0xb5, 0x25}},
590	{ // 17
591		[]byte{
592			0x01, 0x01, 0x10, 0x01, 0x01, 0x01, 0x01, 0x01,
593			0x01, 0x01, 0x10, 0x01, 0x01, 0x01, 0x01, 0x01,
594			0x01, 0x01, 0x10, 0x01, 0x01, 0x01, 0x01, 0x01},
595		nil,
596		[]byte{0xce, 0x7a, 0x24, 0xf3, 0x50, 0xe2, 0x80, 0xb6}},
597	{ // 18
598		[]byte{
599			0x01, 0x01, 0x08, 0x01, 0x01, 0x01, 0x01, 0x01,
600			0x01, 0x01, 0x08, 0x01, 0x01, 0x01, 0x01, 0x01,
601			0x01, 0x01, 0x08, 0x01, 0x01, 0x01, 0x01, 0x01},
602		nil,
603		[]byte{0x88, 0x2b, 0xff, 0x0a, 0xa0, 0x1a, 0x0b, 0x87}},
604	{ // 19
605		[]byte{
606			0x01, 0x01, 0x04, 0x01, 0x01, 0x01, 0x01, 0x01,
607			0x01, 0x01, 0x04, 0x01, 0x01, 0x01, 0x01, 0x01,
608			0x01, 0x01, 0x04, 0x01, 0x01, 0x01, 0x01, 0x01},
609		nil,
610		[]byte{0x25, 0x61, 0x02, 0x88, 0x92, 0x45, 0x11, 0xc2}},
611	{ // 20
612		[]byte{
613			0x01, 0x01, 0x02, 0x01, 0x01, 0x01, 0x01, 0x01,
614			0x01, 0x01, 0x02, 0x01, 0x01, 0x01, 0x01, 0x01,
615			0x01, 0x01, 0x02, 0x01, 0x01, 0x01, 0x01, 0x01},
616		nil,
617		[]byte{0xc7, 0x15, 0x16, 0xc2, 0x9c, 0x75, 0xd1, 0x70}},
618	{ // 21
619		[]byte{
620			0x01, 0x01, 0x01, 0x80, 0x01, 0x01, 0x01, 0x01,
621			0x01, 0x01, 0x01, 0x80, 0x01, 0x01, 0x01, 0x01,
622			0x01, 0x01, 0x01, 0x80, 0x01, 0x01, 0x01, 0x01},
623		nil,
624		[]byte{0x51, 0x99, 0xc2, 0x9a, 0x52, 0xc9, 0xf0, 0x59}},
625	{ // 22
626		[]byte{
627			0x01, 0x01, 0x01, 0x40, 0x01, 0x01, 0x01, 0x01,
628			0x01, 0x01, 0x01, 0x40, 0x01, 0x01, 0x01, 0x01,
629			0x01, 0x01, 0x01, 0x40, 0x01, 0x01, 0x01, 0x01},
630		nil,
631		[]byte{0xc2, 0x2f, 0x0a, 0x29, 0x4a, 0x71, 0xf2, 0x9f}},
632	{ // 23
633		[]byte{
634			0x01, 0x01, 0x01, 0x20, 0x01, 0x01, 0x01, 0x01,
635			0x01, 0x01, 0x01, 0x20, 0x01, 0x01, 0x01, 0x01,
636			0x01, 0x01, 0x01, 0x20, 0x01, 0x01, 0x01, 0x01},
637		nil,
638		[]byte{0xee, 0x37, 0x14, 0x83, 0x71, 0x4c, 0x02, 0xea}},
639	{ // 24
640		[]byte{
641			0x01, 0x01, 0x01, 0x10, 0x01, 0x01, 0x01, 0x01,
642			0x01, 0x01, 0x01, 0x10, 0x01, 0x01, 0x01, 0x01,
643			0x01, 0x01, 0x01, 0x10, 0x01, 0x01, 0x01, 0x01},
644		nil,
645		[]byte{0xa8, 0x1f, 0xbd, 0x44, 0x8f, 0x9e, 0x52, 0x2f}},
646	{ // 25
647		[]byte{
648			0x01, 0x01, 0x01, 0x08, 0x01, 0x01, 0x01, 0x01,
649			0x01, 0x01, 0x01, 0x08, 0x01, 0x01, 0x01, 0x01,
650			0x01, 0x01, 0x01, 0x08, 0x01, 0x01, 0x01, 0x01},
651		nil,
652		[]byte{0x4f, 0x64, 0x4c, 0x92, 0xe1, 0x92, 0xdf, 0xed}},
653	{ // 26
654		[]byte{
655			0x01, 0x01, 0x01, 0x04, 0x01, 0x01, 0x01, 0x01,
656			0x01, 0x01, 0x01, 0x04, 0x01, 0x01, 0x01, 0x01,
657			0x01, 0x01, 0x01, 0x04, 0x01, 0x01, 0x01, 0x01},
658		nil,
659		[]byte{0x1a, 0xfa, 0x9a, 0x66, 0xa6, 0xdf, 0x92, 0xae}},
660	{ // 27
661		[]byte{
662			0x01, 0x01, 0x01, 0x02, 0x01, 0x01, 0x01, 0x01,
663			0x01, 0x01, 0x01, 0x02, 0x01, 0x01, 0x01, 0x01,
664			0x01, 0x01, 0x01, 0x02, 0x01, 0x01, 0x01, 0x01},
665		nil,
666		[]byte{0xb3, 0xc1, 0xcc, 0x71, 0x5c, 0xb8, 0x79, 0xd8}},
667	{ // 28
668		[]byte{
669			0x01, 0x01, 0x01, 0x01, 0x80, 0x01, 0x01, 0x01,
670			0x01, 0x01, 0x01, 0x01, 0x80, 0x01, 0x01, 0x01,
671			0x01, 0x01, 0x01, 0x01, 0x80, 0x01, 0x01, 0x01},
672		nil,
673		[]byte{0x19, 0xd0, 0x32, 0xe6, 0x4a, 0xb0, 0xbd, 0x8b}},
674	{ // 29
675		[]byte{
676			0x01, 0x01, 0x01, 0x01, 0x40, 0x01, 0x01, 0x01,
677			0x01, 0x01, 0x01, 0x01, 0x40, 0x01, 0x01, 0x01,
678			0x01, 0x01, 0x01, 0x01, 0x40, 0x01, 0x01, 0x01},
679		nil,
680		[]byte{0x3c, 0xfa, 0xa7, 0xa7, 0xdc, 0x87, 0x20, 0xdc}},
681	{ // 30
682		[]byte{
683			0x01, 0x01, 0x01, 0x01, 0x20, 0x01, 0x01, 0x01,
684			0x01, 0x01, 0x01, 0x01, 0x20, 0x01, 0x01, 0x01,
685			0x01, 0x01, 0x01, 0x01, 0x20, 0x01, 0x01, 0x01},
686		nil,
687		[]byte{0xb7, 0x26, 0x5f, 0x7f, 0x44, 0x7a, 0xc6, 0xf3}},
688	{ // 31
689		[]byte{
690			0x01, 0x01, 0x01, 0x01, 0x10, 0x01, 0x01, 0x01,
691			0x01, 0x01, 0x01, 0x01, 0x10, 0x01, 0x01, 0x01,
692			0x01, 0x01, 0x01, 0x01, 0x10, 0x01, 0x01, 0x01},
693		nil,
694		[]byte{0x9d, 0xb7, 0x3b, 0x3c, 0x0d, 0x16, 0x3f, 0x54}},
695	{ // 32
696		[]byte{
697			0x01, 0x01, 0x01, 0x01, 0x08, 0x01, 0x01, 0x01,
698			0x01, 0x01, 0x01, 0x01, 0x08, 0x01, 0x01, 0x01,
699			0x01, 0x01, 0x01, 0x01, 0x08, 0x01, 0x01, 0x01},
700		nil,
701		[]byte{0x81, 0x81, 0xb6, 0x5b, 0xab, 0xf4, 0xa9, 0x75}},
702	{ // 33
703		[]byte{
704			0x01, 0x01, 0x01, 0x01, 0x04, 0x01, 0x01, 0x01,
705			0x01, 0x01, 0x01, 0x01, 0x04, 0x01, 0x01, 0x01,
706			0x01, 0x01, 0x01, 0x01, 0x04, 0x01, 0x01, 0x01},
707		nil,
708		[]byte{0x93, 0xc9, 0xb6, 0x40, 0x42, 0xea, 0xa2, 0x40}},
709	{ // 34
710		[]byte{
711			0x01, 0x01, 0x01, 0x01, 0x02, 0x01, 0x01, 0x01,
712			0x01, 0x01, 0x01, 0x01, 0x02, 0x01, 0x01, 0x01,
713			0x01, 0x01, 0x01, 0x01, 0x02, 0x01, 0x01, 0x01},
714		nil,
715		[]byte{0x55, 0x70, 0x53, 0x08, 0x29, 0x70, 0x55, 0x92}},
716	{ // 35
717		[]byte{
718			0x01, 0x01, 0x01, 0x01, 0x01, 0x80, 0x01, 0x01,
719			0x01, 0x01, 0x01, 0x01, 0x01, 0x80, 0x01, 0x01,
720			0x01, 0x01, 0x01, 0x01, 0x01, 0x80, 0x01, 0x01},
721		nil,
722		[]byte{0x86, 0x38, 0x80, 0x9e, 0x87, 0x87, 0x87, 0xa0}},
723	{ // 36
724		[]byte{
725			0x01, 0x01, 0x01, 0x01, 0x01, 0x40, 0x01, 0x01,
726			0x01, 0x01, 0x01, 0x01, 0x01, 0x40, 0x01, 0x01,
727			0x01, 0x01, 0x01, 0x01, 0x01, 0x40, 0x01, 0x01},
728		nil,
729		[]byte{0x41, 0xb9, 0xa7, 0x9a, 0xf7, 0x9a, 0xc2, 0x08}},
730	{ // 37
731		[]byte{
732			0x01, 0x01, 0x01, 0x01, 0x01, 0x20, 0x01, 0x01,
733			0x01, 0x01, 0x01, 0x01, 0x01, 0x20, 0x01, 0x01,
734			0x01, 0x01, 0x01, 0x01, 0x01, 0x20, 0x01, 0x01},
735		nil,
736		[]byte{0x7a, 0x9b, 0xe4, 0x2f, 0x20, 0x09, 0xa8, 0x92}},
737	{ // 38
738		[]byte{
739			0x01, 0x01, 0x01, 0x01, 0x01, 0x10, 0x01, 0x01,
740			0x01, 0x01, 0x01, 0x01, 0x01, 0x10, 0x01, 0x01,
741			0x01, 0x01, 0x01, 0x01, 0x01, 0x10, 0x01, 0x01},
742		nil,
743		[]byte{0x29, 0x03, 0x8d, 0x56, 0xba, 0x6d, 0x27, 0x45}},
744	{ // 39
745		[]byte{
746			0x01, 0x01, 0x01, 0x01, 0x01, 0x08, 0x01, 0x01,
747			0x01, 0x01, 0x01, 0x01, 0x01, 0x08, 0x01, 0x01,
748			0x01, 0x01, 0x01, 0x01, 0x01, 0x08, 0x01, 0x01},
749		nil,
750		[]byte{0x54, 0x95, 0xc6, 0xab, 0xf1, 0xe5, 0xdf, 0x51}},
751	{ // 40
752		[]byte{
753			0x01, 0x01, 0x01, 0x01, 0x01, 0x04, 0x01, 0x01,
754			0x01, 0x01, 0x01, 0x01, 0x01, 0x04, 0x01, 0x01,
755			0x01, 0x01, 0x01, 0x01, 0x01, 0x04, 0x01, 0x01},
756		nil,
757		[]byte{0xae, 0x13, 0xdb, 0xd5, 0x61, 0x48, 0x89, 0x33}},
758	{ // 41
759		[]byte{
760			0x01, 0x01, 0x01, 0x01, 0x01, 0x02, 0x01, 0x01,
761			0x01, 0x01, 0x01, 0x01, 0x01, 0x02, 0x01, 0x01,
762			0x01, 0x01, 0x01, 0x01, 0x01, 0x02, 0x01, 0x01},
763		nil,
764		[]byte{0x02, 0x4d, 0x1f, 0xfa, 0x89, 0x04, 0xe3, 0x89}},
765	{ // 42
766		[]byte{
767			0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x80, 0x01,
768			0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x80, 0x01,
769			0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x80, 0x01},
770		nil,
771		[]byte{0xd1, 0x39, 0x97, 0x12, 0xf9, 0x9b, 0xf0, 0x2e}},
772	{ // 43
773		[]byte{
774			0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x40, 0x01,
775			0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x40, 0x01,
776			0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x40, 0x01},
777		nil,
778		[]byte{0x14, 0xc1, 0xd7, 0xc1, 0xcf, 0xfe, 0xc7, 0x9e}},
779	{ // 44
780		[]byte{
781			0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x20, 0x01,
782			0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x20, 0x01,
783			0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x20, 0x01},
784		nil,
785		[]byte{0x1d, 0xe5, 0x27, 0x9d, 0xae, 0x3b, 0xed, 0x6f}},
786	{ // 45
787		[]byte{
788			0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x10, 0x01,
789			0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x10, 0x01,
790			0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x10, 0x01},
791		nil,
792		[]byte{0xe9, 0x41, 0xa3, 0x3f, 0x85, 0x50, 0x13, 0x03}},
793	{ // 46
794		[]byte{
795			0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x08, 0x01,
796			0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x08, 0x01,
797			0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x08, 0x01},
798		nil,
799		[]byte{0xda, 0x99, 0xdb, 0xbc, 0x9a, 0x03, 0xf3, 0x79}},
800	{ // 47
801		[]byte{
802			0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x04, 0x01,
803			0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x04, 0x01,
804			0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x04, 0x01},
805		nil,
806		[]byte{0xb7, 0xfc, 0x92, 0xf9, 0x1d, 0x8e, 0x92, 0xe9}},
807	{ // 48
808		[]byte{
809			0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x02, 0x01,
810			0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x02, 0x01,
811			0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x02, 0x01},
812		nil,
813		[]byte{0xae, 0x8e, 0x5c, 0xaa, 0x3c, 0xa0, 0x4e, 0x85}},
814	{ // 49
815		[]byte{
816			0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x80,
817			0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x80,
818			0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x80},
819		nil,
820		[]byte{0x9c, 0xc6, 0x2d, 0xf4, 0x3b, 0x6e, 0xed, 0x74}},
821	{ // 50
822		[]byte{
823			0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x40,
824			0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x40,
825			0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x40},
826		nil,
827		[]byte{0xd8, 0x63, 0xdb, 0xb5, 0xc5, 0x9a, 0x91, 0xa0}},
828	{ // 50
829		[]byte{
830			0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x20,
831			0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x20,
832			0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x20},
833		nil,
834		[]byte{0xa1, 0xab, 0x21, 0x90, 0x54, 0x5b, 0x91, 0xd7}},
835	{ // 52
836		[]byte{
837			0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x10,
838			0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x10,
839			0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x10},
840		nil,
841		[]byte{0x08, 0x75, 0x04, 0x1e, 0x64, 0xc5, 0x70, 0xf7}},
842	{ // 53
843		[]byte{
844			0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x08,
845			0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x08,
846			0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x08},
847		nil,
848		[]byte{0x5a, 0x59, 0x45, 0x28, 0xbe, 0xbe, 0xf1, 0xcc}},
849	{ // 54
850		[]byte{
851			0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x04,
852			0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x04,
853			0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x04},
854		nil,
855		[]byte{0xfc, 0xdb, 0x32, 0x91, 0xde, 0x21, 0xf0, 0xc0}},
856	{ // 55
857		[]byte{
858			0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x02,
859			0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x02,
860			0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x02},
861		nil,
862		[]byte{0x86, 0x9e, 0xfd, 0x7f, 0x9f, 0x26, 0x5a, 0x09}},
863}
864
865// Plaintext for use with Table A.3 tests
866var tableA3Plaintext = []byte{0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}
867
868// Table A.3 Values To Be Used for the Permutation Operation Known Answer Test
869var tableA3Tests = []CryptTest{
870	{ // 0
871		[]byte{
872			0x10, 0x46, 0x91, 0x34, 0x89, 0x98, 0x01, 0x31,
873			0x10, 0x46, 0x91, 0x34, 0x89, 0x98, 0x01, 0x31,
874			0x10, 0x46, 0x91, 0x34, 0x89, 0x98, 0x01, 0x31,
875		},
876		nil,
877		[]byte{0x88, 0xd5, 0x5e, 0x54, 0xf5, 0x4c, 0x97, 0xb4}},
878	{ // 1
879		[]byte{
880			0x10, 0x07, 0x10, 0x34, 0x89, 0x98, 0x80, 0x20,
881			0x10, 0x07, 0x10, 0x34, 0x89, 0x98, 0x80, 0x20,
882			0x10, 0x07, 0x10, 0x34, 0x89, 0x98, 0x80, 0x20,
883		},
884		nil,
885		[]byte{0x0c, 0x0c, 0xc0, 0x0c, 0x83, 0xea, 0x48, 0xfd}},
886	{ // 2
887		[]byte{
888			0x10, 0x07, 0x10, 0x34, 0xc8, 0x98, 0x01, 0x20,
889			0x10, 0x07, 0x10, 0x34, 0xc8, 0x98, 0x01, 0x20,
890			0x10, 0x07, 0x10, 0x34, 0xc8, 0x98, 0x01, 0x20,
891		},
892		nil,
893		[]byte{0x83, 0xbc, 0x8e, 0xf3, 0xa6, 0x57, 0x01, 0x83}},
894	{ // 3
895		[]byte{
896			0x10, 0x46, 0x10, 0x34, 0x89, 0x98, 0x80, 0x20,
897			0x10, 0x46, 0x10, 0x34, 0x89, 0x98, 0x80, 0x20,
898			0x10, 0x46, 0x10, 0x34, 0x89, 0x98, 0x80, 0x20,
899		},
900		nil,
901		[]byte{0xdf, 0x72, 0x5d, 0xca, 0xd9, 0x4e, 0xa2, 0xe9}},
902	{ // 4
903		[]byte{
904			0x10, 0x86, 0x91, 0x15, 0x19, 0x19, 0x01, 0x01,
905			0x10, 0x86, 0x91, 0x15, 0x19, 0x19, 0x01, 0x01,
906			0x10, 0x86, 0x91, 0x15, 0x19, 0x19, 0x01, 0x01,
907		},
908		nil,
909		[]byte{0xe6, 0x52, 0xb5, 0x3b, 0x55, 0x0b, 0xe8, 0xb0}},
910	{ // 5
911		[]byte{
912			0x10, 0x86, 0x91, 0x15, 0x19, 0x58, 0x01, 0x01,
913			0x10, 0x86, 0x91, 0x15, 0x19, 0x58, 0x01, 0x01,
914			0x10, 0x86, 0x91, 0x15, 0x19, 0x58, 0x01, 0x01,
915		},
916		nil,
917		[]byte{0xaf, 0x52, 0x71, 0x20, 0xc4, 0x85, 0xcb, 0xb0}},
918	{ // 6
919		[]byte{
920			0x51, 0x07, 0xb0, 0x15, 0x19, 0x58, 0x01, 0x01,
921			0x51, 0x07, 0xb0, 0x15, 0x19, 0x58, 0x01, 0x01,
922			0x51, 0x07, 0xb0, 0x15, 0x19, 0x58, 0x01, 0x01,
923		},
924		nil,
925		[]byte{0x0f, 0x04, 0xce, 0x39, 0x3d, 0xb9, 0x26, 0xd5}},
926	{ // 7
927		[]byte{
928			0x10, 0x07, 0xb0, 0x15, 0x19, 0x19, 0x01, 0x01,
929			0x10, 0x07, 0xb0, 0x15, 0x19, 0x19, 0x01, 0x01,
930			0x10, 0x07, 0xb0, 0x15, 0x19, 0x19, 0x01, 0x01,
931		},
932		nil,
933		[]byte{0xc9, 0xf0, 0x0f, 0xfc, 0x74, 0x07, 0x90, 0x67}},
934	{ // 8
935		[]byte{
936			0x31, 0x07, 0x91, 0x54, 0x98, 0x08, 0x01, 0x01,
937			0x31, 0x07, 0x91, 0x54, 0x98, 0x08, 0x01, 0x01,
938			0x31, 0x07, 0x91, 0x54, 0x98, 0x08, 0x01, 0x01,
939		},
940		nil,
941		[]byte{0x7c, 0xfd, 0x82, 0xa5, 0x93, 0x25, 0x2b, 0x4e}},
942	{ // 9
943		[]byte{
944			0x31, 0x07, 0x91, 0x94, 0x98, 0x08, 0x01, 0x01,
945			0x31, 0x07, 0x91, 0x94, 0x98, 0x08, 0x01, 0x01,
946			0x31, 0x07, 0x91, 0x94, 0x98, 0x08, 0x01, 0x01,
947		},
948		nil,
949		[]byte{0xcb, 0x49, 0xa2, 0xf9, 0xe9, 0x13, 0x63, 0xe3}},
950	{ // 10
951		[]byte{
952			0x10, 0x07, 0x91, 0x15, 0xb9, 0x08, 0x01, 0x40,
953			0x10, 0x07, 0x91, 0x15, 0xb9, 0x08, 0x01, 0x40,
954			0x10, 0x07, 0x91, 0x15, 0xb9, 0x08, 0x01, 0x40,
955		},
956		nil,
957		[]byte{0x00, 0xb5, 0x88, 0xbe, 0x70, 0xd2, 0x3f, 0x56}},
958	{ // 11
959		[]byte{
960			0x31, 0x07, 0x91, 0x15, 0x98, 0x08, 0x01, 0x40,
961			0x31, 0x07, 0x91, 0x15, 0x98, 0x08, 0x01, 0x40,
962			0x31, 0x07, 0x91, 0x15, 0x98, 0x08, 0x01, 0x40,
963		},
964		nil,
965		[]byte{0x40, 0x6a, 0x9a, 0x6a, 0xb4, 0x33, 0x99, 0xae}},
966	{ // 12
967		[]byte{
968			0x10, 0x07, 0xd0, 0x15, 0x89, 0x98, 0x01, 0x01,
969			0x10, 0x07, 0xd0, 0x15, 0x89, 0x98, 0x01, 0x01,
970			0x10, 0x07, 0xd0, 0x15, 0x89, 0x98, 0x01, 0x01,
971		},
972		nil,
973		[]byte{0x6c, 0xb7, 0x73, 0x61, 0x1d, 0xca, 0x9a, 0xda}},
974	{ // 13
975		[]byte{
976			0x91, 0x07, 0x91, 0x15, 0x89, 0x98, 0x01, 0x01,
977			0x91, 0x07, 0x91, 0x15, 0x89, 0x98, 0x01, 0x01,
978			0x91, 0x07, 0x91, 0x15, 0x89, 0x98, 0x01, 0x01,
979		},
980		nil,
981		[]byte{0x67, 0xfd, 0x21, 0xc1, 0x7d, 0xbb, 0x5d, 0x70}},
982	{ // 14
983		[]byte{
984			0x91, 0x07, 0xd0, 0x15, 0x89, 0x19, 0x01, 0x01,
985			0x91, 0x07, 0xd0, 0x15, 0x89, 0x19, 0x01, 0x01,
986			0x91, 0x07, 0xd0, 0x15, 0x89, 0x19, 0x01, 0x01,
987		},
988		nil,
989		[]byte{0x95, 0x92, 0xcb, 0x41, 0x10, 0x43, 0x07, 0x87}},
990	{ // 15
991		[]byte{
992			0x10, 0x07, 0xd0, 0x15, 0x98, 0x98, 0x01, 0x20,
993			0x10, 0x07, 0xd0, 0x15, 0x98, 0x98, 0x01, 0x20,
994			0x10, 0x07, 0xd0, 0x15, 0x98, 0x98, 0x01, 0x20,
995		},
996		nil,
997		[]byte{0xa6, 0xb7, 0xff, 0x68, 0xa3, 0x18, 0xdd, 0xd3}},
998	{ // 16
999		[]byte{
1000			0x10, 0x07, 0x94, 0x04, 0x98, 0x19, 0x01, 0x01,
1001			0x10, 0x07, 0x94, 0x04, 0x98, 0x19, 0x01, 0x01,
1002			0x10, 0x07, 0x94, 0x04, 0x98, 0x19, 0x01, 0x01,
1003		},
1004		nil,
1005		[]byte{0x4d, 0x10, 0x21, 0x96, 0xc9, 0x14, 0xca, 0x16}},
1006	{ // 17
1007		[]byte{
1008			0x01, 0x07, 0x91, 0x04, 0x91, 0x19, 0x04, 0x01,
1009			0x01, 0x07, 0x91, 0x04, 0x91, 0x19, 0x04, 0x01,
1010			0x01, 0x07, 0x91, 0x04, 0x91, 0x19, 0x04, 0x01,
1011		},
1012		nil,
1013		[]byte{0x2d, 0xfa, 0x9f, 0x45, 0x73, 0x59, 0x49, 0x65}},
1014	{ // 18
1015		[]byte{
1016			0x01, 0x07, 0x91, 0x04, 0x91, 0x19, 0x01, 0x01,
1017			0x01, 0x07, 0x91, 0x04, 0x91, 0x19, 0x01, 0x01,
1018			0x01, 0x07, 0x91, 0x04, 0x91, 0x19, 0x01, 0x01,
1019		},
1020		nil,
1021		[]byte{0xb4, 0x66, 0x04, 0x81, 0x6c, 0x0e, 0x07, 0x74}},
1022	{ // 19
1023		[]byte{
1024			0x01, 0x07, 0x94, 0x04, 0x91, 0x19, 0x04, 0x01,
1025			0x01, 0x07, 0x94, 0x04, 0x91, 0x19, 0x04, 0x01,
1026			0x01, 0x07, 0x94, 0x04, 0x91, 0x19, 0x04, 0x01,
1027		},
1028		nil,
1029		[]byte{0x6e, 0x7e, 0x62, 0x21, 0xa4, 0xf3, 0x4e, 0x87}},
1030	{ // 20
1031		[]byte{
1032			0x19, 0x07, 0x92, 0x10, 0x98, 0x1a, 0x01, 0x01,
1033			0x19, 0x07, 0x92, 0x10, 0x98, 0x1a, 0x01, 0x01,
1034			0x19, 0x07, 0x92, 0x10, 0x98, 0x1a, 0x01, 0x01,
1035		},
1036		nil,
1037		[]byte{0xaa, 0x85, 0xe7, 0x46, 0x43, 0x23, 0x31, 0x99}},
1038	{ // 21
1039		[]byte{
1040			0x10, 0x07, 0x91, 0x19, 0x98, 0x19, 0x08, 0x01,
1041			0x10, 0x07, 0x91, 0x19, 0x98, 0x19, 0x08, 0x01,
1042			0x10, 0x07, 0x91, 0x19, 0x98, 0x19, 0x08, 0x01,
1043		},
1044		nil,
1045		[]byte{0x2e, 0x5a, 0x19, 0xdb, 0x4d, 0x19, 0x62, 0xd6}},
1046	{ // 22
1047		[]byte{
1048			0x10, 0x07, 0x91, 0x19, 0x98, 0x1a, 0x08, 0x01,
1049			0x10, 0x07, 0x91, 0x19, 0x98, 0x1a, 0x08, 0x01,
1050			0x10, 0x07, 0x91, 0x19, 0x98, 0x1a, 0x08, 0x01,
1051		},
1052		nil,
1053		[]byte{0x23, 0xa8, 0x66, 0xa8, 0x09, 0xd3, 0x08, 0x94}},
1054	{ // 23
1055		[]byte{
1056			0x10, 0x07, 0x92, 0x10, 0x98, 0x19, 0x01, 0x01,
1057			0x10, 0x07, 0x92, 0x10, 0x98, 0x19, 0x01, 0x01,
1058			0x10, 0x07, 0x92, 0x10, 0x98, 0x19, 0x01, 0x01,
1059		},
1060		nil,
1061		[]byte{0xd8, 0x12, 0xd9, 0x61, 0xf0, 0x17, 0xd3, 0x20}},
1062	{ // 24
1063		[]byte{
1064			0x10, 0x07, 0x91, 0x15, 0x98, 0x19, 0x01, 0x0b,
1065			0x10, 0x07, 0x91, 0x15, 0x98, 0x19, 0x01, 0x0b,
1066			0x10, 0x07, 0x91, 0x15, 0x98, 0x19, 0x01, 0x0b,
1067		},
1068		nil,
1069		[]byte{0x05, 0x56, 0x05, 0x81, 0x6e, 0x58, 0x60, 0x8f}},
1070	{ // 25
1071		[]byte{
1072			0x10, 0x04, 0x80, 0x15, 0x98, 0x19, 0x01, 0x01,
1073			0x10, 0x04, 0x80, 0x15, 0x98, 0x19, 0x01, 0x01,
1074			0x10, 0x04, 0x80, 0x15, 0x98, 0x19, 0x01, 0x01,
1075		},
1076		nil,
1077		[]byte{0xab, 0xd8, 0x8e, 0x8b, 0x1b, 0x77, 0x16, 0xf1}},
1078	{ // 26
1079		[]byte{
1080			0x10, 0x04, 0x80, 0x15, 0x98, 0x19, 0x01, 0x02,
1081			0x10, 0x04, 0x80, 0x15, 0x98, 0x19, 0x01, 0x02,
1082			0x10, 0x04, 0x80, 0x15, 0x98, 0x19, 0x01, 0x02,
1083		},
1084		nil,
1085		[]byte{0x53, 0x7a, 0xc9, 0x5b, 0xe6, 0x9d, 0xa1, 0xe1}},
1086	{ // 27
1087		[]byte{
1088			0x10, 0x04, 0x80, 0x15, 0x98, 0x19, 0x01, 0x08,
1089			0x10, 0x04, 0x80, 0x15, 0x98, 0x19, 0x01, 0x08,
1090			0x10, 0x04, 0x80, 0x15, 0x98, 0x19, 0x01, 0x08,
1091		},
1092		nil,
1093		[]byte{0xae, 0xd0, 0xf6, 0xae, 0x3c, 0x25, 0xcd, 0xd8}},
1094	{ // 28
1095		[]byte{
1096			0x10, 0x02, 0x91, 0x15, 0x98, 0x10, 0x01, 0x04,
1097			0x10, 0x02, 0x91, 0x15, 0x98, 0x10, 0x01, 0x04,
1098			0x10, 0x02, 0x91, 0x15, 0x98, 0x10, 0x01, 0x04,
1099		},
1100		nil,
1101		[]byte{0xb3, 0xe3, 0x5a, 0x5e, 0xe5, 0x3e, 0x7b, 0x8d}},
1102	{ // 29
1103		[]byte{
1104			0x10, 0x02, 0x91, 0x15, 0x98, 0x19, 0x01, 0x04,
1105			0x10, 0x02, 0x91, 0x15, 0x98, 0x19, 0x01, 0x04,
1106			0x10, 0x02, 0x91, 0x15, 0x98, 0x19, 0x01, 0x04,
1107		},
1108		nil,
1109		[]byte{0x61, 0xc7, 0x9c, 0x71, 0x92, 0x1a, 0x2e, 0xf8}},
1110	{ // 30
1111		[]byte{
1112			0x10, 0x02, 0x91, 0x15, 0x98, 0x10, 0x02, 0x01,
1113			0x10, 0x02, 0x91, 0x15, 0x98, 0x10, 0x02, 0x01,
1114			0x10, 0x02, 0x91, 0x15, 0x98, 0x10, 0x02, 0x01,
1115		},
1116		nil,
1117		[]byte{0xe2, 0xf5, 0x72, 0x8f, 0x09, 0x95, 0x01, 0x3c}},
1118	{ // 31
1119		[]byte{
1120			0x10, 0x02, 0x91, 0x16, 0x98, 0x10, 0x01, 0x01,
1121			0x10, 0x02, 0x91, 0x16, 0x98, 0x10, 0x01, 0x01,
1122			0x10, 0x02, 0x91, 0x16, 0x98, 0x10, 0x01, 0x01,
1123		},
1124		nil,
1125		[]byte{0x1a, 0xea, 0xc3, 0x9a, 0x61, 0xf0, 0xa4, 0x64}},
1126}
1127
1128// Table A.4 Values To Be Used for the Substitution Table Known Answer Test
1129var tableA4Tests = []CryptTest{
1130	{ // 0
1131		[]byte{
1132			0x7c, 0xa1, 0x10, 0x45, 0x4a, 0x1a, 0x6e, 0x57,
1133			0x7c, 0xa1, 0x10, 0x45, 0x4a, 0x1a, 0x6e, 0x57,
1134			0x7c, 0xa1, 0x10, 0x45, 0x4a, 0x1a, 0x6e, 0x57},
1135		[]byte{0x01, 0xa1, 0xd6, 0xd0, 0x39, 0x77, 0x67, 0x42},
1136		[]byte{0x69, 0x0f, 0x5b, 0x0d, 0x9a, 0x26, 0x93, 0x9b}},
1137	{ // 1
1138		[]byte{
1139			0x01, 0x31, 0xd9, 0x61, 0x9d, 0xc1, 0x37, 0x6e,
1140			0x01, 0x31, 0xd9, 0x61, 0x9d, 0xc1, 0x37, 0x6e,
1141			0x01, 0x31, 0xd9, 0x61, 0x9d, 0xc1, 0x37, 0x6e},
1142		[]byte{0x5c, 0xd5, 0x4c, 0xa8, 0x3d, 0xef, 0x57, 0xda},
1143		[]byte{0x7a, 0x38, 0x9d, 0x10, 0x35, 0x4b, 0xd2, 0x71}},
1144	{ // 2
1145		[]byte{
1146			0x07, 0xa1, 0x13, 0x3e, 0x4a, 0x0b, 0x26, 0x86,
1147			0x07, 0xa1, 0x13, 0x3e, 0x4a, 0x0b, 0x26, 0x86,
1148			0x07, 0xa1, 0x13, 0x3e, 0x4a, 0x0b, 0x26, 0x86},
1149		[]byte{0x02, 0x48, 0xd4, 0x38, 0x06, 0xf6, 0x71, 0x72},
1150		[]byte{0x86, 0x8e, 0xbb, 0x51, 0xca, 0xb4, 0x59, 0x9a}},
1151	{ // 3
1152		[]byte{
1153			0x38, 0x49, 0x67, 0x4c, 0x26, 0x02, 0x31, 0x9e,
1154			0x38, 0x49, 0x67, 0x4c, 0x26, 0x02, 0x31, 0x9e,
1155			0x38, 0x49, 0x67, 0x4c, 0x26, 0x02, 0x31, 0x9e},
1156		[]byte{0x51, 0x45, 0x4b, 0x58, 0x2d, 0xdf, 0x44, 0x0a},
1157		[]byte{0x71, 0x78, 0x87, 0x6e, 0x01, 0xf1, 0x9b, 0x2a}},
1158	{ // 4
1159		[]byte{
1160			0x04, 0xb9, 0x15, 0xba, 0x43, 0xfe, 0xb5, 0xb6,
1161			0x04, 0xb9, 0x15, 0xba, 0x43, 0xfe, 0xb5, 0xb6,
1162			0x04, 0xb9, 0x15, 0xba, 0x43, 0xfe, 0xb5, 0xb6},
1163		[]byte{0x42, 0xfd, 0x44, 0x30, 0x59, 0x57, 0x7f, 0xa2},
1164		[]byte{0xaf, 0x37, 0xfb, 0x42, 0x1f, 0x8c, 0x40, 0x95}},
1165	{ // 5
1166		[]byte{
1167			0x01, 0x13, 0xb9, 0x70, 0xfd, 0x34, 0xf2, 0xce,
1168			0x01, 0x13, 0xb9, 0x70, 0xfd, 0x34, 0xf2, 0xce,
1169			0x01, 0x13, 0xb9, 0x70, 0xfd, 0x34, 0xf2, 0xce},
1170		[]byte{0x05, 0x9b, 0x5e, 0x08, 0x51, 0xcf, 0x14, 0x3a},
1171		[]byte{0x86, 0xa5, 0x60, 0xf1, 0x0e, 0xc6, 0xd8, 0x5b}},
1172	{ // 6
1173		[]byte{
1174			0x01, 0x70, 0xf1, 0x75, 0x46, 0x8f, 0xb5, 0xe6,
1175			0x01, 0x70, 0xf1, 0x75, 0x46, 0x8f, 0xb5, 0xe6,
1176			0x01, 0x70, 0xf1, 0x75, 0x46, 0x8f, 0xb5, 0xe6},
1177		[]byte{0x07, 0x56, 0xd8, 0xe0, 0x77, 0x47, 0x61, 0xd2},
1178		[]byte{0x0c, 0xd3, 0xda, 0x02, 0x00, 0x21, 0xdc, 0x09}},
1179	{ // 7
1180		[]byte{
1181			0x43, 0x29, 0x7f, 0xad, 0x38, 0xe3, 0x73, 0xfe,
1182			0x43, 0x29, 0x7f, 0xad, 0x38, 0xe3, 0x73, 0xfe,
1183			0x43, 0x29, 0x7f, 0xad, 0x38, 0xe3, 0x73, 0xfe},
1184		[]byte{0x76, 0x25, 0x14, 0xb8, 0x29, 0xbf, 0x48, 0x6a},
1185		[]byte{0xea, 0x67, 0x6b, 0x2c, 0xb7, 0xdb, 0x2b, 0x7a}},
1186	{ // 8
1187		[]byte{
1188			0x07, 0xa7, 0x13, 0x70, 0x45, 0xda, 0x2a, 0x16,
1189			0x07, 0xa7, 0x13, 0x70, 0x45, 0xda, 0x2a, 0x16,
1190			0x07, 0xa7, 0x13, 0x70, 0x45, 0xda, 0x2a, 0x16},
1191		[]byte{0x3b, 0xdd, 0x11, 0x90, 0x49, 0x37, 0x28, 0x02},
1192		[]byte{0xdf, 0xd6, 0x4a, 0x81, 0x5c, 0xaf, 0x1a, 0x0f}},
1193	{ // 9
1194		[]byte{
1195			0x04, 0x68, 0x91, 0x04, 0xc2, 0xfd, 0x3b, 0x2f,
1196			0x04, 0x68, 0x91, 0x04, 0xc2, 0xfd, 0x3b, 0x2f,
1197			0x04, 0x68, 0x91, 0x04, 0xc2, 0xfd, 0x3b, 0x2f},
1198		[]byte{0x26, 0x95, 0x5f, 0x68, 0x35, 0xaf, 0x60, 0x9a},
1199		[]byte{0x5c, 0x51, 0x3c, 0x9c, 0x48, 0x86, 0xc0, 0x88}},
1200	{ // 10
1201		[]byte{
1202			0x37, 0xd0, 0x6b, 0xb5, 0x16, 0xcb, 0x75, 0x46,
1203			0x37, 0xd0, 0x6b, 0xb5, 0x16, 0xcb, 0x75, 0x46,
1204			0x37, 0xd0, 0x6b, 0xb5, 0x16, 0xcb, 0x75, 0x46},
1205		[]byte{0x16, 0x4d, 0x5e, 0x40, 0x4f, 0x27, 0x52, 0x32},
1206		[]byte{0x0a, 0x2a, 0xee, 0xae, 0x3f, 0xf4, 0xab, 0x77}},
1207	{ // 11
1208		[]byte{
1209			0x1f, 0x08, 0x26, 0x0d, 0x1a, 0xc2, 0x46, 0x5e,
1210			0x1f, 0x08, 0x26, 0x0d, 0x1a, 0xc2, 0x46, 0x5e,
1211			0x1f, 0x08, 0x26, 0x0d, 0x1a, 0xc2, 0x46, 0x5e},
1212		[]byte{0x6b, 0x05, 0x6e, 0x18, 0x75, 0x9f, 0x5c, 0xca},
1213		[]byte{0xef, 0x1b, 0xf0, 0x3e, 0x5d, 0xfa, 0x57, 0x5a}},
1214	{ // 12
1215		[]byte{
1216			0x58, 0x40, 0x23, 0x64, 0x1a, 0xba, 0x61, 0x76,
1217			0x58, 0x40, 0x23, 0x64, 0x1a, 0xba, 0x61, 0x76,
1218			0x58, 0x40, 0x23, 0x64, 0x1a, 0xba, 0x61, 0x76},
1219		[]byte{0x00, 0x4b, 0xd6, 0xef, 0x09, 0x17, 0x60, 0x62},
1220		[]byte{0x88, 0xbf, 0x0d, 0xb6, 0xd7, 0x0d, 0xee, 0x56}},
1221	{ // 13
1222		[]byte{
1223			0x02, 0x58, 0x16, 0x16, 0x46, 0x29, 0xb0, 0x07,
1224			0x02, 0x58, 0x16, 0x16, 0x46, 0x29, 0xb0, 0x07,
1225			0x02, 0x58, 0x16, 0x16, 0x46, 0x29, 0xb0, 0x07},
1226		[]byte{0x48, 0x0d, 0x39, 0x00, 0x6e, 0xe7, 0x62, 0xf2},
1227		[]byte{0xa1, 0xf9, 0x91, 0x55, 0x41, 0x02, 0x0b, 0x56}},
1228	{ // 14
1229		[]byte{
1230			0x49, 0x79, 0x3e, 0xbc, 0x79, 0xb3, 0x25, 0x8f,
1231			0x49, 0x79, 0x3e, 0xbc, 0x79, 0xb3, 0x25, 0x8f,
1232			0x49, 0x79, 0x3e, 0xbc, 0x79, 0xb3, 0x25, 0x8f},
1233		[]byte{0x43, 0x75, 0x40, 0xc8, 0x69, 0x8f, 0x3c, 0xfa},
1234		[]byte{0x6f, 0xbf, 0x1c, 0xaf, 0xcf, 0xfd, 0x05, 0x56}},
1235	{ // 15
1236		[]byte{
1237			0x4f, 0xb0, 0x5e, 0x15, 0x15, 0xab, 0x73, 0xa7,
1238			0x4f, 0xb0, 0x5e, 0x15, 0x15, 0xab, 0x73, 0xa7,
1239			0x4f, 0xb0, 0x5e, 0x15, 0x15, 0xab, 0x73, 0xa7},
1240		[]byte{0x07, 0x2d, 0x43, 0xa0, 0x77, 0x07, 0x52, 0x92},
1241		[]byte{0x2f, 0x22, 0xe4, 0x9b, 0xab, 0x7c, 0xa1, 0xac}},
1242	{ // 16
1243		[]byte{
1244			0x49, 0xe9, 0x5d, 0x6d, 0x4c, 0xa2, 0x29, 0xbf,
1245			0x49, 0xe9, 0x5d, 0x6d, 0x4c, 0xa2, 0x29, 0xbf,
1246			0x49, 0xe9, 0x5d, 0x6d, 0x4c, 0xa2, 0x29, 0xbf},
1247		[]byte{0x02, 0xfe, 0x55, 0x77, 0x81, 0x17, 0xf1, 0x2a},
1248		[]byte{0x5a, 0x6b, 0x61, 0x2c, 0xc2, 0x6c, 0xce, 0x4a}},
1249	{ // 17
1250		[]byte{
1251			0x01, 0x83, 0x10, 0xdc, 0x40, 0x9b, 0x26, 0xd6,
1252			0x01, 0x83, 0x10, 0xdc, 0x40, 0x9b, 0x26, 0xd6,
1253			0x01, 0x83, 0x10, 0xdc, 0x40, 0x9b, 0x26, 0xd6},
1254		[]byte{0x1d, 0x9d, 0x5c, 0x50, 0x18, 0xf7, 0x28, 0xc2},
1255		[]byte{0x5f, 0x4c, 0x03, 0x8e, 0xd1, 0x2b, 0x2e, 0x41}},
1256	{ // 18
1257		[]byte{
1258			0x1c, 0x58, 0x7f, 0x1c, 0x13, 0x92, 0x4f, 0xef,
1259			0x1c, 0x58, 0x7f, 0x1c, 0x13, 0x92, 0x4f, 0xef,
1260			0x1c, 0x58, 0x7f, 0x1c, 0x13, 0x92, 0x4f, 0xef},
1261		[]byte{0x30, 0x55, 0x32, 0x28, 0x6d, 0x6f, 0x29, 0x5a},
1262		[]byte{0x63, 0xfa, 0xc0, 0xd0, 0x34, 0xd9, 0xf7, 0x93}},
1263}
1264
1265func newCipher(key []byte) cipher.Block {
1266	c, err := des.NewCipher(key)
1267	if err != nil {
1268		panic("NewCipher failed: " + err.Error())
1269	}
1270	return c
1271}
1272
1273// Use the known weak keys to test DES implementation
1274func TestWeakKeys(t *testing.T) {
1275	for i, tt := range weakKeyTests {
1276		var encrypt = func(in []byte) (out []byte) {
1277			c := newCipher(tt.key)
1278			out = make([]byte, len(in))
1279			c.Encrypt(out, in)
1280			return
1281		}
1282
1283		// Encrypting twice with a DES weak
1284		// key should reproduce the original input
1285		result := encrypt(tt.in)
1286		result = encrypt(result)
1287
1288		if !bytes.Equal(result, tt.in) {
1289			t.Errorf("#%d: result: %x want: %x", i, result, tt.in)
1290		}
1291	}
1292}
1293
1294// Use the known semi-weak key pairs to test DES implementation
1295func TestSemiWeakKeyPairs(t *testing.T) {
1296	for i, tt := range semiWeakKeyTests {
1297		var encrypt = func(key, in []byte) (out []byte) {
1298			c := newCipher(key)
1299			out = make([]byte, len(in))
1300			c.Encrypt(out, in)
1301			return
1302		}
1303
1304		// Encrypting with one member of the semi-weak pair
1305		// and then encrypting the result with the other member
1306		// should reproduce the original input.
1307		result := encrypt(tt.key, tt.in)
1308		result = encrypt(tt.out, result)
1309
1310		if !bytes.Equal(result, tt.in) {
1311			t.Errorf("#%d: result: %x want: %x", i, result, tt.in)
1312		}
1313	}
1314}
1315
1316func TestDESEncryptBlock(t *testing.T) {
1317	for i, tt := range encryptDESTests {
1318		c := newCipher(tt.key)
1319		out := make([]byte, len(tt.in))
1320		c.Encrypt(out, tt.in)
1321
1322		if !bytes.Equal(out, tt.out) {
1323			t.Errorf("#%d: result: %x want: %x", i, out, tt.out)
1324		}
1325	}
1326}
1327
1328func TestDESDecryptBlock(t *testing.T) {
1329	for i, tt := range encryptDESTests {
1330		c := newCipher(tt.key)
1331		plain := make([]byte, len(tt.in))
1332		c.Decrypt(plain, tt.out)
1333
1334		if !bytes.Equal(plain, tt.in) {
1335			t.Errorf("#%d: result: %x want: %x", i, plain, tt.in)
1336		}
1337	}
1338}
1339
1340func TestEncryptTripleDES(t *testing.T) {
1341	for i, tt := range encryptTripleDESTests {
1342		c, _ := des.NewTripleDESCipher(tt.key)
1343		out := make([]byte, len(tt.in))
1344		c.Encrypt(out, tt.in)
1345
1346		if !bytes.Equal(out, tt.out) {
1347			t.Errorf("#%d: result: %x want: %x", i, out, tt.out)
1348		}
1349	}
1350}
1351
1352func TestDecryptTripleDES(t *testing.T) {
1353	for i, tt := range encryptTripleDESTests {
1354		c, _ := des.NewTripleDESCipher(tt.key)
1355
1356		plain := make([]byte, len(tt.in))
1357		c.Decrypt(plain, tt.out)
1358
1359		if !bytes.Equal(plain, tt.in) {
1360			t.Errorf("#%d: result: %x want: %x", i, plain, tt.in)
1361		}
1362	}
1363}
1364
1365// Defined in Pub 800-20
1366func TestVariablePlaintextKnownAnswer(t *testing.T) {
1367	for i, tt := range tableA1Tests {
1368		c, _ := des.NewTripleDESCipher(tableA1Key)
1369
1370		out := make([]byte, len(tt.in))
1371		c.Encrypt(out, tt.in)
1372
1373		if !bytes.Equal(out, tt.out) {
1374			t.Errorf("#%d: result: %x want: %x", i, out, tt.out)
1375		}
1376	}
1377}
1378
1379// Defined in Pub 800-20
1380func TestVariableCiphertextKnownAnswer(t *testing.T) {
1381	for i, tt := range tableA1Tests {
1382		c, _ := des.NewTripleDESCipher(tableA1Key)
1383
1384		plain := make([]byte, len(tt.out))
1385		c.Decrypt(plain, tt.out)
1386
1387		if !bytes.Equal(plain, tt.in) {
1388			t.Errorf("#%d: result: %x want: %x", i, plain, tt.in)
1389		}
1390	}
1391}
1392
1393// Defined in Pub 800-20
1394// Encrypting the Table A.1 ciphertext with the
1395// 0x01... key produces the original plaintext
1396func TestInversePermutationKnownAnswer(t *testing.T) {
1397	for i, tt := range tableA1Tests {
1398		c, _ := des.NewTripleDESCipher(tableA1Key)
1399
1400		plain := make([]byte, len(tt.in))
1401		c.Encrypt(plain, tt.out)
1402
1403		if !bytes.Equal(plain, tt.in) {
1404			t.Errorf("#%d: result: %x want: %x", i, plain, tt.in)
1405		}
1406	}
1407}
1408
1409// Defined in Pub 800-20
1410// Decrypting the Table A.1 plaintext with the
1411// 0x01... key produces the corresponding ciphertext
1412func TestInitialPermutationKnownAnswer(t *testing.T) {
1413	for i, tt := range tableA1Tests {
1414		c, _ := des.NewTripleDESCipher(tableA1Key)
1415
1416		out := make([]byte, len(tt.in))
1417		c.Decrypt(out, tt.in)
1418
1419		if !bytes.Equal(out, tt.out) {
1420			t.Errorf("#%d: result: %x want: %x", i, out, tt.out)
1421		}
1422	}
1423}
1424
1425// Defined in Pub 800-20
1426func TestVariableKeyKnownAnswerEncrypt(t *testing.T) {
1427	for i, tt := range tableA2Tests {
1428		c, _ := des.NewTripleDESCipher(tt.key)
1429
1430		out := make([]byte, len(tableA2Plaintext))
1431		c.Encrypt(out, tableA2Plaintext)
1432
1433		if !bytes.Equal(out, tt.out) {
1434			t.Errorf("#%d: result: %x want: %x", i, out, tt.out)
1435		}
1436	}
1437}
1438
1439// Defined in Pub 800-20
1440func TestVariableKeyKnownAnswerDecrypt(t *testing.T) {
1441	for i, tt := range tableA2Tests {
1442		c, _ := des.NewTripleDESCipher(tt.key)
1443
1444		out := make([]byte, len(tt.out))
1445		c.Decrypt(out, tt.out)
1446
1447		if !bytes.Equal(out, tableA2Plaintext) {
1448			t.Errorf("#%d: result: %x want: %x", i, out, tableA2Plaintext)
1449		}
1450	}
1451}
1452
1453// Defined in Pub 800-20
1454func TestPermutationOperationKnownAnswerEncrypt(t *testing.T) {
1455	for i, tt := range tableA3Tests {
1456		c, _ := des.NewTripleDESCipher(tt.key)
1457
1458		out := make([]byte, len(tableA3Plaintext))
1459		c.Encrypt(out, tableA3Plaintext)
1460
1461		if !bytes.Equal(out, tt.out) {
1462			t.Errorf("#%d: result: %x want: %x", i, out, tt.out)
1463		}
1464	}
1465}
1466
1467// Defined in Pub 800-20
1468func TestPermutationOperationKnownAnswerDecrypt(t *testing.T) {
1469	for i, tt := range tableA3Tests {
1470		c, _ := des.NewTripleDESCipher(tt.key)
1471
1472		out := make([]byte, len(tt.out))
1473		c.Decrypt(out, tt.out)
1474
1475		if !bytes.Equal(out, tableA3Plaintext) {
1476			t.Errorf("#%d: result: %x want: %x", i, out, tableA3Plaintext)
1477		}
1478	}
1479}
1480
1481// Defined in Pub 800-20
1482func TestSubstitutionTableKnownAnswerEncrypt(t *testing.T) {
1483	for i, tt := range tableA4Tests {
1484		c, _ := des.NewTripleDESCipher(tt.key)
1485
1486		out := make([]byte, len(tt.in))
1487		c.Encrypt(out, tt.in)
1488
1489		if !bytes.Equal(out, tt.out) {
1490			t.Errorf("#%d: result: %x want: %x", i, out, tt.out)
1491		}
1492	}
1493}
1494
1495// Defined in Pub 800-20
1496func TestSubstitutionTableKnownAnswerDecrypt(t *testing.T) {
1497	for i, tt := range tableA4Tests {
1498		c, _ := des.NewTripleDESCipher(tt.key)
1499
1500		out := make([]byte, len(tt.out))
1501		c.Decrypt(out, tt.out)
1502
1503		if !bytes.Equal(out, tt.in) {
1504			t.Errorf("#%d: result: %x want: %x", i, out, tt.in)
1505		}
1506	}
1507}
1508
1509func BenchmarkEncrypt(b *testing.B) {
1510	tt := encryptDESTests[0]
1511	c, err := des.NewCipher(tt.key)
1512	if err != nil {
1513		b.Fatal("NewCipher:", err)
1514	}
1515	out := make([]byte, len(tt.in))
1516	b.SetBytes(int64(len(out)))
1517	b.ResetTimer()
1518	for i := 0; i < b.N; i++ {
1519		c.Encrypt(out, tt.in)
1520	}
1521}
1522
1523func BenchmarkDecrypt(b *testing.B) {
1524	tt := encryptDESTests[0]
1525	c, err := des.NewCipher(tt.key)
1526	if err != nil {
1527		b.Fatal("NewCipher:", err)
1528	}
1529	out := make([]byte, len(tt.out))
1530	b.SetBytes(int64(len(out)))
1531	b.ResetTimer()
1532	for i := 0; i < b.N; i++ {
1533		c.Decrypt(out, tt.out)
1534	}
1535}
1536
1537func BenchmarkTDESEncrypt(b *testing.B) {
1538	tt := encryptTripleDESTests[0]
1539	c, err := des.NewTripleDESCipher(tt.key)
1540	if err != nil {
1541		b.Fatal("NewCipher:", err)
1542	}
1543	out := make([]byte, len(tt.in))
1544	b.SetBytes(int64(len(out)))
1545	b.ResetTimer()
1546	for i := 0; i < b.N; i++ {
1547		c.Encrypt(out, tt.in)
1548	}
1549}
1550
1551func BenchmarkTDESDecrypt(b *testing.B) {
1552	tt := encryptTripleDESTests[0]
1553	c, err := des.NewTripleDESCipher(tt.key)
1554	if err != nil {
1555		b.Fatal("NewCipher:", err)
1556	}
1557	out := make([]byte, len(tt.out))
1558	b.SetBytes(int64(len(out)))
1559	b.ResetTimer()
1560	for i := 0; i < b.N; i++ {
1561		c.Decrypt(out, tt.out)
1562	}
1563}
1564