xref: /netbsd-src/crypto/external/bsd/heimdal/dist/lib/hcrypto/test_cipher.c (revision 4f77a4588e1703bbdbc764de8cc12f0b5c563da9)
1 /*	$NetBSD: test_cipher.c,v 1.1.1.2 2014/04/24 12:45:30 pettai Exp $	*/
2 
3 /*
4  * Copyright (c) 2006 Kungliga Tekniska Högskolan
5  * (Royal Institute of Technology, Stockholm, Sweden).
6  * All rights reserved.
7  *
8  * Redistribution and use in source and binary forms, with or without
9  * modification, are permitted provided that the following conditions
10  * are met:
11  *
12  * 1. Redistributions of source code must retain the above copyright
13  *    notice, this list of conditions and the following disclaimer.
14  *
15  * 2. Redistributions in binary form must reproduce the above copyright
16  *    notice, this list of conditions and the following disclaimer in the
17  *    documentation and/or other materials provided with the distribution.
18  *
19  * 3. Neither the name of the Institute nor the names of its contributors
20  *    may be used to endorse or promote products derived from this software
21  *    without specific prior written permission.
22  *
23  * THIS SOFTWARE IS PROVIDED BY THE INSTITUTE AND CONTRIBUTORS ``AS IS'' AND
24  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
25  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
26  * ARE DISCLAIMED.  IN NO EVENT SHALL THE INSTITUTE OR CONTRIBUTORS BE LIABLE
27  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
28  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
29  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
30  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
31  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
32  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
33  * SUCH DAMAGE.
34  */
35 
36 #include <config.h>
37 
38 #define HC_DEPRECATED_CRYPTO
39 
40 #include <sys/types.h>
41 #include <limits.h>
42 #include <stdio.h>
43 #include <stdlib.h>
44 #include <string.h>
45 #include <krb5/getarg.h>
46 #include <krb5/roken.h>
47 
48 #include <evp.h>
49 #include <evp-hcrypto.h>
50 #include <evp-cc.h>
51 #include <krb5/hex.h>
52 #include <err.h>
53 
54 struct tests {
55     const char *name;
56     void *key;
57     size_t keysize;
58     void *iv;
59     size_t datasize;
60     void *indata;
61     void *outdata;
62     void *outiv;
63 };
64 
65 struct tests aes_tests[] = {
66     { "aes-256",
67       "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"
68       "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00",
69       32,
70       "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00",
71       16,
72       "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00",
73       "\xdc\x95\xc0\x78\xa2\x40\x89\x89\xad\x48\xa2\x14\x92\x84\x20\x87"
74     }
75 };
76 
77 struct tests aes_cfb_tests[] = {
78     { "aes-cfb8-128",
79       "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00",
80       16,
81       "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00",
82       16,
83       "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00",
84       "\x66\xe9\x4b\xd4\xef\x8a\x2c\x3b\x88\x4c\xfa\x59\xca\x34\x2b\x2e"
85     }
86 };
87 
88 struct tests rc2_40_tests[] = {
89     { "rc2-40",
90       "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00",
91       16,
92       "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00",
93       16,
94       "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00",
95       "\xc0\xb8\xff\xa5\xd6\xeb\xc9\x62\xcc\x52\x5f\xfe\x9a\x3c\x97\xe6"
96     }
97 };
98 
99 struct tests des_ede3_tests[] = {
100     { "des-ede3",
101       "\x19\x17\xff\xe6\xbb\x77\x2e\xfc"
102       "\x29\x76\x43\xbc\x63\x56\x7e\x9a"
103       "\x00\x2e\x4d\x43\x1d\x5f\xfd\x58",
104       24,
105       "\xbf\x9a\x12\xb7\x26\x69\xfd\x05",
106       16,
107       "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00",
108       "\x55\x95\x97\x76\xa9\x6c\x66\x40\x64\xc7\xf4\x1c\x21\xb7\x14\x1b"
109     }
110 };
111 
112 struct tests camellia128_tests[] = {
113     { "camellia128",
114       "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00",
115       16,
116       "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00",
117       16,
118       "\x80\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00",
119       "\x07\x92\x3A\x39\xEB\x0A\x81\x7D\x1C\x4D\x87\xBD\xB8\x2D\x1F\x1C",
120       NULL
121     }
122 };
123 
124 struct tests rc4_tests[] = {
125     {
126 	"rc4 8",
127 	"\x01\x23\x45\x67\x89\xAB\xCD\xEF",
128 	8,
129 	NULL,
130 	8,
131 	"\x00\x00\x00\x00\x00\x00\x00\x00",
132 	"\x74\x94\xC2\xE7\x10\x4B\x08\x79",
133 	NULL
134     },
135     {
136 	"rc4 5",
137 	"\x61\x8a\x63\xd2\xfb",
138 	5,
139 	NULL,
140 	5,
141 	"\xdc\xee\x4c\xf9\x2c",
142 	"\xf1\x38\x29\xc9\xde",
143 	NULL
144     },
145     {
146 	"rc4 309",
147 	"\x29\x04\x19\x72\xfb\x42\xba\x5f\xc7\x12\x77\x12\xf1\x38\x29\xc9",
148 	16,
149 	NULL,
150 	309,
151 	"\x52\x75\x69\x73\x6c\x69\x6e\x6e"
152 	"\x75\x6e\x20\x6c\x61\x75\x6c\x75"
153 	"\x20\x6b\x6f\x72\x76\x69\x73\x73"
154 	"\x73\x61\x6e\x69\x2c\x20\x74\xe4"
155 	"\x68\x6b\xe4\x70\xe4\x69\x64\x65"
156 	"\x6e\x20\x70\xe4\xe4\x6c\x6c\xe4"
157 	"\x20\x74\xe4\x79\x73\x69\x6b\x75"
158 	"\x75\x2e\x20\x4b\x65\x73\xe4\x79"
159 	"\xf6\x6e\x20\x6f\x6e\x20\x6f\x6e"
160 	"\x6e\x69\x20\x6f\x6d\x61\x6e\x61"
161 	"\x6e\x69\x2c\x20\x6b\x61\x73\x6b"
162 	"\x69\x73\x61\x76\x75\x75\x6e\x20"
163 	"\x6c\x61\x61\x6b\x73\x6f\x74\x20"
164 	"\x76\x65\x72\x68\x6f\x75\x75\x2e"
165 	"\x20\x45\x6e\x20\x6d\x61\x20\x69"
166 	"\x6c\x6f\x69\x74\x73\x65\x2c\x20"
167 	"\x73\x75\x72\x65\x20\x68\x75\x6f"
168 	"\x6b\x61\x61\x2c\x20\x6d\x75\x74"
169 	"\x74\x61\x20\x6d\x65\x74\x73\xe4"
170 	"\x6e\x20\x74\x75\x6d\x6d\x75\x75"
171 	"\x73\x20\x6d\x75\x6c\x6c\x65\x20"
172 	"\x74\x75\x6f\x6b\x61\x61\x2e\x20"
173 	"\x50\x75\x75\x6e\x74\x6f\x20\x70"
174 	"\x69\x6c\x76\x65\x6e\x2c\x20\x6d"
175 	"\x69\x20\x68\x75\x6b\x6b\x75\x75"
176 	"\x2c\x20\x73\x69\x69\x6e\x74\x6f"
177 	"\x20\x76\x61\x72\x61\x6e\x20\x74"
178 	"\x75\x75\x6c\x69\x73\x65\x6e\x2c"
179 	"\x20\x6d\x69\x20\x6e\x75\x6b\x6b"
180 	"\x75\x75\x2e\x20\x54\x75\x6f\x6b"
181 	"\x73\x75\x74\x20\x76\x61\x6e\x61"
182 	"\x6d\x6f\x6e\x20\x6a\x61\x20\x76"
183 	"\x61\x72\x6a\x6f\x74\x20\x76\x65"
184 	"\x65\x6e\x2c\x20\x6e\x69\x69\x73"
185 	"\x74\xe4\x20\x73\x79\x64\xe4\x6d"
186 	"\x65\x6e\x69\x20\x6c\x61\x75\x6c"
187 	"\x75\x6e\x20\x74\x65\x65\x6e\x2e"
188 	"\x20\x2d\x20\x45\x69\x6e\x6f\x20"
189 	"\x4c\x65\x69\x6e\x6f",
190 	"\x35\x81\x86\x99\x90\x01\xe6\xb5"
191 	"\xda\xf0\x5e\xce\xeb\x7e\xee\x21"
192 	"\xe0\x68\x9c\x1f\x00\xee\xa8\x1f"
193 	"\x7d\xd2\xca\xae\xe1\xd2\x76\x3e"
194 	"\x68\xaf\x0e\xad\x33\xd6\x6c\x26"
195 	"\x8b\xc9\x46\xc4\x84\xfb\xe9\x4c"
196 	"\x5f\x5e\x0b\x86\xa5\x92\x79\xe4"
197 	"\xf8\x24\xe7\xa6\x40\xbd\x22\x32"
198 	"\x10\xb0\xa6\x11\x60\xb7\xbc\xe9"
199 	"\x86\xea\x65\x68\x80\x03\x59\x6b"
200 	"\x63\x0a\x6b\x90\xf8\xe0\xca\xf6"
201 	"\x91\x2a\x98\xeb\x87\x21\x76\xe8"
202 	"\x3c\x20\x2c\xaa\x64\x16\x6d\x2c"
203 	"\xce\x57\xff\x1b\xca\x57\xb2\x13"
204 	"\xf0\xed\x1a\xa7\x2f\xb8\xea\x52"
205 	"\xb0\xbe\x01\xcd\x1e\x41\x28\x67"
206 	"\x72\x0b\x32\x6e\xb3\x89\xd0\x11"
207 	"\xbd\x70\xd8\xaf\x03\x5f\xb0\xd8"
208 	"\x58\x9d\xbc\xe3\xc6\x66\xf5\xea"
209 	"\x8d\x4c\x79\x54\xc5\x0c\x3f\x34"
210 	"\x0b\x04\x67\xf8\x1b\x42\x59\x61"
211 	"\xc1\x18\x43\x07\x4d\xf6\x20\xf2"
212 	"\x08\x40\x4b\x39\x4c\xf9\xd3\x7f"
213 	"\xf5\x4b\x5f\x1a\xd8\xf6\xea\x7d"
214 	"\xa3\xc5\x61\xdf\xa7\x28\x1f\x96"
215 	"\x44\x63\xd2\xcc\x35\xa4\xd1\xb0"
216 	"\x34\x90\xde\xc5\x1b\x07\x11\xfb"
217 	"\xd6\xf5\x5f\x79\x23\x4d\x5b\x7c"
218 	"\x76\x66\x22\xa6\x6d\xe9\x2b\xe9"
219 	"\x96\x46\x1d\x5e\x4d\xc8\x78\xef"
220 	"\x9b\xca\x03\x05\x21\xe8\x35\x1e"
221 	"\x4b\xae\xd2\xfd\x04\xf9\x46\x73"
222 	"\x68\xc4\xad\x6a\xc1\x86\xd0\x82"
223 	"\x45\xb2\x63\xa2\x66\x6d\x1f\x6c"
224 	"\x54\x20\xf1\x59\x9d\xfd\x9f\x43"
225 	"\x89\x21\xc2\xf5\xa4\x63\x93\x8c"
226 	"\xe0\x98\x22\x65\xee\xf7\x01\x79"
227 	"\xbc\x55\x3f\x33\x9e\xb1\xa4\xc1"
228 	"\xaf\x5f\x6a\x54\x7f"
229     }
230 };
231 
232 
233 static int
234 test_cipher(int i, const EVP_CIPHER *c, struct tests *t)
235 {
236     EVP_CIPHER_CTX ectx;
237     EVP_CIPHER_CTX dctx;
238     void *d;
239 
240     if (c == NULL) {
241 	printf("%s not supported\n", t->name);
242 	return 0;
243     }
244 
245     EVP_CIPHER_CTX_init(&ectx);
246     EVP_CIPHER_CTX_init(&dctx);
247 
248     if (EVP_CipherInit_ex(&ectx, c, NULL, NULL, NULL, 1) != 1)
249 	errx(1, "%s: %d EVP_CipherInit_ex einit", t->name, i);
250     if (EVP_CipherInit_ex(&dctx, c, NULL, NULL, NULL, 0) != 1)
251 	errx(1, "%s: %d EVP_CipherInit_ex dinit", t->name, i);
252 
253     EVP_CIPHER_CTX_set_key_length(&ectx, t->keysize);
254     EVP_CIPHER_CTX_set_key_length(&dctx, t->keysize);
255 
256     if (EVP_CipherInit_ex(&ectx, NULL, NULL, t->key, t->iv, 1) != 1)
257 	errx(1, "%s: %d EVP_CipherInit_ex encrypt", t->name, i);
258     if (EVP_CipherInit_ex(&dctx, NULL, NULL, t->key, t->iv, 0) != 1)
259 	errx(1, "%s: %d EVP_CipherInit_ex decrypt", t->name, i);
260 
261     d = emalloc(t->datasize);
262 
263     if (!EVP_Cipher(&ectx, d, t->indata, t->datasize))
264 	return 1;
265 
266     if (memcmp(d, t->outdata, t->datasize) != 0) {
267 	char *s, *s2;
268 	hex_encode(d, t->datasize, &s);
269 	hex_encode(t->outdata, t->datasize, &s2);
270 	errx(1, "%s: %d encrypt not the same: %s != %s", t->name, i, s, s2);
271     }
272 
273     if (!EVP_Cipher(&dctx, d, d, t->datasize))
274 	return 1;
275 
276     if (memcmp(d, t->indata, t->datasize) != 0) {
277 	char *s;
278 	hex_encode(d, t->datasize, &s);
279 	errx(1, "%s: %d decrypt not the same: %s", t->name, i, s);
280     }
281     if (t->outiv)
282 	/* XXXX check  */;
283 
284     EVP_CIPHER_CTX_cleanup(&ectx);
285     EVP_CIPHER_CTX_cleanup(&dctx);
286     free(d);
287 
288     return 0;
289 }
290 
291 static int version_flag;
292 static int help_flag;
293 
294 static struct getargs args[] = {
295     { "version",	0,	arg_flag,	&version_flag,
296       "print version", NULL },
297     { "help",		0,	arg_flag,	&help_flag,
298       NULL, 	NULL }
299 };
300 
301 static void
302 usage (int ret)
303 {
304     arg_printusage (args,
305 		    sizeof(args)/sizeof(*args),
306 		    NULL,
307 		    "");
308     exit (ret);
309 }
310 
311 int
312 main(int argc, char **argv)
313 {
314     int ret = 0;
315     int i, idx = 0;
316 
317     setprogname(argv[0]);
318 
319     if(getarg(args, sizeof(args) / sizeof(args[0]), argc, argv, &idx))
320 	usage(1);
321 
322     if (help_flag)
323 	usage(0);
324 
325     if(version_flag){
326 	print_version(NULL);
327 	exit(0);
328     }
329 
330     argc -= idx;
331     argv += idx;
332 
333     /* hcrypto */
334     for (i = 0; i < sizeof(aes_tests)/sizeof(aes_tests[0]); i++)
335 	ret += test_cipher(i, EVP_hcrypto_aes_256_cbc(), &aes_tests[i]);
336     for (i = 0; i < sizeof(aes_cfb_tests)/sizeof(aes_cfb_tests[0]); i++)
337 	ret += test_cipher(i, EVP_hcrypto_aes_128_cfb8(), &aes_cfb_tests[i]);
338 
339     for (i = 0; i < sizeof(rc2_40_tests)/sizeof(rc2_40_tests[0]); i++)
340 	ret += test_cipher(i, EVP_hcrypto_rc2_40_cbc(), &rc2_40_tests[i]);
341     for (i = 0; i < sizeof(des_ede3_tests)/sizeof(des_ede3_tests[0]); i++)
342 	ret += test_cipher(i, EVP_hcrypto_des_ede3_cbc(), &des_ede3_tests[i]);
343     for (i = 0; i < sizeof(camellia128_tests)/sizeof(camellia128_tests[0]); i++)
344 	ret += test_cipher(i, EVP_hcrypto_camellia_128_cbc(),
345 			   &camellia128_tests[i]);
346     for (i = 0; i < sizeof(rc4_tests)/sizeof(rc4_tests[0]); i++)
347 	ret += test_cipher(i, EVP_hcrypto_rc4(), &rc4_tests[i]);
348 
349     /* Common Crypto */
350 #ifdef __APPLE__
351     for (i = 0; i < sizeof(aes_tests)/sizeof(aes_tests[0]); i++)
352 	ret += test_cipher(i, EVP_cc_aes_256_cbc(), &aes_tests[i]);
353 #if 0
354     for (i = 0; i < sizeof(aes_cfb_tests)/sizeof(aes_cfb_tests[0]); i++)
355 	ret += test_cipher(i, EVP_cc_aes_128_cfb8(), &aes_cfb_tests[i]);
356 #endif
357     for (i = 0; i < sizeof(rc2_40_tests)/sizeof(rc2_40_tests[0]); i++)
358 	ret += test_cipher(i, EVP_cc_rc2_40_cbc(), &rc2_40_tests[i]);
359     for (i = 0; i < sizeof(des_ede3_tests)/sizeof(des_ede3_tests[0]); i++)
360 	ret += test_cipher(i, EVP_cc_des_ede3_cbc(), &des_ede3_tests[i]);
361     for (i = 0; i < sizeof(camellia128_tests)/sizeof(camellia128_tests[0]); i++)
362 	ret += test_cipher(i, EVP_cc_camellia_128_cbc(),
363 			   &camellia128_tests[i]);
364     for (i = 0; i < sizeof(rc4_tests)/sizeof(rc4_tests[0]); i++)
365 	ret += test_cipher(i, EVP_cc_rc4(), &rc4_tests[i]);
366 #endif
367 
368     return ret;
369 }
370