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