00001
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00029
00030
00031
00032
00033
00034
00035 #include "system.h"
00036 #include "beecrypt.h"
00037 #include "blowfishopt.h"
00038 #include "blowfish.h"
00039 #include "endianness.h"
00040 #include "debug.h"
00041
00044
00045 static uint32 _bf_p[BLOWFISHPSIZE] = {
00046 0x243f6a88, 0x85a308d3, 0x13198a2e, 0x03707344,
00047 0xa4093822, 0x299f31d0, 0x082efa98, 0xec4e6c89,
00048 0x452821e6, 0x38d01377, 0xbe5466cf, 0x34e90c6c,
00049 0xc0ac29b7, 0xc97c50dd, 0x3f84d5b5, 0xb5470917,
00050 0x9216d5d9, 0x8979fb1b
00051 };
00052
00055
00056 static uint32 _bf_s[1024] = {
00057 0xd1310ba6, 0x98dfb5ac, 0x2ffd72db, 0xd01adfb7,
00058 0xb8e1afed, 0x6a267e96, 0xba7c9045, 0xf12c7f99,
00059 0x24a19947, 0xb3916cf7, 0x0801f2e2, 0x858efc16,
00060 0x636920d8, 0x71574e69, 0xa458fea3, 0xf4933d7e,
00061 0x0d95748f, 0x728eb658, 0x718bcd58, 0x82154aee,
00062 0x7b54a41d, 0xc25a59b5, 0x9c30d539, 0x2af26013,
00063 0xc5d1b023, 0x286085f0, 0xca417918, 0xb8db38ef,
00064 0x8e79dcb0, 0x603a180e, 0x6c9e0e8b, 0xb01e8a3e,
00065 0xd71577c1, 0xbd314b27, 0x78af2fda, 0x55605c60,
00066 0xe65525f3, 0xaa55ab94, 0x57489862, 0x63e81440,
00067 0x55ca396a, 0x2aab10b6, 0xb4cc5c34, 0x1141e8ce,
00068 0xa15486af, 0x7c72e993, 0xb3ee1411, 0x636fbc2a,
00069 0x2ba9c55d, 0x741831f6, 0xce5c3e16, 0x9b87931e,
00070 0xafd6ba33, 0x6c24cf5c, 0x7a325381, 0x28958677,
00071 0x3b8f4898, 0x6b4bb9af, 0xc4bfe81b, 0x66282193,
00072 0x61d809cc, 0xfb21a991, 0x487cac60, 0x5dec8032,
00073 0xef845d5d, 0xe98575b1, 0xdc262302, 0xeb651b88,
00074 0x23893e81, 0xd396acc5, 0x0f6d6ff3, 0x83f44239,
00075 0x2e0b4482, 0xa4842004, 0x69c8f04a, 0x9e1f9b5e,
00076 0x21c66842, 0xf6e96c9a, 0x670c9c61, 0xabd388f0,
00077 0x6a51a0d2, 0xd8542f68, 0x960fa728, 0xab5133a3,
00078 0x6eef0b6c, 0x137a3be4, 0xba3bf050, 0x7efb2a98,
00079 0xa1f1651d, 0x39af0176, 0x66ca593e, 0x82430e88,
00080 0x8cee8619, 0x456f9fb4, 0x7d84a5c3, 0x3b8b5ebe,
00081 0xe06f75d8, 0x85c12073, 0x401a449f, 0x56c16aa6,
00082 0x4ed3aa62, 0x363f7706, 0x1bfedf72, 0x429b023d,
00083 0x37d0d724, 0xd00a1248, 0xdb0fead3, 0x49f1c09b,
00084 0x075372c9, 0x80991b7b, 0x25d479d8, 0xf6e8def7,
00085 0xe3fe501a, 0xb6794c3b, 0x976ce0bd, 0x04c006ba,
00086 0xc1a94fb6, 0x409f60c4, 0x5e5c9ec2, 0x196a2463,
00087 0x68fb6faf, 0x3e6c53b5, 0x1339b2eb, 0x3b52ec6f,
00088 0x6dfc511f, 0x9b30952c, 0xcc814544, 0xaf5ebd09,
00089 0xbee3d004, 0xde334afd, 0x660f2807, 0x192e4bb3,
00090 0xc0cba857, 0x45c8740f, 0xd20b5f39, 0xb9d3fbdb,
00091 0x5579c0bd, 0x1a60320a, 0xd6a100c6, 0x402c7279,
00092 0x679f25fe, 0xfb1fa3cc, 0x8ea5e9f8, 0xdb3222f8,
00093 0x3c7516df, 0xfd616b15, 0x2f501ec8, 0xad0552ab,
00094 0x323db5fa, 0xfd238760, 0x53317b48, 0x3e00df82,
00095 0x9e5c57bb, 0xca6f8ca0, 0x1a87562e, 0xdf1769db,
00096 0xd542a8f6, 0x287effc3, 0xac6732c6, 0x8c4f5573,
00097 0x695b27b0, 0xbbca58c8, 0xe1ffa35d, 0xb8f011a0,
00098 0x10fa3d98, 0xfd2183b8, 0x4afcb56c, 0x2dd1d35b,
00099 0x9a53e479, 0xb6f84565, 0xd28e49bc, 0x4bfb9790,
00100 0xe1ddf2da, 0xa4cb7e33, 0x62fb1341, 0xcee4c6e8,
00101 0xef20cada, 0x36774c01, 0xd07e9efe, 0x2bf11fb4,
00102 0x95dbda4d, 0xae909198, 0xeaad8e71, 0x6b93d5a0,
00103 0xd08ed1d0, 0xafc725e0, 0x8e3c5b2f, 0x8e7594b7,
00104 0x8ff6e2fb, 0xf2122b64, 0x8888b812, 0x900df01c,
00105 0x4fad5ea0, 0x688fc31c, 0xd1cff191, 0xb3a8c1ad,
00106 0x2f2f2218, 0xbe0e1777, 0xea752dfe, 0x8b021fa1,
00107 0xe5a0cc0f, 0xb56f74e8, 0x18acf3d6, 0xce89e299,
00108 0xb4a84fe0, 0xfd13e0b7, 0x7cc43b81, 0xd2ada8d9,
00109 0x165fa266, 0x80957705, 0x93cc7314, 0x211a1477,
00110 0xe6ad2065, 0x77b5fa86, 0xc75442f5, 0xfb9d35cf,
00111 0xebcdaf0c, 0x7b3e89a0, 0xd6411bd3, 0xae1e7e49,
00112 0x00250e2d, 0x2071b35e, 0x226800bb, 0x57b8e0af,
00113 0x2464369b, 0xf009b91e, 0x5563911d, 0x59dfa6aa,
00114 0x78c14389, 0xd95a537f, 0x207d5ba2, 0x02e5b9c5,
00115 0x83260376, 0x6295cfa9, 0x11c81968, 0x4e734a41,
00116 0xb3472dca, 0x7b14a94a, 0x1b510052, 0x9a532915,
00117 0xd60f573f, 0xbc9bc6e4, 0x2b60a476, 0x81e67400,
00118 0x08ba6fb5, 0x571be91f, 0xf296ec6b, 0x2a0dd915,
00119 0xb6636521, 0xe7b9f9b6, 0xff34052e, 0xc5855664,
00120 0x53b02d5d, 0xa99f8fa1, 0x08ba4799, 0x6e85076a,
00121 0x4b7a70e9, 0xb5b32944, 0xdb75092e, 0xc4192623,
00122 0xad6ea6b0, 0x49a7df7d, 0x9cee60b8, 0x8fedb266,
00123 0xecaa8c71, 0x699a17ff, 0x5664526c, 0xc2b19ee1,
00124 0x193602a5, 0x75094c29, 0xa0591340, 0xe4183a3e,
00125 0x3f54989a, 0x5b429d65, 0x6b8fe4d6, 0x99f73fd6,
00126 0xa1d29c07, 0xefe830f5, 0x4d2d38e6, 0xf0255dc1,
00127 0x4cdd2086, 0x8470eb26, 0x6382e9c6, 0x021ecc5e,
00128 0x09686b3f, 0x3ebaefc9, 0x3c971814, 0x6b6a70a1,
00129 0x687f3584, 0x52a0e286, 0xb79c5305, 0xaa500737,
00130 0x3e07841c, 0x7fdeae5c, 0x8e7d44ec, 0x5716f2b8,
00131 0xb03ada37, 0xf0500c0d, 0xf01c1f04, 0x0200b3ff,
00132 0xae0cf51a, 0x3cb574b2, 0x25837a58, 0xdc0921bd,
00133 0xd19113f9, 0x7ca92ff6, 0x94324773, 0x22f54701,
00134 0x3ae5e581, 0x37c2dadc, 0xc8b57634, 0x9af3dda7,
00135 0xa9446146, 0x0fd0030e, 0xecc8c73e, 0xa4751e41,
00136 0xe238cd99, 0x3bea0e2f, 0x3280bba1, 0x183eb331,
00137 0x4e548b38, 0x4f6db908, 0x6f420d03, 0xf60a04bf,
00138 0x2cb81290, 0x24977c79, 0x5679b072, 0xbcaf89af,
00139 0xde9a771f, 0xd9930810, 0xb38bae12, 0xdccf3f2e,
00140 0x5512721f, 0x2e6b7124, 0x501adde6, 0x9f84cd87,
00141 0x7a584718, 0x7408da17, 0xbc9f9abc, 0xe94b7d8c,
00142 0xec7aec3a, 0xdb851dfa, 0x63094366, 0xc464c3d2,
00143 0xef1c1847, 0x3215d908, 0xdd433b37, 0x24c2ba16,
00144 0x12a14d43, 0x2a65c451, 0x50940002, 0x133ae4dd,
00145 0x71dff89e, 0x10314e55, 0x81ac77d6, 0x5f11199b,
00146 0x043556f1, 0xd7a3c76b, 0x3c11183b, 0x5924a509,
00147 0xf28fe6ed, 0x97f1fbfa, 0x9ebabf2c, 0x1e153c6e,
00148 0x86e34570, 0xeae96fb1, 0x860e5e0a, 0x5a3e2ab3,
00149 0x771fe71c, 0x4e3d06fa, 0x2965dcb9, 0x99e71d0f,
00150 0x803e89d6, 0x5266c825, 0x2e4cc978, 0x9c10b36a,
00151 0xc6150eba, 0x94e2ea78, 0xa5fc3c53, 0x1e0a2df4,
00152 0xf2f74ea7, 0x361d2b3d, 0x1939260f, 0x19c27960,
00153 0x5223a708, 0xf71312b6, 0xebadfe6e, 0xeac31f66,
00154 0xe3bc4595, 0xa67bc883, 0xb17f37d1, 0x018cff28,
00155 0xc332ddef, 0xbe6c5aa5, 0x65582185, 0x68ab9802,
00156 0xeecea50f, 0xdb2f953b, 0x2aef7dad, 0x5b6e2f84,
00157 0x1521b628, 0x29076170, 0xecdd4775, 0x619f1510,
00158 0x13cca830, 0xeb61bd96, 0x0334fe1e, 0xaa0363cf,
00159 0xb5735c90, 0x4c70a239, 0xd59e9e0b, 0xcbaade14,
00160 0xeecc86bc, 0x60622ca7, 0x9cab5cab, 0xb2f3846e,
00161 0x648b1eaf, 0x19bdf0ca, 0xa02369b9, 0x655abb50,
00162 0x40685a32, 0x3c2ab4b3, 0x319ee9d5, 0xc021b8f7,
00163 0x9b540b19, 0x875fa099, 0x95f7997e, 0x623d7da8,
00164 0xf837889a, 0x97e32d77, 0x11ed935f, 0x16681281,
00165 0x0e358829, 0xc7e61fd6, 0x96dedfa1, 0x7858ba99,
00166 0x57f584a5, 0x1b227263, 0x9b83c3ff, 0x1ac24696,
00167 0xcdb30aeb, 0x532e3054, 0x8fd948e4, 0x6dbc3128,
00168 0x58ebf2ef, 0x34c6ffea, 0xfe28ed61, 0xee7c3c73,
00169 0x5d4a14d9, 0xe864b7e3, 0x42105d14, 0x203e13e0,
00170 0x45eee2b6, 0xa3aaabea, 0xdb6c4f15, 0xfacb4fd0,
00171 0xc742f442, 0xef6abbb5, 0x654f3b1d, 0x41cd2105,
00172 0xd81e799e, 0x86854dc7, 0xe44b476a, 0x3d816250,
00173 0xcf62a1f2, 0x5b8d2646, 0xfc8883a0, 0xc1c7b6a3,
00174 0x7f1524c3, 0x69cb7492, 0x47848a0b, 0x5692b285,
00175 0x095bbf00, 0xad19489d, 0x1462b174, 0x23820e00,
00176 0x58428d2a, 0x0c55f5ea, 0x1dadf43e, 0x233f7061,
00177 0x3372f092, 0x8d937e41, 0xd65fecf1, 0x6c223bdb,
00178 0x7cde3759, 0xcbee7460, 0x4085f2a7, 0xce77326e,
00179 0xa6078084, 0x19f8509e, 0xe8efd855, 0x61d99735,
00180 0xa969a7aa, 0xc50c06c2, 0x5a04abfc, 0x800bcadc,
00181 0x9e447a2e, 0xc3453484, 0xfdd56705, 0x0e1e9ec9,
00182 0xdb73dbd3, 0x105588cd, 0x675fda79, 0xe3674340,
00183 0xc5c43465, 0x713e38d8, 0x3d28f89e, 0xf16dff20,
00184 0x153e21e7, 0x8fb03d4a, 0xe6e39f2b, 0xdb83adf7,
00185 0xe93d5a68, 0x948140f7, 0xf64c261c, 0x94692934,
00186 0x411520f7, 0x7602d4f7, 0xbcf46b2e, 0xd4a20068,
00187 0xd4082471, 0x3320f46a, 0x43b7d4b7, 0x500061af,
00188 0x1e39f62e, 0x97244546, 0x14214f74, 0xbf8b8840,
00189 0x4d95fc1d, 0x96b591af, 0x70f4ddd3, 0x66a02f45,
00190 0xbfbc09ec, 0x03bd9785, 0x7fac6dd0, 0x31cb8504,
00191 0x96eb27b3, 0x55fd3941, 0xda2547e6, 0xabca0a9a,
00192 0x28507825, 0x530429f4, 0x0a2c86da, 0xe9b66dfb,
00193 0x68dc1462, 0xd7486900, 0x680ec0a4, 0x27a18dee,
00194 0x4f3ffea2, 0xe887ad8c, 0xb58ce006, 0x7af4d6b6,
00195 0xaace1e7c, 0xd3375fec, 0xce78a399, 0x406b2a42,
00196 0x20fe9e35, 0xd9f385b9, 0xee39d7ab, 0x3b124e8b,
00197 0x1dc9faf7, 0x4b6d1856, 0x26a36631, 0xeae397b2,
00198 0x3a6efa74, 0xdd5b4332, 0x6841e7f7, 0xca7820fb,
00199 0xfb0af54e, 0xd8feb397, 0x454056ac, 0xba489527,
00200 0x55533a3a, 0x20838d87, 0xfe6ba9b7, 0xd096954b,
00201 0x55a867bc, 0xa1159a58, 0xcca92963, 0x99e1db33,
00202 0xa62a4a56, 0x3f3125f9, 0x5ef47e1c, 0x9029317c,
00203 0xfdf8e802, 0x04272f70, 0x80bb155c, 0x05282ce3,
00204 0x95c11548, 0xe4c66d22, 0x48c1133f, 0xc70f86dc,
00205 0x07f9c9ee, 0x41041f0f, 0x404779a4, 0x5d886e17,
00206 0x325f51eb, 0xd59bc0d1, 0xf2bcc18f, 0x41113564,
00207 0x257b7834, 0x602a9c60, 0xdff8e8a3, 0x1f636c1b,
00208 0x0e12b4c2, 0x02e1329e, 0xaf664fd1, 0xcad18115,
00209 0x6b2395e0, 0x333e92e1, 0x3b240b62, 0xeebeb922,
00210 0x85b2a20e, 0xe6ba0d99, 0xde720c8c, 0x2da2f728,
00211 0xd0127845, 0x95b794fd, 0x647d0862, 0xe7ccf5f0,
00212 0x5449a36f, 0x877d48fa, 0xc39dfd27, 0xf33e8d1e,
00213 0x0a476341, 0x992eff74, 0x3a6f6eab, 0xf4f8fd37,
00214 0xa812dc60, 0xa1ebddf8, 0x991be14c, 0xdb6e6b0d,
00215 0xc67b5510, 0x6d672c37, 0x2765d43b, 0xdcd0e804,
00216 0xf1290dc7, 0xcc00ffa3, 0xb5390f92, 0x690fed0b,
00217 0x667b9ffb, 0xcedb7d9c, 0xa091cf0b, 0xd9155ea3,
00218 0xbb132f88, 0x515bad24, 0x7b9479bf, 0x763bd6eb,
00219 0x37392eb3, 0xcc115979, 0x8026e297, 0xf42e312d,
00220 0x6842ada7, 0xc66a2b3b, 0x12754ccc, 0x782ef11c,
00221 0x6a124237, 0xb79251e7, 0x06a1bbe6, 0x4bfb6350,
00222 0x1a6b1018, 0x11caedfa, 0x3d25bdd8, 0xe2e1c3c9,
00223 0x44421659, 0x0a121386, 0xd90cec6e, 0xd5abea2a,
00224 0x64af674e, 0xda86a85f, 0xbebfe988, 0x64e4c3fe,
00225 0x9dbc8057, 0xf0f7c086, 0x60787bf8, 0x6003604d,
00226 0xd1fd8346, 0xf6381fb0, 0x7745ae04, 0xd736fccc,
00227 0x83426b33, 0xf01eab71, 0xb0804187, 0x3c005e5f,
00228 0x77a057be, 0xbde8ae24, 0x55464299, 0xbf582e61,
00229 0x4e58f48f, 0xf2ddfda2, 0xf474ef38, 0x8789bdc2,
00230 0x5366f9c3, 0xc8b38e74, 0xb475f255, 0x46fcd9b9,
00231 0x7aeb2661, 0x8b1ddf84, 0x846a0e79, 0x915f95e2,
00232 0x466e598e, 0x20b45770, 0x8cd55591, 0xc902de4c,
00233 0xb90bace1, 0xbb8205d0, 0x11a86248, 0x7574a99e,
00234 0xb77f19b6, 0xe0a9dc09, 0x662d09a1, 0xc4324633,
00235 0xe85a1f02, 0x09f0be8c, 0x4a99a025, 0x1d6efe10,
00236 0x1ab93d1d, 0x0ba5a4df, 0xa186f20f, 0x2868f169,
00237 0xdcb7da83, 0x573906fe, 0xa1e2ce9b, 0x4fcd7f52,
00238 0x50115e01, 0xa70683fa, 0xa002b5c4, 0x0de6d027,
00239 0x9af88c27, 0x773f8641, 0xc3604c06, 0x61a806b5,
00240 0xf0177a28, 0xc0f586e0, 0x006058aa, 0x30dc7d62,
00241 0x11e69ed7, 0x2338ea63, 0x53c2dd94, 0xc2c21634,
00242 0xbbcbee56, 0x90bcb6de, 0xebfc7da1, 0xce591d76,
00243 0x6f05e409, 0x4b7c0188, 0x39720a3d, 0x7c927c24,
00244 0x86e3725f, 0x724d9db9, 0x1ac15bb4, 0xd39eb8fc,
00245 0xed545578, 0x08fca5b5, 0xd83d7cd3, 0x4dad0fc4,
00246 0x1e50ef5e, 0xb161e6f8, 0xa28514d9, 0x6c51133c,
00247 0x6fd5c7e7, 0x56e14ec4, 0x362abfce, 0xddc6c837,
00248 0xd79a3234, 0x92638212, 0x670efa8e, 0x406000e0,
00249 0x3a39ce37, 0xd3faf5cf, 0xabc27737, 0x5ac52d1b,
00250 0x5cb0679e, 0x4fa33742, 0xd3822740, 0x99bc9bbe,
00251 0xd5118e9d, 0xbf0f7315, 0xd62d1c7e, 0xc700c47b,
00252 0xb78c1b6b, 0x21a19045, 0xb26eb1be, 0x6a366eb4,
00253 0x5748ab2f, 0xbc946e79, 0xc6a376d2, 0x6549c2c8,
00254 0x530ff8ee, 0x468dde7d, 0xd5730a1d, 0x4cd04dc6,
00255 0x2939bbdb, 0xa9ba4650, 0xac9526e8, 0xbe5ee304,
00256 0xa1fad5f0, 0x6a2d519a, 0x63ef8ce2, 0x9a86ee22,
00257 0xc089c2b8, 0x43242ef6, 0xa51e03aa, 0x9cf2d0a4,
00258 0x83c061ba, 0x9be96a4d, 0x8fe51550, 0xba645bd6,
00259 0x2826a2f9, 0xa73a3ae1, 0x4ba99586, 0xef5562e9,
00260 0xc72fefd3, 0xf752f7da, 0x3f046f69, 0x77fa0a59,
00261 0x80e4a915, 0x87b08601, 0x9b09e6ad, 0x3b3ee593,
00262 0xe990fd5a, 0x9e34d797, 0x2cf0b7d9, 0x022b8b51,
00263 0x96d5ac3a, 0x017da67d, 0xd1cf3ed6, 0x7c7d2d28,
00264 0x1f9f25cf, 0xadf2b89b, 0x5ad6b472, 0x5a88f54c,
00265 0xe029ac71, 0xe019a5e6, 0x47b0acfd, 0xed93fa9b,
00266 0xe8d3c48d, 0x283b57cc, 0xf8d56629, 0x79132e28,
00267 0x785f0191, 0xed756055, 0xf7960e44, 0xe3d35e8c,
00268 0x15056dd4, 0x88f46dba, 0x03a16125, 0x0564f0bd,
00269 0xc3eb9e15, 0x3c9057a2, 0x97271aec, 0xa93a072a,
00270 0x1b3f6d9b, 0x1e6321f5, 0xf59c66fb, 0x26dcf319,
00271 0x7533d928, 0xb155fdf5, 0x03563482, 0x8aba3cbb,
00272 0x28517711, 0xc20ad9f8, 0xabcc5167, 0xccad925f,
00273 0x4de81751, 0x3830dc8e, 0x379d5862, 0x9320f991,
00274 0xea7a90c2, 0xfb3e7bce, 0x5121ce64, 0x774fbe32,
00275 0xa8b6e37e, 0xc3293d46, 0x48de5369, 0x6413e680,
00276 0xa2ae0810, 0xdd6db224, 0x69852dfd, 0x09072166,
00277 0xb39a460a, 0x6445c0dd, 0x586cdecf, 0x1c20c8ae,
00278 0x5bbef7dd, 0x1b588d40, 0xccd2017f, 0x6bb4e3bb,
00279 0xdda26a7e, 0x3a59ff45, 0x3e350a44, 0xbcb4cdd5,
00280 0x72eacea8, 0xfa6484bb, 0x8d6612ae, 0xbf3c6f47,
00281 0xd29be463, 0x542f5d9e, 0xaec2771b, 0xf64e6370,
00282 0x740e0d8d, 0xe75b1357, 0xf8721671, 0xaf537d5d,
00283 0x4040cb08, 0x4eb4e2cc, 0x34d2466a, 0x0115af84,
00284 0xe1b00428, 0x95983a1d, 0x06b89fb4, 0xce6ea048,
00285 0x6f3f3b82, 0x3520ab82, 0x011a1d4b, 0x277227f8,
00286 0x611560b1, 0xe7933fdc, 0xbb3a792b, 0x344525bd,
00287 0xa08839e1, 0x51ce794b, 0x2f32c9b7, 0xa01fbac9,
00288 0xe01cc87e, 0xbcc7d1f6, 0xcf0111c3, 0xa1e8aac7,
00289 0x1a908749, 0xd44fbd9a, 0xd0dadecb, 0xd50ada38,
00290 0x0339c32a, 0xc6913667, 0x8df9317c, 0xe0b12b4f,
00291 0xf79e59b7, 0x43f5bb3a, 0xf2d519ff, 0x27d9459c,
00292 0xbf97222c, 0x15e6fc2a, 0x0f91fc71, 0x9b941525,
00293 0xfae59361, 0xceb69ceb, 0xc2a86459, 0x12baa8d1,
00294 0xb6c1075e, 0xe3056a0c, 0x10d25065, 0xcb03a442,
00295 0xe0ec6e0e, 0x1698db3b, 0x4c98a0be, 0x3278e964,
00296 0x9f1f9532, 0xe0d392df, 0xd3a0342b, 0x8971f21e,
00297 0x1b0a7441, 0x4ba3348c, 0xc5be7120, 0xc37632d8,
00298 0xdf359f8d, 0x9b992f2e, 0xe60b6f47, 0x0fe3f11d,
00299 0xe54cda54, 0x1edad891, 0xce6279cf, 0xcd3e7e6f,
00300 0x1618b166, 0xfd2c1d05, 0x848fd2c5, 0xf6fb2299,
00301 0xf523f357, 0xa6327623, 0x93a83531, 0x56cccd02,
00302 0xacf08162, 0x5a75ebb5, 0x6e163697, 0x88d273cc,
00303 0xde966292, 0x81b949d0, 0x4c50901b, 0x71c65614,
00304 0xe6c6c7bd, 0x327a140a, 0x45e1d006, 0xc3f27b9a,
00305 0xc9aa53fd, 0x62a80f00, 0xbb25bfe2, 0x35bdd2f6,
00306 0x71126905, 0xb2040222, 0xb6cbcf7c, 0xcd769c2b,
00307 0x53113ec0, 0x1640e3d3, 0x38abbd60, 0x2547adf0,
00308 0xba38209c, 0xf746ce76, 0x77afa1c5, 0x20756060,
00309 0x85cbfe4e, 0x8ae88dd8, 0x7aaaf9b0, 0x4cf9aa7e,
00310 0x1948c25c, 0x02fb8a8c, 0x01c36ae4, 0xd6ebe1f9,
00311 0x90d4f869, 0xa65cdea0, 0x3f09252d, 0xc208e69f,
00312 0xb74e6132, 0xce77e25b, 0x578fdfe3, 0x3ac372e6
00313 };
00314
00315 #define EROUND(l,r) l ^= *(p++); r ^= ((s[((l>>24)&0xff)+0x000]+s[((l>>16)&0xff)+0x100])^s[((l>>8)&0xff)+0x200])+s[((l>>0)&0xff)+0x300]
00316 #define DROUND(l,r) l ^= *(p--); r ^= ((s[((l>>24)&0xff)+0x000]+s[((l>>16)&0xff)+0x100])^s[((l>>8)&0xff)+0x200])+s[((l>>0)&0xff)+0x300]
00317
00320
00321 static const blockMode blowfishModes[2] =
00322 {
00323 { (blockModeEncrypt) blowfishECBEncrypt, (blockModeDecrypt) blowfishECBDecrypt },
00324 { (blockModeEncrypt) blowfishCBCEncrypt, (blockModeDecrypt) blowfishCBCDecrypt }
00325 };
00326
00327
00328 const blockCipher blowfish = { "Blowfish", sizeof(blowfishParam), 8, 64, 448, 32, (blockCipherSetup) blowfishSetup, (blockCipherSetIV) blowfishSetIV, (blockCipherEncrypt) blowfishEncrypt, (blockCipherDecrypt) blowfishDecrypt, blowfishModes };
00329
00330
00331
00332 int blowfishSetup(blowfishParam* bp, const uint32* key, int keybits, cipherOperation op)
00333 {
00334 if (((keybits & 7) == 0) && (keybits >= 64) && (keybits <= 448))
00335 {
00336 register uint32* p = bp->p;
00337 register uint32* s = bp->s;
00338 register int i;
00339
00340 uint32 work[2];
00341
00342 memcpy(p, _bf_p, BLOWFISHPSIZE * sizeof(*p));
00343 memcpy(s, _bf_s, 1024 * sizeof(*s));
00344
00345 if ((keybits & 31) == 0)
00346 {
00347 register int keywords = (((uint32)keybits) >> 5);
00348
00349 for (i = 0; i < BLOWFISHPSIZE; i++)
00350 {
00351
00352 p[i] ^= key[i % keywords];
00353 }
00354 }
00355 else
00356 return -1;
00357
00358 work[0] = work[1] = 0;
00359
00360 for (i = 0; i < BLOWFISHPSIZE; i += 2, p += 2)
00361 {
00362 (void) blowfishEncrypt(bp, work, work);
00363 #if WORDS_BIGENDIAN
00364 p[0] = work[0];
00365 p[1] = work[1];
00366 #else
00367 p[0] = swapu32(work[0]);
00368 p[1] = swapu32(work[1]);
00369 #endif
00370 }
00371
00372 for (i = 0; i < 1024; i += 2, s += 2)
00373 {
00374 (void) blowfishEncrypt(bp, work, work);
00375 #if WORDS_BIGENDIAN
00376 s[0] = work[0];
00377 s[1] = work[1];
00378 #else
00379 s[0] = swapu32(work[0]);
00380 s[1] = swapu32(work[1]);
00381 #endif
00382 }
00383
00384
00385 bp->fdback[0] = 0;
00386 bp->fdback[1] = 0;
00387
00388 return 0;
00389 }
00390 return -1;
00391 }
00392
00393
00394 #ifndef ASM_BLOWFISHSETIV
00395
00396 int blowfishSetIV(blowfishParam* bp, const uint32* iv)
00397 {
00398 if (iv)
00399 {
00400 bp->fdback[0] = iv[0];
00401 bp->fdback[1] = iv[1];
00402 }
00403 else
00404 {
00405 bp->fdback[0] = 0;
00406 bp->fdback[1] = 0;
00407 }
00408
00409 return 0;
00410 }
00411
00412 #endif
00413
00414 #ifndef ASM_BLOWFISHENCRYPT
00415
00416 int blowfishEncrypt(blowfishParam* bp, uint32* dst, const uint32* src)
00417 {
00418 #if WORDS_BIGENDIAN
00419 register uint32 xl = src[0], xr = src[1];
00420 #else
00421 register uint32 xl = swapu32(src[0]), xr = swapu32(src[1]);
00422 #endif
00423 register uint32* p = bp->p;
00424 register uint32* s = bp->s;
00425
00426 EROUND(xl, xr); EROUND(xr, xl);
00427 EROUND(xl, xr); EROUND(xr, xl);
00428 EROUND(xl, xr); EROUND(xr, xl);
00429 EROUND(xl, xr); EROUND(xr, xl);
00430 EROUND(xl, xr); EROUND(xr, xl);
00431 EROUND(xl, xr); EROUND(xr, xl);
00432 EROUND(xl, xr); EROUND(xr, xl);
00433 EROUND(xl, xr); EROUND(xr, xl);
00434
00435 #if WORDS_BIGENDIAN
00436 dst[1] = xl ^ *(p++);
00437 dst[0] = xr ^ *(p++);
00438 #else
00439 dst[1] = swapu32(xl ^ *(p++));
00440 dst[0] = swapu32(xr ^ *(p++));
00441 #endif
00442
00443 return 0;
00444 }
00445
00446 #endif
00447
00448 #ifndef ASM_BLOWFISHDECRYPT
00449
00450 int blowfishDecrypt(blowfishParam* bp, uint32* dst, const uint32* src)
00451 {
00452 #if WORDS_BIGENDIAN
00453 register uint32 xl = src[0], xr = src[1];
00454 #else
00455 register uint32 xl = swapu32(src[0]), xr = swapu32(src[1]);
00456 #endif
00457 register uint32* p = bp->p+BLOWFISHPSIZE-1;
00458 register uint32* s = bp->s;
00459
00460 DROUND(xl, xr); DROUND(xr, xl);
00461 DROUND(xl, xr); DROUND(xr, xl);
00462 DROUND(xl, xr); DROUND(xr, xl);
00463 DROUND(xl, xr); DROUND(xr, xl);
00464 DROUND(xl, xr); DROUND(xr, xl);
00465 DROUND(xl, xr); DROUND(xr, xl);
00466 DROUND(xl, xr); DROUND(xr, xl);
00467 DROUND(xl, xr); DROUND(xr, xl);
00468
00469 #if WORDS_BIGENDIAN
00470 dst[1] = xl ^ *(p--);
00471 dst[0] = xr ^ *(p--);
00472 #else
00473 dst[1] = swapu32(xl ^ *(p--));
00474 dst[0] = swapu32(xr ^ *(p--));
00475 #endif
00476
00477 return 0;
00478 }
00479
00480 #endif
00481
00482 #ifndef ASM_BLOWFISHECBENCRYPT
00483 int blowfishECBEncrypt(blowfishParam* bp, int count, uint32* dst, const uint32* src)
00484 {
00485 while (count > 0)
00486 {
00487 (void) blowfishEncrypt(bp, dst, src);
00488
00489 dst += 2;
00490 src += 2;
00491
00492 count--;
00493 }
00494 return 0;
00495 }
00496 #endif
00497
00498 #ifndef ASM_BLOWFISHECBDECRYPT
00499 int blowfishECBDecrypt(blowfishParam* bp, int count, uint32* dst, const uint32* src)
00500 {
00501 while (count > 0)
00502 {
00503 (void) blowfishDecrypt(bp, dst, src);
00504
00505 dst += 2;
00506 src += 2;
00507
00508 count--;
00509 }
00510 return 0;
00511 }
00512 #endif
00513
00514 #ifndef ASM_BLOWFISHCBCENCRYPT
00515
00516 int blowfishCBCEncrypt(blowfishParam* bp, int count, uint32* dst, const uint32* src)
00517 {
00518 if (count > 0)
00519 {
00520 dst[0] = src[0] ^ bp->fdback[0];
00521 dst[1] = src[1] ^ bp->fdback[1];
00522
00523 (void) blowfishEncrypt(bp, dst, dst);
00524
00525 dst += 2;
00526 src += 2;
00527
00528 count--;
00529
00530 while (count > 0)
00531 {
00532 dst[0] = src[0] ^ dst[-2];
00533 dst[1] = src[1] ^ dst[-1];
00534
00535 (void) blowfishEncrypt(bp, dst, dst);
00536
00537 dst += 2;
00538 src += 2;
00539
00540 count--;
00541 }
00542
00543 bp->fdback[0] = dst[-2];
00544 bp->fdback[1] = dst[-1];
00545 }
00546 return 0;
00547 }
00548
00549 #endif
00550
00551 #ifndef ASM_BLOWFISHCBCDECRYPT
00552
00553 int blowfishCBCDecrypt(blowfishParam* bp, int count, uint32* dst, const uint32* src)
00554 {
00555 if (count > 0)
00556 {
00557 if (src == dst)
00558 {
00559 register uint32 fb0 = src[0];
00560 register uint32 fb1 = src[1];
00561
00562 (void) blowfishDecrypt(bp, dst, src);
00563
00564 dst[0] ^= bp->fdback[0];
00565 dst[1] ^= bp->fdback[1];
00566
00567 dst += 2;
00568 src += 2;
00569
00570 count--;
00571
00572 while (count > 0)
00573 {
00574 register int src0 = src[0];
00575 register int src1 = src[1];
00576
00577 (void) blowfishDecrypt(bp, dst, src);
00578
00579 dst[0] ^= fb0;
00580 dst[1] ^= fb1;
00581
00582 fb0 = src0;
00583 fb1 = src1;
00584
00585 dst += 2;
00586 src += 2;
00587
00588 count--;
00589 }
00590
00591 bp->fdback[0] = fb0;
00592 bp->fdback[1] = fb1;
00593 }
00594 else
00595 {
00596 (void) blowfishDecrypt(bp, dst, src);
00597
00598 dst[0] ^= bp->fdback[0];
00599 dst[1] ^= bp->fdback[1];
00600
00601 dst += 2;
00602 src += 2;
00603
00604 count--;
00605
00606 while (count > 0)
00607 {
00608 (void) blowfishDecrypt(bp, dst, src);
00609
00610 dst[0] ^= src[-2];
00611 dst[1] ^= src[-1];
00612
00613 dst += 2;
00614 src += 2;
00615
00616 count--;
00617 }
00618
00619 bp->fdback[0] = src[-2];
00620 bp->fdback[1] = src[-1];
00621 }
00622 }
00623 return 0;
00624 }
00625
00626 #endif