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 /* 23 * Copyright 2003 Sun Microsystems, Inc. All rights reserved. 24 * Use is subject to license terms. 25 */ 26 27 #pragma ident "%Z%%M% %I% %E% SMI" 28 29 /* 30 * Blowfish encryption/decryption and keyschedule code. 31 */ 32 33 #include <sys/types.h> 34 #include <sys/systm.h> 35 #include <sys/ddi.h> 36 #include <sys/sysmacros.h> 37 #include <sys/strsun.h> 38 #include <sys/note.h> 39 #include <sys/byteorder.h> 40 #include <sys/crypto/common.h> 41 #include "blowfish_impl.h" 42 43 #ifdef _KERNEL 44 #define BLOWFISH_ASSERT(x) ASSERT(x) 45 #else /* !_KERNEL */ 46 #define BLOWFISH_ASSERT(x) 47 #endif /* _KERNEL */ 48 49 /* EXPORT DELETE START */ 50 51 /* 52 * Blowfish initial P box and S boxes, derived from the hex digits of PI. 53 * 54 * NOTE: S boxes are placed into one large array. 55 */ 56 static const uint32_t init_P[] = { 57 0x243f6a88U, 0x85a308d3U, 0x13198a2eU, 58 0x03707344U, 0xa4093822U, 0x299f31d0U, 59 0x082efa98U, 0xec4e6c89U, 0x452821e6U, 60 0x38d01377U, 0xbe5466cfU, 0x34e90c6cU, 61 0xc0ac29b7U, 0xc97c50ddU, 0x3f84d5b5U, 62 0xb5470917U, 0x9216d5d9U, 0x8979fb1bU 63 }; 64 65 static const uint32_t init_S[] = { 66 /* S-Box 0. */ 67 0xd1310ba6U, 0x98dfb5acU, 0x2ffd72dbU, 0xd01adfb7U, 68 0xb8e1afedU, 0x6a267e96U, 0xba7c9045U, 0xf12c7f99U, 69 0x24a19947U, 0xb3916cf7U, 0x0801f2e2U, 0x858efc16U, 70 0x636920d8U, 0x71574e69U, 0xa458fea3U, 0xf4933d7eU, 71 0x0d95748fU, 0x728eb658U, 0x718bcd58U, 0x82154aeeU, 72 0x7b54a41dU, 0xc25a59b5U, 0x9c30d539U, 0x2af26013U, 73 0xc5d1b023U, 0x286085f0U, 0xca417918U, 0xb8db38efU, 74 0x8e79dcb0U, 0x603a180eU, 0x6c9e0e8bU, 0xb01e8a3eU, 75 0xd71577c1U, 0xbd314b27U, 0x78af2fdaU, 0x55605c60U, 76 0xe65525f3U, 0xaa55ab94U, 0x57489862U, 0x63e81440U, 77 0x55ca396aU, 0x2aab10b6U, 0xb4cc5c34U, 0x1141e8ceU, 78 0xa15486afU, 0x7c72e993U, 0xb3ee1411U, 0x636fbc2aU, 79 0x2ba9c55dU, 0x741831f6U, 0xce5c3e16U, 0x9b87931eU, 80 0xafd6ba33U, 0x6c24cf5cU, 0x7a325381U, 0x28958677U, 81 0x3b8f4898U, 0x6b4bb9afU, 0xc4bfe81bU, 0x66282193U, 82 0x61d809ccU, 0xfb21a991U, 0x487cac60U, 0x5dec8032U, 83 0xef845d5dU, 0xe98575b1U, 0xdc262302U, 0xeb651b88U, 84 0x23893e81U, 0xd396acc5U, 0x0f6d6ff3U, 0x83f44239U, 85 0x2e0b4482U, 0xa4842004U, 0x69c8f04aU, 0x9e1f9b5eU, 86 0x21c66842U, 0xf6e96c9aU, 0x670c9c61U, 0xabd388f0U, 87 0x6a51a0d2U, 0xd8542f68U, 0x960fa728U, 0xab5133a3U, 88 0x6eef0b6cU, 0x137a3be4U, 0xba3bf050U, 0x7efb2a98U, 89 0xa1f1651dU, 0x39af0176U, 0x66ca593eU, 0x82430e88U, 90 0x8cee8619U, 0x456f9fb4U, 0x7d84a5c3U, 0x3b8b5ebeU, 91 0xe06f75d8U, 0x85c12073U, 0x401a449fU, 0x56c16aa6U, 92 0x4ed3aa62U, 0x363f7706U, 0x1bfedf72U, 0x429b023dU, 93 0x37d0d724U, 0xd00a1248U, 0xdb0fead3U, 0x49f1c09bU, 94 0x075372c9U, 0x80991b7bU, 0x25d479d8U, 0xf6e8def7U, 95 0xe3fe501aU, 0xb6794c3bU, 0x976ce0bdU, 0x04c006baU, 96 0xc1a94fb6U, 0x409f60c4U, 0x5e5c9ec2U, 0x196a2463U, 97 0x68fb6fafU, 0x3e6c53b5U, 0x1339b2ebU, 0x3b52ec6fU, 98 0x6dfc511fU, 0x9b30952cU, 0xcc814544U, 0xaf5ebd09U, 99 0xbee3d004U, 0xde334afdU, 0x660f2807U, 0x192e4bb3U, 100 0xc0cba857U, 0x45c8740fU, 0xd20b5f39U, 0xb9d3fbdbU, 101 0x5579c0bdU, 0x1a60320aU, 0xd6a100c6U, 0x402c7279U, 102 0x679f25feU, 0xfb1fa3ccU, 0x8ea5e9f8U, 0xdb3222f8U, 103 0x3c7516dfU, 0xfd616b15U, 0x2f501ec8U, 0xad0552abU, 104 0x323db5faU, 0xfd238760U, 0x53317b48U, 0x3e00df82U, 105 0x9e5c57bbU, 0xca6f8ca0U, 0x1a87562eU, 0xdf1769dbU, 106 0xd542a8f6U, 0x287effc3U, 0xac6732c6U, 0x8c4f5573U, 107 0x695b27b0U, 0xbbca58c8U, 0xe1ffa35dU, 0xb8f011a0U, 108 0x10fa3d98U, 0xfd2183b8U, 0x4afcb56cU, 0x2dd1d35bU, 109 0x9a53e479U, 0xb6f84565U, 0xd28e49bcU, 0x4bfb9790U, 110 0xe1ddf2daU, 0xa4cb7e33U, 0x62fb1341U, 0xcee4c6e8U, 111 0xef20cadaU, 0x36774c01U, 0xd07e9efeU, 0x2bf11fb4U, 112 0x95dbda4dU, 0xae909198U, 0xeaad8e71U, 0x6b93d5a0U, 113 0xd08ed1d0U, 0xafc725e0U, 0x8e3c5b2fU, 0x8e7594b7U, 114 0x8ff6e2fbU, 0xf2122b64U, 0x8888b812U, 0x900df01cU, 115 0x4fad5ea0U, 0x688fc31cU, 0xd1cff191U, 0xb3a8c1adU, 116 0x2f2f2218U, 0xbe0e1777U, 0xea752dfeU, 0x8b021fa1U, 117 0xe5a0cc0fU, 0xb56f74e8U, 0x18acf3d6U, 0xce89e299U, 118 0xb4a84fe0U, 0xfd13e0b7U, 0x7cc43b81U, 0xd2ada8d9U, 119 0x165fa266U, 0x80957705U, 0x93cc7314U, 0x211a1477U, 120 0xe6ad2065U, 0x77b5fa86U, 0xc75442f5U, 0xfb9d35cfU, 121 0xebcdaf0cU, 0x7b3e89a0U, 0xd6411bd3U, 0xae1e7e49U, 122 0x00250e2dU, 0x2071b35eU, 0x226800bbU, 0x57b8e0afU, 123 0x2464369bU, 0xf009b91eU, 0x5563911dU, 0x59dfa6aaU, 124 0x78c14389U, 0xd95a537fU, 0x207d5ba2U, 0x02e5b9c5U, 125 0x83260376U, 0x6295cfa9U, 0x11c81968U, 0x4e734a41U, 126 0xb3472dcaU, 0x7b14a94aU, 0x1b510052U, 0x9a532915U, 127 0xd60f573fU, 0xbc9bc6e4U, 0x2b60a476U, 0x81e67400U, 128 0x08ba6fb5U, 0x571be91fU, 0xf296ec6bU, 0x2a0dd915U, 129 0xb6636521U, 0xe7b9f9b6U, 0xff34052eU, 0xc5855664U, 130 0x53b02d5dU, 0xa99f8fa1U, 0x08ba4799U, 0x6e85076aU, 131 132 /* S-Box 1. */ 133 0x4b7a70e9U, 0xb5b32944U, 0xdb75092eU, 0xc4192623U, 134 0xad6ea6b0U, 0x49a7df7dU, 0x9cee60b8U, 0x8fedb266U, 135 0xecaa8c71U, 0x699a17ffU, 0x5664526cU, 0xc2b19ee1U, 136 0x193602a5U, 0x75094c29U, 0xa0591340U, 0xe4183a3eU, 137 0x3f54989aU, 0x5b429d65U, 0x6b8fe4d6U, 0x99f73fd6U, 138 0xa1d29c07U, 0xefe830f5U, 0x4d2d38e6U, 0xf0255dc1U, 139 0x4cdd2086U, 0x8470eb26U, 0x6382e9c6U, 0x021ecc5eU, 140 0x09686b3fU, 0x3ebaefc9U, 0x3c971814U, 0x6b6a70a1U, 141 0x687f3584U, 0x52a0e286U, 0xb79c5305U, 0xaa500737U, 142 0x3e07841cU, 0x7fdeae5cU, 0x8e7d44ecU, 0x5716f2b8U, 143 0xb03ada37U, 0xf0500c0dU, 0xf01c1f04U, 0x0200b3ffU, 144 0xae0cf51aU, 0x3cb574b2U, 0x25837a58U, 0xdc0921bdU, 145 0xd19113f9U, 0x7ca92ff6U, 0x94324773U, 0x22f54701U, 146 0x3ae5e581U, 0x37c2dadcU, 0xc8b57634U, 0x9af3dda7U, 147 0xa9446146U, 0x0fd0030eU, 0xecc8c73eU, 0xa4751e41U, 148 0xe238cd99U, 0x3bea0e2fU, 0x3280bba1U, 0x183eb331U, 149 0x4e548b38U, 0x4f6db908U, 0x6f420d03U, 0xf60a04bfU, 150 0x2cb81290U, 0x24977c79U, 0x5679b072U, 0xbcaf89afU, 151 0xde9a771fU, 0xd9930810U, 0xb38bae12U, 0xdccf3f2eU, 152 0x5512721fU, 0x2e6b7124U, 0x501adde6U, 0x9f84cd87U, 153 0x7a584718U, 0x7408da17U, 0xbc9f9abcU, 0xe94b7d8cU, 154 0xec7aec3aU, 0xdb851dfaU, 0x63094366U, 0xc464c3d2U, 155 0xef1c1847U, 0x3215d908U, 0xdd433b37U, 0x24c2ba16U, 156 0x12a14d43U, 0x2a65c451U, 0x50940002U, 0x133ae4ddU, 157 0x71dff89eU, 0x10314e55U, 0x81ac77d6U, 0x5f11199bU, 158 0x043556f1U, 0xd7a3c76bU, 0x3c11183bU, 0x5924a509U, 159 0xf28fe6edU, 0x97f1fbfaU, 0x9ebabf2cU, 0x1e153c6eU, 160 0x86e34570U, 0xeae96fb1U, 0x860e5e0aU, 0x5a3e2ab3U, 161 0x771fe71cU, 0x4e3d06faU, 0x2965dcb9U, 0x99e71d0fU, 162 0x803e89d6U, 0x5266c825U, 0x2e4cc978U, 0x9c10b36aU, 163 0xc6150ebaU, 0x94e2ea78U, 0xa5fc3c53U, 0x1e0a2df4U, 164 0xf2f74ea7U, 0x361d2b3dU, 0x1939260fU, 0x19c27960U, 165 0x5223a708U, 0xf71312b6U, 0xebadfe6eU, 0xeac31f66U, 166 0xe3bc4595U, 0xa67bc883U, 0xb17f37d1U, 0x018cff28U, 167 0xc332ddefU, 0xbe6c5aa5U, 0x65582185U, 0x68ab9802U, 168 0xeecea50fU, 0xdb2f953bU, 0x2aef7dadU, 0x5b6e2f84U, 169 0x1521b628U, 0x29076170U, 0xecdd4775U, 0x619f1510U, 170 0x13cca830U, 0xeb61bd96U, 0x0334fe1eU, 0xaa0363cfU, 171 0xb5735c90U, 0x4c70a239U, 0xd59e9e0bU, 0xcbaade14U, 172 0xeecc86bcU, 0x60622ca7U, 0x9cab5cabU, 0xb2f3846eU, 173 0x648b1eafU, 0x19bdf0caU, 0xa02369b9U, 0x655abb50U, 174 0x40685a32U, 0x3c2ab4b3U, 0x319ee9d5U, 0xc021b8f7U, 175 0x9b540b19U, 0x875fa099U, 0x95f7997eU, 0x623d7da8U, 176 0xf837889aU, 0x97e32d77U, 0x11ed935fU, 0x16681281U, 177 0x0e358829U, 0xc7e61fd6U, 0x96dedfa1U, 0x7858ba99U, 178 0x57f584a5U, 0x1b227263U, 0x9b83c3ffU, 0x1ac24696U, 179 0xcdb30aebU, 0x532e3054U, 0x8fd948e4U, 0x6dbc3128U, 180 0x58ebf2efU, 0x34c6ffeaU, 0xfe28ed61U, 0xee7c3c73U, 181 0x5d4a14d9U, 0xe864b7e3U, 0x42105d14U, 0x203e13e0U, 182 0x45eee2b6U, 0xa3aaabeaU, 0xdb6c4f15U, 0xfacb4fd0U, 183 0xc742f442U, 0xef6abbb5U, 0x654f3b1dU, 0x41cd2105U, 184 0xd81e799eU, 0x86854dc7U, 0xe44b476aU, 0x3d816250U, 185 0xcf62a1f2U, 0x5b8d2646U, 0xfc8883a0U, 0xc1c7b6a3U, 186 0x7f1524c3U, 0x69cb7492U, 0x47848a0bU, 0x5692b285U, 187 0x095bbf00U, 0xad19489dU, 0x1462b174U, 0x23820e00U, 188 0x58428d2aU, 0x0c55f5eaU, 0x1dadf43eU, 0x233f7061U, 189 0x3372f092U, 0x8d937e41U, 0xd65fecf1U, 0x6c223bdbU, 190 0x7cde3759U, 0xcbee7460U, 0x4085f2a7U, 0xce77326eU, 191 0xa6078084U, 0x19f8509eU, 0xe8efd855U, 0x61d99735U, 192 0xa969a7aaU, 0xc50c06c2U, 0x5a04abfcU, 0x800bcadcU, 193 0x9e447a2eU, 0xc3453484U, 0xfdd56705U, 0x0e1e9ec9U, 194 0xdb73dbd3U, 0x105588cdU, 0x675fda79U, 0xe3674340U, 195 0xc5c43465U, 0x713e38d8U, 0x3d28f89eU, 0xf16dff20U, 196 0x153e21e7U, 0x8fb03d4aU, 0xe6e39f2bU, 0xdb83adf7U, 197 198 /* S-Box 2. */ 199 0xe93d5a68U, 0x948140f7U, 0xf64c261cU, 0x94692934U, 200 0x411520f7U, 0x7602d4f7U, 0xbcf46b2eU, 0xd4a20068U, 201 0xd4082471U, 0x3320f46aU, 0x43b7d4b7U, 0x500061afU, 202 0x1e39f62eU, 0x97244546U, 0x14214f74U, 0xbf8b8840U, 203 0x4d95fc1dU, 0x96b591afU, 0x70f4ddd3U, 0x66a02f45U, 204 0xbfbc09ecU, 0x03bd9785U, 0x7fac6dd0U, 0x31cb8504U, 205 0x96eb27b3U, 0x55fd3941U, 0xda2547e6U, 0xabca0a9aU, 206 0x28507825U, 0x530429f4U, 0x0a2c86daU, 0xe9b66dfbU, 207 0x68dc1462U, 0xd7486900U, 0x680ec0a4U, 0x27a18deeU, 208 0x4f3ffea2U, 0xe887ad8cU, 0xb58ce006U, 0x7af4d6b6U, 209 0xaace1e7cU, 0xd3375fecU, 0xce78a399U, 0x406b2a42U, 210 0x20fe9e35U, 0xd9f385b9U, 0xee39d7abU, 0x3b124e8bU, 211 0x1dc9faf7U, 0x4b6d1856U, 0x26a36631U, 0xeae397b2U, 212 0x3a6efa74U, 0xdd5b4332U, 0x6841e7f7U, 0xca7820fbU, 213 0xfb0af54eU, 0xd8feb397U, 0x454056acU, 0xba489527U, 214 0x55533a3aU, 0x20838d87U, 0xfe6ba9b7U, 0xd096954bU, 215 0x55a867bcU, 0xa1159a58U, 0xcca92963U, 0x99e1db33U, 216 0xa62a4a56U, 0x3f3125f9U, 0x5ef47e1cU, 0x9029317cU, 217 0xfdf8e802U, 0x04272f70U, 0x80bb155cU, 0x05282ce3U, 218 0x95c11548U, 0xe4c66d22U, 0x48c1133fU, 0xc70f86dcU, 219 0x07f9c9eeU, 0x41041f0fU, 0x404779a4U, 0x5d886e17U, 220 0x325f51ebU, 0xd59bc0d1U, 0xf2bcc18fU, 0x41113564U, 221 0x257b7834U, 0x602a9c60U, 0xdff8e8a3U, 0x1f636c1bU, 222 0x0e12b4c2U, 0x02e1329eU, 0xaf664fd1U, 0xcad18115U, 223 0x6b2395e0U, 0x333e92e1U, 0x3b240b62U, 0xeebeb922U, 224 0x85b2a20eU, 0xe6ba0d99U, 0xde720c8cU, 0x2da2f728U, 225 0xd0127845U, 0x95b794fdU, 0x647d0862U, 0xe7ccf5f0U, 226 0x5449a36fU, 0x877d48faU, 0xc39dfd27U, 0xf33e8d1eU, 227 0x0a476341U, 0x992eff74U, 0x3a6f6eabU, 0xf4f8fd37U, 228 0xa812dc60U, 0xa1ebddf8U, 0x991be14cU, 0xdb6e6b0dU, 229 0xc67b5510U, 0x6d672c37U, 0x2765d43bU, 0xdcd0e804U, 230 0xf1290dc7U, 0xcc00ffa3U, 0xb5390f92U, 0x690fed0bU, 231 0x667b9ffbU, 0xcedb7d9cU, 0xa091cf0bU, 0xd9155ea3U, 232 0xbb132f88U, 0x515bad24U, 0x7b9479bfU, 0x763bd6ebU, 233 0x37392eb3U, 0xcc115979U, 0x8026e297U, 0xf42e312dU, 234 0x6842ada7U, 0xc66a2b3bU, 0x12754cccU, 0x782ef11cU, 235 0x6a124237U, 0xb79251e7U, 0x06a1bbe6U, 0x4bfb6350U, 236 0x1a6b1018U, 0x11caedfaU, 0x3d25bdd8U, 0xe2e1c3c9U, 237 0x44421659U, 0x0a121386U, 0xd90cec6eU, 0xd5abea2aU, 238 0x64af674eU, 0xda86a85fU, 0xbebfe988U, 0x64e4c3feU, 239 0x9dbc8057U, 0xf0f7c086U, 0x60787bf8U, 0x6003604dU, 240 0xd1fd8346U, 0xf6381fb0U, 0x7745ae04U, 0xd736fcccU, 241 0x83426b33U, 0xf01eab71U, 0xb0804187U, 0x3c005e5fU, 242 0x77a057beU, 0xbde8ae24U, 0x55464299U, 0xbf582e61U, 243 0x4e58f48fU, 0xf2ddfda2U, 0xf474ef38U, 0x8789bdc2U, 244 0x5366f9c3U, 0xc8b38e74U, 0xb475f255U, 0x46fcd9b9U, 245 0x7aeb2661U, 0x8b1ddf84U, 0x846a0e79U, 0x915f95e2U, 246 0x466e598eU, 0x20b45770U, 0x8cd55591U, 0xc902de4cU, 247 0xb90bace1U, 0xbb8205d0U, 0x11a86248U, 0x7574a99eU, 248 0xb77f19b6U, 0xe0a9dc09U, 0x662d09a1U, 0xc4324633U, 249 0xe85a1f02U, 0x09f0be8cU, 0x4a99a025U, 0x1d6efe10U, 250 0x1ab93d1dU, 0x0ba5a4dfU, 0xa186f20fU, 0x2868f169U, 251 0xdcb7da83U, 0x573906feU, 0xa1e2ce9bU, 0x4fcd7f52U, 252 0x50115e01U, 0xa70683faU, 0xa002b5c4U, 0x0de6d027U, 253 0x9af88c27U, 0x773f8641U, 0xc3604c06U, 0x61a806b5U, 254 0xf0177a28U, 0xc0f586e0U, 0x006058aaU, 0x30dc7d62U, 255 0x11e69ed7U, 0x2338ea63U, 0x53c2dd94U, 0xc2c21634U, 256 0xbbcbee56U, 0x90bcb6deU, 0xebfc7da1U, 0xce591d76U, 257 0x6f05e409U, 0x4b7c0188U, 0x39720a3dU, 0x7c927c24U, 258 0x86e3725fU, 0x724d9db9U, 0x1ac15bb4U, 0xd39eb8fcU, 259 0xed545578U, 0x08fca5b5U, 0xd83d7cd3U, 0x4dad0fc4U, 260 0x1e50ef5eU, 0xb161e6f8U, 0xa28514d9U, 0x6c51133cU, 261 0x6fd5c7e7U, 0x56e14ec4U, 0x362abfceU, 0xddc6c837U, 262 0xd79a3234U, 0x92638212U, 0x670efa8eU, 0x406000e0U, 263 264 /* S-Box 3. */ 265 0x3a39ce37U, 0xd3faf5cfU, 0xabc27737U, 0x5ac52d1bU, 266 0x5cb0679eU, 0x4fa33742U, 0xd3822740U, 0x99bc9bbeU, 267 0xd5118e9dU, 0xbf0f7315U, 0xd62d1c7eU, 0xc700c47bU, 268 0xb78c1b6bU, 0x21a19045U, 0xb26eb1beU, 0x6a366eb4U, 269 0x5748ab2fU, 0xbc946e79U, 0xc6a376d2U, 0x6549c2c8U, 270 0x530ff8eeU, 0x468dde7dU, 0xd5730a1dU, 0x4cd04dc6U, 271 0x2939bbdbU, 0xa9ba4650U, 0xac9526e8U, 0xbe5ee304U, 272 0xa1fad5f0U, 0x6a2d519aU, 0x63ef8ce2U, 0x9a86ee22U, 273 0xc089c2b8U, 0x43242ef6U, 0xa51e03aaU, 0x9cf2d0a4U, 274 0x83c061baU, 0x9be96a4dU, 0x8fe51550U, 0xba645bd6U, 275 0x2826a2f9U, 0xa73a3ae1U, 0x4ba99586U, 0xef5562e9U, 276 0xc72fefd3U, 0xf752f7daU, 0x3f046f69U, 0x77fa0a59U, 277 0x80e4a915U, 0x87b08601U, 0x9b09e6adU, 0x3b3ee593U, 278 0xe990fd5aU, 0x9e34d797U, 0x2cf0b7d9U, 0x022b8b51U, 279 0x96d5ac3aU, 0x017da67dU, 0xd1cf3ed6U, 0x7c7d2d28U, 280 0x1f9f25cfU, 0xadf2b89bU, 0x5ad6b472U, 0x5a88f54cU, 281 0xe029ac71U, 0xe019a5e6U, 0x47b0acfdU, 0xed93fa9bU, 282 0xe8d3c48dU, 0x283b57ccU, 0xf8d56629U, 0x79132e28U, 283 0x785f0191U, 0xed756055U, 0xf7960e44U, 0xe3d35e8cU, 284 0x15056dd4U, 0x88f46dbaU, 0x03a16125U, 0x0564f0bdU, 285 0xc3eb9e15U, 0x3c9057a2U, 0x97271aecU, 0xa93a072aU, 286 0x1b3f6d9bU, 0x1e6321f5U, 0xf59c66fbU, 0x26dcf319U, 287 0x7533d928U, 0xb155fdf5U, 0x03563482U, 0x8aba3cbbU, 288 0x28517711U, 0xc20ad9f8U, 0xabcc5167U, 0xccad925fU, 289 0x4de81751U, 0x3830dc8eU, 0x379d5862U, 0x9320f991U, 290 0xea7a90c2U, 0xfb3e7bceU, 0x5121ce64U, 0x774fbe32U, 291 0xa8b6e37eU, 0xc3293d46U, 0x48de5369U, 0x6413e680U, 292 0xa2ae0810U, 0xdd6db224U, 0x69852dfdU, 0x09072166U, 293 0xb39a460aU, 0x6445c0ddU, 0x586cdecfU, 0x1c20c8aeU, 294 0x5bbef7ddU, 0x1b588d40U, 0xccd2017fU, 0x6bb4e3bbU, 295 0xdda26a7eU, 0x3a59ff45U, 0x3e350a44U, 0xbcb4cdd5U, 296 0x72eacea8U, 0xfa6484bbU, 0x8d6612aeU, 0xbf3c6f47U, 297 0xd29be463U, 0x542f5d9eU, 0xaec2771bU, 0xf64e6370U, 298 0x740e0d8dU, 0xe75b1357U, 0xf8721671U, 0xaf537d5dU, 299 0x4040cb08U, 0x4eb4e2ccU, 0x34d2466aU, 0x0115af84U, 300 0xe1b00428U, 0x95983a1dU, 0x06b89fb4U, 0xce6ea048U, 301 0x6f3f3b82U, 0x3520ab82U, 0x011a1d4bU, 0x277227f8U, 302 0x611560b1U, 0xe7933fdcU, 0xbb3a792bU, 0x344525bdU, 303 0xa08839e1U, 0x51ce794bU, 0x2f32c9b7U, 0xa01fbac9U, 304 0xe01cc87eU, 0xbcc7d1f6U, 0xcf0111c3U, 0xa1e8aac7U, 305 0x1a908749U, 0xd44fbd9aU, 0xd0dadecbU, 0xd50ada38U, 306 0x0339c32aU, 0xc6913667U, 0x8df9317cU, 0xe0b12b4fU, 307 0xf79e59b7U, 0x43f5bb3aU, 0xf2d519ffU, 0x27d9459cU, 308 0xbf97222cU, 0x15e6fc2aU, 0x0f91fc71U, 0x9b941525U, 309 0xfae59361U, 0xceb69cebU, 0xc2a86459U, 0x12baa8d1U, 310 0xb6c1075eU, 0xe3056a0cU, 0x10d25065U, 0xcb03a442U, 311 0xe0ec6e0eU, 0x1698db3bU, 0x4c98a0beU, 0x3278e964U, 312 0x9f1f9532U, 0xe0d392dfU, 0xd3a0342bU, 0x8971f21eU, 313 0x1b0a7441U, 0x4ba3348cU, 0xc5be7120U, 0xc37632d8U, 314 0xdf359f8dU, 0x9b992f2eU, 0xe60b6f47U, 0x0fe3f11dU, 315 0xe54cda54U, 0x1edad891U, 0xce6279cfU, 0xcd3e7e6fU, 316 0x1618b166U, 0xfd2c1d05U, 0x848fd2c5U, 0xf6fb2299U, 317 0xf523f357U, 0xa6327623U, 0x93a83531U, 0x56cccd02U, 318 0xacf08162U, 0x5a75ebb5U, 0x6e163697U, 0x88d273ccU, 319 0xde966292U, 0x81b949d0U, 0x4c50901bU, 0x71c65614U, 320 0xe6c6c7bdU, 0x327a140aU, 0x45e1d006U, 0xc3f27b9aU, 321 0xc9aa53fdU, 0x62a80f00U, 0xbb25bfe2U, 0x35bdd2f6U, 322 0x71126905U, 0xb2040222U, 0xb6cbcf7cU, 0xcd769c2bU, 323 0x53113ec0U, 0x1640e3d3U, 0x38abbd60U, 0x2547adf0U, 324 0xba38209cU, 0xf746ce76U, 0x77afa1c5U, 0x20756060U, 325 0x85cbfe4eU, 0x8ae88dd8U, 0x7aaaf9b0U, 0x4cf9aa7eU, 326 0x1948c25cU, 0x02fb8a8cU, 0x01c36ae4U, 0xd6ebe1f9U, 327 0x90d4f869U, 0xa65cdea0U, 0x3f09252dU, 0xc208e69fU, 328 0xb74e6132U, 0xce77e25bU, 0x578fdfe3U, 0x3ac372e6U, 329 }; 330 331 typedef struct keysched_s { 332 uint32_t ksch_S[1024]; /* The 4 S boxes are 256 32-bit words. */ 333 uint32_t ksch_P[18]; /* P box is 18 32-bit words. */ 334 } keysched_t; 335 336 /* 337 * Since ROUND() is a macro, make sure that the things inside can be 338 * evaluated more than once. Especially when calling F(). 339 * Assume the presence of local variables: 340 * 341 * uint32_t *P; 342 * uint32_t *S; 343 * uint32_t tmp; 344 * 345 * 346 * And to Microsoft interview survivors out there, perhaps I should do the 347 * XOR swap trick, or at least #ifdef (__i386) the tmp = ... = tmp; stuff. 348 */ 349 350 #define F(word) \ 351 (((S[(word >> 24) & 0xff] + S[256 + ((word >> 16) & 0xff)]) ^ \ 352 S[512 + ((word >> 8) & 0xff)]) + S[768 + (word & 0xff)]) 353 354 #define ROUND(left, right, i) \ 355 (left) ^= P[i]; \ 356 (right) ^= F((left)); \ 357 tmp = (left); \ 358 (left) = (right); \ 359 (right) = tmp; 360 361 /* EXPORT DELETE END */ 362 363 /* 364 * Encrypt a block of data. Because of addition operations, convert blocks 365 * to their big-endian representation, even on Intel boxen. 366 */ 367 void 368 blowfish_encrypt_block(void *cookie, uint8_t *block, uint8_t *out_block) 369 { 370 /* EXPORT DELETE START */ 371 keysched_t *ksch = (keysched_t *)cookie; 372 373 uint32_t left, right, tmp; 374 uint32_t *P = ksch->ksch_P; 375 uint32_t *S = ksch->ksch_S; 376 #ifdef _BIG_ENDIAN 377 uint32_t *b32; 378 379 if (IS_P2ALIGNED(block, sizeof (uint32_t))) { 380 b32 = (uint32_t *)block; 381 left = b32[0]; 382 right = b32[1]; 383 } else { 384 #endif 385 /* 386 * Read input block and place in left/right in big-endian order. 387 */ 388 left = ((uint32_t)block[0] << 24) 389 | ((uint32_t)block[1] << 16) 390 | ((uint32_t)block[2] << 8) 391 | (uint32_t)block[3]; 392 right = ((uint32_t)block[4] << 24) 393 | ((uint32_t)block[5] << 16) 394 | ((uint32_t)block[6] << 8) 395 | (uint32_t)block[7]; 396 #ifdef _BIG_ENDIAN 397 } 398 #endif 399 400 ROUND(left, right, 0); 401 ROUND(left, right, 1); 402 ROUND(left, right, 2); 403 ROUND(left, right, 3); 404 ROUND(left, right, 4); 405 ROUND(left, right, 5); 406 ROUND(left, right, 6); 407 ROUND(left, right, 7); 408 ROUND(left, right, 8); 409 ROUND(left, right, 9); 410 ROUND(left, right, 10); 411 ROUND(left, right, 11); 412 ROUND(left, right, 12); 413 ROUND(left, right, 13); 414 ROUND(left, right, 14); 415 ROUND(left, right, 15); 416 417 tmp = left; 418 left = right; 419 right = tmp; 420 right ^= P[16]; 421 left ^= P[17]; 422 423 #ifdef _BIG_ENDIAN 424 if (IS_P2ALIGNED(out_block, sizeof (uint32_t))) { 425 b32 = (uint32_t *)out_block; 426 b32[0] = left; 427 b32[1] = right; 428 } else { 429 #endif 430 /* Put the block back into the user's block with final swap */ 431 out_block[0] = left >> 24; 432 out_block[1] = left >> 16; 433 out_block[2] = left >> 8; 434 /* LINTED: narrowing conversion */ 435 out_block[3] = left; 436 out_block[4] = right >> 24; 437 out_block[5] = right >> 16; 438 out_block[6] = right >> 8; 439 /* LINTED: narrowing conversion */ 440 out_block[7] = right; 441 #ifdef _BIG_ENDIAN 442 } 443 #endif 444 /* EXPORT DELETE END */ 445 } 446 447 /* 448 * Decrypt a block of data. Because of addition operations, convert blocks 449 * to their big-endian representation, even on Intel boxen. 450 * It should look like the blowfish_encrypt_block() operation 451 * except for the order in which the S/P boxes are accessed. 452 */ 453 void 454 blowfish_decrypt_block(void *cookie, uint8_t *block, uint8_t *out_block) 455 { 456 /* EXPORT DELETE START */ 457 keysched_t *ksch = (keysched_t *)cookie; 458 459 uint32_t left, right, tmp; 460 uint32_t *P = ksch->ksch_P; 461 uint32_t *S = ksch->ksch_S; 462 #ifdef _BIG_ENDIAN 463 uint32_t *b32; 464 465 if (IS_P2ALIGNED(block, sizeof (uint32_t))) { 466 b32 = (uint32_t *)block; 467 left = b32[0]; 468 right = b32[1]; 469 } else { 470 #endif 471 /* 472 * Read input block and place in left/right in big-endian order. 473 */ 474 left = ((uint32_t)block[0] << 24) 475 | ((uint32_t)block[1] << 16) 476 | ((uint32_t)block[2] << 8) 477 | (uint32_t)block[3]; 478 right = ((uint32_t)block[4] << 24) 479 | ((uint32_t)block[5] << 16) 480 | ((uint32_t)block[6] << 8) 481 | (uint32_t)block[7]; 482 #ifdef _BIG_ENDIAN 483 } 484 #endif 485 486 ROUND(left, right, 17); 487 ROUND(left, right, 16); 488 ROUND(left, right, 15); 489 ROUND(left, right, 14); 490 ROUND(left, right, 13); 491 ROUND(left, right, 12); 492 ROUND(left, right, 11); 493 ROUND(left, right, 10); 494 ROUND(left, right, 9); 495 ROUND(left, right, 8); 496 ROUND(left, right, 7); 497 ROUND(left, right, 6); 498 ROUND(left, right, 5); 499 ROUND(left, right, 4); 500 ROUND(left, right, 3); 501 ROUND(left, right, 2); 502 503 tmp = left; 504 left = right; 505 right = tmp; 506 right ^= P[1]; 507 left ^= P[0]; 508 509 #ifdef _BIG_ENDIAN 510 if (IS_P2ALIGNED(out_block, sizeof (uint32_t))) { 511 b32 = (uint32_t *)out_block; 512 b32[0] = left; 513 b32[1] = right; 514 } else { 515 #endif 516 /* Put the block back into the user's block with final swap */ 517 out_block[0] = left >> 24; 518 out_block[1] = left >> 16; 519 out_block[2] = left >> 8; 520 /* LINTED: narrowing conversion */ 521 out_block[3] = left; 522 out_block[4] = right >> 24; 523 out_block[5] = right >> 16; 524 out_block[6] = right >> 8; 525 /* LINTED: narrowing conversion */ 526 out_block[7] = right; 527 #ifdef _BIG_ENDIAN 528 } 529 #endif 530 /* EXPORT DELETE END */ 531 } 532 533 static void 534 bitrepeat(uint8_t *pattern, uint_t len_bytes, uint_t len_bits, uint8_t *dst, 535 uint_t dst_len_bytes) 536 { 537 /* EXPORT DELETE START */ 538 uint8_t *current = dst; 539 uint_t bitsleft = dst_len_bytes << 3; 540 uint_t bitoffset = 0; 541 uint_t currentbits; 542 int i; 543 544 BLOWFISH_ASSERT(((len_bits + 7) >> 3) == len_bytes); 545 546 bzero(dst, dst_len_bytes); 547 548 while (bitsleft != 0) { 549 if (bitsleft >= len_bits) { 550 currentbits = len_bits; 551 552 for (i = 0; i < len_bytes; i++) { 553 if (currentbits >= 8) { 554 *current++ |= pattern[i] >> bitoffset; 555 *current |= pattern[i] << 8 - bitoffset; 556 currentbits -= 8; 557 } else { 558 *current |= pattern[i] >> bitoffset; 559 bitoffset = bitoffset + currentbits; 560 bitoffset &= 0x7; 561 if (bitoffset == 0) 562 current++; 563 } 564 } 565 bitsleft -= len_bits; 566 } else { 567 currentbits = bitsleft; 568 569 for (i = 0; i < len_bytes && bitsleft != 0; i++) { 570 if (currentbits >= 8 && 571 current < dst + dst_len_bytes) { 572 *current++ |= pattern[i] >> bitoffset; 573 *current |= pattern[i] << 8 - bitoffset; 574 currentbits -= 8; 575 bitsleft -= 8; 576 } else { 577 *current |= pattern[i] >> bitoffset; 578 bitsleft -= bitoffset; 579 bitoffset = bitoffset + currentbits; 580 bitoffset &= 0x7; 581 if (bitoffset == 0) 582 current++; 583 currentbits = 0; 584 } 585 } 586 bitsleft = 0; 587 } 588 } 589 /* EXPORT DELETE END */ 590 } 591 592 /* 593 * Initialize key schedules for Blowfish. 594 */ 595 void 596 blowfish_init_keysched(uint8_t *key, uint_t bits, void *keysched) 597 { 598 /* EXPORT DELETE START */ 599 keysched_t *newbie = keysched; 600 uint32_t *P = newbie->ksch_P; 601 uint32_t *S = newbie->ksch_S; 602 uint32_t *initp; 603 uint32_t tmpblock[] = {0, 0}; 604 uint8_t *rawkeybytes = (uint8_t *)P; 605 int i, slop, copylen; 606 uintptr_t bytesleft; 607 uint_t len; 608 609 len = CRYPTO_BITS2BYTES(bits); 610 611 if ((bits & 0x7) != 0) { 612 /* 613 * Really slow case, bits aren't on a byte boundary. 614 * Keep track of individual bits copied over. :-P 615 */ 616 bitrepeat(key, len, bits, rawkeybytes, 72); 617 } else { 618 slop = 72 % len; 619 620 /* Someone gave us a nice amount (i.e. div by 8) of bits */ 621 while (rawkeybytes != (uint8_t *)(P + 18)) { 622 bytesleft = 623 (uintptr_t)(P + 18) - (uintptr_t)rawkeybytes; 624 copylen = (bytesleft >= len) ? len : slop; 625 bcopy(key, rawkeybytes, copylen); 626 rawkeybytes += copylen; 627 } 628 } 629 630 for (i = 0; i < 18; i++) 631 P[i] = ntohl(P[i]) ^ init_P[i]; 632 633 /* Go bcopy go! (Hope that Ultra's bcopy is faster than me!) */ 634 bcopy(init_S, S, sizeof (init_S)); 635 636 /* 637 * When initializing P and S boxes, store the results of a single 638 * encrypt-block operation in "host order", which on little-endian 639 * means byte-swapping. Fortunately, the ntohl() function does this 640 * quite nicely, and it a NOP on big-endian machine. 641 */ 642 initp = P; 643 for (i = 0; i < 9; i++) { 644 blowfish_encrypt_block(newbie, (uint8_t *)tmpblock, 645 (uint8_t *)tmpblock); 646 *initp++ = ntohl(tmpblock[0]); 647 *initp++ = ntohl(tmpblock[1]); 648 } 649 650 initp = S; 651 for (i = 0; i < 512; i++) { 652 blowfish_encrypt_block(newbie, (uint8_t *)tmpblock, 653 (uint8_t *)tmpblock); 654 *initp++ = ntohl(tmpblock[0]); 655 *initp++ = ntohl(tmpblock[1]); 656 } 657 /* EXPORT DELETE END */ 658 } 659 660 /* 661 * Allocate key schedule for Blowfish. 662 */ 663 void * 664 blowfish_alloc_keysched(size_t *size, int kmflag) 665 { 666 /* EXPORT DELETE START */ 667 keysched_t *keysched; 668 669 keysched = (keysched_t *)kmem_alloc(sizeof (keysched_t), kmflag); 670 if (keysched != NULL) { 671 *size = sizeof (keysched_t); 672 return (keysched); 673 } 674 /* EXPORT DELETE END */ 675 676 return (NULL); 677 } 678