linux/crypto/cast5_generic.c
<<
>>
Prefs
   1/* Kernel cryptographic api.
   2* cast5.c - Cast5 cipher algorithm (rfc2144).
   3*
   4* Derived from GnuPG implementation of cast5.
   5*
   6* Major Changes.
   7*       Complete conformance to rfc2144.
   8*       Supports key size from 40 to 128 bits.
   9*
  10* Copyright (C) 1998, 1999, 2000, 2001 Free Software Foundation, Inc.
  11* Copyright (C) 2003 Kartikey Mahendra Bhatt <kartik_me@hotmail.com>.
  12*
  13* This program is free software; you can redistribute it and/or modify it
  14* under the terms of GNU General Public License as published by the Free
  15* Software Foundation; either version 2 of the License, or (at your option)
  16* any later version.
  17*
  18* You should have received a copy of the GNU General Public License
  19* along with this program; if not, write to the Free Software
  20* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA
  21*/
  22
  23
  24#include <asm/byteorder.h>
  25#include <linux/init.h>
  26#include <linux/crypto.h>
  27#include <linux/module.h>
  28#include <linux/errno.h>
  29#include <linux/string.h>
  30#include <linux/types.h>
  31#include <crypto/cast5.h>
  32
  33static const u32 s5[256] = {
  34        0x7ec90c04, 0x2c6e74b9, 0x9b0e66df, 0xa6337911, 0xb86a7fff,
  35        0x1dd358f5, 0x44dd9d44, 0x1731167f,
  36        0x08fbf1fa, 0xe7f511cc, 0xd2051b00, 0x735aba00, 0x2ab722d8,
  37        0x386381cb, 0xacf6243a, 0x69befd7a,
  38        0xe6a2e77f, 0xf0c720cd, 0xc4494816, 0xccf5c180, 0x38851640,
  39        0x15b0a848, 0xe68b18cb, 0x4caadeff,
  40        0x5f480a01, 0x0412b2aa, 0x259814fc, 0x41d0efe2, 0x4e40b48d,
  41        0x248eb6fb, 0x8dba1cfe, 0x41a99b02,
  42        0x1a550a04, 0xba8f65cb, 0x7251f4e7, 0x95a51725, 0xc106ecd7,
  43        0x97a5980a, 0xc539b9aa, 0x4d79fe6a,
  44        0xf2f3f763, 0x68af8040, 0xed0c9e56, 0x11b4958b, 0xe1eb5a88,
  45        0x8709e6b0, 0xd7e07156, 0x4e29fea7,
  46        0x6366e52d, 0x02d1c000, 0xc4ac8e05, 0x9377f571, 0x0c05372a,
  47        0x578535f2, 0x2261be02, 0xd642a0c9,
  48        0xdf13a280, 0x74b55bd2, 0x682199c0, 0xd421e5ec, 0x53fb3ce8,
  49        0xc8adedb3, 0x28a87fc9, 0x3d959981,
  50        0x5c1ff900, 0xfe38d399, 0x0c4eff0b, 0x062407ea, 0xaa2f4fb1,
  51        0x4fb96976, 0x90c79505, 0xb0a8a774,
  52        0xef55a1ff, 0xe59ca2c2, 0xa6b62d27, 0xe66a4263, 0xdf65001f,
  53        0x0ec50966, 0xdfdd55bc, 0x29de0655,
  54        0x911e739a, 0x17af8975, 0x32c7911c, 0x89f89468, 0x0d01e980,
  55        0x524755f4, 0x03b63cc9, 0x0cc844b2,
  56        0xbcf3f0aa, 0x87ac36e9, 0xe53a7426, 0x01b3d82b, 0x1a9e7449,
  57        0x64ee2d7e, 0xcddbb1da, 0x01c94910,
  58        0xb868bf80, 0x0d26f3fd, 0x9342ede7, 0x04a5c284, 0x636737b6,
  59        0x50f5b616, 0xf24766e3, 0x8eca36c1,
  60        0x136e05db, 0xfef18391, 0xfb887a37, 0xd6e7f7d4, 0xc7fb7dc9,
  61        0x3063fcdf, 0xb6f589de, 0xec2941da,
  62        0x26e46695, 0xb7566419, 0xf654efc5, 0xd08d58b7, 0x48925401,
  63        0xc1bacb7f, 0xe5ff550f, 0xb6083049,
  64        0x5bb5d0e8, 0x87d72e5a, 0xab6a6ee1, 0x223a66ce, 0xc62bf3cd,
  65        0x9e0885f9, 0x68cb3e47, 0x086c010f,
  66        0xa21de820, 0xd18b69de, 0xf3f65777, 0xfa02c3f6, 0x407edac3,
  67        0xcbb3d550, 0x1793084d, 0xb0d70eba,
  68        0x0ab378d5, 0xd951fb0c, 0xded7da56, 0x4124bbe4, 0x94ca0b56,
  69        0x0f5755d1, 0xe0e1e56e, 0x6184b5be,
  70        0x580a249f, 0x94f74bc0, 0xe327888e, 0x9f7b5561, 0xc3dc0280,
  71        0x05687715, 0x646c6bd7, 0x44904db3,
  72        0x66b4f0a3, 0xc0f1648a, 0x697ed5af, 0x49e92ff6, 0x309e374f,
  73        0x2cb6356a, 0x85808573, 0x4991f840,
  74        0x76f0ae02, 0x083be84d, 0x28421c9a, 0x44489406, 0x736e4cb8,
  75        0xc1092910, 0x8bc95fc6, 0x7d869cf4,
  76        0x134f616f, 0x2e77118d, 0xb31b2be1, 0xaa90b472, 0x3ca5d717,
  77        0x7d161bba, 0x9cad9010, 0xaf462ba2,
  78        0x9fe459d2, 0x45d34559, 0xd9f2da13, 0xdbc65487, 0xf3e4f94e,
  79        0x176d486f, 0x097c13ea, 0x631da5c7,
  80        0x445f7382, 0x175683f4, 0xcdc66a97, 0x70be0288, 0xb3cdcf72,
  81        0x6e5dd2f3, 0x20936079, 0x459b80a5,
  82        0xbe60e2db, 0xa9c23101, 0xeba5315c, 0x224e42f2, 0x1c5c1572,
  83        0xf6721b2c, 0x1ad2fff3, 0x8c25404e,
  84        0x324ed72f, 0x4067b7fd, 0x0523138e, 0x5ca3bc78, 0xdc0fd66e,
  85        0x75922283, 0x784d6b17, 0x58ebb16e,
  86        0x44094f85, 0x3f481d87, 0xfcfeae7b, 0x77b5ff76, 0x8c2302bf,
  87        0xaaf47556, 0x5f46b02a, 0x2b092801,
  88        0x3d38f5f7, 0x0ca81f36, 0x52af4a8a, 0x66d5e7c0, 0xdf3b0874,
  89        0x95055110, 0x1b5ad7a8, 0xf61ed5ad,
  90        0x6cf6e479, 0x20758184, 0xd0cefa65, 0x88f7be58, 0x4a046826,
  91        0x0ff6f8f3, 0xa09c7f70, 0x5346aba0,
  92        0x5ce96c28, 0xe176eda3, 0x6bac307f, 0x376829d2, 0x85360fa9,
  93        0x17e3fe2a, 0x24b79767, 0xf5a96b20,
  94        0xd6cd2595, 0x68ff1ebf, 0x7555442c, 0xf19f06be, 0xf9e0659a,
  95        0xeeb9491d, 0x34010718, 0xbb30cab8,
  96        0xe822fe15, 0x88570983, 0x750e6249, 0xda627e55, 0x5e76ffa8,
  97        0xb1534546, 0x6d47de08, 0xefe9e7d4
  98};
  99static const u32 s6[256] = {
 100        0xf6fa8f9d, 0x2cac6ce1, 0x4ca34867, 0xe2337f7c, 0x95db08e7,
 101        0x016843b4, 0xeced5cbc, 0x325553ac,
 102        0xbf9f0960, 0xdfa1e2ed, 0x83f0579d, 0x63ed86b9, 0x1ab6a6b8,
 103        0xde5ebe39, 0xf38ff732, 0x8989b138,
 104        0x33f14961, 0xc01937bd, 0xf506c6da, 0xe4625e7e, 0xa308ea99,
 105        0x4e23e33c, 0x79cbd7cc, 0x48a14367,
 106        0xa3149619, 0xfec94bd5, 0xa114174a, 0xeaa01866, 0xa084db2d,
 107        0x09a8486f, 0xa888614a, 0x2900af98,
 108        0x01665991, 0xe1992863, 0xc8f30c60, 0x2e78ef3c, 0xd0d51932,
 109        0xcf0fec14, 0xf7ca07d2, 0xd0a82072,
 110        0xfd41197e, 0x9305a6b0, 0xe86be3da, 0x74bed3cd, 0x372da53c,
 111        0x4c7f4448, 0xdab5d440, 0x6dba0ec3,
 112        0x083919a7, 0x9fbaeed9, 0x49dbcfb0, 0x4e670c53, 0x5c3d9c01,
 113        0x64bdb941, 0x2c0e636a, 0xba7dd9cd,
 114        0xea6f7388, 0xe70bc762, 0x35f29adb, 0x5c4cdd8d, 0xf0d48d8c,
 115        0xb88153e2, 0x08a19866, 0x1ae2eac8,
 116        0x284caf89, 0xaa928223, 0x9334be53, 0x3b3a21bf, 0x16434be3,
 117        0x9aea3906, 0xefe8c36e, 0xf890cdd9,
 118        0x80226dae, 0xc340a4a3, 0xdf7e9c09, 0xa694a807, 0x5b7c5ecc,
 119        0x221db3a6, 0x9a69a02f, 0x68818a54,
 120        0xceb2296f, 0x53c0843a, 0xfe893655, 0x25bfe68a, 0xb4628abc,
 121        0xcf222ebf, 0x25ac6f48, 0xa9a99387,
 122        0x53bddb65, 0xe76ffbe7, 0xe967fd78, 0x0ba93563, 0x8e342bc1,
 123        0xe8a11be9, 0x4980740d, 0xc8087dfc,
 124        0x8de4bf99, 0xa11101a0, 0x7fd37975, 0xda5a26c0, 0xe81f994f,
 125        0x9528cd89, 0xfd339fed, 0xb87834bf,
 126        0x5f04456d, 0x22258698, 0xc9c4c83b, 0x2dc156be, 0x4f628daa,
 127        0x57f55ec5, 0xe2220abe, 0xd2916ebf,
 128        0x4ec75b95, 0x24f2c3c0, 0x42d15d99, 0xcd0d7fa0, 0x7b6e27ff,
 129        0xa8dc8af0, 0x7345c106, 0xf41e232f,
 130        0x35162386, 0xe6ea8926, 0x3333b094, 0x157ec6f2, 0x372b74af,
 131        0x692573e4, 0xe9a9d848, 0xf3160289,
 132        0x3a62ef1d, 0xa787e238, 0xf3a5f676, 0x74364853, 0x20951063,
 133        0x4576698d, 0xb6fad407, 0x592af950,
 134        0x36f73523, 0x4cfb6e87, 0x7da4cec0, 0x6c152daa, 0xcb0396a8,
 135        0xc50dfe5d, 0xfcd707ab, 0x0921c42f,
 136        0x89dff0bb, 0x5fe2be78, 0x448f4f33, 0x754613c9, 0x2b05d08d,
 137        0x48b9d585, 0xdc049441, 0xc8098f9b,
 138        0x7dede786, 0xc39a3373, 0x42410005, 0x6a091751, 0x0ef3c8a6,
 139        0x890072d6, 0x28207682, 0xa9a9f7be,
 140        0xbf32679d, 0xd45b5b75, 0xb353fd00, 0xcbb0e358, 0x830f220a,
 141        0x1f8fb214, 0xd372cf08, 0xcc3c4a13,
 142        0x8cf63166, 0x061c87be, 0x88c98f88, 0x6062e397, 0x47cf8e7a,
 143        0xb6c85283, 0x3cc2acfb, 0x3fc06976,
 144        0x4e8f0252, 0x64d8314d, 0xda3870e3, 0x1e665459, 0xc10908f0,
 145        0x513021a5, 0x6c5b68b7, 0x822f8aa0,
 146        0x3007cd3e, 0x74719eef, 0xdc872681, 0x073340d4, 0x7e432fd9,
 147        0x0c5ec241, 0x8809286c, 0xf592d891,
 148        0x08a930f6, 0x957ef305, 0xb7fbffbd, 0xc266e96f, 0x6fe4ac98,
 149        0xb173ecc0, 0xbc60b42a, 0x953498da,
 150        0xfba1ae12, 0x2d4bd736, 0x0f25faab, 0xa4f3fceb, 0xe2969123,
 151        0x257f0c3d, 0x9348af49, 0x361400bc,
 152        0xe8816f4a, 0x3814f200, 0xa3f94043, 0x9c7a54c2, 0xbc704f57,
 153        0xda41e7f9, 0xc25ad33a, 0x54f4a084,
 154        0xb17f5505, 0x59357cbe, 0xedbd15c8, 0x7f97c5ab, 0xba5ac7b5,
 155        0xb6f6deaf, 0x3a479c3a, 0x5302da25,
 156        0x653d7e6a, 0x54268d49, 0x51a477ea, 0x5017d55b, 0xd7d25d88,
 157        0x44136c76, 0x0404a8c8, 0xb8e5a121,
 158        0xb81a928a, 0x60ed5869, 0x97c55b96, 0xeaec991b, 0x29935913,
 159        0x01fdb7f1, 0x088e8dfa, 0x9ab6f6f5,
 160        0x3b4cbf9f, 0x4a5de3ab, 0xe6051d35, 0xa0e1d855, 0xd36b4cf1,
 161        0xf544edeb, 0xb0e93524, 0xbebb8fbd,
 162        0xa2d762cf, 0x49c92f54, 0x38b5f331, 0x7128a454, 0x48392905,
 163        0xa65b1db8, 0x851c97bd, 0xd675cf2f
 164};
 165static const u32 s7[256] = {
 166        0x85e04019, 0x332bf567, 0x662dbfff, 0xcfc65693, 0x2a8d7f6f,
 167        0xab9bc912, 0xde6008a1, 0x2028da1f,
 168        0x0227bce7, 0x4d642916, 0x18fac300, 0x50f18b82, 0x2cb2cb11,
 169        0xb232e75c, 0x4b3695f2, 0xb28707de,
 170        0xa05fbcf6, 0xcd4181e9, 0xe150210c, 0xe24ef1bd, 0xb168c381,
 171        0xfde4e789, 0x5c79b0d8, 0x1e8bfd43,
 172        0x4d495001, 0x38be4341, 0x913cee1d, 0x92a79c3f, 0x089766be,
 173        0xbaeeadf4, 0x1286becf, 0xb6eacb19,
 174        0x2660c200, 0x7565bde4, 0x64241f7a, 0x8248dca9, 0xc3b3ad66,
 175        0x28136086, 0x0bd8dfa8, 0x356d1cf2,
 176        0x107789be, 0xb3b2e9ce, 0x0502aa8f, 0x0bc0351e, 0x166bf52a,
 177        0xeb12ff82, 0xe3486911, 0xd34d7516,
 178        0x4e7b3aff, 0x5f43671b, 0x9cf6e037, 0x4981ac83, 0x334266ce,
 179        0x8c9341b7, 0xd0d854c0, 0xcb3a6c88,
 180        0x47bc2829, 0x4725ba37, 0xa66ad22b, 0x7ad61f1e, 0x0c5cbafa,
 181        0x4437f107, 0xb6e79962, 0x42d2d816,
 182        0x0a961288, 0xe1a5c06e, 0x13749e67, 0x72fc081a, 0xb1d139f7,
 183        0xf9583745, 0xcf19df58, 0xbec3f756,
 184        0xc06eba30, 0x07211b24, 0x45c28829, 0xc95e317f, 0xbc8ec511,
 185        0x38bc46e9, 0xc6e6fa14, 0xbae8584a,
 186        0xad4ebc46, 0x468f508b, 0x7829435f, 0xf124183b, 0x821dba9f,
 187        0xaff60ff4, 0xea2c4e6d, 0x16e39264,
 188        0x92544a8b, 0x009b4fc3, 0xaba68ced, 0x9ac96f78, 0x06a5b79a,
 189        0xb2856e6e, 0x1aec3ca9, 0xbe838688,
 190        0x0e0804e9, 0x55f1be56, 0xe7e5363b, 0xb3a1f25d, 0xf7debb85,
 191        0x61fe033c, 0x16746233, 0x3c034c28,
 192        0xda6d0c74, 0x79aac56c, 0x3ce4e1ad, 0x51f0c802, 0x98f8f35a,
 193        0x1626a49f, 0xeed82b29, 0x1d382fe3,
 194        0x0c4fb99a, 0xbb325778, 0x3ec6d97b, 0x6e77a6a9, 0xcb658b5c,
 195        0xd45230c7, 0x2bd1408b, 0x60c03eb7,
 196        0xb9068d78, 0xa33754f4, 0xf430c87d, 0xc8a71302, 0xb96d8c32,
 197        0xebd4e7be, 0xbe8b9d2d, 0x7979fb06,
 198        0xe7225308, 0x8b75cf77, 0x11ef8da4, 0xe083c858, 0x8d6b786f,
 199        0x5a6317a6, 0xfa5cf7a0, 0x5dda0033,
 200        0xf28ebfb0, 0xf5b9c310, 0xa0eac280, 0x08b9767a, 0xa3d9d2b0,
 201        0x79d34217, 0x021a718d, 0x9ac6336a,
 202        0x2711fd60, 0x438050e3, 0x069908a8, 0x3d7fedc4, 0x826d2bef,
 203        0x4eeb8476, 0x488dcf25, 0x36c9d566,
 204        0x28e74e41, 0xc2610aca, 0x3d49a9cf, 0xbae3b9df, 0xb65f8de6,
 205        0x92aeaf64, 0x3ac7d5e6, 0x9ea80509,
 206        0xf22b017d, 0xa4173f70, 0xdd1e16c3, 0x15e0d7f9, 0x50b1b887,
 207        0x2b9f4fd5, 0x625aba82, 0x6a017962,
 208        0x2ec01b9c, 0x15488aa9, 0xd716e740, 0x40055a2c, 0x93d29a22,
 209        0xe32dbf9a, 0x058745b9, 0x3453dc1e,
 210        0xd699296e, 0x496cff6f, 0x1c9f4986, 0xdfe2ed07, 0xb87242d1,
 211        0x19de7eae, 0x053e561a, 0x15ad6f8c,
 212        0x66626c1c, 0x7154c24c, 0xea082b2a, 0x93eb2939, 0x17dcb0f0,
 213        0x58d4f2ae, 0x9ea294fb, 0x52cf564c,
 214        0x9883fe66, 0x2ec40581, 0x763953c3, 0x01d6692e, 0xd3a0c108,
 215        0xa1e7160e, 0xe4f2dfa6, 0x693ed285,
 216        0x74904698, 0x4c2b0edd, 0x4f757656, 0x5d393378, 0xa132234f,
 217        0x3d321c5d, 0xc3f5e194, 0x4b269301,
 218        0xc79f022f, 0x3c997e7e, 0x5e4f9504, 0x3ffafbbd, 0x76f7ad0e,
 219        0x296693f4, 0x3d1fce6f, 0xc61e45be,
 220        0xd3b5ab34, 0xf72bf9b7, 0x1b0434c0, 0x4e72b567, 0x5592a33d,
 221        0xb5229301, 0xcfd2a87f, 0x60aeb767,
 222        0x1814386b, 0x30bcc33d, 0x38a0c07d, 0xfd1606f2, 0xc363519b,
 223        0x589dd390, 0x5479f8e6, 0x1cb8d647,
 224        0x97fd61a9, 0xea7759f4, 0x2d57539d, 0x569a58cf, 0xe84e63ad,
 225        0x462e1b78, 0x6580f87e, 0xf3817914,
 226        0x91da55f4, 0x40a230f3, 0xd1988f35, 0xb6e318d2, 0x3ffa50bc,
 227        0x3d40f021, 0xc3c0bdae, 0x4958c24c,
 228        0x518f36b2, 0x84b1d370, 0x0fedce83, 0x878ddada, 0xf2a279c7,
 229        0x94e01be8, 0x90716f4b, 0x954b8aa3
 230};
 231static const u32 sb8[256] = {
 232        0xe216300d, 0xbbddfffc, 0xa7ebdabd, 0x35648095, 0x7789f8b7,
 233        0xe6c1121b, 0x0e241600, 0x052ce8b5,
 234        0x11a9cfb0, 0xe5952f11, 0xece7990a, 0x9386d174, 0x2a42931c,
 235        0x76e38111, 0xb12def3a, 0x37ddddfc,
 236        0xde9adeb1, 0x0a0cc32c, 0xbe197029, 0x84a00940, 0xbb243a0f,
 237        0xb4d137cf, 0xb44e79f0, 0x049eedfd,
 238        0x0b15a15d, 0x480d3168, 0x8bbbde5a, 0x669ded42, 0xc7ece831,
 239        0x3f8f95e7, 0x72df191b, 0x7580330d,
 240        0x94074251, 0x5c7dcdfa, 0xabbe6d63, 0xaa402164, 0xb301d40a,
 241        0x02e7d1ca, 0x53571dae, 0x7a3182a2,
 242        0x12a8ddec, 0xfdaa335d, 0x176f43e8, 0x71fb46d4, 0x38129022,
 243        0xce949ad4, 0xb84769ad, 0x965bd862,
 244        0x82f3d055, 0x66fb9767, 0x15b80b4e, 0x1d5b47a0, 0x4cfde06f,
 245        0xc28ec4b8, 0x57e8726e, 0x647a78fc,
 246        0x99865d44, 0x608bd593, 0x6c200e03, 0x39dc5ff6, 0x5d0b00a3,
 247        0xae63aff2, 0x7e8bd632, 0x70108c0c,
 248        0xbbd35049, 0x2998df04, 0x980cf42a, 0x9b6df491, 0x9e7edd53,
 249        0x06918548, 0x58cb7e07, 0x3b74ef2e,
 250        0x522fffb1, 0xd24708cc, 0x1c7e27cd, 0xa4eb215b, 0x3cf1d2e2,
 251        0x19b47a38, 0x424f7618, 0x35856039,
 252        0x9d17dee7, 0x27eb35e6, 0xc9aff67b, 0x36baf5b8, 0x09c467cd,
 253        0xc18910b1, 0xe11dbf7b, 0x06cd1af8,
 254        0x7170c608, 0x2d5e3354, 0xd4de495a, 0x64c6d006, 0xbcc0c62c,
 255        0x3dd00db3, 0x708f8f34, 0x77d51b42,
 256        0x264f620f, 0x24b8d2bf, 0x15c1b79e, 0x46a52564, 0xf8d7e54e,
 257        0x3e378160, 0x7895cda5, 0x859c15a5,
 258        0xe6459788, 0xc37bc75f, 0xdb07ba0c, 0x0676a3ab, 0x7f229b1e,
 259        0x31842e7b, 0x24259fd7, 0xf8bef472,
 260        0x835ffcb8, 0x6df4c1f2, 0x96f5b195, 0xfd0af0fc, 0xb0fe134c,
 261        0xe2506d3d, 0x4f9b12ea, 0xf215f225,
 262        0xa223736f, 0x9fb4c428, 0x25d04979, 0x34c713f8, 0xc4618187,
 263        0xea7a6e98, 0x7cd16efc, 0x1436876c,
 264        0xf1544107, 0xbedeee14, 0x56e9af27, 0xa04aa441, 0x3cf7c899,
 265        0x92ecbae6, 0xdd67016d, 0x151682eb,
 266        0xa842eedf, 0xfdba60b4, 0xf1907b75, 0x20e3030f, 0x24d8c29e,
 267        0xe139673b, 0xefa63fb8, 0x71873054,
 268        0xb6f2cf3b, 0x9f326442, 0xcb15a4cc, 0xb01a4504, 0xf1e47d8d,
 269        0x844a1be5, 0xbae7dfdc, 0x42cbda70,
 270        0xcd7dae0a, 0x57e85b7a, 0xd53f5af6, 0x20cf4d8c, 0xcea4d428,
 271        0x79d130a4, 0x3486ebfb, 0x33d3cddc,
 272        0x77853b53, 0x37effcb5, 0xc5068778, 0xe580b3e6, 0x4e68b8f4,
 273        0xc5c8b37e, 0x0d809ea2, 0x398feb7c,
 274        0x132a4f94, 0x43b7950e, 0x2fee7d1c, 0x223613bd, 0xdd06caa2,
 275        0x37df932b, 0xc4248289, 0xacf3ebc3,
 276        0x5715f6b7, 0xef3478dd, 0xf267616f, 0xc148cbe4, 0x9052815e,
 277        0x5e410fab, 0xb48a2465, 0x2eda7fa4,
 278        0xe87b40e4, 0xe98ea084, 0x5889e9e1, 0xefd390fc, 0xdd07d35b,
 279        0xdb485694, 0x38d7e5b2, 0x57720101,
 280        0x730edebc, 0x5b643113, 0x94917e4f, 0x503c2fba, 0x646f1282,
 281        0x7523d24a, 0xe0779695, 0xf9c17a8f,
 282        0x7a5b2121, 0xd187b896, 0x29263a4d, 0xba510cdf, 0x81f47c9f,
 283        0xad1163ed, 0xea7b5965, 0x1a00726e,
 284        0x11403092, 0x00da6d77, 0x4a0cdd61, 0xad1f4603, 0x605bdfb0,
 285        0x9eedc364, 0x22ebe6a8, 0xcee7d28a,
 286        0xa0e736a0, 0x5564a6b9, 0x10853209, 0xc7eb8f37, 0x2de705ca,
 287        0x8951570f, 0xdf09822b, 0xbd691a6c,
 288        0xaa12e4f2, 0x87451c0f, 0xe0f6a27a, 0x3ada4819, 0x4cf1764f,
 289        0x0d771c2b, 0x67cdb156, 0x350d8384,
 290        0x5938fa0f, 0x42399ef3, 0x36997b07, 0x0e84093d, 0x4aa93e61,
 291        0x8360d87b, 0x1fa98b0c, 0x1149382c,
 292        0xe97625a5, 0x0614d1b7, 0x0e25244b, 0x0c768347, 0x589e8d82,
 293        0x0d2059d1, 0xa466bb1e, 0xf8da0a82,
 294        0x04f19130, 0xba6e4ec0, 0x99265164, 0x1ee7230d, 0x50b2ad80,
 295        0xeaee6801, 0x8db2a283, 0xea8bf59e
 296};
 297
 298#define s1 cast_s1
 299#define s2 cast_s2
 300#define s3 cast_s3
 301#define s4 cast_s4
 302
 303#define F1(D, m, r)  ((I = ((m) + (D))), (I = rol32(I, (r))),   \
 304        (((s1[I >> 24] ^ s2[(I>>16)&0xff]) - s3[(I>>8)&0xff]) + s4[I&0xff]))
 305#define F2(D, m, r)  ((I = ((m) ^ (D))), (I = rol32(I, (r))),   \
 306        (((s1[I >> 24] - s2[(I>>16)&0xff]) + s3[(I>>8)&0xff]) ^ s4[I&0xff]))
 307#define F3(D, m, r)  ((I = ((m) - (D))), (I = rol32(I, (r))),   \
 308        (((s1[I >> 24] + s2[(I>>16)&0xff]) ^ s3[(I>>8)&0xff]) - s4[I&0xff]))
 309
 310
 311void __cast5_encrypt(struct cast5_ctx *c, u8 *outbuf, const u8 *inbuf)
 312{
 313        const __be32 *src = (const __be32 *)inbuf;
 314        __be32 *dst = (__be32 *)outbuf;
 315        u32 l, r, t;
 316        u32 I;                  /* used by the Fx macros */
 317        u32 *Km;
 318        u8 *Kr;
 319
 320        Km = c->Km;
 321        Kr = c->Kr;
 322
 323        /* (L0,R0) <-- (m1...m64).  (Split the plaintext into left and
 324         * right 32-bit halves L0 = m1...m32 and R0 = m33...m64.)
 325         */
 326        l = be32_to_cpu(src[0]);
 327        r = be32_to_cpu(src[1]);
 328
 329        /* (16 rounds) for i from 1 to 16, compute Li and Ri as follows:
 330         *  Li = Ri-1;
 331         *  Ri = Li-1 ^ f(Ri-1,Kmi,Kri), where f is defined in Section 2.2
 332         * Rounds 1, 4, 7, 10, 13, and 16 use f function Type 1.
 333         * Rounds 2, 5, 8, 11, and 14 use f function Type 2.
 334         * Rounds 3, 6, 9, 12, and 15 use f function Type 3.
 335         */
 336
 337        t = l; l = r; r = t ^ F1(r, Km[0], Kr[0]);
 338        t = l; l = r; r = t ^ F2(r, Km[1], Kr[1]);
 339        t = l; l = r; r = t ^ F3(r, Km[2], Kr[2]);
 340        t = l; l = r; r = t ^ F1(r, Km[3], Kr[3]);
 341        t = l; l = r; r = t ^ F2(r, Km[4], Kr[4]);
 342        t = l; l = r; r = t ^ F3(r, Km[5], Kr[5]);
 343        t = l; l = r; r = t ^ F1(r, Km[6], Kr[6]);
 344        t = l; l = r; r = t ^ F2(r, Km[7], Kr[7]);
 345        t = l; l = r; r = t ^ F3(r, Km[8], Kr[8]);
 346        t = l; l = r; r = t ^ F1(r, Km[9], Kr[9]);
 347        t = l; l = r; r = t ^ F2(r, Km[10], Kr[10]);
 348        t = l; l = r; r = t ^ F3(r, Km[11], Kr[11]);
 349        if (!(c->rr)) {
 350                t = l; l = r; r = t ^ F1(r, Km[12], Kr[12]);
 351                t = l; l = r; r = t ^ F2(r, Km[13], Kr[13]);
 352                t = l; l = r; r = t ^ F3(r, Km[14], Kr[14]);
 353                t = l; l = r; r = t ^ F1(r, Km[15], Kr[15]);
 354        }
 355
 356        /* c1...c64 <-- (R16,L16).  (Exchange final blocks L16, R16 and
 357         *  concatenate to form the ciphertext.) */
 358        dst[0] = cpu_to_be32(r);
 359        dst[1] = cpu_to_be32(l);
 360}
 361EXPORT_SYMBOL_GPL(__cast5_encrypt);
 362
 363static void cast5_encrypt(struct crypto_tfm *tfm, u8 *outbuf, const u8 *inbuf)
 364{
 365        __cast5_encrypt(crypto_tfm_ctx(tfm), outbuf, inbuf);
 366}
 367
 368void __cast5_decrypt(struct cast5_ctx *c, u8 *outbuf, const u8 *inbuf)
 369{
 370        const __be32 *src = (const __be32 *)inbuf;
 371        __be32 *dst = (__be32 *)outbuf;
 372        u32 l, r, t;
 373        u32 I;
 374        u32 *Km;
 375        u8 *Kr;
 376
 377        Km = c->Km;
 378        Kr = c->Kr;
 379
 380        l = be32_to_cpu(src[0]);
 381        r = be32_to_cpu(src[1]);
 382
 383        if (!(c->rr)) {
 384                t = l; l = r; r = t ^ F1(r, Km[15], Kr[15]);
 385                t = l; l = r; r = t ^ F3(r, Km[14], Kr[14]);
 386                t = l; l = r; r = t ^ F2(r, Km[13], Kr[13]);
 387                t = l; l = r; r = t ^ F1(r, Km[12], Kr[12]);
 388        }
 389        t = l; l = r; r = t ^ F3(r, Km[11], Kr[11]);
 390        t = l; l = r; r = t ^ F2(r, Km[10], Kr[10]);
 391        t = l; l = r; r = t ^ F1(r, Km[9], Kr[9]);
 392        t = l; l = r; r = t ^ F3(r, Km[8], Kr[8]);
 393        t = l; l = r; r = t ^ F2(r, Km[7], Kr[7]);
 394        t = l; l = r; r = t ^ F1(r, Km[6], Kr[6]);
 395        t = l; l = r; r = t ^ F3(r, Km[5], Kr[5]);
 396        t = l; l = r; r = t ^ F2(r, Km[4], Kr[4]);
 397        t = l; l = r; r = t ^ F1(r, Km[3], Kr[3]);
 398        t = l; l = r; r = t ^ F3(r, Km[2], Kr[2]);
 399        t = l; l = r; r = t ^ F2(r, Km[1], Kr[1]);
 400        t = l; l = r; r = t ^ F1(r, Km[0], Kr[0]);
 401
 402        dst[0] = cpu_to_be32(r);
 403        dst[1] = cpu_to_be32(l);
 404}
 405EXPORT_SYMBOL_GPL(__cast5_decrypt);
 406
 407static void cast5_decrypt(struct crypto_tfm *tfm, u8 *outbuf, const u8 *inbuf)
 408{
 409        __cast5_decrypt(crypto_tfm_ctx(tfm), outbuf, inbuf);
 410}
 411
 412static void key_schedule(u32 *x, u32 *z, u32 *k)
 413{
 414
 415#define xi(i)   ((x[(i)/4] >> (8*(3-((i)%4)))) & 0xff)
 416#define zi(i)   ((z[(i)/4] >> (8*(3-((i)%4)))) & 0xff)
 417
 418        z[0] = x[0] ^ s5[xi(13)] ^ s6[xi(15)] ^ s7[xi(12)] ^ sb8[xi(14)] ^
 419            s7[xi(8)];
 420        z[1] = x[2] ^ s5[zi(0)] ^ s6[zi(2)] ^ s7[zi(1)] ^ sb8[zi(3)] ^
 421            sb8[xi(10)];
 422        z[2] = x[3] ^ s5[zi(7)] ^ s6[zi(6)] ^ s7[zi(5)] ^ sb8[zi(4)] ^
 423            s5[xi(9)];
 424        z[3] = x[1] ^ s5[zi(10)] ^ s6[zi(9)] ^ s7[zi(11)] ^ sb8[zi(8)] ^
 425            s6[xi(11)];
 426        k[0] = s5[zi(8)] ^ s6[zi(9)] ^ s7[zi(7)] ^ sb8[zi(6)] ^ s5[zi(2)];
 427        k[1] = s5[zi(10)] ^ s6[zi(11)] ^ s7[zi(5)] ^ sb8[zi(4)] ^
 428            s6[zi(6)];
 429        k[2] = s5[zi(12)] ^ s6[zi(13)] ^ s7[zi(3)] ^ sb8[zi(2)] ^
 430            s7[zi(9)];
 431        k[3] = s5[zi(14)] ^ s6[zi(15)] ^ s7[zi(1)] ^ sb8[zi(0)] ^
 432            sb8[zi(12)];
 433
 434        x[0] = z[2] ^ s5[zi(5)] ^ s6[zi(7)] ^ s7[zi(4)] ^ sb8[zi(6)] ^
 435            s7[zi(0)];
 436        x[1] = z[0] ^ s5[xi(0)] ^ s6[xi(2)] ^ s7[xi(1)] ^ sb8[xi(3)] ^
 437            sb8[zi(2)];
 438        x[2] = z[1] ^ s5[xi(7)] ^ s6[xi(6)] ^ s7[xi(5)] ^ sb8[xi(4)] ^
 439            s5[zi(1)];
 440        x[3] = z[3] ^ s5[xi(10)] ^ s6[xi(9)] ^ s7[xi(11)] ^ sb8[xi(8)] ^
 441            s6[zi(3)];
 442        k[4] = s5[xi(3)] ^ s6[xi(2)] ^ s7[xi(12)] ^ sb8[xi(13)] ^
 443            s5[xi(8)];
 444        k[5] = s5[xi(1)] ^ s6[xi(0)] ^ s7[xi(14)] ^ sb8[xi(15)] ^
 445            s6[xi(13)];
 446        k[6] = s5[xi(7)] ^ s6[xi(6)] ^ s7[xi(8)] ^ sb8[xi(9)] ^ s7[xi(3)];
 447        k[7] = s5[xi(5)] ^ s6[xi(4)] ^ s7[xi(10)] ^ sb8[xi(11)] ^
 448            sb8[xi(7)];
 449
 450        z[0] = x[0] ^ s5[xi(13)] ^ s6[xi(15)] ^ s7[xi(12)] ^ sb8[xi(14)] ^
 451            s7[xi(8)];
 452        z[1] = x[2] ^ s5[zi(0)] ^ s6[zi(2)] ^ s7[zi(1)] ^ sb8[zi(3)] ^
 453            sb8[xi(10)];
 454        z[2] = x[3] ^ s5[zi(7)] ^ s6[zi(6)] ^ s7[zi(5)] ^ sb8[zi(4)] ^
 455            s5[xi(9)];
 456        z[3] = x[1] ^ s5[zi(10)] ^ s6[zi(9)] ^ s7[zi(11)] ^ sb8[zi(8)] ^
 457            s6[xi(11)];
 458        k[8] = s5[zi(3)] ^ s6[zi(2)] ^ s7[zi(12)] ^ sb8[zi(13)] ^
 459            s5[zi(9)];
 460        k[9] = s5[zi(1)] ^ s6[zi(0)] ^ s7[zi(14)] ^ sb8[zi(15)] ^
 461            s6[zi(12)];
 462        k[10] = s5[zi(7)] ^ s6[zi(6)] ^ s7[zi(8)] ^ sb8[zi(9)] ^ s7[zi(2)];
 463        k[11] = s5[zi(5)] ^ s6[zi(4)] ^ s7[zi(10)] ^ sb8[zi(11)] ^
 464            sb8[zi(6)];
 465
 466        x[0] = z[2] ^ s5[zi(5)] ^ s6[zi(7)] ^ s7[zi(4)] ^ sb8[zi(6)] ^
 467            s7[zi(0)];
 468        x[1] = z[0] ^ s5[xi(0)] ^ s6[xi(2)] ^ s7[xi(1)] ^ sb8[xi(3)] ^
 469            sb8[zi(2)];
 470        x[2] = z[1] ^ s5[xi(7)] ^ s6[xi(6)] ^ s7[xi(5)] ^ sb8[xi(4)] ^
 471            s5[zi(1)];
 472        x[3] = z[3] ^ s5[xi(10)] ^ s6[xi(9)] ^ s7[xi(11)] ^ sb8[xi(8)] ^
 473            s6[zi(3)];
 474        k[12] = s5[xi(8)] ^ s6[xi(9)] ^ s7[xi(7)] ^ sb8[xi(6)] ^ s5[xi(3)];
 475        k[13] = s5[xi(10)] ^ s6[xi(11)] ^ s7[xi(5)] ^ sb8[xi(4)] ^
 476            s6[xi(7)];
 477        k[14] = s5[xi(12)] ^ s6[xi(13)] ^ s7[xi(3)] ^ sb8[xi(2)] ^
 478            s7[xi(8)];
 479        k[15] = s5[xi(14)] ^ s6[xi(15)] ^ s7[xi(1)] ^ sb8[xi(0)] ^
 480            sb8[xi(13)];
 481
 482#undef xi
 483#undef zi
 484}
 485
 486
 487int cast5_setkey(struct crypto_tfm *tfm, const u8 *key, unsigned int key_len)
 488{
 489        struct cast5_ctx *c = crypto_tfm_ctx(tfm);
 490        int i;
 491        u32 x[4];
 492        u32 z[4];
 493        u32 k[16];
 494        __be32 p_key[4];
 495
 496        c->rr = key_len <= 10 ? 1 : 0;
 497
 498        memset(p_key, 0, 16);
 499        memcpy(p_key, key, key_len);
 500
 501
 502        x[0] = be32_to_cpu(p_key[0]);
 503        x[1] = be32_to_cpu(p_key[1]);
 504        x[2] = be32_to_cpu(p_key[2]);
 505        x[3] = be32_to_cpu(p_key[3]);
 506
 507        key_schedule(x, z, k);
 508        for (i = 0; i < 16; i++)
 509                c->Km[i] = k[i];
 510        key_schedule(x, z, k);
 511        for (i = 0; i < 16; i++)
 512                c->Kr[i] = k[i] & 0x1f;
 513        return 0;
 514}
 515EXPORT_SYMBOL_GPL(cast5_setkey);
 516
 517static struct crypto_alg alg = {
 518        .cra_name               = "cast5",
 519        .cra_driver_name        = "cast5-generic",
 520        .cra_priority           = 100,
 521        .cra_flags              = CRYPTO_ALG_TYPE_CIPHER,
 522        .cra_blocksize          = CAST5_BLOCK_SIZE,
 523        .cra_ctxsize            = sizeof(struct cast5_ctx),
 524        .cra_alignmask          = 3,
 525        .cra_module             = THIS_MODULE,
 526        .cra_u                  = {
 527                .cipher = {
 528                        .cia_min_keysize = CAST5_MIN_KEY_SIZE,
 529                        .cia_max_keysize = CAST5_MAX_KEY_SIZE,
 530                        .cia_setkey  = cast5_setkey,
 531                        .cia_encrypt = cast5_encrypt,
 532                        .cia_decrypt = cast5_decrypt
 533                }
 534        }
 535};
 536
 537static int __init cast5_mod_init(void)
 538{
 539        return crypto_register_alg(&alg);
 540}
 541
 542static void __exit cast5_mod_fini(void)
 543{
 544        crypto_unregister_alg(&alg);
 545}
 546
 547module_init(cast5_mod_init);
 548module_exit(cast5_mod_fini);
 549
 550MODULE_LICENSE("GPL");
 551MODULE_DESCRIPTION("Cast5 Cipher Algorithm");
 552MODULE_ALIAS_CRYPTO("cast5");
 553MODULE_ALIAS_CRYPTO("cast5-generic");
 554