2 * Blowfish block cipher
3 * Copyright 1997 Niels Provos <provos@physnet.uni-hamburg.de>
6 * Implementation advice by David Mazieres <dm@lcs.mit.edu>.
8 * Redistribution and use in source and binary forms, with or without
9 * modification, are permitted provided that the following conditions
11 * 1. Redistributions of source code must retain the above copyright
12 * notice, this list of conditions and the following disclaimer.
13 * 2. Redistributions in binary form must reproduce the above copyright
14 * notice, this list of conditions and the following disclaimer in the
15 * documentation and/or other materials provided with the distribution.
16 * 3. All advertising materials mentioning features or use of this software
17 * must display the following acknowledgement:
18 * This product includes software developed by Niels Provos.
19 * 4. The name of the author may not be used to endorse or promote products
20 * derived from this software without specific prior written permission.
22 * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
23 * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
24 * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
25 * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
26 * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
27 * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
28 * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
29 * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
30 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
31 * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
33 * $FreeBSD: src/secure/lib/libcrypt/blowfish.c,v 1.1.2.1 2001/05/24 12:20:03 markm Exp $
37 * This code is derived from section 14.3 and the given source
38 * in section V of Applied Cryptography, second edition.
39 * Blowfish is an unpatented fast block cipher designed by
44 * FreeBSD implementation by Paul Herman <pherman@frenchfries.net>
48 #include <stdio.h> /* used for debugging */
52 #include <sys/types.h>
57 #define inline __inline
60 #endif /* !__GNUC__ */
62 /* Function for Feistel Networks */
64 #define F(s, x) ((((s)[ (((x)>>24)&0xFF)] \
65 + (s)[0x100 + (((x)>>16)&0xFF)]) \
66 ^ (s)[0x200 + (((x)>> 8)&0xFF)]) \
67 + (s)[0x300 + ( (x) &0xFF)])
69 #define BLFRND(s,p,i,j,n) (i ^= F(s,j) ^ (p)[n])
72 Blowfish_encipher(c, xl, xr)
79 u_int32_t *s = c->S[0];
86 BLFRND(s, p, Xr, Xl, 1); BLFRND(s, p, Xl, Xr, 2);
87 BLFRND(s, p, Xr, Xl, 3); BLFRND(s, p, Xl, Xr, 4);
88 BLFRND(s, p, Xr, Xl, 5); BLFRND(s, p, Xl, Xr, 6);
89 BLFRND(s, p, Xr, Xl, 7); BLFRND(s, p, Xl, Xr, 8);
90 BLFRND(s, p, Xr, Xl, 9); BLFRND(s, p, Xl, Xr, 10);
91 BLFRND(s, p, Xr, Xl, 11); BLFRND(s, p, Xl, Xr, 12);
92 BLFRND(s, p, Xr, Xl, 13); BLFRND(s, p, Xl, Xr, 14);
93 BLFRND(s, p, Xr, Xl, 15); BLFRND(s, p, Xl, Xr, 16);
100 Blowfish_decipher(c, xl, xr)
107 u_int32_t *s = c->S[0];
114 BLFRND(s, p, Xr, Xl, 16); BLFRND(s, p, Xl, Xr, 15);
115 BLFRND(s, p, Xr, Xl, 14); BLFRND(s, p, Xl, Xr, 13);
116 BLFRND(s, p, Xr, Xl, 12); BLFRND(s, p, Xl, Xr, 11);
117 BLFRND(s, p, Xr, Xl, 10); BLFRND(s, p, Xl, Xr, 9);
118 BLFRND(s, p, Xr, Xl, 8); BLFRND(s, p, Xl, Xr, 7);
119 BLFRND(s, p, Xr, Xl, 6); BLFRND(s, p, Xl, Xr, 5);
120 BLFRND(s, p, Xr, Xl, 4); BLFRND(s, p, Xl, Xr, 3);
121 BLFRND(s, p, Xr, Xl, 2); BLFRND(s, p, Xl, Xr, 1);
128 Blowfish_initstate(c)
132 /* P-box and S-box tables initialized with digits of Pi */
134 const blf_ctx initstate =
138 0xd1310ba6, 0x98dfb5ac, 0x2ffd72db, 0xd01adfb7,
139 0xb8e1afed, 0x6a267e96, 0xba7c9045, 0xf12c7f99,
140 0x24a19947, 0xb3916cf7, 0x0801f2e2, 0x858efc16,
141 0x636920d8, 0x71574e69, 0xa458fea3, 0xf4933d7e,
142 0x0d95748f, 0x728eb658, 0x718bcd58, 0x82154aee,
143 0x7b54a41d, 0xc25a59b5, 0x9c30d539, 0x2af26013,
144 0xc5d1b023, 0x286085f0, 0xca417918, 0xb8db38ef,
145 0x8e79dcb0, 0x603a180e, 0x6c9e0e8b, 0xb01e8a3e,
146 0xd71577c1, 0xbd314b27, 0x78af2fda, 0x55605c60,
147 0xe65525f3, 0xaa55ab94, 0x57489862, 0x63e81440,
148 0x55ca396a, 0x2aab10b6, 0xb4cc5c34, 0x1141e8ce,
149 0xa15486af, 0x7c72e993, 0xb3ee1411, 0x636fbc2a,
150 0x2ba9c55d, 0x741831f6, 0xce5c3e16, 0x9b87931e,
151 0xafd6ba33, 0x6c24cf5c, 0x7a325381, 0x28958677,
152 0x3b8f4898, 0x6b4bb9af, 0xc4bfe81b, 0x66282193,
153 0x61d809cc, 0xfb21a991, 0x487cac60, 0x5dec8032,
154 0xef845d5d, 0xe98575b1, 0xdc262302, 0xeb651b88,
155 0x23893e81, 0xd396acc5, 0x0f6d6ff3, 0x83f44239,
156 0x2e0b4482, 0xa4842004, 0x69c8f04a, 0x9e1f9b5e,
157 0x21c66842, 0xf6e96c9a, 0x670c9c61, 0xabd388f0,
158 0x6a51a0d2, 0xd8542f68, 0x960fa728, 0xab5133a3,
159 0x6eef0b6c, 0x137a3be4, 0xba3bf050, 0x7efb2a98,
160 0xa1f1651d, 0x39af0176, 0x66ca593e, 0x82430e88,
161 0x8cee8619, 0x456f9fb4, 0x7d84a5c3, 0x3b8b5ebe,
162 0xe06f75d8, 0x85c12073, 0x401a449f, 0x56c16aa6,
163 0x4ed3aa62, 0x363f7706, 0x1bfedf72, 0x429b023d,
164 0x37d0d724, 0xd00a1248, 0xdb0fead3, 0x49f1c09b,
165 0x075372c9, 0x80991b7b, 0x25d479d8, 0xf6e8def7,
166 0xe3fe501a, 0xb6794c3b, 0x976ce0bd, 0x04c006ba,
167 0xc1a94fb6, 0x409f60c4, 0x5e5c9ec2, 0x196a2463,
168 0x68fb6faf, 0x3e6c53b5, 0x1339b2eb, 0x3b52ec6f,
169 0x6dfc511f, 0x9b30952c, 0xcc814544, 0xaf5ebd09,
170 0xbee3d004, 0xde334afd, 0x660f2807, 0x192e4bb3,
171 0xc0cba857, 0x45c8740f, 0xd20b5f39, 0xb9d3fbdb,
172 0x5579c0bd, 0x1a60320a, 0xd6a100c6, 0x402c7279,
173 0x679f25fe, 0xfb1fa3cc, 0x8ea5e9f8, 0xdb3222f8,
174 0x3c7516df, 0xfd616b15, 0x2f501ec8, 0xad0552ab,
175 0x323db5fa, 0xfd238760, 0x53317b48, 0x3e00df82,
176 0x9e5c57bb, 0xca6f8ca0, 0x1a87562e, 0xdf1769db,
177 0xd542a8f6, 0x287effc3, 0xac6732c6, 0x8c4f5573,
178 0x695b27b0, 0xbbca58c8, 0xe1ffa35d, 0xb8f011a0,
179 0x10fa3d98, 0xfd2183b8, 0x4afcb56c, 0x2dd1d35b,
180 0x9a53e479, 0xb6f84565, 0xd28e49bc, 0x4bfb9790,
181 0xe1ddf2da, 0xa4cb7e33, 0x62fb1341, 0xcee4c6e8,
182 0xef20cada, 0x36774c01, 0xd07e9efe, 0x2bf11fb4,
183 0x95dbda4d, 0xae909198, 0xeaad8e71, 0x6b93d5a0,
184 0xd08ed1d0, 0xafc725e0, 0x8e3c5b2f, 0x8e7594b7,
185 0x8ff6e2fb, 0xf2122b64, 0x8888b812, 0x900df01c,
186 0x4fad5ea0, 0x688fc31c, 0xd1cff191, 0xb3a8c1ad,
187 0x2f2f2218, 0xbe0e1777, 0xea752dfe, 0x8b021fa1,
188 0xe5a0cc0f, 0xb56f74e8, 0x18acf3d6, 0xce89e299,
189 0xb4a84fe0, 0xfd13e0b7, 0x7cc43b81, 0xd2ada8d9,
190 0x165fa266, 0x80957705, 0x93cc7314, 0x211a1477,
191 0xe6ad2065, 0x77b5fa86, 0xc75442f5, 0xfb9d35cf,
192 0xebcdaf0c, 0x7b3e89a0, 0xd6411bd3, 0xae1e7e49,
193 0x00250e2d, 0x2071b35e, 0x226800bb, 0x57b8e0af,
194 0x2464369b, 0xf009b91e, 0x5563911d, 0x59dfa6aa,
195 0x78c14389, 0xd95a537f, 0x207d5ba2, 0x02e5b9c5,
196 0x83260376, 0x6295cfa9, 0x11c81968, 0x4e734a41,
197 0xb3472dca, 0x7b14a94a, 0x1b510052, 0x9a532915,
198 0xd60f573f, 0xbc9bc6e4, 0x2b60a476, 0x81e67400,
199 0x08ba6fb5, 0x571be91f, 0xf296ec6b, 0x2a0dd915,
200 0xb6636521, 0xe7b9f9b6, 0xff34052e, 0xc5855664,
201 0x53b02d5d, 0xa99f8fa1, 0x08ba4799, 0x6e85076a},
203 0x4b7a70e9, 0xb5b32944, 0xdb75092e, 0xc4192623,
204 0xad6ea6b0, 0x49a7df7d, 0x9cee60b8, 0x8fedb266,
205 0xecaa8c71, 0x699a17ff, 0x5664526c, 0xc2b19ee1,
206 0x193602a5, 0x75094c29, 0xa0591340, 0xe4183a3e,
207 0x3f54989a, 0x5b429d65, 0x6b8fe4d6, 0x99f73fd6,
208 0xa1d29c07, 0xefe830f5, 0x4d2d38e6, 0xf0255dc1,
209 0x4cdd2086, 0x8470eb26, 0x6382e9c6, 0x021ecc5e,
210 0x09686b3f, 0x3ebaefc9, 0x3c971814, 0x6b6a70a1,
211 0x687f3584, 0x52a0e286, 0xb79c5305, 0xaa500737,
212 0x3e07841c, 0x7fdeae5c, 0x8e7d44ec, 0x5716f2b8,
213 0xb03ada37, 0xf0500c0d, 0xf01c1f04, 0x0200b3ff,
214 0xae0cf51a, 0x3cb574b2, 0x25837a58, 0xdc0921bd,
215 0xd19113f9, 0x7ca92ff6, 0x94324773, 0x22f54701,
216 0x3ae5e581, 0x37c2dadc, 0xc8b57634, 0x9af3dda7,
217 0xa9446146, 0x0fd0030e, 0xecc8c73e, 0xa4751e41,
218 0xe238cd99, 0x3bea0e2f, 0x3280bba1, 0x183eb331,
219 0x4e548b38, 0x4f6db908, 0x6f420d03, 0xf60a04bf,
220 0x2cb81290, 0x24977c79, 0x5679b072, 0xbcaf89af,
221 0xde9a771f, 0xd9930810, 0xb38bae12, 0xdccf3f2e,
222 0x5512721f, 0x2e6b7124, 0x501adde6, 0x9f84cd87,
223 0x7a584718, 0x7408da17, 0xbc9f9abc, 0xe94b7d8c,
224 0xec7aec3a, 0xdb851dfa, 0x63094366, 0xc464c3d2,
225 0xef1c1847, 0x3215d908, 0xdd433b37, 0x24c2ba16,
226 0x12a14d43, 0x2a65c451, 0x50940002, 0x133ae4dd,
227 0x71dff89e, 0x10314e55, 0x81ac77d6, 0x5f11199b,
228 0x043556f1, 0xd7a3c76b, 0x3c11183b, 0x5924a509,
229 0xf28fe6ed, 0x97f1fbfa, 0x9ebabf2c, 0x1e153c6e,
230 0x86e34570, 0xeae96fb1, 0x860e5e0a, 0x5a3e2ab3,
231 0x771fe71c, 0x4e3d06fa, 0x2965dcb9, 0x99e71d0f,
232 0x803e89d6, 0x5266c825, 0x2e4cc978, 0x9c10b36a,
233 0xc6150eba, 0x94e2ea78, 0xa5fc3c53, 0x1e0a2df4,
234 0xf2f74ea7, 0x361d2b3d, 0x1939260f, 0x19c27960,
235 0x5223a708, 0xf71312b6, 0xebadfe6e, 0xeac31f66,
236 0xe3bc4595, 0xa67bc883, 0xb17f37d1, 0x018cff28,
237 0xc332ddef, 0xbe6c5aa5, 0x65582185, 0x68ab9802,
238 0xeecea50f, 0xdb2f953b, 0x2aef7dad, 0x5b6e2f84,
239 0x1521b628, 0x29076170, 0xecdd4775, 0x619f1510,
240 0x13cca830, 0xeb61bd96, 0x0334fe1e, 0xaa0363cf,
241 0xb5735c90, 0x4c70a239, 0xd59e9e0b, 0xcbaade14,
242 0xeecc86bc, 0x60622ca7, 0x9cab5cab, 0xb2f3846e,
243 0x648b1eaf, 0x19bdf0ca, 0xa02369b9, 0x655abb50,
244 0x40685a32, 0x3c2ab4b3, 0x319ee9d5, 0xc021b8f7,
245 0x9b540b19, 0x875fa099, 0x95f7997e, 0x623d7da8,
246 0xf837889a, 0x97e32d77, 0x11ed935f, 0x16681281,
247 0x0e358829, 0xc7e61fd6, 0x96dedfa1, 0x7858ba99,
248 0x57f584a5, 0x1b227263, 0x9b83c3ff, 0x1ac24696,
249 0xcdb30aeb, 0x532e3054, 0x8fd948e4, 0x6dbc3128,
250 0x58ebf2ef, 0x34c6ffea, 0xfe28ed61, 0xee7c3c73,
251 0x5d4a14d9, 0xe864b7e3, 0x42105d14, 0x203e13e0,
252 0x45eee2b6, 0xa3aaabea, 0xdb6c4f15, 0xfacb4fd0,
253 0xc742f442, 0xef6abbb5, 0x654f3b1d, 0x41cd2105,
254 0xd81e799e, 0x86854dc7, 0xe44b476a, 0x3d816250,
255 0xcf62a1f2, 0x5b8d2646, 0xfc8883a0, 0xc1c7b6a3,
256 0x7f1524c3, 0x69cb7492, 0x47848a0b, 0x5692b285,
257 0x095bbf00, 0xad19489d, 0x1462b174, 0x23820e00,
258 0x58428d2a, 0x0c55f5ea, 0x1dadf43e, 0x233f7061,
259 0x3372f092, 0x8d937e41, 0xd65fecf1, 0x6c223bdb,
260 0x7cde3759, 0xcbee7460, 0x4085f2a7, 0xce77326e,
261 0xa6078084, 0x19f8509e, 0xe8efd855, 0x61d99735,
262 0xa969a7aa, 0xc50c06c2, 0x5a04abfc, 0x800bcadc,
263 0x9e447a2e, 0xc3453484, 0xfdd56705, 0x0e1e9ec9,
264 0xdb73dbd3, 0x105588cd, 0x675fda79, 0xe3674340,
265 0xc5c43465, 0x713e38d8, 0x3d28f89e, 0xf16dff20,
266 0x153e21e7, 0x8fb03d4a, 0xe6e39f2b, 0xdb83adf7},
268 0xe93d5a68, 0x948140f7, 0xf64c261c, 0x94692934,
269 0x411520f7, 0x7602d4f7, 0xbcf46b2e, 0xd4a20068,
270 0xd4082471, 0x3320f46a, 0x43b7d4b7, 0x500061af,
271 0x1e39f62e, 0x97244546, 0x14214f74, 0xbf8b8840,
272 0x4d95fc1d, 0x96b591af, 0x70f4ddd3, 0x66a02f45,
273 0xbfbc09ec, 0x03bd9785, 0x7fac6dd0, 0x31cb8504,
274 0x96eb27b3, 0x55fd3941, 0xda2547e6, 0xabca0a9a,
275 0x28507825, 0x530429f4, 0x0a2c86da, 0xe9b66dfb,
276 0x68dc1462, 0xd7486900, 0x680ec0a4, 0x27a18dee,
277 0x4f3ffea2, 0xe887ad8c, 0xb58ce006, 0x7af4d6b6,
278 0xaace1e7c, 0xd3375fec, 0xce78a399, 0x406b2a42,
279 0x20fe9e35, 0xd9f385b9, 0xee39d7ab, 0x3b124e8b,
280 0x1dc9faf7, 0x4b6d1856, 0x26a36631, 0xeae397b2,
281 0x3a6efa74, 0xdd5b4332, 0x6841e7f7, 0xca7820fb,
282 0xfb0af54e, 0xd8feb397, 0x454056ac, 0xba489527,
283 0x55533a3a, 0x20838d87, 0xfe6ba9b7, 0xd096954b,
284 0x55a867bc, 0xa1159a58, 0xcca92963, 0x99e1db33,
285 0xa62a4a56, 0x3f3125f9, 0x5ef47e1c, 0x9029317c,
286 0xfdf8e802, 0x04272f70, 0x80bb155c, 0x05282ce3,
287 0x95c11548, 0xe4c66d22, 0x48c1133f, 0xc70f86dc,
288 0x07f9c9ee, 0x41041f0f, 0x404779a4, 0x5d886e17,
289 0x325f51eb, 0xd59bc0d1, 0xf2bcc18f, 0x41113564,
290 0x257b7834, 0x602a9c60, 0xdff8e8a3, 0x1f636c1b,
291 0x0e12b4c2, 0x02e1329e, 0xaf664fd1, 0xcad18115,
292 0x6b2395e0, 0x333e92e1, 0x3b240b62, 0xeebeb922,
293 0x85b2a20e, 0xe6ba0d99, 0xde720c8c, 0x2da2f728,
294 0xd0127845, 0x95b794fd, 0x647d0862, 0xe7ccf5f0,
295 0x5449a36f, 0x877d48fa, 0xc39dfd27, 0xf33e8d1e,
296 0x0a476341, 0x992eff74, 0x3a6f6eab, 0xf4f8fd37,
297 0xa812dc60, 0xa1ebddf8, 0x991be14c, 0xdb6e6b0d,
298 0xc67b5510, 0x6d672c37, 0x2765d43b, 0xdcd0e804,
299 0xf1290dc7, 0xcc00ffa3, 0xb5390f92, 0x690fed0b,
300 0x667b9ffb, 0xcedb7d9c, 0xa091cf0b, 0xd9155ea3,
301 0xbb132f88, 0x515bad24, 0x7b9479bf, 0x763bd6eb,
302 0x37392eb3, 0xcc115979, 0x8026e297, 0xf42e312d,
303 0x6842ada7, 0xc66a2b3b, 0x12754ccc, 0x782ef11c,
304 0x6a124237, 0xb79251e7, 0x06a1bbe6, 0x4bfb6350,
305 0x1a6b1018, 0x11caedfa, 0x3d25bdd8, 0xe2e1c3c9,
306 0x44421659, 0x0a121386, 0xd90cec6e, 0xd5abea2a,
307 0x64af674e, 0xda86a85f, 0xbebfe988, 0x64e4c3fe,
308 0x9dbc8057, 0xf0f7c086, 0x60787bf8, 0x6003604d,
309 0xd1fd8346, 0xf6381fb0, 0x7745ae04, 0xd736fccc,
310 0x83426b33, 0xf01eab71, 0xb0804187, 0x3c005e5f,
311 0x77a057be, 0xbde8ae24, 0x55464299, 0xbf582e61,
312 0x4e58f48f, 0xf2ddfda2, 0xf474ef38, 0x8789bdc2,
313 0x5366f9c3, 0xc8b38e74, 0xb475f255, 0x46fcd9b9,
314 0x7aeb2661, 0x8b1ddf84, 0x846a0e79, 0x915f95e2,
315 0x466e598e, 0x20b45770, 0x8cd55591, 0xc902de4c,
316 0xb90bace1, 0xbb8205d0, 0x11a86248, 0x7574a99e,
317 0xb77f19b6, 0xe0a9dc09, 0x662d09a1, 0xc4324633,
318 0xe85a1f02, 0x09f0be8c, 0x4a99a025, 0x1d6efe10,
319 0x1ab93d1d, 0x0ba5a4df, 0xa186f20f, 0x2868f169,
320 0xdcb7da83, 0x573906fe, 0xa1e2ce9b, 0x4fcd7f52,
321 0x50115e01, 0xa70683fa, 0xa002b5c4, 0x0de6d027,
322 0x9af88c27, 0x773f8641, 0xc3604c06, 0x61a806b5,
323 0xf0177a28, 0xc0f586e0, 0x006058aa, 0x30dc7d62,
324 0x11e69ed7, 0x2338ea63, 0x53c2dd94, 0xc2c21634,
325 0xbbcbee56, 0x90bcb6de, 0xebfc7da1, 0xce591d76,
326 0x6f05e409, 0x4b7c0188, 0x39720a3d, 0x7c927c24,
327 0x86e3725f, 0x724d9db9, 0x1ac15bb4, 0xd39eb8fc,
328 0xed545578, 0x08fca5b5, 0xd83d7cd3, 0x4dad0fc4,
329 0x1e50ef5e, 0xb161e6f8, 0xa28514d9, 0x6c51133c,
330 0x6fd5c7e7, 0x56e14ec4, 0x362abfce, 0xddc6c837,
331 0xd79a3234, 0x92638212, 0x670efa8e, 0x406000e0},
333 0x3a39ce37, 0xd3faf5cf, 0xabc27737, 0x5ac52d1b,
334 0x5cb0679e, 0x4fa33742, 0xd3822740, 0x99bc9bbe,
335 0xd5118e9d, 0xbf0f7315, 0xd62d1c7e, 0xc700c47b,
336 0xb78c1b6b, 0x21a19045, 0xb26eb1be, 0x6a366eb4,
337 0x5748ab2f, 0xbc946e79, 0xc6a376d2, 0x6549c2c8,
338 0x530ff8ee, 0x468dde7d, 0xd5730a1d, 0x4cd04dc6,
339 0x2939bbdb, 0xa9ba4650, 0xac9526e8, 0xbe5ee304,
340 0xa1fad5f0, 0x6a2d519a, 0x63ef8ce2, 0x9a86ee22,
341 0xc089c2b8, 0x43242ef6, 0xa51e03aa, 0x9cf2d0a4,
342 0x83c061ba, 0x9be96a4d, 0x8fe51550, 0xba645bd6,
343 0x2826a2f9, 0xa73a3ae1, 0x4ba99586, 0xef5562e9,
344 0xc72fefd3, 0xf752f7da, 0x3f046f69, 0x77fa0a59,
345 0x80e4a915, 0x87b08601, 0x9b09e6ad, 0x3b3ee593,
346 0xe990fd5a, 0x9e34d797, 0x2cf0b7d9, 0x022b8b51,
347 0x96d5ac3a, 0x017da67d, 0xd1cf3ed6, 0x7c7d2d28,
348 0x1f9f25cf, 0xadf2b89b, 0x5ad6b472, 0x5a88f54c,
349 0xe029ac71, 0xe019a5e6, 0x47b0acfd, 0xed93fa9b,
350 0xe8d3c48d, 0x283b57cc, 0xf8d56629, 0x79132e28,
351 0x785f0191, 0xed756055, 0xf7960e44, 0xe3d35e8c,
352 0x15056dd4, 0x88f46dba, 0x03a16125, 0x0564f0bd,
353 0xc3eb9e15, 0x3c9057a2, 0x97271aec, 0xa93a072a,
354 0x1b3f6d9b, 0x1e6321f5, 0xf59c66fb, 0x26dcf319,
355 0x7533d928, 0xb155fdf5, 0x03563482, 0x8aba3cbb,
356 0x28517711, 0xc20ad9f8, 0xabcc5167, 0xccad925f,
357 0x4de81751, 0x3830dc8e, 0x379d5862, 0x9320f991,
358 0xea7a90c2, 0xfb3e7bce, 0x5121ce64, 0x774fbe32,
359 0xa8b6e37e, 0xc3293d46, 0x48de5369, 0x6413e680,
360 0xa2ae0810, 0xdd6db224, 0x69852dfd, 0x09072166,
361 0xb39a460a, 0x6445c0dd, 0x586cdecf, 0x1c20c8ae,
362 0x5bbef7dd, 0x1b588d40, 0xccd2017f, 0x6bb4e3bb,
363 0xdda26a7e, 0x3a59ff45, 0x3e350a44, 0xbcb4cdd5,
364 0x72eacea8, 0xfa6484bb, 0x8d6612ae, 0xbf3c6f47,
365 0xd29be463, 0x542f5d9e, 0xaec2771b, 0xf64e6370,
366 0x740e0d8d, 0xe75b1357, 0xf8721671, 0xaf537d5d,
367 0x4040cb08, 0x4eb4e2cc, 0x34d2466a, 0x0115af84,
368 0xe1b00428, 0x95983a1d, 0x06b89fb4, 0xce6ea048,
369 0x6f3f3b82, 0x3520ab82, 0x011a1d4b, 0x277227f8,
370 0x611560b1, 0xe7933fdc, 0xbb3a792b, 0x344525bd,
371 0xa08839e1, 0x51ce794b, 0x2f32c9b7, 0xa01fbac9,
372 0xe01cc87e, 0xbcc7d1f6, 0xcf0111c3, 0xa1e8aac7,
373 0x1a908749, 0xd44fbd9a, 0xd0dadecb, 0xd50ada38,
374 0x0339c32a, 0xc6913667, 0x8df9317c, 0xe0b12b4f,
375 0xf79e59b7, 0x43f5bb3a, 0xf2d519ff, 0x27d9459c,
376 0xbf97222c, 0x15e6fc2a, 0x0f91fc71, 0x9b941525,
377 0xfae59361, 0xceb69ceb, 0xc2a86459, 0x12baa8d1,
378 0xb6c1075e, 0xe3056a0c, 0x10d25065, 0xcb03a442,
379 0xe0ec6e0e, 0x1698db3b, 0x4c98a0be, 0x3278e964,
380 0x9f1f9532, 0xe0d392df, 0xd3a0342b, 0x8971f21e,
381 0x1b0a7441, 0x4ba3348c, 0xc5be7120, 0xc37632d8,
382 0xdf359f8d, 0x9b992f2e, 0xe60b6f47, 0x0fe3f11d,
383 0xe54cda54, 0x1edad891, 0xce6279cf, 0xcd3e7e6f,
384 0x1618b166, 0xfd2c1d05, 0x848fd2c5, 0xf6fb2299,
385 0xf523f357, 0xa6327623, 0x93a83531, 0x56cccd02,
386 0xacf08162, 0x5a75ebb5, 0x6e163697, 0x88d273cc,
387 0xde966292, 0x81b949d0, 0x4c50901b, 0x71c65614,
388 0xe6c6c7bd, 0x327a140a, 0x45e1d006, 0xc3f27b9a,
389 0xc9aa53fd, 0x62a80f00, 0xbb25bfe2, 0x35bdd2f6,
390 0x71126905, 0xb2040222, 0xb6cbcf7c, 0xcd769c2b,
391 0x53113ec0, 0x1640e3d3, 0x38abbd60, 0x2547adf0,
392 0xba38209c, 0xf746ce76, 0x77afa1c5, 0x20756060,
393 0x85cbfe4e, 0x8ae88dd8, 0x7aaaf9b0, 0x4cf9aa7e,
394 0x1948c25c, 0x02fb8a8c, 0x01c36ae4, 0xd6ebe1f9,
395 0x90d4f869, 0xa65cdea0, 0x3f09252d, 0xc208e69f,
396 0xb74e6132, 0xce77e25b, 0x578fdfe3, 0x3ac372e6}
399 0x243f6a88, 0x85a308d3, 0x13198a2e, 0x03707344,
400 0xa4093822, 0x299f31d0, 0x082efa98, 0xec4e6c89,
401 0x452821e6, 0x38d01377, 0xbe5466cf, 0x34e90c6c,
402 0xc0ac29b7, 0xc97c50dd, 0x3f84d5b5, 0xb5470917,
403 0x9216d5d9, 0x8979fb1b
412 Blowfish_stream2word(const u_int8_t *data, u_int16_t databytes, u_int16_t *current)
415 Blowfish_stream2word(data, databytes, current)
416 const u_int8_t *data;
428 for (i = 0; i < 4; i++, j++) {
431 temp = (temp << 8) | data[j];
440 Blowfish_expand0state(blf_ctx *c, const u_int8_t *key, u_int16_t keybytes)
443 Blowfish_expand0state(c, key, keybytes)
457 for (i = 0; i < BLF_N + 2; i++) {
458 /* Extract 4 int8 to 1 int32 from keystream */
459 temp = Blowfish_stream2word(key, keybytes, &j);
460 c->P[i] = c->P[i] ^ temp;
466 for (i = 0; i < BLF_N + 2; i += 2) {
467 Blowfish_encipher(c, &datal, &datar);
473 for (i = 0; i < 4; i++) {
474 for (k = 0; k < 256; k += 2) {
475 Blowfish_encipher(c, &datal, &datar);
478 c->S[i][k + 1] = datar;
486 Blowfish_expandstate(blf_ctx *c, const u_int8_t *data, u_int16_t databytes,
487 const u_int8_t *key, u_int16_t keybytes)
490 Blowfish_expandstate(c, data, databytes, key, keybytes)
492 const u_int8_t *data;
506 for (i = 0; i < BLF_N + 2; i++) {
507 /* Extract 4 int8 to 1 int32 from keystream */
508 temp = Blowfish_stream2word(key, keybytes, &j);
509 c->P[i] = c->P[i] ^ temp;
515 for (i = 0; i < BLF_N + 2; i += 2) {
516 datal ^= Blowfish_stream2word(data, databytes, &j);
517 datar ^= Blowfish_stream2word(data, databytes, &j);
518 Blowfish_encipher(c, &datal, &datar);
524 for (i = 0; i < 4; i++) {
525 for (k = 0; k < 256; k += 2) {
526 datal ^= Blowfish_stream2word(data, databytes, &j);
527 datar ^= Blowfish_stream2word(data, databytes, &j);
528 Blowfish_encipher(c, &datal, &datar);
531 c->S[i][k + 1] = datar;
539 blf_key(blf_ctx *c, const u_int8_t *k, u_int16_t len)
548 /* Initalize S-boxes and subkeys with Pi */
549 Blowfish_initstate(c);
551 /* Transform S-boxes and subkeys with key */
552 Blowfish_expand0state(c, k, len);
557 blf_enc(blf_ctx *c, u_int32_t *data, u_int16_t blocks)
560 blf_enc(c, data, blocks)
570 for (i = 0; i < blocks; i++) {
571 Blowfish_encipher(c, d, d + 1);
578 blf_dec(blf_ctx *c, u_int32_t *data, u_int16_t blocks)
581 blf_dec(c, data, blocks)
591 for (i = 0; i < blocks; i++) {
592 Blowfish_decipher(c, d, d + 1);
599 blf_ecb_encrypt(blf_ctx *c, u_int8_t *data, u_int32_t len)
602 blf_ecb_encrypt(c, data, len)
611 for (i = 0; i < len; i += 8) {
612 l = data[0] << 24 | data[1] << 16 | data[2] << 8 | data[3];
613 r = data[4] << 24 | data[5] << 16 | data[6] << 8 | data[7];
614 Blowfish_encipher(c, &l, &r);
615 data[0] = l >> 24 & 0xff;
616 data[1] = l >> 16 & 0xff;
617 data[2] = l >> 8 & 0xff;
619 data[4] = r >> 24 & 0xff;
620 data[5] = r >> 16 & 0xff;
621 data[6] = r >> 8 & 0xff;
629 blf_ecb_decrypt(blf_ctx *c, u_int8_t *data, u_int32_t len)
632 blf_ecb_decrypt(c, data, len)
641 for (i = 0; i < len; i += 8) {
642 l = data[0] << 24 | data[1] << 16 | data[2] << 8 | data[3];
643 r = data[4] << 24 | data[5] << 16 | data[6] << 8 | data[7];
644 Blowfish_decipher(c, &l, &r);
645 data[0] = l >> 24 & 0xff;
646 data[1] = l >> 16 & 0xff;
647 data[2] = l >> 8 & 0xff;
649 data[4] = r >> 24 & 0xff;
650 data[5] = r >> 16 & 0xff;
651 data[6] = r >> 8 & 0xff;
659 blf_cbc_encrypt(blf_ctx *c, u_int8_t *iv, u_int8_t *data, u_int32_t len)
662 blf_cbc_encrypt(c, iv, data, len)
672 for (i = 0; i < len; i += 8) {
673 for (j = 0; j < 8; j++)
675 l = data[0] << 24 | data[1] << 16 | data[2] << 8 | data[3];
676 r = data[4] << 24 | data[5] << 16 | data[6] << 8 | data[7];
677 Blowfish_encipher(c, &l, &r);
678 data[0] = l >> 24 & 0xff;
679 data[1] = l >> 16 & 0xff;
680 data[2] = l >> 8 & 0xff;
682 data[4] = r >> 24 & 0xff;
683 data[5] = r >> 16 & 0xff;
684 data[6] = r >> 8 & 0xff;
693 blf_cbc_decrypt(blf_ctx *c, u_int8_t *iva, u_int8_t *data, u_int32_t len)
696 blf_cbc_decrypt(c, iva, data, len)
707 iv = data + len - 16;
708 data = data + len - 8;
709 for (i = len - 8; i >= 8; i -= 8) {
710 l = data[0] << 24 | data[1] << 16 | data[2] << 8 | data[3];
711 r = data[4] << 24 | data[5] << 16 | data[6] << 8 | data[7];
712 Blowfish_decipher(c, &l, &r);
713 data[0] = l >> 24 & 0xff;
714 data[1] = l >> 16 & 0xff;
715 data[2] = l >> 8 & 0xff;
717 data[4] = r >> 24 & 0xff;
718 data[5] = r >> 16 & 0xff;
719 data[6] = r >> 8 & 0xff;
721 for (j = 0; j < 8; j++)
726 l = data[0] << 24 | data[1] << 16 | data[2] << 8 | data[3];
727 r = data[4] << 24 | data[5] << 16 | data[6] << 8 | data[7];
728 Blowfish_decipher(c, &l, &r);
729 data[0] = l >> 24 & 0xff;
730 data[1] = l >> 16 & 0xff;
731 data[2] = l >> 8 & 0xff;
733 data[4] = r >> 24 & 0xff;
734 data[5] = r >> 16 & 0xff;
735 data[6] = r >> 8 & 0xff;
737 for (j = 0; j < 8; j++)
743 report(u_int32_t data[], u_int16_t len)
746 for (i = 0; i < len; i += 2)
747 printf("Block %0hd: %08lx %08lx.\n",
748 i / 2, data[i], data[i + 1]);
755 char key[] = "AAAAA";
756 char key2[] = "abcdefghijklmnopqrstuvwxyz";
760 {0x424c4f57l, 0x46495348l};
765 for (i = 0; i < 10; i++)
768 blf_key(&c, (u_int8_t *) key, 5);
769 blf_enc(&c, data, 5);
770 blf_dec(&c, data, 1);
771 blf_dec(&c, data + 2, 4);
772 printf("Should read as 0 - 9.\n");
776 blf_key(&c, (u_int8_t *) key2, strlen(key2));
777 blf_enc(&c, data2, 1);
778 printf("\nShould read as: 0x324ed0fe 0xf413a203.\n");
780 blf_dec(&c, data2, 1);