1 /* The blowfish algorithm
2  * As described in the Schneier's book. Minor changes only
3  * Changed to conform to the "new" blowfish posted in 30 Oct 1994
4  */
5 
6 /* modified in order to use the libmcrypt API by Nikos Mavroyanopoulos
7  * All modifications are placed under the license of libmcrypt.
8  */
9 
10 /* $Id: blowfish-compat.c,v 1.11 2003/01/19 17:48:27 nmav Exp $ */
11 
12 #include <libdefs.h>
13 
14 #include <mcrypt_modules.h>
15 #include "blowfish.h"
16 
17 #define _mcrypt_set_key blowfish_compat_LTX__mcrypt_set_key
18 #define _mcrypt_encrypt blowfish_compat_LTX__mcrypt_encrypt
19 #define _mcrypt_decrypt blowfish_compat_LTX__mcrypt_decrypt
20 #define _mcrypt_get_size blowfish_compat_LTX__mcrypt_get_size
21 #define _mcrypt_get_block_size blowfish_compat_LTX__mcrypt_get_block_size
22 #define _is_block_algorithm blowfish_compat_LTX__is_block_algorithm
23 #define _mcrypt_get_key_size blowfish_compat_LTX__mcrypt_get_key_size
24 #define _mcrypt_get_supported_key_sizes blowfish_compat_LTX__mcrypt_get_supported_key_sizes
25 #define _mcrypt_get_algorithms_name blowfish_compat_LTX__mcrypt_get_algorithms_name
26 #define _mcrypt_self_test blowfish_compat_LTX__mcrypt_self_test
27 #define _mcrypt_algorithm_version blowfish_compat_LTX__mcrypt_algorithm_version
28 
29 /*
30 typedef struct {
31          word32 S[4][256],P[18];
32 } blf_ctx;
33 */
34 
35 #define MAXKEYBYTES 56		/* 448 bits */
36 
37 #define BF_N         16
38 #define KEYBYTES   8
39 
40 #define F(bc, x) ( ((bc->S[0][(x >> 24) & 0xff] + bc->S[1][(x >> 16) & 0xff]) ^ bc->S[2][(x >>  8) & 0xff]) + bc->S[3][x & 0xff] )
41 
42 /* x should be a 64 bit integer */
_mcrypt_encrypt(blf_ctx * c,word32 * x)43 WIN32DLL_DEFINE void _mcrypt_encrypt(blf_ctx * c, word32 * x)
44 {
45 	word32 Xl;
46 	word32 Xr, temp;
47 	short i;
48 
49 #ifndef WORDS_BIGENDIAN
50 	Xl = x[0];
51 	Xr = x[1];
52 #else
53 	Xl = byteswap32(x[0]);
54 	Xr = byteswap32(x[1]);
55 #endif
56 
57 	for (i = 0; i < BF_N; ++i) {
58 		Xl ^= c->P[i];
59 		Xr ^= F(c, Xl);
60 
61 		temp = Xl;
62 		Xl = Xr;
63 		Xr = temp;
64 	}
65 
66 	temp = Xl;
67 	Xl = Xr;
68 	Xr = temp;
69 
70 	Xr ^= c->P[BF_N];
71 	Xl ^= c->P[BF_N + 1];
72 
73 #ifndef WORDS_BIGENDIAN
74 	x[0] = Xl;
75 	x[1] = Xr;
76 #else
77 	x[0] = byteswap32(Xl);
78 	x[1] = byteswap32(Xr);
79 #endif
80 
81 }
82 
83 /* x should be a 64 bit integer */
enblf_noswap(blf_ctx * c,word32 * x)84 static void enblf_noswap(blf_ctx * c, word32 * x)
85 {				/* Used internally */
86 	word32 Xl;
87 	word32 Xr, temp;
88 	short i;
89 
90 	Xl = x[0];
91 	Xr = x[1];
92 
93 	for (i = 0; i < BF_N; ++i) {
94 		Xl ^= c->P[i];
95 		Xr ^= F(c, Xl);
96 
97 		temp = Xl;
98 		Xl = Xr;
99 		Xr = temp;
100 	}
101 
102 	temp = Xl;
103 	Xl = Xr;
104 	Xr = temp;
105 
106 	Xr ^= c->P[BF_N];
107 	Xl ^= c->P[BF_N + 1];
108 
109 	x[0] = Xl;
110 	x[1] = Xr;
111 }
112 
_mcrypt_decrypt(blf_ctx * c,word32 * x)113 WIN32DLL_DEFINE void _mcrypt_decrypt(blf_ctx * c, word32 * x)
114 {
115 	word32 Xl, Xr, temp;
116 	short i;
117 
118 #ifndef WORDS_BIGENDIAN
119 	Xl = x[0];
120 	Xr = x[1];
121 #else
122 	Xl = byteswap32(x[0]);
123 	Xr = byteswap32(x[1]);
124 #endif
125 
126 	for (i = BF_N + 1; i > 1; --i) {
127 		Xl ^= c->P[i];
128 		Xr ^= F(c, Xl);
129 
130 		temp = Xl;
131 		Xl = Xr;
132 		Xr = temp;
133 	}
134 
135 	temp = Xl;
136 	Xl = Xr;
137 	Xr = temp;
138 
139 	Xr ^= c->P[1];
140 	Xl ^= c->P[0];
141 
142 #ifndef WORDS_BIGENDIAN
143 	x[0] = Xl;
144 	x[1] = Xr;
145 #else
146 	x[0] = byteswap32(Xl);
147 	x[1] = byteswap32(Xr);
148 #endif
149 }
150 
151 
initialize_blowfish(blf_ctx * c,byte key[],short keybytes)152 static short initialize_blowfish(blf_ctx * c, byte key[], short keybytes)
153 {
154 	short i, j;
155 	word32 data, datarl[2];
156 
157 	word32 ks0[] = {
158 		0xd1310ba6L, 0x98dfb5acL, 0x2ffd72dbL, 0xd01adfb7L,
159 		0xb8e1afedL, 0x6a267e96L,
160 		0xba7c9045L, 0xf12c7f99L, 0x24a19947L, 0xb3916cf7L,
161 		0x0801f2e2L, 0x858efc16L,
162 		0x636920d8L, 0x71574e69L, 0xa458fea3L, 0xf4933d7eL,
163 		0x0d95748fL, 0x728eb658L,
164 		0x718bcd58L, 0x82154aeeL, 0x7b54a41dL, 0xc25a59b5L,
165 		0x9c30d539L, 0x2af26013L,
166 		0xc5d1b023L, 0x286085f0L, 0xca417918L, 0xb8db38efL,
167 		0x8e79dcb0L, 0x603a180eL,
168 		0x6c9e0e8bL, 0xb01e8a3eL, 0xd71577c1L, 0xbd314b27L,
169 		0x78af2fdaL, 0x55605c60L,
170 		0xe65525f3L, 0xaa55ab94L, 0x57489862L, 0x63e81440L,
171 		0x55ca396aL, 0x2aab10b6L,
172 		0xb4cc5c34L, 0x1141e8ceL, 0xa15486afL, 0x7c72e993L,
173 		0xb3ee1411L, 0x636fbc2aL,
174 		0x2ba9c55dL, 0x741831f6L, 0xce5c3e16L, 0x9b87931eL,
175 		0xafd6ba33L, 0x6c24cf5cL,
176 		0x7a325381L, 0x28958677L, 0x3b8f4898L, 0x6b4bb9afL,
177 		0xc4bfe81bL, 0x66282193L,
178 		0x61d809ccL, 0xfb21a991L, 0x487cac60L, 0x5dec8032L,
179 		0xef845d5dL, 0xe98575b1L,
180 		0xdc262302L, 0xeb651b88L, 0x23893e81L, 0xd396acc5L,
181 		0x0f6d6ff3L, 0x83f44239L,
182 		0x2e0b4482L, 0xa4842004L, 0x69c8f04aL, 0x9e1f9b5eL,
183 		0x21c66842L, 0xf6e96c9aL,
184 		0x670c9c61L, 0xabd388f0L, 0x6a51a0d2L, 0xd8542f68L,
185 		0x960fa728L, 0xab5133a3L,
186 		0x6eef0b6cL, 0x137a3be4L, 0xba3bf050L, 0x7efb2a98L,
187 		0xa1f1651dL, 0x39af0176L,
188 		0x66ca593eL, 0x82430e88L, 0x8cee8619L, 0x456f9fb4L,
189 		0x7d84a5c3L, 0x3b8b5ebeL,
190 		0xe06f75d8L, 0x85c12073L, 0x401a449fL, 0x56c16aa6L,
191 		0x4ed3aa62L, 0x363f7706L,
192 		0x1bfedf72L, 0x429b023dL, 0x37d0d724L, 0xd00a1248L,
193 		0xdb0fead3L, 0x49f1c09bL,
194 		0x075372c9L, 0x80991b7bL, 0x25d479d8L, 0xf6e8def7L,
195 		0xe3fe501aL, 0xb6794c3bL,
196 		0x976ce0bdL, 0x04c006baL, 0xc1a94fb6L, 0x409f60c4L,
197 		0x5e5c9ec2L, 0x196a2463L,
198 		0x68fb6fafL, 0x3e6c53b5L, 0x1339b2ebL, 0x3b52ec6fL,
199 		0x6dfc511fL, 0x9b30952cL,
200 		0xcc814544L, 0xaf5ebd09L, 0xbee3d004L, 0xde334afdL,
201 		0x660f2807L, 0x192e4bb3L,
202 		0xc0cba857L, 0x45c8740fL, 0xd20b5f39L, 0xb9d3fbdbL,
203 		0x5579c0bdL, 0x1a60320aL,
204 		0xd6a100c6L, 0x402c7279L, 0x679f25feL, 0xfb1fa3ccL,
205 		0x8ea5e9f8L, 0xdb3222f8L,
206 		0x3c7516dfL, 0xfd616b15L, 0x2f501ec8L, 0xad0552abL,
207 		0x323db5faL, 0xfd238760L,
208 		0x53317b48L, 0x3e00df82L, 0x9e5c57bbL, 0xca6f8ca0L,
209 		0x1a87562eL, 0xdf1769dbL,
210 		0xd542a8f6L, 0x287effc3L, 0xac6732c6L, 0x8c4f5573L,
211 		0x695b27b0L, 0xbbca58c8L,
212 		0xe1ffa35dL, 0xb8f011a0L, 0x10fa3d98L, 0xfd2183b8L,
213 		0x4afcb56cL, 0x2dd1d35bL,
214 		0x9a53e479L, 0xb6f84565L, 0xd28e49bcL, 0x4bfb9790L,
215 		0xe1ddf2daL, 0xa4cb7e33L,
216 		0x62fb1341L, 0xcee4c6e8L, 0xef20cadaL, 0x36774c01L,
217 		0xd07e9efeL, 0x2bf11fb4L,
218 		0x95dbda4dL, 0xae909198L, 0xeaad8e71L, 0x6b93d5a0L,
219 		0xd08ed1d0L, 0xafc725e0L,
220 		0x8e3c5b2fL, 0x8e7594b7L, 0x8ff6e2fbL, 0xf2122b64L,
221 		0x8888b812L, 0x900df01cL,
222 		0x4fad5ea0L, 0x688fc31cL, 0xd1cff191L, 0xb3a8c1adL,
223 		0x2f2f2218L, 0xbe0e1777L,
224 		0xea752dfeL, 0x8b021fa1L, 0xe5a0cc0fL, 0xb56f74e8L,
225 		0x18acf3d6L, 0xce89e299L,
226 		0xb4a84fe0L, 0xfd13e0b7L, 0x7cc43b81L, 0xd2ada8d9L,
227 		0x165fa266L, 0x80957705L,
228 		0x93cc7314L, 0x211a1477L, 0xe6ad2065L, 0x77b5fa86L,
229 		0xc75442f5L, 0xfb9d35cfL,
230 		0xebcdaf0cL, 0x7b3e89a0L, 0xd6411bd3L, 0xae1e7e49L,
231 		0x00250e2dL, 0x2071b35eL,
232 		0x226800bbL, 0x57b8e0afL, 0x2464369bL, 0xf009b91eL,
233 		0x5563911dL, 0x59dfa6aaL,
234 		0x78c14389L, 0xd95a537fL, 0x207d5ba2L, 0x02e5b9c5L,
235 		0x83260376L, 0x6295cfa9L,
236 		0x11c81968L, 0x4e734a41L, 0xb3472dcaL, 0x7b14a94aL,
237 		0x1b510052L, 0x9a532915L,
238 		0xd60f573fL, 0xbc9bc6e4L, 0x2b60a476L, 0x81e67400L,
239 		0x08ba6fb5L, 0x571be91fL,
240 		0xf296ec6bL, 0x2a0dd915L, 0xb6636521L, 0xe7b9f9b6L,
241 		0xff34052eL, 0xc5855664L,
242 		0x53b02d5dL, 0xa99f8fa1L, 0x08ba4799L, 0x6e85076aL
243 	};
244 
245 	word32 ks1[] = {
246 		0x4b7a70e9L, 0xb5b32944L, 0xdb75092eL, 0xc4192623L,
247 		0xad6ea6b0L, 0x49a7df7dL,
248 		0x9cee60b8L, 0x8fedb266L, 0xecaa8c71L, 0x699a17ffL,
249 		0x5664526cL, 0xc2b19ee1L,
250 		0x193602a5L, 0x75094c29L, 0xa0591340L, 0xe4183a3eL,
251 		0x3f54989aL, 0x5b429d65L,
252 		0x6b8fe4d6L, 0x99f73fd6L, 0xa1d29c07L, 0xefe830f5L,
253 		0x4d2d38e6L, 0xf0255dc1L,
254 		0x4cdd2086L, 0x8470eb26L, 0x6382e9c6L, 0x021ecc5eL,
255 		0x09686b3fL, 0x3ebaefc9L,
256 		0x3c971814L, 0x6b6a70a1L, 0x687f3584L, 0x52a0e286L,
257 		0xb79c5305L, 0xaa500737L,
258 		0x3e07841cL, 0x7fdeae5cL, 0x8e7d44ecL, 0x5716f2b8L,
259 		0xb03ada37L, 0xf0500c0dL,
260 		0xf01c1f04L, 0x0200b3ffL, 0xae0cf51aL, 0x3cb574b2L,
261 		0x25837a58L, 0xdc0921bdL,
262 		0xd19113f9L, 0x7ca92ff6L, 0x94324773L, 0x22f54701L,
263 		0x3ae5e581L, 0x37c2dadcL,
264 		0xc8b57634L, 0x9af3dda7L, 0xa9446146L, 0x0fd0030eL,
265 		0xecc8c73eL, 0xa4751e41L,
266 		0xe238cd99L, 0x3bea0e2fL, 0x3280bba1L, 0x183eb331L,
267 		0x4e548b38L, 0x4f6db908L,
268 		0x6f420d03L, 0xf60a04bfL, 0x2cb81290L, 0x24977c79L,
269 		0x5679b072L, 0xbcaf89afL,
270 		0xde9a771fL, 0xd9930810L, 0xb38bae12L, 0xdccf3f2eL,
271 		0x5512721fL, 0x2e6b7124L,
272 		0x501adde6L, 0x9f84cd87L, 0x7a584718L, 0x7408da17L,
273 		0xbc9f9abcL, 0xe94b7d8cL,
274 		0xec7aec3aL, 0xdb851dfaL, 0x63094366L, 0xc464c3d2L,
275 		0xef1c1847L, 0x3215d908L,
276 		0xdd433b37L, 0x24c2ba16L, 0x12a14d43L, 0x2a65c451L,
277 		0x50940002L, 0x133ae4ddL,
278 		0x71dff89eL, 0x10314e55L, 0x81ac77d6L, 0x5f11199bL,
279 		0x043556f1L, 0xd7a3c76bL,
280 		0x3c11183bL, 0x5924a509L, 0xf28fe6edL, 0x97f1fbfaL,
281 		0x9ebabf2cL, 0x1e153c6eL,
282 		0x86e34570L, 0xeae96fb1L, 0x860e5e0aL, 0x5a3e2ab3L,
283 		0x771fe71cL, 0x4e3d06faL,
284 		0x2965dcb9L, 0x99e71d0fL, 0x803e89d6L, 0x5266c825L,
285 		0x2e4cc978L, 0x9c10b36aL,
286 		0xc6150ebaL, 0x94e2ea78L, 0xa5fc3c53L, 0x1e0a2df4L,
287 		0xf2f74ea7L, 0x361d2b3dL,
288 		0x1939260fL, 0x19c27960L, 0x5223a708L, 0xf71312b6L,
289 		0xebadfe6eL, 0xeac31f66L,
290 		0xe3bc4595L, 0xa67bc883L, 0xb17f37d1L, 0x018cff28L,
291 		0xc332ddefL, 0xbe6c5aa5L,
292 		0x65582185L, 0x68ab9802L, 0xeecea50fL, 0xdb2f953bL,
293 		0x2aef7dadL, 0x5b6e2f84L,
294 		0x1521b628L, 0x29076170L, 0xecdd4775L, 0x619f1510L,
295 		0x13cca830L, 0xeb61bd96L,
296 		0x0334fe1eL, 0xaa0363cfL, 0xb5735c90L, 0x4c70a239L,
297 		0xd59e9e0bL, 0xcbaade14L,
298 		0xeecc86bcL, 0x60622ca7L, 0x9cab5cabL, 0xb2f3846eL,
299 		0x648b1eafL, 0x19bdf0caL,
300 		0xa02369b9L, 0x655abb50L, 0x40685a32L, 0x3c2ab4b3L,
301 		0x319ee9d5L, 0xc021b8f7L,
302 		0x9b540b19L, 0x875fa099L, 0x95f7997eL, 0x623d7da8L,
303 		0xf837889aL, 0x97e32d77L,
304 		0x11ed935fL, 0x16681281L, 0x0e358829L, 0xc7e61fd6L,
305 		0x96dedfa1L, 0x7858ba99L,
306 		0x57f584a5L, 0x1b227263L, 0x9b83c3ffL, 0x1ac24696L,
307 		0xcdb30aebL, 0x532e3054L,
308 		0x8fd948e4L, 0x6dbc3128L, 0x58ebf2efL, 0x34c6ffeaL,
309 		0xfe28ed61L, 0xee7c3c73L,
310 		0x5d4a14d9L, 0xe864b7e3L, 0x42105d14L, 0x203e13e0L,
311 		0x45eee2b6L, 0xa3aaabeaL,
312 		0xdb6c4f15L, 0xfacb4fd0L, 0xc742f442L, 0xef6abbb5L,
313 		0x654f3b1dL, 0x41cd2105L,
314 		0xd81e799eL, 0x86854dc7L, 0xe44b476aL, 0x3d816250L,
315 		0xcf62a1f2L, 0x5b8d2646L,
316 		0xfc8883a0L, 0xc1c7b6a3L, 0x7f1524c3L, 0x69cb7492L,
317 		0x47848a0bL, 0x5692b285L,
318 		0x095bbf00L, 0xad19489dL, 0x1462b174L, 0x23820e00L,
319 		0x58428d2aL, 0x0c55f5eaL,
320 		0x1dadf43eL, 0x233f7061L, 0x3372f092L, 0x8d937e41L,
321 		0xd65fecf1L, 0x6c223bdbL,
322 		0x7cde3759L, 0xcbee7460L, 0x4085f2a7L, 0xce77326eL,
323 		0xa6078084L, 0x19f8509eL,
324 		0xe8efd855L, 0x61d99735L, 0xa969a7aaL, 0xc50c06c2L,
325 		0x5a04abfcL, 0x800bcadcL,
326 		0x9e447a2eL, 0xc3453484L, 0xfdd56705L, 0x0e1e9ec9L,
327 		0xdb73dbd3L, 0x105588cdL,
328 		0x675fda79L, 0xe3674340L, 0xc5c43465L, 0x713e38d8L,
329 		0x3d28f89eL, 0xf16dff20L,
330 		0x153e21e7L, 0x8fb03d4aL, 0xe6e39f2bL, 0xdb83adf7L
331 	};
332 
333 	word32 ks2[] = {
334 		0xe93d5a68L, 0x948140f7L, 0xf64c261cL, 0x94692934L,
335 		0x411520f7L, 0x7602d4f7L,
336 		0xbcf46b2eL, 0xd4a20068L, 0xd4082471L, 0x3320f46aL,
337 		0x43b7d4b7L, 0x500061afL,
338 		0x1e39f62eL, 0x97244546L, 0x14214f74L, 0xbf8b8840L,
339 		0x4d95fc1dL, 0x96b591afL,
340 		0x70f4ddd3L, 0x66a02f45L, 0xbfbc09ecL, 0x03bd9785L,
341 		0x7fac6dd0L, 0x31cb8504L,
342 		0x96eb27b3L, 0x55fd3941L, 0xda2547e6L, 0xabca0a9aL,
343 		0x28507825L, 0x530429f4L,
344 		0x0a2c86daL, 0xe9b66dfbL, 0x68dc1462L, 0xd7486900L,
345 		0x680ec0a4L, 0x27a18deeL,
346 		0x4f3ffea2L, 0xe887ad8cL, 0xb58ce006L, 0x7af4d6b6L,
347 		0xaace1e7cL, 0xd3375fecL,
348 		0xce78a399L, 0x406b2a42L, 0x20fe9e35L, 0xd9f385b9L,
349 		0xee39d7abL, 0x3b124e8bL,
350 		0x1dc9faf7L, 0x4b6d1856L, 0x26a36631L, 0xeae397b2L,
351 		0x3a6efa74L, 0xdd5b4332L,
352 		0x6841e7f7L, 0xca7820fbL, 0xfb0af54eL, 0xd8feb397L,
353 		0x454056acL, 0xba489527L,
354 		0x55533a3aL, 0x20838d87L, 0xfe6ba9b7L, 0xd096954bL,
355 		0x55a867bcL, 0xa1159a58L,
356 		0xcca92963L, 0x99e1db33L, 0xa62a4a56L, 0x3f3125f9L,
357 		0x5ef47e1cL, 0x9029317cL,
358 		0xfdf8e802L, 0x04272f70L, 0x80bb155cL, 0x05282ce3L,
359 		0x95c11548L, 0xe4c66d22L,
360 		0x48c1133fL, 0xc70f86dcL, 0x07f9c9eeL, 0x41041f0fL,
361 		0x404779a4L, 0x5d886e17L,
362 		0x325f51ebL, 0xd59bc0d1L, 0xf2bcc18fL, 0x41113564L,
363 		0x257b7834L, 0x602a9c60L,
364 		0xdff8e8a3L, 0x1f636c1bL, 0x0e12b4c2L, 0x02e1329eL,
365 		0xaf664fd1L, 0xcad18115L,
366 		0x6b2395e0L, 0x333e92e1L, 0x3b240b62L, 0xeebeb922L,
367 		0x85b2a20eL, 0xe6ba0d99L,
368 		0xde720c8cL, 0x2da2f728L, 0xd0127845L, 0x95b794fdL,
369 		0x647d0862L, 0xe7ccf5f0L,
370 		0x5449a36fL, 0x877d48faL, 0xc39dfd27L, 0xf33e8d1eL,
371 		0x0a476341L, 0x992eff74L,
372 		0x3a6f6eabL, 0xf4f8fd37L, 0xa812dc60L, 0xa1ebddf8L,
373 		0x991be14cL, 0xdb6e6b0dL,
374 		0xc67b5510L, 0x6d672c37L, 0x2765d43bL, 0xdcd0e804L,
375 		0xf1290dc7L, 0xcc00ffa3L,
376 		0xb5390f92L, 0x690fed0bL, 0x667b9ffbL, 0xcedb7d9cL,
377 		0xa091cf0bL, 0xd9155ea3L,
378 		0xbb132f88L, 0x515bad24L, 0x7b9479bfL, 0x763bd6ebL,
379 		0x37392eb3L, 0xcc115979L,
380 		0x8026e297L, 0xf42e312dL, 0x6842ada7L, 0xc66a2b3bL,
381 		0x12754cccL, 0x782ef11cL,
382 		0x6a124237L, 0xb79251e7L, 0x06a1bbe6L, 0x4bfb6350L,
383 		0x1a6b1018L, 0x11caedfaL,
384 		0x3d25bdd8L, 0xe2e1c3c9L, 0x44421659L, 0x0a121386L,
385 		0xd90cec6eL, 0xd5abea2aL,
386 		0x64af674eL, 0xda86a85fL, 0xbebfe988L, 0x64e4c3feL,
387 		0x9dbc8057L, 0xf0f7c086L,
388 		0x60787bf8L, 0x6003604dL, 0xd1fd8346L, 0xf6381fb0L,
389 		0x7745ae04L, 0xd736fcccL,
390 		0x83426b33L, 0xf01eab71L, 0xb0804187L, 0x3c005e5fL,
391 		0x77a057beL, 0xbde8ae24L,
392 		0x55464299L, 0xbf582e61L, 0x4e58f48fL, 0xf2ddfda2L,
393 		0xf474ef38L, 0x8789bdc2L,
394 		0x5366f9c3L, 0xc8b38e74L, 0xb475f255L, 0x46fcd9b9L,
395 		0x7aeb2661L, 0x8b1ddf84L,
396 		0x846a0e79L, 0x915f95e2L, 0x466e598eL, 0x20b45770L,
397 		0x8cd55591L, 0xc902de4cL,
398 		0xb90bace1L, 0xbb8205d0L, 0x11a86248L, 0x7574a99eL,
399 		0xb77f19b6L, 0xe0a9dc09L,
400 		0x662d09a1L, 0xc4324633L, 0xe85a1f02L, 0x09f0be8cL,
401 		0x4a99a025L, 0x1d6efe10L,
402 		0x1ab93d1dL, 0x0ba5a4dfL, 0xa186f20fL, 0x2868f169L,
403 		0xdcb7da83L, 0x573906feL,
404 		0xa1e2ce9bL, 0x4fcd7f52L, 0x50115e01L, 0xa70683faL,
405 		0xa002b5c4L, 0x0de6d027L,
406 		0x9af88c27L, 0x773f8641L, 0xc3604c06L, 0x61a806b5L,
407 		0xf0177a28L, 0xc0f586e0L,
408 		0x006058aaL, 0x30dc7d62L, 0x11e69ed7L, 0x2338ea63L,
409 		0x53c2dd94L, 0xc2c21634L,
410 		0xbbcbee56L, 0x90bcb6deL, 0xebfc7da1L, 0xce591d76L,
411 		0x6f05e409L, 0x4b7c0188L,
412 		0x39720a3dL, 0x7c927c24L, 0x86e3725fL, 0x724d9db9L,
413 		0x1ac15bb4L, 0xd39eb8fcL,
414 		0xed545578L, 0x08fca5b5L, 0xd83d7cd3L, 0x4dad0fc4L,
415 		0x1e50ef5eL, 0xb161e6f8L,
416 		0xa28514d9L, 0x6c51133cL, 0x6fd5c7e7L, 0x56e14ec4L,
417 		0x362abfceL, 0xddc6c837L,
418 		0xd79a3234L, 0x92638212L, 0x670efa8eL, 0x406000e0L
419 	};
420 
421 	word32 ks3[] = {
422 		0x3a39ce37L, 0xd3faf5cfL, 0xabc27737L, 0x5ac52d1bL,
423 		0x5cb0679eL, 0x4fa33742L,
424 		0xd3822740L, 0x99bc9bbeL, 0xd5118e9dL, 0xbf0f7315L,
425 		0xd62d1c7eL, 0xc700c47bL,
426 		0xb78c1b6bL, 0x21a19045L, 0xb26eb1beL, 0x6a366eb4L,
427 		0x5748ab2fL, 0xbc946e79L,
428 		0xc6a376d2L, 0x6549c2c8L, 0x530ff8eeL, 0x468dde7dL,
429 		0xd5730a1dL, 0x4cd04dc6L,
430 		0x2939bbdbL, 0xa9ba4650L, 0xac9526e8L, 0xbe5ee304L,
431 		0xa1fad5f0L, 0x6a2d519aL,
432 		0x63ef8ce2L, 0x9a86ee22L, 0xc089c2b8L, 0x43242ef6L,
433 		0xa51e03aaL, 0x9cf2d0a4L,
434 		0x83c061baL, 0x9be96a4dL, 0x8fe51550L, 0xba645bd6L,
435 		0x2826a2f9L, 0xa73a3ae1L,
436 		0x4ba99586L, 0xef5562e9L, 0xc72fefd3L, 0xf752f7daL,
437 		0x3f046f69L, 0x77fa0a59L,
438 		0x80e4a915L, 0x87b08601L, 0x9b09e6adL, 0x3b3ee593L,
439 		0xe990fd5aL, 0x9e34d797L,
440 		0x2cf0b7d9L, 0x022b8b51L, 0x96d5ac3aL, 0x017da67dL,
441 		0xd1cf3ed6L, 0x7c7d2d28L,
442 		0x1f9f25cfL, 0xadf2b89bL, 0x5ad6b472L, 0x5a88f54cL,
443 		0xe029ac71L, 0xe019a5e6L,
444 		0x47b0acfdL, 0xed93fa9bL, 0xe8d3c48dL, 0x283b57ccL,
445 		0xf8d56629L, 0x79132e28L,
446 		0x785f0191L, 0xed756055L, 0xf7960e44L, 0xe3d35e8cL,
447 		0x15056dd4L, 0x88f46dbaL,
448 		0x03a16125L, 0x0564f0bdL, 0xc3eb9e15L, 0x3c9057a2L,
449 		0x97271aecL, 0xa93a072aL,
450 		0x1b3f6d9bL, 0x1e6321f5L, 0xf59c66fbL, 0x26dcf319L,
451 		0x7533d928L, 0xb155fdf5L,
452 		0x03563482L, 0x8aba3cbbL, 0x28517711L, 0xc20ad9f8L,
453 		0xabcc5167L, 0xccad925fL,
454 		0x4de81751L, 0x3830dc8eL, 0x379d5862L, 0x9320f991L,
455 		0xea7a90c2L, 0xfb3e7bceL,
456 		0x5121ce64L, 0x774fbe32L, 0xa8b6e37eL, 0xc3293d46L,
457 		0x48de5369L, 0x6413e680L,
458 		0xa2ae0810L, 0xdd6db224L, 0x69852dfdL, 0x09072166L,
459 		0xb39a460aL, 0x6445c0ddL,
460 		0x586cdecfL, 0x1c20c8aeL, 0x5bbef7ddL, 0x1b588d40L,
461 		0xccd2017fL, 0x6bb4e3bbL,
462 		0xdda26a7eL, 0x3a59ff45L, 0x3e350a44L, 0xbcb4cdd5L,
463 		0x72eacea8L, 0xfa6484bbL,
464 		0x8d6612aeL, 0xbf3c6f47L, 0xd29be463L, 0x542f5d9eL,
465 		0xaec2771bL, 0xf64e6370L,
466 		0x740e0d8dL, 0xe75b1357L, 0xf8721671L, 0xaf537d5dL,
467 		0x4040cb08L, 0x4eb4e2ccL,
468 		0x34d2466aL, 0x0115af84L, 0xe1b00428L, 0x95983a1dL,
469 		0x06b89fb4L, 0xce6ea048L,
470 		0x6f3f3b82L, 0x3520ab82L, 0x011a1d4bL, 0x277227f8L,
471 		0x611560b1L, 0xe7933fdcL,
472 		0xbb3a792bL, 0x344525bdL, 0xa08839e1L, 0x51ce794bL,
473 		0x2f32c9b7L, 0xa01fbac9L,
474 		0xe01cc87eL, 0xbcc7d1f6L, 0xcf0111c3L, 0xa1e8aac7L,
475 		0x1a908749L, 0xd44fbd9aL,
476 		0xd0dadecbL, 0xd50ada38L, 0x0339c32aL, 0xc6913667L,
477 		0x8df9317cL, 0xe0b12b4fL,
478 		0xf79e59b7L, 0x43f5bb3aL, 0xf2d519ffL, 0x27d9459cL,
479 		0xbf97222cL, 0x15e6fc2aL,
480 		0x0f91fc71L, 0x9b941525L, 0xfae59361L, 0xceb69cebL,
481 		0xc2a86459L, 0x12baa8d1L,
482 		0xb6c1075eL, 0xe3056a0cL, 0x10d25065L, 0xcb03a442L,
483 		0xe0ec6e0eL, 0x1698db3bL,
484 		0x4c98a0beL, 0x3278e964L, 0x9f1f9532L, 0xe0d392dfL,
485 		0xd3a0342bL, 0x8971f21eL,
486 		0x1b0a7441L, 0x4ba3348cL, 0xc5be7120L, 0xc37632d8L,
487 		0xdf359f8dL, 0x9b992f2eL,
488 		0xe60b6f47L, 0x0fe3f11dL, 0xe54cda54L, 0x1edad891L,
489 		0xce6279cfL, 0xcd3e7e6fL,
490 		0x1618b166L, 0xfd2c1d05L, 0x848fd2c5L, 0xf6fb2299L,
491 		0xf523f357L, 0xa6327623L,
492 		0x93a83531L, 0x56cccd02L, 0xacf08162L, 0x5a75ebb5L,
493 		0x6e163697L, 0x88d273ccL,
494 		0xde966292L, 0x81b949d0L, 0x4c50901bL, 0x71c65614L,
495 		0xe6c6c7bdL, 0x327a140aL,
496 		0x45e1d006L, 0xc3f27b9aL, 0xc9aa53fdL, 0x62a80f00L,
497 		0xbb25bfe2L, 0x35bdd2f6L,
498 		0x71126905L, 0xb2040222L, 0xb6cbcf7cL, 0xcd769c2bL,
499 		0x53113ec0L, 0x1640e3d3L,
500 		0x38abbd60L, 0x2547adf0L, 0xba38209cL, 0xf746ce76L,
501 		0x77afa1c5L, 0x20756060L,
502 		0x85cbfe4eL, 0x8ae88dd8L, 0x7aaaf9b0L, 0x4cf9aa7eL,
503 		0x1948c25cL, 0x02fb8a8cL,
504 		0x01c36ae4L, 0xd6ebe1f9L, 0x90d4f869L, 0xa65cdea0L,
505 		0x3f09252dL, 0xc208e69fL,
506 		0xb74e6132L, 0xce77e25bL, 0x578fdfe3L, 0x3ac372e6L
507 	};
508 
509 
510 	word32 pi[] = {
511 		0x243f6a88L, 0x85a308d3L, 0x13198a2eL, 0x03707344L,
512 		0xa4093822L, 0x299f31d0L,
513 		0x082efa98L, 0xec4e6c89L, 0x452821e6L, 0x38d01377L,
514 		0xbe5466cfL, 0x34e90c6cL,
515 		0xc0ac29b7L, 0xc97c50ddL, 0x3f84d5b5L, 0xb5470917L,
516 		0x9216d5d9L, 0x8979fb1bL
517 	};
518 
519 
520 /* Initialize s-boxes without file read. */
521 	for (i = 0; i < 256; i++) {
522 		c->S[0][i] = ks0[i];
523 		c->S[1][i] = ks1[i];
524 		c->S[2][i] = ks2[i];
525 		c->S[3][i] = ks3[i];
526 	}
527 
528 /* P-boxes */
529 	for (i = 0; i < 18; i++) {
530 		c->P[i] = pi[i];
531 	}
532 
533 	j = 0;
534 	for (i = 0; i < BF_N + 2; ++i) {
535 		data = 0x00000000;
536 		data = (data << 8) | key[(j) % keybytes];
537 		data = (data << 8) | key[(j + 1) % keybytes];
538 		data = (data << 8) | key[(j + 2) % keybytes];
539 		data = (data << 8) | key[(j + 3) % keybytes];
540 
541 		c->P[i] ^= data;
542 		j = (j + 4) % keybytes;
543 	}
544 
545 	datarl[0] = 0x000000000;
546 	datarl[1] = 0x000000000;
547 
548 	for (i = 0; i < BF_N + 2; i += 2) {
549 		enblf_noswap(c, datarl);
550 		c->P[i] = datarl[0];
551 		c->P[i + 1] = datarl[1];
552 	}
553 
554 
555 	for (i = 0; i < 4; ++i) {
556 		for (j = 0; j < 256; j += 2) {
557 
558 			enblf_noswap(c, datarl);
559 			c->S[i][j] = datarl[0];
560 			c->S[i][j + 1] = datarl[1];
561 		}
562 	}
563 
564 	return 0;
565 }
566 
_mcrypt_set_key(blf_ctx * c,char * k,int len)567 WIN32DLL_DEFINE int _mcrypt_set_key(blf_ctx * c, char *k, int len)
568 {
569 	initialize_blowfish(c, k, len);
570 	return 0;
571 }
572 
_mcrypt_get_size()573 WIN32DLL_DEFINE int _mcrypt_get_size()
574 {
575 	return sizeof(blf_ctx);
576 }
_mcrypt_get_block_size()577 WIN32DLL_DEFINE int _mcrypt_get_block_size()
578 {
579 	return 8;
580 }
_is_block_algorithm()581 WIN32DLL_DEFINE int _is_block_algorithm()
582 {
583 	return 1;
584 }
_mcrypt_get_key_size()585 WIN32DLL_DEFINE int _mcrypt_get_key_size()
586 {
587 	return 56;
588 }
_mcrypt_get_supported_key_sizes(int * len)589 WIN32DLL_DEFINE const int *_mcrypt_get_supported_key_sizes(int *len)
590 {
591 	*len = 0;
592 	return NULL;
593 }
_mcrypt_get_algorithms_name()594 WIN32DLL_DEFINE const char *_mcrypt_get_algorithms_name()
595 {
596 return "Blowfish";
597 }
598 
599 #define CIPHER "de8e9a3a9cd44280"
600 
_mcrypt_self_test()601 WIN32DLL_DEFINE int _mcrypt_self_test()
602 {
603 	char *keyword;
604 	unsigned char plaintext[16];
605 	unsigned char ciphertext[16];
606 	int blocksize = _mcrypt_get_block_size(), j;
607 	void *key;
608 	unsigned char cipher_tmp[200];
609 
610 	keyword = calloc(1, _mcrypt_get_key_size());
611 	if (keyword == NULL)
612 		return -1;
613 
614 	for (j = 0; j < _mcrypt_get_key_size(); j++) {
615 		keyword[j] = ((j * 2 + 10) % 256);
616 	}
617 
618 	for (j = 0; j < blocksize; j++) {
619 		plaintext[j] = j % 256;
620 	}
621 	key = malloc(_mcrypt_get_size());
622 	if (key == NULL)
623 		return -1;
624 
625 	memcpy(ciphertext, plaintext, blocksize);
626 
627 	_mcrypt_set_key(key, (void *) keyword, _mcrypt_get_key_size());
628 	free(keyword);
629 	_mcrypt_encrypt(key, (void *) ciphertext);
630 
631 	for (j = 0; j < blocksize; j++) {
632 		sprintf(&((char *) cipher_tmp)[2 * j], "%.2x",
633 			ciphertext[j]);
634 	}
635 
636 	if (strcmp((char *) cipher_tmp, CIPHER) != 0) {
637 		printf("failed compatibility\n");
638 		printf("Expected: %s\nGot: %s\n", CIPHER,
639 		       (char *) cipher_tmp);
640 		free(key);
641 		return -1;
642 	}
643 	_mcrypt_decrypt(key, (void *) ciphertext);
644 	free(key);
645 
646 	if (strcmp(ciphertext, plaintext) != 0) {
647 		printf("failed internally\n");
648 		return -1;
649 	}
650 
651 	return 0;
652 }
653 
_mcrypt_algorithm_version()654 WIN32DLL_DEFINE word32 _mcrypt_algorithm_version()
655 {
656 	return 20010801;
657 }
658 
659 #ifdef WIN32
660 # ifdef USE_LTDL
main(void)661 WIN32DLL_DEFINE int main (void)
662 {
663        /* empty main function to avoid linker error (see cygwin FAQ) */
664 }
665 # endif
666 #endif
667