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