xref: /titanic_44/usr/src/lib/crypt_modules/bsdbf/blowfish.c (revision 09f67678c27dda8a89f87f1f408a87dd49ceb0e1)
1 /*
2  * CDDL HEADER START
3  *
4  * The contents of this file are subject to the terms of the
5  * Common Development and Distribution License, Version 1.0 only
6  * (the "License").  You may not use this file except in compliance
7  * with the License.
8  *
9  * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
10  * or http://www.opensolaris.org/os/licensing.
11  * See the License for the specific language governing permissions
12  * and limitations under the License.
13  *
14  * When distributing Covered Code, include this CDDL HEADER in each
15  * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
16  * If applicable, add the following below this CDDL HEADER, with the
17  * fields enclosed by brackets "[]" replaced with your own identifying
18  * information: Portions Copyright [yyyy] [name of copyright owner]
19  *
20  * CDDL HEADER END
21  */
22 /* $OpenBSD: blowfish.c,v 1.16 2002/02/19 19:39:36 millert Exp $ */
23 /*
24  * Blowfish block cipher for OpenBSD
25  * Copyright 1997 Niels Provos <provos@physnet.uni-hamburg.de>
26  * All rights reserved.
27  *
28  * Implementation advice by David Mazieres <dm@lcs.mit.edu>.
29  *
30  * Redistribution and use in source and binary forms, with or without
31  * modification, are permitted provided that the following conditions
32  * are met:
33  * 1. Redistributions of source code must retain the above copyright
34  *    notice, this list of conditions and the following disclaimer.
35  * 2. Redistributions in binary form must reproduce the above copyright
36  *    notice, this list of conditions and the following disclaimer in the
37  *    documentation and/or other materials provided with the distribution.
38  * 3. All advertising materials mentioning features or use of this software
39  *    must display the following acknowledgement:
40  *      This product includes software developed by Niels Provos.
41  * 4. The name of the author may not be used to endorse or promote products
42  *    derived from this software without specific prior written permission.
43  *
44  * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
45  * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
46  * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
47  * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
48  * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
49  * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
50  * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
51  * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
52  * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
53  * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
54  */
55 
56 /*
57  * Copyright 2002 Sun Microsystems, Inc.  All rights reserved.
58  * Use is subject to license terms.
59  */
60 
61 /*
62  * The above Sun copyright is included due to changes made to this code
63  * for US export control.  No changes to the algorithm implementations have
64  * been made.
65  */
66 
67 #pragma ident	"%Z%%M%	%I%	%E% SMI"
68 
69 /*
70  * This code is derived from section 14.3 and the given source
71  * in section V of Applied Cryptography, second edition.
72  * Blowfish is an unpatented fast block cipher designed by
73  * Bruce Schneier.
74  */
75 
76 #if 0
77 #include <stdio.h>		/* used for debugging */
78 #include <string.h>
79 #endif
80 
81 #include <sys/types.h>
82 #include <blf.h>
83 
84 #undef inline
85 #ifdef __GNUC__
86 #define inline __inline
87 #else				/* !__GNUC__ */
88 #define inline
89 #endif				/* !__GNUC__ */
90 
91 /* Function for Feistel Networks */
92 
93 #define F(s, x) ((((s)[        (((x)>>24)&0xFF)]  \
94 		 + (s)[0x100 + (((x)>>16)&0xFF)]) \
95 		 ^ (s)[0x200 + (((x)>> 8)&0xFF)]) \
96 		 + (s)[0x300 + ( (x)     &0xFF)])
97 
98 #define BLFRND(s,p,i,j,n) (i ^= F(s,j) ^ (p)[n])
99 
100 void
101 Blowfish_encipher(c, xl, xr)
102 	blf_ctx *c;
103 	uint32_t *xl;
104 	uint32_t *xr;
105 {
106 /* CRYPT DELETE START */
107 	uint32_t Xl;
108 	uint32_t Xr;
109 	uint32_t *s = c->S[0];
110 	uint32_t *p = c->P;
111 
112 	Xl = *xl;
113 	Xr = *xr;
114 
115 	Xl ^= p[0];
116 	BLFRND(s, p, Xr, Xl, 1); BLFRND(s, p, Xl, Xr, 2);
117 	BLFRND(s, p, Xr, Xl, 3); BLFRND(s, p, Xl, Xr, 4);
118 	BLFRND(s, p, Xr, Xl, 5); BLFRND(s, p, Xl, Xr, 6);
119 	BLFRND(s, p, Xr, Xl, 7); BLFRND(s, p, Xl, Xr, 8);
120 	BLFRND(s, p, Xr, Xl, 9); BLFRND(s, p, Xl, Xr, 10);
121 	BLFRND(s, p, Xr, Xl, 11); BLFRND(s, p, Xl, Xr, 12);
122 	BLFRND(s, p, Xr, Xl, 13); BLFRND(s, p, Xl, Xr, 14);
123 	BLFRND(s, p, Xr, Xl, 15); BLFRND(s, p, Xl, Xr, 16);
124 
125 	*xl = Xr ^ p[17];
126 	*xr = Xl;
127 /* CRYPT DELETE END */
128 }
129 
130 void
131 Blowfish_decipher(c, xl, xr)
132 	blf_ctx *c;
133 	uint32_t *xl;
134 	uint32_t *xr;
135 {
136 /* CRYPT DELETE START */
137 	uint32_t Xl;
138 	uint32_t Xr;
139 	uint32_t *s = c->S[0];
140 	uint32_t *p = c->P;
141 
142 	Xl = *xl;
143 	Xr = *xr;
144 
145 	Xl ^= p[17];
146 	BLFRND(s, p, Xr, Xl, 16); BLFRND(s, p, Xl, Xr, 15);
147 	BLFRND(s, p, Xr, Xl, 14); BLFRND(s, p, Xl, Xr, 13);
148 	BLFRND(s, p, Xr, Xl, 12); BLFRND(s, p, Xl, Xr, 11);
149 	BLFRND(s, p, Xr, Xl, 10); BLFRND(s, p, Xl, Xr, 9);
150 	BLFRND(s, p, Xr, Xl, 8); BLFRND(s, p, Xl, Xr, 7);
151 	BLFRND(s, p, Xr, Xl, 6); BLFRND(s, p, Xl, Xr, 5);
152 	BLFRND(s, p, Xr, Xl, 4); BLFRND(s, p, Xl, Xr, 3);
153 	BLFRND(s, p, Xr, Xl, 2); BLFRND(s, p, Xl, Xr, 1);
154 
155 	*xl = Xr ^ p[0];
156 	*xr = Xl;
157 /* CRYPT DELETE END */
158 }
159 
160 void
161 Blowfish_initstate(c)
162 	blf_ctx *c;
163 {
164 /* CRYPT DELETE START */
165 
166 /* P-box and S-box tables initialized with digits of Pi */
167 
168 	const blf_ctx initstate =
169 
170 	{ {
171 		{
172 			0xd1310ba6, 0x98dfb5ac, 0x2ffd72db, 0xd01adfb7,
173 			0xb8e1afed, 0x6a267e96, 0xba7c9045, 0xf12c7f99,
174 			0x24a19947, 0xb3916cf7, 0x0801f2e2, 0x858efc16,
175 			0x636920d8, 0x71574e69, 0xa458fea3, 0xf4933d7e,
176 			0x0d95748f, 0x728eb658, 0x718bcd58, 0x82154aee,
177 			0x7b54a41d, 0xc25a59b5, 0x9c30d539, 0x2af26013,
178 			0xc5d1b023, 0x286085f0, 0xca417918, 0xb8db38ef,
179 			0x8e79dcb0, 0x603a180e, 0x6c9e0e8b, 0xb01e8a3e,
180 			0xd71577c1, 0xbd314b27, 0x78af2fda, 0x55605c60,
181 			0xe65525f3, 0xaa55ab94, 0x57489862, 0x63e81440,
182 			0x55ca396a, 0x2aab10b6, 0xb4cc5c34, 0x1141e8ce,
183 			0xa15486af, 0x7c72e993, 0xb3ee1411, 0x636fbc2a,
184 			0x2ba9c55d, 0x741831f6, 0xce5c3e16, 0x9b87931e,
185 			0xafd6ba33, 0x6c24cf5c, 0x7a325381, 0x28958677,
186 			0x3b8f4898, 0x6b4bb9af, 0xc4bfe81b, 0x66282193,
187 			0x61d809cc, 0xfb21a991, 0x487cac60, 0x5dec8032,
188 			0xef845d5d, 0xe98575b1, 0xdc262302, 0xeb651b88,
189 			0x23893e81, 0xd396acc5, 0x0f6d6ff3, 0x83f44239,
190 			0x2e0b4482, 0xa4842004, 0x69c8f04a, 0x9e1f9b5e,
191 			0x21c66842, 0xf6e96c9a, 0x670c9c61, 0xabd388f0,
192 			0x6a51a0d2, 0xd8542f68, 0x960fa728, 0xab5133a3,
193 			0x6eef0b6c, 0x137a3be4, 0xba3bf050, 0x7efb2a98,
194 			0xa1f1651d, 0x39af0176, 0x66ca593e, 0x82430e88,
195 			0x8cee8619, 0x456f9fb4, 0x7d84a5c3, 0x3b8b5ebe,
196 			0xe06f75d8, 0x85c12073, 0x401a449f, 0x56c16aa6,
197 			0x4ed3aa62, 0x363f7706, 0x1bfedf72, 0x429b023d,
198 			0x37d0d724, 0xd00a1248, 0xdb0fead3, 0x49f1c09b,
199 			0x075372c9, 0x80991b7b, 0x25d479d8, 0xf6e8def7,
200 			0xe3fe501a, 0xb6794c3b, 0x976ce0bd, 0x04c006ba,
201 			0xc1a94fb6, 0x409f60c4, 0x5e5c9ec2, 0x196a2463,
202 			0x68fb6faf, 0x3e6c53b5, 0x1339b2eb, 0x3b52ec6f,
203 			0x6dfc511f, 0x9b30952c, 0xcc814544, 0xaf5ebd09,
204 			0xbee3d004, 0xde334afd, 0x660f2807, 0x192e4bb3,
205 			0xc0cba857, 0x45c8740f, 0xd20b5f39, 0xb9d3fbdb,
206 			0x5579c0bd, 0x1a60320a, 0xd6a100c6, 0x402c7279,
207 			0x679f25fe, 0xfb1fa3cc, 0x8ea5e9f8, 0xdb3222f8,
208 			0x3c7516df, 0xfd616b15, 0x2f501ec8, 0xad0552ab,
209 			0x323db5fa, 0xfd238760, 0x53317b48, 0x3e00df82,
210 			0x9e5c57bb, 0xca6f8ca0, 0x1a87562e, 0xdf1769db,
211 			0xd542a8f6, 0x287effc3, 0xac6732c6, 0x8c4f5573,
212 			0x695b27b0, 0xbbca58c8, 0xe1ffa35d, 0xb8f011a0,
213 			0x10fa3d98, 0xfd2183b8, 0x4afcb56c, 0x2dd1d35b,
214 			0x9a53e479, 0xb6f84565, 0xd28e49bc, 0x4bfb9790,
215 			0xe1ddf2da, 0xa4cb7e33, 0x62fb1341, 0xcee4c6e8,
216 			0xef20cada, 0x36774c01, 0xd07e9efe, 0x2bf11fb4,
217 			0x95dbda4d, 0xae909198, 0xeaad8e71, 0x6b93d5a0,
218 			0xd08ed1d0, 0xafc725e0, 0x8e3c5b2f, 0x8e7594b7,
219 			0x8ff6e2fb, 0xf2122b64, 0x8888b812, 0x900df01c,
220 			0x4fad5ea0, 0x688fc31c, 0xd1cff191, 0xb3a8c1ad,
221 			0x2f2f2218, 0xbe0e1777, 0xea752dfe, 0x8b021fa1,
222 			0xe5a0cc0f, 0xb56f74e8, 0x18acf3d6, 0xce89e299,
223 			0xb4a84fe0, 0xfd13e0b7, 0x7cc43b81, 0xd2ada8d9,
224 			0x165fa266, 0x80957705, 0x93cc7314, 0x211a1477,
225 			0xe6ad2065, 0x77b5fa86, 0xc75442f5, 0xfb9d35cf,
226 			0xebcdaf0c, 0x7b3e89a0, 0xd6411bd3, 0xae1e7e49,
227 			0x00250e2d, 0x2071b35e, 0x226800bb, 0x57b8e0af,
228 			0x2464369b, 0xf009b91e, 0x5563911d, 0x59dfa6aa,
229 			0x78c14389, 0xd95a537f, 0x207d5ba2, 0x02e5b9c5,
230 			0x83260376, 0x6295cfa9, 0x11c81968, 0x4e734a41,
231 			0xb3472dca, 0x7b14a94a, 0x1b510052, 0x9a532915,
232 			0xd60f573f, 0xbc9bc6e4, 0x2b60a476, 0x81e67400,
233 			0x08ba6fb5, 0x571be91f, 0xf296ec6b, 0x2a0dd915,
234 			0xb6636521, 0xe7b9f9b6, 0xff34052e, 0xc5855664,
235 		0x53b02d5d, 0xa99f8fa1, 0x08ba4799, 0x6e85076a},
236 		{
237 			0x4b7a70e9, 0xb5b32944, 0xdb75092e, 0xc4192623,
238 			0xad6ea6b0, 0x49a7df7d, 0x9cee60b8, 0x8fedb266,
239 			0xecaa8c71, 0x699a17ff, 0x5664526c, 0xc2b19ee1,
240 			0x193602a5, 0x75094c29, 0xa0591340, 0xe4183a3e,
241 			0x3f54989a, 0x5b429d65, 0x6b8fe4d6, 0x99f73fd6,
242 			0xa1d29c07, 0xefe830f5, 0x4d2d38e6, 0xf0255dc1,
243 			0x4cdd2086, 0x8470eb26, 0x6382e9c6, 0x021ecc5e,
244 			0x09686b3f, 0x3ebaefc9, 0x3c971814, 0x6b6a70a1,
245 			0x687f3584, 0x52a0e286, 0xb79c5305, 0xaa500737,
246 			0x3e07841c, 0x7fdeae5c, 0x8e7d44ec, 0x5716f2b8,
247 			0xb03ada37, 0xf0500c0d, 0xf01c1f04, 0x0200b3ff,
248 			0xae0cf51a, 0x3cb574b2, 0x25837a58, 0xdc0921bd,
249 			0xd19113f9, 0x7ca92ff6, 0x94324773, 0x22f54701,
250 			0x3ae5e581, 0x37c2dadc, 0xc8b57634, 0x9af3dda7,
251 			0xa9446146, 0x0fd0030e, 0xecc8c73e, 0xa4751e41,
252 			0xe238cd99, 0x3bea0e2f, 0x3280bba1, 0x183eb331,
253 			0x4e548b38, 0x4f6db908, 0x6f420d03, 0xf60a04bf,
254 			0x2cb81290, 0x24977c79, 0x5679b072, 0xbcaf89af,
255 			0xde9a771f, 0xd9930810, 0xb38bae12, 0xdccf3f2e,
256 			0x5512721f, 0x2e6b7124, 0x501adde6, 0x9f84cd87,
257 			0x7a584718, 0x7408da17, 0xbc9f9abc, 0xe94b7d8c,
258 			0xec7aec3a, 0xdb851dfa, 0x63094366, 0xc464c3d2,
259 			0xef1c1847, 0x3215d908, 0xdd433b37, 0x24c2ba16,
260 			0x12a14d43, 0x2a65c451, 0x50940002, 0x133ae4dd,
261 			0x71dff89e, 0x10314e55, 0x81ac77d6, 0x5f11199b,
262 			0x043556f1, 0xd7a3c76b, 0x3c11183b, 0x5924a509,
263 			0xf28fe6ed, 0x97f1fbfa, 0x9ebabf2c, 0x1e153c6e,
264 			0x86e34570, 0xeae96fb1, 0x860e5e0a, 0x5a3e2ab3,
265 			0x771fe71c, 0x4e3d06fa, 0x2965dcb9, 0x99e71d0f,
266 			0x803e89d6, 0x5266c825, 0x2e4cc978, 0x9c10b36a,
267 			0xc6150eba, 0x94e2ea78, 0xa5fc3c53, 0x1e0a2df4,
268 			0xf2f74ea7, 0x361d2b3d, 0x1939260f, 0x19c27960,
269 			0x5223a708, 0xf71312b6, 0xebadfe6e, 0xeac31f66,
270 			0xe3bc4595, 0xa67bc883, 0xb17f37d1, 0x018cff28,
271 			0xc332ddef, 0xbe6c5aa5, 0x65582185, 0x68ab9802,
272 			0xeecea50f, 0xdb2f953b, 0x2aef7dad, 0x5b6e2f84,
273 			0x1521b628, 0x29076170, 0xecdd4775, 0x619f1510,
274 			0x13cca830, 0xeb61bd96, 0x0334fe1e, 0xaa0363cf,
275 			0xb5735c90, 0x4c70a239, 0xd59e9e0b, 0xcbaade14,
276 			0xeecc86bc, 0x60622ca7, 0x9cab5cab, 0xb2f3846e,
277 			0x648b1eaf, 0x19bdf0ca, 0xa02369b9, 0x655abb50,
278 			0x40685a32, 0x3c2ab4b3, 0x319ee9d5, 0xc021b8f7,
279 			0x9b540b19, 0x875fa099, 0x95f7997e, 0x623d7da8,
280 			0xf837889a, 0x97e32d77, 0x11ed935f, 0x16681281,
281 			0x0e358829, 0xc7e61fd6, 0x96dedfa1, 0x7858ba99,
282 			0x57f584a5, 0x1b227263, 0x9b83c3ff, 0x1ac24696,
283 			0xcdb30aeb, 0x532e3054, 0x8fd948e4, 0x6dbc3128,
284 			0x58ebf2ef, 0x34c6ffea, 0xfe28ed61, 0xee7c3c73,
285 			0x5d4a14d9, 0xe864b7e3, 0x42105d14, 0x203e13e0,
286 			0x45eee2b6, 0xa3aaabea, 0xdb6c4f15, 0xfacb4fd0,
287 			0xc742f442, 0xef6abbb5, 0x654f3b1d, 0x41cd2105,
288 			0xd81e799e, 0x86854dc7, 0xe44b476a, 0x3d816250,
289 			0xcf62a1f2, 0x5b8d2646, 0xfc8883a0, 0xc1c7b6a3,
290 			0x7f1524c3, 0x69cb7492, 0x47848a0b, 0x5692b285,
291 			0x095bbf00, 0xad19489d, 0x1462b174, 0x23820e00,
292 			0x58428d2a, 0x0c55f5ea, 0x1dadf43e, 0x233f7061,
293 			0x3372f092, 0x8d937e41, 0xd65fecf1, 0x6c223bdb,
294 			0x7cde3759, 0xcbee7460, 0x4085f2a7, 0xce77326e,
295 			0xa6078084, 0x19f8509e, 0xe8efd855, 0x61d99735,
296 			0xa969a7aa, 0xc50c06c2, 0x5a04abfc, 0x800bcadc,
297 			0x9e447a2e, 0xc3453484, 0xfdd56705, 0x0e1e9ec9,
298 			0xdb73dbd3, 0x105588cd, 0x675fda79, 0xe3674340,
299 			0xc5c43465, 0x713e38d8, 0x3d28f89e, 0xf16dff20,
300 		0x153e21e7, 0x8fb03d4a, 0xe6e39f2b, 0xdb83adf7},
301 		{
302 			0xe93d5a68, 0x948140f7, 0xf64c261c, 0x94692934,
303 			0x411520f7, 0x7602d4f7, 0xbcf46b2e, 0xd4a20068,
304 			0xd4082471, 0x3320f46a, 0x43b7d4b7, 0x500061af,
305 			0x1e39f62e, 0x97244546, 0x14214f74, 0xbf8b8840,
306 			0x4d95fc1d, 0x96b591af, 0x70f4ddd3, 0x66a02f45,
307 			0xbfbc09ec, 0x03bd9785, 0x7fac6dd0, 0x31cb8504,
308 			0x96eb27b3, 0x55fd3941, 0xda2547e6, 0xabca0a9a,
309 			0x28507825, 0x530429f4, 0x0a2c86da, 0xe9b66dfb,
310 			0x68dc1462, 0xd7486900, 0x680ec0a4, 0x27a18dee,
311 			0x4f3ffea2, 0xe887ad8c, 0xb58ce006, 0x7af4d6b6,
312 			0xaace1e7c, 0xd3375fec, 0xce78a399, 0x406b2a42,
313 			0x20fe9e35, 0xd9f385b9, 0xee39d7ab, 0x3b124e8b,
314 			0x1dc9faf7, 0x4b6d1856, 0x26a36631, 0xeae397b2,
315 			0x3a6efa74, 0xdd5b4332, 0x6841e7f7, 0xca7820fb,
316 			0xfb0af54e, 0xd8feb397, 0x454056ac, 0xba489527,
317 			0x55533a3a, 0x20838d87, 0xfe6ba9b7, 0xd096954b,
318 			0x55a867bc, 0xa1159a58, 0xcca92963, 0x99e1db33,
319 			0xa62a4a56, 0x3f3125f9, 0x5ef47e1c, 0x9029317c,
320 			0xfdf8e802, 0x04272f70, 0x80bb155c, 0x05282ce3,
321 			0x95c11548, 0xe4c66d22, 0x48c1133f, 0xc70f86dc,
322 			0x07f9c9ee, 0x41041f0f, 0x404779a4, 0x5d886e17,
323 			0x325f51eb, 0xd59bc0d1, 0xf2bcc18f, 0x41113564,
324 			0x257b7834, 0x602a9c60, 0xdff8e8a3, 0x1f636c1b,
325 			0x0e12b4c2, 0x02e1329e, 0xaf664fd1, 0xcad18115,
326 			0x6b2395e0, 0x333e92e1, 0x3b240b62, 0xeebeb922,
327 			0x85b2a20e, 0xe6ba0d99, 0xde720c8c, 0x2da2f728,
328 			0xd0127845, 0x95b794fd, 0x647d0862, 0xe7ccf5f0,
329 			0x5449a36f, 0x877d48fa, 0xc39dfd27, 0xf33e8d1e,
330 			0x0a476341, 0x992eff74, 0x3a6f6eab, 0xf4f8fd37,
331 			0xa812dc60, 0xa1ebddf8, 0x991be14c, 0xdb6e6b0d,
332 			0xc67b5510, 0x6d672c37, 0x2765d43b, 0xdcd0e804,
333 			0xf1290dc7, 0xcc00ffa3, 0xb5390f92, 0x690fed0b,
334 			0x667b9ffb, 0xcedb7d9c, 0xa091cf0b, 0xd9155ea3,
335 			0xbb132f88, 0x515bad24, 0x7b9479bf, 0x763bd6eb,
336 			0x37392eb3, 0xcc115979, 0x8026e297, 0xf42e312d,
337 			0x6842ada7, 0xc66a2b3b, 0x12754ccc, 0x782ef11c,
338 			0x6a124237, 0xb79251e7, 0x06a1bbe6, 0x4bfb6350,
339 			0x1a6b1018, 0x11caedfa, 0x3d25bdd8, 0xe2e1c3c9,
340 			0x44421659, 0x0a121386, 0xd90cec6e, 0xd5abea2a,
341 			0x64af674e, 0xda86a85f, 0xbebfe988, 0x64e4c3fe,
342 			0x9dbc8057, 0xf0f7c086, 0x60787bf8, 0x6003604d,
343 			0xd1fd8346, 0xf6381fb0, 0x7745ae04, 0xd736fccc,
344 			0x83426b33, 0xf01eab71, 0xb0804187, 0x3c005e5f,
345 			0x77a057be, 0xbde8ae24, 0x55464299, 0xbf582e61,
346 			0x4e58f48f, 0xf2ddfda2, 0xf474ef38, 0x8789bdc2,
347 			0x5366f9c3, 0xc8b38e74, 0xb475f255, 0x46fcd9b9,
348 			0x7aeb2661, 0x8b1ddf84, 0x846a0e79, 0x915f95e2,
349 			0x466e598e, 0x20b45770, 0x8cd55591, 0xc902de4c,
350 			0xb90bace1, 0xbb8205d0, 0x11a86248, 0x7574a99e,
351 			0xb77f19b6, 0xe0a9dc09, 0x662d09a1, 0xc4324633,
352 			0xe85a1f02, 0x09f0be8c, 0x4a99a025, 0x1d6efe10,
353 			0x1ab93d1d, 0x0ba5a4df, 0xa186f20f, 0x2868f169,
354 			0xdcb7da83, 0x573906fe, 0xa1e2ce9b, 0x4fcd7f52,
355 			0x50115e01, 0xa70683fa, 0xa002b5c4, 0x0de6d027,
356 			0x9af88c27, 0x773f8641, 0xc3604c06, 0x61a806b5,
357 			0xf0177a28, 0xc0f586e0, 0x006058aa, 0x30dc7d62,
358 			0x11e69ed7, 0x2338ea63, 0x53c2dd94, 0xc2c21634,
359 			0xbbcbee56, 0x90bcb6de, 0xebfc7da1, 0xce591d76,
360 			0x6f05e409, 0x4b7c0188, 0x39720a3d, 0x7c927c24,
361 			0x86e3725f, 0x724d9db9, 0x1ac15bb4, 0xd39eb8fc,
362 			0xed545578, 0x08fca5b5, 0xd83d7cd3, 0x4dad0fc4,
363 			0x1e50ef5e, 0xb161e6f8, 0xa28514d9, 0x6c51133c,
364 			0x6fd5c7e7, 0x56e14ec4, 0x362abfce, 0xddc6c837,
365 		0xd79a3234, 0x92638212, 0x670efa8e, 0x406000e0},
366 		{
367 			0x3a39ce37, 0xd3faf5cf, 0xabc27737, 0x5ac52d1b,
368 			0x5cb0679e, 0x4fa33742, 0xd3822740, 0x99bc9bbe,
369 			0xd5118e9d, 0xbf0f7315, 0xd62d1c7e, 0xc700c47b,
370 			0xb78c1b6b, 0x21a19045, 0xb26eb1be, 0x6a366eb4,
371 			0x5748ab2f, 0xbc946e79, 0xc6a376d2, 0x6549c2c8,
372 			0x530ff8ee, 0x468dde7d, 0xd5730a1d, 0x4cd04dc6,
373 			0x2939bbdb, 0xa9ba4650, 0xac9526e8, 0xbe5ee304,
374 			0xa1fad5f0, 0x6a2d519a, 0x63ef8ce2, 0x9a86ee22,
375 			0xc089c2b8, 0x43242ef6, 0xa51e03aa, 0x9cf2d0a4,
376 			0x83c061ba, 0x9be96a4d, 0x8fe51550, 0xba645bd6,
377 			0x2826a2f9, 0xa73a3ae1, 0x4ba99586, 0xef5562e9,
378 			0xc72fefd3, 0xf752f7da, 0x3f046f69, 0x77fa0a59,
379 			0x80e4a915, 0x87b08601, 0x9b09e6ad, 0x3b3ee593,
380 			0xe990fd5a, 0x9e34d797, 0x2cf0b7d9, 0x022b8b51,
381 			0x96d5ac3a, 0x017da67d, 0xd1cf3ed6, 0x7c7d2d28,
382 			0x1f9f25cf, 0xadf2b89b, 0x5ad6b472, 0x5a88f54c,
383 			0xe029ac71, 0xe019a5e6, 0x47b0acfd, 0xed93fa9b,
384 			0xe8d3c48d, 0x283b57cc, 0xf8d56629, 0x79132e28,
385 			0x785f0191, 0xed756055, 0xf7960e44, 0xe3d35e8c,
386 			0x15056dd4, 0x88f46dba, 0x03a16125, 0x0564f0bd,
387 			0xc3eb9e15, 0x3c9057a2, 0x97271aec, 0xa93a072a,
388 			0x1b3f6d9b, 0x1e6321f5, 0xf59c66fb, 0x26dcf319,
389 			0x7533d928, 0xb155fdf5, 0x03563482, 0x8aba3cbb,
390 			0x28517711, 0xc20ad9f8, 0xabcc5167, 0xccad925f,
391 			0x4de81751, 0x3830dc8e, 0x379d5862, 0x9320f991,
392 			0xea7a90c2, 0xfb3e7bce, 0x5121ce64, 0x774fbe32,
393 			0xa8b6e37e, 0xc3293d46, 0x48de5369, 0x6413e680,
394 			0xa2ae0810, 0xdd6db224, 0x69852dfd, 0x09072166,
395 			0xb39a460a, 0x6445c0dd, 0x586cdecf, 0x1c20c8ae,
396 			0x5bbef7dd, 0x1b588d40, 0xccd2017f, 0x6bb4e3bb,
397 			0xdda26a7e, 0x3a59ff45, 0x3e350a44, 0xbcb4cdd5,
398 			0x72eacea8, 0xfa6484bb, 0x8d6612ae, 0xbf3c6f47,
399 			0xd29be463, 0x542f5d9e, 0xaec2771b, 0xf64e6370,
400 			0x740e0d8d, 0xe75b1357, 0xf8721671, 0xaf537d5d,
401 			0x4040cb08, 0x4eb4e2cc, 0x34d2466a, 0x0115af84,
402 			0xe1b00428, 0x95983a1d, 0x06b89fb4, 0xce6ea048,
403 			0x6f3f3b82, 0x3520ab82, 0x011a1d4b, 0x277227f8,
404 			0x611560b1, 0xe7933fdc, 0xbb3a792b, 0x344525bd,
405 			0xa08839e1, 0x51ce794b, 0x2f32c9b7, 0xa01fbac9,
406 			0xe01cc87e, 0xbcc7d1f6, 0xcf0111c3, 0xa1e8aac7,
407 			0x1a908749, 0xd44fbd9a, 0xd0dadecb, 0xd50ada38,
408 			0x0339c32a, 0xc6913667, 0x8df9317c, 0xe0b12b4f,
409 			0xf79e59b7, 0x43f5bb3a, 0xf2d519ff, 0x27d9459c,
410 			0xbf97222c, 0x15e6fc2a, 0x0f91fc71, 0x9b941525,
411 			0xfae59361, 0xceb69ceb, 0xc2a86459, 0x12baa8d1,
412 			0xb6c1075e, 0xe3056a0c, 0x10d25065, 0xcb03a442,
413 			0xe0ec6e0e, 0x1698db3b, 0x4c98a0be, 0x3278e964,
414 			0x9f1f9532, 0xe0d392df, 0xd3a0342b, 0x8971f21e,
415 			0x1b0a7441, 0x4ba3348c, 0xc5be7120, 0xc37632d8,
416 			0xdf359f8d, 0x9b992f2e, 0xe60b6f47, 0x0fe3f11d,
417 			0xe54cda54, 0x1edad891, 0xce6279cf, 0xcd3e7e6f,
418 			0x1618b166, 0xfd2c1d05, 0x848fd2c5, 0xf6fb2299,
419 			0xf523f357, 0xa6327623, 0x93a83531, 0x56cccd02,
420 			0xacf08162, 0x5a75ebb5, 0x6e163697, 0x88d273cc,
421 			0xde966292, 0x81b949d0, 0x4c50901b, 0x71c65614,
422 			0xe6c6c7bd, 0x327a140a, 0x45e1d006, 0xc3f27b9a,
423 			0xc9aa53fd, 0x62a80f00, 0xbb25bfe2, 0x35bdd2f6,
424 			0x71126905, 0xb2040222, 0xb6cbcf7c, 0xcd769c2b,
425 			0x53113ec0, 0x1640e3d3, 0x38abbd60, 0x2547adf0,
426 			0xba38209c, 0xf746ce76, 0x77afa1c5, 0x20756060,
427 			0x85cbfe4e, 0x8ae88dd8, 0x7aaaf9b0, 0x4cf9aa7e,
428 			0x1948c25c, 0x02fb8a8c, 0x01c36ae4, 0xd6ebe1f9,
429 			0x90d4f869, 0xa65cdea0, 0x3f09252d, 0xc208e69f,
430 		0xb74e6132, 0xce77e25b, 0x578fdfe3, 0x3ac372e6}
431 	},
432 	{
433 		0x243f6a88, 0x85a308d3, 0x13198a2e, 0x03707344,
434 		0xa4093822, 0x299f31d0, 0x082efa98, 0xec4e6c89,
435 		0x452821e6, 0x38d01377, 0xbe5466cf, 0x34e90c6c,
436 		0xc0ac29b7, 0xc97c50dd, 0x3f84d5b5, 0xb5470917,
437 		0x9216d5d9, 0x8979fb1b
438 	} };
439 
440 	*c = initstate;
441 
442 /* CRYPT DELETE END */
443 }
444 
445 uint32_t
446 Blowfish_stream2word(const uint8_t *data, uint16_t databytes, uint16_t *current)
447 {
448 	uint8_t i;
449 	uint16_t j;
450 	uint32_t temp;
451 
452 	temp = 0x00000000;
453 /* CRYPT DELETE START */
454 	j = *current;
455 
456 	for (i = 0; i < 4; i++, j++) {
457 		if (j >= databytes)
458 			j = 0;
459 		temp = (temp << 8) | data[j];
460 	}
461 
462 	*current = j;
463 /* CRYPT DELETE END */
464 	return temp;
465 }
466 
467 void
468 Blowfish_expand0state(blf_ctx *c, const uint8_t *key, uint16_t keybytes)
469 {
470 /* CRYPT DELETE START */
471 	uint16_t i;
472 	uint16_t j;
473 	uint16_t k;
474 	uint32_t temp;
475 	uint32_t datal;
476 	uint32_t datar;
477 
478 	j = 0;
479 	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;
483 	}
484 
485 	j = 0;
486 	datal = 0x00000000;
487 	datar = 0x00000000;
488 	for (i = 0; i < BLF_N + 2; i += 2) {
489 		Blowfish_encipher(c, &datal, &datar);
490 
491 		c->P[i] = datal;
492 		c->P[i + 1] = datar;
493 	}
494 
495 	for (i = 0; i < 4; i++) {
496 		for (k = 0; k < 256; k += 2) {
497 			Blowfish_encipher(c, &datal, &datar);
498 
499 			c->S[i][k] = datal;
500 			c->S[i][k + 1] = datar;
501 		}
502 	}
503 /* CRYPT DELETE END */
504 }
505 
506 
507 void
508 Blowfish_expandstate(blf_ctx *c, const uint8_t *data, uint16_t databytes,
509 		     const uint8_t *key, uint16_t keybytes)
510 {
511 /* CRYPT DELETE START */
512 	uint16_t i;
513 	uint16_t j;
514 	uint16_t k;
515 	uint32_t temp;
516 	uint32_t datal;
517 	uint32_t datar;
518 
519 	j = 0;
520 	for (i = 0; i < BLF_N + 2; i++) {
521 		/* Extract 4 int8 to 1 int32 from keystream */
522 		temp = Blowfish_stream2word(key, keybytes, &j);
523 		c->P[i] = c->P[i] ^ temp;
524 	}
525 
526 	j = 0;
527 	datal = 0x00000000;
528 	datar = 0x00000000;
529 	for (i = 0; i < BLF_N + 2; i += 2) {
530 		datal ^= Blowfish_stream2word(data, databytes, &j);
531 		datar ^= Blowfish_stream2word(data, databytes, &j);
532 		Blowfish_encipher(c, &datal, &datar);
533 
534 		c->P[i] = datal;
535 		c->P[i + 1] = datar;
536 	}
537 
538 	for (i = 0; i < 4; i++) {
539 		for (k = 0; k < 256; k += 2) {
540 			datal ^= Blowfish_stream2word(data, databytes, &j);
541 			datar ^= Blowfish_stream2word(data, databytes, &j);
542 			Blowfish_encipher(c, &datal, &datar);
543 
544 			c->S[i][k] = datal;
545 			c->S[i][k + 1] = datar;
546 		}
547 	}
548 
549 /* CRYPT DELETE END */
550 }
551 
552 void
553 blf_key(blf_ctx *c, const uint8_t *k, uint16_t len)
554 {
555 /* CRYPT DELETE START */
556 	/* Initialize S-boxes and subkeys with Pi */
557 	Blowfish_initstate(c);
558 
559 	/* Transform S-boxes and subkeys with key */
560 	Blowfish_expand0state(c, k, len);
561 /* CRYPT DELETE END */
562 }
563 
564 void
565 blf_enc(blf_ctx *c, uint32_t *data, uint16_t blocks)
566 {
567 /* CRYPT DELETE START */
568 	uint32_t *d;
569 	uint16_t i;
570 
571 	d = data;
572 	for (i = 0; i < blocks; i++) {
573 		Blowfish_encipher(c, d, d + 1);
574 		d += 2;
575 	}
576 /* CRYPT DELETE END */
577 }
578 
579 void
580 blf_dec(blf_ctx *c, uint32_t *data, uint16_t blocks)
581 {
582 /* CRYPT DELETE START */
583 	uint32_t *d;
584 	uint16_t i;
585 
586 	d = data;
587 	for (i = 0; i < blocks; i++) {
588 		Blowfish_decipher(c, d, d + 1);
589 		d += 2;
590 	}
591 /* CRYPT DELETE END */
592 }
593 
594 void
595 blf_ecb_encrypt(blf_ctx *c, uint8_t *data, uint32_t len)
596 {
597 /* CRYPT DELETE START */
598 	uint32_t l, r;
599 	uint32_t i;
600 
601 	for (i = 0; i < len; i += 8) {
602 		l = data[0] << 24 | data[1] << 16 | data[2] << 8 | data[3];
603 		r = data[4] << 24 | data[5] << 16 | data[6] << 8 | data[7];
604 		Blowfish_encipher(c, &l, &r);
605 		data[0] = l >> 24 & 0xff;
606 		data[1] = l >> 16 & 0xff;
607 		data[2] = l >> 8 & 0xff;
608 		data[3] = l & 0xff;
609 		data[4] = r >> 24 & 0xff;
610 		data[5] = r >> 16 & 0xff;
611 		data[6] = r >> 8 & 0xff;
612 		data[7] = r & 0xff;
613 		data += 8;
614 	}
615 /* CRYPT DELETE END */
616 }
617 
618 void
619 blf_ecb_decrypt(blf_ctx *c, uint8_t *data, uint32_t len)
620 {
621 /* CRYPT DELETE START */
622 	uint32_t l, r;
623 	uint32_t i;
624 
625 	for (i = 0; i < len; i += 8) {
626 		l = data[0] << 24 | data[1] << 16 | data[2] << 8 | data[3];
627 		r = data[4] << 24 | data[5] << 16 | data[6] << 8 | data[7];
628 		Blowfish_decipher(c, &l, &r);
629 		data[0] = l >> 24 & 0xff;
630 		data[1] = l >> 16 & 0xff;
631 		data[2] = l >> 8 & 0xff;
632 		data[3] = l & 0xff;
633 		data[4] = r >> 24 & 0xff;
634 		data[5] = r >> 16 & 0xff;
635 		data[6] = r >> 8 & 0xff;
636 		data[7] = r & 0xff;
637 		data += 8;
638 	}
639 /* CRYPT DELETE END */
640 }
641 
642 void
643 blf_cbc_encrypt(blf_ctx *c, uint8_t *iv, uint8_t *data, uint32_t len)
644 {
645 /* CRYPT DELETE START */
646 	uint32_t l, r;
647 	uint32_t i, j;
648 
649 	for (i = 0; i < len; i += 8) {
650 		for (j = 0; j < 8; j++)
651 			data[j] ^= iv[j];
652 		l = data[0] << 24 | data[1] << 16 | data[2] << 8 | data[3];
653 		r = data[4] << 24 | data[5] << 16 | data[6] << 8 | data[7];
654 		Blowfish_encipher(c, &l, &r);
655 		data[0] = l >> 24 & 0xff;
656 		data[1] = l >> 16 & 0xff;
657 		data[2] = l >> 8 & 0xff;
658 		data[3] = l & 0xff;
659 		data[4] = r >> 24 & 0xff;
660 		data[5] = r >> 16 & 0xff;
661 		data[6] = r >> 8 & 0xff;
662 		data[7] = r & 0xff;
663 		iv = data;
664 		data += 8;
665 	}
666 /* CRYPT DELETE END */
667 }
668 
669 void
670 blf_cbc_decrypt(blf_ctx *c, uint8_t *iva, uint8_t *data, uint32_t len)
671 {
672 /* CRYPT DELETE START */
673 	uint32_t l, r;
674 	uint8_t *iv;
675 	uint32_t i, j;
676 
677 	iv = data + len - 16;
678 	data = data + len - 8;
679 	for (i = len - 8; i >= 8; i -= 8) {
680 		l = data[0] << 24 | data[1] << 16 | data[2] << 8 | data[3];
681 		r = data[4] << 24 | data[5] << 16 | data[6] << 8 | data[7];
682 		Blowfish_decipher(c, &l, &r);
683 		data[0] = l >> 24 & 0xff;
684 		data[1] = l >> 16 & 0xff;
685 		data[2] = l >> 8 & 0xff;
686 		data[3] = l & 0xff;
687 		data[4] = r >> 24 & 0xff;
688 		data[5] = r >> 16 & 0xff;
689 		data[6] = r >> 8 & 0xff;
690 		data[7] = r & 0xff;
691 		for (j = 0; j < 8; j++)
692 			data[j] ^= iv[j];
693 		iv -= 8;
694 		data -= 8;
695 	}
696 	l = data[0] << 24 | data[1] << 16 | data[2] << 8 | data[3];
697 	r = data[4] << 24 | data[5] << 16 | data[6] << 8 | data[7];
698 	Blowfish_decipher(c, &l, &r);
699 	data[0] = l >> 24 & 0xff;
700 	data[1] = l >> 16 & 0xff;
701 	data[2] = l >> 8 & 0xff;
702 	data[3] = l & 0xff;
703 	data[4] = r >> 24 & 0xff;
704 	data[5] = r >> 16 & 0xff;
705 	data[6] = r >> 8 & 0xff;
706 	data[7] = r & 0xff;
707 	for (j = 0; j < 8; j++)
708 		data[j] ^= iva[j];
709 /* CRYPT DELETE END */
710 }
711 
712 /* CRYPT DELETE START */
713 #if 0
714 void
715 report(uint32_t data[], uint16_t len)
716 {
717 	uint16_t i;
718 	for (i = 0; i < len; i += 2)
719 		printf("Block %0hd: %08lx %08lx.\n",
720 		    i / 2, data[i], data[i + 1]);
721 }
722 void
723 main(void)
724 {
725 
726 	blf_ctx c;
727 	char    key[] = "AAAAA";
728 	char    key2[] = "abcdefghijklmnopqrstuvwxyz";
729 
730 	uint32_t data[10];
731 	uint32_t data2[] =
732 	{0x424c4f57l, 0x46495348l};
733 
734 	uint16_t i;
735 
736 	/* First test */
737 	for (i = 0; i < 10; i++)
738 		data[i] = i;
739 
740 	blf_key(&c, (uint8_t *) key, 5);
741 	blf_enc(&c, data, 5);
742 	blf_dec(&c, data, 1);
743 	blf_dec(&c, data + 2, 4);
744 	printf("Should read as 0 - 9.\n");
745 	report(data, 10);
746 
747 	/* Second test */
748 	blf_key(&c, (uint8_t *) key2, strlen(key2));
749 	blf_enc(&c, data2, 1);
750 	printf("\nShould read as: 0x324ed0fe 0xf413a203.\n");
751 	report(data2, 2);
752 	blf_dec(&c, data2, 1);
753 	report(data2, 2);
754 }
755 #endif
756 /* CRYPT DELETE END */
757