Branch data Line data Source code
1 : : /* crypto/rc4/rc4test.c */
2 : : /* Copyright (C) 1995-1998 Eric Young (eay@cryptsoft.com)
3 : : * All rights reserved.
4 : : *
5 : : * This package is an SSL implementation written
6 : : * by Eric Young (eay@cryptsoft.com).
7 : : * The implementation was written so as to conform with Netscapes SSL.
8 : : *
9 : : * This library is free for commercial and non-commercial use as long as
10 : : * the following conditions are aheared to. The following conditions
11 : : * apply to all code found in this distribution, be it the RC4, RSA,
12 : : * lhash, DES, etc., code; not just the SSL code. The SSL documentation
13 : : * included with this distribution is covered by the same copyright terms
14 : : * except that the holder is Tim Hudson (tjh@cryptsoft.com).
15 : : *
16 : : * Copyright remains Eric Young's, and as such any Copyright notices in
17 : : * the code are not to be removed.
18 : : * If this package is used in a product, Eric Young should be given attribution
19 : : * as the author of the parts of the library used.
20 : : * This can be in the form of a textual message at program startup or
21 : : * in documentation (online or textual) provided with the package.
22 : : *
23 : : * Redistribution and use in source and binary forms, with or without
24 : : * modification, are permitted provided that the following conditions
25 : : * are met:
26 : : * 1. Redistributions of source code must retain the copyright
27 : : * notice, this list of conditions and the following disclaimer.
28 : : * 2. Redistributions in binary form must reproduce the above copyright
29 : : * notice, this list of conditions and the following disclaimer in the
30 : : * documentation and/or other materials provided with the distribution.
31 : : * 3. All advertising materials mentioning features or use of this software
32 : : * must display the following acknowledgement:
33 : : * "This product includes cryptographic software written by
34 : : * Eric Young (eay@cryptsoft.com)"
35 : : * The word 'cryptographic' can be left out if the rouines from the library
36 : : * being used are not cryptographic related :-).
37 : : * 4. If you include any Windows specific code (or a derivative thereof) from
38 : : * the apps directory (application code) you must include an acknowledgement:
39 : : * "This product includes software written by Tim Hudson (tjh@cryptsoft.com)"
40 : : *
41 : : * THIS SOFTWARE IS PROVIDED BY ERIC YOUNG ``AS IS'' AND
42 : : * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
43 : : * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
44 : : * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
45 : : * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
46 : : * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
47 : : * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
48 : : * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
49 : : * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
50 : : * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
51 : : * SUCH DAMAGE.
52 : : *
53 : : * The licence and distribution terms for any publically available version or
54 : : * derivative of this code cannot be changed. i.e. this code cannot simply be
55 : : * copied and put under another distribution licence
56 : : * [including the GNU Public Licence.]
57 : : */
58 : :
59 : : #include <stdio.h>
60 : : #include <stdlib.h>
61 : : #include <string.h>
62 : :
63 : : #include "../e_os.h"
64 : :
65 : : #ifdef OPENSSL_NO_RC4
66 : : int main(int argc, char *argv[])
67 : : {
68 : : printf("No RC4 support\n");
69 : : return(0);
70 : : }
71 : : #else
72 : : #include <openssl/rc4.h>
73 : : #include <openssl/sha.h>
74 : :
75 : : static unsigned char keys[7][30]={
76 : : {8,0x01,0x23,0x45,0x67,0x89,0xab,0xcd,0xef},
77 : : {8,0x01,0x23,0x45,0x67,0x89,0xab,0xcd,0xef},
78 : : {8,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00},
79 : : {4,0xef,0x01,0x23,0x45},
80 : : {8,0x01,0x23,0x45,0x67,0x89,0xab,0xcd,0xef},
81 : : {4,0xef,0x01,0x23,0x45},
82 : : };
83 : :
84 : : static unsigned char data_len[7]={8,8,8,20,28,10};
85 : : static unsigned char data[7][30]={
86 : : {0x01,0x23,0x45,0x67,0x89,0xab,0xcd,0xef,0xff},
87 : : {0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff},
88 : : {0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff},
89 : : {0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
90 : : 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
91 : : 0x00,0x00,0x00,0x00,0xff},
92 : : {0x12,0x34,0x56,0x78,0x9A,0xBC,0xDE,0xF0,
93 : : 0x12,0x34,0x56,0x78,0x9A,0xBC,0xDE,0xF0,
94 : : 0x12,0x34,0x56,0x78,0x9A,0xBC,0xDE,0xF0,
95 : : 0x12,0x34,0x56,0x78,0xff},
96 : : {0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff},
97 : : {0},
98 : : };
99 : :
100 : : static unsigned char output[7][30]={
101 : : {0x75,0xb7,0x87,0x80,0x99,0xe0,0xc5,0x96,0x00},
102 : : {0x74,0x94,0xc2,0xe7,0x10,0x4b,0x08,0x79,0x00},
103 : : {0xde,0x18,0x89,0x41,0xa3,0x37,0x5d,0x3a,0x00},
104 : : {0xd6,0xa1,0x41,0xa7,0xec,0x3c,0x38,0xdf,
105 : : 0xbd,0x61,0x5a,0x11,0x62,0xe1,0xc7,0xba,
106 : : 0x36,0xb6,0x78,0x58,0x00},
107 : : {0x66,0xa0,0x94,0x9f,0x8a,0xf7,0xd6,0x89,
108 : : 0x1f,0x7f,0x83,0x2b,0xa8,0x33,0xc0,0x0c,
109 : : 0x89,0x2e,0xbe,0x30,0x14,0x3c,0xe2,0x87,
110 : : 0x40,0x01,0x1e,0xcf,0x00},
111 : : {0xd6,0xa1,0x41,0xa7,0xec,0x3c,0x38,0xdf,0xbd,0x61,0x00},
112 : : {0},
113 : : };
114 : :
115 : 1 : int main(int argc, char *argv[])
116 : : {
117 : 1 : int i,err=0;
118 : : int j;
119 : : unsigned char *p;
120 : : RC4_KEY key;
121 : : unsigned char obuf[512];
122 : :
123 : : #if !defined(OPENSSL_PIC)
124 : : void OPENSSL_cpuid_setup(void);
125 : :
126 : 1 : OPENSSL_cpuid_setup();
127 : : #endif
128 : :
129 [ + + ]: 7 : for (i=0; i<6; i++)
130 : : {
131 : 6 : RC4_set_key(&key,keys[i][0],&(keys[i][1]));
132 : : memset(obuf,0x00,sizeof(obuf));
133 : 6 : RC4(&key,data_len[i],&(data[i][0]),obuf);
134 [ - + ]: 6 : if (memcmp(obuf,output[i],data_len[i]+1) != 0)
135 : : {
136 : : printf("error calculating RC4\n");
137 : : printf("output:");
138 [ # # ]: 0 : for (j=0; j<data_len[i]+1; j++)
139 : 0 : printf(" %02x",obuf[j]);
140 : : printf("\n");
141 : : printf("expect:");
142 : 0 : p= &(output[i][0]);
143 [ # # ]: 0 : for (j=0; j<data_len[i]+1; j++)
144 : 0 : printf(" %02x",*(p++));
145 : : printf("\n");
146 : 0 : err++;
147 : : }
148 : : else
149 : : printf("test %d ok\n",i);
150 : : }
151 : : printf("test end processing ");
152 [ + + ]: 21 : for (i=0; i<data_len[3]; i++)
153 : : {
154 : 20 : RC4_set_key(&key,keys[3][0],&(keys[3][1]));
155 : : memset(obuf,0x00,sizeof(obuf));
156 : 20 : RC4(&key,i,&(data[3][0]),obuf);
157 [ + - ][ - + ]: 20 : if ((memcmp(obuf,output[3],i) != 0) || (obuf[i] != 0))
158 : : {
159 : : printf("error in RC4 length processing\n");
160 : : printf("output:");
161 [ # # ]: 0 : for (j=0; j<i+1; j++)
162 : 0 : printf(" %02x",obuf[j]);
163 : : printf("\n");
164 : : printf("expect:");
165 : 0 : p= &(output[3][0]);
166 [ # # ]: 0 : for (j=0; j<i; j++)
167 : 0 : printf(" %02x",*(p++));
168 : : printf(" 00\n");
169 : 0 : err++;
170 : : }
171 : : else
172 : : {
173 : : printf(".");
174 : 20 : fflush(stdout);
175 : : }
176 : : }
177 : : printf("done\n");
178 : : printf("test multi-call ");
179 [ + + ]: 21 : for (i=0; i<data_len[3]; i++)
180 : : {
181 : 20 : RC4_set_key(&key,keys[3][0],&(keys[3][1]));
182 : : memset(obuf,0x00,sizeof(obuf));
183 : 20 : RC4(&key,i,&(data[3][0]),obuf);
184 : 20 : RC4(&key,data_len[3]-i,&(data[3][i]),&(obuf[i]));
185 [ - + ]: 20 : if (memcmp(obuf,output[3],data_len[3]+1) != 0)
186 : : {
187 : : printf("error in RC4 multi-call processing\n");
188 : : printf("output:");
189 [ # # ]: 0 : for (j=0; j<data_len[3]+1; j++)
190 : 0 : printf(" %02x",obuf[j]);
191 : : printf("\n");
192 : : printf("expect:");
193 : 0 : p= &(output[3][0]);
194 [ # # ]: 0 : for (j=0; j<data_len[3]+1; j++)
195 : 0 : printf(" %02x",*(p++));
196 : 0 : err++;
197 : : }
198 : : else
199 : : {
200 : : printf(".");
201 : 20 : fflush(stdout);
202 : : }
203 : : }
204 : : printf("done\n");
205 : : printf("bulk test ");
206 : : { unsigned char buf[513];
207 : : SHA_CTX c;
208 : : unsigned char md[SHA_DIGEST_LENGTH];
209 : : static unsigned char expected[]={
210 : : 0xa4,0x7b,0xcc,0x00,0x3d,0xd0,0xbd,0xe1,0xac,0x5f,
211 : : 0x12,0x1e,0x45,0xbc,0xfb,0x1a,0xa1,0xf2,0x7f,0xc5 };
212 : :
213 : 1 : RC4_set_key(&key,keys[0][0],&(keys[3][1]));
214 : : memset(buf,'\0',sizeof(buf));
215 : 1 : SHA1_Init(&c);
216 [ + + ]: 2572 : for (i=0;i<2571;i++) {
217 : 2571 : RC4(&key,sizeof(buf),buf,buf);
218 : 2571 : SHA1_Update(&c,buf,sizeof(buf));
219 : : }
220 : 1 : SHA1_Final(md,&c);
221 : :
222 [ - + ]: 1 : if (memcmp(md,expected,sizeof(md))) {
223 : : printf("error in RC4 bulk test\n");
224 : : printf("output:");
225 [ # # ]: 0 : for (j=0; j<(int)sizeof(md); j++)
226 : 0 : printf(" %02x",md[j]);
227 : : printf("\n");
228 : : printf("expect:");
229 [ # # ]: 0 : for (j=0; j<(int)sizeof(md); j++)
230 : 0 : printf(" %02x",expected[j]);
231 : : printf("\n");
232 : 0 : err++;
233 : : }
234 : : else printf("ok\n");
235 : : }
236 : : #ifdef OPENSSL_SYS_NETWARE
237 : : if (err) printf("ERROR: %d\n", err);
238 : : #endif
239 : 1 : EXIT(err);
240 : : return(0);
241 : : }
242 : : #endif
|