1 /*
2 * Copyright 1995-2020 The OpenSSL Project Authors. All Rights Reserved.
3 *
4 * Licensed under the Apache License 2.0 (the "License"). You may not use
5 * this file except in compliance with the License. You can obtain a copy
6 * in the file LICENSE in the source distribution or at
7 * https://www.openssl.org/source/license.html
8 */
9
10 /*
11 * RC5 low level APIs are deprecated for public use, but still ok for internal
12 * use.
13 */
14 #include "internal/deprecated.h"
15
16 #include <string.h>
17
18 #include "internal/nelem.h"
19 #include "testutil.h"
20
21 #ifndef OPENSSL_NO_RC5
22 # include <openssl/rc5.h>
23
24 static unsigned char RC5key[5][16] = {
25 {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
26 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00},
27 {0x91, 0x5f, 0x46, 0x19, 0xbe, 0x41, 0xb2, 0x51,
28 0x63, 0x55, 0xa5, 0x01, 0x10, 0xa9, 0xce, 0x91},
29 {0x78, 0x33, 0x48, 0xe7, 0x5a, 0xeb, 0x0f, 0x2f,
30 0xd7, 0xb1, 0x69, 0xbb, 0x8d, 0xc1, 0x67, 0x87},
31 {0xdc, 0x49, 0xdb, 0x13, 0x75, 0xa5, 0x58, 0x4f,
32 0x64, 0x85, 0xb4, 0x13, 0xb5, 0xf1, 0x2b, 0xaf},
33 {0x52, 0x69, 0xf1, 0x49, 0xd4, 0x1b, 0xa0, 0x15,
34 0x24, 0x97, 0x57, 0x4d, 0x7f, 0x15, 0x31, 0x25},
35 };
36
37 static unsigned char RC5plain[5][8] = {
38 {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00},
39 {0x21, 0xA5, 0xDB, 0xEE, 0x15, 0x4B, 0x8F, 0x6D},
40 {0xF7, 0xC0, 0x13, 0xAC, 0x5B, 0x2B, 0x89, 0x52},
41 {0x2F, 0x42, 0xB3, 0xB7, 0x03, 0x69, 0xFC, 0x92},
42 {0x65, 0xC1, 0x78, 0xB2, 0x84, 0xD1, 0x97, 0xCC},
43 };
44
45 static unsigned char RC5cipher[5][8] = {
46 {0x21, 0xA5, 0xDB, 0xEE, 0x15, 0x4B, 0x8F, 0x6D},
47 {0xF7, 0xC0, 0x13, 0xAC, 0x5B, 0x2B, 0x89, 0x52},
48 {0x2F, 0x42, 0xB3, 0xB7, 0x03, 0x69, 0xFC, 0x92},
49 {0x65, 0xC1, 0x78, 0xB2, 0x84, 0xD1, 0x97, 0xCC},
50 {0xEB, 0x44, 0xE4, 0x15, 0xDA, 0x31, 0x98, 0x24},
51 };
52
53 # define RC5_CBC_NUM 27
54 static unsigned char rc5_cbc_cipher[RC5_CBC_NUM][8] = {
55 {0x7a, 0x7b, 0xba, 0x4d, 0x79, 0x11, 0x1d, 0x1e},
56 {0x79, 0x7b, 0xba, 0x4d, 0x78, 0x11, 0x1d, 0x1e},
57 {0x7a, 0x7b, 0xba, 0x4d, 0x79, 0x11, 0x1d, 0x1f},
58 {0x7a, 0x7b, 0xba, 0x4d, 0x79, 0x11, 0x1d, 0x1f},
59 {0x8b, 0x9d, 0xed, 0x91, 0xce, 0x77, 0x94, 0xa6},
60 {0x2f, 0x75, 0x9f, 0xe7, 0xad, 0x86, 0xa3, 0x78},
61 {0xdc, 0xa2, 0x69, 0x4b, 0xf4, 0x0e, 0x07, 0x88},
62 {0xdc, 0xa2, 0x69, 0x4b, 0xf4, 0x0e, 0x07, 0x88},
63 {0xdc, 0xfe, 0x09, 0x85, 0x77, 0xec, 0xa5, 0xff},
64 {0x96, 0x46, 0xfb, 0x77, 0x63, 0x8f, 0x9c, 0xa8},
65 {0xb2, 0xb3, 0x20, 0x9d, 0xb6, 0x59, 0x4d, 0xa4},
66 {0x54, 0x5f, 0x7f, 0x32, 0xa5, 0xfc, 0x38, 0x36},
67 {0x82, 0x85, 0xe7, 0xc1, 0xb5, 0xbc, 0x74, 0x02},
68 {0xfc, 0x58, 0x6f, 0x92, 0xf7, 0x08, 0x09, 0x34},
69 {0xcf, 0x27, 0x0e, 0xf9, 0x71, 0x7f, 0xf7, 0xc4},
70 {0xe4, 0x93, 0xf1, 0xc1, 0xbb, 0x4d, 0x6e, 0x8c},
71 {0x5c, 0x4c, 0x04, 0x1e, 0x0f, 0x21, 0x7a, 0xc3},
72 {0x92, 0x1f, 0x12, 0x48, 0x53, 0x73, 0xb4, 0xf7},
73 {0x5b, 0xa0, 0xca, 0x6b, 0xbe, 0x7f, 0x5f, 0xad},
74 {0xc5, 0x33, 0x77, 0x1c, 0xd0, 0x11, 0x0e, 0x63},
75 {0x29, 0x4d, 0xdb, 0x46, 0xb3, 0x27, 0x8d, 0x60},
76 {0xda, 0xd6, 0xbd, 0xa9, 0xdf, 0xe8, 0xf7, 0xe8},
77 {0x97, 0xe0, 0x78, 0x78, 0x37, 0xed, 0x31, 0x7f},
78 {0x78, 0x75, 0xdb, 0xf6, 0x73, 0x8c, 0x64, 0x78},
79 {0x8f, 0x34, 0xc3, 0xc6, 0x81, 0xc9, 0x96, 0x95},
80 {0x7c, 0xb3, 0xf1, 0xdf, 0x34, 0xf9, 0x48, 0x11},
81 {0x7f, 0xd1, 0xa0, 0x23, 0xa5, 0xbb, 0xa2, 0x17},
82 };
83
84 static unsigned char rc5_cbc_key[RC5_CBC_NUM][17] = {
85 {1, 0x00},
86 {1, 0x00},
87 {1, 0x00},
88 {1, 0x00},
89 {1, 0x00},
90 {1, 0x11},
91 {1, 0x00},
92 {4, 0x00, 0x00, 0x00, 0x00},
93 {1, 0x00},
94 {1, 0x00},
95 {1, 0x00},
96 {1, 0x00},
97 {4, 0x01, 0x02, 0x03, 0x04},
98 {4, 0x01, 0x02, 0x03, 0x04},
99 {4, 0x01, 0x02, 0x03, 0x04},
100 {8, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08},
101 {8, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08},
102 {8, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08},
103 {8, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08},
104 {16, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08,
105 0x10, 0x20, 0x30, 0x40, 0x50, 0x60, 0x70, 0x80},
106 {16, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08,
107 0x10, 0x20, 0x30, 0x40, 0x50, 0x60, 0x70, 0x80},
108 {16, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08,
109 0x10, 0x20, 0x30, 0x40, 0x50, 0x60, 0x70, 0x80},
110 {5, 0x01, 0x02, 0x03, 0x04, 0x05},
111 {5, 0x01, 0x02, 0x03, 0x04, 0x05},
112 {5, 0x01, 0x02, 0x03, 0x04, 0x05},
113 {5, 0x01, 0x02, 0x03, 0x04, 0x05},
114 {5, 0x01, 0x02, 0x03, 0x04, 0x05},
115 };
116
117 static unsigned char rc5_cbc_plain[RC5_CBC_NUM][8] = {
118 {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00},
119 {0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff},
120 {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00},
121 {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01},
122 {0x10, 0x20, 0x30, 0x40, 0x50, 0x60, 0x70, 0x80},
123 {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00},
124 {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00},
125 {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00},
126 {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00},
127 {0x10, 0x20, 0x30, 0x40, 0x50, 0x60, 0x70, 0x80},
128 {0x10, 0x20, 0x30, 0x40, 0x50, 0x60, 0x70, 0x80},
129 {0x10, 0x20, 0x30, 0x40, 0x50, 0x60, 0x70, 0x80},
130 {0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff},
131 {0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff},
132 {0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff},
133 {0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff},
134 {0x10, 0x20, 0x30, 0x40, 0x50, 0x60, 0x70, 0x80},
135 {0x10, 0x20, 0x30, 0x40, 0x50, 0x60, 0x70, 0x80},
136 {0x10, 0x20, 0x30, 0x40, 0x50, 0x60, 0x70, 0x80},
137 {0x10, 0x20, 0x30, 0x40, 0x50, 0x60, 0x70, 0x80},
138 {0x10, 0x20, 0x30, 0x40, 0x50, 0x60, 0x70, 0x80},
139 {0x10, 0x20, 0x30, 0x40, 0x50, 0x60, 0x70, 0x80},
140 {0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff},
141 {0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff},
142 {0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08},
143 {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00},
144 {0x11, 0x22, 0x33, 0x44, 0x55, 0x66, 0x77, 0x01},
145 };
146
147 static int rc5_cbc_rounds[RC5_CBC_NUM] = {
148 0, 0, 0, 0, 0, 1, 2, 2,
149 8, 8, 12, 16, 8, 12, 16, 12,
150 8, 12, 16, 8, 12, 16, 12, 8,
151 8, 8, 8,
152 };
153
154 static unsigned char rc5_cbc_iv[RC5_CBC_NUM][8] = {
155 {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00},
156 {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00},
157 {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01},
158 {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00},
159 {0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08},
160 {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00},
161 {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00},
162 {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00},
163 {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00},
164 {0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08},
165 {0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08},
166 {0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08},
167 {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00},
168 {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00},
169 {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00},
170 {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00},
171 {0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08},
172 {0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08},
173 {0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08},
174 {0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08},
175 {0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08},
176 {0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08},
177 {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00},
178 {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00},
179 {0x78, 0x75, 0xdb, 0xf6, 0x73, 0x8c, 0x64, 0x78},
180 {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00},
181 {0x7c, 0xb3, 0xf1, 0xdf, 0x34, 0xf9, 0x48, 0x11},
182 };
183
test_rc5_ecb(int n)184 static int test_rc5_ecb(int n)
185 {
186 int testresult = 1;
187 RC5_32_KEY key;
188 unsigned char buf[8], buf2[8];
189
190 if (!TEST_true(RC5_32_set_key(&key, 16, &RC5key[n][0], 12)))
191 return 0;
192
193 RC5_32_ecb_encrypt(&RC5plain[n][0], buf, &key, RC5_ENCRYPT);
194 if (!TEST_mem_eq(&RC5cipher[n][0], sizeof(RC5cipher[0]), buf, sizeof(buf)))
195 testresult = 0;
196
197 RC5_32_ecb_encrypt(buf, buf2, &key, RC5_DECRYPT);
198 if (!TEST_mem_eq(&RC5plain[n][0], sizeof(RC5cipher[0]), buf2, sizeof(buf2)))
199 testresult = 0;
200
201 return testresult;
202 }
203
test_rc5_cbc(int n)204 static int test_rc5_cbc(int n)
205 {
206 int testresult = 1;
207 int i;
208 RC5_32_KEY key;
209 unsigned char buf[8], buf2[8], ivb[8];
210
211 i = rc5_cbc_rounds[n];
212 if (i >= 8) {
213 if (!TEST_true(RC5_32_set_key(&key, rc5_cbc_key[n][0],
214 &rc5_cbc_key[n][1], i)))
215 return 0;
216
217 memcpy(ivb, &rc5_cbc_iv[n][0], 8);
218 RC5_32_cbc_encrypt(&rc5_cbc_plain[n][0], buf, 8,
219 &key, &ivb[0], RC5_ENCRYPT);
220
221 if (!TEST_mem_eq(&rc5_cbc_cipher[n][0], sizeof(rc5_cbc_cipher[0]),
222 buf, sizeof(buf)))
223 testresult = 0;
224
225 memcpy(ivb, &rc5_cbc_iv[n][0], 8);
226 RC5_32_cbc_encrypt(buf, buf2, 8, &key, &ivb[0], RC5_DECRYPT);
227 if (!TEST_mem_eq(&rc5_cbc_plain[n][0], sizeof(rc5_cbc_plain[0]),
228 buf2, sizeof(buf2)))
229 testresult = 0;
230 }
231
232 return testresult;
233 }
234 #endif
235
setup_tests(void)236 int setup_tests(void)
237 {
238 #ifndef OPENSSL_NO_RC5
239 ADD_ALL_TESTS(test_rc5_ecb, OSSL_NELEM(RC5key));
240 ADD_ALL_TESTS(test_rc5_cbc, RC5_CBC_NUM);
241 #endif
242 return 1;
243 }
244