xref: /netbsd-src/crypto/external/bsd/heimdal/dist/lib/hcrypto/test_cipher.c (revision 181254a7b1bdde6873432bffef2d2decc4b5c22f)
1 /*	$NetBSD: test_cipher.c,v 1.2 2017/01/28 21:31:47 christos Exp $	*/
2 
3 /*
4  * Copyright (c) 2006-2016 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 #include <krb5/roken.h>
38 
39 #define HC_DEPRECATED_CRYPTO
40 
41 #include <krb5/getarg.h>
42 
43 #include <evp.h>
44 #include <evp-hcrypto.h>
45 #include <evp-cc.h>
46 #if defined(_WIN32)
47 #include <evp-w32.h>
48 #endif
49 #include <evp-pkcs11.h>
50 #include <evp-openssl.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       NULL
75     }
76 };
77 
78 struct tests aes_cfb_tests[] = {
79     { "aes-cfb8-128",
80       "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00",
81       16,
82       "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00",
83       16,
84       "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00",
85       "\x66\x16\xf9\x2e\x42\xa8\xf1\x1a\x91\x16\x68\x57\x8e\xc3\xaa\x0f",
86       NULL
87     }
88 };
89 
90 
91 struct tests rc2_tests[] = {
92     { "rc2",
93       "\x88\xbc\xa9\x0e\x90\x87\x5a\x7f\x0f\x79\xc3\x84\x62\x7b\xaf\xb2",
94       16,
95       "\x00\x00\x00\x00\x00\x00\x00\x00",
96       8,
97       "\x00\x00\x00\x00\x00\x00\x00\x00",
98       "\x22\x69\x55\x2a\xb0\xf8\x5c\xa6",
99       NULL
100     }
101 };
102 
103 
104 struct tests rc2_40_tests[] = {
105     { "rc2-40",
106       "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00",
107       16,
108       "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00",
109       16,
110       "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00",
111       "\xc0\xb8\xff\xa5\xd6\xeb\xc9\x62\xcc\x52\x5f\xfe\x9a\x3c\x97\xe6",
112       NULL
113     }
114 };
115 
116 struct tests des_ede3_tests[] = {
117     { "des-ede3",
118       "\x19\x17\xff\xe6\xbb\x77\x2e\xfc"
119       "\x29\x76\x43\xbc\x63\x56\x7e\x9a"
120       "\x00\x2e\x4d\x43\x1d\x5f\xfd\x58",
121       24,
122       "\xbf\x9a\x12\xb7\x26\x69\xfd\x05",
123       16,
124       "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00",
125       "\x55\x95\x97\x76\xa9\x6c\x66\x40\x64\xc7\xf4\x1c\x21\xb7\x14\x1b",
126       NULL
127     }
128 };
129 
130 struct tests camellia128_tests[] = {
131     { "camellia128",
132       "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00",
133       16,
134       "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00",
135       16,
136       "\x80\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00",
137       "\x07\x92\x3A\x39\xEB\x0A\x81\x7D\x1C\x4D\x87\xBD\xB8\x2D\x1F\x1C",
138       NULL
139     }
140 };
141 
142 struct tests rc4_tests[] = {
143     {
144 	"rc4 8",
145 	"\x01\x23\x45\x67\x89\xAB\xCD\xEF",
146 	8,
147 	NULL,
148 	8,
149 	"\x00\x00\x00\x00\x00\x00\x00\x00",
150 	"\x74\x94\xC2\xE7\x10\x4B\x08\x79",
151 	NULL
152     },
153     {
154 	"rc4 5",
155 	"\x61\x8a\x63\xd2\xfb",
156 	5,
157 	NULL,
158 	5,
159 	"\xdc\xee\x4c\xf9\x2c",
160 	"\xf1\x38\x29\xc9\xde",
161 	NULL
162     },
163     {
164 	"rc4 309",
165 	"\x29\x04\x19\x72\xfb\x42\xba\x5f\xc7\x12\x77\x12\xf1\x38\x29\xc9",
166 	16,
167 	NULL,
168 	309,
169 	"\x52\x75\x69\x73\x6c\x69\x6e\x6e"
170 	"\x75\x6e\x20\x6c\x61\x75\x6c\x75"
171 	"\x20\x6b\x6f\x72\x76\x69\x73\x73"
172 	"\x73\x61\x6e\x69\x2c\x20\x74\xe4"
173 	"\x68\x6b\xe4\x70\xe4\x69\x64\x65"
174 	"\x6e\x20\x70\xe4\xe4\x6c\x6c\xe4"
175 	"\x20\x74\xe4\x79\x73\x69\x6b\x75"
176 	"\x75\x2e\x20\x4b\x65\x73\xe4\x79"
177 	"\xf6\x6e\x20\x6f\x6e\x20\x6f\x6e"
178 	"\x6e\x69\x20\x6f\x6d\x61\x6e\x61"
179 	"\x6e\x69\x2c\x20\x6b\x61\x73\x6b"
180 	"\x69\x73\x61\x76\x75\x75\x6e\x20"
181 	"\x6c\x61\x61\x6b\x73\x6f\x74\x20"
182 	"\x76\x65\x72\x68\x6f\x75\x75\x2e"
183 	"\x20\x45\x6e\x20\x6d\x61\x20\x69"
184 	"\x6c\x6f\x69\x74\x73\x65\x2c\x20"
185 	"\x73\x75\x72\x65\x20\x68\x75\x6f"
186 	"\x6b\x61\x61\x2c\x20\x6d\x75\x74"
187 	"\x74\x61\x20\x6d\x65\x74\x73\xe4"
188 	"\x6e\x20\x74\x75\x6d\x6d\x75\x75"
189 	"\x73\x20\x6d\x75\x6c\x6c\x65\x20"
190 	"\x74\x75\x6f\x6b\x61\x61\x2e\x20"
191 	"\x50\x75\x75\x6e\x74\x6f\x20\x70"
192 	"\x69\x6c\x76\x65\x6e\x2c\x20\x6d"
193 	"\x69\x20\x68\x75\x6b\x6b\x75\x75"
194 	"\x2c\x20\x73\x69\x69\x6e\x74\x6f"
195 	"\x20\x76\x61\x72\x61\x6e\x20\x74"
196 	"\x75\x75\x6c\x69\x73\x65\x6e\x2c"
197 	"\x20\x6d\x69\x20\x6e\x75\x6b\x6b"
198 	"\x75\x75\x2e\x20\x54\x75\x6f\x6b"
199 	"\x73\x75\x74\x20\x76\x61\x6e\x61"
200 	"\x6d\x6f\x6e\x20\x6a\x61\x20\x76"
201 	"\x61\x72\x6a\x6f\x74\x20\x76\x65"
202 	"\x65\x6e\x2c\x20\x6e\x69\x69\x73"
203 	"\x74\xe4\x20\x73\x79\x64\xe4\x6d"
204 	"\x65\x6e\x69\x20\x6c\x61\x75\x6c"
205 	"\x75\x6e\x20\x74\x65\x65\x6e\x2e"
206 	"\x20\x2d\x20\x45\x69\x6e\x6f\x20"
207 	"\x4c\x65\x69\x6e\x6f",
208 	"\x35\x81\x86\x99\x90\x01\xe6\xb5"
209 	"\xda\xf0\x5e\xce\xeb\x7e\xee\x21"
210 	"\xe0\x68\x9c\x1f\x00\xee\xa8\x1f"
211 	"\x7d\xd2\xca\xae\xe1\xd2\x76\x3e"
212 	"\x68\xaf\x0e\xad\x33\xd6\x6c\x26"
213 	"\x8b\xc9\x46\xc4\x84\xfb\xe9\x4c"
214 	"\x5f\x5e\x0b\x86\xa5\x92\x79\xe4"
215 	"\xf8\x24\xe7\xa6\x40\xbd\x22\x32"
216 	"\x10\xb0\xa6\x11\x60\xb7\xbc\xe9"
217 	"\x86\xea\x65\x68\x80\x03\x59\x6b"
218 	"\x63\x0a\x6b\x90\xf8\xe0\xca\xf6"
219 	"\x91\x2a\x98\xeb\x87\x21\x76\xe8"
220 	"\x3c\x20\x2c\xaa\x64\x16\x6d\x2c"
221 	"\xce\x57\xff\x1b\xca\x57\xb2\x13"
222 	"\xf0\xed\x1a\xa7\x2f\xb8\xea\x52"
223 	"\xb0\xbe\x01\xcd\x1e\x41\x28\x67"
224 	"\x72\x0b\x32\x6e\xb3\x89\xd0\x11"
225 	"\xbd\x70\xd8\xaf\x03\x5f\xb0\xd8"
226 	"\x58\x9d\xbc\xe3\xc6\x66\xf5\xea"
227 	"\x8d\x4c\x79\x54\xc5\x0c\x3f\x34"
228 	"\x0b\x04\x67\xf8\x1b\x42\x59\x61"
229 	"\xc1\x18\x43\x07\x4d\xf6\x20\xf2"
230 	"\x08\x40\x4b\x39\x4c\xf9\xd3\x7f"
231 	"\xf5\x4b\x5f\x1a\xd8\xf6\xea\x7d"
232 	"\xa3\xc5\x61\xdf\xa7\x28\x1f\x96"
233 	"\x44\x63\xd2\xcc\x35\xa4\xd1\xb0"
234 	"\x34\x90\xde\xc5\x1b\x07\x11\xfb"
235 	"\xd6\xf5\x5f\x79\x23\x4d\x5b\x7c"
236 	"\x76\x66\x22\xa6\x6d\xe9\x2b\xe9"
237 	"\x96\x46\x1d\x5e\x4d\xc8\x78\xef"
238 	"\x9b\xca\x03\x05\x21\xe8\x35\x1e"
239 	"\x4b\xae\xd2\xfd\x04\xf9\x46\x73"
240 	"\x68\xc4\xad\x6a\xc1\x86\xd0\x82"
241 	"\x45\xb2\x63\xa2\x66\x6d\x1f\x6c"
242 	"\x54\x20\xf1\x59\x9d\xfd\x9f\x43"
243 	"\x89\x21\xc2\xf5\xa4\x63\x93\x8c"
244 	"\xe0\x98\x22\x65\xee\xf7\x01\x79"
245 	"\xbc\x55\x3f\x33\x9e\xb1\xa4\xc1"
246 	"\xaf\x5f\x6a\x54\x7f",
247 	NULL
248     }
249 };
250 
251 
252 static int
253 test_cipher(int i, const EVP_CIPHER *c, struct tests *t)
254 {
255     EVP_CIPHER_CTX ectx;
256     EVP_CIPHER_CTX dctx;
257     void *d;
258 
259     if (c == NULL) {
260 	printf("%s not supported\n", t->name);
261 	return 0;
262     }
263 
264     EVP_CIPHER_CTX_init(&ectx);
265     EVP_CIPHER_CTX_init(&dctx);
266 
267     if (EVP_CipherInit_ex(&ectx, c, NULL, NULL, NULL, 1) != 1)
268 	errx(1, "%s: %d EVP_CipherInit_ex einit", t->name, i);
269     if (EVP_CipherInit_ex(&dctx, c, NULL, NULL, NULL, 0) != 1)
270 	errx(1, "%s: %d EVP_CipherInit_ex dinit", t->name, i);
271 
272     EVP_CIPHER_CTX_set_key_length(&ectx, t->keysize);
273     EVP_CIPHER_CTX_set_key_length(&dctx, t->keysize);
274 
275     if (EVP_CipherInit_ex(&ectx, NULL, NULL, t->key, t->iv, 1) != 1)
276 	errx(1, "%s: %d EVP_CipherInit_ex encrypt", t->name, i);
277     if (EVP_CipherInit_ex(&dctx, NULL, NULL, t->key, t->iv, 0) != 1)
278 	errx(1, "%s: %d EVP_CipherInit_ex decrypt", t->name, i);
279 
280     d = emalloc(t->datasize);
281 
282     if (!EVP_Cipher(&ectx, d, t->indata, t->datasize))
283 	errx(1, "%s: %d EVP_Cipher encrypt failed", t->name, i);
284 
285     if (memcmp(d, t->outdata, t->datasize) != 0) {
286 	char *s, *s2;
287 	hex_encode(d, t->datasize, &s);
288 	hex_encode(t->outdata, t->datasize, &s2);
289 	errx(1, "%s: %d encrypt not the same: %s != %s", t->name, i, s, s2);
290     }
291 
292     if (!EVP_Cipher(&dctx, d, d, t->datasize))
293 	errx(1, "%s: %d EVP_Cipher decrypt failed", t->name, i);
294 
295     if (memcmp(d, t->indata, t->datasize) != 0) {
296 	char *s;
297 	hex_encode(d, t->datasize, &s);
298 	errx(1, "%s: %d decrypt not the same: %s", t->name, i, s);
299     }
300     if (t->outiv)
301 	/* XXXX check  */;
302 
303     EVP_CIPHER_CTX_cleanup(&ectx);
304     EVP_CIPHER_CTX_cleanup(&dctx);
305     free(d);
306 
307     return 0;
308 }
309 
310 static int version_flag;
311 static int help_flag;
312 
313 static struct getargs args[] = {
314     { "version",	0,	arg_flag,	&version_flag,
315       "print version", NULL },
316     { "help",		0,	arg_flag,	&help_flag,
317       NULL, 	NULL }
318 };
319 
320 static void
321 usage (int ret)
322 {
323     arg_printusage (args,
324 		    sizeof(args)/sizeof(*args),
325 		    NULL,
326 		    "");
327     exit (ret);
328 }
329 
330 int
331 main(int argc, char **argv)
332 {
333     int ret = 0;
334     int i, idx = 0;
335 
336     setprogname(argv[0]);
337 
338     if(getarg(args, sizeof(args) / sizeof(args[0]), argc, argv, &idx))
339 	usage(1);
340 
341     if (help_flag)
342 	usage(0);
343 
344     if(version_flag){
345 	print_version(NULL);
346 	exit(0);
347     }
348 
349     argc -= idx;
350     argv += idx;
351 
352     /* hcrypto */
353     for (i = 0; i < sizeof(aes_tests)/sizeof(aes_tests[0]); i++)
354 	ret += test_cipher(i, EVP_hcrypto_aes_256_cbc(), &aes_tests[i]);
355     for (i = 0; i < sizeof(aes_cfb_tests)/sizeof(aes_cfb_tests[0]); i++)
356 	ret += test_cipher(i, EVP_hcrypto_aes_128_cfb8(), &aes_cfb_tests[i]);
357     for (i = 0; i < sizeof(rc2_tests)/sizeof(rc2_tests[0]); i++)
358 	ret += test_cipher(i, EVP_hcrypto_rc2_cbc(), &rc2_tests[i]);
359     for (i = 0; i < sizeof(rc2_40_tests)/sizeof(rc2_40_tests[0]); i++)
360 	ret += test_cipher(i, EVP_hcrypto_rc2_40_cbc(), &rc2_40_tests[i]);
361     for (i = 0; i < sizeof(des_ede3_tests)/sizeof(des_ede3_tests[0]); i++)
362 	ret += test_cipher(i, EVP_hcrypto_des_ede3_cbc(), &des_ede3_tests[i]);
363     for (i = 0; i < sizeof(camellia128_tests)/sizeof(camellia128_tests[0]); i++)
364 	ret += test_cipher(i, EVP_hcrypto_camellia_128_cbc(),
365 			   &camellia128_tests[i]);
366     for (i = 0; i < sizeof(rc4_tests)/sizeof(rc4_tests[0]); i++)
367 	ret += test_cipher(i, EVP_hcrypto_rc4(), &rc4_tests[i]);
368 
369     /* Common Crypto */
370 #ifdef __APPLE__
371     for (i = 0; i < sizeof(aes_tests)/sizeof(aes_tests[0]); i++)
372 	ret += test_cipher(i, EVP_cc_aes_256_cbc(), &aes_tests[i]);
373     for (i = 0; i < sizeof(aes_cfb_tests)/sizeof(aes_cfb_tests[0]); i++)
374 	ret += test_cipher(i, EVP_cc_aes_128_cfb8(), &aes_cfb_tests[i]);
375     for (i = 0; i < sizeof(rc2_40_tests)/sizeof(rc2_40_tests[0]); i++)
376 	ret += test_cipher(i, EVP_cc_rc2_40_cbc(), &rc2_40_tests[i]);
377     for (i = 0; i < sizeof(des_ede3_tests)/sizeof(des_ede3_tests[0]); i++)
378 	ret += test_cipher(i, EVP_cc_des_ede3_cbc(), &des_ede3_tests[i]);
379     for (i = 0; i < sizeof(camellia128_tests)/sizeof(camellia128_tests[0]); i++)
380 	ret += test_cipher(i, EVP_cc_camellia_128_cbc(),
381 			   &camellia128_tests[i]);
382     for (i = 0; i < sizeof(rc4_tests)/sizeof(rc4_tests[0]); i++)
383 	ret += test_cipher(i, EVP_cc_rc4(), &rc4_tests[i]);
384 #endif /* __APPLE__ */
385 
386     /* Windows CNG (if available) */
387 #ifdef WIN32
388     for (i = 0; i < sizeof(aes_tests)/sizeof(aes_tests[0]); i++)
389 	ret += test_cipher(i, EVP_w32crypto_aes_256_cbc(), &aes_tests[i]);
390     for (i = 0; i < sizeof(aes_cfb_tests)/sizeof(aes_cfb_tests[0]); i++)
391 	ret += test_cipher(i, EVP_w32crypto_aes_128_cfb8(), &aes_cfb_tests[i]);
392     for (i = 0; i < sizeof(rc2_tests)/sizeof(rc2_tests[0]); i++)
393 	ret += test_cipher(i, EVP_w32crypto_rc2_cbc(), &rc2_tests[i]);
394     for (i = 0; i < sizeof(rc2_40_tests)/sizeof(rc2_40_tests[0]); i++)
395 	ret += test_cipher(i, EVP_w32crypto_rc2_40_cbc(), &rc2_40_tests[i]);
396     for (i = 0; i < sizeof(des_ede3_tests)/sizeof(des_ede3_tests[0]); i++)
397 	ret += test_cipher(i, EVP_w32crypto_des_ede3_cbc(), &des_ede3_tests[i]);
398     for (i = 0; i < sizeof(rc4_tests)/sizeof(rc4_tests[0]); i++)
399 	ret += test_cipher(i, EVP_w32crypto_rc4(), &rc4_tests[i]);
400 #endif /* WIN32 */
401 
402     /* PKCS#11 */
403 #if __sun || defined(PKCS11_MODULE_PATH)
404     for (i = 0; i < sizeof(aes_tests)/sizeof(aes_tests[0]); i++)
405 	ret += test_cipher(i, EVP_pkcs11_aes_256_cbc(), &aes_tests[i]);
406     for (i = 0; i < sizeof(aes_cfb_tests)/sizeof(aes_cfb_tests[0]); i++)
407 	ret += test_cipher(i, EVP_pkcs11_aes_128_cfb8(), &aes_cfb_tests[i]);
408     for (i = 0; i < sizeof(rc2_tests)/sizeof(rc2_tests[0]); i++)
409 	ret += test_cipher(i, EVP_pkcs11_rc2_cbc(), &rc2_tests[i]);
410     for (i = 0; i < sizeof(rc2_40_tests)/sizeof(rc2_40_tests[0]); i++)
411 	ret += test_cipher(i, EVP_pkcs11_rc2_40_cbc(), &rc2_40_tests[i]);
412     for (i = 0; i < sizeof(des_ede3_tests)/sizeof(des_ede3_tests[0]); i++)
413 	ret += test_cipher(i, EVP_pkcs11_des_ede3_cbc(), &des_ede3_tests[i]);
414     for (i = 0; i < sizeof(rc4_tests)/sizeof(rc4_tests[0]); i++)
415 	ret += test_cipher(i, EVP_pkcs11_rc4(), &rc4_tests[i]);
416 #endif /* PKCS11_MODULE_PATH */
417 
418     /* OpenSSL */
419 #ifdef HAVE_HCRYPTO_W_OPENSSL
420     for (i = 0; i < sizeof(aes_tests)/sizeof(aes_tests[0]); i++)
421 	ret += test_cipher(i, EVP_ossl_aes_256_cbc(), &aes_tests[i]);
422     for (i = 0; i < sizeof(aes_cfb_tests)/sizeof(aes_cfb_tests[0]); i++)
423 	ret += test_cipher(i, EVP_ossl_aes_128_cfb8(), &aes_cfb_tests[i]);
424     for (i = 0; i < sizeof(rc2_tests)/sizeof(rc2_tests[0]); i++)
425 	ret += test_cipher(i, EVP_ossl_rc2_cbc(), &rc2_tests[i]);
426     for (i = 0; i < sizeof(rc2_40_tests)/sizeof(rc2_40_tests[0]); i++)
427 	ret += test_cipher(i, EVP_ossl_rc2_40_cbc(), &rc2_40_tests[i]);
428     for (i = 0; i < sizeof(des_ede3_tests)/sizeof(des_ede3_tests[0]); i++)
429 	ret += test_cipher(i, EVP_ossl_des_ede3_cbc(), &des_ede3_tests[i]);
430     for (i = 0; i < sizeof(rc4_tests)/sizeof(rc4_tests[0]); i++)
431 	ret += test_cipher(i, EVP_ossl_rc4(), &rc4_tests[i]);
432 #endif /* PKCS11_MODULE_PATH */
433 
434     return ret;
435 }
436