linux/crypto/blowfish_common.c
<<
>>
Prefs
   1// SPDX-License-Identifier: GPL-2.0-or-later
   2/*
   3 * Cryptographic API.
   4 *
   5 * Common Blowfish algorithm parts shared between the c and assembler
   6 * implementations.
   7 *
   8 * Blowfish Cipher Algorithm, by Bruce Schneier.
   9 * http://www.counterpane.com/blowfish.html
  10 *
  11 * Adapted from Kerneli implementation.
  12 *
  13 * Copyright (c) Herbert Valerio Riedel <hvr@hvrlab.org>
  14 * Copyright (c) Kyle McMartin <kyle@debian.org>
  15 * Copyright (c) 2002 James Morris <jmorris@intercode.com.au>
  16 */
  17#include <linux/init.h>
  18#include <linux/module.h>
  19#include <linux/mm.h>
  20#include <asm/byteorder.h>
  21#include <linux/crypto.h>
  22#include <linux/types.h>
  23#include <crypto/blowfish.h>
  24
  25static const u32 bf_pbox[16 + 2] = {
  26        0x243f6a88, 0x85a308d3, 0x13198a2e, 0x03707344,
  27        0xa4093822, 0x299f31d0, 0x082efa98, 0xec4e6c89,
  28        0x452821e6, 0x38d01377, 0xbe5466cf, 0x34e90c6c,
  29        0xc0ac29b7, 0xc97c50dd, 0x3f84d5b5, 0xb5470917,
  30        0x9216d5d9, 0x8979fb1b,
  31};
  32
  33static const u32 bf_sbox[256 * 4] = {
  34        0xd1310ba6, 0x98dfb5ac, 0x2ffd72db, 0xd01adfb7,
  35        0xb8e1afed, 0x6a267e96, 0xba7c9045, 0xf12c7f99,
  36        0x24a19947, 0xb3916cf7, 0x0801f2e2, 0x858efc16,
  37        0x636920d8, 0x71574e69, 0xa458fea3, 0xf4933d7e,
  38        0x0d95748f, 0x728eb658, 0x718bcd58, 0x82154aee,
  39        0x7b54a41d, 0xc25a59b5, 0x9c30d539, 0x2af26013,
  40        0xc5d1b023, 0x286085f0, 0xca417918, 0xb8db38ef,
  41        0x8e79dcb0, 0x603a180e, 0x6c9e0e8b, 0xb01e8a3e,
  42        0xd71577c1, 0xbd314b27, 0x78af2fda, 0x55605c60,
  43        0xe65525f3, 0xaa55ab94, 0x57489862, 0x63e81440,
  44        0x55ca396a, 0x2aab10b6, 0xb4cc5c34, 0x1141e8ce,
  45        0xa15486af, 0x7c72e993, 0xb3ee1411, 0x636fbc2a,
  46        0x2ba9c55d, 0x741831f6, 0xce5c3e16, 0x9b87931e,
  47        0xafd6ba33, 0x6c24cf5c, 0x7a325381, 0x28958677,
  48        0x3b8f4898, 0x6b4bb9af, 0xc4bfe81b, 0x66282193,
  49        0x61d809cc, 0xfb21a991, 0x487cac60, 0x5dec8032,
  50        0xef845d5d, 0xe98575b1, 0xdc262302, 0xeb651b88,
  51        0x23893e81, 0xd396acc5, 0x0f6d6ff3, 0x83f44239,
  52        0x2e0b4482, 0xa4842004, 0x69c8f04a, 0x9e1f9b5e,
  53        0x21c66842, 0xf6e96c9a, 0x670c9c61, 0xabd388f0,
  54        0x6a51a0d2, 0xd8542f68, 0x960fa728, 0xab5133a3,
  55        0x6eef0b6c, 0x137a3be4, 0xba3bf050, 0x7efb2a98,
  56        0xa1f1651d, 0x39af0176, 0x66ca593e, 0x82430e88,
  57        0x8cee8619, 0x456f9fb4, 0x7d84a5c3, 0x3b8b5ebe,
  58        0xe06f75d8, 0x85c12073, 0x401a449f, 0x56c16aa6,
  59        0x4ed3aa62, 0x363f7706, 0x1bfedf72, 0x429b023d,
  60        0x37d0d724, 0xd00a1248, 0xdb0fead3, 0x49f1c09b,
  61        0x075372c9, 0x80991b7b, 0x25d479d8, 0xf6e8def7,
  62        0xe3fe501a, 0xb6794c3b, 0x976ce0bd, 0x04c006ba,
  63        0xc1a94fb6, 0x409f60c4, 0x5e5c9ec2, 0x196a2463,
  64        0x68fb6faf, 0x3e6c53b5, 0x1339b2eb, 0x3b52ec6f,
  65        0x6dfc511f, 0x9b30952c, 0xcc814544, 0xaf5ebd09,
  66        0xbee3d004, 0xde334afd, 0x660f2807, 0x192e4bb3,
  67        0xc0cba857, 0x45c8740f, 0xd20b5f39, 0xb9d3fbdb,
  68        0x5579c0bd, 0x1a60320a, 0xd6a100c6, 0x402c7279,
  69        0x679f25fe, 0xfb1fa3cc, 0x8ea5e9f8, 0xdb3222f8,
  70        0x3c7516df, 0xfd616b15, 0x2f501ec8, 0xad0552ab,
  71        0x323db5fa, 0xfd238760, 0x53317b48, 0x3e00df82,
  72        0x9e5c57bb, 0xca6f8ca0, 0x1a87562e, 0xdf1769db,
  73        0xd542a8f6, 0x287effc3, 0xac6732c6, 0x8c4f5573,
  74        0x695b27b0, 0xbbca58c8, 0xe1ffa35d, 0xb8f011a0,
  75        0x10fa3d98, 0xfd2183b8, 0x4afcb56c, 0x2dd1d35b,
  76        0x9a53e479, 0xb6f84565, 0xd28e49bc, 0x4bfb9790,
  77        0xe1ddf2da, 0xa4cb7e33, 0x62fb1341, 0xcee4c6e8,
  78        0xef20cada, 0x36774c01, 0xd07e9efe, 0x2bf11fb4,
  79        0x95dbda4d, 0xae909198, 0xeaad8e71, 0x6b93d5a0,
  80        0xd08ed1d0, 0xafc725e0, 0x8e3c5b2f, 0x8e7594b7,
  81        0x8ff6e2fb, 0xf2122b64, 0x8888b812, 0x900df01c,
  82        0x4fad5ea0, 0x688fc31c, 0xd1cff191, 0xb3a8c1ad,
  83        0x2f2f2218, 0xbe0e1777, 0xea752dfe, 0x8b021fa1,
  84        0xe5a0cc0f, 0xb56f74e8, 0x18acf3d6, 0xce89e299,
  85        0xb4a84fe0, 0xfd13e0b7, 0x7cc43b81, 0xd2ada8d9,
  86        0x165fa266, 0x80957705, 0x93cc7314, 0x211a1477,
  87        0xe6ad2065, 0x77b5fa86, 0xc75442f5, 0xfb9d35cf,
  88        0xebcdaf0c, 0x7b3e89a0, 0xd6411bd3, 0xae1e7e49,
  89        0x00250e2d, 0x2071b35e, 0x226800bb, 0x57b8e0af,
  90        0x2464369b, 0xf009b91e, 0x5563911d, 0x59dfa6aa,
  91        0x78c14389, 0xd95a537f, 0x207d5ba2, 0x02e5b9c5,
  92        0x83260376, 0x6295cfa9, 0x11c81968, 0x4e734a41,
  93        0xb3472dca, 0x7b14a94a, 0x1b510052, 0x9a532915,
  94        0xd60f573f, 0xbc9bc6e4, 0x2b60a476, 0x81e67400,
  95        0x08ba6fb5, 0x571be91f, 0xf296ec6b, 0x2a0dd915,
  96        0xb6636521, 0xe7b9f9b6, 0xff34052e, 0xc5855664,
  97        0x53b02d5d, 0xa99f8fa1, 0x08ba4799, 0x6e85076a,
  98        0x4b7a70e9, 0xb5b32944, 0xdb75092e, 0xc4192623,
  99        0xad6ea6b0, 0x49a7df7d, 0x9cee60b8, 0x8fedb266,
 100        0xecaa8c71, 0x699a17ff, 0x5664526c, 0xc2b19ee1,
 101        0x193602a5, 0x75094c29, 0xa0591340, 0xe4183a3e,
 102        0x3f54989a, 0x5b429d65, 0x6b8fe4d6, 0x99f73fd6,
 103        0xa1d29c07, 0xefe830f5, 0x4d2d38e6, 0xf0255dc1,
 104        0x4cdd2086, 0x8470eb26, 0x6382e9c6, 0x021ecc5e,
 105        0x09686b3f, 0x3ebaefc9, 0x3c971814, 0x6b6a70a1,
 106        0x687f3584, 0x52a0e286, 0xb79c5305, 0xaa500737,
 107        0x3e07841c, 0x7fdeae5c, 0x8e7d44ec, 0x5716f2b8,
 108        0xb03ada37, 0xf0500c0d, 0xf01c1f04, 0x0200b3ff,
 109        0xae0cf51a, 0x3cb574b2, 0x25837a58, 0xdc0921bd,
 110        0xd19113f9, 0x7ca92ff6, 0x94324773, 0x22f54701,
 111        0x3ae5e581, 0x37c2dadc, 0xc8b57634, 0x9af3dda7,
 112        0xa9446146, 0x0fd0030e, 0xecc8c73e, 0xa4751e41,
 113        0xe238cd99, 0x3bea0e2f, 0x3280bba1, 0x183eb331,
 114        0x4e548b38, 0x4f6db908, 0x6f420d03, 0xf60a04bf,
 115        0x2cb81290, 0x24977c79, 0x5679b072, 0xbcaf89af,
 116        0xde9a771f, 0xd9930810, 0xb38bae12, 0xdccf3f2e,
 117        0x5512721f, 0x2e6b7124, 0x501adde6, 0x9f84cd87,
 118        0x7a584718, 0x7408da17, 0xbc9f9abc, 0xe94b7d8c,
 119        0xec7aec3a, 0xdb851dfa, 0x63094366, 0xc464c3d2,
 120        0xef1c1847, 0x3215d908, 0xdd433b37, 0x24c2ba16,
 121        0x12a14d43, 0x2a65c451, 0x50940002, 0x133ae4dd,
 122        0x71dff89e, 0x10314e55, 0x81ac77d6, 0x5f11199b,
 123        0x043556f1, 0xd7a3c76b, 0x3c11183b, 0x5924a509,
 124        0xf28fe6ed, 0x97f1fbfa, 0x9ebabf2c, 0x1e153c6e,
 125        0x86e34570, 0xeae96fb1, 0x860e5e0a, 0x5a3e2ab3,
 126        0x771fe71c, 0x4e3d06fa, 0x2965dcb9, 0x99e71d0f,
 127        0x803e89d6, 0x5266c825, 0x2e4cc978, 0x9c10b36a,
 128        0xc6150eba, 0x94e2ea78, 0xa5fc3c53, 0x1e0a2df4,
 129        0xf2f74ea7, 0x361d2b3d, 0x1939260f, 0x19c27960,
 130        0x5223a708, 0xf71312b6, 0xebadfe6e, 0xeac31f66,
 131        0xe3bc4595, 0xa67bc883, 0xb17f37d1, 0x018cff28,
 132        0xc332ddef, 0xbe6c5aa5, 0x65582185, 0x68ab9802,
 133        0xeecea50f, 0xdb2f953b, 0x2aef7dad, 0x5b6e2f84,
 134        0x1521b628, 0x29076170, 0xecdd4775, 0x619f1510,
 135        0x13cca830, 0xeb61bd96, 0x0334fe1e, 0xaa0363cf,
 136        0xb5735c90, 0x4c70a239, 0xd59e9e0b, 0xcbaade14,
 137        0xeecc86bc, 0x60622ca7, 0x9cab5cab, 0xb2f3846e,
 138        0x648b1eaf, 0x19bdf0ca, 0xa02369b9, 0x655abb50,
 139        0x40685a32, 0x3c2ab4b3, 0x319ee9d5, 0xc021b8f7,
 140        0x9b540b19, 0x875fa099, 0x95f7997e, 0x623d7da8,
 141        0xf837889a, 0x97e32d77, 0x11ed935f, 0x16681281,
 142        0x0e358829, 0xc7e61fd6, 0x96dedfa1, 0x7858ba99,
 143        0x57f584a5, 0x1b227263, 0x9b83c3ff, 0x1ac24696,
 144        0xcdb30aeb, 0x532e3054, 0x8fd948e4, 0x6dbc3128,
 145        0x58ebf2ef, 0x34c6ffea, 0xfe28ed61, 0xee7c3c73,
 146        0x5d4a14d9, 0xe864b7e3, 0x42105d14, 0x203e13e0,
 147        0x45eee2b6, 0xa3aaabea, 0xdb6c4f15, 0xfacb4fd0,
 148        0xc742f442, 0xef6abbb5, 0x654f3b1d, 0x41cd2105,
 149        0xd81e799e, 0x86854dc7, 0xe44b476a, 0x3d816250,
 150        0xcf62a1f2, 0x5b8d2646, 0xfc8883a0, 0xc1c7b6a3,
 151        0x7f1524c3, 0x69cb7492, 0x47848a0b, 0x5692b285,
 152        0x095bbf00, 0xad19489d, 0x1462b174, 0x23820e00,
 153        0x58428d2a, 0x0c55f5ea, 0x1dadf43e, 0x233f7061,
 154        0x3372f092, 0x8d937e41, 0xd65fecf1, 0x6c223bdb,
 155        0x7cde3759, 0xcbee7460, 0x4085f2a7, 0xce77326e,
 156        0xa6078084, 0x19f8509e, 0xe8efd855, 0x61d99735,
 157        0xa969a7aa, 0xc50c06c2, 0x5a04abfc, 0x800bcadc,
 158        0x9e447a2e, 0xc3453484, 0xfdd56705, 0x0e1e9ec9,
 159        0xdb73dbd3, 0x105588cd, 0x675fda79, 0xe3674340,
 160        0xc5c43465, 0x713e38d8, 0x3d28f89e, 0xf16dff20,
 161        0x153e21e7, 0x8fb03d4a, 0xe6e39f2b, 0xdb83adf7,
 162        0xe93d5a68, 0x948140f7, 0xf64c261c, 0x94692934,
 163        0x411520f7, 0x7602d4f7, 0xbcf46b2e, 0xd4a20068,
 164        0xd4082471, 0x3320f46a, 0x43b7d4b7, 0x500061af,
 165        0x1e39f62e, 0x97244546, 0x14214f74, 0xbf8b8840,
 166        0x4d95fc1d, 0x96b591af, 0x70f4ddd3, 0x66a02f45,
 167        0xbfbc09ec, 0x03bd9785, 0x7fac6dd0, 0x31cb8504,
 168        0x96eb27b3, 0x55fd3941, 0xda2547e6, 0xabca0a9a,
 169        0x28507825, 0x530429f4, 0x0a2c86da, 0xe9b66dfb,
 170        0x68dc1462, 0xd7486900, 0x680ec0a4, 0x27a18dee,
 171        0x4f3ffea2, 0xe887ad8c, 0xb58ce006, 0x7af4d6b6,
 172        0xaace1e7c, 0xd3375fec, 0xce78a399, 0x406b2a42,
 173        0x20fe9e35, 0xd9f385b9, 0xee39d7ab, 0x3b124e8b,
 174        0x1dc9faf7, 0x4b6d1856, 0x26a36631, 0xeae397b2,
 175        0x3a6efa74, 0xdd5b4332, 0x6841e7f7, 0xca7820fb,
 176        0xfb0af54e, 0xd8feb397, 0x454056ac, 0xba489527,
 177        0x55533a3a, 0x20838d87, 0xfe6ba9b7, 0xd096954b,
 178        0x55a867bc, 0xa1159a58, 0xcca92963, 0x99e1db33,
 179        0xa62a4a56, 0x3f3125f9, 0x5ef47e1c, 0x9029317c,
 180        0xfdf8e802, 0x04272f70, 0x80bb155c, 0x05282ce3,
 181        0x95c11548, 0xe4c66d22, 0x48c1133f, 0xc70f86dc,
 182        0x07f9c9ee, 0x41041f0f, 0x404779a4, 0x5d886e17,
 183        0x325f51eb, 0xd59bc0d1, 0xf2bcc18f, 0x41113564,
 184        0x257b7834, 0x602a9c60, 0xdff8e8a3, 0x1f636c1b,
 185        0x0e12b4c2, 0x02e1329e, 0xaf664fd1, 0xcad18115,
 186        0x6b2395e0, 0x333e92e1, 0x3b240b62, 0xeebeb922,
 187        0x85b2a20e, 0xe6ba0d99, 0xde720c8c, 0x2da2f728,
 188        0xd0127845, 0x95b794fd, 0x647d0862, 0xe7ccf5f0,
 189        0x5449a36f, 0x877d48fa, 0xc39dfd27, 0xf33e8d1e,
 190        0x0a476341, 0x992eff74, 0x3a6f6eab, 0xf4f8fd37,
 191        0xa812dc60, 0xa1ebddf8, 0x991be14c, 0xdb6e6b0d,
 192        0xc67b5510, 0x6d672c37, 0x2765d43b, 0xdcd0e804,
 193        0xf1290dc7, 0xcc00ffa3, 0xb5390f92, 0x690fed0b,
 194        0x667b9ffb, 0xcedb7d9c, 0xa091cf0b, 0xd9155ea3,
 195        0xbb132f88, 0x515bad24, 0x7b9479bf, 0x763bd6eb,
 196        0x37392eb3, 0xcc115979, 0x8026e297, 0xf42e312d,
 197        0x6842ada7, 0xc66a2b3b, 0x12754ccc, 0x782ef11c,
 198        0x6a124237, 0xb79251e7, 0x06a1bbe6, 0x4bfb6350,
 199        0x1a6b1018, 0x11caedfa, 0x3d25bdd8, 0xe2e1c3c9,
 200        0x44421659, 0x0a121386, 0xd90cec6e, 0xd5abea2a,
 201        0x64af674e, 0xda86a85f, 0xbebfe988, 0x64e4c3fe,
 202        0x9dbc8057, 0xf0f7c086, 0x60787bf8, 0x6003604d,
 203        0xd1fd8346, 0xf6381fb0, 0x7745ae04, 0xd736fccc,
 204        0x83426b33, 0xf01eab71, 0xb0804187, 0x3c005e5f,
 205        0x77a057be, 0xbde8ae24, 0x55464299, 0xbf582e61,
 206        0x4e58f48f, 0xf2ddfda2, 0xf474ef38, 0x8789bdc2,
 207        0x5366f9c3, 0xc8b38e74, 0xb475f255, 0x46fcd9b9,
 208        0x7aeb2661, 0x8b1ddf84, 0x846a0e79, 0x915f95e2,
 209        0x466e598e, 0x20b45770, 0x8cd55591, 0xc902de4c,
 210        0xb90bace1, 0xbb8205d0, 0x11a86248, 0x7574a99e,
 211        0xb77f19b6, 0xe0a9dc09, 0x662d09a1, 0xc4324633,
 212        0xe85a1f02, 0x09f0be8c, 0x4a99a025, 0x1d6efe10,
 213        0x1ab93d1d, 0x0ba5a4df, 0xa186f20f, 0x2868f169,
 214        0xdcb7da83, 0x573906fe, 0xa1e2ce9b, 0x4fcd7f52,
 215        0x50115e01, 0xa70683fa, 0xa002b5c4, 0x0de6d027,
 216        0x9af88c27, 0x773f8641, 0xc3604c06, 0x61a806b5,
 217        0xf0177a28, 0xc0f586e0, 0x006058aa, 0x30dc7d62,
 218        0x11e69ed7, 0x2338ea63, 0x53c2dd94, 0xc2c21634,
 219        0xbbcbee56, 0x90bcb6de, 0xebfc7da1, 0xce591d76,
 220        0x6f05e409, 0x4b7c0188, 0x39720a3d, 0x7c927c24,
 221        0x86e3725f, 0x724d9db9, 0x1ac15bb4, 0xd39eb8fc,
 222        0xed545578, 0x08fca5b5, 0xd83d7cd3, 0x4dad0fc4,
 223        0x1e50ef5e, 0xb161e6f8, 0xa28514d9, 0x6c51133c,
 224        0x6fd5c7e7, 0x56e14ec4, 0x362abfce, 0xddc6c837,
 225        0xd79a3234, 0x92638212, 0x670efa8e, 0x406000e0,
 226        0x3a39ce37, 0xd3faf5cf, 0xabc27737, 0x5ac52d1b,
 227        0x5cb0679e, 0x4fa33742, 0xd3822740, 0x99bc9bbe,
 228        0xd5118e9d, 0xbf0f7315, 0xd62d1c7e, 0xc700c47b,
 229        0xb78c1b6b, 0x21a19045, 0xb26eb1be, 0x6a366eb4,
 230        0x5748ab2f, 0xbc946e79, 0xc6a376d2, 0x6549c2c8,
 231        0x530ff8ee, 0x468dde7d, 0xd5730a1d, 0x4cd04dc6,
 232        0x2939bbdb, 0xa9ba4650, 0xac9526e8, 0xbe5ee304,
 233        0xa1fad5f0, 0x6a2d519a, 0x63ef8ce2, 0x9a86ee22,
 234        0xc089c2b8, 0x43242ef6, 0xa51e03aa, 0x9cf2d0a4,
 235        0x83c061ba, 0x9be96a4d, 0x8fe51550, 0xba645bd6,
 236        0x2826a2f9, 0xa73a3ae1, 0x4ba99586, 0xef5562e9,
 237        0xc72fefd3, 0xf752f7da, 0x3f046f69, 0x77fa0a59,
 238        0x80e4a915, 0x87b08601, 0x9b09e6ad, 0x3b3ee593,
 239        0xe990fd5a, 0x9e34d797, 0x2cf0b7d9, 0x022b8b51,
 240        0x96d5ac3a, 0x017da67d, 0xd1cf3ed6, 0x7c7d2d28,
 241        0x1f9f25cf, 0xadf2b89b, 0x5ad6b472, 0x5a88f54c,
 242        0xe029ac71, 0xe019a5e6, 0x47b0acfd, 0xed93fa9b,
 243        0xe8d3c48d, 0x283b57cc, 0xf8d56629, 0x79132e28,
 244        0x785f0191, 0xed756055, 0xf7960e44, 0xe3d35e8c,
 245        0x15056dd4, 0x88f46dba, 0x03a16125, 0x0564f0bd,
 246        0xc3eb9e15, 0x3c9057a2, 0x97271aec, 0xa93a072a,
 247        0x1b3f6d9b, 0x1e6321f5, 0xf59c66fb, 0x26dcf319,
 248        0x7533d928, 0xb155fdf5, 0x03563482, 0x8aba3cbb,
 249        0x28517711, 0xc20ad9f8, 0xabcc5167, 0xccad925f,
 250        0x4de81751, 0x3830dc8e, 0x379d5862, 0x9320f991,
 251        0xea7a90c2, 0xfb3e7bce, 0x5121ce64, 0x774fbe32,
 252        0xa8b6e37e, 0xc3293d46, 0x48de5369, 0x6413e680,
 253        0xa2ae0810, 0xdd6db224, 0x69852dfd, 0x09072166,
 254        0xb39a460a, 0x6445c0dd, 0x586cdecf, 0x1c20c8ae,
 255        0x5bbef7dd, 0x1b588d40, 0xccd2017f, 0x6bb4e3bb,
 256        0xdda26a7e, 0x3a59ff45, 0x3e350a44, 0xbcb4cdd5,
 257        0x72eacea8, 0xfa6484bb, 0x8d6612ae, 0xbf3c6f47,
 258        0xd29be463, 0x542f5d9e, 0xaec2771b, 0xf64e6370,
 259        0x740e0d8d, 0xe75b1357, 0xf8721671, 0xaf537d5d,
 260        0x4040cb08, 0x4eb4e2cc, 0x34d2466a, 0x0115af84,
 261        0xe1b00428, 0x95983a1d, 0x06b89fb4, 0xce6ea048,
 262        0x6f3f3b82, 0x3520ab82, 0x011a1d4b, 0x277227f8,
 263        0x611560b1, 0xe7933fdc, 0xbb3a792b, 0x344525bd,
 264        0xa08839e1, 0x51ce794b, 0x2f32c9b7, 0xa01fbac9,
 265        0xe01cc87e, 0xbcc7d1f6, 0xcf0111c3, 0xa1e8aac7,
 266        0x1a908749, 0xd44fbd9a, 0xd0dadecb, 0xd50ada38,
 267        0x0339c32a, 0xc6913667, 0x8df9317c, 0xe0b12b4f,
 268        0xf79e59b7, 0x43f5bb3a, 0xf2d519ff, 0x27d9459c,
 269        0xbf97222c, 0x15e6fc2a, 0x0f91fc71, 0x9b941525,
 270        0xfae59361, 0xceb69ceb, 0xc2a86459, 0x12baa8d1,
 271        0xb6c1075e, 0xe3056a0c, 0x10d25065, 0xcb03a442,
 272        0xe0ec6e0e, 0x1698db3b, 0x4c98a0be, 0x3278e964,
 273        0x9f1f9532, 0xe0d392df, 0xd3a0342b, 0x8971f21e,
 274        0x1b0a7441, 0x4ba3348c, 0xc5be7120, 0xc37632d8,
 275        0xdf359f8d, 0x9b992f2e, 0xe60b6f47, 0x0fe3f11d,
 276        0xe54cda54, 0x1edad891, 0xce6279cf, 0xcd3e7e6f,
 277        0x1618b166, 0xfd2c1d05, 0x848fd2c5, 0xf6fb2299,
 278        0xf523f357, 0xa6327623, 0x93a83531, 0x56cccd02,
 279        0xacf08162, 0x5a75ebb5, 0x6e163697, 0x88d273cc,
 280        0xde966292, 0x81b949d0, 0x4c50901b, 0x71c65614,
 281        0xe6c6c7bd, 0x327a140a, 0x45e1d006, 0xc3f27b9a,
 282        0xc9aa53fd, 0x62a80f00, 0xbb25bfe2, 0x35bdd2f6,
 283        0x71126905, 0xb2040222, 0xb6cbcf7c, 0xcd769c2b,
 284        0x53113ec0, 0x1640e3d3, 0x38abbd60, 0x2547adf0,
 285        0xba38209c, 0xf746ce76, 0x77afa1c5, 0x20756060,
 286        0x85cbfe4e, 0x8ae88dd8, 0x7aaaf9b0, 0x4cf9aa7e,
 287        0x1948c25c, 0x02fb8a8c, 0x01c36ae4, 0xd6ebe1f9,
 288        0x90d4f869, 0xa65cdea0, 0x3f09252d, 0xc208e69f,
 289        0xb74e6132, 0xce77e25b, 0x578fdfe3, 0x3ac372e6,
 290};
 291
 292/*
 293 * Round loop unrolling macros, S is a pointer to a S-Box array
 294 * organized in 4 unsigned longs at a row.
 295 */
 296#define GET32_3(x) (((x) & 0xff))
 297#define GET32_2(x) (((x) >> (8)) & (0xff))
 298#define GET32_1(x) (((x) >> (16)) & (0xff))
 299#define GET32_0(x) (((x) >> (24)) & (0xff))
 300
 301#define bf_F(x) (((S[GET32_0(x)] + S[256 + GET32_1(x)]) ^ \
 302                S[512 + GET32_2(x)]) + S[768 + GET32_3(x)])
 303
 304#define ROUND(a, b, n) ({ b ^= P[n]; a ^= bf_F(b); })
 305
 306/*
 307 * The blowfish encipher, processes 64-bit blocks.
 308 * NOTE: This function MUSTN'T respect endianess
 309 */
 310static void encrypt_block(struct bf_ctx *bctx, u32 *dst, u32 *src)
 311{
 312        const u32 *P = bctx->p;
 313        const u32 *S = bctx->s;
 314        u32 yl = src[0];
 315        u32 yr = src[1];
 316
 317        ROUND(yr, yl, 0);
 318        ROUND(yl, yr, 1);
 319        ROUND(yr, yl, 2);
 320        ROUND(yl, yr, 3);
 321        ROUND(yr, yl, 4);
 322        ROUND(yl, yr, 5);
 323        ROUND(yr, yl, 6);
 324        ROUND(yl, yr, 7);
 325        ROUND(yr, yl, 8);
 326        ROUND(yl, yr, 9);
 327        ROUND(yr, yl, 10);
 328        ROUND(yl, yr, 11);
 329        ROUND(yr, yl, 12);
 330        ROUND(yl, yr, 13);
 331        ROUND(yr, yl, 14);
 332        ROUND(yl, yr, 15);
 333
 334        yl ^= P[16];
 335        yr ^= P[17];
 336
 337        dst[0] = yr;
 338        dst[1] = yl;
 339}
 340
 341/*
 342 * Calculates the blowfish S and P boxes for encryption and decryption.
 343 */
 344int blowfish_setkey(struct crypto_tfm *tfm, const u8 *key, unsigned int keylen)
 345{
 346        struct bf_ctx *ctx = crypto_tfm_ctx(tfm);
 347        u32 *P = ctx->p;
 348        u32 *S = ctx->s;
 349        short i, j, count;
 350        u32 data[2], temp;
 351
 352        /* Copy the initialization s-boxes */
 353        for (i = 0, count = 0; i < 256; i++)
 354                for (j = 0; j < 4; j++, count++)
 355                        S[count] = bf_sbox[count];
 356
 357        /* Set the p-boxes */
 358        for (i = 0; i < 16 + 2; i++)
 359                P[i] = bf_pbox[i];
 360
 361        /* Actual subkey generation */
 362        for (j = 0, i = 0; i < 16 + 2; i++) {
 363                temp = (((u32)key[j] << 24) |
 364                        ((u32)key[(j + 1) % keylen] << 16) |
 365                        ((u32)key[(j + 2) % keylen] << 8) |
 366                        ((u32)key[(j + 3) % keylen]));
 367
 368                P[i] = P[i] ^ temp;
 369                j = (j + 4) % keylen;
 370        }
 371
 372        data[0] = 0x00000000;
 373        data[1] = 0x00000000;
 374
 375        for (i = 0; i < 16 + 2; i += 2) {
 376                encrypt_block((struct bf_ctx *)ctx, data, data);
 377
 378                P[i] = data[0];
 379                P[i + 1] = data[1];
 380        }
 381
 382        for (i = 0; i < 4; i++) {
 383                for (j = 0, count = i * 256; j < 256; j += 2, count += 2) {
 384                        encrypt_block((struct bf_ctx *)ctx, data, data);
 385
 386                        S[count] = data[0];
 387                        S[count + 1] = data[1];
 388                }
 389        }
 390
 391        /* Bruce says not to bother with the weak key check. */
 392        return 0;
 393}
 394EXPORT_SYMBOL_GPL(blowfish_setkey);
 395
 396MODULE_LICENSE("GPL");
 397MODULE_DESCRIPTION("Blowfish Cipher common functions");
 398