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