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