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