blowfish.c (23315B)
1 /* $OpenBSD: blowfish.c,v 1.17 2003/04/09 21:46:02 markus Exp $ */ 2 /* 3 * Blowfish block cipher for OpenBSD 4 * Copyright 1997 Niels Provos <provos@physnet.uni-hamburg.de> 5 * All rights reserved. 6 * 7 * Implementation advice by David Mazieres <dm@lcs.mit.edu>. 8 * 9 * Redistribution and use in source and binary forms, with or without 10 * modification, are permitted provided that the following conditions 11 * are met: 12 * 1. Redistributions of source code must retain the above copyright 13 * notice, this list of conditions and the following disclaimer. 14 * 2. Redistributions in binary form must reproduce the above copyright 15 * notice, this list of conditions and the following disclaimer in the 16 * documentation and/or other materials provided with the distribution. 17 * 3. All advertising materials mentioning features or use of this software 18 * must display the following acknowledgement: 19 * This product includes software developed by Niels Provos. 20 * 4. The name of the author may not be used to endorse or promote products 21 * derived from this software without specific prior written permission. 22 * 23 * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR 24 * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES 25 * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. 26 * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, 27 * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT 28 * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 29 * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 30 * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 31 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF 32 * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 33 */ 34 35 /* 36 * This code is derived from section 14.3 and the given source 37 * in section V of Applied Cryptography, second edition. 38 * Blowfish is an unpatented fast block cipher designed by 39 * Bruce Schneier. 40 */ 41 42 #if 0 43 #include <stdio.h> /* used for debugging */ 44 #include <string.h> 45 #endif 46 47 #include <sys/types.h> 48 #include <blf.h> 49 50 #undef inline 51 #ifdef __GNUC__ 52 #define inline __inline 53 #else /* !__GNUC__ */ 54 #define inline 55 #endif /* !__GNUC__ */ 56 57 /* Function for Feistel Networks */ 58 59 #define F(s, x) ((((s)[ (((x)>>24)&0xFF)] \ 60 + (s)[0x100 + (((x)>>16)&0xFF)]) \ 61 ^ (s)[0x200 + (((x)>> 8)&0xFF)]) \ 62 + (s)[0x300 + ( (x) &0xFF)]) 63 64 #define BLFRND(s,p,i,j,n) (i ^= F(s,j) ^ (p)[n]) 65 66 void 67 Blowfish_encipher(blf_ctx *c, u_int32_t *xl, u_int32_t *xr) 68 { 69 u_int32_t Xl; 70 u_int32_t Xr; 71 u_int32_t *s = c->S[0]; 72 u_int32_t *p = c->P; 73 74 Xl = *xl; 75 Xr = *xr; 76 77 Xl ^= p[0]; 78 BLFRND(s, p, Xr, Xl, 1); BLFRND(s, p, Xl, Xr, 2); 79 BLFRND(s, p, Xr, Xl, 3); BLFRND(s, p, Xl, Xr, 4); 80 BLFRND(s, p, Xr, Xl, 5); BLFRND(s, p, Xl, Xr, 6); 81 BLFRND(s, p, Xr, Xl, 7); BLFRND(s, p, Xl, Xr, 8); 82 BLFRND(s, p, Xr, Xl, 9); BLFRND(s, p, Xl, Xr, 10); 83 BLFRND(s, p, Xr, Xl, 11); BLFRND(s, p, Xl, Xr, 12); 84 BLFRND(s, p, Xr, Xl, 13); BLFRND(s, p, Xl, Xr, 14); 85 BLFRND(s, p, Xr, Xl, 15); BLFRND(s, p, Xl, Xr, 16); 86 87 *xl = Xr ^ p[17]; 88 *xr = Xl; 89 } 90 91 void 92 Blowfish_decipher(blf_ctx *c, u_int32_t *xl, u_int32_t *xr) 93 { 94 u_int32_t Xl; 95 u_int32_t Xr; 96 u_int32_t *s = c->S[0]; 97 u_int32_t *p = c->P; 98 99 Xl = *xl; 100 Xr = *xr; 101 102 Xl ^= p[17]; 103 BLFRND(s, p, Xr, Xl, 16); BLFRND(s, p, Xl, Xr, 15); 104 BLFRND(s, p, Xr, Xl, 14); BLFRND(s, p, Xl, Xr, 13); 105 BLFRND(s, p, Xr, Xl, 12); BLFRND(s, p, Xl, Xr, 11); 106 BLFRND(s, p, Xr, Xl, 10); BLFRND(s, p, Xl, Xr, 9); 107 BLFRND(s, p, Xr, Xl, 8); BLFRND(s, p, Xl, Xr, 7); 108 BLFRND(s, p, Xr, Xl, 6); BLFRND(s, p, Xl, Xr, 5); 109 BLFRND(s, p, Xr, Xl, 4); BLFRND(s, p, Xl, Xr, 3); 110 BLFRND(s, p, Xr, Xl, 2); BLFRND(s, p, Xl, Xr, 1); 111 112 *xl = Xr ^ p[0]; 113 *xr = Xl; 114 } 115 116 void 117 Blowfish_initstate(blf_ctx *c) 118 { 119 /* P-box and S-box tables initialized with digits of Pi */ 120 121 static const blf_ctx initstate = 122 { { 123 { 124 0xd1310ba6, 0x98dfb5ac, 0x2ffd72db, 0xd01adfb7, 125 0xb8e1afed, 0x6a267e96, 0xba7c9045, 0xf12c7f99, 126 0x24a19947, 0xb3916cf7, 0x0801f2e2, 0x858efc16, 127 0x636920d8, 0x71574e69, 0xa458fea3, 0xf4933d7e, 128 0x0d95748f, 0x728eb658, 0x718bcd58, 0x82154aee, 129 0x7b54a41d, 0xc25a59b5, 0x9c30d539, 0x2af26013, 130 0xc5d1b023, 0x286085f0, 0xca417918, 0xb8db38ef, 131 0x8e79dcb0, 0x603a180e, 0x6c9e0e8b, 0xb01e8a3e, 132 0xd71577c1, 0xbd314b27, 0x78af2fda, 0x55605c60, 133 0xe65525f3, 0xaa55ab94, 0x57489862, 0x63e81440, 134 0x55ca396a, 0x2aab10b6, 0xb4cc5c34, 0x1141e8ce, 135 0xa15486af, 0x7c72e993, 0xb3ee1411, 0x636fbc2a, 136 0x2ba9c55d, 0x741831f6, 0xce5c3e16, 0x9b87931e, 137 0xafd6ba33, 0x6c24cf5c, 0x7a325381, 0x28958677, 138 0x3b8f4898, 0x6b4bb9af, 0xc4bfe81b, 0x66282193, 139 0x61d809cc, 0xfb21a991, 0x487cac60, 0x5dec8032, 140 0xef845d5d, 0xe98575b1, 0xdc262302, 0xeb651b88, 141 0x23893e81, 0xd396acc5, 0x0f6d6ff3, 0x83f44239, 142 0x2e0b4482, 0xa4842004, 0x69c8f04a, 0x9e1f9b5e, 143 0x21c66842, 0xf6e96c9a, 0x670c9c61, 0xabd388f0, 144 0x6a51a0d2, 0xd8542f68, 0x960fa728, 0xab5133a3, 145 0x6eef0b6c, 0x137a3be4, 0xba3bf050, 0x7efb2a98, 146 0xa1f1651d, 0x39af0176, 0x66ca593e, 0x82430e88, 147 0x8cee8619, 0x456f9fb4, 0x7d84a5c3, 0x3b8b5ebe, 148 0xe06f75d8, 0x85c12073, 0x401a449f, 0x56c16aa6, 149 0x4ed3aa62, 0x363f7706, 0x1bfedf72, 0x429b023d, 150 0x37d0d724, 0xd00a1248, 0xdb0fead3, 0x49f1c09b, 151 0x075372c9, 0x80991b7b, 0x25d479d8, 0xf6e8def7, 152 0xe3fe501a, 0xb6794c3b, 0x976ce0bd, 0x04c006ba, 153 0xc1a94fb6, 0x409f60c4, 0x5e5c9ec2, 0x196a2463, 154 0x68fb6faf, 0x3e6c53b5, 0x1339b2eb, 0x3b52ec6f, 155 0x6dfc511f, 0x9b30952c, 0xcc814544, 0xaf5ebd09, 156 0xbee3d004, 0xde334afd, 0x660f2807, 0x192e4bb3, 157 0xc0cba857, 0x45c8740f, 0xd20b5f39, 0xb9d3fbdb, 158 0x5579c0bd, 0x1a60320a, 0xd6a100c6, 0x402c7279, 159 0x679f25fe, 0xfb1fa3cc, 0x8ea5e9f8, 0xdb3222f8, 160 0x3c7516df, 0xfd616b15, 0x2f501ec8, 0xad0552ab, 161 0x323db5fa, 0xfd238760, 0x53317b48, 0x3e00df82, 162 0x9e5c57bb, 0xca6f8ca0, 0x1a87562e, 0xdf1769db, 163 0xd542a8f6, 0x287effc3, 0xac6732c6, 0x8c4f5573, 164 0x695b27b0, 0xbbca58c8, 0xe1ffa35d, 0xb8f011a0, 165 0x10fa3d98, 0xfd2183b8, 0x4afcb56c, 0x2dd1d35b, 166 0x9a53e479, 0xb6f84565, 0xd28e49bc, 0x4bfb9790, 167 0xe1ddf2da, 0xa4cb7e33, 0x62fb1341, 0xcee4c6e8, 168 0xef20cada, 0x36774c01, 0xd07e9efe, 0x2bf11fb4, 169 0x95dbda4d, 0xae909198, 0xeaad8e71, 0x6b93d5a0, 170 0xd08ed1d0, 0xafc725e0, 0x8e3c5b2f, 0x8e7594b7, 171 0x8ff6e2fb, 0xf2122b64, 0x8888b812, 0x900df01c, 172 0x4fad5ea0, 0x688fc31c, 0xd1cff191, 0xb3a8c1ad, 173 0x2f2f2218, 0xbe0e1777, 0xea752dfe, 0x8b021fa1, 174 0xe5a0cc0f, 0xb56f74e8, 0x18acf3d6, 0xce89e299, 175 0xb4a84fe0, 0xfd13e0b7, 0x7cc43b81, 0xd2ada8d9, 176 0x165fa266, 0x80957705, 0x93cc7314, 0x211a1477, 177 0xe6ad2065, 0x77b5fa86, 0xc75442f5, 0xfb9d35cf, 178 0xebcdaf0c, 0x7b3e89a0, 0xd6411bd3, 0xae1e7e49, 179 0x00250e2d, 0x2071b35e, 0x226800bb, 0x57b8e0af, 180 0x2464369b, 0xf009b91e, 0x5563911d, 0x59dfa6aa, 181 0x78c14389, 0xd95a537f, 0x207d5ba2, 0x02e5b9c5, 182 0x83260376, 0x6295cfa9, 0x11c81968, 0x4e734a41, 183 0xb3472dca, 0x7b14a94a, 0x1b510052, 0x9a532915, 184 0xd60f573f, 0xbc9bc6e4, 0x2b60a476, 0x81e67400, 185 0x08ba6fb5, 0x571be91f, 0xf296ec6b, 0x2a0dd915, 186 0xb6636521, 0xe7b9f9b6, 0xff34052e, 0xc5855664, 187 0x53b02d5d, 0xa99f8fa1, 0x08ba4799, 0x6e85076a}, 188 { 189 0x4b7a70e9, 0xb5b32944, 0xdb75092e, 0xc4192623, 190 0xad6ea6b0, 0x49a7df7d, 0x9cee60b8, 0x8fedb266, 191 0xecaa8c71, 0x699a17ff, 0x5664526c, 0xc2b19ee1, 192 0x193602a5, 0x75094c29, 0xa0591340, 0xe4183a3e, 193 0x3f54989a, 0x5b429d65, 0x6b8fe4d6, 0x99f73fd6, 194 0xa1d29c07, 0xefe830f5, 0x4d2d38e6, 0xf0255dc1, 195 0x4cdd2086, 0x8470eb26, 0x6382e9c6, 0x021ecc5e, 196 0x09686b3f, 0x3ebaefc9, 0x3c971814, 0x6b6a70a1, 197 0x687f3584, 0x52a0e286, 0xb79c5305, 0xaa500737, 198 0x3e07841c, 0x7fdeae5c, 0x8e7d44ec, 0x5716f2b8, 199 0xb03ada37, 0xf0500c0d, 0xf01c1f04, 0x0200b3ff, 200 0xae0cf51a, 0x3cb574b2, 0x25837a58, 0xdc0921bd, 201 0xd19113f9, 0x7ca92ff6, 0x94324773, 0x22f54701, 202 0x3ae5e581, 0x37c2dadc, 0xc8b57634, 0x9af3dda7, 203 0xa9446146, 0x0fd0030e, 0xecc8c73e, 0xa4751e41, 204 0xe238cd99, 0x3bea0e2f, 0x3280bba1, 0x183eb331, 205 0x4e548b38, 0x4f6db908, 0x6f420d03, 0xf60a04bf, 206 0x2cb81290, 0x24977c79, 0x5679b072, 0xbcaf89af, 207 0xde9a771f, 0xd9930810, 0xb38bae12, 0xdccf3f2e, 208 0x5512721f, 0x2e6b7124, 0x501adde6, 0x9f84cd87, 209 0x7a584718, 0x7408da17, 0xbc9f9abc, 0xe94b7d8c, 210 0xec7aec3a, 0xdb851dfa, 0x63094366, 0xc464c3d2, 211 0xef1c1847, 0x3215d908, 0xdd433b37, 0x24c2ba16, 212 0x12a14d43, 0x2a65c451, 0x50940002, 0x133ae4dd, 213 0x71dff89e, 0x10314e55, 0x81ac77d6, 0x5f11199b, 214 0x043556f1, 0xd7a3c76b, 0x3c11183b, 0x5924a509, 215 0xf28fe6ed, 0x97f1fbfa, 0x9ebabf2c, 0x1e153c6e, 216 0x86e34570, 0xeae96fb1, 0x860e5e0a, 0x5a3e2ab3, 217 0x771fe71c, 0x4e3d06fa, 0x2965dcb9, 0x99e71d0f, 218 0x803e89d6, 0x5266c825, 0x2e4cc978, 0x9c10b36a, 219 0xc6150eba, 0x94e2ea78, 0xa5fc3c53, 0x1e0a2df4, 220 0xf2f74ea7, 0x361d2b3d, 0x1939260f, 0x19c27960, 221 0x5223a708, 0xf71312b6, 0xebadfe6e, 0xeac31f66, 222 0xe3bc4595, 0xa67bc883, 0xb17f37d1, 0x018cff28, 223 0xc332ddef, 0xbe6c5aa5, 0x65582185, 0x68ab9802, 224 0xeecea50f, 0xdb2f953b, 0x2aef7dad, 0x5b6e2f84, 225 0x1521b628, 0x29076170, 0xecdd4775, 0x619f1510, 226 0x13cca830, 0xeb61bd96, 0x0334fe1e, 0xaa0363cf, 227 0xb5735c90, 0x4c70a239, 0xd59e9e0b, 0xcbaade14, 228 0xeecc86bc, 0x60622ca7, 0x9cab5cab, 0xb2f3846e, 229 0x648b1eaf, 0x19bdf0ca, 0xa02369b9, 0x655abb50, 230 0x40685a32, 0x3c2ab4b3, 0x319ee9d5, 0xc021b8f7, 231 0x9b540b19, 0x875fa099, 0x95f7997e, 0x623d7da8, 232 0xf837889a, 0x97e32d77, 0x11ed935f, 0x16681281, 233 0x0e358829, 0xc7e61fd6, 0x96dedfa1, 0x7858ba99, 234 0x57f584a5, 0x1b227263, 0x9b83c3ff, 0x1ac24696, 235 0xcdb30aeb, 0x532e3054, 0x8fd948e4, 0x6dbc3128, 236 0x58ebf2ef, 0x34c6ffea, 0xfe28ed61, 0xee7c3c73, 237 0x5d4a14d9, 0xe864b7e3, 0x42105d14, 0x203e13e0, 238 0x45eee2b6, 0xa3aaabea, 0xdb6c4f15, 0xfacb4fd0, 239 0xc742f442, 0xef6abbb5, 0x654f3b1d, 0x41cd2105, 240 0xd81e799e, 0x86854dc7, 0xe44b476a, 0x3d816250, 241 0xcf62a1f2, 0x5b8d2646, 0xfc8883a0, 0xc1c7b6a3, 242 0x7f1524c3, 0x69cb7492, 0x47848a0b, 0x5692b285, 243 0x095bbf00, 0xad19489d, 0x1462b174, 0x23820e00, 244 0x58428d2a, 0x0c55f5ea, 0x1dadf43e, 0x233f7061, 245 0x3372f092, 0x8d937e41, 0xd65fecf1, 0x6c223bdb, 246 0x7cde3759, 0xcbee7460, 0x4085f2a7, 0xce77326e, 247 0xa6078084, 0x19f8509e, 0xe8efd855, 0x61d99735, 248 0xa969a7aa, 0xc50c06c2, 0x5a04abfc, 0x800bcadc, 249 0x9e447a2e, 0xc3453484, 0xfdd56705, 0x0e1e9ec9, 250 0xdb73dbd3, 0x105588cd, 0x675fda79, 0xe3674340, 251 0xc5c43465, 0x713e38d8, 0x3d28f89e, 0xf16dff20, 252 0x153e21e7, 0x8fb03d4a, 0xe6e39f2b, 0xdb83adf7}, 253 { 254 0xe93d5a68, 0x948140f7, 0xf64c261c, 0x94692934, 255 0x411520f7, 0x7602d4f7, 0xbcf46b2e, 0xd4a20068, 256 0xd4082471, 0x3320f46a, 0x43b7d4b7, 0x500061af, 257 0x1e39f62e, 0x97244546, 0x14214f74, 0xbf8b8840, 258 0x4d95fc1d, 0x96b591af, 0x70f4ddd3, 0x66a02f45, 259 0xbfbc09ec, 0x03bd9785, 0x7fac6dd0, 0x31cb8504, 260 0x96eb27b3, 0x55fd3941, 0xda2547e6, 0xabca0a9a, 261 0x28507825, 0x530429f4, 0x0a2c86da, 0xe9b66dfb, 262 0x68dc1462, 0xd7486900, 0x680ec0a4, 0x27a18dee, 263 0x4f3ffea2, 0xe887ad8c, 0xb58ce006, 0x7af4d6b6, 264 0xaace1e7c, 0xd3375fec, 0xce78a399, 0x406b2a42, 265 0x20fe9e35, 0xd9f385b9, 0xee39d7ab, 0x3b124e8b, 266 0x1dc9faf7, 0x4b6d1856, 0x26a36631, 0xeae397b2, 267 0x3a6efa74, 0xdd5b4332, 0x6841e7f7, 0xca7820fb, 268 0xfb0af54e, 0xd8feb397, 0x454056ac, 0xba489527, 269 0x55533a3a, 0x20838d87, 0xfe6ba9b7, 0xd096954b, 270 0x55a867bc, 0xa1159a58, 0xcca92963, 0x99e1db33, 271 0xa62a4a56, 0x3f3125f9, 0x5ef47e1c, 0x9029317c, 272 0xfdf8e802, 0x04272f70, 0x80bb155c, 0x05282ce3, 273 0x95c11548, 0xe4c66d22, 0x48c1133f, 0xc70f86dc, 274 0x07f9c9ee, 0x41041f0f, 0x404779a4, 0x5d886e17, 275 0x325f51eb, 0xd59bc0d1, 0xf2bcc18f, 0x41113564, 276 0x257b7834, 0x602a9c60, 0xdff8e8a3, 0x1f636c1b, 277 0x0e12b4c2, 0x02e1329e, 0xaf664fd1, 0xcad18115, 278 0x6b2395e0, 0x333e92e1, 0x3b240b62, 0xeebeb922, 279 0x85b2a20e, 0xe6ba0d99, 0xde720c8c, 0x2da2f728, 280 0xd0127845, 0x95b794fd, 0x647d0862, 0xe7ccf5f0, 281 0x5449a36f, 0x877d48fa, 0xc39dfd27, 0xf33e8d1e, 282 0x0a476341, 0x992eff74, 0x3a6f6eab, 0xf4f8fd37, 283 0xa812dc60, 0xa1ebddf8, 0x991be14c, 0xdb6e6b0d, 284 0xc67b5510, 0x6d672c37, 0x2765d43b, 0xdcd0e804, 285 0xf1290dc7, 0xcc00ffa3, 0xb5390f92, 0x690fed0b, 286 0x667b9ffb, 0xcedb7d9c, 0xa091cf0b, 0xd9155ea3, 287 0xbb132f88, 0x515bad24, 0x7b9479bf, 0x763bd6eb, 288 0x37392eb3, 0xcc115979, 0x8026e297, 0xf42e312d, 289 0x6842ada7, 0xc66a2b3b, 0x12754ccc, 0x782ef11c, 290 0x6a124237, 0xb79251e7, 0x06a1bbe6, 0x4bfb6350, 291 0x1a6b1018, 0x11caedfa, 0x3d25bdd8, 0xe2e1c3c9, 292 0x44421659, 0x0a121386, 0xd90cec6e, 0xd5abea2a, 293 0x64af674e, 0xda86a85f, 0xbebfe988, 0x64e4c3fe, 294 0x9dbc8057, 0xf0f7c086, 0x60787bf8, 0x6003604d, 295 0xd1fd8346, 0xf6381fb0, 0x7745ae04, 0xd736fccc, 296 0x83426b33, 0xf01eab71, 0xb0804187, 0x3c005e5f, 297 0x77a057be, 0xbde8ae24, 0x55464299, 0xbf582e61, 298 0x4e58f48f, 0xf2ddfda2, 0xf474ef38, 0x8789bdc2, 299 0x5366f9c3, 0xc8b38e74, 0xb475f255, 0x46fcd9b9, 300 0x7aeb2661, 0x8b1ddf84, 0x846a0e79, 0x915f95e2, 301 0x466e598e, 0x20b45770, 0x8cd55591, 0xc902de4c, 302 0xb90bace1, 0xbb8205d0, 0x11a86248, 0x7574a99e, 303 0xb77f19b6, 0xe0a9dc09, 0x662d09a1, 0xc4324633, 304 0xe85a1f02, 0x09f0be8c, 0x4a99a025, 0x1d6efe10, 305 0x1ab93d1d, 0x0ba5a4df, 0xa186f20f, 0x2868f169, 306 0xdcb7da83, 0x573906fe, 0xa1e2ce9b, 0x4fcd7f52, 307 0x50115e01, 0xa70683fa, 0xa002b5c4, 0x0de6d027, 308 0x9af88c27, 0x773f8641, 0xc3604c06, 0x61a806b5, 309 0xf0177a28, 0xc0f586e0, 0x006058aa, 0x30dc7d62, 310 0x11e69ed7, 0x2338ea63, 0x53c2dd94, 0xc2c21634, 311 0xbbcbee56, 0x90bcb6de, 0xebfc7da1, 0xce591d76, 312 0x6f05e409, 0x4b7c0188, 0x39720a3d, 0x7c927c24, 313 0x86e3725f, 0x724d9db9, 0x1ac15bb4, 0xd39eb8fc, 314 0xed545578, 0x08fca5b5, 0xd83d7cd3, 0x4dad0fc4, 315 0x1e50ef5e, 0xb161e6f8, 0xa28514d9, 0x6c51133c, 316 0x6fd5c7e7, 0x56e14ec4, 0x362abfce, 0xddc6c837, 317 0xd79a3234, 0x92638212, 0x670efa8e, 0x406000e0}, 318 { 319 0x3a39ce37, 0xd3faf5cf, 0xabc27737, 0x5ac52d1b, 320 0x5cb0679e, 0x4fa33742, 0xd3822740, 0x99bc9bbe, 321 0xd5118e9d, 0xbf0f7315, 0xd62d1c7e, 0xc700c47b, 322 0xb78c1b6b, 0x21a19045, 0xb26eb1be, 0x6a366eb4, 323 0x5748ab2f, 0xbc946e79, 0xc6a376d2, 0x6549c2c8, 324 0x530ff8ee, 0x468dde7d, 0xd5730a1d, 0x4cd04dc6, 325 0x2939bbdb, 0xa9ba4650, 0xac9526e8, 0xbe5ee304, 326 0xa1fad5f0, 0x6a2d519a, 0x63ef8ce2, 0x9a86ee22, 327 0xc089c2b8, 0x43242ef6, 0xa51e03aa, 0x9cf2d0a4, 328 0x83c061ba, 0x9be96a4d, 0x8fe51550, 0xba645bd6, 329 0x2826a2f9, 0xa73a3ae1, 0x4ba99586, 0xef5562e9, 330 0xc72fefd3, 0xf752f7da, 0x3f046f69, 0x77fa0a59, 331 0x80e4a915, 0x87b08601, 0x9b09e6ad, 0x3b3ee593, 332 0xe990fd5a, 0x9e34d797, 0x2cf0b7d9, 0x022b8b51, 333 0x96d5ac3a, 0x017da67d, 0xd1cf3ed6, 0x7c7d2d28, 334 0x1f9f25cf, 0xadf2b89b, 0x5ad6b472, 0x5a88f54c, 335 0xe029ac71, 0xe019a5e6, 0x47b0acfd, 0xed93fa9b, 336 0xe8d3c48d, 0x283b57cc, 0xf8d56629, 0x79132e28, 337 0x785f0191, 0xed756055, 0xf7960e44, 0xe3d35e8c, 338 0x15056dd4, 0x88f46dba, 0x03a16125, 0x0564f0bd, 339 0xc3eb9e15, 0x3c9057a2, 0x97271aec, 0xa93a072a, 340 0x1b3f6d9b, 0x1e6321f5, 0xf59c66fb, 0x26dcf319, 341 0x7533d928, 0xb155fdf5, 0x03563482, 0x8aba3cbb, 342 0x28517711, 0xc20ad9f8, 0xabcc5167, 0xccad925f, 343 0x4de81751, 0x3830dc8e, 0x379d5862, 0x9320f991, 344 0xea7a90c2, 0xfb3e7bce, 0x5121ce64, 0x774fbe32, 345 0xa8b6e37e, 0xc3293d46, 0x48de5369, 0x6413e680, 346 0xa2ae0810, 0xdd6db224, 0x69852dfd, 0x09072166, 347 0xb39a460a, 0x6445c0dd, 0x586cdecf, 0x1c20c8ae, 348 0x5bbef7dd, 0x1b588d40, 0xccd2017f, 0x6bb4e3bb, 349 0xdda26a7e, 0x3a59ff45, 0x3e350a44, 0xbcb4cdd5, 350 0x72eacea8, 0xfa6484bb, 0x8d6612ae, 0xbf3c6f47, 351 0xd29be463, 0x542f5d9e, 0xaec2771b, 0xf64e6370, 352 0x740e0d8d, 0xe75b1357, 0xf8721671, 0xaf537d5d, 353 0x4040cb08, 0x4eb4e2cc, 0x34d2466a, 0x0115af84, 354 0xe1b00428, 0x95983a1d, 0x06b89fb4, 0xce6ea048, 355 0x6f3f3b82, 0x3520ab82, 0x011a1d4b, 0x277227f8, 356 0x611560b1, 0xe7933fdc, 0xbb3a792b, 0x344525bd, 357 0xa08839e1, 0x51ce794b, 0x2f32c9b7, 0xa01fbac9, 358 0xe01cc87e, 0xbcc7d1f6, 0xcf0111c3, 0xa1e8aac7, 359 0x1a908749, 0xd44fbd9a, 0xd0dadecb, 0xd50ada38, 360 0x0339c32a, 0xc6913667, 0x8df9317c, 0xe0b12b4f, 361 0xf79e59b7, 0x43f5bb3a, 0xf2d519ff, 0x27d9459c, 362 0xbf97222c, 0x15e6fc2a, 0x0f91fc71, 0x9b941525, 363 0xfae59361, 0xceb69ceb, 0xc2a86459, 0x12baa8d1, 364 0xb6c1075e, 0xe3056a0c, 0x10d25065, 0xcb03a442, 365 0xe0ec6e0e, 0x1698db3b, 0x4c98a0be, 0x3278e964, 366 0x9f1f9532, 0xe0d392df, 0xd3a0342b, 0x8971f21e, 367 0x1b0a7441, 0x4ba3348c, 0xc5be7120, 0xc37632d8, 368 0xdf359f8d, 0x9b992f2e, 0xe60b6f47, 0x0fe3f11d, 369 0xe54cda54, 0x1edad891, 0xce6279cf, 0xcd3e7e6f, 370 0x1618b166, 0xfd2c1d05, 0x848fd2c5, 0xf6fb2299, 371 0xf523f357, 0xa6327623, 0x93a83531, 0x56cccd02, 372 0xacf08162, 0x5a75ebb5, 0x6e163697, 0x88d273cc, 373 0xde966292, 0x81b949d0, 0x4c50901b, 0x71c65614, 374 0xe6c6c7bd, 0x327a140a, 0x45e1d006, 0xc3f27b9a, 375 0xc9aa53fd, 0x62a80f00, 0xbb25bfe2, 0x35bdd2f6, 376 0x71126905, 0xb2040222, 0xb6cbcf7c, 0xcd769c2b, 377 0x53113ec0, 0x1640e3d3, 0x38abbd60, 0x2547adf0, 378 0xba38209c, 0xf746ce76, 0x77afa1c5, 0x20756060, 379 0x85cbfe4e, 0x8ae88dd8, 0x7aaaf9b0, 0x4cf9aa7e, 380 0x1948c25c, 0x02fb8a8c, 0x01c36ae4, 0xd6ebe1f9, 381 0x90d4f869, 0xa65cdea0, 0x3f09252d, 0xc208e69f, 382 0xb74e6132, 0xce77e25b, 0x578fdfe3, 0x3ac372e6} 383 }, 384 { 385 0x243f6a88, 0x85a308d3, 0x13198a2e, 0x03707344, 386 0xa4093822, 0x299f31d0, 0x082efa98, 0xec4e6c89, 387 0x452821e6, 0x38d01377, 0xbe5466cf, 0x34e90c6c, 388 0xc0ac29b7, 0xc97c50dd, 0x3f84d5b5, 0xb5470917, 389 0x9216d5d9, 0x8979fb1b 390 } }; 391 392 *c = initstate; 393 } 394 395 u_int32_t 396 Blowfish_stream2word(const u_int8_t *data, u_int16_t databytes, 397 u_int16_t *current) 398 { 399 u_int8_t i; 400 u_int16_t j; 401 u_int32_t temp; 402 403 temp = 0x00000000; 404 j = *current; 405 406 for (i = 0; i < 4; i++, j++) { 407 if (j >= databytes) 408 j = 0; 409 temp = (temp << 8) | data[j]; 410 } 411 412 *current = j; 413 return temp; 414 } 415 416 void 417 Blowfish_expand0state(blf_ctx *c, const u_int8_t *key, u_int16_t keybytes) 418 { 419 u_int16_t i; 420 u_int16_t j; 421 u_int16_t k; 422 u_int32_t temp; 423 u_int32_t datal; 424 u_int32_t datar; 425 426 j = 0; 427 for (i = 0; i < BLF_N + 2; i++) { 428 /* Extract 4 int8 to 1 int32 from keystream */ 429 temp = Blowfish_stream2word(key, keybytes, &j); 430 c->P[i] = c->P[i] ^ temp; 431 } 432 433 j = 0; 434 datal = 0x00000000; 435 datar = 0x00000000; 436 for (i = 0; i < BLF_N + 2; i += 2) { 437 Blowfish_encipher(c, &datal, &datar); 438 439 c->P[i] = datal; 440 c->P[i + 1] = datar; 441 } 442 443 for (i = 0; i < 4; i++) { 444 for (k = 0; k < 256; k += 2) { 445 Blowfish_encipher(c, &datal, &datar); 446 447 c->S[i][k] = datal; 448 c->S[i][k + 1] = datar; 449 } 450 } 451 } 452 453 454 void 455 Blowfish_expandstate(blf_ctx *c, const u_int8_t *data, u_int16_t databytes, 456 const u_int8_t *key, u_int16_t keybytes) 457 { 458 u_int16_t i; 459 u_int16_t j; 460 u_int16_t k; 461 u_int32_t temp; 462 u_int32_t datal; 463 u_int32_t datar; 464 465 j = 0; 466 for (i = 0; i < BLF_N + 2; i++) { 467 /* Extract 4 int8 to 1 int32 from keystream */ 468 temp = Blowfish_stream2word(key, keybytes, &j); 469 c->P[i] = c->P[i] ^ temp; 470 } 471 472 j = 0; 473 datal = 0x00000000; 474 datar = 0x00000000; 475 for (i = 0; i < BLF_N + 2; i += 2) { 476 datal ^= Blowfish_stream2word(data, databytes, &j); 477 datar ^= Blowfish_stream2word(data, databytes, &j); 478 Blowfish_encipher(c, &datal, &datar); 479 480 c->P[i] = datal; 481 c->P[i + 1] = datar; 482 } 483 484 for (i = 0; i < 4; i++) { 485 for (k = 0; k < 256; k += 2) { 486 datal ^= Blowfish_stream2word(data, databytes, &j); 487 datar ^= Blowfish_stream2word(data, databytes, &j); 488 Blowfish_encipher(c, &datal, &datar); 489 490 c->S[i][k] = datal; 491 c->S[i][k + 1] = datar; 492 } 493 } 494 495 } 496 497 void 498 blf_key(blf_ctx *c, const u_int8_t *k, u_int16_t len) 499 { 500 /* Initialize S-boxes and subkeys with Pi */ 501 Blowfish_initstate(c); 502 503 /* Transform S-boxes and subkeys with key */ 504 Blowfish_expand0state(c, k, len); 505 } 506 507 void 508 blf_enc(blf_ctx *c, u_int32_t *data, u_int16_t blocks) 509 { 510 u_int32_t *d; 511 u_int16_t i; 512 513 d = data; 514 for (i = 0; i < blocks; i++) { 515 Blowfish_encipher(c, d, d + 1); 516 d += 2; 517 } 518 } 519 520 void 521 blf_dec(blf_ctx *c, u_int32_t *data, u_int16_t blocks) 522 { 523 u_int32_t *d; 524 u_int16_t i; 525 526 d = data; 527 for (i = 0; i < blocks; i++) { 528 Blowfish_decipher(c, d, d + 1); 529 d += 2; 530 } 531 } 532 533 void 534 blf_ecb_encrypt(blf_ctx *c, u_int8_t *data, u_int32_t len) 535 { 536 u_int32_t l, r; 537 u_int32_t i; 538 539 for (i = 0; i < len; i += 8) { 540 l = data[0] << 24 | data[1] << 16 | data[2] << 8 | data[3]; 541 r = data[4] << 24 | data[5] << 16 | data[6] << 8 | data[7]; 542 Blowfish_encipher(c, &l, &r); 543 data[0] = l >> 24 & 0xff; 544 data[1] = l >> 16 & 0xff; 545 data[2] = l >> 8 & 0xff; 546 data[3] = l & 0xff; 547 data[4] = r >> 24 & 0xff; 548 data[5] = r >> 16 & 0xff; 549 data[6] = r >> 8 & 0xff; 550 data[7] = r & 0xff; 551 data += 8; 552 } 553 } 554 555 void 556 blf_ecb_decrypt(blf_ctx *c, u_int8_t *data, u_int32_t len) 557 { 558 u_int32_t l, r; 559 u_int32_t i; 560 561 for (i = 0; i < len; i += 8) { 562 l = data[0] << 24 | data[1] << 16 | data[2] << 8 | data[3]; 563 r = data[4] << 24 | data[5] << 16 | data[6] << 8 | data[7]; 564 Blowfish_decipher(c, &l, &r); 565 data[0] = l >> 24 & 0xff; 566 data[1] = l >> 16 & 0xff; 567 data[2] = l >> 8 & 0xff; 568 data[3] = l & 0xff; 569 data[4] = r >> 24 & 0xff; 570 data[5] = r >> 16 & 0xff; 571 data[6] = r >> 8 & 0xff; 572 data[7] = r & 0xff; 573 data += 8; 574 } 575 } 576 577 void 578 blf_cbc_encrypt(blf_ctx *c, u_int8_t *iv, u_int8_t *data, u_int32_t len) 579 { 580 u_int32_t l, r; 581 u_int32_t i, j; 582 583 for (i = 0; i < len; i += 8) { 584 for (j = 0; j < 8; j++) 585 data[j] ^= iv[j]; 586 l = data[0] << 24 | data[1] << 16 | data[2] << 8 | data[3]; 587 r = data[4] << 24 | data[5] << 16 | data[6] << 8 | data[7]; 588 Blowfish_encipher(c, &l, &r); 589 data[0] = l >> 24 & 0xff; 590 data[1] = l >> 16 & 0xff; 591 data[2] = l >> 8 & 0xff; 592 data[3] = l & 0xff; 593 data[4] = r >> 24 & 0xff; 594 data[5] = r >> 16 & 0xff; 595 data[6] = r >> 8 & 0xff; 596 data[7] = r & 0xff; 597 iv = data; 598 data += 8; 599 } 600 } 601 602 void 603 blf_cbc_decrypt(blf_ctx *c, u_int8_t *iva, u_int8_t *data, u_int32_t len) 604 { 605 u_int32_t l, r; 606 u_int8_t *iv; 607 u_int32_t i, j; 608 609 iv = data + len - 16; 610 data = data + len - 8; 611 for (i = len - 8; i >= 8; i -= 8) { 612 l = data[0] << 24 | data[1] << 16 | data[2] << 8 | data[3]; 613 r = data[4] << 24 | data[5] << 16 | data[6] << 8 | data[7]; 614 Blowfish_decipher(c, &l, &r); 615 data[0] = l >> 24 & 0xff; 616 data[1] = l >> 16 & 0xff; 617 data[2] = l >> 8 & 0xff; 618 data[3] = l & 0xff; 619 data[4] = r >> 24 & 0xff; 620 data[5] = r >> 16 & 0xff; 621 data[6] = r >> 8 & 0xff; 622 data[7] = r & 0xff; 623 for (j = 0; j < 8; j++) 624 data[j] ^= iv[j]; 625 iv -= 8; 626 data -= 8; 627 } 628 l = data[0] << 24 | data[1] << 16 | data[2] << 8 | data[3]; 629 r = data[4] << 24 | data[5] << 16 | data[6] << 8 | data[7]; 630 Blowfish_decipher(c, &l, &r); 631 data[0] = l >> 24 & 0xff; 632 data[1] = l >> 16 & 0xff; 633 data[2] = l >> 8 & 0xff; 634 data[3] = l & 0xff; 635 data[4] = r >> 24 & 0xff; 636 data[5] = r >> 16 & 0xff; 637 data[6] = r >> 8 & 0xff; 638 data[7] = r & 0xff; 639 for (j = 0; j < 8; j++) 640 data[j] ^= iva[j]; 641 } 642 643 #if 0 644 void 645 report(u_int32_t data[], u_int16_t len) 646 { 647 u_int16_t i; 648 for (i = 0; i < len; i += 2) 649 printf("Block %0hd: %08lx %08lx.\n", 650 i / 2, data[i], data[i + 1]); 651 } 652 void 653 main(void) 654 { 655 656 blf_ctx c; 657 char key[] = "AAAAA"; 658 char key2[] = "abcdefghijklmnopqrstuvwxyz"; 659 660 u_int32_t data[10]; 661 u_int32_t data2[] = 662 {0x424c4f57l, 0x46495348l}; 663 664 u_int16_t i; 665 666 /* First test */ 667 for (i = 0; i < 10; i++) 668 data[i] = i; 669 670 blf_key(&c, (u_int8_t *) key, 5); 671 blf_enc(&c, data, 5); 672 blf_dec(&c, data, 1); 673 blf_dec(&c, data + 2, 4); 674 printf("Should read as 0 - 9.\n"); 675 report(data, 10); 676 677 /* Second test */ 678 blf_key(&c, (u_int8_t *) key2, strlen(key2)); 679 blf_enc(&c, data2, 1); 680 printf("\nShould read as: 0x324ed0fe 0xf413a203.\n"); 681 report(data2, 2); 682 blf_dec(&c, data2, 1); 683 report(data2, 2); 684 } 685 #endif