summaryrefslogtreecommitdiff
path: root/src/regress/lib/libcrypto/rc2/rc2_test.c
diff options
context:
space:
mode:
Diffstat (limited to '')
-rw-r--r--src/regress/lib/libcrypto/rc2/rc2_test.c294
1 files changed, 294 insertions, 0 deletions
diff --git a/src/regress/lib/libcrypto/rc2/rc2_test.c b/src/regress/lib/libcrypto/rc2/rc2_test.c
new file mode 100644
index 0000000000..e82d675db1
--- /dev/null
+++ b/src/regress/lib/libcrypto/rc2/rc2_test.c
@@ -0,0 +1,294 @@
1/* $OpenBSD: rc2_test.c,v 1.1 2022/09/06 15:36:25 tb Exp $ */
2/*
3 * Copyright (c) 2022 Joshua Sing <joshua@hypera.dev>
4 *
5 * Permission to use, copy, modify, and distribute this software for any
6 * purpose with or without fee is hereby granted, provided that the above
7 * copyright notice and this permission notice appear in all copies.
8 *
9 * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
10 * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
11 * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
12 * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
13 * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
14 * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
15 * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
16 */
17
18#include <openssl/evp.h>
19#include <openssl/rc2.h>
20
21#include <stdint.h>
22#include <string.h>
23
24struct rc2_test {
25 const int mode;
26 const uint8_t key[64];
27 const int key_len;
28 const int key_bits;
29 const int len;
30 const uint8_t in[8];
31 const uint8_t out[8];
32};
33
34static const struct rc2_test rc2_tests[] = {
35 /* ECB (Test vectors from RFC 2268) */
36 {
37 .mode = NID_rc2_ecb,
38 .key = {
39 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
40 },
41 .key_len = 8,
42 .key_bits = 63,
43 .len = 8,
44 .in = {
45 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
46 },
47 .out = {
48 0xeb, 0xb7, 0x73, 0xf9, 0x93, 0x27, 0x8e, 0xff,
49 },
50 },
51 {
52 .mode = NID_rc2_ecb,
53 .key = {
54 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
55 },
56 .key_len = 8,
57 .key_bits = 64,
58 .len = 8,
59 .in = {
60 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
61 },
62 .out = {
63 0x27, 0x8b, 0x27, 0xe4, 0x2e, 0x2f, 0x0d, 0x49,
64 },
65 },
66 {
67 .mode = NID_rc2_ecb,
68 .key = {
69 0x30, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
70 },
71 .key_len = 8,
72 .key_bits = 64,
73 .len = 8,
74 .in = {
75 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01,
76 },
77 .out = {
78 0x30, 0x64, 0x9e, 0xdf, 0x9b, 0xe7, 0xd2, 0xc2,
79 },
80 },
81 {
82 .mode = NID_rc2_ecb,
83 .key = {
84 0x88,
85 },
86 .key_len = 1,
87 .key_bits = 64,
88 .len = 8,
89 .in = {
90 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
91 },
92 .out = {
93 0x61, 0xa8, 0xa2, 0x44, 0xad, 0xac, 0xcc, 0xf0,
94 },
95 },
96 {
97 .mode = NID_rc2_ecb,
98 .key = {
99 0x88, 0xbc, 0xa9, 0x0e, 0x90, 0x87, 0x5a,
100 },
101 .key_len = 7,
102 .key_bits = 64,
103 .len = 8,
104 .in = {
105 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
106 },
107 .out = {
108 0x6c, 0xcf, 0x43, 0x08, 0x97, 0x4c, 0x26, 0x7f,
109 },
110 },
111 {
112 .mode = NID_rc2_ecb,
113 .key = {
114 0x88, 0xbc, 0xa9, 0x0e, 0x90, 0x87, 0x5a, 0x7f,
115 0x0f, 0x79, 0xc3, 0x84, 0x62, 0x7b, 0xaf, 0xb2,
116 },
117 .key_len = 16,
118 .key_bits = 64,
119 .len = 8,
120 .in = {
121 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
122 },
123 .out = {
124 0x1a, 0x80, 0x7d, 0x27, 0x2b, 0xbe, 0x5d, 0xb1,
125 },
126 },
127 {
128 .mode = NID_rc2_ecb,
129 .key = {
130 0x88, 0xbc, 0xa9, 0x0e, 0x90, 0x87, 0x5a, 0x7f,
131 0x0f, 0x79, 0xc3, 0x84, 0x62, 0x7b, 0xaf, 0xb2,
132 },
133 .key_len = 16,
134 .key_bits = 128,
135 .len = 8,
136 .in = {
137 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
138 },
139 .out = {
140 0x22, 0x69, 0x55, 0x2a, 0xb0, 0xf8, 0x5c, 0xa6,
141 },
142 },
143 {
144 .mode = NID_rc2_ecb,
145 .key = {
146 0x88, 0xbc, 0xa9, 0x0e, 0x90, 0x87, 0x5a, 0x7f,
147 0x0f, 0x79, 0xc3, 0x84, 0x62, 0x7b, 0xaf, 0xb2,
148 0x16, 0xf8, 0x0a, 0x6f, 0x85, 0x92, 0x05, 0x84,
149 0xc4, 0x2f, 0xce, 0xb0, 0xbe, 0x25, 0x5d, 0xaf,
150 0x1e,
151 },
152 .key_len = 33,
153 .key_bits = 129,
154 .len = 8,
155 .in = {
156 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
157 },
158 .out = {
159 0x5b, 0x78, 0xd3, 0xa4, 0x3d, 0xff, 0xf1, 0xf1,
160 },
161 },
162
163 /* ECB (Test vectors from http://websites.umich.edu/~x509/ssleay/rrc2.html) */
164 {
165 .mode = NID_rc2_ecb,
166 .key = {
167 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
168 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
169 },
170 .key_len = 16,
171 .len = 8,
172 .in = {
173 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
174 },
175 .out = {
176 0x1c, 0x19, 0x8a, 0x83, 0x8d, 0xf0, 0x28, 0xb7,
177 },
178 },
179 {
180 .mode = NID_rc2_ecb,
181 .key = {
182 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
183 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01,
184 },
185 .key_len = 16,
186 .len = 8,
187 .in = {
188 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
189 },
190 .out = {
191 0x21, 0x82, 0x9C, 0x78, 0xA9, 0xF9, 0xC0, 0x74,
192 },
193 },
194 {
195 .mode = NID_rc2_ecb,
196 .key = {
197 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
198 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
199 },
200 .key_len = 16,
201 .len = 8,
202 .in = {
203 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
204 },
205 .out = {
206 0x13, 0xdb, 0x35, 0x17, 0xd3, 0x21, 0x86, 0x9e,
207 },
208 },
209 {
210 .mode = NID_rc2_ecb,
211 .key = {
212 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07,
213 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f,
214 },
215 .key_len = 16,
216 .len = 8,
217 .in = {
218 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
219 },
220 .out = {
221 0x50, 0xdc, 0x01, 0x62, 0xbd, 0x75, 0x7f, 0x31,
222 },
223 },
224};
225
226#define N_RC2_TESTS (sizeof(rc2_tests) / sizeof(rc2_tests[0]))
227
228static int
229rc2_ecb_test(size_t test_number, const struct rc2_test *rt)
230{
231 RC2_KEY key;
232 uint8_t out[8];
233
234 /* Encryption */
235 memset(out, 0, sizeof(out));
236 RC2_set_key(&key, rt->key_len, rt->key, rt->key_bits);
237 RC2_ecb_encrypt(rt->in, out, &key, 1);
238
239 if (memcmp(rt->out, out, rt->len) != 0) {
240 fprintf(stderr, "FAIL (%s:%zu): encryption mismatch\n",
241 SN_rc2_ecb, test_number);
242 return 0;
243 }
244
245 /* Decryption */
246 memset(out, 0, sizeof(out));
247 RC2_set_key(&key, rt->key_len, rt->key, rt->key_bits);
248 RC2_ecb_encrypt(rt->out, out, &key, 0);
249
250 if (memcmp(rt->in, out, rt->len) != 0) {
251 fprintf(stderr, "FAIL (%s:%zu): decryption mismatch\n",
252 SN_rc2_ecb, test_number);
253 return 0;
254 }
255
256 return 1;
257}
258
259static int
260rc2_test(void)
261{
262 const struct rc2_test *rt;
263 size_t i;
264 int failed = 1;
265
266 for (i = 0; i < N_RC2_TESTS; i++) {
267 rt = &rc2_tests[i];
268 switch (rt->mode) {
269 case NID_rc2_ecb:
270 if (!rc2_ecb_test(i, rt))
271 goto failed;
272 break;
273 default:
274 fprintf(stderr, "FAIL: unknown mode (%d)\n",
275 rt->mode);
276 goto failed;
277 }
278 }
279
280 failed = 0;
281
282 failed:
283 return failed;
284}
285
286int
287main(int argc, char **argv)
288{
289 int failed = 0;
290
291 failed |= rc2_test();
292
293 return failed;
294}