diff options
author | tb <> | 2022-09-12 13:11:36 +0000 |
---|---|---|
committer | tb <> | 2022-09-12 13:11:36 +0000 |
commit | efa6d2fe42f5eb1296915dcd7b56cac3045e92bc (patch) | |
tree | e0b366395ac66afeb26e72998b8594fe3490071b /src | |
parent | 46fd4dcd31c01d9915dc163de60f0b1e13211bbe (diff) | |
download | openbsd-efa6d2fe42f5eb1296915dcd7b56cac3045e92bc.tar.gz openbsd-efa6d2fe42f5eb1296915dcd7b56cac3045e92bc.tar.bz2 openbsd-efa6d2fe42f5eb1296915dcd7b56cac3045e92bc.zip |
Add CBC, CFB64 and OFB64 test coverage for RC2
From Joshua Sing
Diffstat (limited to 'src')
-rw-r--r-- | src/regress/lib/libcrypto/rc2/rc2_test.c | 497 |
1 files changed, 463 insertions, 34 deletions
diff --git a/src/regress/lib/libcrypto/rc2/rc2_test.c b/src/regress/lib/libcrypto/rc2/rc2_test.c index 08a7daea46..ab95e587f8 100644 --- a/src/regress/lib/libcrypto/rc2/rc2_test.c +++ b/src/regress/lib/libcrypto/rc2/rc2_test.c | |||
@@ -1,4 +1,4 @@ | |||
1 | /* $OpenBSD: rc2_test.c,v 1.4 2022/09/12 13:09:01 tb Exp $ */ | 1 | /* $OpenBSD: rc2_test.c,v 1.5 2022/09/12 13:11:36 tb Exp $ */ |
2 | /* | 2 | /* |
3 | * Copyright (c) 2022 Joshua Sing <joshua@hypera.dev> | 3 | * Copyright (c) 2022 Joshua Sing <joshua@hypera.dev> |
4 | * | 4 | * |
@@ -26,9 +26,13 @@ struct rc2_test { | |||
26 | const uint8_t key[64]; | 26 | const uint8_t key[64]; |
27 | const int key_len; | 27 | const int key_len; |
28 | const int key_bits; | 28 | const int key_bits; |
29 | const int len; | 29 | const uint8_t iv[64]; |
30 | const uint8_t in[8]; | 30 | const int iv_len; |
31 | const uint8_t out[8]; | 31 | const uint8_t in[64]; |
32 | const int in_len; | ||
33 | const uint8_t out[64]; | ||
34 | const int out_len; | ||
35 | const int padding; | ||
32 | }; | 36 | }; |
33 | 37 | ||
34 | static const struct rc2_test rc2_tests[] = { | 38 | static const struct rc2_test rc2_tests[] = { |
@@ -40,13 +44,14 @@ static const struct rc2_test rc2_tests[] = { | |||
40 | }, | 44 | }, |
41 | .key_len = 8, | 45 | .key_len = 8, |
42 | .key_bits = 63, | 46 | .key_bits = 63, |
43 | .len = 8, | ||
44 | .in = { | 47 | .in = { |
45 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, | 48 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, |
46 | }, | 49 | }, |
50 | .in_len = 8, | ||
47 | .out = { | 51 | .out = { |
48 | 0xeb, 0xb7, 0x73, 0xf9, 0x93, 0x27, 0x8e, 0xff, | 52 | 0xeb, 0xb7, 0x73, 0xf9, 0x93, 0x27, 0x8e, 0xff, |
49 | }, | 53 | }, |
54 | .out_len = 8, | ||
50 | }, | 55 | }, |
51 | { | 56 | { |
52 | .mode = NID_rc2_ecb, | 57 | .mode = NID_rc2_ecb, |
@@ -55,13 +60,14 @@ static const struct rc2_test rc2_tests[] = { | |||
55 | }, | 60 | }, |
56 | .key_len = 8, | 61 | .key_len = 8, |
57 | .key_bits = 64, | 62 | .key_bits = 64, |
58 | .len = 8, | ||
59 | .in = { | 63 | .in = { |
60 | 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, | 64 | 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, |
61 | }, | 65 | }, |
66 | .in_len = 8, | ||
62 | .out = { | 67 | .out = { |
63 | 0x27, 0x8b, 0x27, 0xe4, 0x2e, 0x2f, 0x0d, 0x49, | 68 | 0x27, 0x8b, 0x27, 0xe4, 0x2e, 0x2f, 0x0d, 0x49, |
64 | }, | 69 | }, |
70 | .out_len = 8, | ||
65 | }, | 71 | }, |
66 | { | 72 | { |
67 | .mode = NID_rc2_ecb, | 73 | .mode = NID_rc2_ecb, |
@@ -70,13 +76,14 @@ static const struct rc2_test rc2_tests[] = { | |||
70 | }, | 76 | }, |
71 | .key_len = 8, | 77 | .key_len = 8, |
72 | .key_bits = 64, | 78 | .key_bits = 64, |
73 | .len = 8, | ||
74 | .in = { | 79 | .in = { |
75 | 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, | 80 | 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, |
76 | }, | 81 | }, |
82 | .in_len = 8, | ||
77 | .out = { | 83 | .out = { |
78 | 0x30, 0x64, 0x9e, 0xdf, 0x9b, 0xe7, 0xd2, 0xc2, | 84 | 0x30, 0x64, 0x9e, 0xdf, 0x9b, 0xe7, 0xd2, 0xc2, |
79 | }, | 85 | }, |
86 | .out_len = 8, | ||
80 | }, | 87 | }, |
81 | { | 88 | { |
82 | .mode = NID_rc2_ecb, | 89 | .mode = NID_rc2_ecb, |
@@ -85,13 +92,14 @@ static const struct rc2_test rc2_tests[] = { | |||
85 | }, | 92 | }, |
86 | .key_len = 1, | 93 | .key_len = 1, |
87 | .key_bits = 64, | 94 | .key_bits = 64, |
88 | .len = 8, | ||
89 | .in = { | 95 | .in = { |
90 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, | 96 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, |
91 | }, | 97 | }, |
98 | .in_len = 8, | ||
92 | .out = { | 99 | .out = { |
93 | 0x61, 0xa8, 0xa2, 0x44, 0xad, 0xac, 0xcc, 0xf0, | 100 | 0x61, 0xa8, 0xa2, 0x44, 0xad, 0xac, 0xcc, 0xf0, |
94 | }, | 101 | }, |
102 | .out_len = 8, | ||
95 | }, | 103 | }, |
96 | { | 104 | { |
97 | .mode = NID_rc2_ecb, | 105 | .mode = NID_rc2_ecb, |
@@ -100,13 +108,14 @@ static const struct rc2_test rc2_tests[] = { | |||
100 | }, | 108 | }, |
101 | .key_len = 7, | 109 | .key_len = 7, |
102 | .key_bits = 64, | 110 | .key_bits = 64, |
103 | .len = 8, | ||
104 | .in = { | 111 | .in = { |
105 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, | 112 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, |
106 | }, | 113 | }, |
114 | .in_len = 8, | ||
107 | .out = { | 115 | .out = { |
108 | 0x6c, 0xcf, 0x43, 0x08, 0x97, 0x4c, 0x26, 0x7f, | 116 | 0x6c, 0xcf, 0x43, 0x08, 0x97, 0x4c, 0x26, 0x7f, |
109 | }, | 117 | }, |
118 | .out_len = 8, | ||
110 | }, | 119 | }, |
111 | { | 120 | { |
112 | .mode = NID_rc2_ecb, | 121 | .mode = NID_rc2_ecb, |
@@ -116,13 +125,14 @@ static const struct rc2_test rc2_tests[] = { | |||
116 | }, | 125 | }, |
117 | .key_len = 16, | 126 | .key_len = 16, |
118 | .key_bits = 64, | 127 | .key_bits = 64, |
119 | .len = 8, | ||
120 | .in = { | 128 | .in = { |
121 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, | 129 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, |
122 | }, | 130 | }, |
131 | .in_len = 8, | ||
123 | .out = { | 132 | .out = { |
124 | 0x1a, 0x80, 0x7d, 0x27, 0x2b, 0xbe, 0x5d, 0xb1, | 133 | 0x1a, 0x80, 0x7d, 0x27, 0x2b, 0xbe, 0x5d, 0xb1, |
125 | }, | 134 | }, |
135 | .out_len = 8, | ||
126 | }, | 136 | }, |
127 | { | 137 | { |
128 | .mode = NID_rc2_ecb, | 138 | .mode = NID_rc2_ecb, |
@@ -132,13 +142,14 @@ static const struct rc2_test rc2_tests[] = { | |||
132 | }, | 142 | }, |
133 | .key_len = 16, | 143 | .key_len = 16, |
134 | .key_bits = 128, | 144 | .key_bits = 128, |
135 | .len = 8, | ||
136 | .in = { | 145 | .in = { |
137 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, | 146 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, |
138 | }, | 147 | }, |
148 | .in_len = 8, | ||
139 | .out = { | 149 | .out = { |
140 | 0x22, 0x69, 0x55, 0x2a, 0xb0, 0xf8, 0x5c, 0xa6, | 150 | 0x22, 0x69, 0x55, 0x2a, 0xb0, 0xf8, 0x5c, 0xa6, |
141 | }, | 151 | }, |
152 | .out_len = 8, | ||
142 | }, | 153 | }, |
143 | { | 154 | { |
144 | .mode = NID_rc2_ecb, | 155 | .mode = NID_rc2_ecb, |
@@ -151,13 +162,14 @@ static const struct rc2_test rc2_tests[] = { | |||
151 | }, | 162 | }, |
152 | .key_len = 33, | 163 | .key_len = 33, |
153 | .key_bits = 129, | 164 | .key_bits = 129, |
154 | .len = 8, | ||
155 | .in = { | 165 | .in = { |
156 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, | 166 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, |
157 | }, | 167 | }, |
168 | .in_len = 8, | ||
158 | .out = { | 169 | .out = { |
159 | 0x5b, 0x78, 0xd3, 0xa4, 0x3d, 0xff, 0xf1, 0xf1, | 170 | 0x5b, 0x78, 0xd3, 0xa4, 0x3d, 0xff, 0xf1, 0xf1, |
160 | }, | 171 | }, |
172 | .out_len = 8, | ||
161 | }, | 173 | }, |
162 | 174 | ||
163 | /* ECB (Test vectors from http://websites.umich.edu/~x509/ssleay/rrc2.html) */ | 175 | /* ECB (Test vectors from http://websites.umich.edu/~x509/ssleay/rrc2.html) */ |
@@ -169,13 +181,14 @@ static const struct rc2_test rc2_tests[] = { | |||
169 | }, | 181 | }, |
170 | .key_len = 16, | 182 | .key_len = 16, |
171 | .key_bits = 1024, | 183 | .key_bits = 1024, |
172 | .len = 8, | ||
173 | .in = { | 184 | .in = { |
174 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, | 185 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, |
175 | }, | 186 | }, |
187 | .in_len = 8, | ||
176 | .out = { | 188 | .out = { |
177 | 0x1c, 0x19, 0x8a, 0x83, 0x8d, 0xf0, 0x28, 0xb7, | 189 | 0x1c, 0x19, 0x8a, 0x83, 0x8d, 0xf0, 0x28, 0xb7, |
178 | }, | 190 | }, |
191 | .out_len = 8, | ||
179 | }, | 192 | }, |
180 | { | 193 | { |
181 | .mode = NID_rc2_ecb, | 194 | .mode = NID_rc2_ecb, |
@@ -185,13 +198,14 @@ static const struct rc2_test rc2_tests[] = { | |||
185 | }, | 198 | }, |
186 | .key_len = 16, | 199 | .key_len = 16, |
187 | .key_bits = 1024, | 200 | .key_bits = 1024, |
188 | .len = 8, | ||
189 | .in = { | 201 | .in = { |
190 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, | 202 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, |
191 | }, | 203 | }, |
204 | .in_len = 8, | ||
192 | .out = { | 205 | .out = { |
193 | 0x21, 0x82, 0x9C, 0x78, 0xA9, 0xF9, 0xC0, 0x74, | 206 | 0x21, 0x82, 0x9C, 0x78, 0xA9, 0xF9, 0xC0, 0x74, |
194 | }, | 207 | }, |
208 | .out_len = 8, | ||
195 | }, | 209 | }, |
196 | { | 210 | { |
197 | .mode = NID_rc2_ecb, | 211 | .mode = NID_rc2_ecb, |
@@ -201,13 +215,14 @@ static const struct rc2_test rc2_tests[] = { | |||
201 | }, | 215 | }, |
202 | .key_len = 16, | 216 | .key_len = 16, |
203 | .key_bits = 1024, | 217 | .key_bits = 1024, |
204 | .len = 8, | ||
205 | .in = { | 218 | .in = { |
206 | 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, | 219 | 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, |
207 | }, | 220 | }, |
221 | .in_len = 8, | ||
208 | .out = { | 222 | .out = { |
209 | 0x13, 0xdb, 0x35, 0x17, 0xd3, 0x21, 0x86, 0x9e, | 223 | 0x13, 0xdb, 0x35, 0x17, 0xd3, 0x21, 0x86, 0x9e, |
210 | }, | 224 | }, |
225 | .out_len = 8, | ||
211 | }, | 226 | }, |
212 | { | 227 | { |
213 | .mode = NID_rc2_ecb, | 228 | .mode = NID_rc2_ecb, |
@@ -217,13 +232,305 @@ static const struct rc2_test rc2_tests[] = { | |||
217 | }, | 232 | }, |
218 | .key_len = 16, | 233 | .key_len = 16, |
219 | .key_bits = 1024, | 234 | .key_bits = 1024, |
220 | .len = 8, | ||
221 | .in = { | 235 | .in = { |
222 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, | 236 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, |
223 | }, | 237 | }, |
238 | .in_len = 8, | ||
224 | .out = { | 239 | .out = { |
225 | 0x50, 0xdc, 0x01, 0x62, 0xbd, 0x75, 0x7f, 0x31, | 240 | 0x50, 0xdc, 0x01, 0x62, 0xbd, 0x75, 0x7f, 0x31, |
226 | }, | 241 | }, |
242 | .out_len = 8, | ||
243 | }, | ||
244 | |||
245 | /* CBC (generated using https://github.com/joshuasing/libressl-test-gen) */ | ||
246 | { | ||
247 | .mode = NID_rc2_cbc, | ||
248 | .key = { | ||
249 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, | ||
250 | }, | ||
251 | .key_len = 8, | ||
252 | .key_bits = 64, | ||
253 | .iv = { | ||
254 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, | ||
255 | }, | ||
256 | .iv_len = 8, | ||
257 | .in = { | ||
258 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, | ||
259 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, | ||
260 | }, | ||
261 | .in_len = 16, | ||
262 | .out = { | ||
263 | 0xeb, 0xb7, 0x73, 0xf9, 0x93, 0x27, 0x8e, 0xff, | ||
264 | 0xf0, 0x51, 0x77, 0x8b, 0x65, 0xdb, 0x13, 0x57, | ||
265 | }, | ||
266 | .out_len = 16, | ||
267 | }, | ||
268 | { | ||
269 | .mode = NID_rc2_cbc, | ||
270 | .key = { | ||
271 | 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, | ||
272 | 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f, | ||
273 | }, | ||
274 | .key_len = 16, | ||
275 | .key_bits = 128, | ||
276 | .iv = { | ||
277 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, | ||
278 | }, | ||
279 | .iv_len = 8, | ||
280 | .in = { | ||
281 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, | ||
282 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, | ||
283 | }, | ||
284 | .in_len = 16, | ||
285 | .out = { | ||
286 | 0x9c, 0x4b, 0xfe, 0x6d, 0xfe, 0x73, 0x9c, 0x2b, | ||
287 | 0x52, 0x8f, 0xc8, 0x47, 0x2b, 0x66, 0xf9, 0x70, | ||
288 | }, | ||
289 | .out_len = 16, | ||
290 | }, | ||
291 | { | ||
292 | .mode = NID_rc2_cbc, | ||
293 | .key = { | ||
294 | 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, | ||
295 | 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f, | ||
296 | }, | ||
297 | .key_len = 16, | ||
298 | .key_bits = 128, | ||
299 | .iv = { | ||
300 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, | ||
301 | }, | ||
302 | .iv_len = 8, | ||
303 | .in = { | ||
304 | 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, | ||
305 | 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f, | ||
306 | }, | ||
307 | .in_len = 16, | ||
308 | .out = { | ||
309 | 0x8b, 0x11, 0x08, 0x1c, 0xf0, 0xa0, 0x86, 0xe9, | ||
310 | 0x60, 0x57, 0x69, 0x5d, 0xdd, 0x42, 0x38, 0xe3, | ||
311 | }, | ||
312 | .out_len = 16, | ||
313 | }, | ||
314 | { | ||
315 | .mode = NID_rc2_cbc, | ||
316 | .key = { | ||
317 | 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, | ||
318 | 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f, | ||
319 | }, | ||
320 | .key_len = 16, | ||
321 | .key_bits = 128, | ||
322 | .iv = { | ||
323 | 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, | ||
324 | }, | ||
325 | .iv_len = 8, | ||
326 | .in = { | ||
327 | 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, | ||
328 | 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f, | ||
329 | 0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17, | ||
330 | 0x18, 0x19, 0x1a, 0x1b, 0x1c, 0x1d, 0x1e, 0x1f, | ||
331 | }, | ||
332 | .in_len = 32, | ||
333 | .out = { | ||
334 | 0x9c, 0x4b, 0xfe, 0x6d, 0xfe, 0x73, 0x9c, 0x2b, | ||
335 | 0x29, 0xf1, 0x7a, 0xd2, 0x16, 0xa0, 0xb2, 0xc6, | ||
336 | 0xd1, 0xa2, 0x31, 0xbe, 0xa3, 0x94, 0xc6, 0xb0, | ||
337 | 0x81, 0x22, 0x27, 0x17, 0x5b, 0xd4, 0x6d, 0x29, | ||
338 | }, | ||
339 | .out_len = 32, | ||
340 | }, | ||
341 | |||
342 | /* CFB64 (generated using https://github.com/joshuasing/libressl-test-gen) */ | ||
343 | { | ||
344 | .mode = NID_rc2_cfb64, | ||
345 | .key = { | ||
346 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, | ||
347 | }, | ||
348 | .key_len = 8, | ||
349 | .key_bits = 64, | ||
350 | .iv = { | ||
351 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, | ||
352 | }, | ||
353 | .iv_len = 8, | ||
354 | .in = { | ||
355 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, | ||
356 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, | ||
357 | }, | ||
358 | .in_len = 16, | ||
359 | .out = { | ||
360 | 0xeb, 0xb7, 0x73, 0xf9, 0x93, 0x27, 0x8e, 0xff, | ||
361 | 0xf0, 0x51, 0x77, 0x8b, 0x65, 0xdb, 0x13, 0x57, | ||
362 | }, | ||
363 | .out_len = 16, | ||
364 | }, | ||
365 | { | ||
366 | .mode = NID_rc2_cfb64, | ||
367 | .key = { | ||
368 | 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, | ||
369 | 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f, | ||
370 | }, | ||
371 | .key_len = 16, | ||
372 | .key_bits = 128, | ||
373 | .iv = { | ||
374 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, | ||
375 | }, | ||
376 | .iv_len = 8, | ||
377 | .in = { | ||
378 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, | ||
379 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, | ||
380 | }, | ||
381 | .in_len = 16, | ||
382 | .out = { | ||
383 | 0x9c, 0x4b, 0xfe, 0x6d, 0xfe, 0x73, 0x9c, 0x2b, | ||
384 | 0x52, 0x8f, 0xc8, 0x47, 0x2b, 0x66, 0xf9, 0x70, | ||
385 | }, | ||
386 | .out_len = 16, | ||
387 | }, | ||
388 | { | ||
389 | .mode = NID_rc2_cfb64, | ||
390 | .key = { | ||
391 | 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, | ||
392 | 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f, | ||
393 | }, | ||
394 | .key_len = 16, | ||
395 | .key_bits = 128, | ||
396 | .iv = { | ||
397 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, | ||
398 | }, | ||
399 | .iv_len = 8, | ||
400 | .in = { | ||
401 | 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, | ||
402 | 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f, | ||
403 | }, | ||
404 | .in_len = 16, | ||
405 | .out = { | ||
406 | 0x9c, 0x4a, 0xfc, 0x6e, 0xfa, 0x76, 0x9a, 0x2c, | ||
407 | 0xeb, 0xdf, 0x25, 0xb0, 0x15, 0x8b, 0x6a, 0x2a, | ||
408 | }, | ||
409 | .out_len = 16, | ||
410 | }, | ||
411 | { | ||
412 | .mode = NID_rc2_cfb64, | ||
413 | .key = { | ||
414 | 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, | ||
415 | 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f, | ||
416 | }, | ||
417 | .key_len = 16, | ||
418 | .key_bits = 128, | ||
419 | .iv = { | ||
420 | 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, | ||
421 | }, | ||
422 | .iv_len = 8, | ||
423 | .in = { | ||
424 | 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, | ||
425 | 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f, | ||
426 | 0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17, | ||
427 | 0x18, 0x19, 0x1a, 0x1b, 0x1c, 0x1d, 0x1e, 0x1f, | ||
428 | }, | ||
429 | .in_len = 32, | ||
430 | .out = { | ||
431 | 0x8b, 0x10, 0x0a, 0x1f, 0xf4, 0xa5, 0x80, 0xee, | ||
432 | 0x94, 0x4d, 0xc3, 0xcd, 0x26, 0x79, 0x81, 0xc0, | ||
433 | 0xe9, 0x3e, 0x20, 0x85, 0x11, 0x71, 0x61, 0x2a, | ||
434 | 0x1d, 0x4c, 0x8a, 0xe2, 0xb7, 0x0a, 0xa8, 0xcf, | ||
435 | }, | ||
436 | .out_len = 32, | ||
437 | }, | ||
438 | |||
439 | /* OFB64 (generated using https://github.com/joshuasing/libressl-test-gen) */ | ||
440 | { | ||
441 | .mode = NID_rc2_ofb64, | ||
442 | .key = { | ||
443 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, | ||
444 | }, | ||
445 | .key_len = 8, | ||
446 | .key_bits = 64, | ||
447 | .iv = { | ||
448 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, | ||
449 | }, | ||
450 | .iv_len = 8, | ||
451 | .in = { | ||
452 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, | ||
453 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, | ||
454 | }, | ||
455 | .in_len = 16, | ||
456 | .out = { | ||
457 | 0xeb, 0xb7, 0x73, 0xf9, 0x93, 0x27, 0x8e, 0xff, | ||
458 | 0xf0, 0x51, 0x77, 0x8b, 0x65, 0xdb, 0x13, 0x57, | ||
459 | }, | ||
460 | .out_len = 16, | ||
461 | }, | ||
462 | { | ||
463 | .mode = NID_rc2_ofb64, | ||
464 | .key = { | ||
465 | 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, | ||
466 | 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f, | ||
467 | }, | ||
468 | .key_len = 16, | ||
469 | .key_bits = 128, | ||
470 | .iv = { | ||
471 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, | ||
472 | }, | ||
473 | .iv_len = 8, | ||
474 | .in = { | ||
475 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, | ||
476 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, | ||
477 | }, | ||
478 | .in_len = 16, | ||
479 | .out = { | ||
480 | 0x9c, 0x4b, 0xfe, 0x6d, 0xfe, 0x73, 0x9c, 0x2b, | ||
481 | 0x52, 0x8f, 0xc8, 0x47, 0x2b, 0x66, 0xf9, 0x70, | ||
482 | }, | ||
483 | .out_len = 16, | ||
484 | }, | ||
485 | { | ||
486 | .mode = NID_rc2_ofb64, | ||
487 | .key = { | ||
488 | 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, | ||
489 | 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f, | ||
490 | }, | ||
491 | .key_len = 16, | ||
492 | .key_bits = 128, | ||
493 | .iv = { | ||
494 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, | ||
495 | }, | ||
496 | .iv_len = 8, | ||
497 | .in = { | ||
498 | 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, | ||
499 | 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f, | ||
500 | }, | ||
501 | .in_len = 16, | ||
502 | .out = { | ||
503 | 0x9c, 0x4a, 0xfc, 0x6e, 0xfa, 0x76, 0x9a, 0x2c, | ||
504 | 0x5a, 0x86, 0xc2, 0x4c, 0x27, 0x6b, 0xf7, 0x7f, | ||
505 | }, | ||
506 | .out_len = 16, | ||
507 | }, | ||
508 | { | ||
509 | .mode = NID_rc2_ofb64, | ||
510 | .key = { | ||
511 | 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, | ||
512 | 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f, | ||
513 | }, | ||
514 | .key_len = 16, | ||
515 | .key_bits = 128, | ||
516 | .iv = { | ||
517 | 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, | ||
518 | }, | ||
519 | .iv_len = 8, | ||
520 | .in = { | ||
521 | 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, | ||
522 | 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f, | ||
523 | 0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17, | ||
524 | 0x18, 0x19, 0x1a, 0x1b, 0x1c, 0x1d, 0x1e, 0x1f, | ||
525 | }, | ||
526 | .in_len = 32, | ||
527 | .out = { | ||
528 | 0x8b, 0x10, 0x0a, 0x1f, 0xf4, 0xa5, 0x80, 0xee, | ||
529 | 0xfa, 0x1d, 0x1a, 0x7c, 0xb2, 0x93, 0x00, 0x9d, | ||
530 | 0x36, 0xa1, 0xff, 0x3a, 0x77, 0x1d, 0x00, 0x9b, | ||
531 | 0x20, 0xde, 0x5f, 0x93, 0xcc, 0x3e, 0x51, 0xaa, | ||
532 | }, | ||
533 | .out_len = 32, | ||
227 | }, | 534 | }, |
228 | }; | 535 | }; |
229 | 536 | ||
@@ -240,7 +547,7 @@ rc2_ecb_test(size_t test_number, const struct rc2_test *rt) | |||
240 | RC2_set_key(&key, rt->key_len, rt->key, rt->key_bits); | 547 | RC2_set_key(&key, rt->key_len, rt->key, rt->key_bits); |
241 | RC2_ecb_encrypt(rt->in, out, &key, 1); | 548 | RC2_ecb_encrypt(rt->in, out, &key, 1); |
242 | 549 | ||
243 | if (memcmp(rt->out, out, rt->len) != 0) { | 550 | if (memcmp(rt->out, out, rt->out_len) != 0) { |
244 | fprintf(stderr, "FAIL (%s:%zu): encryption mismatch\n", | 551 | fprintf(stderr, "FAIL (%s:%zu): encryption mismatch\n", |
245 | SN_rc2_ecb, test_number); | 552 | SN_rc2_ecb, test_number); |
246 | return 0; | 553 | return 0; |
@@ -251,7 +558,7 @@ rc2_ecb_test(size_t test_number, const struct rc2_test *rt) | |||
251 | RC2_set_key(&key, rt->key_len, rt->key, rt->key_bits); | 558 | RC2_set_key(&key, rt->key_len, rt->key, rt->key_bits); |
252 | RC2_ecb_encrypt(rt->out, out, &key, 0); | 559 | RC2_ecb_encrypt(rt->out, out, &key, 0); |
253 | 560 | ||
254 | if (memcmp(rt->in, out, rt->len) != 0) { | 561 | if (memcmp(rt->in, out, rt->in_len) != 0) { |
255 | fprintf(stderr, "FAIL (%s:%zu): decryption mismatch\n", | 562 | fprintf(stderr, "FAIL (%s:%zu): decryption mismatch\n", |
256 | SN_rc2_ecb, test_number); | 563 | SN_rc2_ecb, test_number); |
257 | return 0; | 564 | return 0; |
@@ -261,6 +568,110 @@ rc2_ecb_test(size_t test_number, const struct rc2_test *rt) | |||
261 | } | 568 | } |
262 | 569 | ||
263 | static int | 570 | static int |
571 | rc2_cbc_test(size_t test_number, const struct rc2_test *rt) | ||
572 | { | ||
573 | RC2_KEY key; | ||
574 | uint8_t out[512]; | ||
575 | uint8_t iv[64]; | ||
576 | |||
577 | /* Encryption */ | ||
578 | memset(out, 0, sizeof(out)); | ||
579 | memcpy(iv, rt->iv, rt->iv_len); | ||
580 | RC2_set_key(&key, rt->key_len, rt->key, rt->key_bits); | ||
581 | RC2_cbc_encrypt(rt->in, out, rt->in_len, &key, iv, 1); | ||
582 | |||
583 | if (memcmp(rt->out, out, rt->out_len) != 0) { | ||
584 | fprintf(stderr, "FAIL (%s:%zu): encryption mismatch\n", | ||
585 | SN_rc2_cbc, test_number); | ||
586 | return 0; | ||
587 | } | ||
588 | |||
589 | /* Decryption */ | ||
590 | memset(out, 0, sizeof(out)); | ||
591 | memcpy(iv, rt->iv, rt->iv_len); | ||
592 | RC2_set_key(&key, rt->key_len, rt->key, rt->key_bits); | ||
593 | RC2_cbc_encrypt(rt->out, out, rt->out_len, &key, iv, 0); | ||
594 | |||
595 | if (memcmp(rt->in, out, rt->in_len) != 0) { | ||
596 | fprintf(stderr, "FAIL (%s:%zu): decryption mismatch\n", | ||
597 | SN_rc2_cbc, test_number); | ||
598 | return 0; | ||
599 | } | ||
600 | |||
601 | return 1; | ||
602 | } | ||
603 | |||
604 | static int | ||
605 | rc2_cfb64_test(size_t test_number, const struct rc2_test *rt) | ||
606 | { | ||
607 | RC2_KEY key; | ||
608 | uint8_t out[512]; | ||
609 | uint8_t iv[64]; | ||
610 | int remainder = 0; | ||
611 | |||
612 | /* Encryption */ | ||
613 | memset(out, 0, sizeof(out)); | ||
614 | memcpy(iv, rt->iv, rt->iv_len); | ||
615 | RC2_set_key(&key, rt->key_len, rt->key, rt->key_bits); | ||
616 | RC2_cfb64_encrypt(rt->in, out, rt->in_len * 8, &key, iv, &remainder, 1); | ||
617 | |||
618 | if (memcmp(rt->out, out, rt->out_len) != 0) { | ||
619 | fprintf(stderr, "FAIL (%s:%zu): encryption mismatch\n", | ||
620 | SN_rc2_cbc, test_number); | ||
621 | return 0; | ||
622 | } | ||
623 | |||
624 | /* Decryption */ | ||
625 | memset(out, 0, sizeof(out)); | ||
626 | memcpy(iv, rt->iv, rt->iv_len); | ||
627 | RC2_set_key(&key, rt->key_len, rt->key, rt->key_bits); | ||
628 | RC2_cfb64_encrypt(rt->out, out, rt->out_len, &key, iv, &remainder, 0); | ||
629 | |||
630 | if (memcmp(rt->in, out, rt->in_len) != 0) { | ||
631 | fprintf(stderr, "FAIL (%s:%zu): decryption mismatch\n", | ||
632 | SN_rc2_cbc, test_number); | ||
633 | return 0; | ||
634 | } | ||
635 | |||
636 | return 1; | ||
637 | } | ||
638 | |||
639 | static int | ||
640 | rc2_ofb64_test(size_t test_number, const struct rc2_test *rt) | ||
641 | { | ||
642 | RC2_KEY key; | ||
643 | uint8_t out[512]; | ||
644 | uint8_t iv[64]; | ||
645 | int remainder = 0; | ||
646 | |||
647 | /* Encryption */ | ||
648 | memset(out, 0, sizeof(out)); | ||
649 | memcpy(iv, rt->iv, rt->iv_len); | ||
650 | RC2_set_key(&key, rt->key_len, rt->key, rt->key_bits); | ||
651 | RC2_ofb64_encrypt(rt->in, out, rt->in_len, &key, iv, &remainder); | ||
652 | |||
653 | if (memcmp(rt->out, out, rt->out_len) != 0) { | ||
654 | fprintf(stderr, "FAIL (%s:%zu): encryption mismatch\n", | ||
655 | SN_rc2_cbc, test_number); | ||
656 | return 0; | ||
657 | } | ||
658 | |||
659 | /* Decryption */ | ||
660 | memset(out, 0, sizeof(out)); | ||
661 | memcpy(iv, rt->iv, rt->iv_len); | ||
662 | RC2_set_key(&key, rt->key_len, rt->key, rt->key_bits); | ||
663 | RC2_ofb64_encrypt(rt->out, out, rt->out_len, &key, iv, &remainder); | ||
664 | |||
665 | if (memcmp(rt->in, out, rt->in_len) != 0) { | ||
666 | fprintf(stderr, "FAIL (%s:%zu): decryption mismatch\n", | ||
667 | SN_rc2_cbc, test_number); | ||
668 | return 0; | ||
669 | } | ||
670 | |||
671 | return 1; | ||
672 | } | ||
673 | |||
674 | static int | ||
264 | rc2_evp_test(size_t test_number, const struct rc2_test *rt, const char *label, | 675 | rc2_evp_test(size_t test_number, const struct rc2_test *rt, const char *label, |
265 | const EVP_CIPHER *cipher) | 676 | const EVP_CIPHER *cipher) |
266 | { | 677 | { |
@@ -299,23 +710,23 @@ rc2_evp_test(size_t test_number, const struct rc2_test *rt, const char *label, | |||
299 | goto failed; | 710 | goto failed; |
300 | } | 711 | } |
301 | 712 | ||
302 | if (!EVP_CIPHER_CTX_set_padding(ctx, 0)) { | 713 | if (!EVP_CIPHER_CTX_set_padding(ctx, rt->padding)) { |
303 | fprintf(stderr, | 714 | fprintf(stderr, |
304 | "FAIL (%s:%zu): EVP_CIPHER_CTX_set_padding failed\n", | 715 | "FAIL (%s:%zu): EVP_CIPHER_CTX_set_padding failed\n", |
305 | label, test_number); | 716 | label, test_number); |
306 | goto failed; | 717 | goto failed; |
307 | } | 718 | } |
308 | 719 | ||
309 | if (!EVP_EncryptInit(ctx, NULL, rt->key, NULL)) { | 720 | if (!EVP_EncryptInit(ctx, NULL, rt->key, rt->iv)) { |
310 | fprintf(stderr, "FAIL (%s:%zu): EVP_EncryptInit failed\n", | 721 | fprintf(stderr, "FAIL (%s:%zu): EVP_EncryptInit failed\n", |
311 | label, test_number); | 722 | label, test_number); |
312 | goto failed; | 723 | goto failed; |
313 | } | 724 | } |
314 | 725 | ||
315 | for (i = 0; i < rt->len;) { | 726 | for (i = 0; i < rt->in_len;) { |
316 | in_len = arc4random_uniform(sizeof(rt->len) / 2); | 727 | in_len = arc4random_uniform(sizeof(rt->in_len) / 2); |
317 | if (in_len > rt->len - i) | 728 | if (in_len > rt->in_len - i) |
318 | in_len = rt->len - i; | 729 | in_len = rt->in_len - i; |
319 | 730 | ||
320 | if (!EVP_EncryptUpdate(ctx, out + total_len, &out_len, | 731 | if (!EVP_EncryptUpdate(ctx, out + total_len, &out_len, |
321 | rt->in + i, in_len)) { | 732 | rt->in + i, in_len)) { |
@@ -343,14 +754,14 @@ rc2_evp_test(size_t test_number, const struct rc2_test *rt, const char *label, | |||
343 | goto failed; | 754 | goto failed; |
344 | } | 755 | } |
345 | 756 | ||
346 | if (total_len != rt->len) { | 757 | if (total_len != rt->out_len) { |
347 | fprintf(stderr, | 758 | fprintf(stderr, |
348 | "FAIL (%s:%zu): EVP encryption length mismatch\n", | 759 | "FAIL (%s:%zu): EVP encryption length mismatch\n", |
349 | label, test_number); | 760 | label, test_number); |
350 | goto failed; | 761 | goto failed; |
351 | } | 762 | } |
352 | 763 | ||
353 | if (memcmp(rt->out, out, rt->len) != 0) { | 764 | if (memcmp(rt->out, out, rt->out_len) != 0) { |
354 | fprintf(stderr, "FAIL (%s:%zu): EVP encryption mismatch\n", | 765 | fprintf(stderr, "FAIL (%s:%zu): EVP encryption mismatch\n", |
355 | label, test_number); | 766 | label, test_number); |
356 | goto failed; | 767 | goto failed; |
@@ -379,23 +790,23 @@ rc2_evp_test(size_t test_number, const struct rc2_test *rt, const char *label, | |||
379 | goto failed; | 790 | goto failed; |
380 | } | 791 | } |
381 | 792 | ||
382 | if (!EVP_CIPHER_CTX_set_padding(ctx, 0)) { | 793 | if (!EVP_CIPHER_CTX_set_padding(ctx, rt->padding)) { |
383 | fprintf(stderr, | 794 | fprintf(stderr, |
384 | "FAIL (%s:%zu): EVP_CIPHER_CTX_set_padding failed\n", | 795 | "FAIL (%s:%zu): EVP_CIPHER_CTX_set_padding failed\n", |
385 | label, test_number); | 796 | label, test_number); |
386 | goto failed; | 797 | goto failed; |
387 | } | 798 | } |
388 | 799 | ||
389 | if (!EVP_DecryptInit(ctx, NULL, rt->key, NULL)) { | 800 | if (!EVP_DecryptInit(ctx, NULL, rt->key, rt->iv)) { |
390 | fprintf(stderr, "FAIL (%s:%zu): EVP_DecryptInit failed\n", | 801 | fprintf(stderr, "FAIL (%s:%zu): EVP_DecryptInit failed\n", |
391 | label, test_number); | 802 | label, test_number); |
392 | goto failed; | 803 | goto failed; |
393 | } | 804 | } |
394 | 805 | ||
395 | for (i = 0; i < rt->len;) { | 806 | for (i = 0; i < rt->out_len;) { |
396 | in_len = arc4random_uniform(sizeof(rt->len) / 2); | 807 | in_len = arc4random_uniform(sizeof(rt->out_len) / 2); |
397 | if (in_len > rt->len - i) | 808 | if (in_len > rt->out_len - i) |
398 | in_len = rt->len - i; | 809 | in_len = rt->out_len - i; |
399 | 810 | ||
400 | if (!EVP_DecryptUpdate(ctx, out + total_len, &out_len, | 811 | if (!EVP_DecryptUpdate(ctx, out + total_len, &out_len, |
401 | rt->out + i, in_len)) { | 812 | rt->out + i, in_len)) { |
@@ -423,14 +834,14 @@ rc2_evp_test(size_t test_number, const struct rc2_test *rt, const char *label, | |||
423 | goto failed; | 834 | goto failed; |
424 | } | 835 | } |
425 | 836 | ||
426 | if (total_len != rt->len) { | 837 | if (total_len != rt->in_len) { |
427 | fprintf(stderr, | 838 | fprintf(stderr, |
428 | "FAIL (%s:%zu): EVP decryption length mismatch\n", | 839 | "FAIL (%s:%zu): EVP decryption length mismatch\n", |
429 | label, test_number); | 840 | label, test_number); |
430 | goto failed; | 841 | goto failed; |
431 | } | 842 | } |
432 | 843 | ||
433 | if (memcmp(rt->in, out, rt->len) != 0) { | 844 | if (memcmp(rt->in, out, rt->in_len) != 0) { |
434 | fprintf(stderr, "FAIL (%s:%zu): EVP decryption mismatch\n", | 845 | fprintf(stderr, "FAIL (%s:%zu): EVP decryption mismatch\n", |
435 | label, test_number); | 846 | label, test_number); |
436 | goto failed; | 847 | goto failed; |
@@ -461,6 +872,24 @@ rc2_test(void) | |||
461 | if (!rc2_ecb_test(i, rt)) | 872 | if (!rc2_ecb_test(i, rt)) |
462 | goto failed; | 873 | goto failed; |
463 | break; | 874 | break; |
875 | case NID_rc2_cbc: | ||
876 | label = SN_rc2_cbc; | ||
877 | cipher = EVP_rc2_cbc(); | ||
878 | if (!rc2_cbc_test(i, rt)) | ||
879 | goto failed; | ||
880 | break; | ||
881 | case NID_rc2_cfb64: | ||
882 | label = SN_rc2_cfb64; | ||
883 | cipher = EVP_rc2_cfb64(); | ||
884 | if (!rc2_cfb64_test(i, rt)) | ||
885 | goto failed; | ||
886 | break; | ||
887 | case NID_rc2_ofb64: | ||
888 | label = SN_rc2_ofb64; | ||
889 | cipher = EVP_rc2_ofb(); | ||
890 | if (!rc2_ofb64_test(i, rt)) | ||
891 | goto failed; | ||
892 | break; | ||
464 | default: | 893 | default: |
465 | fprintf(stderr, "FAIL: unknown mode (%d)\n", | 894 | fprintf(stderr, "FAIL: unknown mode (%d)\n", |
466 | rt->mode); | 895 | rt->mode); |