xref: /openbsd-src/regress/lib/libcrypto/rc2/rc2_test.c (revision 75a38c89436cfd7541af75d29a2fa225b9b40cfa)
1*75a38c89Sjoshua /*	$OpenBSD: rc2_test.c,v 1.6 2022/11/09 12:13:08 joshua Exp $ */
2f859d7adStb /*
3f859d7adStb  * Copyright (c) 2022 Joshua Sing <joshua@hypera.dev>
4f859d7adStb  *
5f859d7adStb  * Permission to use, copy, modify, and distribute this software for any
6f859d7adStb  * purpose with or without fee is hereby granted, provided that the above
7f859d7adStb  * copyright notice and this permission notice appear in all copies.
8f859d7adStb  *
9f859d7adStb  * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
10f859d7adStb  * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
11f859d7adStb  * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
12f859d7adStb  * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
13f859d7adStb  * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
14f859d7adStb  * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
15f859d7adStb  * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
16f859d7adStb  */
17f859d7adStb 
18f859d7adStb #include <openssl/evp.h>
19f859d7adStb #include <openssl/rc2.h>
20f859d7adStb 
21f859d7adStb #include <stdint.h>
22f859d7adStb #include <string.h>
23f859d7adStb 
24f859d7adStb struct rc2_test {
25f859d7adStb 	const int mode;
26f859d7adStb 	const uint8_t key[64];
27f859d7adStb 	const int key_len;
28f859d7adStb 	const int key_bits;
29693239cdStb 	const uint8_t iv[64];
30693239cdStb 	const int iv_len;
31693239cdStb 	const uint8_t in[64];
32693239cdStb 	const int in_len;
33693239cdStb 	const uint8_t out[64];
34693239cdStb 	const int out_len;
35693239cdStb 	const int padding;
36f859d7adStb };
37f859d7adStb 
38f859d7adStb static const struct rc2_test rc2_tests[] = {
39f859d7adStb 	/* ECB (Test vectors from RFC 2268) */
40f859d7adStb 	{
41f859d7adStb 		.mode = NID_rc2_ecb,
42f859d7adStb 		.key = {
43f859d7adStb 			0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
44f859d7adStb 		},
45f859d7adStb 		.key_len = 8,
46f859d7adStb 		.key_bits = 63,
47f859d7adStb 		.in = {
48f859d7adStb 			0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
49f859d7adStb 		},
50693239cdStb 		.in_len = 8,
51f859d7adStb 		.out = {
52f859d7adStb 			0xeb, 0xb7, 0x73, 0xf9, 0x93, 0x27, 0x8e, 0xff,
53f859d7adStb 		},
54693239cdStb 		.out_len = 8,
55f859d7adStb 	},
56f859d7adStb 	{
57f859d7adStb 		.mode = NID_rc2_ecb,
58f859d7adStb 		.key = {
59f859d7adStb 			0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
60f859d7adStb 		},
61f859d7adStb 		.key_len = 8,
62f859d7adStb 		.key_bits = 64,
63f859d7adStb 		.in = {
64f859d7adStb 			0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
65f859d7adStb 		},
66693239cdStb 		.in_len = 8,
67f859d7adStb 		.out = {
68f859d7adStb 			0x27, 0x8b, 0x27, 0xe4, 0x2e, 0x2f, 0x0d, 0x49,
69f859d7adStb 		},
70693239cdStb 		.out_len = 8,
71f859d7adStb 	},
72f859d7adStb 	{
73f859d7adStb 		.mode = NID_rc2_ecb,
74f859d7adStb 		.key = {
75f859d7adStb 			0x30, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
76f859d7adStb 		},
77f859d7adStb 		.key_len = 8,
78f859d7adStb 		.key_bits = 64,
79f859d7adStb 		.in = {
80f859d7adStb 			0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01,
81f859d7adStb 		},
82693239cdStb 		.in_len = 8,
83f859d7adStb 		.out = {
84f859d7adStb 			0x30, 0x64, 0x9e, 0xdf, 0x9b, 0xe7, 0xd2, 0xc2,
85f859d7adStb 		},
86693239cdStb 		.out_len = 8,
87f859d7adStb 	},
88f859d7adStb 	{
89f859d7adStb 		.mode = NID_rc2_ecb,
90f859d7adStb 		.key = {
91f859d7adStb 			0x88,
92f859d7adStb 		},
93f859d7adStb 		.key_len = 1,
94f859d7adStb 		.key_bits = 64,
95f859d7adStb 		.in = {
96f859d7adStb 			0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
97f859d7adStb 		},
98693239cdStb 		.in_len = 8,
99f859d7adStb 		.out = {
100f859d7adStb 			0x61, 0xa8, 0xa2, 0x44, 0xad, 0xac, 0xcc, 0xf0,
101f859d7adStb 		},
102693239cdStb 		.out_len = 8,
103f859d7adStb 	},
104f859d7adStb 	{
105f859d7adStb 		.mode = NID_rc2_ecb,
106f859d7adStb 		.key = {
107f859d7adStb 			0x88, 0xbc, 0xa9, 0x0e, 0x90, 0x87, 0x5a,
108f859d7adStb 		},
109f859d7adStb 		.key_len = 7,
110f859d7adStb 		.key_bits = 64,
111f859d7adStb 		.in = {
112f859d7adStb 			0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
113f859d7adStb 		},
114693239cdStb 		.in_len = 8,
115f859d7adStb 		.out = {
116f859d7adStb 			0x6c, 0xcf, 0x43, 0x08, 0x97, 0x4c, 0x26, 0x7f,
117f859d7adStb 		},
118693239cdStb 		.out_len = 8,
119f859d7adStb 	},
120f859d7adStb 	{
121f859d7adStb 		.mode = NID_rc2_ecb,
122f859d7adStb 		.key = {
123f859d7adStb 			0x88, 0xbc, 0xa9, 0x0e, 0x90, 0x87, 0x5a, 0x7f,
124f859d7adStb 			0x0f, 0x79, 0xc3, 0x84, 0x62, 0x7b, 0xaf, 0xb2,
125f859d7adStb 		},
126f859d7adStb 		.key_len = 16,
127f859d7adStb 		.key_bits = 64,
128f859d7adStb 		.in = {
129f859d7adStb 			0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
130f859d7adStb 		},
131693239cdStb 		.in_len = 8,
132f859d7adStb 		.out = {
133f859d7adStb 			0x1a, 0x80, 0x7d, 0x27, 0x2b, 0xbe, 0x5d, 0xb1,
134f859d7adStb 		},
135693239cdStb 		.out_len = 8,
136f859d7adStb 	},
137f859d7adStb 	{
138f859d7adStb 		.mode = NID_rc2_ecb,
139f859d7adStb 		.key = {
140f859d7adStb 			0x88, 0xbc, 0xa9, 0x0e, 0x90, 0x87, 0x5a, 0x7f,
141f859d7adStb 			0x0f, 0x79, 0xc3, 0x84, 0x62, 0x7b, 0xaf, 0xb2,
142f859d7adStb 		},
143f859d7adStb 		.key_len = 16,
144f859d7adStb 		.key_bits = 128,
145f859d7adStb 		.in = {
146f859d7adStb 			0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
147f859d7adStb 		},
148693239cdStb 		.in_len = 8,
149f859d7adStb 		.out = {
150f859d7adStb 			0x22, 0x69, 0x55, 0x2a, 0xb0, 0xf8, 0x5c, 0xa6,
151f859d7adStb 		},
152693239cdStb 		.out_len = 8,
153f859d7adStb 	},
154f859d7adStb 	{
155f859d7adStb 		.mode = NID_rc2_ecb,
156f859d7adStb 		.key = {
157f859d7adStb 			0x88, 0xbc, 0xa9, 0x0e, 0x90, 0x87, 0x5a, 0x7f,
158f859d7adStb 			0x0f, 0x79, 0xc3, 0x84, 0x62, 0x7b, 0xaf, 0xb2,
159f859d7adStb 			0x16, 0xf8, 0x0a, 0x6f, 0x85, 0x92, 0x05, 0x84,
160f859d7adStb 			0xc4, 0x2f, 0xce, 0xb0, 0xbe, 0x25, 0x5d, 0xaf,
161f859d7adStb 			0x1e,
162f859d7adStb 		},
163f859d7adStb 		.key_len = 33,
164f859d7adStb 		.key_bits = 129,
165f859d7adStb 		.in = {
166f859d7adStb 			0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
167f859d7adStb 		},
168693239cdStb 		.in_len = 8,
169f859d7adStb 		.out = {
170f859d7adStb 			0x5b, 0x78, 0xd3, 0xa4, 0x3d, 0xff, 0xf1, 0xf1,
171f859d7adStb 		},
172693239cdStb 		.out_len = 8,
173f859d7adStb 	},
174f859d7adStb 
175f859d7adStb 	/* ECB (Test vectors from http://websites.umich.edu/~x509/ssleay/rrc2.html) */
176f859d7adStb 	{
177f859d7adStb 		.mode = NID_rc2_ecb,
178f859d7adStb 		.key = {
179f859d7adStb 			0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
180f859d7adStb 			0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
181f859d7adStb 		},
182f859d7adStb 		.key_len = 16,
1833cba5606Stb 		.key_bits = 1024,
184f859d7adStb 		.in = {
185f859d7adStb 			0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
186f859d7adStb 		},
187693239cdStb 		.in_len = 8,
188f859d7adStb 		.out = {
189f859d7adStb 			0x1c, 0x19, 0x8a, 0x83, 0x8d, 0xf0, 0x28, 0xb7,
190f859d7adStb 		},
191693239cdStb 		.out_len = 8,
192f859d7adStb 	},
193f859d7adStb 	{
194f859d7adStb 		.mode = NID_rc2_ecb,
195f859d7adStb 		.key = {
196f859d7adStb 			0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
197f859d7adStb 			0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01,
198f859d7adStb 		},
199f859d7adStb 		.key_len = 16,
2003cba5606Stb 		.key_bits = 1024,
201f859d7adStb 		.in = {
202f859d7adStb 			0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
203f859d7adStb 		},
204693239cdStb 		.in_len = 8,
205f859d7adStb 		.out = {
206f859d7adStb 			0x21, 0x82, 0x9C, 0x78, 0xA9, 0xF9, 0xC0, 0x74,
207f859d7adStb 		},
208693239cdStb 		.out_len = 8,
209f859d7adStb 	},
210f859d7adStb 	{
211f859d7adStb 		.mode = NID_rc2_ecb,
212f859d7adStb 		.key = {
213f859d7adStb 			0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
214f859d7adStb 			0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
215f859d7adStb 		},
216f859d7adStb 		.key_len = 16,
2173cba5606Stb 		.key_bits = 1024,
218f859d7adStb 		.in = {
219f859d7adStb 			0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
220f859d7adStb 		},
221693239cdStb 		.in_len = 8,
222f859d7adStb 		.out = {
223f859d7adStb 			0x13, 0xdb, 0x35, 0x17, 0xd3, 0x21, 0x86, 0x9e,
224f859d7adStb 		},
225693239cdStb 		.out_len = 8,
226f859d7adStb 	},
227f859d7adStb 	{
228f859d7adStb 		.mode = NID_rc2_ecb,
229f859d7adStb 		.key = {
230f859d7adStb 			0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07,
231f859d7adStb 			0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f,
232f859d7adStb 		},
233f859d7adStb 		.key_len = 16,
2343cba5606Stb 		.key_bits = 1024,
235f859d7adStb 		.in = {
236f859d7adStb 			0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
237f859d7adStb 		},
238693239cdStb 		.in_len = 8,
239f859d7adStb 		.out = {
240f859d7adStb 			0x50, 0xdc, 0x01, 0x62, 0xbd, 0x75, 0x7f, 0x31,
241f859d7adStb 		},
242693239cdStb 		.out_len = 8,
243693239cdStb 	},
244693239cdStb 
245693239cdStb 	/* CBC (generated using https://github.com/joshuasing/libressl-test-gen) */
246693239cdStb 	{
247693239cdStb 		.mode = NID_rc2_cbc,
248693239cdStb 		.key = {
249693239cdStb 			0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
250693239cdStb 		},
251693239cdStb 		.key_len = 8,
252693239cdStb 		.key_bits = 64,
253693239cdStb 		.iv = {
254693239cdStb 			0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
255693239cdStb 		},
256693239cdStb 		.iv_len = 8,
257693239cdStb 		.in = {
258693239cdStb 			0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
259693239cdStb 			0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
260693239cdStb 		},
261693239cdStb 		.in_len = 16,
262693239cdStb 		.out = {
263693239cdStb 			0xeb, 0xb7, 0x73, 0xf9, 0x93, 0x27, 0x8e, 0xff,
264693239cdStb 			0xf0, 0x51, 0x77, 0x8b, 0x65, 0xdb, 0x13, 0x57,
265693239cdStb 		},
266693239cdStb 		.out_len = 16,
267693239cdStb 	},
268693239cdStb 	{
269693239cdStb 		.mode = NID_rc2_cbc,
270693239cdStb 		.key = {
271693239cdStb 			0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07,
272693239cdStb 			0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f,
273693239cdStb 		},
274693239cdStb 		.key_len = 16,
275693239cdStb 		.key_bits = 128,
276693239cdStb 		.iv = {
277693239cdStb 			0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
278693239cdStb 		},
279693239cdStb 		.iv_len = 8,
280693239cdStb 		.in = {
281693239cdStb 			0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
282693239cdStb 			0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
283693239cdStb 		},
284693239cdStb 		.in_len = 16,
285693239cdStb 		.out = {
286693239cdStb 			0x9c, 0x4b, 0xfe, 0x6d, 0xfe, 0x73, 0x9c, 0x2b,
287693239cdStb 			0x52, 0x8f, 0xc8, 0x47, 0x2b, 0x66, 0xf9, 0x70,
288693239cdStb 		},
289693239cdStb 		.out_len = 16,
290693239cdStb 	},
291693239cdStb 	{
292693239cdStb 		.mode = NID_rc2_cbc,
293693239cdStb 		.key = {
294693239cdStb 			0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07,
295693239cdStb 			0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f,
296693239cdStb 		},
297693239cdStb 		.key_len = 16,
298693239cdStb 		.key_bits = 128,
299693239cdStb 		.iv = {
300693239cdStb 			0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
301693239cdStb 		},
302693239cdStb 		.iv_len = 8,
303693239cdStb 		.in = {
304693239cdStb 			0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07,
305693239cdStb 			0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f,
306693239cdStb 		},
307693239cdStb 		.in_len = 16,
308693239cdStb 		.out = {
309693239cdStb 			0x8b, 0x11, 0x08, 0x1c, 0xf0, 0xa0, 0x86, 0xe9,
310693239cdStb 			0x60, 0x57, 0x69, 0x5d, 0xdd, 0x42, 0x38, 0xe3,
311693239cdStb 		},
312693239cdStb 		.out_len = 16,
313693239cdStb 	},
314693239cdStb 	{
315693239cdStb 		.mode = NID_rc2_cbc,
316693239cdStb 		.key = {
317693239cdStb 			0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07,
318693239cdStb 			0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f,
319693239cdStb 		},
320693239cdStb 		.key_len = 16,
321693239cdStb 		.key_bits = 128,
322693239cdStb 		.iv = {
323693239cdStb 			0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07,
324693239cdStb 		},
325693239cdStb 		.iv_len = 8,
326693239cdStb 		.in = {
327693239cdStb 			0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07,
328693239cdStb 			0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f,
329693239cdStb 			0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17,
330693239cdStb 			0x18, 0x19, 0x1a, 0x1b, 0x1c, 0x1d, 0x1e, 0x1f,
331693239cdStb 		},
332693239cdStb 		.in_len = 32,
333693239cdStb 		.out = {
334693239cdStb 			0x9c, 0x4b, 0xfe, 0x6d, 0xfe, 0x73, 0x9c, 0x2b,
335693239cdStb 			0x29, 0xf1, 0x7a, 0xd2, 0x16, 0xa0, 0xb2, 0xc6,
336693239cdStb 			0xd1, 0xa2, 0x31, 0xbe, 0xa3, 0x94, 0xc6, 0xb0,
337693239cdStb 			0x81, 0x22, 0x27, 0x17, 0x5b, 0xd4, 0x6d, 0x29,
338693239cdStb 		},
339693239cdStb 		.out_len = 32,
340693239cdStb 	},
341693239cdStb 
342693239cdStb 	/* CFB64 (generated using https://github.com/joshuasing/libressl-test-gen) */
343693239cdStb 	{
344693239cdStb 		.mode = NID_rc2_cfb64,
345693239cdStb 		.key = {
346693239cdStb 			0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
347693239cdStb 		},
348693239cdStb 		.key_len = 8,
349693239cdStb 		.key_bits = 64,
350693239cdStb 		.iv = {
351693239cdStb 			0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
352693239cdStb 		},
353693239cdStb 		.iv_len = 8,
354693239cdStb 		.in = {
355693239cdStb 			0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
356693239cdStb 			0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
357693239cdStb 		},
358693239cdStb 		.in_len = 16,
359693239cdStb 		.out = {
360693239cdStb 			0xeb, 0xb7, 0x73, 0xf9, 0x93, 0x27, 0x8e, 0xff,
361693239cdStb 			0xf0, 0x51, 0x77, 0x8b, 0x65, 0xdb, 0x13, 0x57,
362693239cdStb 		},
363693239cdStb 		.out_len = 16,
364693239cdStb 	},
365693239cdStb 	{
366693239cdStb 		.mode = NID_rc2_cfb64,
367693239cdStb 		.key = {
368693239cdStb 			0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07,
369693239cdStb 			0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f,
370693239cdStb 		},
371693239cdStb 		.key_len = 16,
372693239cdStb 		.key_bits = 128,
373693239cdStb 		.iv = {
374693239cdStb 			0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
375693239cdStb 		},
376693239cdStb 		.iv_len = 8,
377693239cdStb 		.in = {
378693239cdStb 			0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
379693239cdStb 			0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
380693239cdStb 		},
381693239cdStb 		.in_len = 16,
382693239cdStb 		.out = {
383693239cdStb 			0x9c, 0x4b, 0xfe, 0x6d, 0xfe, 0x73, 0x9c, 0x2b,
384693239cdStb 			0x52, 0x8f, 0xc8, 0x47, 0x2b, 0x66, 0xf9, 0x70,
385693239cdStb 		},
386693239cdStb 		.out_len = 16,
387693239cdStb 	},
388693239cdStb 	{
389693239cdStb 		.mode = NID_rc2_cfb64,
390693239cdStb 		.key = {
391693239cdStb 			0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07,
392693239cdStb 			0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f,
393693239cdStb 		},
394693239cdStb 		.key_len = 16,
395693239cdStb 		.key_bits = 128,
396693239cdStb 		.iv = {
397693239cdStb 			0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
398693239cdStb 		},
399693239cdStb 		.iv_len = 8,
400693239cdStb 		.in = {
401693239cdStb 			0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07,
402693239cdStb 			0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f,
403693239cdStb 		},
404693239cdStb 		.in_len = 16,
405693239cdStb 		.out = {
406693239cdStb 			0x9c, 0x4a, 0xfc, 0x6e, 0xfa, 0x76, 0x9a, 0x2c,
407693239cdStb 			0xeb, 0xdf, 0x25, 0xb0, 0x15, 0x8b, 0x6a, 0x2a,
408693239cdStb 		},
409693239cdStb 		.out_len = 16,
410693239cdStb 	},
411693239cdStb 	{
412693239cdStb 		.mode = NID_rc2_cfb64,
413693239cdStb 		.key = {
414693239cdStb 			0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07,
415693239cdStb 			0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f,
416693239cdStb 		},
417693239cdStb 		.key_len = 16,
418693239cdStb 		.key_bits = 128,
419693239cdStb 		.iv = {
420693239cdStb 			0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07,
421693239cdStb 		},
422693239cdStb 		.iv_len = 8,
423693239cdStb 		.in = {
424693239cdStb 			0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07,
425693239cdStb 			0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f,
426693239cdStb 			0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17,
427693239cdStb 			0x18, 0x19, 0x1a, 0x1b, 0x1c, 0x1d, 0x1e, 0x1f,
428693239cdStb 		},
429693239cdStb 		.in_len = 32,
430693239cdStb 		.out = {
431693239cdStb 			0x8b, 0x10, 0x0a, 0x1f, 0xf4, 0xa5, 0x80, 0xee,
432693239cdStb 			0x94, 0x4d, 0xc3, 0xcd, 0x26, 0x79, 0x81, 0xc0,
433693239cdStb 			0xe9, 0x3e, 0x20, 0x85, 0x11, 0x71, 0x61, 0x2a,
434693239cdStb 			0x1d, 0x4c, 0x8a, 0xe2, 0xb7, 0x0a, 0xa8, 0xcf,
435693239cdStb 		},
436693239cdStb 		.out_len = 32,
437693239cdStb 	},
438693239cdStb 
439693239cdStb 	/* OFB64 (generated using https://github.com/joshuasing/libressl-test-gen) */
440693239cdStb 	{
441693239cdStb 		.mode = NID_rc2_ofb64,
442693239cdStb 		.key = {
443693239cdStb 			0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
444693239cdStb 		},
445693239cdStb 		.key_len = 8,
446693239cdStb 		.key_bits = 64,
447693239cdStb 		.iv = {
448693239cdStb 			0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
449693239cdStb 		},
450693239cdStb 		.iv_len = 8,
451693239cdStb 		.in = {
452693239cdStb 			0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
453693239cdStb 			0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
454693239cdStb 		},
455693239cdStb 		.in_len = 16,
456693239cdStb 		.out = {
457693239cdStb 			0xeb, 0xb7, 0x73, 0xf9, 0x93, 0x27, 0x8e, 0xff,
458693239cdStb 			0xf0, 0x51, 0x77, 0x8b, 0x65, 0xdb, 0x13, 0x57,
459693239cdStb 		},
460693239cdStb 		.out_len = 16,
461693239cdStb 	},
462693239cdStb 	{
463693239cdStb 		.mode = NID_rc2_ofb64,
464693239cdStb 		.key = {
465693239cdStb 			0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07,
466693239cdStb 			0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f,
467693239cdStb 		},
468693239cdStb 		.key_len = 16,
469693239cdStb 		.key_bits = 128,
470693239cdStb 		.iv = {
471693239cdStb 			0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
472693239cdStb 		},
473693239cdStb 		.iv_len = 8,
474693239cdStb 		.in = {
475693239cdStb 			0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
476693239cdStb 			0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
477693239cdStb 		},
478693239cdStb 		.in_len = 16,
479693239cdStb 		.out = {
480693239cdStb 			0x9c, 0x4b, 0xfe, 0x6d, 0xfe, 0x73, 0x9c, 0x2b,
481693239cdStb 			0x52, 0x8f, 0xc8, 0x47, 0x2b, 0x66, 0xf9, 0x70,
482693239cdStb 		},
483693239cdStb 		.out_len = 16,
484693239cdStb 	},
485693239cdStb 	{
486693239cdStb 		.mode = NID_rc2_ofb64,
487693239cdStb 		.key = {
488693239cdStb 			0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07,
489693239cdStb 			0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f,
490693239cdStb 		},
491693239cdStb 		.key_len = 16,
492693239cdStb 		.key_bits = 128,
493693239cdStb 		.iv = {
494693239cdStb 			0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
495693239cdStb 		},
496693239cdStb 		.iv_len = 8,
497693239cdStb 		.in = {
498693239cdStb 			0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07,
499693239cdStb 			0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f,
500693239cdStb 		},
501693239cdStb 		.in_len = 16,
502693239cdStb 		.out = {
503693239cdStb 			0x9c, 0x4a, 0xfc, 0x6e, 0xfa, 0x76, 0x9a, 0x2c,
504693239cdStb 			0x5a, 0x86, 0xc2, 0x4c, 0x27, 0x6b, 0xf7, 0x7f,
505693239cdStb 		},
506693239cdStb 		.out_len = 16,
507693239cdStb 	},
508693239cdStb 	{
509693239cdStb 		.mode = NID_rc2_ofb64,
510693239cdStb 		.key = {
511693239cdStb 			0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07,
512693239cdStb 			0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f,
513693239cdStb 		},
514693239cdStb 		.key_len = 16,
515693239cdStb 		.key_bits = 128,
516693239cdStb 		.iv = {
517693239cdStb 			0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07,
518693239cdStb 		},
519693239cdStb 		.iv_len = 8,
520693239cdStb 		.in = {
521693239cdStb 			0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07,
522693239cdStb 			0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f,
523693239cdStb 			0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17,
524693239cdStb 			0x18, 0x19, 0x1a, 0x1b, 0x1c, 0x1d, 0x1e, 0x1f,
525693239cdStb 		},
526693239cdStb 		.in_len = 32,
527693239cdStb 		.out = {
528693239cdStb 			0x8b, 0x10, 0x0a, 0x1f, 0xf4, 0xa5, 0x80, 0xee,
529693239cdStb 			0xfa, 0x1d, 0x1a, 0x7c, 0xb2, 0x93, 0x00, 0x9d,
530693239cdStb 			0x36, 0xa1, 0xff, 0x3a, 0x77, 0x1d, 0x00, 0x9b,
531693239cdStb 			0x20, 0xde, 0x5f, 0x93, 0xcc, 0x3e, 0x51, 0xaa,
532693239cdStb 		},
533693239cdStb 		.out_len = 32,
534f859d7adStb 	},
535f859d7adStb };
536f859d7adStb 
537f859d7adStb #define N_RC2_TESTS (sizeof(rc2_tests) / sizeof(rc2_tests[0]))
538f859d7adStb 
539f859d7adStb static int
rc2_ecb_test(size_t test_number,const struct rc2_test * rt)540f859d7adStb rc2_ecb_test(size_t test_number, const struct rc2_test *rt)
541f859d7adStb {
542f859d7adStb 	RC2_KEY key;
543f859d7adStb 	uint8_t out[8];
544f859d7adStb 
545f859d7adStb 	/* Encryption */
546f859d7adStb 	memset(out, 0, sizeof(out));
547f859d7adStb 	RC2_set_key(&key, rt->key_len, rt->key, rt->key_bits);
548f859d7adStb 	RC2_ecb_encrypt(rt->in, out, &key, 1);
549f859d7adStb 
550693239cdStb 	if (memcmp(rt->out, out, rt->out_len) != 0) {
551f859d7adStb 		fprintf(stderr, "FAIL (%s:%zu): encryption mismatch\n",
552f859d7adStb 		    SN_rc2_ecb, test_number);
553f859d7adStb 		return 0;
554f859d7adStb 	}
555f859d7adStb 
556f859d7adStb 	/* Decryption */
557f859d7adStb 	memset(out, 0, sizeof(out));
558f859d7adStb 	RC2_set_key(&key, rt->key_len, rt->key, rt->key_bits);
559f859d7adStb 	RC2_ecb_encrypt(rt->out, out, &key, 0);
560f859d7adStb 
561693239cdStb 	if (memcmp(rt->in, out, rt->in_len) != 0) {
562f859d7adStb 		fprintf(stderr, "FAIL (%s:%zu): decryption mismatch\n",
563f859d7adStb 		    SN_rc2_ecb, test_number);
564f859d7adStb 		return 0;
565f859d7adStb 	}
566f859d7adStb 
567f859d7adStb 	return 1;
568f859d7adStb }
569f859d7adStb 
570f859d7adStb static int
rc2_cbc_test(size_t test_number,const struct rc2_test * rt)571693239cdStb rc2_cbc_test(size_t test_number, const struct rc2_test *rt)
572693239cdStb {
573693239cdStb 	RC2_KEY key;
574693239cdStb 	uint8_t out[512];
575693239cdStb 	uint8_t iv[64];
576693239cdStb 
577693239cdStb 	/* Encryption */
578693239cdStb 	memset(out, 0, sizeof(out));
579693239cdStb 	memcpy(iv, rt->iv, rt->iv_len);
580693239cdStb 	RC2_set_key(&key, rt->key_len, rt->key, rt->key_bits);
581693239cdStb 	RC2_cbc_encrypt(rt->in, out, rt->in_len, &key, iv, 1);
582693239cdStb 
583693239cdStb 	if (memcmp(rt->out, out, rt->out_len) != 0) {
584693239cdStb 		fprintf(stderr, "FAIL (%s:%zu): encryption mismatch\n",
585693239cdStb 		    SN_rc2_cbc, test_number);
586693239cdStb 		return 0;
587693239cdStb 	}
588693239cdStb 
589693239cdStb 	/* Decryption */
590693239cdStb 	memset(out, 0, sizeof(out));
591693239cdStb 	memcpy(iv, rt->iv, rt->iv_len);
592693239cdStb 	RC2_set_key(&key, rt->key_len, rt->key, rt->key_bits);
593693239cdStb 	RC2_cbc_encrypt(rt->out, out, rt->out_len, &key, iv, 0);
594693239cdStb 
595693239cdStb 	if (memcmp(rt->in, out, rt->in_len) != 0) {
596693239cdStb 		fprintf(stderr, "FAIL (%s:%zu): decryption mismatch\n",
597693239cdStb 		    SN_rc2_cbc, test_number);
598693239cdStb 		return 0;
599693239cdStb 	}
600693239cdStb 
601693239cdStb 	return 1;
602693239cdStb }
603693239cdStb 
604693239cdStb static int
rc2_cfb64_test(size_t test_number,const struct rc2_test * rt)605693239cdStb rc2_cfb64_test(size_t test_number, const struct rc2_test *rt)
606693239cdStb {
607693239cdStb 	RC2_KEY key;
608693239cdStb 	uint8_t out[512];
609693239cdStb 	uint8_t iv[64];
610693239cdStb 	int remainder = 0;
611693239cdStb 
612693239cdStb 	/* Encryption */
613693239cdStb 	memset(out, 0, sizeof(out));
614693239cdStb 	memcpy(iv, rt->iv, rt->iv_len);
615693239cdStb 	RC2_set_key(&key, rt->key_len, rt->key, rt->key_bits);
616693239cdStb 	RC2_cfb64_encrypt(rt->in, out, rt->in_len * 8, &key, iv, &remainder, 1);
617693239cdStb 
618693239cdStb 	if (memcmp(rt->out, out, rt->out_len) != 0) {
619693239cdStb 		fprintf(stderr, "FAIL (%s:%zu): encryption mismatch\n",
620693239cdStb 		    SN_rc2_cbc, test_number);
621693239cdStb 		return 0;
622693239cdStb 	}
623693239cdStb 
624693239cdStb 	/* Decryption */
625693239cdStb 	memset(out, 0, sizeof(out));
626693239cdStb 	memcpy(iv, rt->iv, rt->iv_len);
627693239cdStb 	RC2_set_key(&key, rt->key_len, rt->key, rt->key_bits);
628693239cdStb 	RC2_cfb64_encrypt(rt->out, out, rt->out_len, &key, iv, &remainder, 0);
629693239cdStb 
630693239cdStb 	if (memcmp(rt->in, out, rt->in_len) != 0) {
631693239cdStb 		fprintf(stderr, "FAIL (%s:%zu): decryption mismatch\n",
632693239cdStb 		    SN_rc2_cbc, test_number);
633693239cdStb 		return 0;
634693239cdStb 	}
635693239cdStb 
636693239cdStb 	return 1;
637693239cdStb }
638693239cdStb 
639693239cdStb static int
rc2_ofb64_test(size_t test_number,const struct rc2_test * rt)640693239cdStb rc2_ofb64_test(size_t test_number, const struct rc2_test *rt)
641693239cdStb {
642693239cdStb 	RC2_KEY key;
643693239cdStb 	uint8_t out[512];
644693239cdStb 	uint8_t iv[64];
645693239cdStb 	int remainder = 0;
646693239cdStb 
647693239cdStb 	/* Encryption */
648693239cdStb 	memset(out, 0, sizeof(out));
649693239cdStb 	memcpy(iv, rt->iv, rt->iv_len);
650693239cdStb 	RC2_set_key(&key, rt->key_len, rt->key, rt->key_bits);
651693239cdStb 	RC2_ofb64_encrypt(rt->in, out, rt->in_len, &key, iv, &remainder);
652693239cdStb 
653693239cdStb 	if (memcmp(rt->out, out, rt->out_len) != 0) {
654693239cdStb 		fprintf(stderr, "FAIL (%s:%zu): encryption mismatch\n",
655693239cdStb 		    SN_rc2_cbc, test_number);
656693239cdStb 		return 0;
657693239cdStb 	}
658693239cdStb 
659693239cdStb 	/* Decryption */
660693239cdStb 	memset(out, 0, sizeof(out));
661693239cdStb 	memcpy(iv, rt->iv, rt->iv_len);
662693239cdStb 	RC2_set_key(&key, rt->key_len, rt->key, rt->key_bits);
663693239cdStb 	RC2_ofb64_encrypt(rt->out, out, rt->out_len, &key, iv, &remainder);
664693239cdStb 
665693239cdStb 	if (memcmp(rt->in, out, rt->in_len) != 0) {
666693239cdStb 		fprintf(stderr, "FAIL (%s:%zu): decryption mismatch\n",
667693239cdStb 		    SN_rc2_cbc, test_number);
668693239cdStb 		return 0;
669693239cdStb 	}
670693239cdStb 
671693239cdStb 	return 1;
672693239cdStb }
673693239cdStb 
674693239cdStb static int
rc2_evp_test(size_t test_number,const struct rc2_test * rt,const char * label,const EVP_CIPHER * cipher)6752b54cc57Stb rc2_evp_test(size_t test_number, const struct rc2_test *rt, const char *label,
6762b54cc57Stb     const EVP_CIPHER *cipher)
6773cba5606Stb {
6783cba5606Stb 	EVP_CIPHER_CTX *ctx;
6793cba5606Stb 	uint8_t out[512];
6803cba5606Stb 	int in_len, out_len, total_len;
6813cba5606Stb 	int i;
6823cba5606Stb 	int success = 0;
6833cba5606Stb 
6843cba5606Stb 	if ((ctx = EVP_CIPHER_CTX_new()) == NULL) {
6853cba5606Stb 		fprintf(stderr, "FAIL (%s:%zu): EVP_CIPHER_CTX_new failed\n",
6863cba5606Stb 		    label, test_number);
6873cba5606Stb 		goto failed;
6883cba5606Stb 	}
6893cba5606Stb 
6903cba5606Stb 	/* EVP encryption */
6913cba5606Stb 	total_len = 0;
6923cba5606Stb 	memset(out, 0, sizeof(out));
6933cba5606Stb 	if (!EVP_EncryptInit(ctx, cipher, NULL, NULL)) {
6943cba5606Stb 		fprintf(stderr, "FAIL (%s:%zu): EVP_EncryptInit failed\n",
6953cba5606Stb 		    label, test_number);
6963cba5606Stb 		goto failed;
6973cba5606Stb 	}
6983cba5606Stb 
6993cba5606Stb 	if (EVP_CIPHER_CTX_ctrl(ctx, EVP_CTRL_SET_RC2_KEY_BITS,
7003cba5606Stb 	    rt->key_bits, NULL) <= 0) {
7013cba5606Stb 		fprintf(stderr, "FAIL (%s:%zu): EVP_CIPHER_CTX_ctrl failed\n",
7023cba5606Stb 		    label, test_number);
7033cba5606Stb 		goto failed;
7043cba5606Stb 	}
7053cba5606Stb 
7063cba5606Stb 	if (!EVP_CIPHER_CTX_set_key_length(ctx, rt->key_len)) {
7073cba5606Stb 		fprintf(stderr,
7083cba5606Stb 		    "FAIL (%s:%zu): EVP_CIPHER_CTX_set_key_length failed\n",
7093cba5606Stb 		    label, test_number);
7103cba5606Stb 		goto failed;
7113cba5606Stb 	}
7123cba5606Stb 
713693239cdStb 	if (!EVP_CIPHER_CTX_set_padding(ctx, rt->padding)) {
7143cba5606Stb 		fprintf(stderr,
7153cba5606Stb 		    "FAIL (%s:%zu): EVP_CIPHER_CTX_set_padding failed\n",
7163cba5606Stb 		    label, test_number);
7173cba5606Stb 		goto failed;
7183cba5606Stb 	}
7193cba5606Stb 
720693239cdStb 	if (!EVP_EncryptInit(ctx, NULL, rt->key, rt->iv)) {
7213cba5606Stb 		fprintf(stderr, "FAIL (%s:%zu): EVP_EncryptInit failed\n",
7223cba5606Stb 		    label, test_number);
7233cba5606Stb 		goto failed;
7243cba5606Stb 	}
7253cba5606Stb 
726693239cdStb 	for (i = 0; i < rt->in_len;) {
727*75a38c89Sjoshua 		in_len = arc4random_uniform(rt->in_len / 2);
728693239cdStb 		if (in_len > rt->in_len - i)
729693239cdStb 			in_len = rt->in_len - i;
7303cba5606Stb 
7313cba5606Stb 		if (!EVP_EncryptUpdate(ctx, out + total_len, &out_len,
7323cba5606Stb 		    rt->in + i, in_len)) {
7333cba5606Stb 			fprintf(stderr,
7343cba5606Stb 			    "FAIL (%s:%zu): EVP_EncryptUpdate failed\n",
7353cba5606Stb 			    label, test_number);
7363cba5606Stb 			goto failed;
7373cba5606Stb 		}
7383cba5606Stb 
7393cba5606Stb 		i += in_len;
7403cba5606Stb 		total_len += out_len;
7413cba5606Stb 	}
7423cba5606Stb 
7433cba5606Stb 	if (!EVP_EncryptFinal_ex(ctx, out + out_len, &out_len)) {
7443cba5606Stb 		fprintf(stderr, "FAIL (%s:%zu): EVP_EncryptFinal_ex failed\n",
7453cba5606Stb 		    label, test_number);
7463cba5606Stb 		goto failed;
7473cba5606Stb 	}
7483cba5606Stb 	total_len += out_len;
7493cba5606Stb 
7503cba5606Stb 	if (!EVP_CIPHER_CTX_reset(ctx)) {
7513cba5606Stb 		fprintf(stderr,
7523cba5606Stb 		    "FAIL (%s:%zu): EVP_CIPHER_CTX_reset failed\n",
7533cba5606Stb 		    label, test_number);
7543cba5606Stb 		goto failed;
7553cba5606Stb 	}
7563cba5606Stb 
757693239cdStb 	if (total_len != rt->out_len) {
7583cba5606Stb 		fprintf(stderr,
7593cba5606Stb 		    "FAIL (%s:%zu): EVP encryption length mismatch\n",
7603cba5606Stb 		    label, test_number);
7613cba5606Stb 		goto failed;
7623cba5606Stb 	}
7633cba5606Stb 
764693239cdStb 	if (memcmp(rt->out, out, rt->out_len) != 0) {
7653cba5606Stb 		fprintf(stderr, "FAIL (%s:%zu): EVP encryption mismatch\n",
7663cba5606Stb 		    label, test_number);
7673cba5606Stb 		goto failed;
7683cba5606Stb 	}
7693cba5606Stb 
7703cba5606Stb 	/* EVP decryption */
7713cba5606Stb 	total_len = 0;
7723cba5606Stb 	memset(out, 0, sizeof(out));
7733cba5606Stb 	if (!EVP_DecryptInit(ctx, cipher, NULL, NULL)) {
7743cba5606Stb 		fprintf(stderr, "FAIL (%s:%zu): EVP_DecryptInit failed\n",
7753cba5606Stb 		    label, test_number);
7763cba5606Stb 		goto failed;
7773cba5606Stb 	}
7783cba5606Stb 
7793cba5606Stb 	if (EVP_CIPHER_CTX_ctrl(ctx, EVP_CTRL_SET_RC2_KEY_BITS,
7803cba5606Stb 	    rt->key_bits, NULL) <= 0) {
7813cba5606Stb 		fprintf(stderr, "FAIL (%s:%zu): EVP_CIPHER_CTX_ctrl failed\n",
7823cba5606Stb 		    label, test_number);
7833cba5606Stb 		goto failed;
7843cba5606Stb 	}
7853cba5606Stb 
7863cba5606Stb 	if (!EVP_CIPHER_CTX_set_key_length(ctx, rt->key_len)) {
7873cba5606Stb 		fprintf(stderr,
7883cba5606Stb 		    "FAIL (%s:%zu): EVP_CIPHER_CTX_set_key_length failed\n",
7893cba5606Stb 		    label, test_number);
7903cba5606Stb 		goto failed;
7913cba5606Stb 	}
7923cba5606Stb 
793693239cdStb 	if (!EVP_CIPHER_CTX_set_padding(ctx, rt->padding)) {
7943cba5606Stb 		fprintf(stderr,
7953cba5606Stb 		    "FAIL (%s:%zu): EVP_CIPHER_CTX_set_padding failed\n",
7963cba5606Stb 		    label, test_number);
7973cba5606Stb 		goto failed;
7983cba5606Stb 	}
7993cba5606Stb 
800693239cdStb 	if (!EVP_DecryptInit(ctx, NULL, rt->key, rt->iv)) {
8013cba5606Stb 		fprintf(stderr, "FAIL (%s:%zu): EVP_DecryptInit failed\n",
8023cba5606Stb 		    label, test_number);
8033cba5606Stb 		goto failed;
8043cba5606Stb 	}
8053cba5606Stb 
806693239cdStb 	for (i = 0; i < rt->out_len;) {
807*75a38c89Sjoshua 		in_len = arc4random_uniform(rt->out_len / 2);
808693239cdStb 		if (in_len > rt->out_len - i)
809693239cdStb 			in_len = rt->out_len - i;
8103cba5606Stb 
8113cba5606Stb 		if (!EVP_DecryptUpdate(ctx, out + total_len, &out_len,
8123cba5606Stb 		    rt->out + i, in_len)) {
8133cba5606Stb 			fprintf(stderr,
8143cba5606Stb 			    "FAIL (%s:%zu): EVP_DecryptUpdate failed\n",
8153cba5606Stb 			    label, test_number);
8163cba5606Stb 			goto failed;
8173cba5606Stb 		}
8183cba5606Stb 
8193cba5606Stb 		i += in_len;
8203cba5606Stb 		total_len += out_len;
8213cba5606Stb 	}
8223cba5606Stb 
8233cba5606Stb 	if (!EVP_DecryptFinal_ex(ctx, out + total_len, &out_len)) {
8243cba5606Stb 		fprintf(stderr, "FAIL (%s:%zu): EVP_DecryptFinal_ex failed\n",
8253cba5606Stb 		    label, test_number);
8263cba5606Stb 		goto failed;
8273cba5606Stb 	}
8283cba5606Stb 	total_len += out_len;
8293cba5606Stb 
8303cba5606Stb 	if (!EVP_CIPHER_CTX_reset(ctx)) {
8313cba5606Stb 		fprintf(stderr,
8323cba5606Stb 		    "FAIL (%s:%zu): EVP_CIPHER_CTX_reset failed\n",
8333cba5606Stb 		    label, test_number);
8343cba5606Stb 		goto failed;
8353cba5606Stb 	}
8363cba5606Stb 
837693239cdStb 	if (total_len != rt->in_len) {
8383cba5606Stb 		fprintf(stderr,
8393cba5606Stb 		    "FAIL (%s:%zu): EVP decryption length mismatch\n",
8403cba5606Stb 		    label, test_number);
8413cba5606Stb 		goto failed;
8423cba5606Stb 	}
8433cba5606Stb 
844693239cdStb 	if (memcmp(rt->in, out, rt->in_len) != 0) {
8453cba5606Stb 		fprintf(stderr, "FAIL (%s:%zu): EVP decryption mismatch\n",
8463cba5606Stb 		    label, test_number);
8473cba5606Stb 		goto failed;
8483cba5606Stb 	}
8493cba5606Stb 
8503cba5606Stb 	success = 1;
8513cba5606Stb 
8523cba5606Stb  failed:
8533cba5606Stb 	EVP_CIPHER_CTX_free(ctx);
8543cba5606Stb 	return success;
8553cba5606Stb }
8563cba5606Stb 
8573cba5606Stb static int
rc2_test(void)858f859d7adStb rc2_test(void)
859f859d7adStb {
860f859d7adStb 	const struct rc2_test *rt;
8613cba5606Stb 	const char *label;
8623cba5606Stb 	const EVP_CIPHER *cipher;
863f859d7adStb 	size_t i;
864f859d7adStb 	int failed = 1;
865f859d7adStb 
866f859d7adStb 	for (i = 0; i < N_RC2_TESTS; i++) {
867f859d7adStb 		rt = &rc2_tests[i];
868f859d7adStb 		switch (rt->mode) {
869f859d7adStb 		case NID_rc2_ecb:
8703cba5606Stb 			label = SN_rc2_ecb;
8713cba5606Stb 			cipher = EVP_rc2_ecb();
872f859d7adStb 			if (!rc2_ecb_test(i, rt))
873f859d7adStb 				goto failed;
874f859d7adStb 			break;
875693239cdStb 		case NID_rc2_cbc:
876693239cdStb 			label = SN_rc2_cbc;
877693239cdStb 			cipher = EVP_rc2_cbc();
878693239cdStb 			if (!rc2_cbc_test(i, rt))
879693239cdStb 				goto failed;
880693239cdStb 			break;
881693239cdStb 		case NID_rc2_cfb64:
882693239cdStb 			label = SN_rc2_cfb64;
883693239cdStb 			cipher = EVP_rc2_cfb64();
884693239cdStb 			if (!rc2_cfb64_test(i, rt))
885693239cdStb 				goto failed;
886693239cdStb 			break;
887693239cdStb 		case NID_rc2_ofb64:
888693239cdStb 			label = SN_rc2_ofb64;
889693239cdStb 			cipher = EVP_rc2_ofb();
890693239cdStb 			if (!rc2_ofb64_test(i, rt))
891693239cdStb 				goto failed;
892693239cdStb 			break;
893f859d7adStb 		default:
894f859d7adStb 			fprintf(stderr, "FAIL: unknown mode (%d)\n",
895f859d7adStb 			    rt->mode);
896f859d7adStb 			goto failed;
897f859d7adStb 		}
8983cba5606Stb 
8993cba5606Stb 		if (!rc2_evp_test(i, rt, label, cipher))
9003cba5606Stb 			goto failed;
901f859d7adStb 	}
902f859d7adStb 
903f859d7adStb 	failed = 0;
904f859d7adStb 
905f859d7adStb  failed:
906f859d7adStb 	return failed;
907f859d7adStb }
908f859d7adStb 
909f859d7adStb int
main(int argc,char ** argv)910f859d7adStb main(int argc, char **argv)
911f859d7adStb {
912f859d7adStb 	int failed = 0;
913f859d7adStb 
914f859d7adStb 	failed |= rc2_test();
915f859d7adStb 
916f859d7adStb 	return failed;
917f859d7adStb }
918