1/*
2 * Copyright (c) 2011-12 Apple Inc. All Rights Reserved.
3 *
4 * @APPLE_LICENSE_HEADER_START@
5 *
6 * This file contains Original Code and/or Modifications of Original Code
7 * as defined in and that are subject to the Apple Public Source License
8 * Version 2.0 (the 'License'). You may not use this file except in
9 * compliance with the License. Please obtain a copy of the License at
10 * http://www.opensource.apple.com/apsl/ and read it before using this
11 * file.
12 *
13 * The Original Code and all software distributed under the License are
14 * distributed on an 'AS IS' basis, WITHOUT WARRANTY OF ANY KIND, EITHER
15 * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES,
16 * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY,
17 * FITNESS FOR A PARTICULAR PURPOSE, QUIET ENJOYMENT OR NON-INFRINGEMENT.
18 * Please see the License for the specific language governing rights and
19 * limitations under the License.
20 *
21 * @APPLE_LICENSE_HEADER_END@
22 */
23
24#include <sys/types.h>
25#include <stdio.h>
26#include <stdlib.h>
27#include <string.h>
28#include <getopt.h>
29
30#include "ossl-evp.h"
31#include "ossl-evp-cc.h"
32
33#include "test_common.h"
34
35static int verbose = 1;
36
37static int total = 0;
38static int pass = 0;
39static int fail = 0;
40
41/*
42 *  Cryptor Test Engine.
43 */
44typedef const EVP_CIPHER * (*evp_alg_t)(void);
45
46static int _test_cryptor(evp_alg_t alg, const byteVector_t *key[], const byteVector_t *pt[], const byteVector_t *ct[], const unsigned num_tests)
47{
48	unsigned i;
49	int rv = 0;
50	EVP_CIPHER_CTX ectx, dctx;
51	const EVP_CIPHER  *c = (*alg)();
52
53	if (NULL == c) {
54		printf("cipher not supported\n");
55		return (1);
56	}
57
58	EVP_CIPHER_CTX_init(&ectx);
59	EVP_CIPHER_CTX_init(&dctx);
60
61	/* Setup key */
62	for(i = 0; i < num_tests; i++) {
63		size_t blocksize = (pt[i]->len > ct[i]->len) ? pt[i]->len : ct[i]->len;
64		uint8_t blk1[blocksize], blk2[blocksize];
65
66		if (EVP_CipherInit_ex(&ectx, c, NULL, NULL, NULL, 1) != 1) {
67			if (verbose) printf("vector %u EVP_EncryptInit_ex failed\n", i);
68			continue;
69		}
70		if (EVP_CipherInit_ex(&dctx, c, NULL, NULL, NULL, 0) != 1) {
71			if (verbose) printf("vector %u EVP_DecryptInit_ex failed\n",  i);
72			EVP_CIPHER_CTX_cleanup(&ectx);
73			continue;
74		}
75
76		EVP_CIPHER_CTX_set_key_length(&ectx, key[i]->len);
77		EVP_CIPHER_CTX_set_key_length(&dctx, key[i]->len);
78
79		if (EVP_CipherInit_ex(&ectx, c, NULL, key[i]->value, NULL, 1) != 1) {
80			if (verbose) printf("vector %u EVP_EncryptInit_ex w/ key failed\n", i);
81			EVP_CIPHER_CTX_cleanup(&ectx);
82			EVP_CIPHER_CTX_cleanup(&dctx);
83			continue;
84		}
85		if (EVP_CipherInit_ex(&dctx, c, NULL, key[i]->value, NULL, 0) != 1) {
86			if (verbose) printf("vector %u EVP_DecryptInit_ex w/ key failed\n",  i);
87			EVP_CIPHER_CTX_cleanup(&ectx);
88			EVP_CIPHER_CTX_cleanup(&dctx);
89			continue;
90		}
91
92
93
94		/* Encrypt and decrypt. */
95		if (!EVP_Cipher(&ectx, blk1, pt[i]->value, blocksize)) {
96			if (verbose) printf("encrypting failed on vector %u\n", i);
97			rv = 1;
98			goto done;
99		}
100		if (memcmp(blk1, ct[i]->value, blocksize) != 0) {
101#if 0
102			char *s1, *s2;
103
104			if (verbose) {
105				hex_encode(blk1, blocksize, &s1);
106				hex_encode(ct[i]->value, blocksize, &s2);
107
108				printf("vector %d encrypt not the same: %s != %s\n", (int)i, s1, s2);
109			}
110#else
111			if (verbose) printf("vector %u encrypt not the same\n", i);
112#endif
113			rv = 1;
114			goto done;
115		}
116
117		if (!EVP_Cipher(&dctx, blk2, blk1, blocksize)) {
118			if (verbose) printf("decrypting failed on vector %u\n", i);
119			rv = 1;
120			goto done;
121		}
122		if (memcmp(blk2, pt[i]->value, blocksize) != 0) {
123#if 0
124			char *s1, *s2;
125
126			if (verbose) {
127				hex_encode(blk2, blocksize, &s1);
128				hex_encode(pt[i]->value, blocksize, &s2);
129
130				printf("vector %d decrypt not the same: %s != %s\n", (int)i, s1, s2);
131			}
132#else
133			if (verbose) printf("vector %u encrypt not the same\n", i);
134#endif
135			rv = 1;
136			goto done;
137		}
138
139done:
140		EVP_CIPHER_CTX_cleanup(&ectx);
141		EVP_CIPHER_CTX_cleanup(&dctx);
142	}
143
144	return (rv);
145}
146
147/*
148 * Test Vector Macros:
149 *
150 * CRYPTOR_KEY() is the key for the cryptor (in hex).
151 * Parameters: (<Digest Name>, <vector #>, <key length>,  <vector data>)
152 *
153 * CRYPTOR_PT() is the plaintext (in hex).
154 * CRYPTOR_CT() is the ciphertext digest (in hex).
155 * Parameters: (<Digest Name>, <vector #>, <vector data>)
156 */
157#define	CRYPTOR_KEY(NAME, N, LEN, VALUE...) static byteVector_t	_cc_ ## NAME ## _cryptor_key_ ## N = \
158						{ LEN, { VALUE } };
159#define	CRYPTOR_PT(NAME, N, LEN, VALUE...) static byteVector_t _cc_ ## NAME ## _cryptor_pt_ ## N = \
160						{ LEN, { VALUE } };
161#define	CRYPTOR_CT(NAME, N, LEN, VALUE...) static byteVector_t _cc_ ## NAME ## _cryptor_ct_ ## N = \
162						{ LEN, { VALUE } };
163
164/*
165 * CRYPTOR_TEST() generates the testing code stub.
166 * Parameters: (<Cryptor Name>, <Number of test vectors>)
167 */
168#define	CRYPTOR_TEST(ALG_NAME, NUM_TESTS) 						\
169static byteVector_t * _cc_ ## ALG_NAME ## _cryptor_key_vects[] =			\
170	{ ARRAY_FOR_ ## NUM_TESTS (& _cc_ ## ALG_NAME ## _cryptor_key_ ) NULL };	\
171											\
172static byteVector_t * _cc_ ## ALG_NAME ## _cryptor_pt_vects[] =				\
173	{ ARRAY_FOR_ ## NUM_TESTS (& _cc_ ## ALG_NAME ## _cryptor_pt_ ) NULL };		\
174											\
175static byteVector_t * _cc_ ## ALG_NAME ## _cryptor_ct_vects[] =				\
176	{ ARRAY_FOR_ ## NUM_TESTS (& _cc_ ## ALG_NAME ## _cryptor_ct_ ) NULL };		\
177											\
178static int testCryptor_ ## ALG_NAME(void) {						\
179	return (_test_cryptor(EVP_ ## ALG_NAME, 					\
180		_cc_ ## ALG_NAME ## _cryptor_key_vects,					\
181		_cc_ ## ALG_NAME ## _cryptor_pt_vects,					\
182		_cc_ ## ALG_NAME ## _cryptor_ct_vects, NUM_TESTS));			\
183}
184
185/*
186 * AES (Advanced Encryption Standard - FIPS 197) test vectors.
187 */
188CRYPTOR_KEY(aes_128_ecb, 0, 16,	0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07,
189				0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f)
190CRYPTOR_PT(aes_128_ecb,  0, 16,	0x00, 0x11, 0x22, 0x33, 0x44, 0x55, 0x66, 0x77,
191				0x88, 0x99, 0xaa, 0xbb, 0xcc, 0xdd, 0xee, 0xff)
192CRYPTOR_CT(aes_128_ecb,  0, 16,	0x69, 0xc4, 0xe0, 0xd8, 0x6a, 0x7b, 0x04, 0x30,
193				0xd8, 0xcd, 0xb7, 0x80, 0x70, 0xb4, 0xc5, 0x5a)
194CRYPTOR_TEST(aes_128_ecb, 1)
195
196CRYPTOR_KEY(aes_192_ecb, 0, 24,	0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07,
197				0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f,
198				0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17)
199CRYPTOR_PT(aes_192_ecb,  0, 16,	0x00, 0x11, 0x22, 0x33, 0x44, 0x55, 0x66, 0x77,
200				0x88, 0x99, 0xaa, 0xbb, 0xcc, 0xdd, 0xee, 0xff)
201CRYPTOR_CT(aes_192_ecb,  0, 16,	0xdd, 0xa9, 0x7c, 0xa4, 0x86, 0x4c, 0xdf, 0xe0,
202				0x6e, 0xaf, 0x70, 0xa0, 0xec, 0x0d, 0x71, 0x91)
203CRYPTOR_TEST(aes_192_ecb, 1)
204
205CRYPTOR_KEY(aes_256_ecb, 0, 32,	0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07,
206				0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f,
207				0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17,
208				0x18, 0x19, 0x1a, 0x1b, 0x1c, 0x1d, 0x1e, 0x1f)
209CRYPTOR_PT(aes_256_ecb,  0, 16,	0x00, 0x11, 0x22, 0x33, 0x44, 0x55, 0x66, 0x77,
210				0x88, 0x99, 0xaa, 0xbb, 0xcc, 0xdd, 0xee, 0xff)
211CRYPTOR_CT(aes_256_ecb,  0, 16,	0x8e, 0xa2, 0xb7, 0xca, 0x51, 0x67, 0x45, 0xbf,
212				0xea, 0xfc, 0x49, 0x90, 0x4b, 0x49, 0x60, 0x89)
213CRYPTOR_TEST(aes_256_ecb, 1)
214
215/*
216 * DES (Data Encryption Standard - FIPS 46-3) test vectors.
217 */
218CRYPTOR_KEY(des_ecb, 0, 8,	0x10, 0x31, 0x6E, 0x02, 0x8C, 0x8F, 0x3B, 0x4A)
219CRYPTOR_PT(des_ecb,  0, 8,	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00)
220CRYPTOR_CT(des_ecb,  0, 8,	0x82, 0xDC, 0xBA, 0xFB, 0xDE, 0xAB, 0x66, 0x02)
221
222CRYPTOR_KEY(des_ecb, 1, 8,	0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01)
223CRYPTOR_PT(des_ecb,  1, 8,	0x95, 0xF8, 0xA5, 0xE5, 0xDD, 0x31, 0xD9, 0x00)
224CRYPTOR_CT(des_ecb,  1, 8,	0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00)
225
226CRYPTOR_KEY(des_ecb, 2, 8,	0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01)
227CRYPTOR_PT(des_ecb,  2, 8,	0xDD, 0x7F, 0x12, 0x1C, 0xA5, 0x01, 0x56, 0x19)
228CRYPTOR_CT(des_ecb,  2, 8,	0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00)
229
230CRYPTOR_KEY(des_ecb, 3, 8,	0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01)
231CRYPTOR_PT(des_ecb,  3, 8,	0x2E, 0x86, 0x53, 0x10, 0x4F, 0x38, 0x34, 0xEA)
232CRYPTOR_CT(des_ecb,  3, 8,	0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00)
233
234CRYPTOR_KEY(des_ecb, 4, 8,	0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01)
235CRYPTOR_PT(des_ecb,  4, 8,	0x4B, 0xD3, 0x88, 0xFF, 0x6C, 0xD8, 0x1D, 0x4F)
236CRYPTOR_CT(des_ecb,  4, 8,	0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00)
237
238CRYPTOR_KEY(des_ecb, 5, 8,	0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01)
239CRYPTOR_PT(des_ecb,  5, 8,	0x20, 0xB9, 0xE7, 0x67, 0xB2, 0xFB, 0x14, 0x56)
240CRYPTOR_CT(des_ecb,  5, 8,	0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00)
241
242CRYPTOR_KEY(des_ecb, 6, 8,	0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01)
243CRYPTOR_PT(des_ecb,  6, 8,	0x55, 0x57, 0x93, 0x80, 0xD7, 0x71, 0x38, 0xEF)
244CRYPTOR_CT(des_ecb,  6, 8,	0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00)
245
246CRYPTOR_KEY(des_ecb, 7, 8,	0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01)
247CRYPTOR_PT(des_ecb,  7, 8,	0x6C, 0xC5, 0xDE, 0xFA, 0xAF, 0x04, 0x51, 0x2F)
248CRYPTOR_CT(des_ecb,  7, 8,	0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00)
249
250CRYPTOR_KEY(des_ecb, 8, 8,	0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01)
251CRYPTOR_PT(des_ecb,  8, 8,	0x0D, 0x9F, 0x27, 0x9B, 0xA5, 0xD8, 0x72, 0x60)
252CRYPTOR_CT(des_ecb,  8, 8,	0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00)
253
254CRYPTOR_KEY(des_ecb, 9, 8,	0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01)
255CRYPTOR_PT(des_ecb,  9, 8,	0xD9, 0x03, 0x1B, 0x02, 0x71, 0xBD, 0x5A, 0x0A)
256CRYPTOR_CT(des_ecb,  9, 8,	0x00, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00)
257
258CRYPTOR_KEY(des_ecb, 10, 8,	0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01)
259CRYPTOR_PT(des_ecb,  10, 8,	0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00)
260CRYPTOR_CT(des_ecb,  10, 8,	0x95, 0xF8, 0xA5, 0xE5, 0xDD, 0x31, 0xD9, 0x00)
261
262CRYPTOR_KEY(des_ecb, 11, 8,	0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01)
263CRYPTOR_PT(des_ecb,  11, 8,	0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00)
264CRYPTOR_CT(des_ecb,  11, 8,	0xDD, 0x7F, 0x12, 0x1C, 0xA5, 0x01, 0x56, 0x19)
265
266CRYPTOR_KEY(des_ecb, 12, 8,	0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01)
267CRYPTOR_PT(des_ecb,  12, 8,	0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00)
268CRYPTOR_CT(des_ecb,  12, 8,	0x2E, 0x86, 0x53, 0x10, 0x4F, 0x38, 0x34, 0xEA)
269
270CRYPTOR_KEY(des_ecb, 13, 8,	0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01)
271CRYPTOR_PT(des_ecb,  13, 8,	0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00)
272CRYPTOR_CT(des_ecb,  13, 8,	0x4B, 0xD3, 0x88, 0xFF, 0x6C, 0xD8, 0x1D, 0x4F)
273
274CRYPTOR_KEY(des_ecb, 14, 8,	0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01)
275CRYPTOR_PT(des_ecb,  14, 8,	0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00)
276CRYPTOR_CT(des_ecb,  14, 8,	0x20, 0xB9, 0xE7, 0x67, 0xB2, 0xFB, 0x14, 0x56)
277
278CRYPTOR_KEY(des_ecb, 15, 8,	0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01)
279CRYPTOR_PT(des_ecb,  15, 8,	0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00)
280CRYPTOR_CT(des_ecb,  15, 8,	0x55, 0x57, 0x93, 0x80, 0xD7, 0x71, 0x38, 0xEF)
281
282CRYPTOR_KEY(des_ecb, 16, 8,	0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01)
283CRYPTOR_PT(des_ecb,  16, 8,	0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00)
284CRYPTOR_CT(des_ecb,  16, 8,	0x6C, 0xC5, 0xDE, 0xFA, 0xAF, 0x04, 0x51, 0x2F)
285
286CRYPTOR_KEY(des_ecb, 17, 8,	0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01)
287CRYPTOR_PT(des_ecb,  17, 8,	0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00)
288CRYPTOR_CT(des_ecb,  17, 8,	0x0D, 0x9F, 0x27, 0x9B, 0xA5, 0xD8, 0x72, 0x60)
289
290CRYPTOR_KEY(des_ecb, 18, 8,	0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01)
291CRYPTOR_PT(des_ecb,  18, 8,	0x00, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00)
292CRYPTOR_CT(des_ecb,  18, 8,	0xD9, 0x03, 0x1B, 0x02, 0x71, 0xBD, 0x5A, 0x0A)
293
294
295        /*** more test cases you could add if you are not convinced (the above test cases aren't really too good):
296
297         key              plaintext        ciphertext
298         0000000000000000 0000000000000000 8CA64DE9C1B123A7
299         FFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFF 7359B2163E4EDC58
300         3000000000000000 1000000000000001 958E6E627A05557B
301         1111111111111111 1111111111111111 F40379AB9E0EC533
302         0123456789ABCDEF 1111111111111111 17668DFC7292532D
303         1111111111111111 0123456789ABCDEF 8A5AE1F81AB8F2DD
304         0000000000000000 0000000000000000 8CA64DE9C1B123A7
305         FEDCBA9876543210 0123456789ABCDEF ED39D950FA74BCC4
306         7CA110454A1A6E57 01A1D6D039776742 690F5B0D9A26939B
307         0131D9619DC1376E 5CD54CA83DEF57DA 7A389D10354BD271
308         07A1133E4A0B2686 0248D43806F67172 868EBB51CAB4599A
309         3849674C2602319E 51454B582DDF440A 7178876E01F19B2A
310         04B915BA43FEB5B6 42FD443059577FA2 AF37FB421F8C4095
311         0113B970FD34F2CE 059B5E0851CF143A 86A560F10EC6D85B
312         0170F175468FB5E6 0756D8E0774761D2 0CD3DA020021DC09
313         43297FAD38E373FE 762514B829BF486A EA676B2CB7DB2B7A
314         07A7137045DA2A16 3BDD119049372802 DFD64A815CAF1A0F
315         04689104C2FD3B2F 26955F6835AF609A 5C513C9C4886C088
316         37D06BB516CB7546 164D5E404F275232 0A2AEEAE3FF4AB77
317         1F08260D1AC2465E 6B056E18759F5CCA EF1BF03E5DFA575A
318         584023641ABA6176 004BD6EF09176062 88BF0DB6D70DEE56
319         025816164629B007 480D39006EE762F2 A1F9915541020B56
320         49793EBC79B3258F 437540C8698F3CFA 6FBF1CAFCFFD0556
321         4FB05E1515AB73A7 072D43A077075292 2F22E49BAB7CA1AC
322         49E95D6D4CA229BF 02FE55778117F12A 5A6B612CC26CCE4A
323         018310DC409B26D6 1D9D5C5018F728C2 5F4C038ED12B2E41
324         1C587F1C13924FEF 305532286D6F295A 63FAC0D034D9F793
325         0101010101010101 0123456789ABCDEF 617B3A0CE8F07100
326         1F1F1F1F0E0E0E0E 0123456789ABCDEF DB958605F8C8C606
327         E0FEE0FEF1FEF1FE 0123456789ABCDEF EDBFD1C66C29CCC7
328         0000000000000000 FFFFFFFFFFFFFFFF 355550B2150E2451
329         FFFFFFFFFFFFFFFF 0000000000000000 CAAAAF4DEAF1DBAE
330         0123456789ABCDEF 0000000000000000 D5D44FF720683D0D
331         FEDCBA9876543210 FFFFFFFFFFFFFFFF 2A2BB008DF97C2F2
332
333         http://www.ecs.soton.ac.uk/~prw99r/ez438/vectors.txt
334         ***/
335CRYPTOR_TEST(des_ecb, 19)
336
337/*
338 * CAST Test Vectors.
339 */
340CRYPTOR_KEY(cast5_ecb, 0, 16,	0x01, 0x23, 0x45, 0x67, 0x12, 0x34, 0x56, 0x78,
341				0x23, 0x45, 0x67, 0x89, 0x34, 0x56, 0x78, 0x9A)
342CRYPTOR_PT(cast5_ecb,  0, 8,	0x01, 0x23, 0x45, 0x67, 0x89, 0xAB, 0xCD, 0xEF)
343CRYPTOR_CT(cast5_ecb,  0, 8,	0x23, 0x8B, 0x4F, 0xE5, 0x84, 0x7E, 0x44, 0xB2)
344
345CRYPTOR_KEY(cast5_ecb, 1, 10,	0x01, 0x23, 0x45, 0x67, 0x12, 0x34, 0x56, 0x78,
346				0x23, 0x45)
347CRYPTOR_PT(cast5_ecb,  1, 8,	0x01, 0x23, 0x45, 0x67, 0x89, 0xAB, 0xCD, 0xEF)
348CRYPTOR_CT(cast5_ecb,  1, 8,	0xEB, 0x6A, 0x71, 0x1A, 0x2C, 0x02, 0x27, 0x1B)
349
350CRYPTOR_KEY(cast5_ecb, 2, 5,	0x01, 0x23, 0x45, 0x67, 0x12)
351CRYPTOR_PT(cast5_ecb,  2, 8,	0x01, 0x23, 0x45, 0x67, 0x89, 0xAB, 0xCD, 0xEF)
352CRYPTOR_CT(cast5_ecb,  2, 8,	0x7A, 0xC8, 0x16, 0xD1, 0x6E, 0x9B, 0x30, 0x2E)
353
354CRYPTOR_TEST(cast5_ecb, 3)
355
356#if 0  /* NO RC2 support */
357/*
358 * RC2 Test Vectors.
359 */
360CRYPTOR_KEY(RC2, 0, 8,	0x30, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00)
361CRYPTOR_PT(RC2,  0, 8,	0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01)
362CRYPTOR_CT(RC2,  0, 8,	0x30, 0x64, 0x9e, 0xdf, 0x9b, 0xe7, 0xd2, 0xc2)
363
364CRYPTOR_KEY(RC2, 1, 16,	0x88, 0xbc, 0xa9, 0x0e, 0x90, 0x87, 0x5a, 0x7f,
365			0x0f, 0x79, 0xc3, 0x84, 0x62, 0x7b, 0xaf, 0xb2)
366CRYPTOR_PT(RC2,  1, 8,	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00)
367CRYPTOR_CT(RC2,	 1, 8,	0x22, 0x69, 0x55, 0x2a, 0xb0, 0xf8, 0x5c, 0xa6)
368
369CRYPTOR_TEST(RC2, 2)
370#endif
371
372/*
373 * Blowfish Test Vectors.
374 */
375CRYPTOR_KEY(bf_ecb, 0, 8,	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00)
376CRYPTOR_PT(bf_ecb,  0, 8,	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00)
377CRYPTOR_CT(bf_ecb,  0, 8,	0x4E, 0xF9, 0x97, 0x45, 0x61, 0x98, 0xDD, 0x78)
378
379CRYPTOR_KEY(bf_ecb, 1, 8,	0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF)
380CRYPTOR_PT(bf_ecb,  1, 8,	0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF)
381CRYPTOR_CT(bf_ecb,  1, 8,	0x51, 0x86, 0x6F, 0xD5, 0xB8, 0x5E, 0xCB, 0x8A)
382
383CRYPTOR_KEY(bf_ecb, 2, 8,	0x30, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00)
384CRYPTOR_PT(bf_ecb,  2, 8,	0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01)
385CRYPTOR_CT(bf_ecb,  2, 8,	0x7D, 0x85, 0x6F, 0x9A, 0x61, 0x30, 0x63, 0xF2)
386
387CRYPTOR_TEST(bf_ecb, 3)
388
389/*
390 * TDES (Triple Data Encryption Standard - NIST Special Pub 800-67) custom test.
391 *
392 * Test vectors are from Jeroen C. van Gelderen.
393 */
394CRYPTOR_KEY(des_ede3_ecb, 0, 24,	0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,
395					0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,
396					0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01)
397CRYPTOR_PT(des_ede3_ecb,  0, 8,		0x95,0xF8,0xA5,0xE5,0xDD,0x31,0xD9,0x00)
398CRYPTOR_CT(des_ede3_ecb,  0, 8,		0x80,0x00,0x00,0x00,0x00,0x00,0x00,0x00)
399
400CRYPTOR_KEY(des_ede3_ecb, 1, 24,	0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,
401					0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,
402					0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01)
403CRYPTOR_PT(des_ede3_ecb,  1, 8,		0x9D,0x64,0x55,0x5A,0x9A,0x10,0xB8,0x52)
404CRYPTOR_CT(des_ede3_ecb,  1, 8,		0x00,0x00,0x00,0x10,0x00,0x00,0x00,0x00)
405
406CRYPTOR_KEY(des_ede3_ecb, 2, 24,	0x38,0x49,0x67,0x4C,0x26,0x02,0x31,0x9E,
407    					0x38,0x49,0x67,0x4C,0x26,0x02,0x31,0x9E,
408					0x38,0x49,0x67,0x4C,0x26,0x02,0x31,0x9E)
409CRYPTOR_PT(des_ede3_ecb,  2, 8,		0x51,0x45,0x4B,0x58,0x2D,0xDF,0x44,0x0A)
410CRYPTOR_CT(des_ede3_ecb,  2, 8,		0x71,0x78,0x87,0x6E,0x01,0xF1,0x9B,0x2A)
411
412CRYPTOR_KEY(des_ede3_ecb, 3, 24,	0x04,0xB9,0x15,0xBA,0x43,0xFE,0xB5,0xB6,
413					0x04,0xB9,0x15,0xBA,0x43,0xFE,0xB5,0xB6,
414					0x04,0xB9,0x15,0xBA,0x43,0xFE,0xB5,0xB6)
415CRYPTOR_PT(des_ede3_ecb,  3, 8,		0x42,0xFD,0x44,0x30,0x59,0x57,0x7F,0xA2)
416CRYPTOR_CT(des_ede3_ecb,  3, 8,		0xAF,0x37,0xFB,0x42,0x1F,0x8C,0x40,0x95)
417
418CRYPTOR_KEY(des_ede3_ecb, 4, 24,	0x01,0x23,0x45,0x67,0x89,0xAB,0xCD,0xEF,
419					0x01,0x23,0x45,0x67,0x89,0xAB,0xCD,0xEF,
420					0x01,0x23,0x45,0x67,0x89,0xAB,0xCD,0xEF)
421CRYPTOR_PT(des_ede3_ecb,  4, 8,		0x73,0x6F,0x6D,0x65,0x64,0x61,0x74,0x61)
422CRYPTOR_CT(des_ede3_ecb,  4, 8,		0x3D,0x12,0x4F,0xE2,0x19,0x8B,0xA3,0x18)
423
424CRYPTOR_KEY(des_ede3_ecb, 5, 24,	0x01,0x23,0x45,0x67,0x89,0xAB,0xCD,0xEF,
425					0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,
426					0x01,0x23,0x45,0x67,0x89,0xAB,0xCD,0xEF)
427CRYPTOR_PT(des_ede3_ecb,  5, 8,		0x73,0x6F,0x6D,0x65,0x64,0x61,0x74,0x61)
428CRYPTOR_CT(des_ede3_ecb,  5, 8,		0xFB,0xAB,0xA1,0xFF,0x9D,0x05,0xE9,0xB1)
429
430CRYPTOR_KEY(des_ede3_ecb, 6, 24, 	0x01,0x23,0x45,0x67,0x89,0xAB,0xCD,0xEF,
431					0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,
432					0xFE,0xDC,0xBA,0x98,0x76,0x54,0x32,0x10)
433CRYPTOR_PT(des_ede3_ecb,  6, 8,		0x73,0x6F,0x6D,0x65,0x64,0x61,0x74,0x61)
434CRYPTOR_CT(des_ede3_ecb,  6, 8,		0x18,0xd7,0x48,0xe5,0x63,0x62,0x05,0x72)
435
436CRYPTOR_KEY(des_ede3_ecb, 7, 24,	0x03,0x52,0x02,0x07,0x67,0x20,0x82,0x17,
437					0x86,0x02,0x87,0x66,0x59,0x08,0x21,0x98,
438					0x64,0x05,0x6A,0xBD,0xFE,0xA9,0x34,0x57)
439CRYPTOR_PT(des_ede3_ecb,  7, 8,		0x73,0x71,0x75,0x69,0x67,0x67,0x6C,0x65)
440CRYPTOR_CT(des_ede3_ecb,  7, 8,		0xc0,0x7d,0x2a,0x0f,0xa5,0x66,0xfa,0x30)
441
442CRYPTOR_KEY(des_ede3_ecb, 8, 24, 	0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,
443					0x80,0x01,0x01,0x01,0x01,0x01,0x01,0x01,
444					0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x02)
445CRYPTOR_PT(des_ede3_ecb,  8, 8,		0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00)
446CRYPTOR_CT(des_ede3_ecb,  8, 8,		0xe6,0xe6,0xdd,0x5b,0x7e,0x72,0x29,0x74)
447
448CRYPTOR_KEY(des_ede3_ecb, 9, 24,	0x10,0x46,0x10,0x34,0x89,0x98,0x80,0x20,
449					0x91,0x07,0xD0,0x15,0x89,0x19,0x01,0x01,
450					0x19,0x07,0x92,0x10,0x98,0x1A,0x01,0x01)
451CRYPTOR_PT(des_ede3_ecb,  9, 8,		0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00)
452CRYPTOR_CT(des_ede3_ecb,  9, 8,		0xe1,0xef,0x62,0xc3,0x32,0xfe,0x82,0x5b)
453
454CRYPTOR_TEST(des_ede3_ecb, 3)
455
456
457/*
458 * RC4 test vecotors.
459 */
460CRYPTOR_KEY(rc4, 0, 8,		0x01,0x23,0x45,0x67,0x89,0xab,0xcd,0xef)
461CRYPTOR_PT(rc4,  0, 8,		0x01,0x23,0x45,0x67,0x89,0xab,0xcd,0xef)
462CRYPTOR_CT(rc4,  0, 8,		0x75,0xb7,0x87,0x80,0x99,0xe0,0xc5,0x96)
463
464CRYPTOR_KEY(rc4, 1, 8,		0x01,0x23,0x45,0x67,0x89,0xab,0xcd,0xef)
465CRYPTOR_PT(rc4,  1, 8,		0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00)
466CRYPTOR_CT(rc4,  1, 8,		0x74,0x94,0xc2,0xe7,0x10,0x4b,0x08,0x79)
467
468CRYPTOR_KEY(rc4, 2, 8,		0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00)
469CRYPTOR_PT(rc4,  2, 8,		0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00)
470CRYPTOR_CT(rc4,  2, 8,		0xde,0x18,0x89,0x41,0xa3,0x37,0x5d,0x3a)
471
472CRYPTOR_KEY(rc4, 3, 4,		0xef,0x01,0x23,0x45)
473CRYPTOR_PT(rc4,  3, 20,		0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
474				0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
475				0x00,0x00,0x00,0x00)
476CRYPTOR_CT(rc4,  3, 20,		0xd6,0xa1,0x41,0xa7,0xec,0x3c,0x38,0xdf,
477				0xbd,0x61,0x5a,0x11,0x62,0xe1,0xc7,0xba,
478				0x36,0xb6,0x78,0x58)
479
480CRYPTOR_KEY(rc4, 4, 4,		0xef,0x01,0x23,0x45)
481CRYPTOR_PT(rc4,  4, 10,		0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
482				0x00,0x00)
483CRYPTOR_CT(rc4,	 4, 10,		0xd6,0xa1,0x41,0xa7,0xec,0x3c,0x38,0xdf,
484				0xbd,0x61)
485
486CRYPTOR_TEST(rc4, 5)
487
488
489/*
490 * Cryptor test functions array.
491 */
492static testFunction_t cryptorTestFunctions[] = {
493    { testCryptor_aes_128_ecb,	"aes-128-ecb" },
494    { testCryptor_aes_192_ecb,	"aes-192-ecb" },
495    { testCryptor_aes_256_ecb,	"aes-256-ecb" },
496    { testCryptor_des_ecb,	"des-ecb" },
497    { testCryptor_des_ede3_ecb,	"des-ede3-ecb" },
498    { testCryptor_cast5_ecb,	"cast5-ecb" },
499    { testCryptor_rc4,		"rc4" },
500#if 0
501    { testCryptorRC2,	"RC2" },
502#endif
503    { testCryptor_bf_ecb, "Blowfish" },
504};
505#define numCryptorTestFunctions  (sizeof(cryptorTestFunctions) / sizeof(cryptorTestFunctions[0]))
506
507static int
508testAllCryptors(void)
509{
510	unsigned i;
511	int err = 0;
512
513	for (i = 0; i < numCryptorTestFunctions; i++) {
514		if (NULL == cryptorTestFunctions[i].description) continue;
515		if (verbose) printf("[BEGIN] %s\n", cryptorTestFunctions[i].description);
516		err = cryptorTestFunctions[i].funcptr();
517		total++;
518		if (err) {
519			fail++;
520			if (verbose) printf("[FAIL] %s\n", cryptorTestFunctions[i].description);
521		} else {
522			pass++;
523			if (verbose) printf("[PASS] %s\n", cryptorTestFunctions[i].description);
524		}
525	}
526	return (fail);
527}
528
529/***************************************************************************************/
530
531/*
532 * Mode Test Engine.
533 */
534static int _test_mode(evp_alg_t alg, const byteVector_t *key[], const byteVector_t *iv[], const byteVector_t *pt[], const byteVector_t *ct[], const unsigned num_tests)
535{
536	unsigned i;
537	int rv = 0;
538	EVP_CIPHER_CTX ectx, dctx;
539	const EVP_CIPHER  *c = (*alg)();
540
541	if (NULL == c) {
542		printf("cipher not supported\n");
543		return (1);
544	}
545
546	EVP_CIPHER_CTX_init(&ectx);
547	EVP_CIPHER_CTX_init(&dctx);
548
549	/* Setup key */
550	for(i = 0; i < num_tests; i++) {
551		size_t blocksize = (pt[i]->len > ct[i]->len) ? pt[i]->len : ct[i]->len;
552		uint8_t blk1[blocksize], blk2[blocksize];
553
554		if (EVP_CipherInit_ex(&ectx, c, NULL, NULL, NULL, 1) != 1) {
555			if (verbose) printf("vector %u EVP_EncryptInit_ex failed\n", i);
556			continue;
557		}
558		if (EVP_CipherInit_ex(&dctx, c, NULL, NULL, NULL, 0) != 1) {
559			if (verbose) printf("vector %u EVP_DecryptInit_ex failed\n",  i);
560			EVP_CIPHER_CTX_cleanup(&ectx);
561			continue;
562		}
563
564		EVP_CIPHER_CTX_set_key_length(&ectx, key[i]->len);
565		EVP_CIPHER_CTX_set_key_length(&dctx, key[i]->len);
566
567		if (EVP_CipherInit_ex(&ectx, c, NULL, key[i]->value, iv[i]->value, 1) != 1) {
568			if (verbose) printf("vector %u EVP_EncryptInit_ex w/ key failed\n", i);
569			EVP_CIPHER_CTX_cleanup(&ectx);
570			EVP_CIPHER_CTX_cleanup(&dctx);
571			continue;
572		}
573		if (EVP_CipherInit_ex(&dctx, c, NULL, key[i]->value, iv[i]->value, 0) != 1) {
574			if (verbose) printf("vector %u EVP_DecryptInit_ex w/ key failed\n",  i);
575			EVP_CIPHER_CTX_cleanup(&ectx);
576			EVP_CIPHER_CTX_cleanup(&dctx);
577			continue;
578		}
579
580
581
582		/* Encrypt and decrypt. */
583		if (!EVP_Cipher(&ectx, blk1, pt[i]->value, blocksize)) {
584			if (verbose) printf("encrypting failed on vector %u\n", i);
585			rv = 1;
586			goto done;
587		}
588		if (memcmp(blk1, ct[i]->value, blocksize) != 0) {
589#if 0
590			char *s1, *s2;
591
592			if (verbose) {
593				hex_encode(blk1, blocksize, &s1);
594				hex_encode(ct[i]->value, blocksize, &s2);
595
596				printf("vector %d encrypt not the same: %s != %s\n", (int)i, s1, s2);
597			}
598#else
599			if (verbose) printf("vector %u encrypt not the same\n", i);
600#endif
601			rv = 1;
602			goto done;
603		}
604
605		if (!EVP_Cipher(&dctx, blk2, blk1, blocksize)) {
606			if (verbose) printf("decrypting failed on vector %u\n", i);
607			rv = 1;
608			goto done;
609		}
610		if (memcmp(blk2, pt[i]->value, blocksize) != 0) {
611#if 0
612			char *s1, *s2;
613
614			if (verbose) {
615				hex_encode(blk2, blocksize, &s1);
616				hex_encode(pt[i]->value, blocksize, &s2);
617
618				printf("vector %d decrypt not the same: %s != %s\n", (int)i, s1, s2);
619			}
620#else
621			if (verbose) printf("vector %u encrypt not the same\n", i);
622#endif
623			rv = 1;
624			goto done;
625		}
626
627done:
628		EVP_CIPHER_CTX_cleanup(&ectx);
629		EVP_CIPHER_CTX_cleanup(&dctx);
630	}
631
632	return (rv);
633}
634
635/*
636 * Test Vector Macros:
637 *
638 * MODE_KEY() is the key for the cryptor (in hex).
639 * MODE_IV() is the initialization vector (in hex).
640 * Parameters: (<Mode Name>, <vector #>, <key length>,  <vector data>)
641 *
642 * MODE_PT() is the plaintext (in hex).
643 * MODE_CT() is the ciphertext digest (in hex).
644 * Parameters: (<Mode Name>, <vector #>, <vector size>, <vector data>)
645 */
646#define	MODE_KEY(NAME, N, LEN, VALUE...) static byteVector_t	NAME ## _mode_key_ ## N = \
647						{ LEN, { VALUE } };
648#define	MODE_IV(NAME, N, LEN, VALUE...) static byteVector_t	NAME ## _mode_iv_ ## N = \
649						{ LEN, { VALUE } };
650#define	MODE_PT(NAME, N, LEN, VALUE...)	static byteVector_t	NAME ## _mode_pt_ ## N = \
651						{ LEN, { VALUE } };
652#define	MODE_CT(NAME, N, LEN, VALUE...)	static byteVector_t	NAME ## _mode_ct_ ## N = \
653						{ LEN, { VALUE } };
654
655/*
656 * MODE_TEST() generates the testing code stub.
657 * Parameters: (<Mode Name>, <Number of test vectors>)
658 */
659#define	MODE_TEST(ALG_NAME, NUM_TESTS) 							\
660static byteVector_t * ALG_NAME ## _mode_key_vects[] =					\
661	{ ARRAY_FOR_ ## NUM_TESTS (& ALG_NAME ## _mode_key_ ) NULL };			\
662											\
663static byteVector_t * ALG_NAME ## _mode_iv_vects[] =					\
664	{ ARRAY_FOR_ ## NUM_TESTS (& ALG_NAME ## _mode_iv_ ) NULL };			\
665											\
666static byteVector_t * ALG_NAME ## _mode_pt_vects[] =					\
667	{ ARRAY_FOR_ ## NUM_TESTS (& ALG_NAME ## _mode_pt_ ) NULL };			\
668											\
669static byteVector_t * ALG_NAME ## _mode_ct_vects[] =					\
670	{ ARRAY_FOR_ ## NUM_TESTS (& ALG_NAME ## _mode_ct_ ) NULL };			\
671											\
672static int testMode_ ## ALG_NAME(void) {							\
673	return (_test_mode(EVP_ ## ALG_NAME, ALG_NAME ## _mode_key_vects,		\
674		ALG_NAME ## _mode_iv_vects, ALG_NAME ## _mode_pt_vects,			\
675		ALG_NAME ## _mode_ct_vects, NUM_TESTS));				\
676}
677
678#if 0
679/*
680 * Counter (CTR) Mode Test Vectors.
681 * From http://csrc.nist.gov/publications/nistpubs/800-38a/sp800-38a.pdf
682 */
683MODE_KEY(CTR, 0, 16,	0x2b,0x7e,0x15,0x16,0x28,0xae,0xd2,0xa6,0xab,0xf7,0x15,0x88,0x09,0xcf,0x4f,0x3c)
684MODE_IV(CTR,  0, 16,	0xf0,0xf1,0xf2,0xf3,0xf4,0xf5,0xf6,0xf7,0xf8,0xf9,0xfa,0xfb,0xfc,0xfd,0xfe,0xff)
685MODE_PT(CTR,  0, 16,	0x6b,0xc1,0xbe,0xe2,0x2e,0x40,0x9f,0x96,0xe9,0x3d,0x7e,0x11,0x73,0x93,0x17,0x2a)
686MODE_CT(CTR,  0, 16, 	0x87,0x4d,0x61,0x91,0xb6,0x20,0xe3,0x26,0x1b,0xef,0x68,0x64,0x99,0x0d,0xb6,0xce)
687
688MODE_KEY(CTR, 1, 24,	0x8e,0x73,0xb0,0xf7,0xda,0x0e,0x64,0x52,0xc8,0x10,0xf3,0x2b,0x80,0x90,0x79,0xe5,
689			0x62,0xf8,0xea,0xd2,0x52,0x2c,0x6b,0x7b)
690MODE_IV(CTR,  1, 16,	0xf0,0xf1,0xf2,0xf3,0xf4,0xf5,0xf6,0xf7,0xf8,0xf9,0xfa,0xfb,0xfc,0xfd,0xfe,0xff)
691MODE_PT(CTR,  1, 16,	0x6b,0xc1,0xbe,0xe2,0x2e,0x40,0x9f,0x96,0xe9,0x3d,0x7e,0x11,0x73,0x93,0x17,0x2a)
692MODE_CT(CTR,  1, 16,	0x1a,0xbc,0x93,0x24,0x17,0x52,0x1c,0xa2,0x4f,0x2b,0x04,0x59,0xfe,0x7e,0x6e,0x0b)
693
694MODE_KEY(CTR, 2, 32,	0x60,0x3d,0xeb,0x10,0x15,0xca,0x71,0xbe,0x2b,0x73,0xae,0xf0,0x85,0x7d,0x77,0x81,
695			0x1f,0x35,0x2c,0x07,0x3b,0x61,0x08,0xd7,0x2d,0x98,0x10,0xa3,0x09,0x14,0xdf,0xf4)
696MODE_IV(CTR,  2, 16,	0xf0,0xf1,0xf2,0xf3,0xf4,0xf5,0xf6,0xf7,0xf8,0xf9,0xfa,0xfb,0xfc,0xfd,0xfe,0xff)
697MODE_PT(CTR,  2, 16,	0x6b,0xc1,0xbe,0xe2,0x2e,0x40,0x9f,0x96,0xe9,0x3d,0x7e,0x11,0x73,0x93,0x17,0x2a)
698MODE_CT(CTR,  2, 16,	0x60,0x1e,0xc3,0x13,0x77,0x57,0x89,0xa5,0xb7,0xa7,0xf5,0x04,0xbb,0xf3,0xd2,0x28)
699
700MODE_TEST(CTR, 3)
701#endif
702
703
704/*
705 * Electronic Codebook (ECB) Mode Test Vectors.
706 * (The IV vectors are not used.)
707 */
708MODE_KEY(aes_128_ecb, 0, 16,	0x80,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00)
709MODE_IV(aes_128_ecb,  0, 1,	0x00)
710MODE_PT(aes_128_ecb,  0, 16,	0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00)
711MODE_CT(aes_128_ecb,  0, 16, 	0x0e,0xdd,0x33,0xd3,0xc6,0x21,0xe5,0x46,0x45,0x5b,0xd8,0xba,0x14,0x18,0xbe,0xc8)
712
713MODE_KEY(aes_128_ecb, 1, 16,	0x00,0x01,0x02,0x03,0x04,0x05,0x06,0x07,0x08,0x09,0x0a,0x0b,0x0c,0x0d,0x0e,0x0f)
714MODE_IV(aes_128_ecb,  1, 1,	0x00)
715MODE_PT(aes_128_ecb,  1, 16,	0x00,0x11,0x22,0x33,0x44,0x55,0x66,0x77,0x88,0x99,0xaa,0xbb,0xcc,0xdd,0xee,0xff)
716MODE_CT(aes_128_ecb,  1, 16,	0x69,0xc4,0xe0,0xd8,0x6a,0x7b,0x04,0x30,0xd8,0xcd,0xb7,0x80,0x70,0xb4,0xc5,0x5a)
717MODE_TEST(aes_128_ecb, 2)
718
719MODE_KEY(aes_192_ecb, 0, 24,	0x00,0x01,0x02,0x03,0x04,0x05,0x06,0x07,0x08,0x09,0x0a,0x0b,0x0c,0x0d,0x0e,0x0f,
720			0x10,0x11,0x12,0x13,0x14,0x15,0x16,0x17)
721MODE_IV(aes_192_ecb,  0, 1,	0x00)
722MODE_PT(aes_192_ecb,  0, 16,	0x00,0x11,0x22,0x33,0x44,0x55,0x66,0x77,0x88,0x99,0xaa,0xbb,0xcc,0xdd,0xee,0xff)
723MODE_CT(aes_192_ecb,  0, 16,	0xdd,0xa9,0x7c,0xa4,0x86,0x4c,0xdf,0xe0,0x6e,0xaf,0x70,0xa0,0xec,0x0d,0x71,0x91)
724MODE_TEST(aes_192_ecb, 1)
725
726MODE_KEY(aes_256_ecb, 0, 32,	0x00,0x01,0x02,0x03,0x04,0x05,0x06,0x07,0x08,0x09,0x0a,0x0b,0x0c,0x0d,0x0e,0x0f,
727			0x10,0x11,0x12,0x13,0x14,0x15,0x16,0x17,0x18,0x19,0x1a,0x1b,0x1c,0x1d,0x1e,0x1f)
728MODE_IV(aes_256_ecb,  0, 1,	0x00)
729MODE_PT(aes_256_ecb,  0, 16,	0x00,0x11,0x22,0x33,0x44,0x55,0x66,0x77,0x88,0x99,0xaa,0xbb,0xcc,0xdd,0xee,0xff)
730MODE_CT(aes_256_ecb,  0, 16,	0x8e,0xa2,0xb7,0xca,0x51,0x67,0x45,0xbf,0xea,0xfc,0x49,0x90,0x4b,0x49,0x60,0x89)
731MODE_TEST(aes_256_ecb, 1)
732
733/*
734 * Cipher Block Chaining (CBC) Mode Test Vectors.
735 * From http://csrc.nist.gov/publications/nistpubs/800-38a/sp800-38a.pdf
736 */
737MODE_KEY(aes_128_cbc, 0, 16,	0x2b,0x7e,0x15,0x16,0x28,0xae,0xd2,0xa6,0xab,0xf7,0x15,0x88,0x09,0xcf,0x4f,0x3c)
738MODE_IV(aes_128_cbc,  0, 16,	0x00,0x01,0x02,0x03,0x04,0x05,0x06,0x07,0x08,0x09,0x0a,0x0b,0x0c,0x0d,0x0e,0x0f)
739MODE_PT(aes_128_cbc,  0, 16,	0x6b,0xc1,0xbe,0xe2,0x2e,0x40,0x9f,0x96,0xe9,0x3d,0x7e,0x11,0x73,0x93,0x17,0x2a)
740MODE_CT(aes_128_cbc,  0, 16,	0x76,0x49,0xab,0xac,0x81,0x19,0xb2,0x46,0xce,0xe9,0x8e,0x9b,0x12,0xe9,0x19,0x7d)
741MODE_TEST(aes_128_cbc, 1)
742
743MODE_KEY(aes_192_cbc, 0, 24,	0x8e,0x73,0xb0,0xf7,0xda,0x0e,0x64,0x52,0xc8,0x10,0xf3,0x2b,0x80,0x90,0x79,0xe5,
744			0x62,0xf8,0xea,0xd2,0x52,0x2c,0x6b,0x7b)
745MODE_IV(aes_192_cbc,  0, 16,	0x00,0x01,0x02,0x03,0x04,0x05,0x06,0x07,0x08,0x09,0x0a,0x0b,0x0c,0x0d,0x0e,0x0f)
746MODE_PT(aes_192_cbc,  0, 16,	0x6b,0xc1,0xbe,0xe2,0x2e,0x40,0x9f,0x96,0xe9,0x3d,0x7e,0x11,0x73,0x93,0x17,0x2a)
747MODE_CT(aes_192_cbc,  0, 16,	0x4f,0x02,0x1d,0xb2,0x43,0xbc,0x63,0x3d,0x71,0x78,0x18,0x3a,0x9f,0xa0,0x71,0xe8)
748MODE_TEST(aes_192_cbc, 1)
749
750
751MODE_KEY(aes_256_cbc, 0, 32,	0x60,0x3d,0xeb,0x10,0x15,0xca,0x71,0xbe,0x2b,0x73,0xae,0xf0,0x85,0x7d,0x77,0x81,
752			0x1f,0x35,0x2c,0x07,0x3b,0x61,0x08,0xd7,0x2d,0x98,0x10,0xa3,0x09,0x14,0xdf,0xf4)
753MODE_IV(aes_256_cbc,  0, 16,	0x00,0x01,0x02,0x03,0x04,0x05,0x06,0x07,0x08,0x09,0x0a,0x0b,0x0c,0x0d,0x0e,0x0f)
754MODE_PT(aes_256_cbc,  0, 16,	0x6b,0xc1,0xbe,0xe2,0x2e,0x40,0x9f,0x96,0xe9,0x3d,0x7e,0x11,0x73,0x93,0x17,0x2a)
755MODE_CT(aes_256_cbc,  0, 16,	0xf5,0x8c,0x4c,0x04,0xd6,0xe5,0xf1,0xba,0x77,0x9e,0xab,0xfb,0x5f,0x7b,0xfb,0xd6)
756MODE_TEST(aes_256_cbc, 1)
757
758#if 0
759/*
760 * Cipher Feedback Block, 128 bit (CFB128) Mode Test Vectors.
761 * From http://csrc.nist.gov/publications/nistpubs/800-38a/sp800-38a.pdf
762 */
763MODE_KEY(CFB, 0, 16,	0x2b,0x7e,0x15,0x16,0x28,0xae,0xd2,0xa6,0xab,0xf7,0x15,0x88,0x09,0xcf,0x4f,0x3c)
764MODE_IV(CFB,  0, 16,	0x00,0x01,0x02,0x03,0x04,0x05,0x06,0x07,0x08,0x09,0x0a,0x0b,0x0c,0x0d,0x0e,0x0f)
765MODE_PT(CFB,  0, 16,	0x6b,0xc1,0xbe,0xe2,0x2e,0x40,0x9f,0x96,0xe9,0x3d,0x7e,0x11,0x73,0x93,0x17,0x2a)
766MODE_CT(CFB,  0, 16,	0x3b,0x3f,0xd9,0x2e,0xb7,0x2d,0xad,0x20,0x33,0x34,0x49,0xf8,0xe8,0x3c,0xfb,0x4a)
767
768MODE_KEY(CFB, 1, 24,	0x8e,0x73,0xb0,0xf7,0xda,0x0e,0x64,0x52,0xc8,0x10,0xf3,0x2b,0x80,0x90,0x79,0xe5,
769			0x62,0xf8,0xea,0xd2,0x52,0x2c,0x6b,0x7b)
770MODE_IV(CFB,  1, 16,	0x00,0x01,0x02,0x03,0x04,0x05,0x06,0x07,0x08,0x09,0x0a,0x0b,0x0c,0x0d,0x0e,0x0f)
771MODE_PT(CFB,  1, 16,	0x6b,0xc1,0xbe,0xe2,0x2e,0x40,0x9f,0x96,0xe9,0x3d,0x7e,0x11,0x73,0x93,0x17,0x2a)
772MODE_CT(CFB,  1, 16,	0xcd,0xc8,0x0d,0x6f,0xdd,0xf1,0x8c,0xab,0x34,0xc2,0x59,0x09,0xc9,0x9a,0x41,0x74)
773
774MODE_KEY(CFB, 2, 32,	0x60,0x3d,0xeb,0x10,0x15,0xca,0x71,0xbe,0x2b,0x73,0xae,0xf0,0x85,0x7d,0x77,0x81,
775			0x1f,0x35,0x2c,0x07,0x3b,0x61,0x08,0xd7,0x2d,0x98,0x10,0xa3,0x09,0x14,0xdf,0xf4)
776MODE_IV(CFB,  2, 16,	0x00,0x01,0x02,0x03,0x04,0x05,0x06,0x07,0x08,0x09,0x0a,0x0b,0x0c,0x0d,0x0e,0x0f)
777MODE_PT(CFB,  2, 16,	0x6b,0xc1,0xbe,0xe2,0x2e,0x40,0x9f,0x96,0xe9,0x3d,0x7e,0x11,0x73,0x93,0x17,0x2a)
778MODE_CT(CFB,  2, 16,	0xdc,0x7e,0x84,0xbf,0xda,0x79,0x16,0x4b,0x7e,0xcd,0x84,0x86,0x98,0x5d,0x38,0x60)
779
780MODE_TEST(CFB, 3)
781
782/*
783 * Output Feedback Block (OFB) Mode Test Vectors.
784 * From http://csrc.nist.gov/publications/nistpubs/800-38a/sp800-38a.pdf
785 */
786MODE_KEY(OFB, 0, 16,	0x2b,0x7e,0x15,0x16,0x28,0xae,0xd2,0xa6,0xab,0xf7,0x15,0x88,0x09,0xcf,0x4f,0x3c)
787MODE_IV(OFB,  0, 16,	0x00,0x01,0x02,0x03,0x04,0x05,0x06,0x07,0x08,0x09,0x0a,0x0b,0x0c,0x0d,0x0e,0x0f)
788MODE_PT(OFB,  0, 16,	0x6b,0xc1,0xbe,0xe2,0x2e,0x40,0x9f,0x96,0xe9,0x3d,0x7e,0x11,0x73,0x93,0x17,0x2a)
789MODE_CT(OFB,  0, 16,	0x3b,0x3f,0xd9,0x2e,0xb7,0x2d,0xad,0x20,0x33,0x34,0x49,0xf8,0xe8,0x3c,0xfb,0x4a)
790
791MODE_KEY(OFB, 1, 24,	0x8e,0x73,0xb0,0xf7,0xda,0x0e,0x64,0x52,0xc8,0x10,0xf3,0x2b,0x80,0x90,0x79,0xe5,
792			0x62,0xf8,0xea,0xd2,0x52,0x2c,0x6b,0x7b)
793MODE_IV(OFB,  1, 16,	0x00,0x01,0x02,0x03,0x04,0x05,0x06,0x07,0x08,0x09,0x0a,0x0b,0x0c,0x0d,0x0e,0x0f)
794MODE_PT(OFB,  1, 16,	0x6b,0xc1,0xbe,0xe2,0x2e,0x40,0x9f,0x96,0xe9,0x3d,0x7e,0x11,0x73,0x93,0x17,0x2a)
795MODE_CT(OFB,  1, 16,	0xcd,0xc8,0x0d,0x6f,0xdd,0xf1,0x8c,0xab,0x34,0xc2,0x59,0x09,0xc9,0x9a,0x41,0x74)
796
797MODE_KEY(OFB, 2, 32,	0x60,0x3d,0xeb,0x10,0x15,0xca,0x71,0xbe,0x2b,0x73,0xae,0xf0,0x85,0x7d,0x77,0x81,
798			0x1f,0x35,0x2c,0x07,0x3b,0x61,0x08,0xd7,0x2d,0x98,0x10,0xa3,0x09,0x14,0xdf,0xf4)
799MODE_IV(OFB,  2, 16,	0x00,0x01,0x02,0x03,0x04,0x05,0x06,0x07,0x08,0x09,0x0a,0x0b,0x0c,0x0d,0x0e,0x0f)
800MODE_PT(OFB,  2, 16,	0x6b,0xc1,0xbe,0xe2,0x2e,0x40,0x9f,0x96,0xe9,0x3d,0x7e,0x11,0x73,0x93,0x17,0x2a)
801MODE_CT(OFB,  2, 16,	0xdc,0x7e,0x84,0xbf,0xda,0x79,0x16,0x4b,0x7e,0xcd,0x84,0x86,0x98,0x5d,0x38,0x60)
802
803MODE_TEST(OFB, 3)
804#endif /* #if 0 */
805
806/*
807 * Cipher Feedback Block, 8 bit (CFB8) Mode Test Vectors.
808 * From http://csrc.nist.gov/publications/nistpubs/800-38a/sp800-38a.pdf
809 */
810MODE_KEY(aes_128_cfb8, 0, 16,	0x2b,0x7e,0x15,0x16,0x28,0xae,0xd2,0xa6,0xab,0xf7,0x15,0x88,0x09,0xcf,0x4f,0x3c)
811MODE_IV(aes_128_cfb8,  0, 16,	0x00,0x01,0x02,0x03,0x04,0x05,0x06,0x07,0x08,0x09,0x0a,0x0b,0x0c,0x0d,0x0e,0x0f)
812MODE_PT(aes_128_cfb8,  0, 1,	0x6b)
813MODE_CT(aes_128_cfb8,  0, 1,	0x3b)
814
815MODE_KEY(aes_128_cfb8, 1, 16,	0xdf,0x54,0xa7,0x0f,0x60,0xbd,0xe2,0x2f,0xc6,0x7a,0x23,0x49,0x25,0x9e,0x3c,0xb4)
816MODE_IV(aes_128_cfb8,  1, 16,	0x01,0x40,0xe1,0x94,0xac,0xfe,0xa9,0x77,0x8e,0xf5,0x2e,0xe8,0x78,0xbf,0x73,0x70)
817MODE_PT(aes_128_cfb8,  1, 2,	0xed,0xe4)
818MODE_CT(aes_128_cfb8,  1, 2,	0xa5,0x6f)
819MODE_TEST(aes_128_cfb8, 2)
820
821MODE_KEY(aes_192_cfb8, 0, 24,	0x8e,0x73,0xb0,0xf7,0xda,0x0e,0x64,0x52,0xc8,0x10,0xf3,0x2b,0x80,0x90,0x79,0xe5,
822			0x62,0xf8,0xea,0xd2,0x52,0x2c,0x6b,0x7b)
823MODE_IV(aes_192_cfb8,  0, 16,	0x00,0x01,0x02,0x03,0x04,0x05,0x06,0x07,0x08,0x09,0x0a,0x0b,0x0c,0x0d,0x0e,0x0f)
824MODE_PT(aes_192_cfb8,  0, 1,	0x6b)
825MODE_CT(aes_192_cfb8,  0, 1,	0xcd)
826MODE_TEST(aes_192_cfb8, 1)
827
828MODE_KEY(aes_256_cfb8, 0, 32,	0x60,0x3d,0xeb,0x10,0x15,0xca,0x71,0xbe,0x2b,0x73,0xae,0xf0,0x85,0x7d,0x77,0x81,
829			0x1f,0x35,0x2c,0x07,0x3b,0x61,0x08,0xd7,0x2d,0x98,0x10,0xa3,0x09,0x14,0xdf,0xf4)
830MODE_IV(aes_256_cfb8,  0, 16,	0x00,0x01,0x02,0x03,0x04,0x05,0x06,0x07,0x08,0x09,0x0a,0x0b,0x0c,0x0d,0x0e,0x0f)
831MODE_PT(aes_256_cfb8,  0, 1,	0x6B)
832MODE_CT(aes_256_cfb8,  0, 1,	0xdc)
833MODE_TEST(aes_256_cfb8, 1)
834
835
836#if 0
837/*
838 * RC4 pseudo mode.
839 * (IV vector is not used.)
840 */
841MODE_KEY(RC4, 0, 8,	0x01,0x23,0x45,0x67,0x89,0xab,0xcd,0xef)
842MODE_IV(RC4,  0, 1,	0x00)
843MODE_PT(RC4,  0, 8,	0x01,0x23,0x45,0x67,0x89,0xab,0xcd,0xef)
844MODE_CT(RC4,  0, 8,	0x75,0xb7,0x87,0x80,0x99,0xe0,0xc5,0x96)
845
846MODE_KEY(RC4, 1, 8,	0x01,0x23,0x45,0x67,0x89,0xab,0xcd,0xef)
847MODE_IV(RC4,  1, 1,	0x00)
848MODE_PT(RC4,  1, 8,	0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00)
849MODE_CT(RC4,  1, 8,	0x74,0x94,0xc2,0xe7,0x10,0x4b,0x08,0x79)
850
851MODE_KEY(RC4, 2, 8,	0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00)
852MODE_IV(RC4,  2, 1,	0x00)
853MODE_PT(RC4,  2, 8,	0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00)
854MODE_CT(RC4,  2, 8,	0xde,0x18,0x89,0x41,0xa3,0x37,0x5d,0x3a)
855
856MODE_KEY(RC4, 3, 4,	0xef,0x01,0x23,0x45)
857MODE_IV(RC4,  3, 1,	0x00)
858MODE_PT(RC4,  3, 20,	0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
859			0x00,0x00,0x00,0x00)
860MODE_CT(RC4,  3, 20,	0xd6,0xa1,0x41,0xa7,0xec,0x3c,0x38,0xdf,0xbd,0x61,0x5a,0x11,0x62,0xe1,0xc7,0xba,
861			0x36,0xb6,0x78,0x58)
862
863MODE_KEY(RC4, 4, 4,	0xef,0x01,0x23,0x45)
864MODE_IV(RC4,  4, 1,	0x00)
865MODE_PT(RC4,  4, 10,	0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00)
866MODE_CT(RC4,  4, 10,	0xd6,0xa1,0x41,0xa7,0xec,0x3c,0x38,0xdf,0xbd,0x61)
867
868MODE_TEST(RC4, 5)
869
870/*
871 * XTS-AES Mode.
872 * Vectors from http://csrc.nist.gov/groups/STM/cavp/documents/aes/XTSTestVectors.zip
873 */
874MODE_KEY(XTS,  0, 32,	0x46,0xe6,0xed,0x9e,0xf4,0x2d,0xcd,0xb3, /* Combined key */
875			0xc8,0x93,0x09,0x3c,0x28,0xe1,0xfc,0x0f,
876			0x91,0xf5,0xca,0xa3,0xb6,0xe0,0xbc,0x5a,
877			0x14,0xe7,0x83,0x21,0x5c,0x1d,0x5b,0x61)
878MODE_IV(XTS,   0, 16,	0x72,0xf3,0xb0,0x54,0xcb,0xdc,0x2f,0x9e,
879 			0x3c,0x5b,0xc5,0x51,0xd4,0x4d,0xdb,0xa0)
880MODE_PT(XTS,   0, 16, 	0xe3,0x77,0x8d,0x68,0xe7,0x30,0xef,0x94,
881			0x5b,0x4a,0xe3,0xbc,0x5b,0x93,0x6b,0xdd)
882MODE_CT(XTS,   0, 16,	0x97,0x40,0x9f,0x1f,0x71,0xae,0x45,0x21,
883			0xcb,0x49,0xa3,0x29,0x73,0xde,0x4d,0x05)
884
885MODE_KEY(XTS,  1, 32,	0xc1,0x7c,0x37,0x2b,0x56,0x26,0x91,0x6d, /* Combined key */
886			0x98,0xc0,0x26,0x29,0xf5,0xd2,0x76,0x47,
887			0x45,0x57,0xe3,0xfe,0xaa,0x75,0x78,0x36,
888			0x34,0xd5,0x5f,0x15,0x4e,0x0a,0x8d,0x18)
889MODE_IV(XTS,   1, 16,	0xdc,0x05,0x22,0x15,0xba,0x65,0x5c,0xce,
890			0x70,0x7e,0x51,0x3d,0x54,0x3a,0x50,0x85)
891MODE_PT(XTS,   1, 32,	0xe9,0xb9,0xe2,0x9f,0xdf,0xa1,0xaf,0x53,
892			0x5a,0x1e,0xc5,0x0e,0xd9,0x20,0x4f,0x75,
893			0xc6,0x2f,0x40,0xa9,0xa1,0x9e,0x50,0x49,
894			0xcc,0x10,0x48,0xe7,0x04,0x7b,0x8a,0xcb)
895MODE_CT(XTS,   1, 32,	0xb7,0xb4,0x16,0xa5,0x6c,0xc3,0x2f,0x75,
896			0x3c,0x25,0x9b,0x94,0x3e,0xa0,0x7a,0x9d,
897			0xc0,0x30,0x84,0x0c,0x80,0x55,0x83,0x1e,
898			0x22,0x31,0xf7,0xbf,0xbd,0x0a,0x73,0x4b)
899
900MODE_TEST(XTS, 2)
901
902/* XXX Need test vectors for the following: */
903/*
904MODE_NOTEST(F8)
905MODE_NOTEST(LRW)
906*/
907#endif /* #if 0 */
908
909/*
910 * Mode test functions array.
911 */
912static testFunction_t modeTestFunctions[] = {
913    { testMode_aes_128_ecb,	"aes-128-ecb" },
914    { testMode_aes_192_ecb,	"aes-192-ecb" },
915    { testMode_aes_256_ecb,	"aes-256-ecb" },
916    { testMode_aes_128_cbc,	"aes-128-cbc" },
917    { testMode_aes_192_cbc,	"aes-192-cbc" },
918    { testMode_aes_256_cbc,	"aes-256-cbc" },
919#if 0
920    { testModeCFB,	"CFB" },
921    { testModeCTR,	"CTR" },
922    { testModeF8,	"F8" },
923    { testModeLRW,	"LRW" },
924    { testModeOFB,	"OFB" },
925    { testModeXTS,	"XTS" },
926    { testModeRC4,	"RC4" },
927#endif
928    { testMode_aes_128_cfb8,	"aes-128-cfb8" },
929    { testMode_aes_192_cfb8,	"aes-192-cfb8" },
930    { testMode_aes_256_cfb8,	"aes-256-cfb8" },
931};
932#define	numModeTestFunctions	(sizeof(modeTestFunctions) / sizeof(modeTestFunctions[0]))
933
934static int
935testAllModes(void)
936{
937	unsigned i;
938	int err = 0;
939	int prev_fail = fail;
940
941	for (i = 0; i < numModeTestFunctions; i++) {
942		if (NULL == modeTestFunctions[i].description) continue;
943		if (verbose) printf("[BEGIN] %s\n",  modeTestFunctions[i].description);
944		err = modeTestFunctions[i].funcptr();
945		total++;
946		if (err) {
947			fail++;
948			if (verbose) printf("[FAIL] %s\n", modeTestFunctions[i].description);
949		} else {
950			pass++;
951			if (verbose) printf("[PASS] %s\n", modeTestFunctions[i].description);
952		}
953	}
954	return (fail - prev_fail);
955}
956
957
958static struct option args[] = {
959	{ "help",	no_argument,	NULL,	'h' },
960	{ "quite",	no_argument,	NULL, 	'q' },
961	{ 0, 0, 0, 0 }
962};
963
964static void
965usage (int ret)
966{
967    fprintf(stderr, "usage: %s [--quite/-q] [--help/-h]\n", getprogname());
968    exit (ret);
969}
970
971int
972main(int argc, char **argv)
973{
974    int i, idx = 0, rv = 0;
975
976    setprogname(argv[0]);
977
978    while(1) {
979	    int c = getopt_long(argc, argv, "hq", args, &idx);
980
981	    if (c == -1)
982		    break;
983	    switch (c) {
984	    case 'q':
985		    verbose = 0;
986		    break;
987	    case 'h':
988		    usage(0);
989		    break;
990	    case '?':
991	    default:
992		    usage(-1);
993		    break;
994	    }
995    }
996
997    /*
998    argc -= idx;
999    argv += idx;
1000    */
1001
1002    if (verbose) printf("[TEST] Cryptor KATs\n");
1003    rv = testAllCryptors() + testAllModes();
1004    if (verbose) {
1005	    printf("[SUMMARY]\n");
1006	    printf("Total: %d\n", total);
1007	    printf("passed: %d\n", pass);
1008	    printf("failed: %d\n", fail);
1009    }
1010
1011    return (rv);
1012}
1013
1014