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