Back to home page

LXR

 
 

    


0001 /* Kernel cryptographic api.
0002 * cast5.c - Cast5 cipher algorithm (rfc2144).
0003 *
0004 * Derived from GnuPG implementation of cast5.
0005 *
0006 * Major Changes.
0007 *   Complete conformance to rfc2144.
0008 *   Supports key size from 40 to 128 bits.
0009 *
0010 * Copyright (C) 1998, 1999, 2000, 2001 Free Software Foundation, Inc.
0011 * Copyright (C) 2003 Kartikey Mahendra Bhatt <kartik_me@hotmail.com>.
0012 *
0013 * This program is free software; you can redistribute it and/or modify it
0014 * under the terms of GNU General Public License as published by the Free
0015 * Software Foundation; either version 2 of the License, or (at your option)
0016 * any later version.
0017 *
0018 * You should have received a copy of the GNU General Public License
0019 * along with this program; if not, write to the Free Software
0020 * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA
0021 */
0022 
0023 
0024 #include <asm/byteorder.h>
0025 #include <linux/init.h>
0026 #include <linux/crypto.h>
0027 #include <linux/module.h>
0028 #include <linux/errno.h>
0029 #include <linux/string.h>
0030 #include <linux/types.h>
0031 #include <crypto/cast5.h>
0032 
0033 static const u32 s5[256] = {
0034     0x7ec90c04, 0x2c6e74b9, 0x9b0e66df, 0xa6337911, 0xb86a7fff,
0035     0x1dd358f5, 0x44dd9d44, 0x1731167f,
0036     0x08fbf1fa, 0xe7f511cc, 0xd2051b00, 0x735aba00, 0x2ab722d8,
0037     0x386381cb, 0xacf6243a, 0x69befd7a,
0038     0xe6a2e77f, 0xf0c720cd, 0xc4494816, 0xccf5c180, 0x38851640,
0039     0x15b0a848, 0xe68b18cb, 0x4caadeff,
0040     0x5f480a01, 0x0412b2aa, 0x259814fc, 0x41d0efe2, 0x4e40b48d,
0041     0x248eb6fb, 0x8dba1cfe, 0x41a99b02,
0042     0x1a550a04, 0xba8f65cb, 0x7251f4e7, 0x95a51725, 0xc106ecd7,
0043     0x97a5980a, 0xc539b9aa, 0x4d79fe6a,
0044     0xf2f3f763, 0x68af8040, 0xed0c9e56, 0x11b4958b, 0xe1eb5a88,
0045     0x8709e6b0, 0xd7e07156, 0x4e29fea7,
0046     0x6366e52d, 0x02d1c000, 0xc4ac8e05, 0x9377f571, 0x0c05372a,
0047     0x578535f2, 0x2261be02, 0xd642a0c9,
0048     0xdf13a280, 0x74b55bd2, 0x682199c0, 0xd421e5ec, 0x53fb3ce8,
0049     0xc8adedb3, 0x28a87fc9, 0x3d959981,
0050     0x5c1ff900, 0xfe38d399, 0x0c4eff0b, 0x062407ea, 0xaa2f4fb1,
0051     0x4fb96976, 0x90c79505, 0xb0a8a774,
0052     0xef55a1ff, 0xe59ca2c2, 0xa6b62d27, 0xe66a4263, 0xdf65001f,
0053     0x0ec50966, 0xdfdd55bc, 0x29de0655,
0054     0x911e739a, 0x17af8975, 0x32c7911c, 0x89f89468, 0x0d01e980,
0055     0x524755f4, 0x03b63cc9, 0x0cc844b2,
0056     0xbcf3f0aa, 0x87ac36e9, 0xe53a7426, 0x01b3d82b, 0x1a9e7449,
0057     0x64ee2d7e, 0xcddbb1da, 0x01c94910,
0058     0xb868bf80, 0x0d26f3fd, 0x9342ede7, 0x04a5c284, 0x636737b6,
0059     0x50f5b616, 0xf24766e3, 0x8eca36c1,
0060     0x136e05db, 0xfef18391, 0xfb887a37, 0xd6e7f7d4, 0xc7fb7dc9,
0061     0x3063fcdf, 0xb6f589de, 0xec2941da,
0062     0x26e46695, 0xb7566419, 0xf654efc5, 0xd08d58b7, 0x48925401,
0063     0xc1bacb7f, 0xe5ff550f, 0xb6083049,
0064     0x5bb5d0e8, 0x87d72e5a, 0xab6a6ee1, 0x223a66ce, 0xc62bf3cd,
0065     0x9e0885f9, 0x68cb3e47, 0x086c010f,
0066     0xa21de820, 0xd18b69de, 0xf3f65777, 0xfa02c3f6, 0x407edac3,
0067     0xcbb3d550, 0x1793084d, 0xb0d70eba,
0068     0x0ab378d5, 0xd951fb0c, 0xded7da56, 0x4124bbe4, 0x94ca0b56,
0069     0x0f5755d1, 0xe0e1e56e, 0x6184b5be,
0070     0x580a249f, 0x94f74bc0, 0xe327888e, 0x9f7b5561, 0xc3dc0280,
0071     0x05687715, 0x646c6bd7, 0x44904db3,
0072     0x66b4f0a3, 0xc0f1648a, 0x697ed5af, 0x49e92ff6, 0x309e374f,
0073     0x2cb6356a, 0x85808573, 0x4991f840,
0074     0x76f0ae02, 0x083be84d, 0x28421c9a, 0x44489406, 0x736e4cb8,
0075     0xc1092910, 0x8bc95fc6, 0x7d869cf4,
0076     0x134f616f, 0x2e77118d, 0xb31b2be1, 0xaa90b472, 0x3ca5d717,
0077     0x7d161bba, 0x9cad9010, 0xaf462ba2,
0078     0x9fe459d2, 0x45d34559, 0xd9f2da13, 0xdbc65487, 0xf3e4f94e,
0079     0x176d486f, 0x097c13ea, 0x631da5c7,
0080     0x445f7382, 0x175683f4, 0xcdc66a97, 0x70be0288, 0xb3cdcf72,
0081     0x6e5dd2f3, 0x20936079, 0x459b80a5,
0082     0xbe60e2db, 0xa9c23101, 0xeba5315c, 0x224e42f2, 0x1c5c1572,
0083     0xf6721b2c, 0x1ad2fff3, 0x8c25404e,
0084     0x324ed72f, 0x4067b7fd, 0x0523138e, 0x5ca3bc78, 0xdc0fd66e,
0085     0x75922283, 0x784d6b17, 0x58ebb16e,
0086     0x44094f85, 0x3f481d87, 0xfcfeae7b, 0x77b5ff76, 0x8c2302bf,
0087     0xaaf47556, 0x5f46b02a, 0x2b092801,
0088     0x3d38f5f7, 0x0ca81f36, 0x52af4a8a, 0x66d5e7c0, 0xdf3b0874,
0089     0x95055110, 0x1b5ad7a8, 0xf61ed5ad,
0090     0x6cf6e479, 0x20758184, 0xd0cefa65, 0x88f7be58, 0x4a046826,
0091     0x0ff6f8f3, 0xa09c7f70, 0x5346aba0,
0092     0x5ce96c28, 0xe176eda3, 0x6bac307f, 0x376829d2, 0x85360fa9,
0093     0x17e3fe2a, 0x24b79767, 0xf5a96b20,
0094     0xd6cd2595, 0x68ff1ebf, 0x7555442c, 0xf19f06be, 0xf9e0659a,
0095     0xeeb9491d, 0x34010718, 0xbb30cab8,
0096     0xe822fe15, 0x88570983, 0x750e6249, 0xda627e55, 0x5e76ffa8,
0097     0xb1534546, 0x6d47de08, 0xefe9e7d4
0098 };
0099 static const u32 s6[256] = {
0100     0xf6fa8f9d, 0x2cac6ce1, 0x4ca34867, 0xe2337f7c, 0x95db08e7,
0101     0x016843b4, 0xeced5cbc, 0x325553ac,
0102     0xbf9f0960, 0xdfa1e2ed, 0x83f0579d, 0x63ed86b9, 0x1ab6a6b8,
0103     0xde5ebe39, 0xf38ff732, 0x8989b138,
0104     0x33f14961, 0xc01937bd, 0xf506c6da, 0xe4625e7e, 0xa308ea99,
0105     0x4e23e33c, 0x79cbd7cc, 0x48a14367,
0106     0xa3149619, 0xfec94bd5, 0xa114174a, 0xeaa01866, 0xa084db2d,
0107     0x09a8486f, 0xa888614a, 0x2900af98,
0108     0x01665991, 0xe1992863, 0xc8f30c60, 0x2e78ef3c, 0xd0d51932,
0109     0xcf0fec14, 0xf7ca07d2, 0xd0a82072,
0110     0xfd41197e, 0x9305a6b0, 0xe86be3da, 0x74bed3cd, 0x372da53c,
0111     0x4c7f4448, 0xdab5d440, 0x6dba0ec3,
0112     0x083919a7, 0x9fbaeed9, 0x49dbcfb0, 0x4e670c53, 0x5c3d9c01,
0113     0x64bdb941, 0x2c0e636a, 0xba7dd9cd,
0114     0xea6f7388, 0xe70bc762, 0x35f29adb, 0x5c4cdd8d, 0xf0d48d8c,
0115     0xb88153e2, 0x08a19866, 0x1ae2eac8,
0116     0x284caf89, 0xaa928223, 0x9334be53, 0x3b3a21bf, 0x16434be3,
0117     0x9aea3906, 0xefe8c36e, 0xf890cdd9,
0118     0x80226dae, 0xc340a4a3, 0xdf7e9c09, 0xa694a807, 0x5b7c5ecc,
0119     0x221db3a6, 0x9a69a02f, 0x68818a54,
0120     0xceb2296f, 0x53c0843a, 0xfe893655, 0x25bfe68a, 0xb4628abc,
0121     0xcf222ebf, 0x25ac6f48, 0xa9a99387,
0122     0x53bddb65, 0xe76ffbe7, 0xe967fd78, 0x0ba93563, 0x8e342bc1,
0123     0xe8a11be9, 0x4980740d, 0xc8087dfc,
0124     0x8de4bf99, 0xa11101a0, 0x7fd37975, 0xda5a26c0, 0xe81f994f,
0125     0x9528cd89, 0xfd339fed, 0xb87834bf,
0126     0x5f04456d, 0x22258698, 0xc9c4c83b, 0x2dc156be, 0x4f628daa,
0127     0x57f55ec5, 0xe2220abe, 0xd2916ebf,
0128     0x4ec75b95, 0x24f2c3c0, 0x42d15d99, 0xcd0d7fa0, 0x7b6e27ff,
0129     0xa8dc8af0, 0x7345c106, 0xf41e232f,
0130     0x35162386, 0xe6ea8926, 0x3333b094, 0x157ec6f2, 0x372b74af,
0131     0x692573e4, 0xe9a9d848, 0xf3160289,
0132     0x3a62ef1d, 0xa787e238, 0xf3a5f676, 0x74364853, 0x20951063,
0133     0x4576698d, 0xb6fad407, 0x592af950,
0134     0x36f73523, 0x4cfb6e87, 0x7da4cec0, 0x6c152daa, 0xcb0396a8,
0135     0xc50dfe5d, 0xfcd707ab, 0x0921c42f,
0136     0x89dff0bb, 0x5fe2be78, 0x448f4f33, 0x754613c9, 0x2b05d08d,
0137     0x48b9d585, 0xdc049441, 0xc8098f9b,
0138     0x7dede786, 0xc39a3373, 0x42410005, 0x6a091751, 0x0ef3c8a6,
0139     0x890072d6, 0x28207682, 0xa9a9f7be,
0140     0xbf32679d, 0xd45b5b75, 0xb353fd00, 0xcbb0e358, 0x830f220a,
0141     0x1f8fb214, 0xd372cf08, 0xcc3c4a13,
0142     0x8cf63166, 0x061c87be, 0x88c98f88, 0x6062e397, 0x47cf8e7a,
0143     0xb6c85283, 0x3cc2acfb, 0x3fc06976,
0144     0x4e8f0252, 0x64d8314d, 0xda3870e3, 0x1e665459, 0xc10908f0,
0145     0x513021a5, 0x6c5b68b7, 0x822f8aa0,
0146     0x3007cd3e, 0x74719eef, 0xdc872681, 0x073340d4, 0x7e432fd9,
0147     0x0c5ec241, 0x8809286c, 0xf592d891,
0148     0x08a930f6, 0x957ef305, 0xb7fbffbd, 0xc266e96f, 0x6fe4ac98,
0149     0xb173ecc0, 0xbc60b42a, 0x953498da,
0150     0xfba1ae12, 0x2d4bd736, 0x0f25faab, 0xa4f3fceb, 0xe2969123,
0151     0x257f0c3d, 0x9348af49, 0x361400bc,
0152     0xe8816f4a, 0x3814f200, 0xa3f94043, 0x9c7a54c2, 0xbc704f57,
0153     0xda41e7f9, 0xc25ad33a, 0x54f4a084,
0154     0xb17f5505, 0x59357cbe, 0xedbd15c8, 0x7f97c5ab, 0xba5ac7b5,
0155     0xb6f6deaf, 0x3a479c3a, 0x5302da25,
0156     0x653d7e6a, 0x54268d49, 0x51a477ea, 0x5017d55b, 0xd7d25d88,
0157     0x44136c76, 0x0404a8c8, 0xb8e5a121,
0158     0xb81a928a, 0x60ed5869, 0x97c55b96, 0xeaec991b, 0x29935913,
0159     0x01fdb7f1, 0x088e8dfa, 0x9ab6f6f5,
0160     0x3b4cbf9f, 0x4a5de3ab, 0xe6051d35, 0xa0e1d855, 0xd36b4cf1,
0161     0xf544edeb, 0xb0e93524, 0xbebb8fbd,
0162     0xa2d762cf, 0x49c92f54, 0x38b5f331, 0x7128a454, 0x48392905,
0163     0xa65b1db8, 0x851c97bd, 0xd675cf2f
0164 };
0165 static const u32 s7[256] = {
0166     0x85e04019, 0x332bf567, 0x662dbfff, 0xcfc65693, 0x2a8d7f6f,
0167     0xab9bc912, 0xde6008a1, 0x2028da1f,
0168     0x0227bce7, 0x4d642916, 0x18fac300, 0x50f18b82, 0x2cb2cb11,
0169     0xb232e75c, 0x4b3695f2, 0xb28707de,
0170     0xa05fbcf6, 0xcd4181e9, 0xe150210c, 0xe24ef1bd, 0xb168c381,
0171     0xfde4e789, 0x5c79b0d8, 0x1e8bfd43,
0172     0x4d495001, 0x38be4341, 0x913cee1d, 0x92a79c3f, 0x089766be,
0173     0xbaeeadf4, 0x1286becf, 0xb6eacb19,
0174     0x2660c200, 0x7565bde4, 0x64241f7a, 0x8248dca9, 0xc3b3ad66,
0175     0x28136086, 0x0bd8dfa8, 0x356d1cf2,
0176     0x107789be, 0xb3b2e9ce, 0x0502aa8f, 0x0bc0351e, 0x166bf52a,
0177     0xeb12ff82, 0xe3486911, 0xd34d7516,
0178     0x4e7b3aff, 0x5f43671b, 0x9cf6e037, 0x4981ac83, 0x334266ce,
0179     0x8c9341b7, 0xd0d854c0, 0xcb3a6c88,
0180     0x47bc2829, 0x4725ba37, 0xa66ad22b, 0x7ad61f1e, 0x0c5cbafa,
0181     0x4437f107, 0xb6e79962, 0x42d2d816,
0182     0x0a961288, 0xe1a5c06e, 0x13749e67, 0x72fc081a, 0xb1d139f7,
0183     0xf9583745, 0xcf19df58, 0xbec3f756,
0184     0xc06eba30, 0x07211b24, 0x45c28829, 0xc95e317f, 0xbc8ec511,
0185     0x38bc46e9, 0xc6e6fa14, 0xbae8584a,
0186     0xad4ebc46, 0x468f508b, 0x7829435f, 0xf124183b, 0x821dba9f,
0187     0xaff60ff4, 0xea2c4e6d, 0x16e39264,
0188     0x92544a8b, 0x009b4fc3, 0xaba68ced, 0x9ac96f78, 0x06a5b79a,
0189     0xb2856e6e, 0x1aec3ca9, 0xbe838688,
0190     0x0e0804e9, 0x55f1be56, 0xe7e5363b, 0xb3a1f25d, 0xf7debb85,
0191     0x61fe033c, 0x16746233, 0x3c034c28,
0192     0xda6d0c74, 0x79aac56c, 0x3ce4e1ad, 0x51f0c802, 0x98f8f35a,
0193     0x1626a49f, 0xeed82b29, 0x1d382fe3,
0194     0x0c4fb99a, 0xbb325778, 0x3ec6d97b, 0x6e77a6a9, 0xcb658b5c,
0195     0xd45230c7, 0x2bd1408b, 0x60c03eb7,
0196     0xb9068d78, 0xa33754f4, 0xf430c87d, 0xc8a71302, 0xb96d8c32,
0197     0xebd4e7be, 0xbe8b9d2d, 0x7979fb06,
0198     0xe7225308, 0x8b75cf77, 0x11ef8da4, 0xe083c858, 0x8d6b786f,
0199     0x5a6317a6, 0xfa5cf7a0, 0x5dda0033,
0200     0xf28ebfb0, 0xf5b9c310, 0xa0eac280, 0x08b9767a, 0xa3d9d2b0,
0201     0x79d34217, 0x021a718d, 0x9ac6336a,
0202     0x2711fd60, 0x438050e3, 0x069908a8, 0x3d7fedc4, 0x826d2bef,
0203     0x4eeb8476, 0x488dcf25, 0x36c9d566,
0204     0x28e74e41, 0xc2610aca, 0x3d49a9cf, 0xbae3b9df, 0xb65f8de6,
0205     0x92aeaf64, 0x3ac7d5e6, 0x9ea80509,
0206     0xf22b017d, 0xa4173f70, 0xdd1e16c3, 0x15e0d7f9, 0x50b1b887,
0207     0x2b9f4fd5, 0x625aba82, 0x6a017962,
0208     0x2ec01b9c, 0x15488aa9, 0xd716e740, 0x40055a2c, 0x93d29a22,
0209     0xe32dbf9a, 0x058745b9, 0x3453dc1e,
0210     0xd699296e, 0x496cff6f, 0x1c9f4986, 0xdfe2ed07, 0xb87242d1,
0211     0x19de7eae, 0x053e561a, 0x15ad6f8c,
0212     0x66626c1c, 0x7154c24c, 0xea082b2a, 0x93eb2939, 0x17dcb0f0,
0213     0x58d4f2ae, 0x9ea294fb, 0x52cf564c,
0214     0x9883fe66, 0x2ec40581, 0x763953c3, 0x01d6692e, 0xd3a0c108,
0215     0xa1e7160e, 0xe4f2dfa6, 0x693ed285,
0216     0x74904698, 0x4c2b0edd, 0x4f757656, 0x5d393378, 0xa132234f,
0217     0x3d321c5d, 0xc3f5e194, 0x4b269301,
0218     0xc79f022f, 0x3c997e7e, 0x5e4f9504, 0x3ffafbbd, 0x76f7ad0e,
0219     0x296693f4, 0x3d1fce6f, 0xc61e45be,
0220     0xd3b5ab34, 0xf72bf9b7, 0x1b0434c0, 0x4e72b567, 0x5592a33d,
0221     0xb5229301, 0xcfd2a87f, 0x60aeb767,
0222     0x1814386b, 0x30bcc33d, 0x38a0c07d, 0xfd1606f2, 0xc363519b,
0223     0x589dd390, 0x5479f8e6, 0x1cb8d647,
0224     0x97fd61a9, 0xea7759f4, 0x2d57539d, 0x569a58cf, 0xe84e63ad,
0225     0x462e1b78, 0x6580f87e, 0xf3817914,
0226     0x91da55f4, 0x40a230f3, 0xd1988f35, 0xb6e318d2, 0x3ffa50bc,
0227     0x3d40f021, 0xc3c0bdae, 0x4958c24c,
0228     0x518f36b2, 0x84b1d370, 0x0fedce83, 0x878ddada, 0xf2a279c7,
0229     0x94e01be8, 0x90716f4b, 0x954b8aa3
0230 };
0231 static const u32 sb8[256] = {
0232     0xe216300d, 0xbbddfffc, 0xa7ebdabd, 0x35648095, 0x7789f8b7,
0233     0xe6c1121b, 0x0e241600, 0x052ce8b5,
0234     0x11a9cfb0, 0xe5952f11, 0xece7990a, 0x9386d174, 0x2a42931c,
0235     0x76e38111, 0xb12def3a, 0x37ddddfc,
0236     0xde9adeb1, 0x0a0cc32c, 0xbe197029, 0x84a00940, 0xbb243a0f,
0237     0xb4d137cf, 0xb44e79f0, 0x049eedfd,
0238     0x0b15a15d, 0x480d3168, 0x8bbbde5a, 0x669ded42, 0xc7ece831,
0239     0x3f8f95e7, 0x72df191b, 0x7580330d,
0240     0x94074251, 0x5c7dcdfa, 0xabbe6d63, 0xaa402164, 0xb301d40a,
0241     0x02e7d1ca, 0x53571dae, 0x7a3182a2,
0242     0x12a8ddec, 0xfdaa335d, 0x176f43e8, 0x71fb46d4, 0x38129022,
0243     0xce949ad4, 0xb84769ad, 0x965bd862,
0244     0x82f3d055, 0x66fb9767, 0x15b80b4e, 0x1d5b47a0, 0x4cfde06f,
0245     0xc28ec4b8, 0x57e8726e, 0x647a78fc,
0246     0x99865d44, 0x608bd593, 0x6c200e03, 0x39dc5ff6, 0x5d0b00a3,
0247     0xae63aff2, 0x7e8bd632, 0x70108c0c,
0248     0xbbd35049, 0x2998df04, 0x980cf42a, 0x9b6df491, 0x9e7edd53,
0249     0x06918548, 0x58cb7e07, 0x3b74ef2e,
0250     0x522fffb1, 0xd24708cc, 0x1c7e27cd, 0xa4eb215b, 0x3cf1d2e2,
0251     0x19b47a38, 0x424f7618, 0x35856039,
0252     0x9d17dee7, 0x27eb35e6, 0xc9aff67b, 0x36baf5b8, 0x09c467cd,
0253     0xc18910b1, 0xe11dbf7b, 0x06cd1af8,
0254     0x7170c608, 0x2d5e3354, 0xd4de495a, 0x64c6d006, 0xbcc0c62c,
0255     0x3dd00db3, 0x708f8f34, 0x77d51b42,
0256     0x264f620f, 0x24b8d2bf, 0x15c1b79e, 0x46a52564, 0xf8d7e54e,
0257     0x3e378160, 0x7895cda5, 0x859c15a5,
0258     0xe6459788, 0xc37bc75f, 0xdb07ba0c, 0x0676a3ab, 0x7f229b1e,
0259     0x31842e7b, 0x24259fd7, 0xf8bef472,
0260     0x835ffcb8, 0x6df4c1f2, 0x96f5b195, 0xfd0af0fc, 0xb0fe134c,
0261     0xe2506d3d, 0x4f9b12ea, 0xf215f225,
0262     0xa223736f, 0x9fb4c428, 0x25d04979, 0x34c713f8, 0xc4618187,
0263     0xea7a6e98, 0x7cd16efc, 0x1436876c,
0264     0xf1544107, 0xbedeee14, 0x56e9af27, 0xa04aa441, 0x3cf7c899,
0265     0x92ecbae6, 0xdd67016d, 0x151682eb,
0266     0xa842eedf, 0xfdba60b4, 0xf1907b75, 0x20e3030f, 0x24d8c29e,
0267     0xe139673b, 0xefa63fb8, 0x71873054,
0268     0xb6f2cf3b, 0x9f326442, 0xcb15a4cc, 0xb01a4504, 0xf1e47d8d,
0269     0x844a1be5, 0xbae7dfdc, 0x42cbda70,
0270     0xcd7dae0a, 0x57e85b7a, 0xd53f5af6, 0x20cf4d8c, 0xcea4d428,
0271     0x79d130a4, 0x3486ebfb, 0x33d3cddc,
0272     0x77853b53, 0x37effcb5, 0xc5068778, 0xe580b3e6, 0x4e68b8f4,
0273     0xc5c8b37e, 0x0d809ea2, 0x398feb7c,
0274     0x132a4f94, 0x43b7950e, 0x2fee7d1c, 0x223613bd, 0xdd06caa2,
0275     0x37df932b, 0xc4248289, 0xacf3ebc3,
0276     0x5715f6b7, 0xef3478dd, 0xf267616f, 0xc148cbe4, 0x9052815e,
0277     0x5e410fab, 0xb48a2465, 0x2eda7fa4,
0278     0xe87b40e4, 0xe98ea084, 0x5889e9e1, 0xefd390fc, 0xdd07d35b,
0279     0xdb485694, 0x38d7e5b2, 0x57720101,
0280     0x730edebc, 0x5b643113, 0x94917e4f, 0x503c2fba, 0x646f1282,
0281     0x7523d24a, 0xe0779695, 0xf9c17a8f,
0282     0x7a5b2121, 0xd187b896, 0x29263a4d, 0xba510cdf, 0x81f47c9f,
0283     0xad1163ed, 0xea7b5965, 0x1a00726e,
0284     0x11403092, 0x00da6d77, 0x4a0cdd61, 0xad1f4603, 0x605bdfb0,
0285     0x9eedc364, 0x22ebe6a8, 0xcee7d28a,
0286     0xa0e736a0, 0x5564a6b9, 0x10853209, 0xc7eb8f37, 0x2de705ca,
0287     0x8951570f, 0xdf09822b, 0xbd691a6c,
0288     0xaa12e4f2, 0x87451c0f, 0xe0f6a27a, 0x3ada4819, 0x4cf1764f,
0289     0x0d771c2b, 0x67cdb156, 0x350d8384,
0290     0x5938fa0f, 0x42399ef3, 0x36997b07, 0x0e84093d, 0x4aa93e61,
0291     0x8360d87b, 0x1fa98b0c, 0x1149382c,
0292     0xe97625a5, 0x0614d1b7, 0x0e25244b, 0x0c768347, 0x589e8d82,
0293     0x0d2059d1, 0xa466bb1e, 0xf8da0a82,
0294     0x04f19130, 0xba6e4ec0, 0x99265164, 0x1ee7230d, 0x50b2ad80,
0295     0xeaee6801, 0x8db2a283, 0xea8bf59e
0296 };
0297 
0298 #define s1 cast_s1
0299 #define s2 cast_s2
0300 #define s3 cast_s3
0301 #define s4 cast_s4
0302 
0303 #define F1(D, m, r)  ((I = ((m) + (D))), (I = rol32(I, (r))),   \
0304     (((s1[I >> 24] ^ s2[(I>>16)&0xff]) - s3[(I>>8)&0xff]) + s4[I&0xff]))
0305 #define F2(D, m, r)  ((I = ((m) ^ (D))), (I = rol32(I, (r))),   \
0306     (((s1[I >> 24] - s2[(I>>16)&0xff]) + s3[(I>>8)&0xff]) ^ s4[I&0xff]))
0307 #define F3(D, m, r)  ((I = ((m) - (D))), (I = rol32(I, (r))),   \
0308     (((s1[I >> 24] + s2[(I>>16)&0xff]) ^ s3[(I>>8)&0xff]) - s4[I&0xff]))
0309 
0310 
0311 void __cast5_encrypt(struct cast5_ctx *c, u8 *outbuf, const u8 *inbuf)
0312 {
0313     const __be32 *src = (const __be32 *)inbuf;
0314     __be32 *dst = (__be32 *)outbuf;
0315     u32 l, r, t;
0316     u32 I;          /* used by the Fx macros */
0317     u32 *Km;
0318     u8 *Kr;
0319 
0320     Km = c->Km;
0321     Kr = c->Kr;
0322 
0323     /* (L0,R0) <-- (m1...m64).  (Split the plaintext into left and
0324      * right 32-bit halves L0 = m1...m32 and R0 = m33...m64.)
0325      */
0326     l = be32_to_cpu(src[0]);
0327     r = be32_to_cpu(src[1]);
0328 
0329     /* (16 rounds) for i from 1 to 16, compute Li and Ri as follows:
0330      *  Li = Ri-1;
0331      *  Ri = Li-1 ^ f(Ri-1,Kmi,Kri), where f is defined in Section 2.2
0332      * Rounds 1, 4, 7, 10, 13, and 16 use f function Type 1.
0333      * Rounds 2, 5, 8, 11, and 14 use f function Type 2.
0334      * Rounds 3, 6, 9, 12, and 15 use f function Type 3.
0335      */
0336 
0337     t = l; l = r; r = t ^ F1(r, Km[0], Kr[0]);
0338     t = l; l = r; r = t ^ F2(r, Km[1], Kr[1]);
0339     t = l; l = r; r = t ^ F3(r, Km[2], Kr[2]);
0340     t = l; l = r; r = t ^ F1(r, Km[3], Kr[3]);
0341     t = l; l = r; r = t ^ F2(r, Km[4], Kr[4]);
0342     t = l; l = r; r = t ^ F3(r, Km[5], Kr[5]);
0343     t = l; l = r; r = t ^ F1(r, Km[6], Kr[6]);
0344     t = l; l = r; r = t ^ F2(r, Km[7], Kr[7]);
0345     t = l; l = r; r = t ^ F3(r, Km[8], Kr[8]);
0346     t = l; l = r; r = t ^ F1(r, Km[9], Kr[9]);
0347     t = l; l = r; r = t ^ F2(r, Km[10], Kr[10]);
0348     t = l; l = r; r = t ^ F3(r, Km[11], Kr[11]);
0349     if (!(c->rr)) {
0350         t = l; l = r; r = t ^ F1(r, Km[12], Kr[12]);
0351         t = l; l = r; r = t ^ F2(r, Km[13], Kr[13]);
0352         t = l; l = r; r = t ^ F3(r, Km[14], Kr[14]);
0353         t = l; l = r; r = t ^ F1(r, Km[15], Kr[15]);
0354     }
0355 
0356     /* c1...c64 <-- (R16,L16).  (Exchange final blocks L16, R16 and
0357      *  concatenate to form the ciphertext.) */
0358     dst[0] = cpu_to_be32(r);
0359     dst[1] = cpu_to_be32(l);
0360 }
0361 EXPORT_SYMBOL_GPL(__cast5_encrypt);
0362 
0363 static void cast5_encrypt(struct crypto_tfm *tfm, u8 *outbuf, const u8 *inbuf)
0364 {
0365     __cast5_encrypt(crypto_tfm_ctx(tfm), outbuf, inbuf);
0366 }
0367 
0368 void __cast5_decrypt(struct cast5_ctx *c, u8 *outbuf, const u8 *inbuf)
0369 {
0370     const __be32 *src = (const __be32 *)inbuf;
0371     __be32 *dst = (__be32 *)outbuf;
0372     u32 l, r, t;
0373     u32 I;
0374     u32 *Km;
0375     u8 *Kr;
0376 
0377     Km = c->Km;
0378     Kr = c->Kr;
0379 
0380     l = be32_to_cpu(src[0]);
0381     r = be32_to_cpu(src[1]);
0382 
0383     if (!(c->rr)) {
0384         t = l; l = r; r = t ^ F1(r, Km[15], Kr[15]);
0385         t = l; l = r; r = t ^ F3(r, Km[14], Kr[14]);
0386         t = l; l = r; r = t ^ F2(r, Km[13], Kr[13]);
0387         t = l; l = r; r = t ^ F1(r, Km[12], Kr[12]);
0388     }
0389     t = l; l = r; r = t ^ F3(r, Km[11], Kr[11]);
0390     t = l; l = r; r = t ^ F2(r, Km[10], Kr[10]);
0391     t = l; l = r; r = t ^ F1(r, Km[9], Kr[9]);
0392     t = l; l = r; r = t ^ F3(r, Km[8], Kr[8]);
0393     t = l; l = r; r = t ^ F2(r, Km[7], Kr[7]);
0394     t = l; l = r; r = t ^ F1(r, Km[6], Kr[6]);
0395     t = l; l = r; r = t ^ F3(r, Km[5], Kr[5]);
0396     t = l; l = r; r = t ^ F2(r, Km[4], Kr[4]);
0397     t = l; l = r; r = t ^ F1(r, Km[3], Kr[3]);
0398     t = l; l = r; r = t ^ F3(r, Km[2], Kr[2]);
0399     t = l; l = r; r = t ^ F2(r, Km[1], Kr[1]);
0400     t = l; l = r; r = t ^ F1(r, Km[0], Kr[0]);
0401 
0402     dst[0] = cpu_to_be32(r);
0403     dst[1] = cpu_to_be32(l);
0404 }
0405 EXPORT_SYMBOL_GPL(__cast5_decrypt);
0406 
0407 static void cast5_decrypt(struct crypto_tfm *tfm, u8 *outbuf, const u8 *inbuf)
0408 {
0409     __cast5_decrypt(crypto_tfm_ctx(tfm), outbuf, inbuf);
0410 }
0411 
0412 static void key_schedule(u32 *x, u32 *z, u32 *k)
0413 {
0414 
0415 #define xi(i)   ((x[(i)/4] >> (8*(3-((i)%4)))) & 0xff)
0416 #define zi(i)   ((z[(i)/4] >> (8*(3-((i)%4)))) & 0xff)
0417 
0418     z[0] = x[0] ^ s5[xi(13)] ^ s6[xi(15)] ^ s7[xi(12)] ^ sb8[xi(14)] ^
0419         s7[xi(8)];
0420     z[1] = x[2] ^ s5[zi(0)] ^ s6[zi(2)] ^ s7[zi(1)] ^ sb8[zi(3)] ^
0421         sb8[xi(10)];
0422     z[2] = x[3] ^ s5[zi(7)] ^ s6[zi(6)] ^ s7[zi(5)] ^ sb8[zi(4)] ^
0423         s5[xi(9)];
0424     z[3] = x[1] ^ s5[zi(10)] ^ s6[zi(9)] ^ s7[zi(11)] ^ sb8[zi(8)] ^
0425         s6[xi(11)];
0426     k[0] = s5[zi(8)] ^ s6[zi(9)] ^ s7[zi(7)] ^ sb8[zi(6)] ^ s5[zi(2)];
0427     k[1] = s5[zi(10)] ^ s6[zi(11)] ^ s7[zi(5)] ^ sb8[zi(4)] ^
0428         s6[zi(6)];
0429     k[2] = s5[zi(12)] ^ s6[zi(13)] ^ s7[zi(3)] ^ sb8[zi(2)] ^
0430         s7[zi(9)];
0431     k[3] = s5[zi(14)] ^ s6[zi(15)] ^ s7[zi(1)] ^ sb8[zi(0)] ^
0432         sb8[zi(12)];
0433 
0434     x[0] = z[2] ^ s5[zi(5)] ^ s6[zi(7)] ^ s7[zi(4)] ^ sb8[zi(6)] ^
0435         s7[zi(0)];
0436     x[1] = z[0] ^ s5[xi(0)] ^ s6[xi(2)] ^ s7[xi(1)] ^ sb8[xi(3)] ^
0437         sb8[zi(2)];
0438     x[2] = z[1] ^ s5[xi(7)] ^ s6[xi(6)] ^ s7[xi(5)] ^ sb8[xi(4)] ^
0439         s5[zi(1)];
0440     x[3] = z[3] ^ s5[xi(10)] ^ s6[xi(9)] ^ s7[xi(11)] ^ sb8[xi(8)] ^
0441         s6[zi(3)];
0442     k[4] = s5[xi(3)] ^ s6[xi(2)] ^ s7[xi(12)] ^ sb8[xi(13)] ^
0443         s5[xi(8)];
0444     k[5] = s5[xi(1)] ^ s6[xi(0)] ^ s7[xi(14)] ^ sb8[xi(15)] ^
0445         s6[xi(13)];
0446     k[6] = s5[xi(7)] ^ s6[xi(6)] ^ s7[xi(8)] ^ sb8[xi(9)] ^ s7[xi(3)];
0447     k[7] = s5[xi(5)] ^ s6[xi(4)] ^ s7[xi(10)] ^ sb8[xi(11)] ^
0448         sb8[xi(7)];
0449 
0450     z[0] = x[0] ^ s5[xi(13)] ^ s6[xi(15)] ^ s7[xi(12)] ^ sb8[xi(14)] ^
0451         s7[xi(8)];
0452     z[1] = x[2] ^ s5[zi(0)] ^ s6[zi(2)] ^ s7[zi(1)] ^ sb8[zi(3)] ^
0453         sb8[xi(10)];
0454     z[2] = x[3] ^ s5[zi(7)] ^ s6[zi(6)] ^ s7[zi(5)] ^ sb8[zi(4)] ^
0455         s5[xi(9)];
0456     z[3] = x[1] ^ s5[zi(10)] ^ s6[zi(9)] ^ s7[zi(11)] ^ sb8[zi(8)] ^
0457         s6[xi(11)];
0458     k[8] = s5[zi(3)] ^ s6[zi(2)] ^ s7[zi(12)] ^ sb8[zi(13)] ^
0459         s5[zi(9)];
0460     k[9] = s5[zi(1)] ^ s6[zi(0)] ^ s7[zi(14)] ^ sb8[zi(15)] ^
0461         s6[zi(12)];
0462     k[10] = s5[zi(7)] ^ s6[zi(6)] ^ s7[zi(8)] ^ sb8[zi(9)] ^ s7[zi(2)];
0463     k[11] = s5[zi(5)] ^ s6[zi(4)] ^ s7[zi(10)] ^ sb8[zi(11)] ^
0464         sb8[zi(6)];
0465 
0466     x[0] = z[2] ^ s5[zi(5)] ^ s6[zi(7)] ^ s7[zi(4)] ^ sb8[zi(6)] ^
0467         s7[zi(0)];
0468     x[1] = z[0] ^ s5[xi(0)] ^ s6[xi(2)] ^ s7[xi(1)] ^ sb8[xi(3)] ^
0469         sb8[zi(2)];
0470     x[2] = z[1] ^ s5[xi(7)] ^ s6[xi(6)] ^ s7[xi(5)] ^ sb8[xi(4)] ^
0471         s5[zi(1)];
0472     x[3] = z[3] ^ s5[xi(10)] ^ s6[xi(9)] ^ s7[xi(11)] ^ sb8[xi(8)] ^
0473         s6[zi(3)];
0474     k[12] = s5[xi(8)] ^ s6[xi(9)] ^ s7[xi(7)] ^ sb8[xi(6)] ^ s5[xi(3)];
0475     k[13] = s5[xi(10)] ^ s6[xi(11)] ^ s7[xi(5)] ^ sb8[xi(4)] ^
0476         s6[xi(7)];
0477     k[14] = s5[xi(12)] ^ s6[xi(13)] ^ s7[xi(3)] ^ sb8[xi(2)] ^
0478         s7[xi(8)];
0479     k[15] = s5[xi(14)] ^ s6[xi(15)] ^ s7[xi(1)] ^ sb8[xi(0)] ^
0480         sb8[xi(13)];
0481 
0482 #undef xi
0483 #undef zi
0484 }
0485 
0486 
0487 int cast5_setkey(struct crypto_tfm *tfm, const u8 *key, unsigned int key_len)
0488 {
0489     struct cast5_ctx *c = crypto_tfm_ctx(tfm);
0490     int i;
0491     u32 x[4];
0492     u32 z[4];
0493     u32 k[16];
0494     __be32 p_key[4];
0495 
0496     c->rr = key_len <= 10 ? 1 : 0;
0497 
0498     memset(p_key, 0, 16);
0499     memcpy(p_key, key, key_len);
0500 
0501 
0502     x[0] = be32_to_cpu(p_key[0]);
0503     x[1] = be32_to_cpu(p_key[1]);
0504     x[2] = be32_to_cpu(p_key[2]);
0505     x[3] = be32_to_cpu(p_key[3]);
0506 
0507     key_schedule(x, z, k);
0508     for (i = 0; i < 16; i++)
0509         c->Km[i] = k[i];
0510     key_schedule(x, z, k);
0511     for (i = 0; i < 16; i++)
0512         c->Kr[i] = k[i] & 0x1f;
0513     return 0;
0514 }
0515 EXPORT_SYMBOL_GPL(cast5_setkey);
0516 
0517 static struct crypto_alg alg = {
0518     .cra_name       = "cast5",
0519     .cra_driver_name    = "cast5-generic",
0520     .cra_priority       = 100,
0521     .cra_flags      = CRYPTO_ALG_TYPE_CIPHER,
0522     .cra_blocksize      = CAST5_BLOCK_SIZE,
0523     .cra_ctxsize        = sizeof(struct cast5_ctx),
0524     .cra_alignmask      = 3,
0525     .cra_module     = THIS_MODULE,
0526     .cra_u          = {
0527         .cipher = {
0528             .cia_min_keysize = CAST5_MIN_KEY_SIZE,
0529             .cia_max_keysize = CAST5_MAX_KEY_SIZE,
0530             .cia_setkey  = cast5_setkey,
0531             .cia_encrypt = cast5_encrypt,
0532             .cia_decrypt = cast5_decrypt
0533         }
0534     }
0535 };
0536 
0537 static int __init cast5_mod_init(void)
0538 {
0539     return crypto_register_alg(&alg);
0540 }
0541 
0542 static void __exit cast5_mod_fini(void)
0543 {
0544     crypto_unregister_alg(&alg);
0545 }
0546 
0547 module_init(cast5_mod_init);
0548 module_exit(cast5_mod_fini);
0549 
0550 MODULE_LICENSE("GPL");
0551 MODULE_DESCRIPTION("Cast5 Cipher Algorithm");
0552 MODULE_ALIAS_CRYPTO("cast5");
0553 MODULE_ALIAS_CRYPTO("cast5-generic");