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 <string.h>
61: #include <stdlib.h>
62:
63: #include "../e_os.h"
64:
65: #ifdef OPENSSL_NO_IDEA
66: int main(int argc, char *argv[])
67: {
68: printf("No IDEA support\n");
69: return(0);
70: }
71: #else
72: #include <openssl/idea.h>
73:
74: unsigned char k[16]={
75: 0x00,0x01,0x00,0x02,0x00,0x03,0x00,0x04,
76: 0x00,0x05,0x00,0x06,0x00,0x07,0x00,0x08};
77:
78: unsigned char in[8]={0x00,0x00,0x00,0x01,0x00,0x02,0x00,0x03};
79: unsigned char c[8]={0x11,0xFB,0xED,0x2B,0x01,0x98,0x6D,0xE5};
80: unsigned char out[80];
81:
82: char *text="Hello to all people out there";
83:
84: static unsigned char cfb_key[16]={
85: 0xe1,0xf0,0xc3,0xd2,0xa5,0xb4,0x87,0x96,
86: 0x69,0x78,0x4b,0x5a,0x2d,0x3c,0x0f,0x1e,
87: };
88: static unsigned char cfb_iv[80]={0x34,0x12,0x78,0x56,0xab,0x90,0xef,0xcd};
89: static unsigned char cfb_buf1[40],cfb_buf2[40],cfb_tmp[8];
90: #define CFB_TEST_SIZE 24
91: static unsigned char plain[CFB_TEST_SIZE]=
92: {
93: 0x4e,0x6f,0x77,0x20,0x69,0x73,
94: 0x20,0x74,0x68,0x65,0x20,0x74,
95: 0x69,0x6d,0x65,0x20,0x66,0x6f,
96: 0x72,0x20,0x61,0x6c,0x6c,0x20
97: };
98: static unsigned char cfb_cipher64[CFB_TEST_SIZE]={
99: 0x59,0xD8,0xE2,0x65,0x00,0x58,0x6C,0x3F,
100: 0x2C,0x17,0x25,0xD0,0x1A,0x38,0xB7,0x2A,
101: 0x39,0x61,0x37,0xDC,0x79,0xFB,0x9F,0x45
102:
103:
104:
105:
106: };
107:
108: static int cfb64_test(unsigned char *cfb_cipher);
109: static char *pt(unsigned char *p);
110: int main(int argc, char *argv[])
111: {
112: int i,err=0;
113: IDEA_KEY_SCHEDULE key,dkey;
114: unsigned char iv[8];
115:
116: idea_set_encrypt_key(k,&key);
117: idea_ecb_encrypt(in,out,&key);
118: if (memcmp(out,c,8) != 0)
119: {
120: printf("ecb idea error encrypting\n");
121: printf("got :");
122: for (i=0; i<8; i++)
123: printf("%02X ",out[i]);
124: printf("\n");
125: printf("expected:");
126: for (i=0; i<8; i++)
127: printf("%02X ",c[i]);
128: err=20;
129: printf("\n");
130: }
131:
132: idea_set_decrypt_key(&key,&dkey);
133: idea_ecb_encrypt(c,out,&dkey);
134: if (memcmp(out,in,8) != 0)
135: {
136: printf("ecb idea error decrypting\n");
137: printf("got :");
138: for (i=0; i<8; i++)
139: printf("%02X ",out[i]);
140: printf("\n");
141: printf("expected:");
142: for (i=0; i<8; i++)
143: printf("%02X ",in[i]);
144: printf("\n");
145: err=3;
146: }
147:
148: if (err == 0) printf("ecb idea ok\n");
149:
150: memcpy(iv,k,8);
151: idea_cbc_encrypt((unsigned char *)text,out,strlen(text)+1,&key,iv,1);
152: memcpy(iv,k,8);
153: idea_cbc_encrypt(out,out,8,&dkey,iv,0);
154: idea_cbc_encrypt(&(out[8]),&(out[8]),strlen(text)+1-8,&dkey,iv,0);
155: if (memcmp(text,out,strlen(text)+1) != 0)
156: {
157: printf("cbc idea bad\n");
158: err=4;
159: }
160: else
161: printf("cbc idea ok\n");
162:
163: printf("cfb64 idea ");
164: if (cfb64_test(cfb_cipher64))
165: {
166: printf("bad\n");
167: err=5;
168: }
169: else
170: printf("ok\n");
171:
172: #ifdef OPENSSL_SYS_NETWARE
173: if (err) printf("ERROR: %d\n", err);
174: #endif
175: EXIT(err);
176: return(err);
177: }
178:
179: static int cfb64_test(unsigned char *cfb_cipher)
180: {
181: IDEA_KEY_SCHEDULE eks,dks;
182: int err=0,i,n;
183:
184: idea_set_encrypt_key(cfb_key,&eks);
185: idea_set_decrypt_key(&eks,&dks);
186: memcpy(cfb_tmp,cfb_iv,8);
187: n=0;
188: idea_cfb64_encrypt(plain,cfb_buf1,(long)12,&eks,
189: cfb_tmp,&n,IDEA_ENCRYPT);
190: idea_cfb64_encrypt(&(plain[12]),&(cfb_buf1[12]),
191: (long)CFB_TEST_SIZE-12,&eks,
192: cfb_tmp,&n,IDEA_ENCRYPT);
193: if (memcmp(cfb_cipher,cfb_buf1,CFB_TEST_SIZE) != 0)
194: {
195: err=1;
196: printf("idea_cfb64_encrypt encrypt error\n");
197: for (i=0; i<CFB_TEST_SIZE; i+=8)
198: printf("%s\n",pt(&(cfb_buf1[i])));
199: }
200: memcpy(cfb_tmp,cfb_iv,8);
201: n=0;
202: idea_cfb64_encrypt(cfb_buf1,cfb_buf2,(long)17,&eks,
203: cfb_tmp,&n,IDEA_DECRYPT);
204: idea_cfb64_encrypt(&(cfb_buf1[17]),&(cfb_buf2[17]),
205: (long)CFB_TEST_SIZE-17,&dks,
206: cfb_tmp,&n,IDEA_DECRYPT);
207: if (memcmp(plain,cfb_buf2,CFB_TEST_SIZE) != 0)
208: {
209: err=1;
210: printf("idea_cfb_encrypt decrypt error\n");
211: for (i=0; i<24; i+=8)
212: printf("%s\n",pt(&(cfb_buf2[i])));
213: }
214: return(err);
215: }
216:
217: static char *pt(unsigned char *p)
218: {
219: static char bufs[10][20];
220: static int bnum=0;
221: char *ret;
222: int i;
223: static char *f="0123456789ABCDEF";
224:
225: ret= &(bufs[bnum++][0]);
226: bnum%=10;
227: for (i=0; i<8; i++)
228: {
229: ret[i*2]=f[(p[i]>>4)&0xf];
230: ret[i*2+1]=f[p[i]&0xf];
231: }
232: ret[16]='\0';
233: return(ret);
234: }
235: #endif