xref: /openbsd/sys/crypto/blf.c (revision bde475f4)
1*bde475f4Sderaadt /*	$OpenBSD: blf.c,v 1.2 2000/06/06 06:49:46 deraadt Exp $	*/
2*bde475f4Sderaadt 
321f2d90fSderaadt /*
421f2d90fSderaadt  * Blowfish block cipher for OpenBSD
521f2d90fSderaadt  * Copyright 1997 Niels Provos <provos@physnet.uni-hamburg.de>
621f2d90fSderaadt  * All rights reserved.
721f2d90fSderaadt  *
821f2d90fSderaadt  * Implementation advice by David Mazieres <dm@lcs.mit.edu>.
921f2d90fSderaadt  *
1021f2d90fSderaadt  * Redistribution and use in source and binary forms, with or without
1121f2d90fSderaadt  * modification, are permitted provided that the following conditions
1221f2d90fSderaadt  * are met:
1321f2d90fSderaadt  * 1. Redistributions of source code must retain the above copyright
1421f2d90fSderaadt  *    notice, this list of conditions and the following disclaimer.
1521f2d90fSderaadt  * 2. Redistributions in binary form must reproduce the above copyright
1621f2d90fSderaadt  *    notice, this list of conditions and the following disclaimer in the
1721f2d90fSderaadt  *    documentation and/or other materials provided with the distribution.
1821f2d90fSderaadt  * 3. All advertising materials mentioning features or use of this software
1921f2d90fSderaadt  *    must display the following acknowledgement:
2021f2d90fSderaadt  *      This product includes software developed by Niels Provos.
2121f2d90fSderaadt  * 4. The name of the author may not be used to endorse or promote products
2221f2d90fSderaadt  *    derived from this software without specific prior written permission.
2321f2d90fSderaadt  *
2421f2d90fSderaadt  * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
2521f2d90fSderaadt  * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
2621f2d90fSderaadt  * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
2721f2d90fSderaadt  * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
2821f2d90fSderaadt  * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
2921f2d90fSderaadt  * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
3021f2d90fSderaadt  * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
3121f2d90fSderaadt  * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
3221f2d90fSderaadt  * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
3321f2d90fSderaadt  * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
3421f2d90fSderaadt  */
3521f2d90fSderaadt 
3621f2d90fSderaadt /*
3721f2d90fSderaadt  * This code is derived from section 14.3 and the given source
3821f2d90fSderaadt  * in section V of Applied Cryptography, second edition.
3921f2d90fSderaadt  * Blowfish is an unpatented fast block cipher designed by
4021f2d90fSderaadt  * Bruce Schneier.
4121f2d90fSderaadt  */
4221f2d90fSderaadt 
4321f2d90fSderaadt #include <sys/param.h>
4421f2d90fSderaadt #include <sys/systm.h>
4521f2d90fSderaadt 
4621f2d90fSderaadt #include <crypto/blf.h>
4721f2d90fSderaadt 
4821f2d90fSderaadt #undef inline
4921f2d90fSderaadt #ifdef __GNUC__
5021f2d90fSderaadt #define inline __inline
5121f2d90fSderaadt #else				/* !__GNUC__ */
5221f2d90fSderaadt #define inline
5321f2d90fSderaadt #endif				/* !__GNUC__ */
5421f2d90fSderaadt 
5521f2d90fSderaadt /* Function for Feistel Networks */
5621f2d90fSderaadt 
5721f2d90fSderaadt #define F(s, x) ((((s)[        (((x)>>24)&0xFF)]  \
5821f2d90fSderaadt 		 + (s)[0x100 + (((x)>>16)&0xFF)]) \
5921f2d90fSderaadt 		 ^ (s)[0x200 + (((x)>> 8)&0xFF)]) \
6021f2d90fSderaadt 		 + (s)[0x300 + ( (x)     &0xFF)])
6121f2d90fSderaadt 
6221f2d90fSderaadt #define BLFRND(s,p,i,j,n) (i ^= F(s,j) ^ (p)[n])
6321f2d90fSderaadt 
6421f2d90fSderaadt void
6521f2d90fSderaadt Blowfish_encipher(c, x)
6621f2d90fSderaadt 	blf_ctx *c;
6721f2d90fSderaadt 	u_int32_t *x;
6821f2d90fSderaadt {
6921f2d90fSderaadt 	u_int32_t Xl;
7021f2d90fSderaadt 	u_int32_t Xr;
7121f2d90fSderaadt 	u_int32_t *s = c->S[0];
7221f2d90fSderaadt 	u_int32_t *p = c->P;
7321f2d90fSderaadt 
7421f2d90fSderaadt 	Xl = x[0];
7521f2d90fSderaadt 	Xr = x[1];
7621f2d90fSderaadt 
7721f2d90fSderaadt 	Xl ^= p[0];
7821f2d90fSderaadt 	BLFRND(s, p, Xr, Xl, 1); BLFRND(s, p, Xl, Xr, 2);
7921f2d90fSderaadt 	BLFRND(s, p, Xr, Xl, 3); BLFRND(s, p, Xl, Xr, 4);
8021f2d90fSderaadt 	BLFRND(s, p, Xr, Xl, 5); BLFRND(s, p, Xl, Xr, 6);
8121f2d90fSderaadt 	BLFRND(s, p, Xr, Xl, 7); BLFRND(s, p, Xl, Xr, 8);
8221f2d90fSderaadt 	BLFRND(s, p, Xr, Xl, 9); BLFRND(s, p, Xl, Xr, 10);
8321f2d90fSderaadt 	BLFRND(s, p, Xr, Xl, 11); BLFRND(s, p, Xl, Xr, 12);
8421f2d90fSderaadt 	BLFRND(s, p, Xr, Xl, 13); BLFRND(s, p, Xl, Xr, 14);
8521f2d90fSderaadt 	BLFRND(s, p, Xr, Xl, 15); BLFRND(s, p, Xl, Xr, 16);
8621f2d90fSderaadt 
8721f2d90fSderaadt 	x[0] = Xr ^ p[17];
8821f2d90fSderaadt 	x[1] = Xl;
8921f2d90fSderaadt }
9021f2d90fSderaadt 
9121f2d90fSderaadt void
9221f2d90fSderaadt Blowfish_decipher(c, x)
9321f2d90fSderaadt 	blf_ctx *c;
9421f2d90fSderaadt 	u_int32_t *x;
9521f2d90fSderaadt {
9621f2d90fSderaadt 	u_int32_t Xl;
9721f2d90fSderaadt 	u_int32_t Xr;
9821f2d90fSderaadt 	u_int32_t *s = c->S[0];
9921f2d90fSderaadt 	u_int32_t *p = c->P;
10021f2d90fSderaadt 
10121f2d90fSderaadt 	Xl = x[0];
10221f2d90fSderaadt 	Xr = x[1];
10321f2d90fSderaadt 
10421f2d90fSderaadt 	Xl ^= p[17];
10521f2d90fSderaadt 	BLFRND(s, p, Xr, Xl, 16); BLFRND(s, p, Xl, Xr, 15);
10621f2d90fSderaadt 	BLFRND(s, p, Xr, Xl, 14); BLFRND(s, p, Xl, Xr, 13);
10721f2d90fSderaadt 	BLFRND(s, p, Xr, Xl, 12); BLFRND(s, p, Xl, Xr, 11);
10821f2d90fSderaadt 	BLFRND(s, p, Xr, Xl, 10); BLFRND(s, p, Xl, Xr, 9);
10921f2d90fSderaadt 	BLFRND(s, p, Xr, Xl, 8); BLFRND(s, p, Xl, Xr, 7);
11021f2d90fSderaadt 	BLFRND(s, p, Xr, Xl, 6); BLFRND(s, p, Xl, Xr, 5);
11121f2d90fSderaadt 	BLFRND(s, p, Xr, Xl, 4); BLFRND(s, p, Xl, Xr, 3);
11221f2d90fSderaadt 	BLFRND(s, p, Xr, Xl, 2); BLFRND(s, p, Xl, Xr, 1);
11321f2d90fSderaadt 
11421f2d90fSderaadt 	x[0] = Xr ^ p[0];
11521f2d90fSderaadt 	x[1] = Xl;
11621f2d90fSderaadt }
11721f2d90fSderaadt 
11821f2d90fSderaadt void
11921f2d90fSderaadt Blowfish_initstate(c)
12021f2d90fSderaadt 	blf_ctx *c;
12121f2d90fSderaadt {
12221f2d90fSderaadt 
12321f2d90fSderaadt /* P-box and S-box tables initialized with digits of Pi */
12421f2d90fSderaadt 
12521f2d90fSderaadt 	const blf_ctx initstate =
12621f2d90fSderaadt 
12721f2d90fSderaadt 	{ {
12821f2d90fSderaadt 		{
12921f2d90fSderaadt 			0xd1310ba6, 0x98dfb5ac, 0x2ffd72db, 0xd01adfb7,
13021f2d90fSderaadt 			0xb8e1afed, 0x6a267e96, 0xba7c9045, 0xf12c7f99,
13121f2d90fSderaadt 			0x24a19947, 0xb3916cf7, 0x0801f2e2, 0x858efc16,
13221f2d90fSderaadt 			0x636920d8, 0x71574e69, 0xa458fea3, 0xf4933d7e,
13321f2d90fSderaadt 			0x0d95748f, 0x728eb658, 0x718bcd58, 0x82154aee,
13421f2d90fSderaadt 			0x7b54a41d, 0xc25a59b5, 0x9c30d539, 0x2af26013,
13521f2d90fSderaadt 			0xc5d1b023, 0x286085f0, 0xca417918, 0xb8db38ef,
13621f2d90fSderaadt 			0x8e79dcb0, 0x603a180e, 0x6c9e0e8b, 0xb01e8a3e,
13721f2d90fSderaadt 			0xd71577c1, 0xbd314b27, 0x78af2fda, 0x55605c60,
13821f2d90fSderaadt 			0xe65525f3, 0xaa55ab94, 0x57489862, 0x63e81440,
13921f2d90fSderaadt 			0x55ca396a, 0x2aab10b6, 0xb4cc5c34, 0x1141e8ce,
14021f2d90fSderaadt 			0xa15486af, 0x7c72e993, 0xb3ee1411, 0x636fbc2a,
14121f2d90fSderaadt 			0x2ba9c55d, 0x741831f6, 0xce5c3e16, 0x9b87931e,
14221f2d90fSderaadt 			0xafd6ba33, 0x6c24cf5c, 0x7a325381, 0x28958677,
14321f2d90fSderaadt 			0x3b8f4898, 0x6b4bb9af, 0xc4bfe81b, 0x66282193,
14421f2d90fSderaadt 			0x61d809cc, 0xfb21a991, 0x487cac60, 0x5dec8032,
14521f2d90fSderaadt 			0xef845d5d, 0xe98575b1, 0xdc262302, 0xeb651b88,
14621f2d90fSderaadt 			0x23893e81, 0xd396acc5, 0x0f6d6ff3, 0x83f44239,
14721f2d90fSderaadt 			0x2e0b4482, 0xa4842004, 0x69c8f04a, 0x9e1f9b5e,
14821f2d90fSderaadt 			0x21c66842, 0xf6e96c9a, 0x670c9c61, 0xabd388f0,
14921f2d90fSderaadt 			0x6a51a0d2, 0xd8542f68, 0x960fa728, 0xab5133a3,
15021f2d90fSderaadt 			0x6eef0b6c, 0x137a3be4, 0xba3bf050, 0x7efb2a98,
15121f2d90fSderaadt 			0xa1f1651d, 0x39af0176, 0x66ca593e, 0x82430e88,
15221f2d90fSderaadt 			0x8cee8619, 0x456f9fb4, 0x7d84a5c3, 0x3b8b5ebe,
15321f2d90fSderaadt 			0xe06f75d8, 0x85c12073, 0x401a449f, 0x56c16aa6,
15421f2d90fSderaadt 			0x4ed3aa62, 0x363f7706, 0x1bfedf72, 0x429b023d,
15521f2d90fSderaadt 			0x37d0d724, 0xd00a1248, 0xdb0fead3, 0x49f1c09b,
15621f2d90fSderaadt 			0x075372c9, 0x80991b7b, 0x25d479d8, 0xf6e8def7,
15721f2d90fSderaadt 			0xe3fe501a, 0xb6794c3b, 0x976ce0bd, 0x04c006ba,
15821f2d90fSderaadt 			0xc1a94fb6, 0x409f60c4, 0x5e5c9ec2, 0x196a2463,
15921f2d90fSderaadt 			0x68fb6faf, 0x3e6c53b5, 0x1339b2eb, 0x3b52ec6f,
16021f2d90fSderaadt 			0x6dfc511f, 0x9b30952c, 0xcc814544, 0xaf5ebd09,
16121f2d90fSderaadt 			0xbee3d004, 0xde334afd, 0x660f2807, 0x192e4bb3,
16221f2d90fSderaadt 			0xc0cba857, 0x45c8740f, 0xd20b5f39, 0xb9d3fbdb,
16321f2d90fSderaadt 			0x5579c0bd, 0x1a60320a, 0xd6a100c6, 0x402c7279,
16421f2d90fSderaadt 			0x679f25fe, 0xfb1fa3cc, 0x8ea5e9f8, 0xdb3222f8,
16521f2d90fSderaadt 			0x3c7516df, 0xfd616b15, 0x2f501ec8, 0xad0552ab,
16621f2d90fSderaadt 			0x323db5fa, 0xfd238760, 0x53317b48, 0x3e00df82,
16721f2d90fSderaadt 			0x9e5c57bb, 0xca6f8ca0, 0x1a87562e, 0xdf1769db,
16821f2d90fSderaadt 			0xd542a8f6, 0x287effc3, 0xac6732c6, 0x8c4f5573,
16921f2d90fSderaadt 			0x695b27b0, 0xbbca58c8, 0xe1ffa35d, 0xb8f011a0,
17021f2d90fSderaadt 			0x10fa3d98, 0xfd2183b8, 0x4afcb56c, 0x2dd1d35b,
17121f2d90fSderaadt 			0x9a53e479, 0xb6f84565, 0xd28e49bc, 0x4bfb9790,
17221f2d90fSderaadt 			0xe1ddf2da, 0xa4cb7e33, 0x62fb1341, 0xcee4c6e8,
17321f2d90fSderaadt 			0xef20cada, 0x36774c01, 0xd07e9efe, 0x2bf11fb4,
17421f2d90fSderaadt 			0x95dbda4d, 0xae909198, 0xeaad8e71, 0x6b93d5a0,
17521f2d90fSderaadt 			0xd08ed1d0, 0xafc725e0, 0x8e3c5b2f, 0x8e7594b7,
17621f2d90fSderaadt 			0x8ff6e2fb, 0xf2122b64, 0x8888b812, 0x900df01c,
17721f2d90fSderaadt 			0x4fad5ea0, 0x688fc31c, 0xd1cff191, 0xb3a8c1ad,
17821f2d90fSderaadt 			0x2f2f2218, 0xbe0e1777, 0xea752dfe, 0x8b021fa1,
17921f2d90fSderaadt 			0xe5a0cc0f, 0xb56f74e8, 0x18acf3d6, 0xce89e299,
18021f2d90fSderaadt 			0xb4a84fe0, 0xfd13e0b7, 0x7cc43b81, 0xd2ada8d9,
18121f2d90fSderaadt 			0x165fa266, 0x80957705, 0x93cc7314, 0x211a1477,
18221f2d90fSderaadt 			0xe6ad2065, 0x77b5fa86, 0xc75442f5, 0xfb9d35cf,
18321f2d90fSderaadt 			0xebcdaf0c, 0x7b3e89a0, 0xd6411bd3, 0xae1e7e49,
18421f2d90fSderaadt 			0x00250e2d, 0x2071b35e, 0x226800bb, 0x57b8e0af,
18521f2d90fSderaadt 			0x2464369b, 0xf009b91e, 0x5563911d, 0x59dfa6aa,
18621f2d90fSderaadt 			0x78c14389, 0xd95a537f, 0x207d5ba2, 0x02e5b9c5,
18721f2d90fSderaadt 			0x83260376, 0x6295cfa9, 0x11c81968, 0x4e734a41,
18821f2d90fSderaadt 			0xb3472dca, 0x7b14a94a, 0x1b510052, 0x9a532915,
18921f2d90fSderaadt 			0xd60f573f, 0xbc9bc6e4, 0x2b60a476, 0x81e67400,
19021f2d90fSderaadt 			0x08ba6fb5, 0x571be91f, 0xf296ec6b, 0x2a0dd915,
19121f2d90fSderaadt 			0xb6636521, 0xe7b9f9b6, 0xff34052e, 0xc5855664,
19221f2d90fSderaadt 		0x53b02d5d, 0xa99f8fa1, 0x08ba4799, 0x6e85076a},
19321f2d90fSderaadt 		{
19421f2d90fSderaadt 			0x4b7a70e9, 0xb5b32944, 0xdb75092e, 0xc4192623,
19521f2d90fSderaadt 			0xad6ea6b0, 0x49a7df7d, 0x9cee60b8, 0x8fedb266,
19621f2d90fSderaadt 			0xecaa8c71, 0x699a17ff, 0x5664526c, 0xc2b19ee1,
19721f2d90fSderaadt 			0x193602a5, 0x75094c29, 0xa0591340, 0xe4183a3e,
19821f2d90fSderaadt 			0x3f54989a, 0x5b429d65, 0x6b8fe4d6, 0x99f73fd6,
19921f2d90fSderaadt 			0xa1d29c07, 0xefe830f5, 0x4d2d38e6, 0xf0255dc1,
20021f2d90fSderaadt 			0x4cdd2086, 0x8470eb26, 0x6382e9c6, 0x021ecc5e,
20121f2d90fSderaadt 			0x09686b3f, 0x3ebaefc9, 0x3c971814, 0x6b6a70a1,
20221f2d90fSderaadt 			0x687f3584, 0x52a0e286, 0xb79c5305, 0xaa500737,
20321f2d90fSderaadt 			0x3e07841c, 0x7fdeae5c, 0x8e7d44ec, 0x5716f2b8,
20421f2d90fSderaadt 			0xb03ada37, 0xf0500c0d, 0xf01c1f04, 0x0200b3ff,
20521f2d90fSderaadt 			0xae0cf51a, 0x3cb574b2, 0x25837a58, 0xdc0921bd,
20621f2d90fSderaadt 			0xd19113f9, 0x7ca92ff6, 0x94324773, 0x22f54701,
20721f2d90fSderaadt 			0x3ae5e581, 0x37c2dadc, 0xc8b57634, 0x9af3dda7,
20821f2d90fSderaadt 			0xa9446146, 0x0fd0030e, 0xecc8c73e, 0xa4751e41,
20921f2d90fSderaadt 			0xe238cd99, 0x3bea0e2f, 0x3280bba1, 0x183eb331,
21021f2d90fSderaadt 			0x4e548b38, 0x4f6db908, 0x6f420d03, 0xf60a04bf,
21121f2d90fSderaadt 			0x2cb81290, 0x24977c79, 0x5679b072, 0xbcaf89af,
21221f2d90fSderaadt 			0xde9a771f, 0xd9930810, 0xb38bae12, 0xdccf3f2e,
21321f2d90fSderaadt 			0x5512721f, 0x2e6b7124, 0x501adde6, 0x9f84cd87,
21421f2d90fSderaadt 			0x7a584718, 0x7408da17, 0xbc9f9abc, 0xe94b7d8c,
21521f2d90fSderaadt 			0xec7aec3a, 0xdb851dfa, 0x63094366, 0xc464c3d2,
21621f2d90fSderaadt 			0xef1c1847, 0x3215d908, 0xdd433b37, 0x24c2ba16,
21721f2d90fSderaadt 			0x12a14d43, 0x2a65c451, 0x50940002, 0x133ae4dd,
21821f2d90fSderaadt 			0x71dff89e, 0x10314e55, 0x81ac77d6, 0x5f11199b,
21921f2d90fSderaadt 			0x043556f1, 0xd7a3c76b, 0x3c11183b, 0x5924a509,
22021f2d90fSderaadt 			0xf28fe6ed, 0x97f1fbfa, 0x9ebabf2c, 0x1e153c6e,
22121f2d90fSderaadt 			0x86e34570, 0xeae96fb1, 0x860e5e0a, 0x5a3e2ab3,
22221f2d90fSderaadt 			0x771fe71c, 0x4e3d06fa, 0x2965dcb9, 0x99e71d0f,
22321f2d90fSderaadt 			0x803e89d6, 0x5266c825, 0x2e4cc978, 0x9c10b36a,
22421f2d90fSderaadt 			0xc6150eba, 0x94e2ea78, 0xa5fc3c53, 0x1e0a2df4,
22521f2d90fSderaadt 			0xf2f74ea7, 0x361d2b3d, 0x1939260f, 0x19c27960,
22621f2d90fSderaadt 			0x5223a708, 0xf71312b6, 0xebadfe6e, 0xeac31f66,
22721f2d90fSderaadt 			0xe3bc4595, 0xa67bc883, 0xb17f37d1, 0x018cff28,
22821f2d90fSderaadt 			0xc332ddef, 0xbe6c5aa5, 0x65582185, 0x68ab9802,
22921f2d90fSderaadt 			0xeecea50f, 0xdb2f953b, 0x2aef7dad, 0x5b6e2f84,
23021f2d90fSderaadt 			0x1521b628, 0x29076170, 0xecdd4775, 0x619f1510,
23121f2d90fSderaadt 			0x13cca830, 0xeb61bd96, 0x0334fe1e, 0xaa0363cf,
23221f2d90fSderaadt 			0xb5735c90, 0x4c70a239, 0xd59e9e0b, 0xcbaade14,
23321f2d90fSderaadt 			0xeecc86bc, 0x60622ca7, 0x9cab5cab, 0xb2f3846e,
23421f2d90fSderaadt 			0x648b1eaf, 0x19bdf0ca, 0xa02369b9, 0x655abb50,
23521f2d90fSderaadt 			0x40685a32, 0x3c2ab4b3, 0x319ee9d5, 0xc021b8f7,
23621f2d90fSderaadt 			0x9b540b19, 0x875fa099, 0x95f7997e, 0x623d7da8,
23721f2d90fSderaadt 			0xf837889a, 0x97e32d77, 0x11ed935f, 0x16681281,
23821f2d90fSderaadt 			0x0e358829, 0xc7e61fd6, 0x96dedfa1, 0x7858ba99,
23921f2d90fSderaadt 			0x57f584a5, 0x1b227263, 0x9b83c3ff, 0x1ac24696,
24021f2d90fSderaadt 			0xcdb30aeb, 0x532e3054, 0x8fd948e4, 0x6dbc3128,
24121f2d90fSderaadt 			0x58ebf2ef, 0x34c6ffea, 0xfe28ed61, 0xee7c3c73,
24221f2d90fSderaadt 			0x5d4a14d9, 0xe864b7e3, 0x42105d14, 0x203e13e0,
24321f2d90fSderaadt 			0x45eee2b6, 0xa3aaabea, 0xdb6c4f15, 0xfacb4fd0,
24421f2d90fSderaadt 			0xc742f442, 0xef6abbb5, 0x654f3b1d, 0x41cd2105,
24521f2d90fSderaadt 			0xd81e799e, 0x86854dc7, 0xe44b476a, 0x3d816250,
24621f2d90fSderaadt 			0xcf62a1f2, 0x5b8d2646, 0xfc8883a0, 0xc1c7b6a3,
24721f2d90fSderaadt 			0x7f1524c3, 0x69cb7492, 0x47848a0b, 0x5692b285,
24821f2d90fSderaadt 			0x095bbf00, 0xad19489d, 0x1462b174, 0x23820e00,
24921f2d90fSderaadt 			0x58428d2a, 0x0c55f5ea, 0x1dadf43e, 0x233f7061,
25021f2d90fSderaadt 			0x3372f092, 0x8d937e41, 0xd65fecf1, 0x6c223bdb,
25121f2d90fSderaadt 			0x7cde3759, 0xcbee7460, 0x4085f2a7, 0xce77326e,
25221f2d90fSderaadt 			0xa6078084, 0x19f8509e, 0xe8efd855, 0x61d99735,
25321f2d90fSderaadt 			0xa969a7aa, 0xc50c06c2, 0x5a04abfc, 0x800bcadc,
25421f2d90fSderaadt 			0x9e447a2e, 0xc3453484, 0xfdd56705, 0x0e1e9ec9,
25521f2d90fSderaadt 			0xdb73dbd3, 0x105588cd, 0x675fda79, 0xe3674340,
25621f2d90fSderaadt 			0xc5c43465, 0x713e38d8, 0x3d28f89e, 0xf16dff20,
25721f2d90fSderaadt 		0x153e21e7, 0x8fb03d4a, 0xe6e39f2b, 0xdb83adf7},
25821f2d90fSderaadt 		{
25921f2d90fSderaadt 			0xe93d5a68, 0x948140f7, 0xf64c261c, 0x94692934,
26021f2d90fSderaadt 			0x411520f7, 0x7602d4f7, 0xbcf46b2e, 0xd4a20068,
26121f2d90fSderaadt 			0xd4082471, 0x3320f46a, 0x43b7d4b7, 0x500061af,
26221f2d90fSderaadt 			0x1e39f62e, 0x97244546, 0x14214f74, 0xbf8b8840,
26321f2d90fSderaadt 			0x4d95fc1d, 0x96b591af, 0x70f4ddd3, 0x66a02f45,
26421f2d90fSderaadt 			0xbfbc09ec, 0x03bd9785, 0x7fac6dd0, 0x31cb8504,
26521f2d90fSderaadt 			0x96eb27b3, 0x55fd3941, 0xda2547e6, 0xabca0a9a,
26621f2d90fSderaadt 			0x28507825, 0x530429f4, 0x0a2c86da, 0xe9b66dfb,
26721f2d90fSderaadt 			0x68dc1462, 0xd7486900, 0x680ec0a4, 0x27a18dee,
26821f2d90fSderaadt 			0x4f3ffea2, 0xe887ad8c, 0xb58ce006, 0x7af4d6b6,
26921f2d90fSderaadt 			0xaace1e7c, 0xd3375fec, 0xce78a399, 0x406b2a42,
27021f2d90fSderaadt 			0x20fe9e35, 0xd9f385b9, 0xee39d7ab, 0x3b124e8b,
27121f2d90fSderaadt 			0x1dc9faf7, 0x4b6d1856, 0x26a36631, 0xeae397b2,
27221f2d90fSderaadt 			0x3a6efa74, 0xdd5b4332, 0x6841e7f7, 0xca7820fb,
27321f2d90fSderaadt 			0xfb0af54e, 0xd8feb397, 0x454056ac, 0xba489527,
27421f2d90fSderaadt 			0x55533a3a, 0x20838d87, 0xfe6ba9b7, 0xd096954b,
27521f2d90fSderaadt 			0x55a867bc, 0xa1159a58, 0xcca92963, 0x99e1db33,
27621f2d90fSderaadt 			0xa62a4a56, 0x3f3125f9, 0x5ef47e1c, 0x9029317c,
27721f2d90fSderaadt 			0xfdf8e802, 0x04272f70, 0x80bb155c, 0x05282ce3,
27821f2d90fSderaadt 			0x95c11548, 0xe4c66d22, 0x48c1133f, 0xc70f86dc,
27921f2d90fSderaadt 			0x07f9c9ee, 0x41041f0f, 0x404779a4, 0x5d886e17,
28021f2d90fSderaadt 			0x325f51eb, 0xd59bc0d1, 0xf2bcc18f, 0x41113564,
28121f2d90fSderaadt 			0x257b7834, 0x602a9c60, 0xdff8e8a3, 0x1f636c1b,
28221f2d90fSderaadt 			0x0e12b4c2, 0x02e1329e, 0xaf664fd1, 0xcad18115,
28321f2d90fSderaadt 			0x6b2395e0, 0x333e92e1, 0x3b240b62, 0xeebeb922,
28421f2d90fSderaadt 			0x85b2a20e, 0xe6ba0d99, 0xde720c8c, 0x2da2f728,
28521f2d90fSderaadt 			0xd0127845, 0x95b794fd, 0x647d0862, 0xe7ccf5f0,
28621f2d90fSderaadt 			0x5449a36f, 0x877d48fa, 0xc39dfd27, 0xf33e8d1e,
28721f2d90fSderaadt 			0x0a476341, 0x992eff74, 0x3a6f6eab, 0xf4f8fd37,
28821f2d90fSderaadt 			0xa812dc60, 0xa1ebddf8, 0x991be14c, 0xdb6e6b0d,
28921f2d90fSderaadt 			0xc67b5510, 0x6d672c37, 0x2765d43b, 0xdcd0e804,
29021f2d90fSderaadt 			0xf1290dc7, 0xcc00ffa3, 0xb5390f92, 0x690fed0b,
29121f2d90fSderaadt 			0x667b9ffb, 0xcedb7d9c, 0xa091cf0b, 0xd9155ea3,
29221f2d90fSderaadt 			0xbb132f88, 0x515bad24, 0x7b9479bf, 0x763bd6eb,
29321f2d90fSderaadt 			0x37392eb3, 0xcc115979, 0x8026e297, 0xf42e312d,
29421f2d90fSderaadt 			0x6842ada7, 0xc66a2b3b, 0x12754ccc, 0x782ef11c,
29521f2d90fSderaadt 			0x6a124237, 0xb79251e7, 0x06a1bbe6, 0x4bfb6350,
29621f2d90fSderaadt 			0x1a6b1018, 0x11caedfa, 0x3d25bdd8, 0xe2e1c3c9,
29721f2d90fSderaadt 			0x44421659, 0x0a121386, 0xd90cec6e, 0xd5abea2a,
29821f2d90fSderaadt 			0x64af674e, 0xda86a85f, 0xbebfe988, 0x64e4c3fe,
29921f2d90fSderaadt 			0x9dbc8057, 0xf0f7c086, 0x60787bf8, 0x6003604d,
30021f2d90fSderaadt 			0xd1fd8346, 0xf6381fb0, 0x7745ae04, 0xd736fccc,
30121f2d90fSderaadt 			0x83426b33, 0xf01eab71, 0xb0804187, 0x3c005e5f,
30221f2d90fSderaadt 			0x77a057be, 0xbde8ae24, 0x55464299, 0xbf582e61,
30321f2d90fSderaadt 			0x4e58f48f, 0xf2ddfda2, 0xf474ef38, 0x8789bdc2,
30421f2d90fSderaadt 			0x5366f9c3, 0xc8b38e74, 0xb475f255, 0x46fcd9b9,
30521f2d90fSderaadt 			0x7aeb2661, 0x8b1ddf84, 0x846a0e79, 0x915f95e2,
30621f2d90fSderaadt 			0x466e598e, 0x20b45770, 0x8cd55591, 0xc902de4c,
30721f2d90fSderaadt 			0xb90bace1, 0xbb8205d0, 0x11a86248, 0x7574a99e,
30821f2d90fSderaadt 			0xb77f19b6, 0xe0a9dc09, 0x662d09a1, 0xc4324633,
30921f2d90fSderaadt 			0xe85a1f02, 0x09f0be8c, 0x4a99a025, 0x1d6efe10,
31021f2d90fSderaadt 			0x1ab93d1d, 0x0ba5a4df, 0xa186f20f, 0x2868f169,
31121f2d90fSderaadt 			0xdcb7da83, 0x573906fe, 0xa1e2ce9b, 0x4fcd7f52,
31221f2d90fSderaadt 			0x50115e01, 0xa70683fa, 0xa002b5c4, 0x0de6d027,
31321f2d90fSderaadt 			0x9af88c27, 0x773f8641, 0xc3604c06, 0x61a806b5,
31421f2d90fSderaadt 			0xf0177a28, 0xc0f586e0, 0x006058aa, 0x30dc7d62,
31521f2d90fSderaadt 			0x11e69ed7, 0x2338ea63, 0x53c2dd94, 0xc2c21634,
31621f2d90fSderaadt 			0xbbcbee56, 0x90bcb6de, 0xebfc7da1, 0xce591d76,
31721f2d90fSderaadt 			0x6f05e409, 0x4b7c0188, 0x39720a3d, 0x7c927c24,
31821f2d90fSderaadt 			0x86e3725f, 0x724d9db9, 0x1ac15bb4, 0xd39eb8fc,
31921f2d90fSderaadt 			0xed545578, 0x08fca5b5, 0xd83d7cd3, 0x4dad0fc4,
32021f2d90fSderaadt 			0x1e50ef5e, 0xb161e6f8, 0xa28514d9, 0x6c51133c,
32121f2d90fSderaadt 			0x6fd5c7e7, 0x56e14ec4, 0x362abfce, 0xddc6c837,
32221f2d90fSderaadt 		0xd79a3234, 0x92638212, 0x670efa8e, 0x406000e0},
32321f2d90fSderaadt 		{
32421f2d90fSderaadt 			0x3a39ce37, 0xd3faf5cf, 0xabc27737, 0x5ac52d1b,
32521f2d90fSderaadt 			0x5cb0679e, 0x4fa33742, 0xd3822740, 0x99bc9bbe,
32621f2d90fSderaadt 			0xd5118e9d, 0xbf0f7315, 0xd62d1c7e, 0xc700c47b,
32721f2d90fSderaadt 			0xb78c1b6b, 0x21a19045, 0xb26eb1be, 0x6a366eb4,
32821f2d90fSderaadt 			0x5748ab2f, 0xbc946e79, 0xc6a376d2, 0x6549c2c8,
32921f2d90fSderaadt 			0x530ff8ee, 0x468dde7d, 0xd5730a1d, 0x4cd04dc6,
33021f2d90fSderaadt 			0x2939bbdb, 0xa9ba4650, 0xac9526e8, 0xbe5ee304,
33121f2d90fSderaadt 			0xa1fad5f0, 0x6a2d519a, 0x63ef8ce2, 0x9a86ee22,
33221f2d90fSderaadt 			0xc089c2b8, 0x43242ef6, 0xa51e03aa, 0x9cf2d0a4,
33321f2d90fSderaadt 			0x83c061ba, 0x9be96a4d, 0x8fe51550, 0xba645bd6,
33421f2d90fSderaadt 			0x2826a2f9, 0xa73a3ae1, 0x4ba99586, 0xef5562e9,
33521f2d90fSderaadt 			0xc72fefd3, 0xf752f7da, 0x3f046f69, 0x77fa0a59,
33621f2d90fSderaadt 			0x80e4a915, 0x87b08601, 0x9b09e6ad, 0x3b3ee593,
33721f2d90fSderaadt 			0xe990fd5a, 0x9e34d797, 0x2cf0b7d9, 0x022b8b51,
33821f2d90fSderaadt 			0x96d5ac3a, 0x017da67d, 0xd1cf3ed6, 0x7c7d2d28,
33921f2d90fSderaadt 			0x1f9f25cf, 0xadf2b89b, 0x5ad6b472, 0x5a88f54c,
34021f2d90fSderaadt 			0xe029ac71, 0xe019a5e6, 0x47b0acfd, 0xed93fa9b,
34121f2d90fSderaadt 			0xe8d3c48d, 0x283b57cc, 0xf8d56629, 0x79132e28,
34221f2d90fSderaadt 			0x785f0191, 0xed756055, 0xf7960e44, 0xe3d35e8c,
34321f2d90fSderaadt 			0x15056dd4, 0x88f46dba, 0x03a16125, 0x0564f0bd,
34421f2d90fSderaadt 			0xc3eb9e15, 0x3c9057a2, 0x97271aec, 0xa93a072a,
34521f2d90fSderaadt 			0x1b3f6d9b, 0x1e6321f5, 0xf59c66fb, 0x26dcf319,
34621f2d90fSderaadt 			0x7533d928, 0xb155fdf5, 0x03563482, 0x8aba3cbb,
34721f2d90fSderaadt 			0x28517711, 0xc20ad9f8, 0xabcc5167, 0xccad925f,
34821f2d90fSderaadt 			0x4de81751, 0x3830dc8e, 0x379d5862, 0x9320f991,
34921f2d90fSderaadt 			0xea7a90c2, 0xfb3e7bce, 0x5121ce64, 0x774fbe32,
35021f2d90fSderaadt 			0xa8b6e37e, 0xc3293d46, 0x48de5369, 0x6413e680,
35121f2d90fSderaadt 			0xa2ae0810, 0xdd6db224, 0x69852dfd, 0x09072166,
35221f2d90fSderaadt 			0xb39a460a, 0x6445c0dd, 0x586cdecf, 0x1c20c8ae,
35321f2d90fSderaadt 			0x5bbef7dd, 0x1b588d40, 0xccd2017f, 0x6bb4e3bb,
35421f2d90fSderaadt 			0xdda26a7e, 0x3a59ff45, 0x3e350a44, 0xbcb4cdd5,
35521f2d90fSderaadt 			0x72eacea8, 0xfa6484bb, 0x8d6612ae, 0xbf3c6f47,
35621f2d90fSderaadt 			0xd29be463, 0x542f5d9e, 0xaec2771b, 0xf64e6370,
35721f2d90fSderaadt 			0x740e0d8d, 0xe75b1357, 0xf8721671, 0xaf537d5d,
35821f2d90fSderaadt 			0x4040cb08, 0x4eb4e2cc, 0x34d2466a, 0x0115af84,
35921f2d90fSderaadt 			0xe1b00428, 0x95983a1d, 0x06b89fb4, 0xce6ea048,
36021f2d90fSderaadt 			0x6f3f3b82, 0x3520ab82, 0x011a1d4b, 0x277227f8,
36121f2d90fSderaadt 			0x611560b1, 0xe7933fdc, 0xbb3a792b, 0x344525bd,
36221f2d90fSderaadt 			0xa08839e1, 0x51ce794b, 0x2f32c9b7, 0xa01fbac9,
36321f2d90fSderaadt 			0xe01cc87e, 0xbcc7d1f6, 0xcf0111c3, 0xa1e8aac7,
36421f2d90fSderaadt 			0x1a908749, 0xd44fbd9a, 0xd0dadecb, 0xd50ada38,
36521f2d90fSderaadt 			0x0339c32a, 0xc6913667, 0x8df9317c, 0xe0b12b4f,
36621f2d90fSderaadt 			0xf79e59b7, 0x43f5bb3a, 0xf2d519ff, 0x27d9459c,
36721f2d90fSderaadt 			0xbf97222c, 0x15e6fc2a, 0x0f91fc71, 0x9b941525,
36821f2d90fSderaadt 			0xfae59361, 0xceb69ceb, 0xc2a86459, 0x12baa8d1,
36921f2d90fSderaadt 			0xb6c1075e, 0xe3056a0c, 0x10d25065, 0xcb03a442,
37021f2d90fSderaadt 			0xe0ec6e0e, 0x1698db3b, 0x4c98a0be, 0x3278e964,
37121f2d90fSderaadt 			0x9f1f9532, 0xe0d392df, 0xd3a0342b, 0x8971f21e,
37221f2d90fSderaadt 			0x1b0a7441, 0x4ba3348c, 0xc5be7120, 0xc37632d8,
37321f2d90fSderaadt 			0xdf359f8d, 0x9b992f2e, 0xe60b6f47, 0x0fe3f11d,
37421f2d90fSderaadt 			0xe54cda54, 0x1edad891, 0xce6279cf, 0xcd3e7e6f,
37521f2d90fSderaadt 			0x1618b166, 0xfd2c1d05, 0x848fd2c5, 0xf6fb2299,
37621f2d90fSderaadt 			0xf523f357, 0xa6327623, 0x93a83531, 0x56cccd02,
37721f2d90fSderaadt 			0xacf08162, 0x5a75ebb5, 0x6e163697, 0x88d273cc,
37821f2d90fSderaadt 			0xde966292, 0x81b949d0, 0x4c50901b, 0x71c65614,
37921f2d90fSderaadt 			0xe6c6c7bd, 0x327a140a, 0x45e1d006, 0xc3f27b9a,
38021f2d90fSderaadt 			0xc9aa53fd, 0x62a80f00, 0xbb25bfe2, 0x35bdd2f6,
38121f2d90fSderaadt 			0x71126905, 0xb2040222, 0xb6cbcf7c, 0xcd769c2b,
38221f2d90fSderaadt 			0x53113ec0, 0x1640e3d3, 0x38abbd60, 0x2547adf0,
38321f2d90fSderaadt 			0xba38209c, 0xf746ce76, 0x77afa1c5, 0x20756060,
38421f2d90fSderaadt 			0x85cbfe4e, 0x8ae88dd8, 0x7aaaf9b0, 0x4cf9aa7e,
38521f2d90fSderaadt 			0x1948c25c, 0x02fb8a8c, 0x01c36ae4, 0xd6ebe1f9,
38621f2d90fSderaadt 			0x90d4f869, 0xa65cdea0, 0x3f09252d, 0xc208e69f,
38721f2d90fSderaadt 		0xb74e6132, 0xce77e25b, 0x578fdfe3, 0x3ac372e6}
38821f2d90fSderaadt 	},
38921f2d90fSderaadt 	{
39021f2d90fSderaadt 		0x243f6a88, 0x85a308d3, 0x13198a2e, 0x03707344,
39121f2d90fSderaadt 		0xa4093822, 0x299f31d0, 0x082efa98, 0xec4e6c89,
39221f2d90fSderaadt 		0x452821e6, 0x38d01377, 0xbe5466cf, 0x34e90c6c,
39321f2d90fSderaadt 		0xc0ac29b7, 0xc97c50dd, 0x3f84d5b5, 0xb5470917,
39421f2d90fSderaadt 		0x9216d5d9, 0x8979fb1b
39521f2d90fSderaadt 	} };
39621f2d90fSderaadt 
39721f2d90fSderaadt 	*c = initstate;
39821f2d90fSderaadt 
39921f2d90fSderaadt }
40021f2d90fSderaadt 
40121f2d90fSderaadt #ifdef __STDC__
40221f2d90fSderaadt u_int32_t
40321f2d90fSderaadt Blowfish_stream2word(const u_int8_t *data, u_int16_t databytes, u_int16_t *current)
40421f2d90fSderaadt #else
40521f2d90fSderaadt u_int32_t
40621f2d90fSderaadt Blowfish_stream2word(data, databytes, current)
40721f2d90fSderaadt 	const u_int8_t *data;
40821f2d90fSderaadt 	u_int16_t databytes;
40921f2d90fSderaadt 	u_int16_t *current;
41021f2d90fSderaadt #endif
41121f2d90fSderaadt {
41221f2d90fSderaadt 	u_int8_t i;
41321f2d90fSderaadt 	u_int16_t j;
41421f2d90fSderaadt 	u_int32_t temp;
41521f2d90fSderaadt 
41621f2d90fSderaadt 	temp = 0x00000000;
41721f2d90fSderaadt 	j = *current;
41821f2d90fSderaadt 
41921f2d90fSderaadt 	for (i = 0; i < 4; i++, j++) {
42021f2d90fSderaadt 		if (j >= databytes)
42121f2d90fSderaadt 			j = 0;
42221f2d90fSderaadt 		temp = (temp << 8) | data[j];
42321f2d90fSderaadt 	}
42421f2d90fSderaadt 
42521f2d90fSderaadt 	*current = j;
42621f2d90fSderaadt 	return temp;
42721f2d90fSderaadt }
42821f2d90fSderaadt 
42921f2d90fSderaadt #if __STDC__
43021f2d90fSderaadt void
43121f2d90fSderaadt Blowfish_expand0state(blf_ctx *c, const u_int8_t *key, u_int16_t keybytes)
43221f2d90fSderaadt #else
43321f2d90fSderaadt void
43421f2d90fSderaadt Blowfish_expand0state(c, key, keybytes)
43521f2d90fSderaadt 	blf_ctx *c;
43621f2d90fSderaadt 	const u_int8_t *key;
43721f2d90fSderaadt 	u_int16_t keybytes;
43821f2d90fSderaadt #endif
43921f2d90fSderaadt {
44021f2d90fSderaadt 	u_int16_t i;
44121f2d90fSderaadt 	u_int16_t j;
44221f2d90fSderaadt 	u_int16_t k;
44321f2d90fSderaadt 	u_int32_t temp;
44421f2d90fSderaadt 	u_int32_t data[2];
44521f2d90fSderaadt 
44621f2d90fSderaadt 	j = 0;
44721f2d90fSderaadt 	for (i = 0; i < BLF_N + 2; i++) {
44821f2d90fSderaadt 		/* Extract 4 int8 to 1 int32 from keystream */
44921f2d90fSderaadt 		temp = Blowfish_stream2word(key, keybytes, &j);
45021f2d90fSderaadt 		c->P[i] = c->P[i] ^ temp;
45121f2d90fSderaadt 	}
45221f2d90fSderaadt 
45321f2d90fSderaadt 	j = 0;
45421f2d90fSderaadt 	data[0] = 0x00000000;
45521f2d90fSderaadt 	data[1] = 0x00000000;
45621f2d90fSderaadt 	for (i = 0; i < BLF_N + 2; i += 2) {
45721f2d90fSderaadt 		Blowfish_encipher(c, data);
45821f2d90fSderaadt 
45921f2d90fSderaadt 		c->P[i] = data[0];
46021f2d90fSderaadt 		c->P[i + 1] = data[1];
46121f2d90fSderaadt 	}
46221f2d90fSderaadt 
46321f2d90fSderaadt 	for (i = 0; i < 4; i++) {
46421f2d90fSderaadt 		for (k = 0; k < 256; k += 2) {
46521f2d90fSderaadt 			Blowfish_encipher(c, data);
46621f2d90fSderaadt 
46721f2d90fSderaadt 			c->S[i][k] = data[0];
46821f2d90fSderaadt 			c->S[i][k + 1] = data[1];
46921f2d90fSderaadt 		}
47021f2d90fSderaadt 	}
47121f2d90fSderaadt }
47221f2d90fSderaadt 
47321f2d90fSderaadt 
47421f2d90fSderaadt #if __STDC__
47521f2d90fSderaadt void
47621f2d90fSderaadt Blowfish_expandstate(blf_ctx *c, const u_int8_t *data, u_int16_t databytes,
47721f2d90fSderaadt 		     const u_int8_t *key, u_int16_t keybytes)
47821f2d90fSderaadt #else
47921f2d90fSderaadt void
48021f2d90fSderaadt Blowfish_expandstate(c, data, databytes, key, keybytes)
48121f2d90fSderaadt 	blf_ctx *c;
48221f2d90fSderaadt 	const u_int8_t *data;
48321f2d90fSderaadt 	u_int16_t databytes;
48421f2d90fSderaadt 	const u_int8_t *key;
48521f2d90fSderaadt 	u_int16_t keybytes;
48621f2d90fSderaadt #endif
48721f2d90fSderaadt {
48821f2d90fSderaadt 	u_int16_t i;
48921f2d90fSderaadt 	u_int16_t j;
49021f2d90fSderaadt 	u_int16_t k;
49121f2d90fSderaadt 	u_int32_t temp;
49221f2d90fSderaadt 	u_int32_t d[2];
49321f2d90fSderaadt 
49421f2d90fSderaadt 	j = 0;
49521f2d90fSderaadt 	for (i = 0; i < BLF_N + 2; i++) {
49621f2d90fSderaadt 		/* Extract 4 int8 to 1 int32 from keystream */
49721f2d90fSderaadt 		temp = Blowfish_stream2word(key, keybytes, &j);
49821f2d90fSderaadt 		c->P[i] = c->P[i] ^ temp;
49921f2d90fSderaadt 	}
50021f2d90fSderaadt 
50121f2d90fSderaadt 	j = 0;
50221f2d90fSderaadt 	d[0] = 0x00000000;
50321f2d90fSderaadt 	d[1] = 0x00000000;
50421f2d90fSderaadt 	for (i = 0; i < BLF_N + 2; i += 2) {
50521f2d90fSderaadt 		d[0] ^= Blowfish_stream2word(data, databytes, &j);
50621f2d90fSderaadt 		d[1] ^= Blowfish_stream2word(data, databytes, &j);
50721f2d90fSderaadt 		Blowfish_encipher(c, d);
50821f2d90fSderaadt 
50921f2d90fSderaadt 		c->P[i] = d[0];
51021f2d90fSderaadt 		c->P[i + 1] = d[1];
51121f2d90fSderaadt 	}
51221f2d90fSderaadt 
51321f2d90fSderaadt 	for (i = 0; i < 4; i++) {
51421f2d90fSderaadt 		for (k = 0; k < 256; k += 2) {
51521f2d90fSderaadt 			d[0]^= Blowfish_stream2word(data, databytes, &j);
51621f2d90fSderaadt 			d[1] ^= Blowfish_stream2word(data, databytes, &j);
51721f2d90fSderaadt 			Blowfish_encipher(c, d);
51821f2d90fSderaadt 
51921f2d90fSderaadt 			c->S[i][k] = d[0];
52021f2d90fSderaadt 			c->S[i][k + 1] = d[1];
52121f2d90fSderaadt 		}
52221f2d90fSderaadt 	}
52321f2d90fSderaadt 
52421f2d90fSderaadt }
52521f2d90fSderaadt 
52621f2d90fSderaadt #if __STDC__
52721f2d90fSderaadt void
52821f2d90fSderaadt blf_key(blf_ctx *c, const u_int8_t *k, u_int16_t len)
52921f2d90fSderaadt #else
53021f2d90fSderaadt void
53121f2d90fSderaadt blf_key(c, k, len)
53221f2d90fSderaadt 	blf_ctx *c;
53321f2d90fSderaadt 	const u_int8_t *k;
53421f2d90fSderaadt 	u_int16_t len;
53521f2d90fSderaadt #endif
53621f2d90fSderaadt {
53721f2d90fSderaadt 	/* Initalize S-boxes and subkeys with Pi */
53821f2d90fSderaadt 	Blowfish_initstate(c);
53921f2d90fSderaadt 
54021f2d90fSderaadt 	/* Transform S-boxes and subkeys with key */
54121f2d90fSderaadt 	Blowfish_expand0state(c, k, len);
54221f2d90fSderaadt }
54321f2d90fSderaadt 
54421f2d90fSderaadt #if __STDC__
54521f2d90fSderaadt void
54621f2d90fSderaadt blf_enc(blf_ctx *c, u_int32_t *data, u_int16_t blocks)
54721f2d90fSderaadt #else
54821f2d90fSderaadt void
54921f2d90fSderaadt blf_enc(c, data, blocks)
55021f2d90fSderaadt 	blf_ctx *c;
55121f2d90fSderaadt 	u_int32_t *data;
55221f2d90fSderaadt 	u_int16_t blocks;
55321f2d90fSderaadt #endif
55421f2d90fSderaadt {
55521f2d90fSderaadt 	u_int32_t *d;
55621f2d90fSderaadt 	u_int16_t i;
55721f2d90fSderaadt 
55821f2d90fSderaadt 	d = data;
55921f2d90fSderaadt 	for (i = 0; i < blocks; i++) {
56021f2d90fSderaadt 		Blowfish_encipher(c, d);
56121f2d90fSderaadt 		d += 2;
56221f2d90fSderaadt 	}
56321f2d90fSderaadt }
56421f2d90fSderaadt 
56521f2d90fSderaadt #if __STDC__
56621f2d90fSderaadt void
56721f2d90fSderaadt blf_dec(blf_ctx *c, u_int32_t *data, u_int16_t blocks)
56821f2d90fSderaadt #else
56921f2d90fSderaadt void
57021f2d90fSderaadt blf_dec(c, data, blocks)
57121f2d90fSderaadt 	blf_ctx *c;
57221f2d90fSderaadt 	u_int32_t *data;
57321f2d90fSderaadt 	u_int16_t blocks;
57421f2d90fSderaadt #endif
57521f2d90fSderaadt {
57621f2d90fSderaadt 	u_int32_t *d;
57721f2d90fSderaadt 	u_int16_t i;
57821f2d90fSderaadt 
57921f2d90fSderaadt 	d = data;
58021f2d90fSderaadt 	for (i = 0; i < blocks; i++) {
58121f2d90fSderaadt 		Blowfish_decipher(c, d);
58221f2d90fSderaadt 		d += 2;
58321f2d90fSderaadt 	}
58421f2d90fSderaadt }
58521f2d90fSderaadt 
58621f2d90fSderaadt #if __STDC__
58721f2d90fSderaadt void
58821f2d90fSderaadt blf_ecb_encrypt(blf_ctx *c, u_int8_t *data, u_int32_t len)
58921f2d90fSderaadt #else
59021f2d90fSderaadt void
59121f2d90fSderaadt blf_ecb_encrypt(c, data, len)
59221f2d90fSderaadt      blf_ctx *c;
59321f2d90fSderaadt      u_int8_t *data;
59421f2d90fSderaadt      u_int32_t len;
59521f2d90fSderaadt #endif
59621f2d90fSderaadt {
59721f2d90fSderaadt 	u_int32_t l, r, d[2];
59821f2d90fSderaadt 	u_int32_t i;
59921f2d90fSderaadt 
60021f2d90fSderaadt 	for (i = 0; i < len; i += 8) {
60121f2d90fSderaadt 		l = data[0] << 24 | data[1] << 16 | data[2] << 8 | data[3];
60221f2d90fSderaadt 		r = data[4] << 24 | data[5] << 16 | data[6] << 8 | data[7];
60321f2d90fSderaadt 		d[0] = l;
60421f2d90fSderaadt 		d[1] = r;
60521f2d90fSderaadt 		Blowfish_encipher(c, d);
60621f2d90fSderaadt 		l = d[0];
60721f2d90fSderaadt 		r = d[1];
60821f2d90fSderaadt 		data[0] = l >> 24 & 0xff;
60921f2d90fSderaadt 		data[1] = l >> 16 & 0xff;
61021f2d90fSderaadt 		data[2] = l >> 8 & 0xff;
61121f2d90fSderaadt 		data[3] = l & 0xff;
61221f2d90fSderaadt 		data[4] = r >> 24 & 0xff;
61321f2d90fSderaadt 		data[5] = r >> 16 & 0xff;
61421f2d90fSderaadt 		data[6] = r >> 8 & 0xff;
61521f2d90fSderaadt 		data[7] = r & 0xff;
61621f2d90fSderaadt 		data += 8;
61721f2d90fSderaadt 	}
61821f2d90fSderaadt }
61921f2d90fSderaadt 
62021f2d90fSderaadt #if __STDC__
62121f2d90fSderaadt void
62221f2d90fSderaadt blf_ecb_decrypt(blf_ctx *c, u_int8_t *data, u_int32_t len)
62321f2d90fSderaadt #else
62421f2d90fSderaadt void
62521f2d90fSderaadt blf_ecb_decrypt(c, data, len)
62621f2d90fSderaadt      blf_ctx *c;
62721f2d90fSderaadt      u_int8_t *data;
62821f2d90fSderaadt      u_int32_t len;
62921f2d90fSderaadt #endif
63021f2d90fSderaadt {
63121f2d90fSderaadt 	u_int32_t l, r, d[2];
63221f2d90fSderaadt 	u_int32_t i;
63321f2d90fSderaadt 
63421f2d90fSderaadt 	for (i = 0; i < len; i += 8) {
63521f2d90fSderaadt 		l = data[0] << 24 | data[1] << 16 | data[2] << 8 | data[3];
63621f2d90fSderaadt 		r = data[4] << 24 | data[5] << 16 | data[6] << 8 | data[7];
63721f2d90fSderaadt 		d[0] = l;
63821f2d90fSderaadt 		d[1] = r;
63921f2d90fSderaadt 		Blowfish_decipher(c, d);
64021f2d90fSderaadt 		l = d[0];
64121f2d90fSderaadt 		r = d[1];
64221f2d90fSderaadt 		data[0] = l >> 24 & 0xff;
64321f2d90fSderaadt 		data[1] = l >> 16 & 0xff;
64421f2d90fSderaadt 		data[2] = l >> 8 & 0xff;
64521f2d90fSderaadt 		data[3] = l & 0xff;
64621f2d90fSderaadt 		data[4] = r >> 24 & 0xff;
64721f2d90fSderaadt 		data[5] = r >> 16 & 0xff;
64821f2d90fSderaadt 		data[6] = r >> 8 & 0xff;
64921f2d90fSderaadt 		data[7] = r & 0xff;
65021f2d90fSderaadt 		data += 8;
65121f2d90fSderaadt 	}
65221f2d90fSderaadt }
653