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