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