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