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