Back to index

python-bcrypt  0.2
blowfish.c
Go to the documentation of this file.
00001 /* $OpenBSD: blowfish.c,v 1.18 2004/11/02 17:23:26 hshoexer Exp $ */
00002 /*
00003  * Blowfish block cipher for OpenBSD
00004  * Copyright 1997 Niels Provos <provos@physnet.uni-hamburg.de>
00005  * All rights reserved.
00006  *
00007  * Implementation advice by David Mazieres <dm@lcs.mit.edu>.
00008  *
00009  * Redistribution and use in source and binary forms, with or without
00010  * modification, are permitted provided that the following conditions
00011  * are met:
00012  * 1. Redistributions of source code must retain the above copyright
00013  *    notice, this list of conditions and the following disclaimer.
00014  * 2. Redistributions in binary form must reproduce the above copyright
00015  *    notice, this list of conditions and the following disclaimer in the
00016  *    documentation and/or other materials provided with the distribution.
00017  * 3. All advertising materials mentioning features or use of this software
00018  *    must display the following acknowledgement:
00019  *      This product includes software developed by Niels Provos.
00020  * 4. The name of the author may not be used to endorse or promote products
00021  *    derived from this software without specific prior written permission.
00022  *
00023  * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
00024  * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
00025  * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
00026  * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
00027  * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
00028  * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
00029  * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
00030  * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
00031  * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
00032  * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
00033  */
00034 
00035 /*
00036  * This code is derived from section 14.3 and the given source
00037  * in section V of Applied Cryptography, second edition.
00038  * Blowfish is an unpatented fast block cipher designed by
00039  * Bruce Schneier.
00040  */
00041 
00042 #include <sys/types.h>
00043 #include "pybc_blf.h"
00044 
00045 /* Function for Feistel Networks */
00046 
00047 #define F(s, x) ((((s)[        (((x)>>24)&0xFF)]  \
00048                + (s)[0x100 + (((x)>>16)&0xFF)]) \
00049                ^ (s)[0x200 + (((x)>> 8)&0xFF)]) \
00050                + (s)[0x300 + ( (x)     &0xFF)])
00051 
00052 #define BLFRND(s,p,i,j,n) (i ^= F(s,j) ^ (p)[n])
00053 
00054 void
00055 pybc_Blowfish_encipher(pybc_blf_ctx *c, u_int32_t *xl, u_int32_t *xr)
00056 {
00057        u_int32_t Xl;
00058        u_int32_t Xr;
00059        u_int32_t *s = c->S[0];
00060        u_int32_t *p = c->P;
00061 
00062        Xl = *xl;
00063        Xr = *xr;
00064 
00065        Xl ^= p[0];
00066        BLFRND(s, p, Xr, Xl, 1); BLFRND(s, p, Xl, Xr, 2);
00067        BLFRND(s, p, Xr, Xl, 3); BLFRND(s, p, Xl, Xr, 4);
00068        BLFRND(s, p, Xr, Xl, 5); BLFRND(s, p, Xl, Xr, 6);
00069        BLFRND(s, p, Xr, Xl, 7); BLFRND(s, p, Xl, Xr, 8);
00070        BLFRND(s, p, Xr, Xl, 9); BLFRND(s, p, Xl, Xr, 10);
00071        BLFRND(s, p, Xr, Xl, 11); BLFRND(s, p, Xl, Xr, 12);
00072        BLFRND(s, p, Xr, Xl, 13); BLFRND(s, p, Xl, Xr, 14);
00073        BLFRND(s, p, Xr, Xl, 15); BLFRND(s, p, Xl, Xr, 16);
00074 
00075        *xl = Xr ^ p[17];
00076        *xr = Xl;
00077 }
00078 
00079 void
00080 pybc_Blowfish_initstate(pybc_blf_ctx *c)
00081 {
00082        /* P-box and S-box tables initialized with digits of Pi */
00083 
00084        static const pybc_blf_ctx initstate =
00085        { {
00086               {
00087                      0xd1310ba6, 0x98dfb5ac, 0x2ffd72db, 0xd01adfb7,
00088                      0xb8e1afed, 0x6a267e96, 0xba7c9045, 0xf12c7f99,
00089                      0x24a19947, 0xb3916cf7, 0x0801f2e2, 0x858efc16,
00090                      0x636920d8, 0x71574e69, 0xa458fea3, 0xf4933d7e,
00091                      0x0d95748f, 0x728eb658, 0x718bcd58, 0x82154aee,
00092                      0x7b54a41d, 0xc25a59b5, 0x9c30d539, 0x2af26013,
00093                      0xc5d1b023, 0x286085f0, 0xca417918, 0xb8db38ef,
00094                      0x8e79dcb0, 0x603a180e, 0x6c9e0e8b, 0xb01e8a3e,
00095                      0xd71577c1, 0xbd314b27, 0x78af2fda, 0x55605c60,
00096                      0xe65525f3, 0xaa55ab94, 0x57489862, 0x63e81440,
00097                      0x55ca396a, 0x2aab10b6, 0xb4cc5c34, 0x1141e8ce,
00098                      0xa15486af, 0x7c72e993, 0xb3ee1411, 0x636fbc2a,
00099                      0x2ba9c55d, 0x741831f6, 0xce5c3e16, 0x9b87931e,
00100                      0xafd6ba33, 0x6c24cf5c, 0x7a325381, 0x28958677,
00101                      0x3b8f4898, 0x6b4bb9af, 0xc4bfe81b, 0x66282193,
00102                      0x61d809cc, 0xfb21a991, 0x487cac60, 0x5dec8032,
00103                      0xef845d5d, 0xe98575b1, 0xdc262302, 0xeb651b88,
00104                      0x23893e81, 0xd396acc5, 0x0f6d6ff3, 0x83f44239,
00105                      0x2e0b4482, 0xa4842004, 0x69c8f04a, 0x9e1f9b5e,
00106                      0x21c66842, 0xf6e96c9a, 0x670c9c61, 0xabd388f0,
00107                      0x6a51a0d2, 0xd8542f68, 0x960fa728, 0xab5133a3,
00108                      0x6eef0b6c, 0x137a3be4, 0xba3bf050, 0x7efb2a98,
00109                      0xa1f1651d, 0x39af0176, 0x66ca593e, 0x82430e88,
00110                      0x8cee8619, 0x456f9fb4, 0x7d84a5c3, 0x3b8b5ebe,
00111                      0xe06f75d8, 0x85c12073, 0x401a449f, 0x56c16aa6,
00112                      0x4ed3aa62, 0x363f7706, 0x1bfedf72, 0x429b023d,
00113                      0x37d0d724, 0xd00a1248, 0xdb0fead3, 0x49f1c09b,
00114                      0x075372c9, 0x80991b7b, 0x25d479d8, 0xf6e8def7,
00115                      0xe3fe501a, 0xb6794c3b, 0x976ce0bd, 0x04c006ba,
00116                      0xc1a94fb6, 0x409f60c4, 0x5e5c9ec2, 0x196a2463,
00117                      0x68fb6faf, 0x3e6c53b5, 0x1339b2eb, 0x3b52ec6f,
00118                      0x6dfc511f, 0x9b30952c, 0xcc814544, 0xaf5ebd09,
00119                      0xbee3d004, 0xde334afd, 0x660f2807, 0x192e4bb3,
00120                      0xc0cba857, 0x45c8740f, 0xd20b5f39, 0xb9d3fbdb,
00121                      0x5579c0bd, 0x1a60320a, 0xd6a100c6, 0x402c7279,
00122                      0x679f25fe, 0xfb1fa3cc, 0x8ea5e9f8, 0xdb3222f8,
00123                      0x3c7516df, 0xfd616b15, 0x2f501ec8, 0xad0552ab,
00124                      0x323db5fa, 0xfd238760, 0x53317b48, 0x3e00df82,
00125                      0x9e5c57bb, 0xca6f8ca0, 0x1a87562e, 0xdf1769db,
00126                      0xd542a8f6, 0x287effc3, 0xac6732c6, 0x8c4f5573,
00127                      0x695b27b0, 0xbbca58c8, 0xe1ffa35d, 0xb8f011a0,
00128                      0x10fa3d98, 0xfd2183b8, 0x4afcb56c, 0x2dd1d35b,
00129                      0x9a53e479, 0xb6f84565, 0xd28e49bc, 0x4bfb9790,
00130                      0xe1ddf2da, 0xa4cb7e33, 0x62fb1341, 0xcee4c6e8,
00131                      0xef20cada, 0x36774c01, 0xd07e9efe, 0x2bf11fb4,
00132                      0x95dbda4d, 0xae909198, 0xeaad8e71, 0x6b93d5a0,
00133                      0xd08ed1d0, 0xafc725e0, 0x8e3c5b2f, 0x8e7594b7,
00134                      0x8ff6e2fb, 0xf2122b64, 0x8888b812, 0x900df01c,
00135                      0x4fad5ea0, 0x688fc31c, 0xd1cff191, 0xb3a8c1ad,
00136                      0x2f2f2218, 0xbe0e1777, 0xea752dfe, 0x8b021fa1,
00137                      0xe5a0cc0f, 0xb56f74e8, 0x18acf3d6, 0xce89e299,
00138                      0xb4a84fe0, 0xfd13e0b7, 0x7cc43b81, 0xd2ada8d9,
00139                      0x165fa266, 0x80957705, 0x93cc7314, 0x211a1477,
00140                      0xe6ad2065, 0x77b5fa86, 0xc75442f5, 0xfb9d35cf,
00141                      0xebcdaf0c, 0x7b3e89a0, 0xd6411bd3, 0xae1e7e49,
00142                      0x00250e2d, 0x2071b35e, 0x226800bb, 0x57b8e0af,
00143                      0x2464369b, 0xf009b91e, 0x5563911d, 0x59dfa6aa,
00144                      0x78c14389, 0xd95a537f, 0x207d5ba2, 0x02e5b9c5,
00145                      0x83260376, 0x6295cfa9, 0x11c81968, 0x4e734a41,
00146                      0xb3472dca, 0x7b14a94a, 0x1b510052, 0x9a532915,
00147                      0xd60f573f, 0xbc9bc6e4, 0x2b60a476, 0x81e67400,
00148                      0x08ba6fb5, 0x571be91f, 0xf296ec6b, 0x2a0dd915,
00149                      0xb6636521, 0xe7b9f9b6, 0xff34052e, 0xc5855664,
00150               0x53b02d5d, 0xa99f8fa1, 0x08ba4799, 0x6e85076a},
00151               {
00152                      0x4b7a70e9, 0xb5b32944, 0xdb75092e, 0xc4192623,
00153                      0xad6ea6b0, 0x49a7df7d, 0x9cee60b8, 0x8fedb266,
00154                      0xecaa8c71, 0x699a17ff, 0x5664526c, 0xc2b19ee1,
00155                      0x193602a5, 0x75094c29, 0xa0591340, 0xe4183a3e,
00156                      0x3f54989a, 0x5b429d65, 0x6b8fe4d6, 0x99f73fd6,
00157                      0xa1d29c07, 0xefe830f5, 0x4d2d38e6, 0xf0255dc1,
00158                      0x4cdd2086, 0x8470eb26, 0x6382e9c6, 0x021ecc5e,
00159                      0x09686b3f, 0x3ebaefc9, 0x3c971814, 0x6b6a70a1,
00160                      0x687f3584, 0x52a0e286, 0xb79c5305, 0xaa500737,
00161                      0x3e07841c, 0x7fdeae5c, 0x8e7d44ec, 0x5716f2b8,
00162                      0xb03ada37, 0xf0500c0d, 0xf01c1f04, 0x0200b3ff,
00163                      0xae0cf51a, 0x3cb574b2, 0x25837a58, 0xdc0921bd,
00164                      0xd19113f9, 0x7ca92ff6, 0x94324773, 0x22f54701,
00165                      0x3ae5e581, 0x37c2dadc, 0xc8b57634, 0x9af3dda7,
00166                      0xa9446146, 0x0fd0030e, 0xecc8c73e, 0xa4751e41,
00167                      0xe238cd99, 0x3bea0e2f, 0x3280bba1, 0x183eb331,
00168                      0x4e548b38, 0x4f6db908, 0x6f420d03, 0xf60a04bf,
00169                      0x2cb81290, 0x24977c79, 0x5679b072, 0xbcaf89af,
00170                      0xde9a771f, 0xd9930810, 0xb38bae12, 0xdccf3f2e,
00171                      0x5512721f, 0x2e6b7124, 0x501adde6, 0x9f84cd87,
00172                      0x7a584718, 0x7408da17, 0xbc9f9abc, 0xe94b7d8c,
00173                      0xec7aec3a, 0xdb851dfa, 0x63094366, 0xc464c3d2,
00174                      0xef1c1847, 0x3215d908, 0xdd433b37, 0x24c2ba16,
00175                      0x12a14d43, 0x2a65c451, 0x50940002, 0x133ae4dd,
00176                      0x71dff89e, 0x10314e55, 0x81ac77d6, 0x5f11199b,
00177                      0x043556f1, 0xd7a3c76b, 0x3c11183b, 0x5924a509,
00178                      0xf28fe6ed, 0x97f1fbfa, 0x9ebabf2c, 0x1e153c6e,
00179                      0x86e34570, 0xeae96fb1, 0x860e5e0a, 0x5a3e2ab3,
00180                      0x771fe71c, 0x4e3d06fa, 0x2965dcb9, 0x99e71d0f,
00181                      0x803e89d6, 0x5266c825, 0x2e4cc978, 0x9c10b36a,
00182                      0xc6150eba, 0x94e2ea78, 0xa5fc3c53, 0x1e0a2df4,
00183                      0xf2f74ea7, 0x361d2b3d, 0x1939260f, 0x19c27960,
00184                      0x5223a708, 0xf71312b6, 0xebadfe6e, 0xeac31f66,
00185                      0xe3bc4595, 0xa67bc883, 0xb17f37d1, 0x018cff28,
00186                      0xc332ddef, 0xbe6c5aa5, 0x65582185, 0x68ab9802,
00187                      0xeecea50f, 0xdb2f953b, 0x2aef7dad, 0x5b6e2f84,
00188                      0x1521b628, 0x29076170, 0xecdd4775, 0x619f1510,
00189                      0x13cca830, 0xeb61bd96, 0x0334fe1e, 0xaa0363cf,
00190                      0xb5735c90, 0x4c70a239, 0xd59e9e0b, 0xcbaade14,
00191                      0xeecc86bc, 0x60622ca7, 0x9cab5cab, 0xb2f3846e,
00192                      0x648b1eaf, 0x19bdf0ca, 0xa02369b9, 0x655abb50,
00193                      0x40685a32, 0x3c2ab4b3, 0x319ee9d5, 0xc021b8f7,
00194                      0x9b540b19, 0x875fa099, 0x95f7997e, 0x623d7da8,
00195                      0xf837889a, 0x97e32d77, 0x11ed935f, 0x16681281,
00196                      0x0e358829, 0xc7e61fd6, 0x96dedfa1, 0x7858ba99,
00197                      0x57f584a5, 0x1b227263, 0x9b83c3ff, 0x1ac24696,
00198                      0xcdb30aeb, 0x532e3054, 0x8fd948e4, 0x6dbc3128,
00199                      0x58ebf2ef, 0x34c6ffea, 0xfe28ed61, 0xee7c3c73,
00200                      0x5d4a14d9, 0xe864b7e3, 0x42105d14, 0x203e13e0,
00201                      0x45eee2b6, 0xa3aaabea, 0xdb6c4f15, 0xfacb4fd0,
00202                      0xc742f442, 0xef6abbb5, 0x654f3b1d, 0x41cd2105,
00203                      0xd81e799e, 0x86854dc7, 0xe44b476a, 0x3d816250,
00204                      0xcf62a1f2, 0x5b8d2646, 0xfc8883a0, 0xc1c7b6a3,
00205                      0x7f1524c3, 0x69cb7492, 0x47848a0b, 0x5692b285,
00206                      0x095bbf00, 0xad19489d, 0x1462b174, 0x23820e00,
00207                      0x58428d2a, 0x0c55f5ea, 0x1dadf43e, 0x233f7061,
00208                      0x3372f092, 0x8d937e41, 0xd65fecf1, 0x6c223bdb,
00209                      0x7cde3759, 0xcbee7460, 0x4085f2a7, 0xce77326e,
00210                      0xa6078084, 0x19f8509e, 0xe8efd855, 0x61d99735,
00211                      0xa969a7aa, 0xc50c06c2, 0x5a04abfc, 0x800bcadc,
00212                      0x9e447a2e, 0xc3453484, 0xfdd56705, 0x0e1e9ec9,
00213                      0xdb73dbd3, 0x105588cd, 0x675fda79, 0xe3674340,
00214                      0xc5c43465, 0x713e38d8, 0x3d28f89e, 0xf16dff20,
00215               0x153e21e7, 0x8fb03d4a, 0xe6e39f2b, 0xdb83adf7},
00216               {
00217                      0xe93d5a68, 0x948140f7, 0xf64c261c, 0x94692934,
00218                      0x411520f7, 0x7602d4f7, 0xbcf46b2e, 0xd4a20068,
00219                      0xd4082471, 0x3320f46a, 0x43b7d4b7, 0x500061af,
00220                      0x1e39f62e, 0x97244546, 0x14214f74, 0xbf8b8840,
00221                      0x4d95fc1d, 0x96b591af, 0x70f4ddd3, 0x66a02f45,
00222                      0xbfbc09ec, 0x03bd9785, 0x7fac6dd0, 0x31cb8504,
00223                      0x96eb27b3, 0x55fd3941, 0xda2547e6, 0xabca0a9a,
00224                      0x28507825, 0x530429f4, 0x0a2c86da, 0xe9b66dfb,
00225                      0x68dc1462, 0xd7486900, 0x680ec0a4, 0x27a18dee,
00226                      0x4f3ffea2, 0xe887ad8c, 0xb58ce006, 0x7af4d6b6,
00227                      0xaace1e7c, 0xd3375fec, 0xce78a399, 0x406b2a42,
00228                      0x20fe9e35, 0xd9f385b9, 0xee39d7ab, 0x3b124e8b,
00229                      0x1dc9faf7, 0x4b6d1856, 0x26a36631, 0xeae397b2,
00230                      0x3a6efa74, 0xdd5b4332, 0x6841e7f7, 0xca7820fb,
00231                      0xfb0af54e, 0xd8feb397, 0x454056ac, 0xba489527,
00232                      0x55533a3a, 0x20838d87, 0xfe6ba9b7, 0xd096954b,
00233                      0x55a867bc, 0xa1159a58, 0xcca92963, 0x99e1db33,
00234                      0xa62a4a56, 0x3f3125f9, 0x5ef47e1c, 0x9029317c,
00235                      0xfdf8e802, 0x04272f70, 0x80bb155c, 0x05282ce3,
00236                      0x95c11548, 0xe4c66d22, 0x48c1133f, 0xc70f86dc,
00237                      0x07f9c9ee, 0x41041f0f, 0x404779a4, 0x5d886e17,
00238                      0x325f51eb, 0xd59bc0d1, 0xf2bcc18f, 0x41113564,
00239                      0x257b7834, 0x602a9c60, 0xdff8e8a3, 0x1f636c1b,
00240                      0x0e12b4c2, 0x02e1329e, 0xaf664fd1, 0xcad18115,
00241                      0x6b2395e0, 0x333e92e1, 0x3b240b62, 0xeebeb922,
00242                      0x85b2a20e, 0xe6ba0d99, 0xde720c8c, 0x2da2f728,
00243                      0xd0127845, 0x95b794fd, 0x647d0862, 0xe7ccf5f0,
00244                      0x5449a36f, 0x877d48fa, 0xc39dfd27, 0xf33e8d1e,
00245                      0x0a476341, 0x992eff74, 0x3a6f6eab, 0xf4f8fd37,
00246                      0xa812dc60, 0xa1ebddf8, 0x991be14c, 0xdb6e6b0d,
00247                      0xc67b5510, 0x6d672c37, 0x2765d43b, 0xdcd0e804,
00248                      0xf1290dc7, 0xcc00ffa3, 0xb5390f92, 0x690fed0b,
00249                      0x667b9ffb, 0xcedb7d9c, 0xa091cf0b, 0xd9155ea3,
00250                      0xbb132f88, 0x515bad24, 0x7b9479bf, 0x763bd6eb,
00251                      0x37392eb3, 0xcc115979, 0x8026e297, 0xf42e312d,
00252                      0x6842ada7, 0xc66a2b3b, 0x12754ccc, 0x782ef11c,
00253                      0x6a124237, 0xb79251e7, 0x06a1bbe6, 0x4bfb6350,
00254                      0x1a6b1018, 0x11caedfa, 0x3d25bdd8, 0xe2e1c3c9,
00255                      0x44421659, 0x0a121386, 0xd90cec6e, 0xd5abea2a,
00256                      0x64af674e, 0xda86a85f, 0xbebfe988, 0x64e4c3fe,
00257                      0x9dbc8057, 0xf0f7c086, 0x60787bf8, 0x6003604d,
00258                      0xd1fd8346, 0xf6381fb0, 0x7745ae04, 0xd736fccc,
00259                      0x83426b33, 0xf01eab71, 0xb0804187, 0x3c005e5f,
00260                      0x77a057be, 0xbde8ae24, 0x55464299, 0xbf582e61,
00261                      0x4e58f48f, 0xf2ddfda2, 0xf474ef38, 0x8789bdc2,
00262                      0x5366f9c3, 0xc8b38e74, 0xb475f255, 0x46fcd9b9,
00263                      0x7aeb2661, 0x8b1ddf84, 0x846a0e79, 0x915f95e2,
00264                      0x466e598e, 0x20b45770, 0x8cd55591, 0xc902de4c,
00265                      0xb90bace1, 0xbb8205d0, 0x11a86248, 0x7574a99e,
00266                      0xb77f19b6, 0xe0a9dc09, 0x662d09a1, 0xc4324633,
00267                      0xe85a1f02, 0x09f0be8c, 0x4a99a025, 0x1d6efe10,
00268                      0x1ab93d1d, 0x0ba5a4df, 0xa186f20f, 0x2868f169,
00269                      0xdcb7da83, 0x573906fe, 0xa1e2ce9b, 0x4fcd7f52,
00270                      0x50115e01, 0xa70683fa, 0xa002b5c4, 0x0de6d027,
00271                      0x9af88c27, 0x773f8641, 0xc3604c06, 0x61a806b5,
00272                      0xf0177a28, 0xc0f586e0, 0x006058aa, 0x30dc7d62,
00273                      0x11e69ed7, 0x2338ea63, 0x53c2dd94, 0xc2c21634,
00274                      0xbbcbee56, 0x90bcb6de, 0xebfc7da1, 0xce591d76,
00275                      0x6f05e409, 0x4b7c0188, 0x39720a3d, 0x7c927c24,
00276                      0x86e3725f, 0x724d9db9, 0x1ac15bb4, 0xd39eb8fc,
00277                      0xed545578, 0x08fca5b5, 0xd83d7cd3, 0x4dad0fc4,
00278                      0x1e50ef5e, 0xb161e6f8, 0xa28514d9, 0x6c51133c,
00279                      0x6fd5c7e7, 0x56e14ec4, 0x362abfce, 0xddc6c837,
00280               0xd79a3234, 0x92638212, 0x670efa8e, 0x406000e0},
00281               {
00282                      0x3a39ce37, 0xd3faf5cf, 0xabc27737, 0x5ac52d1b,
00283                      0x5cb0679e, 0x4fa33742, 0xd3822740, 0x99bc9bbe,
00284                      0xd5118e9d, 0xbf0f7315, 0xd62d1c7e, 0xc700c47b,
00285                      0xb78c1b6b, 0x21a19045, 0xb26eb1be, 0x6a366eb4,
00286                      0x5748ab2f, 0xbc946e79, 0xc6a376d2, 0x6549c2c8,
00287                      0x530ff8ee, 0x468dde7d, 0xd5730a1d, 0x4cd04dc6,
00288                      0x2939bbdb, 0xa9ba4650, 0xac9526e8, 0xbe5ee304,
00289                      0xa1fad5f0, 0x6a2d519a, 0x63ef8ce2, 0x9a86ee22,
00290                      0xc089c2b8, 0x43242ef6, 0xa51e03aa, 0x9cf2d0a4,
00291                      0x83c061ba, 0x9be96a4d, 0x8fe51550, 0xba645bd6,
00292                      0x2826a2f9, 0xa73a3ae1, 0x4ba99586, 0xef5562e9,
00293                      0xc72fefd3, 0xf752f7da, 0x3f046f69, 0x77fa0a59,
00294                      0x80e4a915, 0x87b08601, 0x9b09e6ad, 0x3b3ee593,
00295                      0xe990fd5a, 0x9e34d797, 0x2cf0b7d9, 0x022b8b51,
00296                      0x96d5ac3a, 0x017da67d, 0xd1cf3ed6, 0x7c7d2d28,
00297                      0x1f9f25cf, 0xadf2b89b, 0x5ad6b472, 0x5a88f54c,
00298                      0xe029ac71, 0xe019a5e6, 0x47b0acfd, 0xed93fa9b,
00299                      0xe8d3c48d, 0x283b57cc, 0xf8d56629, 0x79132e28,
00300                      0x785f0191, 0xed756055, 0xf7960e44, 0xe3d35e8c,
00301                      0x15056dd4, 0x88f46dba, 0x03a16125, 0x0564f0bd,
00302                      0xc3eb9e15, 0x3c9057a2, 0x97271aec, 0xa93a072a,
00303                      0x1b3f6d9b, 0x1e6321f5, 0xf59c66fb, 0x26dcf319,
00304                      0x7533d928, 0xb155fdf5, 0x03563482, 0x8aba3cbb,
00305                      0x28517711, 0xc20ad9f8, 0xabcc5167, 0xccad925f,
00306                      0x4de81751, 0x3830dc8e, 0x379d5862, 0x9320f991,
00307                      0xea7a90c2, 0xfb3e7bce, 0x5121ce64, 0x774fbe32,
00308                      0xa8b6e37e, 0xc3293d46, 0x48de5369, 0x6413e680,
00309                      0xa2ae0810, 0xdd6db224, 0x69852dfd, 0x09072166,
00310                      0xb39a460a, 0x6445c0dd, 0x586cdecf, 0x1c20c8ae,
00311                      0x5bbef7dd, 0x1b588d40, 0xccd2017f, 0x6bb4e3bb,
00312                      0xdda26a7e, 0x3a59ff45, 0x3e350a44, 0xbcb4cdd5,
00313                      0x72eacea8, 0xfa6484bb, 0x8d6612ae, 0xbf3c6f47,
00314                      0xd29be463, 0x542f5d9e, 0xaec2771b, 0xf64e6370,
00315                      0x740e0d8d, 0xe75b1357, 0xf8721671, 0xaf537d5d,
00316                      0x4040cb08, 0x4eb4e2cc, 0x34d2466a, 0x0115af84,
00317                      0xe1b00428, 0x95983a1d, 0x06b89fb4, 0xce6ea048,
00318                      0x6f3f3b82, 0x3520ab82, 0x011a1d4b, 0x277227f8,
00319                      0x611560b1, 0xe7933fdc, 0xbb3a792b, 0x344525bd,
00320                      0xa08839e1, 0x51ce794b, 0x2f32c9b7, 0xa01fbac9,
00321                      0xe01cc87e, 0xbcc7d1f6, 0xcf0111c3, 0xa1e8aac7,
00322                      0x1a908749, 0xd44fbd9a, 0xd0dadecb, 0xd50ada38,
00323                      0x0339c32a, 0xc6913667, 0x8df9317c, 0xe0b12b4f,
00324                      0xf79e59b7, 0x43f5bb3a, 0xf2d519ff, 0x27d9459c,
00325                      0xbf97222c, 0x15e6fc2a, 0x0f91fc71, 0x9b941525,
00326                      0xfae59361, 0xceb69ceb, 0xc2a86459, 0x12baa8d1,
00327                      0xb6c1075e, 0xe3056a0c, 0x10d25065, 0xcb03a442,
00328                      0xe0ec6e0e, 0x1698db3b, 0x4c98a0be, 0x3278e964,
00329                      0x9f1f9532, 0xe0d392df, 0xd3a0342b, 0x8971f21e,
00330                      0x1b0a7441, 0x4ba3348c, 0xc5be7120, 0xc37632d8,
00331                      0xdf359f8d, 0x9b992f2e, 0xe60b6f47, 0x0fe3f11d,
00332                      0xe54cda54, 0x1edad891, 0xce6279cf, 0xcd3e7e6f,
00333                      0x1618b166, 0xfd2c1d05, 0x848fd2c5, 0xf6fb2299,
00334                      0xf523f357, 0xa6327623, 0x93a83531, 0x56cccd02,
00335                      0xacf08162, 0x5a75ebb5, 0x6e163697, 0x88d273cc,
00336                      0xde966292, 0x81b949d0, 0x4c50901b, 0x71c65614,
00337                      0xe6c6c7bd, 0x327a140a, 0x45e1d006, 0xc3f27b9a,
00338                      0xc9aa53fd, 0x62a80f00, 0xbb25bfe2, 0x35bdd2f6,
00339                      0x71126905, 0xb2040222, 0xb6cbcf7c, 0xcd769c2b,
00340                      0x53113ec0, 0x1640e3d3, 0x38abbd60, 0x2547adf0,
00341                      0xba38209c, 0xf746ce76, 0x77afa1c5, 0x20756060,
00342                      0x85cbfe4e, 0x8ae88dd8, 0x7aaaf9b0, 0x4cf9aa7e,
00343                      0x1948c25c, 0x02fb8a8c, 0x01c36ae4, 0xd6ebe1f9,
00344                      0x90d4f869, 0xa65cdea0, 0x3f09252d, 0xc208e69f,
00345               0xb74e6132, 0xce77e25b, 0x578fdfe3, 0x3ac372e6}
00346        },
00347        {
00348               0x243f6a88, 0x85a308d3, 0x13198a2e, 0x03707344,
00349               0xa4093822, 0x299f31d0, 0x082efa98, 0xec4e6c89,
00350               0x452821e6, 0x38d01377, 0xbe5466cf, 0x34e90c6c,
00351               0xc0ac29b7, 0xc97c50dd, 0x3f84d5b5, 0xb5470917,
00352               0x9216d5d9, 0x8979fb1b
00353        } };
00354 
00355        *c = initstate;
00356 }
00357 
00358 u_int32_t
00359 pybc_Blowfish_stream2word(const u_int8_t *data, u_int16_t databytes,
00360     u_int16_t *current)
00361 {
00362        u_int8_t i;
00363        u_int16_t j;
00364        u_int32_t temp;
00365 
00366        temp = 0x00000000;
00367        j = *current;
00368 
00369        for (i = 0; i < 4; i++, j++) {
00370               if (j >= databytes)
00371                      j = 0;
00372               temp = (temp << 8) | data[j];
00373        }
00374 
00375        *current = j;
00376        return temp;
00377 }
00378 
00379 void
00380 pybc_Blowfish_expand0state(pybc_blf_ctx *c, const u_int8_t *key,
00381     u_int16_t keybytes)
00382 {
00383        u_int16_t i;
00384        u_int16_t j;
00385        u_int16_t k;
00386        u_int32_t temp;
00387        u_int32_t datal;
00388        u_int32_t datar;
00389 
00390        j = 0;
00391        for (i = 0; i < BLF_N + 2; i++) {
00392               /* Extract 4 int8 to 1 int32 from keystream */
00393               temp = pybc_Blowfish_stream2word(key, keybytes, &j);
00394               c->P[i] = c->P[i] ^ temp;
00395        }
00396 
00397        j = 0;
00398        datal = 0x00000000;
00399        datar = 0x00000000;
00400        for (i = 0; i < BLF_N + 2; i += 2) {
00401               pybc_Blowfish_encipher(c, &datal, &datar);
00402 
00403               c->P[i] = datal;
00404               c->P[i + 1] = datar;
00405        }
00406 
00407        for (i = 0; i < 4; i++) {
00408               for (k = 0; k < 256; k += 2) {
00409                      pybc_Blowfish_encipher(c, &datal, &datar);
00410 
00411                      c->S[i][k] = datal;
00412                      c->S[i][k + 1] = datar;
00413               }
00414        }
00415 }
00416 
00417 
00418 void
00419 pybc_Blowfish_expandstate(pybc_blf_ctx *c, const u_int8_t *data,
00420     u_int16_t databytes, const u_int8_t *key, u_int16_t keybytes)
00421 {
00422        u_int16_t i;
00423        u_int16_t j;
00424        u_int16_t k;
00425        u_int32_t temp;
00426        u_int32_t datal;
00427        u_int32_t datar;
00428 
00429        j = 0;
00430        for (i = 0; i < BLF_N + 2; i++) {
00431               /* Extract 4 int8 to 1 int32 from keystream */
00432               temp = pybc_Blowfish_stream2word(key, keybytes, &j);
00433               c->P[i] = c->P[i] ^ temp;
00434        }
00435 
00436        j = 0;
00437        datal = 0x00000000;
00438        datar = 0x00000000;
00439        for (i = 0; i < BLF_N + 2; i += 2) {
00440               datal ^= pybc_Blowfish_stream2word(data, databytes, &j);
00441               datar ^= pybc_Blowfish_stream2word(data, databytes, &j);
00442               pybc_Blowfish_encipher(c, &datal, &datar);
00443 
00444               c->P[i] = datal;
00445               c->P[i + 1] = datar;
00446        }
00447 
00448        for (i = 0; i < 4; i++) {
00449               for (k = 0; k < 256; k += 2) {
00450                      datal ^= pybc_Blowfish_stream2word(data, databytes, &j);
00451                      datar ^= pybc_Blowfish_stream2word(data, databytes, &j);
00452                      pybc_Blowfish_encipher(c, &datal, &datar);
00453 
00454                      c->S[i][k] = datal;
00455                      c->S[i][k + 1] = datar;
00456               }
00457        }
00458 
00459 }
00460 
00461 void
00462 pybc_blf_enc(pybc_blf_ctx *c, u_int32_t *data, u_int16_t blocks)
00463 {
00464        u_int32_t *d;
00465        u_int16_t i;
00466 
00467        d = data;
00468        for (i = 0; i < blocks; i++) {
00469               pybc_Blowfish_encipher(c, d, d + 1);
00470               d += 2;
00471        }
00472 }