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