Add sm4 ciphers to default provider
[openssl.git] / test / rc5test.c
1 /*
2  * Copyright 1995-2017 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 #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
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     if (!TEST_true(RC5_32_set_key(&key, 16, &RC5key[n][0], 12)))
185         return 0;
186
187     RC5_32_ecb_encrypt(&RC5plain[n][0], buf, &key, RC5_ENCRYPT);
188     if (!TEST_mem_eq(&RC5cipher[n][0], sizeof(RC5cipher[0]), buf, sizeof(buf)))
189         testresult = 0;
190
191     RC5_32_ecb_encrypt(buf, buf2, &key, RC5_DECRYPT);
192     if (!TEST_mem_eq(&RC5plain[n][0], sizeof(RC5cipher[0]), buf2, sizeof(buf2)))
193         testresult = 0;
194
195     return testresult;
196 }
197
198 static int test_rc5_cbc(int n)
199 {
200     int testresult = 1;
201     int i;
202     RC5_32_KEY key;
203     unsigned char buf[8], buf2[8], ivb[8];
204
205     i = rc5_cbc_rounds[n];
206     if (i >= 8) {
207         if (!TEST_true(RC5_32_set_key(&key, rc5_cbc_key[n][0],
208                                       &rc5_cbc_key[n][1], i)))
209             return 0;
210
211         memcpy(ivb, &rc5_cbc_iv[n][0], 8);
212         RC5_32_cbc_encrypt(&rc5_cbc_plain[n][0], buf, 8,
213                            &key, &ivb[0], RC5_ENCRYPT);
214
215         if (!TEST_mem_eq(&rc5_cbc_cipher[n][0], sizeof(rc5_cbc_cipher[0]),
216                          buf, sizeof(buf)))
217             testresult = 0;
218
219         memcpy(ivb, &rc5_cbc_iv[n][0], 8);
220         RC5_32_cbc_encrypt(buf, buf2, 8, &key, &ivb[0], RC5_DECRYPT);
221         if (!TEST_mem_eq(&rc5_cbc_plain[n][0], sizeof(rc5_cbc_plain[0]),
222                          buf2, sizeof(buf2)))
223             testresult = 0;
224     }
225
226     return testresult;
227 }
228 #endif
229
230 int setup_tests(void)
231 {
232 #ifndef OPENSSL_NO_RC5
233     ADD_ALL_TESTS(test_rc5_ecb, OSSL_NELEM(RC5key));
234     ADD_ALL_TESTS(test_rc5_cbc, RC5_CBC_NUM);
235 #endif
236     return 1;
237 }