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