1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
31:
32:
33:
34:
35:
36:
37:
38:
39:
40:
41:
42:
43:
44:
45:
46:
47:
48:
49:
50:
51:
52:
53:
54:
55:
56:
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: int main(int argc, char *argv[])
116: {
117: int err=0;
118: unsigned int i, j;
119: unsigned char *p;
120: RC4_KEY key;
121: unsigned char obuf[512];
122:
123: for (i=0; i<6; i++)
124: {
125: RC4_set_key(&key,keys[i][0],&(keys[i][1]));
126: memset(obuf,0x00,sizeof(obuf));
127: RC4(&key,data_len[i],&(data[i][0]),obuf);
128: if (memcmp(obuf,output[i],data_len[i]+1) != 0)
129: {
130: printf("error calculating RC4\n");
131: printf("output:");
132: for (j=0; j<data_len[i]+1U; j++)
133: printf(" %02x",obuf[j]);
134: printf("\n");
135: printf("expect:");
136: p= &(output[i][0]);
137: for (j=0; j<data_len[i]+1U; j++)
138: printf(" %02x",*(p++));
139: printf("\n");
140: err++;
141: }
142: else
143: printf("test %d ok\n",i);
144: }
145: printf("test end processing ");
146: for (i=0; i<data_len[3]; i++)
147: {
148: RC4_set_key(&key,keys[3][0],&(keys[3][1]));
149: memset(obuf,0x00,sizeof(obuf));
150: RC4(&key,i,&(data[3][0]),obuf);
151: if ((memcmp(obuf,output[3],i) != 0) || (obuf[i] != 0))
152: {
153: printf("error in RC4 length processing\n");
154: printf("output:");
155: for (j=0; j<i+1; j++)
156: printf(" %02x",obuf[j]);
157: printf("\n");
158: printf("expect:");
159: p= &(output[3][0]);
160: for (j=0; j<i; j++)
161: printf(" %02x",*(p++));
162: printf(" 00\n");
163: err++;
164: }
165: else
166: {
167: printf(".");
168: fflush(stdout);
169: }
170: }
171: printf("done\n");
172: printf("test multi-call ");
173: for (i=0; i<data_len[3]; i++)
174: {
175: RC4_set_key(&key,keys[3][0],&(keys[3][1]));
176: memset(obuf,0x00,sizeof(obuf));
177: RC4(&key,i,&(data[3][0]),obuf);
178: RC4(&key,data_len[3]-i,&(data[3][i]),&(obuf[i]));
179: if (memcmp(obuf,output[3],data_len[3]+1) != 0)
180: {
181: printf("error in RC4 multi-call processing\n");
182: printf("output:");
183: for (j=0; j<data_len[3]+1U; j++)
184: printf(" %02x",obuf[j]);
185: printf("\n");
186: printf("expect:");
187: p= &(output[3][0]);
188: for (j=0; j<data_len[3]+1U; j++)
189: printf(" %02x",*(p++));
190: err++;
191: }
192: else
193: {
194: printf(".");
195: fflush(stdout);
196: }
197: }
198: printf("done\n");
199: printf("bulk test ");
200: { unsigned char buf[513];
201: SHA_CTX c;
202: unsigned char md[SHA_DIGEST_LENGTH];
203: static unsigned char expected[]={
204: 0xa4,0x7b,0xcc,0x00,0x3d,0xd0,0xbd,0xe1,0xac,0x5f,
205: 0x12,0x1e,0x45,0xbc,0xfb,0x1a,0xa1,0xf2,0x7f,0xc5 };
206:
207: RC4_set_key(&key,keys[0][0],&(keys[3][1]));
208: memset(buf,'\0',sizeof(buf));
209: SHA1_Init(&c);
210: for (i=0;i<2571;i++) {
211: RC4(&key,sizeof(buf),buf,buf);
212: SHA1_Update(&c,buf,sizeof(buf));
213: }
214: SHA1_Final(md,&c);
215:
216: if (memcmp(md,expected,sizeof(md))) {
217: printf("error in RC4 bulk test\n");
218: printf("output:");
219: for (j=0; j<sizeof(md); j++)
220: printf(" %02x",md[j]);
221: printf("\n");
222: printf("expect:");
223: for (j=0; j<sizeof(md); j++)
224: printf(" %02x",expected[j]);
225: printf("\n");
226: err++;
227: }
228: else printf("ok\n");
229: }
230: #ifdef OPENSSL_SYS_NETWARE
231: if (err) printf("ERROR: %d\n", err);
232: #endif
233: EXIT(err);
234: return(0);
235: }
236: #endif