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