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