Back to home page

OSCL-LXR

 
 

    


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