15c129616SMark Murray /* 25c129616SMark Murray * Blowfish block cipher 35c129616SMark Murray * Copyright 1997 Niels Provos <provos@physnet.uni-hamburg.de> 45c129616SMark Murray * All rights reserved. 55c129616SMark Murray * 65c129616SMark Murray * Implementation advice by David Mazieres <dm@lcs.mit.edu>. 75c129616SMark Murray * 85c129616SMark Murray * Redistribution and use in source and binary forms, with or without 95c129616SMark Murray * modification, are permitted provided that the following conditions 105c129616SMark Murray * are met: 115c129616SMark Murray * 1. Redistributions of source code must retain the above copyright 125c129616SMark Murray * notice, this list of conditions and the following disclaimer. 135c129616SMark Murray * 2. Redistributions in binary form must reproduce the above copyright 145c129616SMark Murray * notice, this list of conditions and the following disclaimer in the 155c129616SMark Murray * documentation and/or other materials provided with the distribution. 165c129616SMark Murray * 3. All advertising materials mentioning features or use of this software 175c129616SMark Murray * must display the following acknowledgement: 185c129616SMark Murray * This product includes software developed by Niels Provos. 195c129616SMark Murray * 4. The name of the author may not be used to endorse or promote products 205c129616SMark Murray * derived from this software without specific prior written permission. 215c129616SMark Murray * 225c129616SMark Murray * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR 235c129616SMark Murray * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES 245c129616SMark Murray * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. 255c129616SMark Murray * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, 265c129616SMark Murray * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT 275c129616SMark Murray * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 285c129616SMark Murray * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 295c129616SMark Murray * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 305c129616SMark Murray * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF 315c129616SMark Murray * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 325c129616SMark Murray * 335c129616SMark Murray * $FreeBSD$ 345c129616SMark Murray */ 355c129616SMark Murray 365c129616SMark Murray /* 375c129616SMark Murray * This code is derived from section 14.3 and the given source 385c129616SMark Murray * in section V of Applied Cryptography, second edition. 395c129616SMark Murray * Blowfish is an unpatented fast block cipher designed by 405c129616SMark Murray * Bruce Schneier. 415c129616SMark Murray */ 425c129616SMark Murray 435c129616SMark Murray /* 445c129616SMark Murray * FreeBSD implementation by Paul Herman <pherman@frenchfries.net> 455c129616SMark Murray */ 465c129616SMark Murray 475c129616SMark Murray #if 0 485c129616SMark Murray #include <stdio.h> /* used for debugging */ 495c129616SMark Murray #include <string.h> 505c129616SMark Murray #endif 515c129616SMark Murray 525c129616SMark Murray #include <sys/types.h> 535c129616SMark Murray #include "blowfish.h" 545c129616SMark Murray 555c129616SMark Murray #undef inline 565c129616SMark Murray #ifdef __GNUC__ 575c129616SMark Murray #define inline __inline 585c129616SMark Murray #else /* !__GNUC__ */ 595c129616SMark Murray #define inline 605c129616SMark Murray #endif /* !__GNUC__ */ 615c129616SMark Murray 625c129616SMark Murray /* Function for Feistel Networks */ 635c129616SMark Murray 645c129616SMark Murray #define F(s, x) ((((s)[ (((x)>>24)&0xFF)] \ 655c129616SMark Murray + (s)[0x100 + (((x)>>16)&0xFF)]) \ 665c129616SMark Murray ^ (s)[0x200 + (((x)>> 8)&0xFF)]) \ 675c129616SMark Murray + (s)[0x300 + ( (x) &0xFF)]) 685c129616SMark Murray 695c129616SMark Murray #define BLFRND(s,p,i,j,n) (i ^= F(s,j) ^ (p)[n]) 705c129616SMark Murray 715c129616SMark Murray void 725c129616SMark Murray Blowfish_encipher(c, xl, xr) 735c129616SMark Murray blf_ctx *c; 745c129616SMark Murray u_int32_t *xl; 755c129616SMark Murray u_int32_t *xr; 765c129616SMark Murray { 775c129616SMark Murray u_int32_t Xl; 785c129616SMark Murray u_int32_t Xr; 795c129616SMark Murray u_int32_t *s = c->S[0]; 805c129616SMark Murray u_int32_t *p = c->P; 815c129616SMark Murray 825c129616SMark Murray Xl = *xl; 835c129616SMark Murray Xr = *xr; 845c129616SMark Murray 855c129616SMark Murray Xl ^= p[0]; 865c129616SMark Murray BLFRND(s, p, Xr, Xl, 1); BLFRND(s, p, Xl, Xr, 2); 875c129616SMark Murray BLFRND(s, p, Xr, Xl, 3); BLFRND(s, p, Xl, Xr, 4); 885c129616SMark Murray BLFRND(s, p, Xr, Xl, 5); BLFRND(s, p, Xl, Xr, 6); 895c129616SMark Murray BLFRND(s, p, Xr, Xl, 7); BLFRND(s, p, Xl, Xr, 8); 905c129616SMark Murray BLFRND(s, p, Xr, Xl, 9); BLFRND(s, p, Xl, Xr, 10); 915c129616SMark Murray BLFRND(s, p, Xr, Xl, 11); BLFRND(s, p, Xl, Xr, 12); 925c129616SMark Murray BLFRND(s, p, Xr, Xl, 13); BLFRND(s, p, Xl, Xr, 14); 935c129616SMark Murray BLFRND(s, p, Xr, Xl, 15); BLFRND(s, p, Xl, Xr, 16); 945c129616SMark Murray 955c129616SMark Murray *xl = Xr ^ p[17]; 965c129616SMark Murray *xr = Xl; 975c129616SMark Murray } 985c129616SMark Murray 995c129616SMark Murray void 1005c129616SMark Murray Blowfish_decipher(c, xl, xr) 1015c129616SMark Murray blf_ctx *c; 1025c129616SMark Murray u_int32_t *xl; 1035c129616SMark Murray u_int32_t *xr; 1045c129616SMark Murray { 1055c129616SMark Murray u_int32_t Xl; 1065c129616SMark Murray u_int32_t Xr; 1075c129616SMark Murray u_int32_t *s = c->S[0]; 1085c129616SMark Murray u_int32_t *p = c->P; 1095c129616SMark Murray 1105c129616SMark Murray Xl = *xl; 1115c129616SMark Murray Xr = *xr; 1125c129616SMark Murray 1135c129616SMark Murray Xl ^= p[17]; 1145c129616SMark Murray BLFRND(s, p, Xr, Xl, 16); BLFRND(s, p, Xl, Xr, 15); 1155c129616SMark Murray BLFRND(s, p, Xr, Xl, 14); BLFRND(s, p, Xl, Xr, 13); 1165c129616SMark Murray BLFRND(s, p, Xr, Xl, 12); BLFRND(s, p, Xl, Xr, 11); 1175c129616SMark Murray BLFRND(s, p, Xr, Xl, 10); BLFRND(s, p, Xl, Xr, 9); 1185c129616SMark Murray BLFRND(s, p, Xr, Xl, 8); BLFRND(s, p, Xl, Xr, 7); 1195c129616SMark Murray BLFRND(s, p, Xr, Xl, 6); BLFRND(s, p, Xl, Xr, 5); 1205c129616SMark Murray BLFRND(s, p, Xr, Xl, 4); BLFRND(s, p, Xl, Xr, 3); 1215c129616SMark Murray BLFRND(s, p, Xr, Xl, 2); BLFRND(s, p, Xl, Xr, 1); 1225c129616SMark Murray 1235c129616SMark Murray *xl = Xr ^ p[0]; 1245c129616SMark Murray *xr = Xl; 1255c129616SMark Murray } 1265c129616SMark Murray 1275c129616SMark Murray void 1285c129616SMark Murray Blowfish_initstate(c) 1295c129616SMark Murray blf_ctx *c; 1305c129616SMark Murray { 1315c129616SMark Murray 1325c129616SMark Murray /* P-box and S-box tables initialized with digits of Pi */ 1335c129616SMark Murray 1345c129616SMark Murray const blf_ctx initstate = 1355c129616SMark Murray 1365c129616SMark Murray { { 1375c129616SMark Murray { 1385c129616SMark Murray 0xd1310ba6, 0x98dfb5ac, 0x2ffd72db, 0xd01adfb7, 1395c129616SMark Murray 0xb8e1afed, 0x6a267e96, 0xba7c9045, 0xf12c7f99, 1405c129616SMark Murray 0x24a19947, 0xb3916cf7, 0x0801f2e2, 0x858efc16, 1415c129616SMark Murray 0x636920d8, 0x71574e69, 0xa458fea3, 0xf4933d7e, 1425c129616SMark Murray 0x0d95748f, 0x728eb658, 0x718bcd58, 0x82154aee, 1435c129616SMark Murray 0x7b54a41d, 0xc25a59b5, 0x9c30d539, 0x2af26013, 1445c129616SMark Murray 0xc5d1b023, 0x286085f0, 0xca417918, 0xb8db38ef, 1455c129616SMark Murray 0x8e79dcb0, 0x603a180e, 0x6c9e0e8b, 0xb01e8a3e, 1465c129616SMark Murray 0xd71577c1, 0xbd314b27, 0x78af2fda, 0x55605c60, 1475c129616SMark Murray 0xe65525f3, 0xaa55ab94, 0x57489862, 0x63e81440, 1485c129616SMark Murray 0x55ca396a, 0x2aab10b6, 0xb4cc5c34, 0x1141e8ce, 1495c129616SMark Murray 0xa15486af, 0x7c72e993, 0xb3ee1411, 0x636fbc2a, 1505c129616SMark Murray 0x2ba9c55d, 0x741831f6, 0xce5c3e16, 0x9b87931e, 1515c129616SMark Murray 0xafd6ba33, 0x6c24cf5c, 0x7a325381, 0x28958677, 1525c129616SMark Murray 0x3b8f4898, 0x6b4bb9af, 0xc4bfe81b, 0x66282193, 1535c129616SMark Murray 0x61d809cc, 0xfb21a991, 0x487cac60, 0x5dec8032, 1545c129616SMark Murray 0xef845d5d, 0xe98575b1, 0xdc262302, 0xeb651b88, 1555c129616SMark Murray 0x23893e81, 0xd396acc5, 0x0f6d6ff3, 0x83f44239, 1565c129616SMark Murray 0x2e0b4482, 0xa4842004, 0x69c8f04a, 0x9e1f9b5e, 1575c129616SMark Murray 0x21c66842, 0xf6e96c9a, 0x670c9c61, 0xabd388f0, 1585c129616SMark Murray 0x6a51a0d2, 0xd8542f68, 0x960fa728, 0xab5133a3, 1595c129616SMark Murray 0x6eef0b6c, 0x137a3be4, 0xba3bf050, 0x7efb2a98, 1605c129616SMark Murray 0xa1f1651d, 0x39af0176, 0x66ca593e, 0x82430e88, 1615c129616SMark Murray 0x8cee8619, 0x456f9fb4, 0x7d84a5c3, 0x3b8b5ebe, 1625c129616SMark Murray 0xe06f75d8, 0x85c12073, 0x401a449f, 0x56c16aa6, 1635c129616SMark Murray 0x4ed3aa62, 0x363f7706, 0x1bfedf72, 0x429b023d, 1645c129616SMark Murray 0x37d0d724, 0xd00a1248, 0xdb0fead3, 0x49f1c09b, 1655c129616SMark Murray 0x075372c9, 0x80991b7b, 0x25d479d8, 0xf6e8def7, 1665c129616SMark Murray 0xe3fe501a, 0xb6794c3b, 0x976ce0bd, 0x04c006ba, 1675c129616SMark Murray 0xc1a94fb6, 0x409f60c4, 0x5e5c9ec2, 0x196a2463, 1685c129616SMark Murray 0x68fb6faf, 0x3e6c53b5, 0x1339b2eb, 0x3b52ec6f, 1695c129616SMark Murray 0x6dfc511f, 0x9b30952c, 0xcc814544, 0xaf5ebd09, 1705c129616SMark Murray 0xbee3d004, 0xde334afd, 0x660f2807, 0x192e4bb3, 1715c129616SMark Murray 0xc0cba857, 0x45c8740f, 0xd20b5f39, 0xb9d3fbdb, 1725c129616SMark Murray 0x5579c0bd, 0x1a60320a, 0xd6a100c6, 0x402c7279, 1735c129616SMark Murray 0x679f25fe, 0xfb1fa3cc, 0x8ea5e9f8, 0xdb3222f8, 1745c129616SMark Murray 0x3c7516df, 0xfd616b15, 0x2f501ec8, 0xad0552ab, 1755c129616SMark Murray 0x323db5fa, 0xfd238760, 0x53317b48, 0x3e00df82, 1765c129616SMark Murray 0x9e5c57bb, 0xca6f8ca0, 0x1a87562e, 0xdf1769db, 1775c129616SMark Murray 0xd542a8f6, 0x287effc3, 0xac6732c6, 0x8c4f5573, 1785c129616SMark Murray 0x695b27b0, 0xbbca58c8, 0xe1ffa35d, 0xb8f011a0, 1795c129616SMark Murray 0x10fa3d98, 0xfd2183b8, 0x4afcb56c, 0x2dd1d35b, 1805c129616SMark Murray 0x9a53e479, 0xb6f84565, 0xd28e49bc, 0x4bfb9790, 1815c129616SMark Murray 0xe1ddf2da, 0xa4cb7e33, 0x62fb1341, 0xcee4c6e8, 1825c129616SMark Murray 0xef20cada, 0x36774c01, 0xd07e9efe, 0x2bf11fb4, 1835c129616SMark Murray 0x95dbda4d, 0xae909198, 0xeaad8e71, 0x6b93d5a0, 1845c129616SMark Murray 0xd08ed1d0, 0xafc725e0, 0x8e3c5b2f, 0x8e7594b7, 1855c129616SMark Murray 0x8ff6e2fb, 0xf2122b64, 0x8888b812, 0x900df01c, 1865c129616SMark Murray 0x4fad5ea0, 0x688fc31c, 0xd1cff191, 0xb3a8c1ad, 1875c129616SMark Murray 0x2f2f2218, 0xbe0e1777, 0xea752dfe, 0x8b021fa1, 1885c129616SMark Murray 0xe5a0cc0f, 0xb56f74e8, 0x18acf3d6, 0xce89e299, 1895c129616SMark Murray 0xb4a84fe0, 0xfd13e0b7, 0x7cc43b81, 0xd2ada8d9, 1905c129616SMark Murray 0x165fa266, 0x80957705, 0x93cc7314, 0x211a1477, 1915c129616SMark Murray 0xe6ad2065, 0x77b5fa86, 0xc75442f5, 0xfb9d35cf, 1925c129616SMark Murray 0xebcdaf0c, 0x7b3e89a0, 0xd6411bd3, 0xae1e7e49, 1935c129616SMark Murray 0x00250e2d, 0x2071b35e, 0x226800bb, 0x57b8e0af, 1945c129616SMark Murray 0x2464369b, 0xf009b91e, 0x5563911d, 0x59dfa6aa, 1955c129616SMark Murray 0x78c14389, 0xd95a537f, 0x207d5ba2, 0x02e5b9c5, 1965c129616SMark Murray 0x83260376, 0x6295cfa9, 0x11c81968, 0x4e734a41, 1975c129616SMark Murray 0xb3472dca, 0x7b14a94a, 0x1b510052, 0x9a532915, 1985c129616SMark Murray 0xd60f573f, 0xbc9bc6e4, 0x2b60a476, 0x81e67400, 1995c129616SMark Murray 0x08ba6fb5, 0x571be91f, 0xf296ec6b, 0x2a0dd915, 2005c129616SMark Murray 0xb6636521, 0xe7b9f9b6, 0xff34052e, 0xc5855664, 2015c129616SMark Murray 0x53b02d5d, 0xa99f8fa1, 0x08ba4799, 0x6e85076a}, 2025c129616SMark Murray { 2035c129616SMark Murray 0x4b7a70e9, 0xb5b32944, 0xdb75092e, 0xc4192623, 2045c129616SMark Murray 0xad6ea6b0, 0x49a7df7d, 0x9cee60b8, 0x8fedb266, 2055c129616SMark Murray 0xecaa8c71, 0x699a17ff, 0x5664526c, 0xc2b19ee1, 2065c129616SMark Murray 0x193602a5, 0x75094c29, 0xa0591340, 0xe4183a3e, 2075c129616SMark Murray 0x3f54989a, 0x5b429d65, 0x6b8fe4d6, 0x99f73fd6, 2085c129616SMark Murray 0xa1d29c07, 0xefe830f5, 0x4d2d38e6, 0xf0255dc1, 2095c129616SMark Murray 0x4cdd2086, 0x8470eb26, 0x6382e9c6, 0x021ecc5e, 2105c129616SMark Murray 0x09686b3f, 0x3ebaefc9, 0x3c971814, 0x6b6a70a1, 2115c129616SMark Murray 0x687f3584, 0x52a0e286, 0xb79c5305, 0xaa500737, 2125c129616SMark Murray 0x3e07841c, 0x7fdeae5c, 0x8e7d44ec, 0x5716f2b8, 2135c129616SMark Murray 0xb03ada37, 0xf0500c0d, 0xf01c1f04, 0x0200b3ff, 2145c129616SMark Murray 0xae0cf51a, 0x3cb574b2, 0x25837a58, 0xdc0921bd, 2155c129616SMark Murray 0xd19113f9, 0x7ca92ff6, 0x94324773, 0x22f54701, 2165c129616SMark Murray 0x3ae5e581, 0x37c2dadc, 0xc8b57634, 0x9af3dda7, 2175c129616SMark Murray 0xa9446146, 0x0fd0030e, 0xecc8c73e, 0xa4751e41, 2185c129616SMark Murray 0xe238cd99, 0x3bea0e2f, 0x3280bba1, 0x183eb331, 2195c129616SMark Murray 0x4e548b38, 0x4f6db908, 0x6f420d03, 0xf60a04bf, 2205c129616SMark Murray 0x2cb81290, 0x24977c79, 0x5679b072, 0xbcaf89af, 2215c129616SMark Murray 0xde9a771f, 0xd9930810, 0xb38bae12, 0xdccf3f2e, 2225c129616SMark Murray 0x5512721f, 0x2e6b7124, 0x501adde6, 0x9f84cd87, 2235c129616SMark Murray 0x7a584718, 0x7408da17, 0xbc9f9abc, 0xe94b7d8c, 2245c129616SMark Murray 0xec7aec3a, 0xdb851dfa, 0x63094366, 0xc464c3d2, 2255c129616SMark Murray 0xef1c1847, 0x3215d908, 0xdd433b37, 0x24c2ba16, 2265c129616SMark Murray 0x12a14d43, 0x2a65c451, 0x50940002, 0x133ae4dd, 2275c129616SMark Murray 0x71dff89e, 0x10314e55, 0x81ac77d6, 0x5f11199b, 2285c129616SMark Murray 0x043556f1, 0xd7a3c76b, 0x3c11183b, 0x5924a509, 2295c129616SMark Murray 0xf28fe6ed, 0x97f1fbfa, 0x9ebabf2c, 0x1e153c6e, 2305c129616SMark Murray 0x86e34570, 0xeae96fb1, 0x860e5e0a, 0x5a3e2ab3, 2315c129616SMark Murray 0x771fe71c, 0x4e3d06fa, 0x2965dcb9, 0x99e71d0f, 2325c129616SMark Murray 0x803e89d6, 0x5266c825, 0x2e4cc978, 0x9c10b36a, 2335c129616SMark Murray 0xc6150eba, 0x94e2ea78, 0xa5fc3c53, 0x1e0a2df4, 2345c129616SMark Murray 0xf2f74ea7, 0x361d2b3d, 0x1939260f, 0x19c27960, 2355c129616SMark Murray 0x5223a708, 0xf71312b6, 0xebadfe6e, 0xeac31f66, 2365c129616SMark Murray 0xe3bc4595, 0xa67bc883, 0xb17f37d1, 0x018cff28, 2375c129616SMark Murray 0xc332ddef, 0xbe6c5aa5, 0x65582185, 0x68ab9802, 2385c129616SMark Murray 0xeecea50f, 0xdb2f953b, 0x2aef7dad, 0x5b6e2f84, 2395c129616SMark Murray 0x1521b628, 0x29076170, 0xecdd4775, 0x619f1510, 2405c129616SMark Murray 0x13cca830, 0xeb61bd96, 0x0334fe1e, 0xaa0363cf, 2415c129616SMark Murray 0xb5735c90, 0x4c70a239, 0xd59e9e0b, 0xcbaade14, 2425c129616SMark Murray 0xeecc86bc, 0x60622ca7, 0x9cab5cab, 0xb2f3846e, 2435c129616SMark Murray 0x648b1eaf, 0x19bdf0ca, 0xa02369b9, 0x655abb50, 2445c129616SMark Murray 0x40685a32, 0x3c2ab4b3, 0x319ee9d5, 0xc021b8f7, 2455c129616SMark Murray 0x9b540b19, 0x875fa099, 0x95f7997e, 0x623d7da8, 2465c129616SMark Murray 0xf837889a, 0x97e32d77, 0x11ed935f, 0x16681281, 2475c129616SMark Murray 0x0e358829, 0xc7e61fd6, 0x96dedfa1, 0x7858ba99, 2485c129616SMark Murray 0x57f584a5, 0x1b227263, 0x9b83c3ff, 0x1ac24696, 2495c129616SMark Murray 0xcdb30aeb, 0x532e3054, 0x8fd948e4, 0x6dbc3128, 2505c129616SMark Murray 0x58ebf2ef, 0x34c6ffea, 0xfe28ed61, 0xee7c3c73, 2515c129616SMark Murray 0x5d4a14d9, 0xe864b7e3, 0x42105d14, 0x203e13e0, 2525c129616SMark Murray 0x45eee2b6, 0xa3aaabea, 0xdb6c4f15, 0xfacb4fd0, 2535c129616SMark Murray 0xc742f442, 0xef6abbb5, 0x654f3b1d, 0x41cd2105, 2545c129616SMark Murray 0xd81e799e, 0x86854dc7, 0xe44b476a, 0x3d816250, 2555c129616SMark Murray 0xcf62a1f2, 0x5b8d2646, 0xfc8883a0, 0xc1c7b6a3, 2565c129616SMark Murray 0x7f1524c3, 0x69cb7492, 0x47848a0b, 0x5692b285, 2575c129616SMark Murray 0x095bbf00, 0xad19489d, 0x1462b174, 0x23820e00, 2585c129616SMark Murray 0x58428d2a, 0x0c55f5ea, 0x1dadf43e, 0x233f7061, 2595c129616SMark Murray 0x3372f092, 0x8d937e41, 0xd65fecf1, 0x6c223bdb, 2605c129616SMark Murray 0x7cde3759, 0xcbee7460, 0x4085f2a7, 0xce77326e, 2615c129616SMark Murray 0xa6078084, 0x19f8509e, 0xe8efd855, 0x61d99735, 2625c129616SMark Murray 0xa969a7aa, 0xc50c06c2, 0x5a04abfc, 0x800bcadc, 2635c129616SMark Murray 0x9e447a2e, 0xc3453484, 0xfdd56705, 0x0e1e9ec9, 2645c129616SMark Murray 0xdb73dbd3, 0x105588cd, 0x675fda79, 0xe3674340, 2655c129616SMark Murray 0xc5c43465, 0x713e38d8, 0x3d28f89e, 0xf16dff20, 2665c129616SMark Murray 0x153e21e7, 0x8fb03d4a, 0xe6e39f2b, 0xdb83adf7}, 2675c129616SMark Murray { 2685c129616SMark Murray 0xe93d5a68, 0x948140f7, 0xf64c261c, 0x94692934, 2695c129616SMark Murray 0x411520f7, 0x7602d4f7, 0xbcf46b2e, 0xd4a20068, 2705c129616SMark Murray 0xd4082471, 0x3320f46a, 0x43b7d4b7, 0x500061af, 2715c129616SMark Murray 0x1e39f62e, 0x97244546, 0x14214f74, 0xbf8b8840, 2725c129616SMark Murray 0x4d95fc1d, 0x96b591af, 0x70f4ddd3, 0x66a02f45, 2735c129616SMark Murray 0xbfbc09ec, 0x03bd9785, 0x7fac6dd0, 0x31cb8504, 2745c129616SMark Murray 0x96eb27b3, 0x55fd3941, 0xda2547e6, 0xabca0a9a, 2755c129616SMark Murray 0x28507825, 0x530429f4, 0x0a2c86da, 0xe9b66dfb, 2765c129616SMark Murray 0x68dc1462, 0xd7486900, 0x680ec0a4, 0x27a18dee, 2775c129616SMark Murray 0x4f3ffea2, 0xe887ad8c, 0xb58ce006, 0x7af4d6b6, 2785c129616SMark Murray 0xaace1e7c, 0xd3375fec, 0xce78a399, 0x406b2a42, 2795c129616SMark Murray 0x20fe9e35, 0xd9f385b9, 0xee39d7ab, 0x3b124e8b, 2805c129616SMark Murray 0x1dc9faf7, 0x4b6d1856, 0x26a36631, 0xeae397b2, 2815c129616SMark Murray 0x3a6efa74, 0xdd5b4332, 0x6841e7f7, 0xca7820fb, 2825c129616SMark Murray 0xfb0af54e, 0xd8feb397, 0x454056ac, 0xba489527, 2835c129616SMark Murray 0x55533a3a, 0x20838d87, 0xfe6ba9b7, 0xd096954b, 2845c129616SMark Murray 0x55a867bc, 0xa1159a58, 0xcca92963, 0x99e1db33, 2855c129616SMark Murray 0xa62a4a56, 0x3f3125f9, 0x5ef47e1c, 0x9029317c, 2865c129616SMark Murray 0xfdf8e802, 0x04272f70, 0x80bb155c, 0x05282ce3, 2875c129616SMark Murray 0x95c11548, 0xe4c66d22, 0x48c1133f, 0xc70f86dc, 2885c129616SMark Murray 0x07f9c9ee, 0x41041f0f, 0x404779a4, 0x5d886e17, 2895c129616SMark Murray 0x325f51eb, 0xd59bc0d1, 0xf2bcc18f, 0x41113564, 2905c129616SMark Murray 0x257b7834, 0x602a9c60, 0xdff8e8a3, 0x1f636c1b, 2915c129616SMark Murray 0x0e12b4c2, 0x02e1329e, 0xaf664fd1, 0xcad18115, 2925c129616SMark Murray 0x6b2395e0, 0x333e92e1, 0x3b240b62, 0xeebeb922, 2935c129616SMark Murray 0x85b2a20e, 0xe6ba0d99, 0xde720c8c, 0x2da2f728, 2945c129616SMark Murray 0xd0127845, 0x95b794fd, 0x647d0862, 0xe7ccf5f0, 2955c129616SMark Murray 0x5449a36f, 0x877d48fa, 0xc39dfd27, 0xf33e8d1e, 2965c129616SMark Murray 0x0a476341, 0x992eff74, 0x3a6f6eab, 0xf4f8fd37, 2975c129616SMark Murray 0xa812dc60, 0xa1ebddf8, 0x991be14c, 0xdb6e6b0d, 2985c129616SMark Murray 0xc67b5510, 0x6d672c37, 0x2765d43b, 0xdcd0e804, 2995c129616SMark Murray 0xf1290dc7, 0xcc00ffa3, 0xb5390f92, 0x690fed0b, 3005c129616SMark Murray 0x667b9ffb, 0xcedb7d9c, 0xa091cf0b, 0xd9155ea3, 3015c129616SMark Murray 0xbb132f88, 0x515bad24, 0x7b9479bf, 0x763bd6eb, 3025c129616SMark Murray 0x37392eb3, 0xcc115979, 0x8026e297, 0xf42e312d, 3035c129616SMark Murray 0x6842ada7, 0xc66a2b3b, 0x12754ccc, 0x782ef11c, 3045c129616SMark Murray 0x6a124237, 0xb79251e7, 0x06a1bbe6, 0x4bfb6350, 3055c129616SMark Murray 0x1a6b1018, 0x11caedfa, 0x3d25bdd8, 0xe2e1c3c9, 3065c129616SMark Murray 0x44421659, 0x0a121386, 0xd90cec6e, 0xd5abea2a, 3075c129616SMark Murray 0x64af674e, 0xda86a85f, 0xbebfe988, 0x64e4c3fe, 3085c129616SMark Murray 0x9dbc8057, 0xf0f7c086, 0x60787bf8, 0x6003604d, 3095c129616SMark Murray 0xd1fd8346, 0xf6381fb0, 0x7745ae04, 0xd736fccc, 3105c129616SMark Murray 0x83426b33, 0xf01eab71, 0xb0804187, 0x3c005e5f, 3115c129616SMark Murray 0x77a057be, 0xbde8ae24, 0x55464299, 0xbf582e61, 3125c129616SMark Murray 0x4e58f48f, 0xf2ddfda2, 0xf474ef38, 0x8789bdc2, 3135c129616SMark Murray 0x5366f9c3, 0xc8b38e74, 0xb475f255, 0x46fcd9b9, 3145c129616SMark Murray 0x7aeb2661, 0x8b1ddf84, 0x846a0e79, 0x915f95e2, 3155c129616SMark Murray 0x466e598e, 0x20b45770, 0x8cd55591, 0xc902de4c, 3165c129616SMark Murray 0xb90bace1, 0xbb8205d0, 0x11a86248, 0x7574a99e, 3175c129616SMark Murray 0xb77f19b6, 0xe0a9dc09, 0x662d09a1, 0xc4324633, 3185c129616SMark Murray 0xe85a1f02, 0x09f0be8c, 0x4a99a025, 0x1d6efe10, 3195c129616SMark Murray 0x1ab93d1d, 0x0ba5a4df, 0xa186f20f, 0x2868f169, 3205c129616SMark Murray 0xdcb7da83, 0x573906fe, 0xa1e2ce9b, 0x4fcd7f52, 3215c129616SMark Murray 0x50115e01, 0xa70683fa, 0xa002b5c4, 0x0de6d027, 3225c129616SMark Murray 0x9af88c27, 0x773f8641, 0xc3604c06, 0x61a806b5, 3235c129616SMark Murray 0xf0177a28, 0xc0f586e0, 0x006058aa, 0x30dc7d62, 3245c129616SMark Murray 0x11e69ed7, 0x2338ea63, 0x53c2dd94, 0xc2c21634, 3255c129616SMark Murray 0xbbcbee56, 0x90bcb6de, 0xebfc7da1, 0xce591d76, 3265c129616SMark Murray 0x6f05e409, 0x4b7c0188, 0x39720a3d, 0x7c927c24, 3275c129616SMark Murray 0x86e3725f, 0x724d9db9, 0x1ac15bb4, 0xd39eb8fc, 3285c129616SMark Murray 0xed545578, 0x08fca5b5, 0xd83d7cd3, 0x4dad0fc4, 3295c129616SMark Murray 0x1e50ef5e, 0xb161e6f8, 0xa28514d9, 0x6c51133c, 3305c129616SMark Murray 0x6fd5c7e7, 0x56e14ec4, 0x362abfce, 0xddc6c837, 3315c129616SMark Murray 0xd79a3234, 0x92638212, 0x670efa8e, 0x406000e0}, 3325c129616SMark Murray { 3335c129616SMark Murray 0x3a39ce37, 0xd3faf5cf, 0xabc27737, 0x5ac52d1b, 3345c129616SMark Murray 0x5cb0679e, 0x4fa33742, 0xd3822740, 0x99bc9bbe, 3355c129616SMark Murray 0xd5118e9d, 0xbf0f7315, 0xd62d1c7e, 0xc700c47b, 3365c129616SMark Murray 0xb78c1b6b, 0x21a19045, 0xb26eb1be, 0x6a366eb4, 3375c129616SMark Murray 0x5748ab2f, 0xbc946e79, 0xc6a376d2, 0x6549c2c8, 3385c129616SMark Murray 0x530ff8ee, 0x468dde7d, 0xd5730a1d, 0x4cd04dc6, 3395c129616SMark Murray 0x2939bbdb, 0xa9ba4650, 0xac9526e8, 0xbe5ee304, 3405c129616SMark Murray 0xa1fad5f0, 0x6a2d519a, 0x63ef8ce2, 0x9a86ee22, 3415c129616SMark Murray 0xc089c2b8, 0x43242ef6, 0xa51e03aa, 0x9cf2d0a4, 3425c129616SMark Murray 0x83c061ba, 0x9be96a4d, 0x8fe51550, 0xba645bd6, 3435c129616SMark Murray 0x2826a2f9, 0xa73a3ae1, 0x4ba99586, 0xef5562e9, 3445c129616SMark Murray 0xc72fefd3, 0xf752f7da, 0x3f046f69, 0x77fa0a59, 3455c129616SMark Murray 0x80e4a915, 0x87b08601, 0x9b09e6ad, 0x3b3ee593, 3465c129616SMark Murray 0xe990fd5a, 0x9e34d797, 0x2cf0b7d9, 0x022b8b51, 3475c129616SMark Murray 0x96d5ac3a, 0x017da67d, 0xd1cf3ed6, 0x7c7d2d28, 3485c129616SMark Murray 0x1f9f25cf, 0xadf2b89b, 0x5ad6b472, 0x5a88f54c, 3495c129616SMark Murray 0xe029ac71, 0xe019a5e6, 0x47b0acfd, 0xed93fa9b, 3505c129616SMark Murray 0xe8d3c48d, 0x283b57cc, 0xf8d56629, 0x79132e28, 3515c129616SMark Murray 0x785f0191, 0xed756055, 0xf7960e44, 0xe3d35e8c, 3525c129616SMark Murray 0x15056dd4, 0x88f46dba, 0x03a16125, 0x0564f0bd, 3535c129616SMark Murray 0xc3eb9e15, 0x3c9057a2, 0x97271aec, 0xa93a072a, 3545c129616SMark Murray 0x1b3f6d9b, 0x1e6321f5, 0xf59c66fb, 0x26dcf319, 3555c129616SMark Murray 0x7533d928, 0xb155fdf5, 0x03563482, 0x8aba3cbb, 3565c129616SMark Murray 0x28517711, 0xc20ad9f8, 0xabcc5167, 0xccad925f, 3575c129616SMark Murray 0x4de81751, 0x3830dc8e, 0x379d5862, 0x9320f991, 3585c129616SMark Murray 0xea7a90c2, 0xfb3e7bce, 0x5121ce64, 0x774fbe32, 3595c129616SMark Murray 0xa8b6e37e, 0xc3293d46, 0x48de5369, 0x6413e680, 3605c129616SMark Murray 0xa2ae0810, 0xdd6db224, 0x69852dfd, 0x09072166, 3615c129616SMark Murray 0xb39a460a, 0x6445c0dd, 0x586cdecf, 0x1c20c8ae, 3625c129616SMark Murray 0x5bbef7dd, 0x1b588d40, 0xccd2017f, 0x6bb4e3bb, 3635c129616SMark Murray 0xdda26a7e, 0x3a59ff45, 0x3e350a44, 0xbcb4cdd5, 3645c129616SMark Murray 0x72eacea8, 0xfa6484bb, 0x8d6612ae, 0xbf3c6f47, 3655c129616SMark Murray 0xd29be463, 0x542f5d9e, 0xaec2771b, 0xf64e6370, 3665c129616SMark Murray 0x740e0d8d, 0xe75b1357, 0xf8721671, 0xaf537d5d, 3675c129616SMark Murray 0x4040cb08, 0x4eb4e2cc, 0x34d2466a, 0x0115af84, 3685c129616SMark Murray 0xe1b00428, 0x95983a1d, 0x06b89fb4, 0xce6ea048, 3695c129616SMark Murray 0x6f3f3b82, 0x3520ab82, 0x011a1d4b, 0x277227f8, 3705c129616SMark Murray 0x611560b1, 0xe7933fdc, 0xbb3a792b, 0x344525bd, 3715c129616SMark Murray 0xa08839e1, 0x51ce794b, 0x2f32c9b7, 0xa01fbac9, 3725c129616SMark Murray 0xe01cc87e, 0xbcc7d1f6, 0xcf0111c3, 0xa1e8aac7, 3735c129616SMark Murray 0x1a908749, 0xd44fbd9a, 0xd0dadecb, 0xd50ada38, 3745c129616SMark Murray 0x0339c32a, 0xc6913667, 0x8df9317c, 0xe0b12b4f, 3755c129616SMark Murray 0xf79e59b7, 0x43f5bb3a, 0xf2d519ff, 0x27d9459c, 3765c129616SMark Murray 0xbf97222c, 0x15e6fc2a, 0x0f91fc71, 0x9b941525, 3775c129616SMark Murray 0xfae59361, 0xceb69ceb, 0xc2a86459, 0x12baa8d1, 3785c129616SMark Murray 0xb6c1075e, 0xe3056a0c, 0x10d25065, 0xcb03a442, 3795c129616SMark Murray 0xe0ec6e0e, 0x1698db3b, 0x4c98a0be, 0x3278e964, 3805c129616SMark Murray 0x9f1f9532, 0xe0d392df, 0xd3a0342b, 0x8971f21e, 3815c129616SMark Murray 0x1b0a7441, 0x4ba3348c, 0xc5be7120, 0xc37632d8, 3825c129616SMark Murray 0xdf359f8d, 0x9b992f2e, 0xe60b6f47, 0x0fe3f11d, 3835c129616SMark Murray 0xe54cda54, 0x1edad891, 0xce6279cf, 0xcd3e7e6f, 3845c129616SMark Murray 0x1618b166, 0xfd2c1d05, 0x848fd2c5, 0xf6fb2299, 3855c129616SMark Murray 0xf523f357, 0xa6327623, 0x93a83531, 0x56cccd02, 3865c129616SMark Murray 0xacf08162, 0x5a75ebb5, 0x6e163697, 0x88d273cc, 3875c129616SMark Murray 0xde966292, 0x81b949d0, 0x4c50901b, 0x71c65614, 3885c129616SMark Murray 0xe6c6c7bd, 0x327a140a, 0x45e1d006, 0xc3f27b9a, 3895c129616SMark Murray 0xc9aa53fd, 0x62a80f00, 0xbb25bfe2, 0x35bdd2f6, 3905c129616SMark Murray 0x71126905, 0xb2040222, 0xb6cbcf7c, 0xcd769c2b, 3915c129616SMark Murray 0x53113ec0, 0x1640e3d3, 0x38abbd60, 0x2547adf0, 3925c129616SMark Murray 0xba38209c, 0xf746ce76, 0x77afa1c5, 0x20756060, 3935c129616SMark Murray 0x85cbfe4e, 0x8ae88dd8, 0x7aaaf9b0, 0x4cf9aa7e, 3945c129616SMark Murray 0x1948c25c, 0x02fb8a8c, 0x01c36ae4, 0xd6ebe1f9, 3955c129616SMark Murray 0x90d4f869, 0xa65cdea0, 0x3f09252d, 0xc208e69f, 3965c129616SMark Murray 0xb74e6132, 0xce77e25b, 0x578fdfe3, 0x3ac372e6} 3975c129616SMark Murray }, 3985c129616SMark Murray { 3995c129616SMark Murray 0x243f6a88, 0x85a308d3, 0x13198a2e, 0x03707344, 4005c129616SMark Murray 0xa4093822, 0x299f31d0, 0x082efa98, 0xec4e6c89, 4015c129616SMark Murray 0x452821e6, 0x38d01377, 0xbe5466cf, 0x34e90c6c, 4025c129616SMark Murray 0xc0ac29b7, 0xc97c50dd, 0x3f84d5b5, 0xb5470917, 4035c129616SMark Murray 0x9216d5d9, 0x8979fb1b 4045c129616SMark Murray } }; 4055c129616SMark Murray 4065c129616SMark Murray *c = initstate; 4075c129616SMark Murray 4085c129616SMark Murray } 4095c129616SMark Murray 4105c129616SMark Murray #ifdef __STDC__ 4115c129616SMark Murray u_int32_t 4125c129616SMark Murray Blowfish_stream2word(const u_int8_t *data, u_int16_t databytes, u_int16_t *current) 4135c129616SMark Murray #else 4145c129616SMark Murray u_int32_t 4155c129616SMark Murray Blowfish_stream2word(data, databytes, current) 4165c129616SMark Murray const u_int8_t *data; 4175c129616SMark Murray u_int16_t databytes; 4185c129616SMark Murray u_int16_t *current; 4195c129616SMark Murray #endif 4205c129616SMark Murray { 4215c129616SMark Murray u_int8_t i; 4225c129616SMark Murray u_int16_t j; 4235c129616SMark Murray u_int32_t temp; 4245c129616SMark Murray 4255c129616SMark Murray temp = 0x00000000; 4265c129616SMark Murray j = *current; 4275c129616SMark Murray 4285c129616SMark Murray for (i = 0; i < 4; i++, j++) { 4295c129616SMark Murray if (j >= databytes) 4305c129616SMark Murray j = 0; 4315c129616SMark Murray temp = (temp << 8) | data[j]; 4325c129616SMark Murray } 4335c129616SMark Murray 4345c129616SMark Murray *current = j; 4355c129616SMark Murray return temp; 4365c129616SMark Murray } 4375c129616SMark Murray 4385c129616SMark Murray #if __STDC__ 4395c129616SMark Murray void 4405c129616SMark Murray Blowfish_expand0state(blf_ctx *c, const u_int8_t *key, u_int16_t keybytes) 4415c129616SMark Murray #else 4425c129616SMark Murray void 4435c129616SMark Murray Blowfish_expand0state(c, key, keybytes) 4445c129616SMark Murray blf_ctx *c; 4455c129616SMark Murray const u_int8_t *key; 4465c129616SMark Murray u_int16_t keybytes; 4475c129616SMark Murray #endif 4485c129616SMark Murray { 4495c129616SMark Murray u_int16_t i; 4505c129616SMark Murray u_int16_t j; 4515c129616SMark Murray u_int16_t k; 4525c129616SMark Murray u_int32_t temp; 4535c129616SMark Murray u_int32_t datal; 4545c129616SMark Murray u_int32_t datar; 4555c129616SMark Murray 4565c129616SMark Murray j = 0; 4575c129616SMark Murray for (i = 0; i < BLF_N + 2; i++) { 4585c129616SMark Murray /* Extract 4 int8 to 1 int32 from keystream */ 4595c129616SMark Murray temp = Blowfish_stream2word(key, keybytes, &j); 4605c129616SMark Murray c->P[i] = c->P[i] ^ temp; 4615c129616SMark Murray } 4625c129616SMark Murray 4635c129616SMark Murray j = 0; 4645c129616SMark Murray datal = 0x00000000; 4655c129616SMark Murray datar = 0x00000000; 4665c129616SMark Murray for (i = 0; i < BLF_N + 2; i += 2) { 4675c129616SMark Murray Blowfish_encipher(c, &datal, &datar); 4685c129616SMark Murray 4695c129616SMark Murray c->P[i] = datal; 4705c129616SMark Murray c->P[i + 1] = datar; 4715c129616SMark Murray } 4725c129616SMark Murray 4735c129616SMark Murray for (i = 0; i < 4; i++) { 4745c129616SMark Murray for (k = 0; k < 256; k += 2) { 4755c129616SMark Murray Blowfish_encipher(c, &datal, &datar); 4765c129616SMark Murray 4775c129616SMark Murray c->S[i][k] = datal; 4785c129616SMark Murray c->S[i][k + 1] = datar; 4795c129616SMark Murray } 4805c129616SMark Murray } 4815c129616SMark Murray } 4825c129616SMark Murray 4835c129616SMark Murray 4845c129616SMark Murray #if __STDC__ 4855c129616SMark Murray void 4865c129616SMark Murray Blowfish_expandstate(blf_ctx *c, const u_int8_t *data, u_int16_t databytes, 4875c129616SMark Murray const u_int8_t *key, u_int16_t keybytes) 4885c129616SMark Murray #else 4895c129616SMark Murray void 4905c129616SMark Murray Blowfish_expandstate(c, data, databytes, key, keybytes) 4915c129616SMark Murray blf_ctx *c; 4925c129616SMark Murray const u_int8_t *data; 4935c129616SMark Murray u_int16_t databytes; 4945c129616SMark Murray const u_int8_t *key; 4955c129616SMark Murray u_int16_t keybytes; 4965c129616SMark Murray #endif 4975c129616SMark Murray { 4985c129616SMark Murray u_int16_t i; 4995c129616SMark Murray u_int16_t j; 5005c129616SMark Murray u_int16_t k; 5015c129616SMark Murray u_int32_t temp; 5025c129616SMark Murray u_int32_t datal; 5035c129616SMark Murray u_int32_t datar; 5045c129616SMark Murray 5055c129616SMark Murray j = 0; 5065c129616SMark Murray for (i = 0; i < BLF_N + 2; i++) { 5075c129616SMark Murray /* Extract 4 int8 to 1 int32 from keystream */ 5085c129616SMark Murray temp = Blowfish_stream2word(key, keybytes, &j); 5095c129616SMark Murray c->P[i] = c->P[i] ^ temp; 5105c129616SMark Murray } 5115c129616SMark Murray 5125c129616SMark Murray j = 0; 5135c129616SMark Murray datal = 0x00000000; 5145c129616SMark Murray datar = 0x00000000; 5155c129616SMark Murray for (i = 0; i < BLF_N + 2; i += 2) { 5165c129616SMark Murray datal ^= Blowfish_stream2word(data, databytes, &j); 5175c129616SMark Murray datar ^= Blowfish_stream2word(data, databytes, &j); 5185c129616SMark Murray Blowfish_encipher(c, &datal, &datar); 5195c129616SMark Murray 5205c129616SMark Murray c->P[i] = datal; 5215c129616SMark Murray c->P[i + 1] = datar; 5225c129616SMark Murray } 5235c129616SMark Murray 5245c129616SMark Murray for (i = 0; i < 4; i++) { 5255c129616SMark Murray for (k = 0; k < 256; k += 2) { 5265c129616SMark Murray datal ^= Blowfish_stream2word(data, databytes, &j); 5275c129616SMark Murray datar ^= Blowfish_stream2word(data, databytes, &j); 5285c129616SMark Murray Blowfish_encipher(c, &datal, &datar); 5295c129616SMark Murray 5305c129616SMark Murray c->S[i][k] = datal; 5315c129616SMark Murray c->S[i][k + 1] = datar; 5325c129616SMark Murray } 5335c129616SMark Murray } 5345c129616SMark Murray 5355c129616SMark Murray } 5365c129616SMark Murray 5375c129616SMark Murray #if __STDC__ 5385c129616SMark Murray void 5395c129616SMark Murray blf_key(blf_ctx *c, const u_int8_t *k, u_int16_t len) 5405c129616SMark Murray #else 5415c129616SMark Murray void 5425c129616SMark Murray blf_key(c, k, len) 5435c129616SMark Murray blf_ctx *c; 5445c129616SMark Murray const u_int8_t *k; 5455c129616SMark Murray u_int16_t len; 5465c129616SMark Murray #endif 5475c129616SMark Murray { 5485c129616SMark Murray /* Initalize S-boxes and subkeys with Pi */ 5495c129616SMark Murray Blowfish_initstate(c); 5505c129616SMark Murray 5515c129616SMark Murray /* Transform S-boxes and subkeys with key */ 5525c129616SMark Murray Blowfish_expand0state(c, k, len); 5535c129616SMark Murray } 5545c129616SMark Murray 5555c129616SMark Murray #if __STDC__ 5565c129616SMark Murray void 5575c129616SMark Murray blf_enc(blf_ctx *c, u_int32_t *data, u_int16_t blocks) 5585c129616SMark Murray #else 5595c129616SMark Murray void 5605c129616SMark Murray blf_enc(c, data, blocks) 5615c129616SMark Murray blf_ctx *c; 5625c129616SMark Murray u_int32_t *data; 5635c129616SMark Murray u_int16_t blocks; 5645c129616SMark Murray #endif 5655c129616SMark Murray { 5665c129616SMark Murray u_int32_t *d; 5675c129616SMark Murray u_int16_t i; 5685c129616SMark Murray 5695c129616SMark Murray d = data; 5705c129616SMark Murray for (i = 0; i < blocks; i++) { 5715c129616SMark Murray Blowfish_encipher(c, d, d + 1); 5725c129616SMark Murray d += 2; 5735c129616SMark Murray } 5745c129616SMark Murray } 5755c129616SMark Murray 5765c129616SMark Murray #if __STDC__ 5775c129616SMark Murray void 5785c129616SMark Murray blf_dec(blf_ctx *c, u_int32_t *data, u_int16_t blocks) 5795c129616SMark Murray #else 5805c129616SMark Murray void 5815c129616SMark Murray blf_dec(c, data, blocks) 5825c129616SMark Murray blf_ctx *c; 5835c129616SMark Murray u_int32_t *data; 5845c129616SMark Murray u_int16_t blocks; 5855c129616SMark Murray #endif 5865c129616SMark Murray { 5875c129616SMark Murray u_int32_t *d; 5885c129616SMark Murray u_int16_t i; 5895c129616SMark Murray 5905c129616SMark Murray d = data; 5915c129616SMark Murray for (i = 0; i < blocks; i++) { 5925c129616SMark Murray Blowfish_decipher(c, d, d + 1); 5935c129616SMark Murray d += 2; 5945c129616SMark Murray } 5955c129616SMark Murray } 5965c129616SMark Murray 5975c129616SMark Murray #if __STDC__ 5985c129616SMark Murray void 5995c129616SMark Murray blf_ecb_encrypt(blf_ctx *c, u_int8_t *data, u_int32_t len) 6005c129616SMark Murray #else 6015c129616SMark Murray void 6025c129616SMark Murray blf_ecb_encrypt(c, data, len) 6035c129616SMark Murray blf_ctx *c; 6045c129616SMark Murray u_int8_t *data; 6055c129616SMark Murray u_int32_t len; 6065c129616SMark Murray #endif 6075c129616SMark Murray { 6085c129616SMark Murray u_int32_t l, r; 6095c129616SMark Murray u_int32_t i; 6105c129616SMark Murray 6115c129616SMark Murray for (i = 0; i < len; i += 8) { 6125c129616SMark Murray l = data[0] << 24 | data[1] << 16 | data[2] << 8 | data[3]; 6135c129616SMark Murray r = data[4] << 24 | data[5] << 16 | data[6] << 8 | data[7]; 6145c129616SMark Murray Blowfish_encipher(c, &l, &r); 6155c129616SMark Murray data[0] = l >> 24 & 0xff; 6165c129616SMark Murray data[1] = l >> 16 & 0xff; 6175c129616SMark Murray data[2] = l >> 8 & 0xff; 6185c129616SMark Murray data[3] = l & 0xff; 6195c129616SMark Murray data[4] = r >> 24 & 0xff; 6205c129616SMark Murray data[5] = r >> 16 & 0xff; 6215c129616SMark Murray data[6] = r >> 8 & 0xff; 6225c129616SMark Murray data[7] = r & 0xff; 6235c129616SMark Murray data += 8; 6245c129616SMark Murray } 6255c129616SMark Murray } 6265c129616SMark Murray 6275c129616SMark Murray #if __STDC__ 6285c129616SMark Murray void 6295c129616SMark Murray blf_ecb_decrypt(blf_ctx *c, u_int8_t *data, u_int32_t len) 6305c129616SMark Murray #else 6315c129616SMark Murray void 6325c129616SMark Murray blf_ecb_decrypt(c, data, len) 6335c129616SMark Murray blf_ctx *c; 6345c129616SMark Murray u_int8_t *data; 6355c129616SMark Murray u_int32_t len; 6365c129616SMark Murray #endif 6375c129616SMark Murray { 6385c129616SMark Murray u_int32_t l, r; 6395c129616SMark Murray u_int32_t i; 6405c129616SMark Murray 6415c129616SMark Murray for (i = 0; i < len; i += 8) { 6425c129616SMark Murray l = data[0] << 24 | data[1] << 16 | data[2] << 8 | data[3]; 6435c129616SMark Murray r = data[4] << 24 | data[5] << 16 | data[6] << 8 | data[7]; 6445c129616SMark Murray Blowfish_decipher(c, &l, &r); 6455c129616SMark Murray data[0] = l >> 24 & 0xff; 6465c129616SMark Murray data[1] = l >> 16 & 0xff; 6475c129616SMark Murray data[2] = l >> 8 & 0xff; 6485c129616SMark Murray data[3] = l & 0xff; 6495c129616SMark Murray data[4] = r >> 24 & 0xff; 6505c129616SMark Murray data[5] = r >> 16 & 0xff; 6515c129616SMark Murray data[6] = r >> 8 & 0xff; 6525c129616SMark Murray data[7] = r & 0xff; 6535c129616SMark Murray data += 8; 6545c129616SMark Murray } 6555c129616SMark Murray } 6565c129616SMark Murray 6575c129616SMark Murray #if __STDC__ 6585c129616SMark Murray void 6595c129616SMark Murray blf_cbc_encrypt(blf_ctx *c, u_int8_t *iv, u_int8_t *data, u_int32_t len) 6605c129616SMark Murray #else 6615c129616SMark Murray void 6625c129616SMark Murray blf_cbc_encrypt(c, iv, data, len) 6635c129616SMark Murray blf_ctx *c; 6645c129616SMark Murray u_int8_t *iv; 6655c129616SMark Murray u_int8_t *data; 6665c129616SMark Murray u_int32_t len; 6675c129616SMark Murray #endif 6685c129616SMark Murray { 6695c129616SMark Murray u_int32_t l, r; 6705c129616SMark Murray u_int32_t i, j; 6715c129616SMark Murray 6725c129616SMark Murray for (i = 0; i < len; i += 8) { 6735c129616SMark Murray for (j = 0; j < 8; j++) 6745c129616SMark Murray data[j] ^= iv[j]; 6755c129616SMark Murray l = data[0] << 24 | data[1] << 16 | data[2] << 8 | data[3]; 6765c129616SMark Murray r = data[4] << 24 | data[5] << 16 | data[6] << 8 | data[7]; 6775c129616SMark Murray Blowfish_encipher(c, &l, &r); 6785c129616SMark Murray data[0] = l >> 24 & 0xff; 6795c129616SMark Murray data[1] = l >> 16 & 0xff; 6805c129616SMark Murray data[2] = l >> 8 & 0xff; 6815c129616SMark Murray data[3] = l & 0xff; 6825c129616SMark Murray data[4] = r >> 24 & 0xff; 6835c129616SMark Murray data[5] = r >> 16 & 0xff; 6845c129616SMark Murray data[6] = r >> 8 & 0xff; 6855c129616SMark Murray data[7] = r & 0xff; 6865c129616SMark Murray iv = data; 6875c129616SMark Murray data += 8; 6885c129616SMark Murray } 6895c129616SMark Murray } 6905c129616SMark Murray 6915c129616SMark Murray #if __STDC__ 6925c129616SMark Murray void 6935c129616SMark Murray blf_cbc_decrypt(blf_ctx *c, u_int8_t *iva, u_int8_t *data, u_int32_t len) 6945c129616SMark Murray #else 6955c129616SMark Murray void 6965c129616SMark Murray blf_cbc_decrypt(c, iva, data, len) 6975c129616SMark Murray blf_ctx *c; 6985c129616SMark Murray u_int8_t *iva; 6995c129616SMark Murray u_int8_t *data; 7005c129616SMark Murray u_int32_t len; 7015c129616SMark Murray #endif 7025c129616SMark Murray { 7035c129616SMark Murray u_int32_t l, r; 7045c129616SMark Murray u_int8_t *iv; 7055c129616SMark Murray u_int32_t i, j; 7065c129616SMark Murray 7075c129616SMark Murray iv = data + len - 16; 7085c129616SMark Murray data = data + len - 8; 7095c129616SMark Murray for (i = len - 8; i >= 8; i -= 8) { 7105c129616SMark Murray l = data[0] << 24 | data[1] << 16 | data[2] << 8 | data[3]; 7115c129616SMark Murray r = data[4] << 24 | data[5] << 16 | data[6] << 8 | data[7]; 7125c129616SMark Murray Blowfish_decipher(c, &l, &r); 7135c129616SMark Murray data[0] = l >> 24 & 0xff; 7145c129616SMark Murray data[1] = l >> 16 & 0xff; 7155c129616SMark Murray data[2] = l >> 8 & 0xff; 7165c129616SMark Murray data[3] = l & 0xff; 7175c129616SMark Murray data[4] = r >> 24 & 0xff; 7185c129616SMark Murray data[5] = r >> 16 & 0xff; 7195c129616SMark Murray data[6] = r >> 8 & 0xff; 7205c129616SMark Murray data[7] = r & 0xff; 7215c129616SMark Murray for (j = 0; j < 8; j++) 7225c129616SMark Murray data[j] ^= iv[j]; 7235c129616SMark Murray iv -= 8; 7245c129616SMark Murray data -= 8; 7255c129616SMark Murray } 7265c129616SMark Murray l = data[0] << 24 | data[1] << 16 | data[2] << 8 | data[3]; 7275c129616SMark Murray r = data[4] << 24 | data[5] << 16 | data[6] << 8 | data[7]; 7285c129616SMark Murray Blowfish_decipher(c, &l, &r); 7295c129616SMark Murray data[0] = l >> 24 & 0xff; 7305c129616SMark Murray data[1] = l >> 16 & 0xff; 7315c129616SMark Murray data[2] = l >> 8 & 0xff; 7325c129616SMark Murray data[3] = l & 0xff; 7335c129616SMark Murray data[4] = r >> 24 & 0xff; 7345c129616SMark Murray data[5] = r >> 16 & 0xff; 7355c129616SMark Murray data[6] = r >> 8 & 0xff; 7365c129616SMark Murray data[7] = r & 0xff; 7375c129616SMark Murray for (j = 0; j < 8; j++) 7385c129616SMark Murray data[j] ^= iva[j]; 7395c129616SMark Murray } 7405c129616SMark Murray 7415c129616SMark Murray #if 0 7425c129616SMark Murray void 7435c129616SMark Murray report(u_int32_t data[], u_int16_t len) 7445c129616SMark Murray { 7455c129616SMark Murray u_int16_t i; 7465c129616SMark Murray for (i = 0; i < len; i += 2) 7475c129616SMark Murray printf("Block %0hd: %08lx %08lx.\n", 7485c129616SMark Murray i / 2, data[i], data[i + 1]); 7495c129616SMark Murray } 7505c129616SMark Murray void 7515c129616SMark Murray main(void) 7525c129616SMark Murray { 7535c129616SMark Murray 7545c129616SMark Murray blf_ctx c; 7555c129616SMark Murray char key[] = "AAAAA"; 7565c129616SMark Murray char key2[] = "abcdefghijklmnopqrstuvwxyz"; 7575c129616SMark Murray 7585c129616SMark Murray u_int32_t data[10]; 7595c129616SMark Murray u_int32_t data2[] = 7605c129616SMark Murray {0x424c4f57l, 0x46495348l}; 7615c129616SMark Murray 7625c129616SMark Murray u_int16_t i; 7635c129616SMark Murray 7645c129616SMark Murray /* First test */ 7655c129616SMark Murray for (i = 0; i < 10; i++) 7665c129616SMark Murray data[i] = i; 7675c129616SMark Murray 7685c129616SMark Murray blf_key(&c, (u_int8_t *) key, 5); 7695c129616SMark Murray blf_enc(&c, data, 5); 7705c129616SMark Murray blf_dec(&c, data, 1); 7715c129616SMark Murray blf_dec(&c, data + 2, 4); 7725c129616SMark Murray printf("Should read as 0 - 9.\n"); 7735c129616SMark Murray report(data, 10); 7745c129616SMark Murray 7755c129616SMark Murray /* Second test */ 7765c129616SMark Murray blf_key(&c, (u_int8_t *) key2, strlen(key2)); 7775c129616SMark Murray blf_enc(&c, data2, 1); 7785c129616SMark Murray printf("\nShould read as: 0x324ed0fe 0xf413a203.\n"); 7795c129616SMark Murray report(data2, 2); 7805c129616SMark Murray blf_dec(&c, data2, 1); 7815c129616SMark Murray report(data2, 2); 7825c129616SMark Murray } 7835c129616SMark Murray #endif 784