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