xref: /openbmc/linux/crypto/cast6_generic.c (revision 312639bb1bc65abca243a6cee6e5364663d2dd7a)
12b49b906SJohannes Goetzfried /* Kernel cryptographic api.
22b49b906SJohannes Goetzfried  * cast6.c - Cast6 cipher algorithm [rfc2612].
32b49b906SJohannes Goetzfried  *
42b49b906SJohannes Goetzfried  * CAST-256 (*cast6*) is a DES like Substitution-Permutation Network (SPN)
52b49b906SJohannes Goetzfried  * cryptosystem built upon the CAST-128 (*cast5*) [rfc2144] encryption
62b49b906SJohannes Goetzfried  * algorithm.
72b49b906SJohannes Goetzfried  *
82b49b906SJohannes Goetzfried  * Copyright (C) 2003 Kartikey Mahendra Bhatt <kartik_me@hotmail.com>.
92b49b906SJohannes Goetzfried  *
102b49b906SJohannes Goetzfried  * This program is free software; you can redistribute it and/or modify it
112b49b906SJohannes Goetzfried  * under the terms of GNU General Public License as published by the Free
122b49b906SJohannes Goetzfried  * Software Foundation; either version 2 of the License, or (at your option)
132b49b906SJohannes Goetzfried  * any later version.
142b49b906SJohannes Goetzfried  *
152b49b906SJohannes Goetzfried  * You should have received a copy of the GNU General Public License
162b49b906SJohannes Goetzfried  * along with this program; if not, write to the Free Software
172b49b906SJohannes Goetzfried  * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA
182b49b906SJohannes Goetzfried  */
192b49b906SJohannes Goetzfried 
202b49b906SJohannes Goetzfried 
212b49b906SJohannes Goetzfried #include <asm/byteorder.h>
222b49b906SJohannes Goetzfried #include <linux/init.h>
232b49b906SJohannes Goetzfried #include <linux/crypto.h>
242b49b906SJohannes Goetzfried #include <linux/module.h>
252b49b906SJohannes Goetzfried #include <linux/errno.h>
262b49b906SJohannes Goetzfried #include <linux/string.h>
272b49b906SJohannes Goetzfried #include <linux/types.h>
282b49b906SJohannes Goetzfried #include <crypto/cast6.h>
292b49b906SJohannes Goetzfried 
302b49b906SJohannes Goetzfried #define s1 cast6_s1
312b49b906SJohannes Goetzfried #define s2 cast6_s2
322b49b906SJohannes Goetzfried #define s3 cast6_s3
332b49b906SJohannes Goetzfried #define s4 cast6_s4
342b49b906SJohannes Goetzfried 
352b49b906SJohannes Goetzfried #define F1(D, r, m)  ((I = ((m) + (D))), (I = rol32(I, (r))),   \
362b49b906SJohannes Goetzfried 	(((s1[I >> 24] ^ s2[(I>>16)&0xff]) - s3[(I>>8)&0xff]) + s4[I&0xff]))
372b49b906SJohannes Goetzfried #define F2(D, r, m)  ((I = ((m) ^ (D))), (I = rol32(I, (r))),   \
382b49b906SJohannes Goetzfried 	(((s1[I >> 24] - s2[(I>>16)&0xff]) + s3[(I>>8)&0xff]) ^ s4[I&0xff]))
392b49b906SJohannes Goetzfried #define F3(D, r, m)  ((I = ((m) - (D))), (I = rol32(I, (r))),   \
402b49b906SJohannes Goetzfried 	(((s1[I >> 24] + s2[(I>>16)&0xff]) ^ s3[(I>>8)&0xff]) - s4[I&0xff]))
412b49b906SJohannes Goetzfried 
422b49b906SJohannes Goetzfried const u32 cast6_s1[256] = {
432b49b906SJohannes Goetzfried 	0x30fb40d4, 0x9fa0ff0b, 0x6beccd2f, 0x3f258c7a, 0x1e213f2f,
442b49b906SJohannes Goetzfried 	0x9c004dd3, 0x6003e540, 0xcf9fc949,
452b49b906SJohannes Goetzfried 	0xbfd4af27, 0x88bbbdb5, 0xe2034090, 0x98d09675, 0x6e63a0e0,
462b49b906SJohannes Goetzfried 	0x15c361d2, 0xc2e7661d, 0x22d4ff8e,
472b49b906SJohannes Goetzfried 	0x28683b6f, 0xc07fd059, 0xff2379c8, 0x775f50e2, 0x43c340d3,
482b49b906SJohannes Goetzfried 	0xdf2f8656, 0x887ca41a, 0xa2d2bd2d,
492b49b906SJohannes Goetzfried 	0xa1c9e0d6, 0x346c4819, 0x61b76d87, 0x22540f2f, 0x2abe32e1,
502b49b906SJohannes Goetzfried 	0xaa54166b, 0x22568e3a, 0xa2d341d0,
512b49b906SJohannes Goetzfried 	0x66db40c8, 0xa784392f, 0x004dff2f, 0x2db9d2de, 0x97943fac,
522b49b906SJohannes Goetzfried 	0x4a97c1d8, 0x527644b7, 0xb5f437a7,
532b49b906SJohannes Goetzfried 	0xb82cbaef, 0xd751d159, 0x6ff7f0ed, 0x5a097a1f, 0x827b68d0,
542b49b906SJohannes Goetzfried 	0x90ecf52e, 0x22b0c054, 0xbc8e5935,
552b49b906SJohannes Goetzfried 	0x4b6d2f7f, 0x50bb64a2, 0xd2664910, 0xbee5812d, 0xb7332290,
562b49b906SJohannes Goetzfried 	0xe93b159f, 0xb48ee411, 0x4bff345d,
572b49b906SJohannes Goetzfried 	0xfd45c240, 0xad31973f, 0xc4f6d02e, 0x55fc8165, 0xd5b1caad,
582b49b906SJohannes Goetzfried 	0xa1ac2dae, 0xa2d4b76d, 0xc19b0c50,
592b49b906SJohannes Goetzfried 	0x882240f2, 0x0c6e4f38, 0xa4e4bfd7, 0x4f5ba272, 0x564c1d2f,
602b49b906SJohannes Goetzfried 	0xc59c5319, 0xb949e354, 0xb04669fe,
612b49b906SJohannes Goetzfried 	0xb1b6ab8a, 0xc71358dd, 0x6385c545, 0x110f935d, 0x57538ad5,
622b49b906SJohannes Goetzfried 	0x6a390493, 0xe63d37e0, 0x2a54f6b3,
632b49b906SJohannes Goetzfried 	0x3a787d5f, 0x6276a0b5, 0x19a6fcdf, 0x7a42206a, 0x29f9d4d5,
642b49b906SJohannes Goetzfried 	0xf61b1891, 0xbb72275e, 0xaa508167,
652b49b906SJohannes Goetzfried 	0x38901091, 0xc6b505eb, 0x84c7cb8c, 0x2ad75a0f, 0x874a1427,
662b49b906SJohannes Goetzfried 	0xa2d1936b, 0x2ad286af, 0xaa56d291,
672b49b906SJohannes Goetzfried 	0xd7894360, 0x425c750d, 0x93b39e26, 0x187184c9, 0x6c00b32d,
682b49b906SJohannes Goetzfried 	0x73e2bb14, 0xa0bebc3c, 0x54623779,
692b49b906SJohannes Goetzfried 	0x64459eab, 0x3f328b82, 0x7718cf82, 0x59a2cea6, 0x04ee002e,
702b49b906SJohannes Goetzfried 	0x89fe78e6, 0x3fab0950, 0x325ff6c2,
712b49b906SJohannes Goetzfried 	0x81383f05, 0x6963c5c8, 0x76cb5ad6, 0xd49974c9, 0xca180dcf,
722b49b906SJohannes Goetzfried 	0x380782d5, 0xc7fa5cf6, 0x8ac31511,
732b49b906SJohannes Goetzfried 	0x35e79e13, 0x47da91d0, 0xf40f9086, 0xa7e2419e, 0x31366241,
742b49b906SJohannes Goetzfried 	0x051ef495, 0xaa573b04, 0x4a805d8d,
752b49b906SJohannes Goetzfried 	0x548300d0, 0x00322a3c, 0xbf64cddf, 0xba57a68e, 0x75c6372b,
762b49b906SJohannes Goetzfried 	0x50afd341, 0xa7c13275, 0x915a0bf5,
772b49b906SJohannes Goetzfried 	0x6b54bfab, 0x2b0b1426, 0xab4cc9d7, 0x449ccd82, 0xf7fbf265,
782b49b906SJohannes Goetzfried 	0xab85c5f3, 0x1b55db94, 0xaad4e324,
792b49b906SJohannes Goetzfried 	0xcfa4bd3f, 0x2deaa3e2, 0x9e204d02, 0xc8bd25ac, 0xeadf55b3,
802b49b906SJohannes Goetzfried 	0xd5bd9e98, 0xe31231b2, 0x2ad5ad6c,
812b49b906SJohannes Goetzfried 	0x954329de, 0xadbe4528, 0xd8710f69, 0xaa51c90f, 0xaa786bf6,
822b49b906SJohannes Goetzfried 	0x22513f1e, 0xaa51a79b, 0x2ad344cc,
832b49b906SJohannes Goetzfried 	0x7b5a41f0, 0xd37cfbad, 0x1b069505, 0x41ece491, 0xb4c332e6,
842b49b906SJohannes Goetzfried 	0x032268d4, 0xc9600acc, 0xce387e6d,
852b49b906SJohannes Goetzfried 	0xbf6bb16c, 0x6a70fb78, 0x0d03d9c9, 0xd4df39de, 0xe01063da,
862b49b906SJohannes Goetzfried 	0x4736f464, 0x5ad328d8, 0xb347cc96,
872b49b906SJohannes Goetzfried 	0x75bb0fc3, 0x98511bfb, 0x4ffbcc35, 0xb58bcf6a, 0xe11f0abc,
882b49b906SJohannes Goetzfried 	0xbfc5fe4a, 0xa70aec10, 0xac39570a,
892b49b906SJohannes Goetzfried 	0x3f04442f, 0x6188b153, 0xe0397a2e, 0x5727cb79, 0x9ceb418f,
902b49b906SJohannes Goetzfried 	0x1cacd68d, 0x2ad37c96, 0x0175cb9d,
912b49b906SJohannes Goetzfried 	0xc69dff09, 0xc75b65f0, 0xd9db40d8, 0xec0e7779, 0x4744ead4,
922b49b906SJohannes Goetzfried 	0xb11c3274, 0xdd24cb9e, 0x7e1c54bd,
932b49b906SJohannes Goetzfried 	0xf01144f9, 0xd2240eb1, 0x9675b3fd, 0xa3ac3755, 0xd47c27af,
942b49b906SJohannes Goetzfried 	0x51c85f4d, 0x56907596, 0xa5bb15e6,
952b49b906SJohannes Goetzfried 	0x580304f0, 0xca042cf1, 0x011a37ea, 0x8dbfaadb, 0x35ba3e4a,
962b49b906SJohannes Goetzfried 	0x3526ffa0, 0xc37b4d09, 0xbc306ed9,
972b49b906SJohannes Goetzfried 	0x98a52666, 0x5648f725, 0xff5e569d, 0x0ced63d0, 0x7c63b2cf,
982b49b906SJohannes Goetzfried 	0x700b45e1, 0xd5ea50f1, 0x85a92872,
992b49b906SJohannes Goetzfried 	0xaf1fbda7, 0xd4234870, 0xa7870bf3, 0x2d3b4d79, 0x42e04198,
1002b49b906SJohannes Goetzfried 	0x0cd0ede7, 0x26470db8, 0xf881814c,
1012b49b906SJohannes Goetzfried 	0x474d6ad7, 0x7c0c5e5c, 0xd1231959, 0x381b7298, 0xf5d2f4db,
1022b49b906SJohannes Goetzfried 	0xab838653, 0x6e2f1e23, 0x83719c9e,
1032b49b906SJohannes Goetzfried 	0xbd91e046, 0x9a56456e, 0xdc39200c, 0x20c8c571, 0x962bda1c,
1042b49b906SJohannes Goetzfried 	0xe1e696ff, 0xb141ab08, 0x7cca89b9,
1052b49b906SJohannes Goetzfried 	0x1a69e783, 0x02cc4843, 0xa2f7c579, 0x429ef47d, 0x427b169c,
1062b49b906SJohannes Goetzfried 	0x5ac9f049, 0xdd8f0f00, 0x5c8165bf
1072b49b906SJohannes Goetzfried };
1082b49b906SJohannes Goetzfried EXPORT_SYMBOL_GPL(cast6_s1);
1092b49b906SJohannes Goetzfried 
1102b49b906SJohannes Goetzfried const u32 cast6_s2[256] = {
1112b49b906SJohannes Goetzfried 	0x1f201094, 0xef0ba75b, 0x69e3cf7e, 0x393f4380, 0xfe61cf7a,
1122b49b906SJohannes Goetzfried 	0xeec5207a, 0x55889c94, 0x72fc0651,
1132b49b906SJohannes Goetzfried 	0xada7ef79, 0x4e1d7235, 0xd55a63ce, 0xde0436ba, 0x99c430ef,
1142b49b906SJohannes Goetzfried 	0x5f0c0794, 0x18dcdb7d, 0xa1d6eff3,
1152b49b906SJohannes Goetzfried 	0xa0b52f7b, 0x59e83605, 0xee15b094, 0xe9ffd909, 0xdc440086,
1162b49b906SJohannes Goetzfried 	0xef944459, 0xba83ccb3, 0xe0c3cdfb,
1172b49b906SJohannes Goetzfried 	0xd1da4181, 0x3b092ab1, 0xf997f1c1, 0xa5e6cf7b, 0x01420ddb,
1182b49b906SJohannes Goetzfried 	0xe4e7ef5b, 0x25a1ff41, 0xe180f806,
1192b49b906SJohannes Goetzfried 	0x1fc41080, 0x179bee7a, 0xd37ac6a9, 0xfe5830a4, 0x98de8b7f,
1202b49b906SJohannes Goetzfried 	0x77e83f4e, 0x79929269, 0x24fa9f7b,
1212b49b906SJohannes Goetzfried 	0xe113c85b, 0xacc40083, 0xd7503525, 0xf7ea615f, 0x62143154,
1222b49b906SJohannes Goetzfried 	0x0d554b63, 0x5d681121, 0xc866c359,
1232b49b906SJohannes Goetzfried 	0x3d63cf73, 0xcee234c0, 0xd4d87e87, 0x5c672b21, 0x071f6181,
1242b49b906SJohannes Goetzfried 	0x39f7627f, 0x361e3084, 0xe4eb573b,
1252b49b906SJohannes Goetzfried 	0x602f64a4, 0xd63acd9c, 0x1bbc4635, 0x9e81032d, 0x2701f50c,
1262b49b906SJohannes Goetzfried 	0x99847ab4, 0xa0e3df79, 0xba6cf38c,
1272b49b906SJohannes Goetzfried 	0x10843094, 0x2537a95e, 0xf46f6ffe, 0xa1ff3b1f, 0x208cfb6a,
1282b49b906SJohannes Goetzfried 	0x8f458c74, 0xd9e0a227, 0x4ec73a34,
1292b49b906SJohannes Goetzfried 	0xfc884f69, 0x3e4de8df, 0xef0e0088, 0x3559648d, 0x8a45388c,
1302b49b906SJohannes Goetzfried 	0x1d804366, 0x721d9bfd, 0xa58684bb,
1312b49b906SJohannes Goetzfried 	0xe8256333, 0x844e8212, 0x128d8098, 0xfed33fb4, 0xce280ae1,
1322b49b906SJohannes Goetzfried 	0x27e19ba5, 0xd5a6c252, 0xe49754bd,
1332b49b906SJohannes Goetzfried 	0xc5d655dd, 0xeb667064, 0x77840b4d, 0xa1b6a801, 0x84db26a9,
1342b49b906SJohannes Goetzfried 	0xe0b56714, 0x21f043b7, 0xe5d05860,
1352b49b906SJohannes Goetzfried 	0x54f03084, 0x066ff472, 0xa31aa153, 0xdadc4755, 0xb5625dbf,
1362b49b906SJohannes Goetzfried 	0x68561be6, 0x83ca6b94, 0x2d6ed23b,
1372b49b906SJohannes Goetzfried 	0xeccf01db, 0xa6d3d0ba, 0xb6803d5c, 0xaf77a709, 0x33b4a34c,
1382b49b906SJohannes Goetzfried 	0x397bc8d6, 0x5ee22b95, 0x5f0e5304,
1392b49b906SJohannes Goetzfried 	0x81ed6f61, 0x20e74364, 0xb45e1378, 0xde18639b, 0x881ca122,
1402b49b906SJohannes Goetzfried 	0xb96726d1, 0x8049a7e8, 0x22b7da7b,
1412b49b906SJohannes Goetzfried 	0x5e552d25, 0x5272d237, 0x79d2951c, 0xc60d894c, 0x488cb402,
1422b49b906SJohannes Goetzfried 	0x1ba4fe5b, 0xa4b09f6b, 0x1ca815cf,
1432b49b906SJohannes Goetzfried 	0xa20c3005, 0x8871df63, 0xb9de2fcb, 0x0cc6c9e9, 0x0beeff53,
1442b49b906SJohannes Goetzfried 	0xe3214517, 0xb4542835, 0x9f63293c,
1452b49b906SJohannes Goetzfried 	0xee41e729, 0x6e1d2d7c, 0x50045286, 0x1e6685f3, 0xf33401c6,
1462b49b906SJohannes Goetzfried 	0x30a22c95, 0x31a70850, 0x60930f13,
1472b49b906SJohannes Goetzfried 	0x73f98417, 0xa1269859, 0xec645c44, 0x52c877a9, 0xcdff33a6,
1482b49b906SJohannes Goetzfried 	0xa02b1741, 0x7cbad9a2, 0x2180036f,
1492b49b906SJohannes Goetzfried 	0x50d99c08, 0xcb3f4861, 0xc26bd765, 0x64a3f6ab, 0x80342676,
1502b49b906SJohannes Goetzfried 	0x25a75e7b, 0xe4e6d1fc, 0x20c710e6,
1512b49b906SJohannes Goetzfried 	0xcdf0b680, 0x17844d3b, 0x31eef84d, 0x7e0824e4, 0x2ccb49eb,
1522b49b906SJohannes Goetzfried 	0x846a3bae, 0x8ff77888, 0xee5d60f6,
1532b49b906SJohannes Goetzfried 	0x7af75673, 0x2fdd5cdb, 0xa11631c1, 0x30f66f43, 0xb3faec54,
1542b49b906SJohannes Goetzfried 	0x157fd7fa, 0xef8579cc, 0xd152de58,
1552b49b906SJohannes Goetzfried 	0xdb2ffd5e, 0x8f32ce19, 0x306af97a, 0x02f03ef8, 0x99319ad5,
1562b49b906SJohannes Goetzfried 	0xc242fa0f, 0xa7e3ebb0, 0xc68e4906,
1572b49b906SJohannes Goetzfried 	0xb8da230c, 0x80823028, 0xdcdef3c8, 0xd35fb171, 0x088a1bc8,
1582b49b906SJohannes Goetzfried 	0xbec0c560, 0x61a3c9e8, 0xbca8f54d,
1592b49b906SJohannes Goetzfried 	0xc72feffa, 0x22822e99, 0x82c570b4, 0xd8d94e89, 0x8b1c34bc,
1602b49b906SJohannes Goetzfried 	0x301e16e6, 0x273be979, 0xb0ffeaa6,
1612b49b906SJohannes Goetzfried 	0x61d9b8c6, 0x00b24869, 0xb7ffce3f, 0x08dc283b, 0x43daf65a,
1622b49b906SJohannes Goetzfried 	0xf7e19798, 0x7619b72f, 0x8f1c9ba4,
1632b49b906SJohannes Goetzfried 	0xdc8637a0, 0x16a7d3b1, 0x9fc393b7, 0xa7136eeb, 0xc6bcc63e,
1642b49b906SJohannes Goetzfried 	0x1a513742, 0xef6828bc, 0x520365d6,
1652b49b906SJohannes Goetzfried 	0x2d6a77ab, 0x3527ed4b, 0x821fd216, 0x095c6e2e, 0xdb92f2fb,
1662b49b906SJohannes Goetzfried 	0x5eea29cb, 0x145892f5, 0x91584f7f,
1672b49b906SJohannes Goetzfried 	0x5483697b, 0x2667a8cc, 0x85196048, 0x8c4bacea, 0x833860d4,
1682b49b906SJohannes Goetzfried 	0x0d23e0f9, 0x6c387e8a, 0x0ae6d249,
1692b49b906SJohannes Goetzfried 	0xb284600c, 0xd835731d, 0xdcb1c647, 0xac4c56ea, 0x3ebd81b3,
1702b49b906SJohannes Goetzfried 	0x230eabb0, 0x6438bc87, 0xf0b5b1fa,
1712b49b906SJohannes Goetzfried 	0x8f5ea2b3, 0xfc184642, 0x0a036b7a, 0x4fb089bd, 0x649da589,
1722b49b906SJohannes Goetzfried 	0xa345415e, 0x5c038323, 0x3e5d3bb9,
1732b49b906SJohannes Goetzfried 	0x43d79572, 0x7e6dd07c, 0x06dfdf1e, 0x6c6cc4ef, 0x7160a539,
1742b49b906SJohannes Goetzfried 	0x73bfbe70, 0x83877605, 0x4523ecf1
1752b49b906SJohannes Goetzfried };
1762b49b906SJohannes Goetzfried EXPORT_SYMBOL_GPL(cast6_s2);
1772b49b906SJohannes Goetzfried 
1782b49b906SJohannes Goetzfried const u32 cast6_s3[256] = {
1792b49b906SJohannes Goetzfried 	0x8defc240, 0x25fa5d9f, 0xeb903dbf, 0xe810c907, 0x47607fff,
1802b49b906SJohannes Goetzfried 	0x369fe44b, 0x8c1fc644, 0xaececa90,
1812b49b906SJohannes Goetzfried 	0xbeb1f9bf, 0xeefbcaea, 0xe8cf1950, 0x51df07ae, 0x920e8806,
1822b49b906SJohannes Goetzfried 	0xf0ad0548, 0xe13c8d83, 0x927010d5,
1832b49b906SJohannes Goetzfried 	0x11107d9f, 0x07647db9, 0xb2e3e4d4, 0x3d4f285e, 0xb9afa820,
1842b49b906SJohannes Goetzfried 	0xfade82e0, 0xa067268b, 0x8272792e,
1852b49b906SJohannes Goetzfried 	0x553fb2c0, 0x489ae22b, 0xd4ef9794, 0x125e3fbc, 0x21fffcee,
1862b49b906SJohannes Goetzfried 	0x825b1bfd, 0x9255c5ed, 0x1257a240,
1872b49b906SJohannes Goetzfried 	0x4e1a8302, 0xbae07fff, 0x528246e7, 0x8e57140e, 0x3373f7bf,
1882b49b906SJohannes Goetzfried 	0x8c9f8188, 0xa6fc4ee8, 0xc982b5a5,
1892b49b906SJohannes Goetzfried 	0xa8c01db7, 0x579fc264, 0x67094f31, 0xf2bd3f5f, 0x40fff7c1,
1902b49b906SJohannes Goetzfried 	0x1fb78dfc, 0x8e6bd2c1, 0x437be59b,
1912b49b906SJohannes Goetzfried 	0x99b03dbf, 0xb5dbc64b, 0x638dc0e6, 0x55819d99, 0xa197c81c,
1922b49b906SJohannes Goetzfried 	0x4a012d6e, 0xc5884a28, 0xccc36f71,
1932b49b906SJohannes Goetzfried 	0xb843c213, 0x6c0743f1, 0x8309893c, 0x0feddd5f, 0x2f7fe850,
1942b49b906SJohannes Goetzfried 	0xd7c07f7e, 0x02507fbf, 0x5afb9a04,
1952b49b906SJohannes Goetzfried 	0xa747d2d0, 0x1651192e, 0xaf70bf3e, 0x58c31380, 0x5f98302e,
1962b49b906SJohannes Goetzfried 	0x727cc3c4, 0x0a0fb402, 0x0f7fef82,
1972b49b906SJohannes Goetzfried 	0x8c96fdad, 0x5d2c2aae, 0x8ee99a49, 0x50da88b8, 0x8427f4a0,
1982b49b906SJohannes Goetzfried 	0x1eac5790, 0x796fb449, 0x8252dc15,
1992b49b906SJohannes Goetzfried 	0xefbd7d9b, 0xa672597d, 0xada840d8, 0x45f54504, 0xfa5d7403,
2002b49b906SJohannes Goetzfried 	0xe83ec305, 0x4f91751a, 0x925669c2,
2012b49b906SJohannes Goetzfried 	0x23efe941, 0xa903f12e, 0x60270df2, 0x0276e4b6, 0x94fd6574,
2022b49b906SJohannes Goetzfried 	0x927985b2, 0x8276dbcb, 0x02778176,
2032b49b906SJohannes Goetzfried 	0xf8af918d, 0x4e48f79e, 0x8f616ddf, 0xe29d840e, 0x842f7d83,
2042b49b906SJohannes Goetzfried 	0x340ce5c8, 0x96bbb682, 0x93b4b148,
2052b49b906SJohannes Goetzfried 	0xef303cab, 0x984faf28, 0x779faf9b, 0x92dc560d, 0x224d1e20,
2062b49b906SJohannes Goetzfried 	0x8437aa88, 0x7d29dc96, 0x2756d3dc,
2072b49b906SJohannes Goetzfried 	0x8b907cee, 0xb51fd240, 0xe7c07ce3, 0xe566b4a1, 0xc3e9615e,
2082b49b906SJohannes Goetzfried 	0x3cf8209d, 0x6094d1e3, 0xcd9ca341,
2092b49b906SJohannes Goetzfried 	0x5c76460e, 0x00ea983b, 0xd4d67881, 0xfd47572c, 0xf76cedd9,
2102b49b906SJohannes Goetzfried 	0xbda8229c, 0x127dadaa, 0x438a074e,
2112b49b906SJohannes Goetzfried 	0x1f97c090, 0x081bdb8a, 0x93a07ebe, 0xb938ca15, 0x97b03cff,
2122b49b906SJohannes Goetzfried 	0x3dc2c0f8, 0x8d1ab2ec, 0x64380e51,
2132b49b906SJohannes Goetzfried 	0x68cc7bfb, 0xd90f2788, 0x12490181, 0x5de5ffd4, 0xdd7ef86a,
2142b49b906SJohannes Goetzfried 	0x76a2e214, 0xb9a40368, 0x925d958f,
2152b49b906SJohannes Goetzfried 	0x4b39fffa, 0xba39aee9, 0xa4ffd30b, 0xfaf7933b, 0x6d498623,
2162b49b906SJohannes Goetzfried 	0x193cbcfa, 0x27627545, 0x825cf47a,
2172b49b906SJohannes Goetzfried 	0x61bd8ba0, 0xd11e42d1, 0xcead04f4, 0x127ea392, 0x10428db7,
2182b49b906SJohannes Goetzfried 	0x8272a972, 0x9270c4a8, 0x127de50b,
2192b49b906SJohannes Goetzfried 	0x285ba1c8, 0x3c62f44f, 0x35c0eaa5, 0xe805d231, 0x428929fb,
2202b49b906SJohannes Goetzfried 	0xb4fcdf82, 0x4fb66a53, 0x0e7dc15b,
2212b49b906SJohannes Goetzfried 	0x1f081fab, 0x108618ae, 0xfcfd086d, 0xf9ff2889, 0x694bcc11,
2222b49b906SJohannes Goetzfried 	0x236a5cae, 0x12deca4d, 0x2c3f8cc5,
2232b49b906SJohannes Goetzfried 	0xd2d02dfe, 0xf8ef5896, 0xe4cf52da, 0x95155b67, 0x494a488c,
2242b49b906SJohannes Goetzfried 	0xb9b6a80c, 0x5c8f82bc, 0x89d36b45,
2252b49b906SJohannes Goetzfried 	0x3a609437, 0xec00c9a9, 0x44715253, 0x0a874b49, 0xd773bc40,
2262b49b906SJohannes Goetzfried 	0x7c34671c, 0x02717ef6, 0x4feb5536,
2272b49b906SJohannes Goetzfried 	0xa2d02fff, 0xd2bf60c4, 0xd43f03c0, 0x50b4ef6d, 0x07478cd1,
2282b49b906SJohannes Goetzfried 	0x006e1888, 0xa2e53f55, 0xb9e6d4bc,
2292b49b906SJohannes Goetzfried 	0xa2048016, 0x97573833, 0xd7207d67, 0xde0f8f3d, 0x72f87b33,
2302b49b906SJohannes Goetzfried 	0xabcc4f33, 0x7688c55d, 0x7b00a6b0,
2312b49b906SJohannes Goetzfried 	0x947b0001, 0x570075d2, 0xf9bb88f8, 0x8942019e, 0x4264a5ff,
2322b49b906SJohannes Goetzfried 	0x856302e0, 0x72dbd92b, 0xee971b69,
2332b49b906SJohannes Goetzfried 	0x6ea22fde, 0x5f08ae2b, 0xaf7a616d, 0xe5c98767, 0xcf1febd2,
2342b49b906SJohannes Goetzfried 	0x61efc8c2, 0xf1ac2571, 0xcc8239c2,
2352b49b906SJohannes Goetzfried 	0x67214cb8, 0xb1e583d1, 0xb7dc3e62, 0x7f10bdce, 0xf90a5c38,
2362b49b906SJohannes Goetzfried 	0x0ff0443d, 0x606e6dc6, 0x60543a49,
2372b49b906SJohannes Goetzfried 	0x5727c148, 0x2be98a1d, 0x8ab41738, 0x20e1be24, 0xaf96da0f,
2382b49b906SJohannes Goetzfried 	0x68458425, 0x99833be5, 0x600d457d,
2392b49b906SJohannes Goetzfried 	0x282f9350, 0x8334b362, 0xd91d1120, 0x2b6d8da0, 0x642b1e31,
2402b49b906SJohannes Goetzfried 	0x9c305a00, 0x52bce688, 0x1b03588a,
2412b49b906SJohannes Goetzfried 	0xf7baefd5, 0x4142ed9c, 0xa4315c11, 0x83323ec5, 0xdfef4636,
2422b49b906SJohannes Goetzfried 	0xa133c501, 0xe9d3531c, 0xee353783
2432b49b906SJohannes Goetzfried };
2442b49b906SJohannes Goetzfried EXPORT_SYMBOL_GPL(cast6_s3);
2452b49b906SJohannes Goetzfried 
2462b49b906SJohannes Goetzfried const u32 cast6_s4[256] = {
2472b49b906SJohannes Goetzfried 	0x9db30420, 0x1fb6e9de, 0xa7be7bef, 0xd273a298, 0x4a4f7bdb,
2482b49b906SJohannes Goetzfried 	0x64ad8c57, 0x85510443, 0xfa020ed1,
2492b49b906SJohannes Goetzfried 	0x7e287aff, 0xe60fb663, 0x095f35a1, 0x79ebf120, 0xfd059d43,
2502b49b906SJohannes Goetzfried 	0x6497b7b1, 0xf3641f63, 0x241e4adf,
2512b49b906SJohannes Goetzfried 	0x28147f5f, 0x4fa2b8cd, 0xc9430040, 0x0cc32220, 0xfdd30b30,
2522b49b906SJohannes Goetzfried 	0xc0a5374f, 0x1d2d00d9, 0x24147b15,
2532b49b906SJohannes Goetzfried 	0xee4d111a, 0x0fca5167, 0x71ff904c, 0x2d195ffe, 0x1a05645f,
2542b49b906SJohannes Goetzfried 	0x0c13fefe, 0x081b08ca, 0x05170121,
2552b49b906SJohannes Goetzfried 	0x80530100, 0xe83e5efe, 0xac9af4f8, 0x7fe72701, 0xd2b8ee5f,
2562b49b906SJohannes Goetzfried 	0x06df4261, 0xbb9e9b8a, 0x7293ea25,
2572b49b906SJohannes Goetzfried 	0xce84ffdf, 0xf5718801, 0x3dd64b04, 0xa26f263b, 0x7ed48400,
2582b49b906SJohannes Goetzfried 	0x547eebe6, 0x446d4ca0, 0x6cf3d6f5,
2592b49b906SJohannes Goetzfried 	0x2649abdf, 0xaea0c7f5, 0x36338cc1, 0x503f7e93, 0xd3772061,
2602b49b906SJohannes Goetzfried 	0x11b638e1, 0x72500e03, 0xf80eb2bb,
2612b49b906SJohannes Goetzfried 	0xabe0502e, 0xec8d77de, 0x57971e81, 0xe14f6746, 0xc9335400,
2622b49b906SJohannes Goetzfried 	0x6920318f, 0x081dbb99, 0xffc304a5,
2632b49b906SJohannes Goetzfried 	0x4d351805, 0x7f3d5ce3, 0xa6c866c6, 0x5d5bcca9, 0xdaec6fea,
2642b49b906SJohannes Goetzfried 	0x9f926f91, 0x9f46222f, 0x3991467d,
2652b49b906SJohannes Goetzfried 	0xa5bf6d8e, 0x1143c44f, 0x43958302, 0xd0214eeb, 0x022083b8,
2662b49b906SJohannes Goetzfried 	0x3fb6180c, 0x18f8931e, 0x281658e6,
2672b49b906SJohannes Goetzfried 	0x26486e3e, 0x8bd78a70, 0x7477e4c1, 0xb506e07c, 0xf32d0a25,
2682b49b906SJohannes Goetzfried 	0x79098b02, 0xe4eabb81, 0x28123b23,
2692b49b906SJohannes Goetzfried 	0x69dead38, 0x1574ca16, 0xdf871b62, 0x211c40b7, 0xa51a9ef9,
2702b49b906SJohannes Goetzfried 	0x0014377b, 0x041e8ac8, 0x09114003,
2712b49b906SJohannes Goetzfried 	0xbd59e4d2, 0xe3d156d5, 0x4fe876d5, 0x2f91a340, 0x557be8de,
2722b49b906SJohannes Goetzfried 	0x00eae4a7, 0x0ce5c2ec, 0x4db4bba6,
2732b49b906SJohannes Goetzfried 	0xe756bdff, 0xdd3369ac, 0xec17b035, 0x06572327, 0x99afc8b0,
2742b49b906SJohannes Goetzfried 	0x56c8c391, 0x6b65811c, 0x5e146119,
2752b49b906SJohannes Goetzfried 	0x6e85cb75, 0xbe07c002, 0xc2325577, 0x893ff4ec, 0x5bbfc92d,
2762b49b906SJohannes Goetzfried 	0xd0ec3b25, 0xb7801ab7, 0x8d6d3b24,
2772b49b906SJohannes Goetzfried 	0x20c763ef, 0xc366a5fc, 0x9c382880, 0x0ace3205, 0xaac9548a,
2782b49b906SJohannes Goetzfried 	0xeca1d7c7, 0x041afa32, 0x1d16625a,
2792b49b906SJohannes Goetzfried 	0x6701902c, 0x9b757a54, 0x31d477f7, 0x9126b031, 0x36cc6fdb,
2802b49b906SJohannes Goetzfried 	0xc70b8b46, 0xd9e66a48, 0x56e55a79,
2812b49b906SJohannes Goetzfried 	0x026a4ceb, 0x52437eff, 0x2f8f76b4, 0x0df980a5, 0x8674cde3,
2822b49b906SJohannes Goetzfried 	0xedda04eb, 0x17a9be04, 0x2c18f4df,
2832b49b906SJohannes Goetzfried 	0xb7747f9d, 0xab2af7b4, 0xefc34d20, 0x2e096b7c, 0x1741a254,
2842b49b906SJohannes Goetzfried 	0xe5b6a035, 0x213d42f6, 0x2c1c7c26,
2852b49b906SJohannes Goetzfried 	0x61c2f50f, 0x6552daf9, 0xd2c231f8, 0x25130f69, 0xd8167fa2,
2862b49b906SJohannes Goetzfried 	0x0418f2c8, 0x001a96a6, 0x0d1526ab,
2872b49b906SJohannes Goetzfried 	0x63315c21, 0x5e0a72ec, 0x49bafefd, 0x187908d9, 0x8d0dbd86,
2882b49b906SJohannes Goetzfried 	0x311170a7, 0x3e9b640c, 0xcc3e10d7,
2892b49b906SJohannes Goetzfried 	0xd5cad3b6, 0x0caec388, 0xf73001e1, 0x6c728aff, 0x71eae2a1,
2902b49b906SJohannes Goetzfried 	0x1f9af36e, 0xcfcbd12f, 0xc1de8417,
2912b49b906SJohannes Goetzfried 	0xac07be6b, 0xcb44a1d8, 0x8b9b0f56, 0x013988c3, 0xb1c52fca,
2922b49b906SJohannes Goetzfried 	0xb4be31cd, 0xd8782806, 0x12a3a4e2,
2932b49b906SJohannes Goetzfried 	0x6f7de532, 0x58fd7eb6, 0xd01ee900, 0x24adffc2, 0xf4990fc5,
2942b49b906SJohannes Goetzfried 	0x9711aac5, 0x001d7b95, 0x82e5e7d2,
2952b49b906SJohannes Goetzfried 	0x109873f6, 0x00613096, 0xc32d9521, 0xada121ff, 0x29908415,
2962b49b906SJohannes Goetzfried 	0x7fbb977f, 0xaf9eb3db, 0x29c9ed2a,
2972b49b906SJohannes Goetzfried 	0x5ce2a465, 0xa730f32c, 0xd0aa3fe8, 0x8a5cc091, 0xd49e2ce7,
2982b49b906SJohannes Goetzfried 	0x0ce454a9, 0xd60acd86, 0x015f1919,
2992b49b906SJohannes Goetzfried 	0x77079103, 0xdea03af6, 0x78a8565e, 0xdee356df, 0x21f05cbe,
3002b49b906SJohannes Goetzfried 	0x8b75e387, 0xb3c50651, 0xb8a5c3ef,
3012b49b906SJohannes Goetzfried 	0xd8eeb6d2, 0xe523be77, 0xc2154529, 0x2f69efdf, 0xafe67afb,
3022b49b906SJohannes Goetzfried 	0xf470c4b2, 0xf3e0eb5b, 0xd6cc9876,
3032b49b906SJohannes Goetzfried 	0x39e4460c, 0x1fda8538, 0x1987832f, 0xca007367, 0xa99144f8,
3042b49b906SJohannes Goetzfried 	0x296b299e, 0x492fc295, 0x9266beab,
3052b49b906SJohannes Goetzfried 	0xb5676e69, 0x9bd3ddda, 0xdf7e052f, 0xdb25701c, 0x1b5e51ee,
3062b49b906SJohannes Goetzfried 	0xf65324e6, 0x6afce36c, 0x0316cc04,
3072b49b906SJohannes Goetzfried 	0x8644213e, 0xb7dc59d0, 0x7965291f, 0xccd6fd43, 0x41823979,
3082b49b906SJohannes Goetzfried 	0x932bcdf6, 0xb657c34d, 0x4edfd282,
3092b49b906SJohannes Goetzfried 	0x7ae5290c, 0x3cb9536b, 0x851e20fe, 0x9833557e, 0x13ecf0b0,
3102b49b906SJohannes Goetzfried 	0xd3ffb372, 0x3f85c5c1, 0x0aef7ed2
3112b49b906SJohannes Goetzfried };
3122b49b906SJohannes Goetzfried EXPORT_SYMBOL_GPL(cast6_s4);
3132b49b906SJohannes Goetzfried 
3142b49b906SJohannes Goetzfried static const u32 Tm[24][8] = {
3152b49b906SJohannes Goetzfried 	{ 0x5a827999, 0xc95c653a, 0x383650db, 0xa7103c7c, 0x15ea281d,
3162b49b906SJohannes Goetzfried 		0x84c413be, 0xf39dff5f, 0x6277eb00 } ,
3172b49b906SJohannes Goetzfried 	{ 0xd151d6a1, 0x402bc242, 0xaf05ade3, 0x1ddf9984, 0x8cb98525,
3182b49b906SJohannes Goetzfried 		0xfb9370c6, 0x6a6d5c67, 0xd9474808 } ,
3192b49b906SJohannes Goetzfried 	{ 0x482133a9, 0xb6fb1f4a, 0x25d50aeb, 0x94aef68c, 0x0388e22d,
3202b49b906SJohannes Goetzfried 		0x7262cdce, 0xe13cb96f, 0x5016a510 } ,
3212b49b906SJohannes Goetzfried 	{ 0xbef090b1, 0x2dca7c52, 0x9ca467f3, 0x0b7e5394, 0x7a583f35,
3222b49b906SJohannes Goetzfried 		0xe9322ad6, 0x580c1677, 0xc6e60218 } ,
3232b49b906SJohannes Goetzfried 	{ 0x35bfedb9, 0xa499d95a, 0x1373c4fb, 0x824db09c, 0xf1279c3d,
3242b49b906SJohannes Goetzfried 		0x600187de, 0xcedb737f, 0x3db55f20 } ,
3252b49b906SJohannes Goetzfried 	{ 0xac8f4ac1, 0x1b693662, 0x8a432203, 0xf91d0da4, 0x67f6f945,
3262b49b906SJohannes Goetzfried 		0xd6d0e4e6, 0x45aad087, 0xb484bc28 } ,
3272b49b906SJohannes Goetzfried 	{ 0x235ea7c9, 0x9238936a, 0x01127f0b, 0x6fec6aac, 0xdec6564d,
3282b49b906SJohannes Goetzfried 		0x4da041ee, 0xbc7a2d8f, 0x2b541930 } ,
3292b49b906SJohannes Goetzfried 	{ 0x9a2e04d1, 0x0907f072, 0x77e1dc13, 0xe6bbc7b4, 0x5595b355,
3302b49b906SJohannes Goetzfried 		0xc46f9ef6, 0x33498a97, 0xa2237638 } ,
3312b49b906SJohannes Goetzfried 	{ 0x10fd61d9, 0x7fd74d7a, 0xeeb1391b, 0x5d8b24bc, 0xcc65105d,
3322b49b906SJohannes Goetzfried 		0x3b3efbfe, 0xaa18e79f, 0x18f2d340 } ,
3332b49b906SJohannes Goetzfried 	{ 0x87ccbee1, 0xf6a6aa82, 0x65809623, 0xd45a81c4, 0x43346d65,
3342b49b906SJohannes Goetzfried 		0xb20e5906, 0x20e844a7, 0x8fc23048 } ,
3352b49b906SJohannes Goetzfried 	{ 0xfe9c1be9, 0x6d76078a, 0xdc4ff32b, 0x4b29decc, 0xba03ca6d,
3362b49b906SJohannes Goetzfried 		0x28ddb60e, 0x97b7a1af, 0x06918d50 } ,
3372b49b906SJohannes Goetzfried 	{ 0x756b78f1, 0xe4456492, 0x531f5033, 0xc1f93bd4, 0x30d32775,
3382b49b906SJohannes Goetzfried 		0x9fad1316, 0x0e86feb7, 0x7d60ea58 } ,
3392b49b906SJohannes Goetzfried 	{ 0xec3ad5f9, 0x5b14c19a, 0xc9eead3b, 0x38c898dc, 0xa7a2847d,
3402b49b906SJohannes Goetzfried 		0x167c701e, 0x85565bbf, 0xf4304760 } ,
3412b49b906SJohannes Goetzfried 	{ 0x630a3301, 0xd1e41ea2, 0x40be0a43, 0xaf97f5e4, 0x1e71e185,
3422b49b906SJohannes Goetzfried 		0x8d4bcd26, 0xfc25b8c7, 0x6affa468 } ,
3432b49b906SJohannes Goetzfried 	{ 0xd9d99009, 0x48b37baa, 0xb78d674b, 0x266752ec, 0x95413e8d,
3442b49b906SJohannes Goetzfried 		0x041b2a2e, 0x72f515cf, 0xe1cf0170 } ,
3452b49b906SJohannes Goetzfried 	{ 0x50a8ed11, 0xbf82d8b2, 0x2e5cc453, 0x9d36aff4, 0x0c109b95,
3462b49b906SJohannes Goetzfried 		0x7aea8736, 0xe9c472d7, 0x589e5e78 } ,
3472b49b906SJohannes Goetzfried 	{ 0xc7784a19, 0x365235ba, 0xa52c215b, 0x14060cfc, 0x82dff89d,
3482b49b906SJohannes Goetzfried 		0xf1b9e43e, 0x6093cfdf, 0xcf6dbb80 } ,
3492b49b906SJohannes Goetzfried 	{ 0x3e47a721, 0xad2192c2, 0x1bfb7e63, 0x8ad56a04, 0xf9af55a5,
3502b49b906SJohannes Goetzfried 		0x68894146, 0xd7632ce7, 0x463d1888 } ,
3512b49b906SJohannes Goetzfried 	{ 0xb5170429, 0x23f0efca, 0x92cadb6b, 0x01a4c70c, 0x707eb2ad,
3522b49b906SJohannes Goetzfried 		0xdf589e4e, 0x4e3289ef, 0xbd0c7590 } ,
3532b49b906SJohannes Goetzfried 	{ 0x2be66131, 0x9ac04cd2, 0x099a3873, 0x78742414, 0xe74e0fb5,
3542b49b906SJohannes Goetzfried 		0x5627fb56, 0xc501e6f7, 0x33dbd298 } ,
3552b49b906SJohannes Goetzfried 	{ 0xa2b5be39, 0x118fa9da, 0x8069957b, 0xef43811c, 0x5e1d6cbd,
3562b49b906SJohannes Goetzfried 		0xccf7585e, 0x3bd143ff, 0xaaab2fa0 } ,
3572b49b906SJohannes Goetzfried 	{ 0x19851b41, 0x885f06e2, 0xf738f283, 0x6612de24, 0xd4ecc9c5,
3582b49b906SJohannes Goetzfried 		0x43c6b566, 0xb2a0a107, 0x217a8ca8 } ,
3592b49b906SJohannes Goetzfried 	{ 0x90547849, 0xff2e63ea, 0x6e084f8b, 0xdce23b2c, 0x4bbc26cd,
3602b49b906SJohannes Goetzfried 		0xba96126e, 0x296ffe0f, 0x9849e9b0 } ,
3612b49b906SJohannes Goetzfried 	{ 0x0723d551, 0x75fdc0f2, 0xe4d7ac93, 0x53b19834, 0xc28b83d5,
3622b49b906SJohannes Goetzfried 		0x31656f76, 0xa03f5b17, 0x0f1946b8 }
3632b49b906SJohannes Goetzfried };
3642b49b906SJohannes Goetzfried 
3652b49b906SJohannes Goetzfried static const u8 Tr[4][8] = {
3662b49b906SJohannes Goetzfried 	{ 0x13, 0x04, 0x15, 0x06, 0x17, 0x08, 0x19, 0x0a } ,
3672b49b906SJohannes Goetzfried 	{ 0x1b, 0x0c, 0x1d, 0x0e, 0x1f, 0x10, 0x01, 0x12 } ,
3682b49b906SJohannes Goetzfried 	{ 0x03, 0x14, 0x05, 0x16, 0x07, 0x18, 0x09, 0x1a } ,
3692b49b906SJohannes Goetzfried 	{ 0x0b, 0x1c, 0x0d, 0x1e, 0x0f, 0x00, 0x11, 0x02 }
3702b49b906SJohannes Goetzfried };
3712b49b906SJohannes Goetzfried 
3722b49b906SJohannes Goetzfried /* forward octave */
373*312639bbSJussi Kivilinna static inline void W(u32 *key, unsigned int i)
3742b49b906SJohannes Goetzfried {
3752b49b906SJohannes Goetzfried 	u32 I;
3762b49b906SJohannes Goetzfried 	key[6] ^= F1(key[7], Tr[i % 4][0], Tm[i][0]);
3772b49b906SJohannes Goetzfried 	key[5] ^= F2(key[6], Tr[i % 4][1], Tm[i][1]);
3782b49b906SJohannes Goetzfried 	key[4] ^= F3(key[5], Tr[i % 4][2], Tm[i][2]);
3792b49b906SJohannes Goetzfried 	key[3] ^= F1(key[4], Tr[i % 4][3], Tm[i][3]);
3802b49b906SJohannes Goetzfried 	key[2] ^= F2(key[3], Tr[i % 4][4], Tm[i][4]);
3812b49b906SJohannes Goetzfried 	key[1] ^= F3(key[2], Tr[i % 4][5], Tm[i][5]);
3822b49b906SJohannes Goetzfried 	key[0] ^= F1(key[1], Tr[i % 4][6], Tm[i][6]);
3832b49b906SJohannes Goetzfried 	key[7] ^= F2(key[0], Tr[i % 4][7], Tm[i][7]);
3842b49b906SJohannes Goetzfried }
3852b49b906SJohannes Goetzfried 
3862b49b906SJohannes Goetzfried int __cast6_setkey(struct cast6_ctx *c, const u8 *in_key,
3872b49b906SJohannes Goetzfried 		   unsigned key_len, u32 *flags)
3882b49b906SJohannes Goetzfried {
3892b49b906SJohannes Goetzfried 	int i;
3902b49b906SJohannes Goetzfried 	u32 key[8];
3912b49b906SJohannes Goetzfried 	__be32 p_key[8]; /* padded key */
3922b49b906SJohannes Goetzfried 
3932b49b906SJohannes Goetzfried 	if (key_len % 4 != 0) {
3942b49b906SJohannes Goetzfried 		*flags |= CRYPTO_TFM_RES_BAD_KEY_LEN;
3952b49b906SJohannes Goetzfried 		return -EINVAL;
3962b49b906SJohannes Goetzfried 	}
3972b49b906SJohannes Goetzfried 
3982b49b906SJohannes Goetzfried 	memset(p_key, 0, 32);
3992b49b906SJohannes Goetzfried 	memcpy(p_key, in_key, key_len);
4002b49b906SJohannes Goetzfried 
4012b49b906SJohannes Goetzfried 	key[0] = be32_to_cpu(p_key[0]);		/* A */
4022b49b906SJohannes Goetzfried 	key[1] = be32_to_cpu(p_key[1]);		/* B */
4032b49b906SJohannes Goetzfried 	key[2] = be32_to_cpu(p_key[2]);		/* C */
4042b49b906SJohannes Goetzfried 	key[3] = be32_to_cpu(p_key[3]);		/* D */
4052b49b906SJohannes Goetzfried 	key[4] = be32_to_cpu(p_key[4]);		/* E */
4062b49b906SJohannes Goetzfried 	key[5] = be32_to_cpu(p_key[5]);		/* F */
4072b49b906SJohannes Goetzfried 	key[6] = be32_to_cpu(p_key[6]);		/* G */
4082b49b906SJohannes Goetzfried 	key[7] = be32_to_cpu(p_key[7]);		/* H */
4092b49b906SJohannes Goetzfried 
4102b49b906SJohannes Goetzfried 	for (i = 0; i < 12; i++) {
4112b49b906SJohannes Goetzfried 		W(key, 2 * i);
4122b49b906SJohannes Goetzfried 		W(key, 2 * i + 1);
4132b49b906SJohannes Goetzfried 
4142b49b906SJohannes Goetzfried 		c->Kr[i][0] = key[0] & 0x1f;
4152b49b906SJohannes Goetzfried 		c->Kr[i][1] = key[2] & 0x1f;
4162b49b906SJohannes Goetzfried 		c->Kr[i][2] = key[4] & 0x1f;
4172b49b906SJohannes Goetzfried 		c->Kr[i][3] = key[6] & 0x1f;
4182b49b906SJohannes Goetzfried 
4192b49b906SJohannes Goetzfried 		c->Km[i][0] = key[7];
4202b49b906SJohannes Goetzfried 		c->Km[i][1] = key[5];
4212b49b906SJohannes Goetzfried 		c->Km[i][2] = key[3];
4222b49b906SJohannes Goetzfried 		c->Km[i][3] = key[1];
4232b49b906SJohannes Goetzfried 	}
4242b49b906SJohannes Goetzfried 
4252b49b906SJohannes Goetzfried 	return 0;
4262b49b906SJohannes Goetzfried }
4272b49b906SJohannes Goetzfried EXPORT_SYMBOL_GPL(__cast6_setkey);
4282b49b906SJohannes Goetzfried 
4292b49b906SJohannes Goetzfried int cast6_setkey(struct crypto_tfm *tfm, const u8 *key, unsigned int keylen)
4302b49b906SJohannes Goetzfried {
4312b49b906SJohannes Goetzfried 	return __cast6_setkey(crypto_tfm_ctx(tfm), key, keylen,
4322b49b906SJohannes Goetzfried 			      &tfm->crt_flags);
4332b49b906SJohannes Goetzfried }
4342b49b906SJohannes Goetzfried EXPORT_SYMBOL_GPL(cast6_setkey);
4352b49b906SJohannes Goetzfried 
4362b49b906SJohannes Goetzfried /*forward quad round*/
437*312639bbSJussi Kivilinna static inline void Q(u32 *block, u8 *Kr, u32 *Km)
4382b49b906SJohannes Goetzfried {
4392b49b906SJohannes Goetzfried 	u32 I;
4402b49b906SJohannes Goetzfried 	block[2] ^= F1(block[3], Kr[0], Km[0]);
4412b49b906SJohannes Goetzfried 	block[1] ^= F2(block[2], Kr[1], Km[1]);
4422b49b906SJohannes Goetzfried 	block[0] ^= F3(block[1], Kr[2], Km[2]);
4432b49b906SJohannes Goetzfried 	block[3] ^= F1(block[0], Kr[3], Km[3]);
4442b49b906SJohannes Goetzfried }
4452b49b906SJohannes Goetzfried 
4462b49b906SJohannes Goetzfried /*reverse quad round*/
447*312639bbSJussi Kivilinna static inline void QBAR(u32 *block, u8 *Kr, u32 *Km)
4482b49b906SJohannes Goetzfried {
4492b49b906SJohannes Goetzfried 	u32 I;
4502b49b906SJohannes Goetzfried 	block[3] ^= F1(block[0], Kr[3], Km[3]);
4512b49b906SJohannes Goetzfried 	block[0] ^= F3(block[1], Kr[2], Km[2]);
4522b49b906SJohannes Goetzfried 	block[1] ^= F2(block[2], Kr[1], Km[1]);
4532b49b906SJohannes Goetzfried 	block[2] ^= F1(block[3], Kr[0], Km[0]);
4542b49b906SJohannes Goetzfried }
4552b49b906SJohannes Goetzfried 
4562b49b906SJohannes Goetzfried void __cast6_encrypt(struct cast6_ctx *c, u8 *outbuf, const u8 *inbuf)
4572b49b906SJohannes Goetzfried {
4582b49b906SJohannes Goetzfried 	const __be32 *src = (const __be32 *)inbuf;
4592b49b906SJohannes Goetzfried 	__be32 *dst = (__be32 *)outbuf;
4602b49b906SJohannes Goetzfried 	u32 block[4];
4612b49b906SJohannes Goetzfried 	u32 *Km;
4622b49b906SJohannes Goetzfried 	u8 *Kr;
4632b49b906SJohannes Goetzfried 
4642b49b906SJohannes Goetzfried 	block[0] = be32_to_cpu(src[0]);
4652b49b906SJohannes Goetzfried 	block[1] = be32_to_cpu(src[1]);
4662b49b906SJohannes Goetzfried 	block[2] = be32_to_cpu(src[2]);
4672b49b906SJohannes Goetzfried 	block[3] = be32_to_cpu(src[3]);
4682b49b906SJohannes Goetzfried 
4692b49b906SJohannes Goetzfried 	Km = c->Km[0]; Kr = c->Kr[0]; Q(block, Kr, Km);
4702b49b906SJohannes Goetzfried 	Km = c->Km[1]; Kr = c->Kr[1]; Q(block, Kr, Km);
4712b49b906SJohannes Goetzfried 	Km = c->Km[2]; Kr = c->Kr[2]; Q(block, Kr, Km);
4722b49b906SJohannes Goetzfried 	Km = c->Km[3]; Kr = c->Kr[3]; Q(block, Kr, Km);
4732b49b906SJohannes Goetzfried 	Km = c->Km[4]; Kr = c->Kr[4]; Q(block, Kr, Km);
4742b49b906SJohannes Goetzfried 	Km = c->Km[5]; Kr = c->Kr[5]; Q(block, Kr, Km);
4752b49b906SJohannes Goetzfried 	Km = c->Km[6]; Kr = c->Kr[6]; QBAR(block, Kr, Km);
4762b49b906SJohannes Goetzfried 	Km = c->Km[7]; Kr = c->Kr[7]; QBAR(block, Kr, Km);
4772b49b906SJohannes Goetzfried 	Km = c->Km[8]; Kr = c->Kr[8]; QBAR(block, Kr, Km);
4782b49b906SJohannes Goetzfried 	Km = c->Km[9]; Kr = c->Kr[9]; QBAR(block, Kr, Km);
4792b49b906SJohannes Goetzfried 	Km = c->Km[10]; Kr = c->Kr[10]; QBAR(block, Kr, Km);
4802b49b906SJohannes Goetzfried 	Km = c->Km[11]; Kr = c->Kr[11]; QBAR(block, Kr, Km);
4812b49b906SJohannes Goetzfried 
4822b49b906SJohannes Goetzfried 	dst[0] = cpu_to_be32(block[0]);
4832b49b906SJohannes Goetzfried 	dst[1] = cpu_to_be32(block[1]);
4842b49b906SJohannes Goetzfried 	dst[2] = cpu_to_be32(block[2]);
4852b49b906SJohannes Goetzfried 	dst[3] = cpu_to_be32(block[3]);
4862b49b906SJohannes Goetzfried }
4872b49b906SJohannes Goetzfried EXPORT_SYMBOL_GPL(__cast6_encrypt);
4882b49b906SJohannes Goetzfried 
4892b49b906SJohannes Goetzfried static void cast6_encrypt(struct crypto_tfm *tfm, u8 *outbuf, const u8 *inbuf)
4902b49b906SJohannes Goetzfried {
4912b49b906SJohannes Goetzfried 	__cast6_encrypt(crypto_tfm_ctx(tfm), outbuf, inbuf);
4922b49b906SJohannes Goetzfried }
4932b49b906SJohannes Goetzfried 
4942b49b906SJohannes Goetzfried void __cast6_decrypt(struct cast6_ctx *c, u8 *outbuf, const u8 *inbuf)
4952b49b906SJohannes Goetzfried {
4962b49b906SJohannes Goetzfried 	const __be32 *src = (const __be32 *)inbuf;
4972b49b906SJohannes Goetzfried 	__be32 *dst = (__be32 *)outbuf;
4982b49b906SJohannes Goetzfried 	u32 block[4];
4992b49b906SJohannes Goetzfried 	u32 *Km;
5002b49b906SJohannes Goetzfried 	u8 *Kr;
5012b49b906SJohannes Goetzfried 
5022b49b906SJohannes Goetzfried 	block[0] = be32_to_cpu(src[0]);
5032b49b906SJohannes Goetzfried 	block[1] = be32_to_cpu(src[1]);
5042b49b906SJohannes Goetzfried 	block[2] = be32_to_cpu(src[2]);
5052b49b906SJohannes Goetzfried 	block[3] = be32_to_cpu(src[3]);
5062b49b906SJohannes Goetzfried 
5072b49b906SJohannes Goetzfried 	Km = c->Km[11]; Kr = c->Kr[11]; Q(block, Kr, Km);
5082b49b906SJohannes Goetzfried 	Km = c->Km[10]; Kr = c->Kr[10]; Q(block, Kr, Km);
5092b49b906SJohannes Goetzfried 	Km = c->Km[9]; Kr = c->Kr[9]; Q(block, Kr, Km);
5102b49b906SJohannes Goetzfried 	Km = c->Km[8]; Kr = c->Kr[8]; Q(block, Kr, Km);
5112b49b906SJohannes Goetzfried 	Km = c->Km[7]; Kr = c->Kr[7]; Q(block, Kr, Km);
5122b49b906SJohannes Goetzfried 	Km = c->Km[6]; Kr = c->Kr[6]; Q(block, Kr, Km);
5132b49b906SJohannes Goetzfried 	Km = c->Km[5]; Kr = c->Kr[5]; QBAR(block, Kr, Km);
5142b49b906SJohannes Goetzfried 	Km = c->Km[4]; Kr = c->Kr[4]; QBAR(block, Kr, Km);
5152b49b906SJohannes Goetzfried 	Km = c->Km[3]; Kr = c->Kr[3]; QBAR(block, Kr, Km);
5162b49b906SJohannes Goetzfried 	Km = c->Km[2]; Kr = c->Kr[2]; QBAR(block, Kr, Km);
5172b49b906SJohannes Goetzfried 	Km = c->Km[1]; Kr = c->Kr[1]; QBAR(block, Kr, Km);
5182b49b906SJohannes Goetzfried 	Km = c->Km[0]; Kr = c->Kr[0]; QBAR(block, Kr, Km);
5192b49b906SJohannes Goetzfried 
5202b49b906SJohannes Goetzfried 	dst[0] = cpu_to_be32(block[0]);
5212b49b906SJohannes Goetzfried 	dst[1] = cpu_to_be32(block[1]);
5222b49b906SJohannes Goetzfried 	dst[2] = cpu_to_be32(block[2]);
5232b49b906SJohannes Goetzfried 	dst[3] = cpu_to_be32(block[3]);
5242b49b906SJohannes Goetzfried }
5252b49b906SJohannes Goetzfried EXPORT_SYMBOL_GPL(__cast6_decrypt);
5262b49b906SJohannes Goetzfried 
5272b49b906SJohannes Goetzfried static void cast6_decrypt(struct crypto_tfm *tfm, u8 *outbuf, const u8 *inbuf)
5282b49b906SJohannes Goetzfried {
5292b49b906SJohannes Goetzfried 	__cast6_decrypt(crypto_tfm_ctx(tfm), outbuf, inbuf);
5302b49b906SJohannes Goetzfried }
5312b49b906SJohannes Goetzfried 
5322b49b906SJohannes Goetzfried static struct crypto_alg alg = {
5332b49b906SJohannes Goetzfried 	.cra_name = "cast6",
5342b49b906SJohannes Goetzfried 	.cra_driver_name = "cast6-generic",
5352b49b906SJohannes Goetzfried 	.cra_priority = 100,
5362b49b906SJohannes Goetzfried 	.cra_flags = CRYPTO_ALG_TYPE_CIPHER,
5372b49b906SJohannes Goetzfried 	.cra_blocksize = CAST6_BLOCK_SIZE,
5382b49b906SJohannes Goetzfried 	.cra_ctxsize = sizeof(struct cast6_ctx),
5392b49b906SJohannes Goetzfried 	.cra_alignmask = 3,
5402b49b906SJohannes Goetzfried 	.cra_module = THIS_MODULE,
5412b49b906SJohannes Goetzfried 	.cra_u = {
5422b49b906SJohannes Goetzfried 		  .cipher = {
5432b49b906SJohannes Goetzfried 			     .cia_min_keysize = CAST6_MIN_KEY_SIZE,
5442b49b906SJohannes Goetzfried 			     .cia_max_keysize = CAST6_MAX_KEY_SIZE,
5452b49b906SJohannes Goetzfried 			     .cia_setkey = cast6_setkey,
5462b49b906SJohannes Goetzfried 			     .cia_encrypt = cast6_encrypt,
5472b49b906SJohannes Goetzfried 			     .cia_decrypt = cast6_decrypt}
5482b49b906SJohannes Goetzfried 		  }
5492b49b906SJohannes Goetzfried };
5502b49b906SJohannes Goetzfried 
5512b49b906SJohannes Goetzfried static int __init cast6_mod_init(void)
5522b49b906SJohannes Goetzfried {
5532b49b906SJohannes Goetzfried 	return crypto_register_alg(&alg);
5542b49b906SJohannes Goetzfried }
5552b49b906SJohannes Goetzfried 
5562b49b906SJohannes Goetzfried static void __exit cast6_mod_fini(void)
5572b49b906SJohannes Goetzfried {
5582b49b906SJohannes Goetzfried 	crypto_unregister_alg(&alg);
5592b49b906SJohannes Goetzfried }
5602b49b906SJohannes Goetzfried 
5612b49b906SJohannes Goetzfried module_init(cast6_mod_init);
5622b49b906SJohannes Goetzfried module_exit(cast6_mod_fini);
5632b49b906SJohannes Goetzfried 
5642b49b906SJohannes Goetzfried MODULE_LICENSE("GPL");
5652b49b906SJohannes Goetzfried MODULE_DESCRIPTION("Cast6 Cipher Algorithm");
5662b49b906SJohannes Goetzfried MODULE_ALIAS("cast6");
567