Fix a leak in SSL_clear()
[openssl.git] / test / rc5test.c
1 /*
2  * Copyright 1995-2016 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 /*
11  * This has been a quickly hacked 'ideatest.c'.  When I add tests for other
12  * RC5 modes, more of the code will be uncommented.
13  */
14
15 #include <stdio.h>
16 #include <string.h>
17 #include <stdlib.h>
18
19 #include "../e_os.h"
20
21 #ifdef OPENSSL_NO_RC5
22 int main(int argc, char *argv[])
23 {
24     printf("No RC5 support\n");
25     return (0);
26 }
27 #else
28 # include <openssl/rc5.h>
29
30 static unsigned char RC5key[5][16] = {
31     {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
32      0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00},
33     {0x91, 0x5f, 0x46, 0x19, 0xbe, 0x41, 0xb2, 0x51,
34      0x63, 0x55, 0xa5, 0x01, 0x10, 0xa9, 0xce, 0x91},
35     {0x78, 0x33, 0x48, 0xe7, 0x5a, 0xeb, 0x0f, 0x2f,
36      0xd7, 0xb1, 0x69, 0xbb, 0x8d, 0xc1, 0x67, 0x87},
37     {0xdc, 0x49, 0xdb, 0x13, 0x75, 0xa5, 0x58, 0x4f,
38      0x64, 0x85, 0xb4, 0x13, 0xb5, 0xf1, 0x2b, 0xaf},
39     {0x52, 0x69, 0xf1, 0x49, 0xd4, 0x1b, 0xa0, 0x15,
40      0x24, 0x97, 0x57, 0x4d, 0x7f, 0x15, 0x31, 0x25},
41 };
42
43 static unsigned char RC5plain[5][8] = {
44     {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00},
45     {0x21, 0xA5, 0xDB, 0xEE, 0x15, 0x4B, 0x8F, 0x6D},
46     {0xF7, 0xC0, 0x13, 0xAC, 0x5B, 0x2B, 0x89, 0x52},
47     {0x2F, 0x42, 0xB3, 0xB7, 0x03, 0x69, 0xFC, 0x92},
48     {0x65, 0xC1, 0x78, 0xB2, 0x84, 0xD1, 0x97, 0xCC},
49 };
50
51 static unsigned char RC5cipher[5][8] = {
52     {0x21, 0xA5, 0xDB, 0xEE, 0x15, 0x4B, 0x8F, 0x6D},
53     {0xF7, 0xC0, 0x13, 0xAC, 0x5B, 0x2B, 0x89, 0x52},
54     {0x2F, 0x42, 0xB3, 0xB7, 0x03, 0x69, 0xFC, 0x92},
55     {0x65, 0xC1, 0x78, 0xB2, 0x84, 0xD1, 0x97, 0xCC},
56     {0xEB, 0x44, 0xE4, 0x15, 0xDA, 0x31, 0x98, 0x24},
57 };
58
59 # define RC5_CBC_NUM 27
60 static unsigned char rc5_cbc_cipher[RC5_CBC_NUM][8] = {
61     {0x7a, 0x7b, 0xba, 0x4d, 0x79, 0x11, 0x1d, 0x1e},
62     {0x79, 0x7b, 0xba, 0x4d, 0x78, 0x11, 0x1d, 0x1e},
63     {0x7a, 0x7b, 0xba, 0x4d, 0x79, 0x11, 0x1d, 0x1f},
64     {0x7a, 0x7b, 0xba, 0x4d, 0x79, 0x11, 0x1d, 0x1f},
65     {0x8b, 0x9d, 0xed, 0x91, 0xce, 0x77, 0x94, 0xa6},
66     {0x2f, 0x75, 0x9f, 0xe7, 0xad, 0x86, 0xa3, 0x78},
67     {0xdc, 0xa2, 0x69, 0x4b, 0xf4, 0x0e, 0x07, 0x88},
68     {0xdc, 0xa2, 0x69, 0x4b, 0xf4, 0x0e, 0x07, 0x88},
69     {0xdc, 0xfe, 0x09, 0x85, 0x77, 0xec, 0xa5, 0xff},
70     {0x96, 0x46, 0xfb, 0x77, 0x63, 0x8f, 0x9c, 0xa8},
71     {0xb2, 0xb3, 0x20, 0x9d, 0xb6, 0x59, 0x4d, 0xa4},
72     {0x54, 0x5f, 0x7f, 0x32, 0xa5, 0xfc, 0x38, 0x36},
73     {0x82, 0x85, 0xe7, 0xc1, 0xb5, 0xbc, 0x74, 0x02},
74     {0xfc, 0x58, 0x6f, 0x92, 0xf7, 0x08, 0x09, 0x34},
75     {0xcf, 0x27, 0x0e, 0xf9, 0x71, 0x7f, 0xf7, 0xc4},
76     {0xe4, 0x93, 0xf1, 0xc1, 0xbb, 0x4d, 0x6e, 0x8c},
77     {0x5c, 0x4c, 0x04, 0x1e, 0x0f, 0x21, 0x7a, 0xc3},
78     {0x92, 0x1f, 0x12, 0x48, 0x53, 0x73, 0xb4, 0xf7},
79     {0x5b, 0xa0, 0xca, 0x6b, 0xbe, 0x7f, 0x5f, 0xad},
80     {0xc5, 0x33, 0x77, 0x1c, 0xd0, 0x11, 0x0e, 0x63},
81     {0x29, 0x4d, 0xdb, 0x46, 0xb3, 0x27, 0x8d, 0x60},
82     {0xda, 0xd6, 0xbd, 0xa9, 0xdf, 0xe8, 0xf7, 0xe8},
83     {0x97, 0xe0, 0x78, 0x78, 0x37, 0xed, 0x31, 0x7f},
84     {0x78, 0x75, 0xdb, 0xf6, 0x73, 0x8c, 0x64, 0x78},
85     {0x8f, 0x34, 0xc3, 0xc6, 0x81, 0xc9, 0x96, 0x95},
86     {0x7c, 0xb3, 0xf1, 0xdf, 0x34, 0xf9, 0x48, 0x11},
87     {0x7f, 0xd1, 0xa0, 0x23, 0xa5, 0xbb, 0xa2, 0x17},
88 };
89
90 static unsigned char rc5_cbc_key[RC5_CBC_NUM][17] = {
91     {1, 0x00},
92     {1, 0x00},
93     {1, 0x00},
94     {1, 0x00},
95     {1, 0x00},
96     {1, 0x11},
97     {1, 0x00},
98     {4, 0x00, 0x00, 0x00, 0x00},
99     {1, 0x00},
100     {1, 0x00},
101     {1, 0x00},
102     {1, 0x00},
103     {4, 0x01, 0x02, 0x03, 0x04},
104     {4, 0x01, 0x02, 0x03, 0x04},
105     {4, 0x01, 0x02, 0x03, 0x04},
106     {8, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08},
107     {8, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08},
108     {8, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08},
109     {8, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08},
110     {16, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08,
111      0x10, 0x20, 0x30, 0x40, 0x50, 0x60, 0x70, 0x80},
112     {16, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08,
113      0x10, 0x20, 0x30, 0x40, 0x50, 0x60, 0x70, 0x80},
114     {16, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08,
115      0x10, 0x20, 0x30, 0x40, 0x50, 0x60, 0x70, 0x80},
116     {5, 0x01, 0x02, 0x03, 0x04, 0x05},
117     {5, 0x01, 0x02, 0x03, 0x04, 0x05},
118     {5, 0x01, 0x02, 0x03, 0x04, 0x05},
119     {5, 0x01, 0x02, 0x03, 0x04, 0x05},
120     {5, 0x01, 0x02, 0x03, 0x04, 0x05},
121 };
122
123 static unsigned char rc5_cbc_plain[RC5_CBC_NUM][8] = {
124     {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00},
125     {0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff},
126     {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00},
127     {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01},
128     {0x10, 0x20, 0x30, 0x40, 0x50, 0x60, 0x70, 0x80},
129     {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00},
130     {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00},
131     {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00},
132     {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00},
133     {0x10, 0x20, 0x30, 0x40, 0x50, 0x60, 0x70, 0x80},
134     {0x10, 0x20, 0x30, 0x40, 0x50, 0x60, 0x70, 0x80},
135     {0x10, 0x20, 0x30, 0x40, 0x50, 0x60, 0x70, 0x80},
136     {0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff},
137     {0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff},
138     {0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff},
139     {0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff},
140     {0x10, 0x20, 0x30, 0x40, 0x50, 0x60, 0x70, 0x80},
141     {0x10, 0x20, 0x30, 0x40, 0x50, 0x60, 0x70, 0x80},
142     {0x10, 0x20, 0x30, 0x40, 0x50, 0x60, 0x70, 0x80},
143     {0x10, 0x20, 0x30, 0x40, 0x50, 0x60, 0x70, 0x80},
144     {0x10, 0x20, 0x30, 0x40, 0x50, 0x60, 0x70, 0x80},
145     {0x10, 0x20, 0x30, 0x40, 0x50, 0x60, 0x70, 0x80},
146     {0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff},
147     {0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff},
148     {0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08},
149     {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00},
150     {0x11, 0x22, 0x33, 0x44, 0x55, 0x66, 0x77, 0x01},
151 };
152
153 static int rc5_cbc_rounds[RC5_CBC_NUM] = {
154     0, 0, 0, 0, 0, 1, 2, 2,
155     8, 8, 12, 16, 8, 12, 16, 12,
156     8, 12, 16, 8, 12, 16, 12, 8,
157     8, 8, 8,
158 };
159
160 static unsigned char rc5_cbc_iv[RC5_CBC_NUM][8] = {
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, 0x01},
164     {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00},
165     {0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08},
166     {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00},
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     {0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08},
171     {0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08},
172     {0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08},
173     {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00},
174     {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00},
175     {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00},
176     {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00},
177     {0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08},
178     {0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08},
179     {0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08},
180     {0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08},
181     {0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08},
182     {0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08},
183     {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00},
184     {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00},
185     {0x78, 0x75, 0xdb, 0xf6, 0x73, 0x8c, 0x64, 0x78},
186     {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00},
187     {0x7c, 0xb3, 0xf1, 0xdf, 0x34, 0xf9, 0x48, 0x11},
188 };
189
190 int main(int argc, char *argv[])
191 {
192     int i, n, err = 0;
193     RC5_32_KEY key;
194     unsigned char buf[8], buf2[8], ivb[8];
195
196     for (n = 0; n < 5; n++) {
197         RC5_32_set_key(&key, 16, &(RC5key[n][0]), 12);
198
199         RC5_32_ecb_encrypt(&(RC5plain[n][0]), buf, &key, RC5_ENCRYPT);
200         if (memcmp(&(RC5cipher[n][0]), buf, 8) != 0) {
201             printf("ecb RC5 error encrypting (%d)\n", n + 1);
202             printf("got     :");
203             for (i = 0; i < 8; i++)
204                 printf("%02X ", buf[i]);
205             printf("\n");
206             printf("expected:");
207             for (i = 0; i < 8; i++)
208                 printf("%02X ", RC5cipher[n][i]);
209             err = 20;
210             printf("\n");
211         }
212
213         RC5_32_ecb_encrypt(buf, buf2, &key, RC5_DECRYPT);
214         if (memcmp(&(RC5plain[n][0]), buf2, 8) != 0) {
215             printf("ecb RC5 error decrypting (%d)\n", n + 1);
216             printf("got     :");
217             for (i = 0; i < 8; i++)
218                 printf("%02X ", buf2[i]);
219             printf("\n");
220             printf("expected:");
221             for (i = 0; i < 8; i++)
222                 printf("%02X ", RC5plain[n][i]);
223             printf("\n");
224             err = 3;
225         }
226     }
227     if (err == 0)
228         printf("ecb RC5 ok\n");
229
230     for (n = 0; n < RC5_CBC_NUM; n++) {
231         i = rc5_cbc_rounds[n];
232         if (i < 8)
233             continue;
234
235         RC5_32_set_key(&key, rc5_cbc_key[n][0], &(rc5_cbc_key[n][1]), i);
236
237         memcpy(ivb, &(rc5_cbc_iv[n][0]), 8);
238         RC5_32_cbc_encrypt(&(rc5_cbc_plain[n][0]), buf, 8,
239                            &key, &(ivb[0]), RC5_ENCRYPT);
240
241         if (memcmp(&(rc5_cbc_cipher[n][0]), buf, 8) != 0) {
242             printf("cbc RC5 error encrypting (%d)\n", n + 1);
243             printf("got     :");
244             for (i = 0; i < 8; i++)
245                 printf("%02X ", buf[i]);
246             printf("\n");
247             printf("expected:");
248             for (i = 0; i < 8; i++)
249                 printf("%02X ", rc5_cbc_cipher[n][i]);
250             err = 30;
251             printf("\n");
252         }
253
254         memcpy(ivb, &(rc5_cbc_iv[n][0]), 8);
255         RC5_32_cbc_encrypt(buf, buf2, 8, &key, &(ivb[0]), RC5_DECRYPT);
256         if (memcmp(&(rc5_cbc_plain[n][0]), buf2, 8) != 0) {
257             printf("cbc RC5 error decrypting (%d)\n", n + 1);
258             printf("got     :");
259             for (i = 0; i < 8; i++)
260                 printf("%02X ", buf2[i]);
261             printf("\n");
262             printf("expected:");
263             for (i = 0; i < 8; i++)
264                 printf("%02X ", rc5_cbc_plain[n][i]);
265             printf("\n");
266             err = 3;
267         }
268     }
269     if (err == 0)
270         printf("cbc RC5 ok\n");
271
272     EXIT(err);
273     return (err);
274 }
275
276 #endif