• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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 
18 static 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 
31 static 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 
39 static 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
48 static 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 
78 static 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 
111 static 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 
141 static 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 
148 static 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 
test_rc5_ecb(int n)178 static 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 
test_rc5_cbc(int n)197 static 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 
setup_tests(void)227 int 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