Ensure CRYPTO_mem_leaks is the last thing we do
[oweals/openssl.git] / test / rc5test.c
1 /* Copyright (C) 1995-1998 Eric Young (eay@cryptsoft.com)
2  * All rights reserved.
3  *
4  * This package is an SSL implementation written
5  * by Eric Young (eay@cryptsoft.com).
6  * The implementation was written so as to conform with Netscapes SSL.
7  *
8  * This library is free for commercial and non-commercial use as long as
9  * the following conditions are aheared to.  The following conditions
10  * apply to all code found in this distribution, be it the RC4, RSA,
11  * lhash, DES, etc., code; not just the SSL code.  The SSL documentation
12  * included with this distribution is covered by the same copyright terms
13  * except that the holder is Tim Hudson (tjh@cryptsoft.com).
14  *
15  * Copyright remains Eric Young's, and as such any Copyright notices in
16  * the code are not to be removed.
17  * If this package is used in a product, Eric Young should be given attribution
18  * as the author of the parts of the library used.
19  * This can be in the form of a textual message at program startup or
20  * in documentation (online or textual) provided with the package.
21  *
22  * Redistribution and use in source and binary forms, with or without
23  * modification, are permitted provided that the following conditions
24  * are met:
25  * 1. Redistributions of source code must retain the copyright
26  *    notice, this list of conditions and the following disclaimer.
27  * 2. Redistributions in binary form must reproduce the above copyright
28  *    notice, this list of conditions and the following disclaimer in the
29  *    documentation and/or other materials provided with the distribution.
30  * 3. All advertising materials mentioning features or use of this software
31  *    must display the following acknowledgement:
32  *    "This product includes cryptographic software written by
33  *     Eric Young (eay@cryptsoft.com)"
34  *    The word 'cryptographic' can be left out if the rouines from the library
35  *    being used are not cryptographic related :-).
36  * 4. If you include any Windows specific code (or a derivative thereof) from
37  *    the apps directory (application code) you must include an acknowledgement:
38  *    "This product includes software written by Tim Hudson (tjh@cryptsoft.com)"
39  *
40  * THIS SOFTWARE IS PROVIDED BY ERIC YOUNG ``AS IS'' AND
41  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
42  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
43  * ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
44  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
45  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
46  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
47  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
48  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
49  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
50  * SUCH DAMAGE.
51  *
52  * The licence and distribution terms for any publically available version or
53  * derivative of this code cannot be changed.  i.e. this code cannot simply be
54  * copied and put under another distribution licence
55  * [including the GNU Public Licence.]
56  */
57
58 /*
59  * This has been a quickly hacked 'ideatest.c'.  When I add tests for other
60  * RC5 modes, more of the code will be uncommented.
61  */
62
63 #include <stdio.h>
64 #include <string.h>
65 #include <stdlib.h>
66
67 #include "../e_os.h"
68
69 #ifdef OPENSSL_NO_RC5
70 int main(int argc, char *argv[])
71 {
72     printf("No RC5 support\n");
73     return (0);
74 }
75 #else
76 # include <openssl/rc5.h>
77
78 static unsigned char RC5key[5][16] = {
79     {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
80      0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00},
81     {0x91, 0x5f, 0x46, 0x19, 0xbe, 0x41, 0xb2, 0x51,
82      0x63, 0x55, 0xa5, 0x01, 0x10, 0xa9, 0xce, 0x91},
83     {0x78, 0x33, 0x48, 0xe7, 0x5a, 0xeb, 0x0f, 0x2f,
84      0xd7, 0xb1, 0x69, 0xbb, 0x8d, 0xc1, 0x67, 0x87},
85     {0xdc, 0x49, 0xdb, 0x13, 0x75, 0xa5, 0x58, 0x4f,
86      0x64, 0x85, 0xb4, 0x13, 0xb5, 0xf1, 0x2b, 0xaf},
87     {0x52, 0x69, 0xf1, 0x49, 0xd4, 0x1b, 0xa0, 0x15,
88      0x24, 0x97, 0x57, 0x4d, 0x7f, 0x15, 0x31, 0x25},
89 };
90
91 static unsigned char RC5plain[5][8] = {
92     {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00},
93     {0x21, 0xA5, 0xDB, 0xEE, 0x15, 0x4B, 0x8F, 0x6D},
94     {0xF7, 0xC0, 0x13, 0xAC, 0x5B, 0x2B, 0x89, 0x52},
95     {0x2F, 0x42, 0xB3, 0xB7, 0x03, 0x69, 0xFC, 0x92},
96     {0x65, 0xC1, 0x78, 0xB2, 0x84, 0xD1, 0x97, 0xCC},
97 };
98
99 static unsigned char RC5cipher[5][8] = {
100     {0x21, 0xA5, 0xDB, 0xEE, 0x15, 0x4B, 0x8F, 0x6D},
101     {0xF7, 0xC0, 0x13, 0xAC, 0x5B, 0x2B, 0x89, 0x52},
102     {0x2F, 0x42, 0xB3, 0xB7, 0x03, 0x69, 0xFC, 0x92},
103     {0x65, 0xC1, 0x78, 0xB2, 0x84, 0xD1, 0x97, 0xCC},
104     {0xEB, 0x44, 0xE4, 0x15, 0xDA, 0x31, 0x98, 0x24},
105 };
106
107 # define RC5_CBC_NUM 27
108 static unsigned char rc5_cbc_cipher[RC5_CBC_NUM][8] = {
109     {0x7a, 0x7b, 0xba, 0x4d, 0x79, 0x11, 0x1d, 0x1e},
110     {0x79, 0x7b, 0xba, 0x4d, 0x78, 0x11, 0x1d, 0x1e},
111     {0x7a, 0x7b, 0xba, 0x4d, 0x79, 0x11, 0x1d, 0x1f},
112     {0x7a, 0x7b, 0xba, 0x4d, 0x79, 0x11, 0x1d, 0x1f},
113     {0x8b, 0x9d, 0xed, 0x91, 0xce, 0x77, 0x94, 0xa6},
114     {0x2f, 0x75, 0x9f, 0xe7, 0xad, 0x86, 0xa3, 0x78},
115     {0xdc, 0xa2, 0x69, 0x4b, 0xf4, 0x0e, 0x07, 0x88},
116     {0xdc, 0xa2, 0x69, 0x4b, 0xf4, 0x0e, 0x07, 0x88},
117     {0xdc, 0xfe, 0x09, 0x85, 0x77, 0xec, 0xa5, 0xff},
118     {0x96, 0x46, 0xfb, 0x77, 0x63, 0x8f, 0x9c, 0xa8},
119     {0xb2, 0xb3, 0x20, 0x9d, 0xb6, 0x59, 0x4d, 0xa4},
120     {0x54, 0x5f, 0x7f, 0x32, 0xa5, 0xfc, 0x38, 0x36},
121     {0x82, 0x85, 0xe7, 0xc1, 0xb5, 0xbc, 0x74, 0x02},
122     {0xfc, 0x58, 0x6f, 0x92, 0xf7, 0x08, 0x09, 0x34},
123     {0xcf, 0x27, 0x0e, 0xf9, 0x71, 0x7f, 0xf7, 0xc4},
124     {0xe4, 0x93, 0xf1, 0xc1, 0xbb, 0x4d, 0x6e, 0x8c},
125     {0x5c, 0x4c, 0x04, 0x1e, 0x0f, 0x21, 0x7a, 0xc3},
126     {0x92, 0x1f, 0x12, 0x48, 0x53, 0x73, 0xb4, 0xf7},
127     {0x5b, 0xa0, 0xca, 0x6b, 0xbe, 0x7f, 0x5f, 0xad},
128     {0xc5, 0x33, 0x77, 0x1c, 0xd0, 0x11, 0x0e, 0x63},
129     {0x29, 0x4d, 0xdb, 0x46, 0xb3, 0x27, 0x8d, 0x60},
130     {0xda, 0xd6, 0xbd, 0xa9, 0xdf, 0xe8, 0xf7, 0xe8},
131     {0x97, 0xe0, 0x78, 0x78, 0x37, 0xed, 0x31, 0x7f},
132     {0x78, 0x75, 0xdb, 0xf6, 0x73, 0x8c, 0x64, 0x78},
133     {0x8f, 0x34, 0xc3, 0xc6, 0x81, 0xc9, 0x96, 0x95},
134     {0x7c, 0xb3, 0xf1, 0xdf, 0x34, 0xf9, 0x48, 0x11},
135     {0x7f, 0xd1, 0xa0, 0x23, 0xa5, 0xbb, 0xa2, 0x17},
136 };
137
138 static unsigned char rc5_cbc_key[RC5_CBC_NUM][17] = {
139     {1, 0x00},
140     {1, 0x00},
141     {1, 0x00},
142     {1, 0x00},
143     {1, 0x00},
144     {1, 0x11},
145     {1, 0x00},
146     {4, 0x00, 0x00, 0x00, 0x00},
147     {1, 0x00},
148     {1, 0x00},
149     {1, 0x00},
150     {1, 0x00},
151     {4, 0x01, 0x02, 0x03, 0x04},
152     {4, 0x01, 0x02, 0x03, 0x04},
153     {4, 0x01, 0x02, 0x03, 0x04},
154     {8, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08},
155     {8, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08},
156     {8, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08},
157     {8, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08},
158     {16, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08,
159      0x10, 0x20, 0x30, 0x40, 0x50, 0x60, 0x70, 0x80},
160     {16, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08,
161      0x10, 0x20, 0x30, 0x40, 0x50, 0x60, 0x70, 0x80},
162     {16, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08,
163      0x10, 0x20, 0x30, 0x40, 0x50, 0x60, 0x70, 0x80},
164     {5, 0x01, 0x02, 0x03, 0x04, 0x05},
165     {5, 0x01, 0x02, 0x03, 0x04, 0x05},
166     {5, 0x01, 0x02, 0x03, 0x04, 0x05},
167     {5, 0x01, 0x02, 0x03, 0x04, 0x05},
168     {5, 0x01, 0x02, 0x03, 0x04, 0x05},
169 };
170
171 static unsigned char rc5_cbc_plain[RC5_CBC_NUM][8] = {
172     {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00},
173     {0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff},
174     {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00},
175     {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01},
176     {0x10, 0x20, 0x30, 0x40, 0x50, 0x60, 0x70, 0x80},
177     {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00},
178     {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00},
179     {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00},
180     {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00},
181     {0x10, 0x20, 0x30, 0x40, 0x50, 0x60, 0x70, 0x80},
182     {0x10, 0x20, 0x30, 0x40, 0x50, 0x60, 0x70, 0x80},
183     {0x10, 0x20, 0x30, 0x40, 0x50, 0x60, 0x70, 0x80},
184     {0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff},
185     {0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff},
186     {0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff},
187     {0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff},
188     {0x10, 0x20, 0x30, 0x40, 0x50, 0x60, 0x70, 0x80},
189     {0x10, 0x20, 0x30, 0x40, 0x50, 0x60, 0x70, 0x80},
190     {0x10, 0x20, 0x30, 0x40, 0x50, 0x60, 0x70, 0x80},
191     {0x10, 0x20, 0x30, 0x40, 0x50, 0x60, 0x70, 0x80},
192     {0x10, 0x20, 0x30, 0x40, 0x50, 0x60, 0x70, 0x80},
193     {0x10, 0x20, 0x30, 0x40, 0x50, 0x60, 0x70, 0x80},
194     {0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff},
195     {0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff},
196     {0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08},
197     {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00},
198     {0x11, 0x22, 0x33, 0x44, 0x55, 0x66, 0x77, 0x01},
199 };
200
201 static int rc5_cbc_rounds[RC5_CBC_NUM] = {
202     0, 0, 0, 0, 0, 1, 2, 2,
203     8, 8, 12, 16, 8, 12, 16, 12,
204     8, 12, 16, 8, 12, 16, 12, 8,
205     8, 8, 8,
206 };
207
208 static unsigned char rc5_cbc_iv[RC5_CBC_NUM][8] = {
209     {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00},
210     {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00},
211     {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01},
212     {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00},
213     {0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08},
214     {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00},
215     {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00},
216     {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00},
217     {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00},
218     {0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08},
219     {0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08},
220     {0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08},
221     {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00},
222     {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00},
223     {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00},
224     {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00},
225     {0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08},
226     {0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08},
227     {0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08},
228     {0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08},
229     {0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08},
230     {0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08},
231     {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00},
232     {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00},
233     {0x78, 0x75, 0xdb, 0xf6, 0x73, 0x8c, 0x64, 0x78},
234     {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00},
235     {0x7c, 0xb3, 0xf1, 0xdf, 0x34, 0xf9, 0x48, 0x11},
236 };
237
238 int main(int argc, char *argv[])
239 {
240     int i, n, err = 0;
241     RC5_32_KEY key;
242     unsigned char buf[8], buf2[8], ivb[8];
243
244     for (n = 0; n < 5; n++) {
245         RC5_32_set_key(&key, 16, &(RC5key[n][0]), 12);
246
247         RC5_32_ecb_encrypt(&(RC5plain[n][0]), buf, &key, RC5_ENCRYPT);
248         if (memcmp(&(RC5cipher[n][0]), buf, 8) != 0) {
249             printf("ecb RC5 error encrypting (%d)\n", n + 1);
250             printf("got     :");
251             for (i = 0; i < 8; i++)
252                 printf("%02X ", buf[i]);
253             printf("\n");
254             printf("expected:");
255             for (i = 0; i < 8; i++)
256                 printf("%02X ", RC5cipher[n][i]);
257             err = 20;
258             printf("\n");
259         }
260
261         RC5_32_ecb_encrypt(buf, buf2, &key, RC5_DECRYPT);
262         if (memcmp(&(RC5plain[n][0]), buf2, 8) != 0) {
263             printf("ecb RC5 error decrypting (%d)\n", n + 1);
264             printf("got     :");
265             for (i = 0; i < 8; i++)
266                 printf("%02X ", buf2[i]);
267             printf("\n");
268             printf("expected:");
269             for (i = 0; i < 8; i++)
270                 printf("%02X ", RC5plain[n][i]);
271             printf("\n");
272             err = 3;
273         }
274     }
275     if (err == 0)
276         printf("ecb RC5 ok\n");
277
278     for (n = 0; n < RC5_CBC_NUM; n++) {
279         i = rc5_cbc_rounds[n];
280         if (i < 8)
281             continue;
282
283         RC5_32_set_key(&key, rc5_cbc_key[n][0], &(rc5_cbc_key[n][1]), i);
284
285         memcpy(ivb, &(rc5_cbc_iv[n][0]), 8);
286         RC5_32_cbc_encrypt(&(rc5_cbc_plain[n][0]), buf, 8,
287                            &key, &(ivb[0]), RC5_ENCRYPT);
288
289         if (memcmp(&(rc5_cbc_cipher[n][0]), buf, 8) != 0) {
290             printf("cbc RC5 error encrypting (%d)\n", n + 1);
291             printf("got     :");
292             for (i = 0; i < 8; i++)
293                 printf("%02X ", buf[i]);
294             printf("\n");
295             printf("expected:");
296             for (i = 0; i < 8; i++)
297                 printf("%02X ", rc5_cbc_cipher[n][i]);
298             err = 30;
299             printf("\n");
300         }
301
302         memcpy(ivb, &(rc5_cbc_iv[n][0]), 8);
303         RC5_32_cbc_encrypt(buf, buf2, 8, &key, &(ivb[0]), RC5_DECRYPT);
304         if (memcmp(&(rc5_cbc_plain[n][0]), buf2, 8) != 0) {
305             printf("cbc RC5 error decrypting (%d)\n", n + 1);
306             printf("got     :");
307             for (i = 0; i < 8; i++)
308                 printf("%02X ", buf2[i]);
309             printf("\n");
310             printf("expected:");
311             for (i = 0; i < 8; i++)
312                 printf("%02X ", rc5_cbc_plain[n][i]);
313             printf("\n");
314             err = 3;
315         }
316     }
317     if (err == 0)
318         printf("cbc RC5 ok\n");
319
320     EXIT(err);
321     return (err);
322 }
323
324 #endif