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
24static 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
37static 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
45static 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
54static 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
84static 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
117static 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
147static 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
154static 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
184static 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
204static 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
236int 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