xref: /openbmc/linux/crypto/cast5_generic.c (revision 05bcf503)
1 /* Kernel cryptographic api.
2 * cast5.c - Cast5 cipher algorithm (rfc2144).
3 *
4 * Derived from GnuPG implementation of cast5.
5 *
6 * Major Changes.
7 *	Complete conformance to rfc2144.
8 *	Supports key size from 40 to 128 bits.
9 *
10 * Copyright (C) 1998, 1999, 2000, 2001 Free Software Foundation, Inc.
11 * Copyright (C) 2003 Kartikey Mahendra Bhatt <kartik_me@hotmail.com>.
12 *
13 * This program is free software; you can redistribute it and/or modify it
14 * under the terms of GNU General Public License as published by the Free
15 * Software Foundation; either version 2 of the License, or (at your option)
16 * any later version.
17 *
18 * You should have received a copy of the GNU General Public License
19 * along with this program; if not, write to the Free Software
20 * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA
21 */
22 
23 
24 #include <asm/byteorder.h>
25 #include <linux/init.h>
26 #include <linux/crypto.h>
27 #include <linux/module.h>
28 #include <linux/errno.h>
29 #include <linux/string.h>
30 #include <linux/types.h>
31 #include <crypto/cast5.h>
32 
33 
34 const u32 cast5_s1[256] = {
35 	0x30fb40d4, 0x9fa0ff0b, 0x6beccd2f, 0x3f258c7a, 0x1e213f2f,
36 	0x9c004dd3, 0x6003e540, 0xcf9fc949,
37 	0xbfd4af27, 0x88bbbdb5, 0xe2034090, 0x98d09675, 0x6e63a0e0,
38 	0x15c361d2, 0xc2e7661d, 0x22d4ff8e,
39 	0x28683b6f, 0xc07fd059, 0xff2379c8, 0x775f50e2, 0x43c340d3,
40 	0xdf2f8656, 0x887ca41a, 0xa2d2bd2d,
41 	0xa1c9e0d6, 0x346c4819, 0x61b76d87, 0x22540f2f, 0x2abe32e1,
42 	0xaa54166b, 0x22568e3a, 0xa2d341d0,
43 	0x66db40c8, 0xa784392f, 0x004dff2f, 0x2db9d2de, 0x97943fac,
44 	0x4a97c1d8, 0x527644b7, 0xb5f437a7,
45 	0xb82cbaef, 0xd751d159, 0x6ff7f0ed, 0x5a097a1f, 0x827b68d0,
46 	0x90ecf52e, 0x22b0c054, 0xbc8e5935,
47 	0x4b6d2f7f, 0x50bb64a2, 0xd2664910, 0xbee5812d, 0xb7332290,
48 	0xe93b159f, 0xb48ee411, 0x4bff345d,
49 	0xfd45c240, 0xad31973f, 0xc4f6d02e, 0x55fc8165, 0xd5b1caad,
50 	0xa1ac2dae, 0xa2d4b76d, 0xc19b0c50,
51 	0x882240f2, 0x0c6e4f38, 0xa4e4bfd7, 0x4f5ba272, 0x564c1d2f,
52 	0xc59c5319, 0xb949e354, 0xb04669fe,
53 	0xb1b6ab8a, 0xc71358dd, 0x6385c545, 0x110f935d, 0x57538ad5,
54 	0x6a390493, 0xe63d37e0, 0x2a54f6b3,
55 	0x3a787d5f, 0x6276a0b5, 0x19a6fcdf, 0x7a42206a, 0x29f9d4d5,
56 	0xf61b1891, 0xbb72275e, 0xaa508167,
57 	0x38901091, 0xc6b505eb, 0x84c7cb8c, 0x2ad75a0f, 0x874a1427,
58 	0xa2d1936b, 0x2ad286af, 0xaa56d291,
59 	0xd7894360, 0x425c750d, 0x93b39e26, 0x187184c9, 0x6c00b32d,
60 	0x73e2bb14, 0xa0bebc3c, 0x54623779,
61 	0x64459eab, 0x3f328b82, 0x7718cf82, 0x59a2cea6, 0x04ee002e,
62 	0x89fe78e6, 0x3fab0950, 0x325ff6c2,
63 	0x81383f05, 0x6963c5c8, 0x76cb5ad6, 0xd49974c9, 0xca180dcf,
64 	0x380782d5, 0xc7fa5cf6, 0x8ac31511,
65 	0x35e79e13, 0x47da91d0, 0xf40f9086, 0xa7e2419e, 0x31366241,
66 	0x051ef495, 0xaa573b04, 0x4a805d8d,
67 	0x548300d0, 0x00322a3c, 0xbf64cddf, 0xba57a68e, 0x75c6372b,
68 	0x50afd341, 0xa7c13275, 0x915a0bf5,
69 	0x6b54bfab, 0x2b0b1426, 0xab4cc9d7, 0x449ccd82, 0xf7fbf265,
70 	0xab85c5f3, 0x1b55db94, 0xaad4e324,
71 	0xcfa4bd3f, 0x2deaa3e2, 0x9e204d02, 0xc8bd25ac, 0xeadf55b3,
72 	0xd5bd9e98, 0xe31231b2, 0x2ad5ad6c,
73 	0x954329de, 0xadbe4528, 0xd8710f69, 0xaa51c90f, 0xaa786bf6,
74 	0x22513f1e, 0xaa51a79b, 0x2ad344cc,
75 	0x7b5a41f0, 0xd37cfbad, 0x1b069505, 0x41ece491, 0xb4c332e6,
76 	0x032268d4, 0xc9600acc, 0xce387e6d,
77 	0xbf6bb16c, 0x6a70fb78, 0x0d03d9c9, 0xd4df39de, 0xe01063da,
78 	0x4736f464, 0x5ad328d8, 0xb347cc96,
79 	0x75bb0fc3, 0x98511bfb, 0x4ffbcc35, 0xb58bcf6a, 0xe11f0abc,
80 	0xbfc5fe4a, 0xa70aec10, 0xac39570a,
81 	0x3f04442f, 0x6188b153, 0xe0397a2e, 0x5727cb79, 0x9ceb418f,
82 	0x1cacd68d, 0x2ad37c96, 0x0175cb9d,
83 	0xc69dff09, 0xc75b65f0, 0xd9db40d8, 0xec0e7779, 0x4744ead4,
84 	0xb11c3274, 0xdd24cb9e, 0x7e1c54bd,
85 	0xf01144f9, 0xd2240eb1, 0x9675b3fd, 0xa3ac3755, 0xd47c27af,
86 	0x51c85f4d, 0x56907596, 0xa5bb15e6,
87 	0x580304f0, 0xca042cf1, 0x011a37ea, 0x8dbfaadb, 0x35ba3e4a,
88 	0x3526ffa0, 0xc37b4d09, 0xbc306ed9,
89 	0x98a52666, 0x5648f725, 0xff5e569d, 0x0ced63d0, 0x7c63b2cf,
90 	0x700b45e1, 0xd5ea50f1, 0x85a92872,
91 	0xaf1fbda7, 0xd4234870, 0xa7870bf3, 0x2d3b4d79, 0x42e04198,
92 	0x0cd0ede7, 0x26470db8, 0xf881814c,
93 	0x474d6ad7, 0x7c0c5e5c, 0xd1231959, 0x381b7298, 0xf5d2f4db,
94 	0xab838653, 0x6e2f1e23, 0x83719c9e,
95 	0xbd91e046, 0x9a56456e, 0xdc39200c, 0x20c8c571, 0x962bda1c,
96 	0xe1e696ff, 0xb141ab08, 0x7cca89b9,
97 	0x1a69e783, 0x02cc4843, 0xa2f7c579, 0x429ef47d, 0x427b169c,
98 	0x5ac9f049, 0xdd8f0f00, 0x5c8165bf
99 };
100 EXPORT_SYMBOL_GPL(cast5_s1);
101 const u32 cast5_s2[256] = {
102 	0x1f201094, 0xef0ba75b, 0x69e3cf7e, 0x393f4380, 0xfe61cf7a,
103 	0xeec5207a, 0x55889c94, 0x72fc0651,
104 	0xada7ef79, 0x4e1d7235, 0xd55a63ce, 0xde0436ba, 0x99c430ef,
105 	0x5f0c0794, 0x18dcdb7d, 0xa1d6eff3,
106 	0xa0b52f7b, 0x59e83605, 0xee15b094, 0xe9ffd909, 0xdc440086,
107 	0xef944459, 0xba83ccb3, 0xe0c3cdfb,
108 	0xd1da4181, 0x3b092ab1, 0xf997f1c1, 0xa5e6cf7b, 0x01420ddb,
109 	0xe4e7ef5b, 0x25a1ff41, 0xe180f806,
110 	0x1fc41080, 0x179bee7a, 0xd37ac6a9, 0xfe5830a4, 0x98de8b7f,
111 	0x77e83f4e, 0x79929269, 0x24fa9f7b,
112 	0xe113c85b, 0xacc40083, 0xd7503525, 0xf7ea615f, 0x62143154,
113 	0x0d554b63, 0x5d681121, 0xc866c359,
114 	0x3d63cf73, 0xcee234c0, 0xd4d87e87, 0x5c672b21, 0x071f6181,
115 	0x39f7627f, 0x361e3084, 0xe4eb573b,
116 	0x602f64a4, 0xd63acd9c, 0x1bbc4635, 0x9e81032d, 0x2701f50c,
117 	0x99847ab4, 0xa0e3df79, 0xba6cf38c,
118 	0x10843094, 0x2537a95e, 0xf46f6ffe, 0xa1ff3b1f, 0x208cfb6a,
119 	0x8f458c74, 0xd9e0a227, 0x4ec73a34,
120 	0xfc884f69, 0x3e4de8df, 0xef0e0088, 0x3559648d, 0x8a45388c,
121 	0x1d804366, 0x721d9bfd, 0xa58684bb,
122 	0xe8256333, 0x844e8212, 0x128d8098, 0xfed33fb4, 0xce280ae1,
123 	0x27e19ba5, 0xd5a6c252, 0xe49754bd,
124 	0xc5d655dd, 0xeb667064, 0x77840b4d, 0xa1b6a801, 0x84db26a9,
125 	0xe0b56714, 0x21f043b7, 0xe5d05860,
126 	0x54f03084, 0x066ff472, 0xa31aa153, 0xdadc4755, 0xb5625dbf,
127 	0x68561be6, 0x83ca6b94, 0x2d6ed23b,
128 	0xeccf01db, 0xa6d3d0ba, 0xb6803d5c, 0xaf77a709, 0x33b4a34c,
129 	0x397bc8d6, 0x5ee22b95, 0x5f0e5304,
130 	0x81ed6f61, 0x20e74364, 0xb45e1378, 0xde18639b, 0x881ca122,
131 	0xb96726d1, 0x8049a7e8, 0x22b7da7b,
132 	0x5e552d25, 0x5272d237, 0x79d2951c, 0xc60d894c, 0x488cb402,
133 	0x1ba4fe5b, 0xa4b09f6b, 0x1ca815cf,
134 	0xa20c3005, 0x8871df63, 0xb9de2fcb, 0x0cc6c9e9, 0x0beeff53,
135 	0xe3214517, 0xb4542835, 0x9f63293c,
136 	0xee41e729, 0x6e1d2d7c, 0x50045286, 0x1e6685f3, 0xf33401c6,
137 	0x30a22c95, 0x31a70850, 0x60930f13,
138 	0x73f98417, 0xa1269859, 0xec645c44, 0x52c877a9, 0xcdff33a6,
139 	0xa02b1741, 0x7cbad9a2, 0x2180036f,
140 	0x50d99c08, 0xcb3f4861, 0xc26bd765, 0x64a3f6ab, 0x80342676,
141 	0x25a75e7b, 0xe4e6d1fc, 0x20c710e6,
142 	0xcdf0b680, 0x17844d3b, 0x31eef84d, 0x7e0824e4, 0x2ccb49eb,
143 	0x846a3bae, 0x8ff77888, 0xee5d60f6,
144 	0x7af75673, 0x2fdd5cdb, 0xa11631c1, 0x30f66f43, 0xb3faec54,
145 	0x157fd7fa, 0xef8579cc, 0xd152de58,
146 	0xdb2ffd5e, 0x8f32ce19, 0x306af97a, 0x02f03ef8, 0x99319ad5,
147 	0xc242fa0f, 0xa7e3ebb0, 0xc68e4906,
148 	0xb8da230c, 0x80823028, 0xdcdef3c8, 0xd35fb171, 0x088a1bc8,
149 	0xbec0c560, 0x61a3c9e8, 0xbca8f54d,
150 	0xc72feffa, 0x22822e99, 0x82c570b4, 0xd8d94e89, 0x8b1c34bc,
151 	0x301e16e6, 0x273be979, 0xb0ffeaa6,
152 	0x61d9b8c6, 0x00b24869, 0xb7ffce3f, 0x08dc283b, 0x43daf65a,
153 	0xf7e19798, 0x7619b72f, 0x8f1c9ba4,
154 	0xdc8637a0, 0x16a7d3b1, 0x9fc393b7, 0xa7136eeb, 0xc6bcc63e,
155 	0x1a513742, 0xef6828bc, 0x520365d6,
156 	0x2d6a77ab, 0x3527ed4b, 0x821fd216, 0x095c6e2e, 0xdb92f2fb,
157 	0x5eea29cb, 0x145892f5, 0x91584f7f,
158 	0x5483697b, 0x2667a8cc, 0x85196048, 0x8c4bacea, 0x833860d4,
159 	0x0d23e0f9, 0x6c387e8a, 0x0ae6d249,
160 	0xb284600c, 0xd835731d, 0xdcb1c647, 0xac4c56ea, 0x3ebd81b3,
161 	0x230eabb0, 0x6438bc87, 0xf0b5b1fa,
162 	0x8f5ea2b3, 0xfc184642, 0x0a036b7a, 0x4fb089bd, 0x649da589,
163 	0xa345415e, 0x5c038323, 0x3e5d3bb9,
164 	0x43d79572, 0x7e6dd07c, 0x06dfdf1e, 0x6c6cc4ef, 0x7160a539,
165 	0x73bfbe70, 0x83877605, 0x4523ecf1
166 };
167 EXPORT_SYMBOL_GPL(cast5_s2);
168 const u32 cast5_s3[256] = {
169 	0x8defc240, 0x25fa5d9f, 0xeb903dbf, 0xe810c907, 0x47607fff,
170 	0x369fe44b, 0x8c1fc644, 0xaececa90,
171 	0xbeb1f9bf, 0xeefbcaea, 0xe8cf1950, 0x51df07ae, 0x920e8806,
172 	0xf0ad0548, 0xe13c8d83, 0x927010d5,
173 	0x11107d9f, 0x07647db9, 0xb2e3e4d4, 0x3d4f285e, 0xb9afa820,
174 	0xfade82e0, 0xa067268b, 0x8272792e,
175 	0x553fb2c0, 0x489ae22b, 0xd4ef9794, 0x125e3fbc, 0x21fffcee,
176 	0x825b1bfd, 0x9255c5ed, 0x1257a240,
177 	0x4e1a8302, 0xbae07fff, 0x528246e7, 0x8e57140e, 0x3373f7bf,
178 	0x8c9f8188, 0xa6fc4ee8, 0xc982b5a5,
179 	0xa8c01db7, 0x579fc264, 0x67094f31, 0xf2bd3f5f, 0x40fff7c1,
180 	0x1fb78dfc, 0x8e6bd2c1, 0x437be59b,
181 	0x99b03dbf, 0xb5dbc64b, 0x638dc0e6, 0x55819d99, 0xa197c81c,
182 	0x4a012d6e, 0xc5884a28, 0xccc36f71,
183 	0xb843c213, 0x6c0743f1, 0x8309893c, 0x0feddd5f, 0x2f7fe850,
184 	0xd7c07f7e, 0x02507fbf, 0x5afb9a04,
185 	0xa747d2d0, 0x1651192e, 0xaf70bf3e, 0x58c31380, 0x5f98302e,
186 	0x727cc3c4, 0x0a0fb402, 0x0f7fef82,
187 	0x8c96fdad, 0x5d2c2aae, 0x8ee99a49, 0x50da88b8, 0x8427f4a0,
188 	0x1eac5790, 0x796fb449, 0x8252dc15,
189 	0xefbd7d9b, 0xa672597d, 0xada840d8, 0x45f54504, 0xfa5d7403,
190 	0xe83ec305, 0x4f91751a, 0x925669c2,
191 	0x23efe941, 0xa903f12e, 0x60270df2, 0x0276e4b6, 0x94fd6574,
192 	0x927985b2, 0x8276dbcb, 0x02778176,
193 	0xf8af918d, 0x4e48f79e, 0x8f616ddf, 0xe29d840e, 0x842f7d83,
194 	0x340ce5c8, 0x96bbb682, 0x93b4b148,
195 	0xef303cab, 0x984faf28, 0x779faf9b, 0x92dc560d, 0x224d1e20,
196 	0x8437aa88, 0x7d29dc96, 0x2756d3dc,
197 	0x8b907cee, 0xb51fd240, 0xe7c07ce3, 0xe566b4a1, 0xc3e9615e,
198 	0x3cf8209d, 0x6094d1e3, 0xcd9ca341,
199 	0x5c76460e, 0x00ea983b, 0xd4d67881, 0xfd47572c, 0xf76cedd9,
200 	0xbda8229c, 0x127dadaa, 0x438a074e,
201 	0x1f97c090, 0x081bdb8a, 0x93a07ebe, 0xb938ca15, 0x97b03cff,
202 	0x3dc2c0f8, 0x8d1ab2ec, 0x64380e51,
203 	0x68cc7bfb, 0xd90f2788, 0x12490181, 0x5de5ffd4, 0xdd7ef86a,
204 	0x76a2e214, 0xb9a40368, 0x925d958f,
205 	0x4b39fffa, 0xba39aee9, 0xa4ffd30b, 0xfaf7933b, 0x6d498623,
206 	0x193cbcfa, 0x27627545, 0x825cf47a,
207 	0x61bd8ba0, 0xd11e42d1, 0xcead04f4, 0x127ea392, 0x10428db7,
208 	0x8272a972, 0x9270c4a8, 0x127de50b,
209 	0x285ba1c8, 0x3c62f44f, 0x35c0eaa5, 0xe805d231, 0x428929fb,
210 	0xb4fcdf82, 0x4fb66a53, 0x0e7dc15b,
211 	0x1f081fab, 0x108618ae, 0xfcfd086d, 0xf9ff2889, 0x694bcc11,
212 	0x236a5cae, 0x12deca4d, 0x2c3f8cc5,
213 	0xd2d02dfe, 0xf8ef5896, 0xe4cf52da, 0x95155b67, 0x494a488c,
214 	0xb9b6a80c, 0x5c8f82bc, 0x89d36b45,
215 	0x3a609437, 0xec00c9a9, 0x44715253, 0x0a874b49, 0xd773bc40,
216 	0x7c34671c, 0x02717ef6, 0x4feb5536,
217 	0xa2d02fff, 0xd2bf60c4, 0xd43f03c0, 0x50b4ef6d, 0x07478cd1,
218 	0x006e1888, 0xa2e53f55, 0xb9e6d4bc,
219 	0xa2048016, 0x97573833, 0xd7207d67, 0xde0f8f3d, 0x72f87b33,
220 	0xabcc4f33, 0x7688c55d, 0x7b00a6b0,
221 	0x947b0001, 0x570075d2, 0xf9bb88f8, 0x8942019e, 0x4264a5ff,
222 	0x856302e0, 0x72dbd92b, 0xee971b69,
223 	0x6ea22fde, 0x5f08ae2b, 0xaf7a616d, 0xe5c98767, 0xcf1febd2,
224 	0x61efc8c2, 0xf1ac2571, 0xcc8239c2,
225 	0x67214cb8, 0xb1e583d1, 0xb7dc3e62, 0x7f10bdce, 0xf90a5c38,
226 	0x0ff0443d, 0x606e6dc6, 0x60543a49,
227 	0x5727c148, 0x2be98a1d, 0x8ab41738, 0x20e1be24, 0xaf96da0f,
228 	0x68458425, 0x99833be5, 0x600d457d,
229 	0x282f9350, 0x8334b362, 0xd91d1120, 0x2b6d8da0, 0x642b1e31,
230 	0x9c305a00, 0x52bce688, 0x1b03588a,
231 	0xf7baefd5, 0x4142ed9c, 0xa4315c11, 0x83323ec5, 0xdfef4636,
232 	0xa133c501, 0xe9d3531c, 0xee353783
233 };
234 EXPORT_SYMBOL_GPL(cast5_s3);
235 const u32 cast5_s4[256] = {
236 	0x9db30420, 0x1fb6e9de, 0xa7be7bef, 0xd273a298, 0x4a4f7bdb,
237 	0x64ad8c57, 0x85510443, 0xfa020ed1,
238 	0x7e287aff, 0xe60fb663, 0x095f35a1, 0x79ebf120, 0xfd059d43,
239 	0x6497b7b1, 0xf3641f63, 0x241e4adf,
240 	0x28147f5f, 0x4fa2b8cd, 0xc9430040, 0x0cc32220, 0xfdd30b30,
241 	0xc0a5374f, 0x1d2d00d9, 0x24147b15,
242 	0xee4d111a, 0x0fca5167, 0x71ff904c, 0x2d195ffe, 0x1a05645f,
243 	0x0c13fefe, 0x081b08ca, 0x05170121,
244 	0x80530100, 0xe83e5efe, 0xac9af4f8, 0x7fe72701, 0xd2b8ee5f,
245 	0x06df4261, 0xbb9e9b8a, 0x7293ea25,
246 	0xce84ffdf, 0xf5718801, 0x3dd64b04, 0xa26f263b, 0x7ed48400,
247 	0x547eebe6, 0x446d4ca0, 0x6cf3d6f5,
248 	0x2649abdf, 0xaea0c7f5, 0x36338cc1, 0x503f7e93, 0xd3772061,
249 	0x11b638e1, 0x72500e03, 0xf80eb2bb,
250 	0xabe0502e, 0xec8d77de, 0x57971e81, 0xe14f6746, 0xc9335400,
251 	0x6920318f, 0x081dbb99, 0xffc304a5,
252 	0x4d351805, 0x7f3d5ce3, 0xa6c866c6, 0x5d5bcca9, 0xdaec6fea,
253 	0x9f926f91, 0x9f46222f, 0x3991467d,
254 	0xa5bf6d8e, 0x1143c44f, 0x43958302, 0xd0214eeb, 0x022083b8,
255 	0x3fb6180c, 0x18f8931e, 0x281658e6,
256 	0x26486e3e, 0x8bd78a70, 0x7477e4c1, 0xb506e07c, 0xf32d0a25,
257 	0x79098b02, 0xe4eabb81, 0x28123b23,
258 	0x69dead38, 0x1574ca16, 0xdf871b62, 0x211c40b7, 0xa51a9ef9,
259 	0x0014377b, 0x041e8ac8, 0x09114003,
260 	0xbd59e4d2, 0xe3d156d5, 0x4fe876d5, 0x2f91a340, 0x557be8de,
261 	0x00eae4a7, 0x0ce5c2ec, 0x4db4bba6,
262 	0xe756bdff, 0xdd3369ac, 0xec17b035, 0x06572327, 0x99afc8b0,
263 	0x56c8c391, 0x6b65811c, 0x5e146119,
264 	0x6e85cb75, 0xbe07c002, 0xc2325577, 0x893ff4ec, 0x5bbfc92d,
265 	0xd0ec3b25, 0xb7801ab7, 0x8d6d3b24,
266 	0x20c763ef, 0xc366a5fc, 0x9c382880, 0x0ace3205, 0xaac9548a,
267 	0xeca1d7c7, 0x041afa32, 0x1d16625a,
268 	0x6701902c, 0x9b757a54, 0x31d477f7, 0x9126b031, 0x36cc6fdb,
269 	0xc70b8b46, 0xd9e66a48, 0x56e55a79,
270 	0x026a4ceb, 0x52437eff, 0x2f8f76b4, 0x0df980a5, 0x8674cde3,
271 	0xedda04eb, 0x17a9be04, 0x2c18f4df,
272 	0xb7747f9d, 0xab2af7b4, 0xefc34d20, 0x2e096b7c, 0x1741a254,
273 	0xe5b6a035, 0x213d42f6, 0x2c1c7c26,
274 	0x61c2f50f, 0x6552daf9, 0xd2c231f8, 0x25130f69, 0xd8167fa2,
275 	0x0418f2c8, 0x001a96a6, 0x0d1526ab,
276 	0x63315c21, 0x5e0a72ec, 0x49bafefd, 0x187908d9, 0x8d0dbd86,
277 	0x311170a7, 0x3e9b640c, 0xcc3e10d7,
278 	0xd5cad3b6, 0x0caec388, 0xf73001e1, 0x6c728aff, 0x71eae2a1,
279 	0x1f9af36e, 0xcfcbd12f, 0xc1de8417,
280 	0xac07be6b, 0xcb44a1d8, 0x8b9b0f56, 0x013988c3, 0xb1c52fca,
281 	0xb4be31cd, 0xd8782806, 0x12a3a4e2,
282 	0x6f7de532, 0x58fd7eb6, 0xd01ee900, 0x24adffc2, 0xf4990fc5,
283 	0x9711aac5, 0x001d7b95, 0x82e5e7d2,
284 	0x109873f6, 0x00613096, 0xc32d9521, 0xada121ff, 0x29908415,
285 	0x7fbb977f, 0xaf9eb3db, 0x29c9ed2a,
286 	0x5ce2a465, 0xa730f32c, 0xd0aa3fe8, 0x8a5cc091, 0xd49e2ce7,
287 	0x0ce454a9, 0xd60acd86, 0x015f1919,
288 	0x77079103, 0xdea03af6, 0x78a8565e, 0xdee356df, 0x21f05cbe,
289 	0x8b75e387, 0xb3c50651, 0xb8a5c3ef,
290 	0xd8eeb6d2, 0xe523be77, 0xc2154529, 0x2f69efdf, 0xafe67afb,
291 	0xf470c4b2, 0xf3e0eb5b, 0xd6cc9876,
292 	0x39e4460c, 0x1fda8538, 0x1987832f, 0xca007367, 0xa99144f8,
293 	0x296b299e, 0x492fc295, 0x9266beab,
294 	0xb5676e69, 0x9bd3ddda, 0xdf7e052f, 0xdb25701c, 0x1b5e51ee,
295 	0xf65324e6, 0x6afce36c, 0x0316cc04,
296 	0x8644213e, 0xb7dc59d0, 0x7965291f, 0xccd6fd43, 0x41823979,
297 	0x932bcdf6, 0xb657c34d, 0x4edfd282,
298 	0x7ae5290c, 0x3cb9536b, 0x851e20fe, 0x9833557e, 0x13ecf0b0,
299 	0xd3ffb372, 0x3f85c5c1, 0x0aef7ed2
300 };
301 EXPORT_SYMBOL_GPL(cast5_s4);
302 static const u32 s5[256] = {
303 	0x7ec90c04, 0x2c6e74b9, 0x9b0e66df, 0xa6337911, 0xb86a7fff,
304 	0x1dd358f5, 0x44dd9d44, 0x1731167f,
305 	0x08fbf1fa, 0xe7f511cc, 0xd2051b00, 0x735aba00, 0x2ab722d8,
306 	0x386381cb, 0xacf6243a, 0x69befd7a,
307 	0xe6a2e77f, 0xf0c720cd, 0xc4494816, 0xccf5c180, 0x38851640,
308 	0x15b0a848, 0xe68b18cb, 0x4caadeff,
309 	0x5f480a01, 0x0412b2aa, 0x259814fc, 0x41d0efe2, 0x4e40b48d,
310 	0x248eb6fb, 0x8dba1cfe, 0x41a99b02,
311 	0x1a550a04, 0xba8f65cb, 0x7251f4e7, 0x95a51725, 0xc106ecd7,
312 	0x97a5980a, 0xc539b9aa, 0x4d79fe6a,
313 	0xf2f3f763, 0x68af8040, 0xed0c9e56, 0x11b4958b, 0xe1eb5a88,
314 	0x8709e6b0, 0xd7e07156, 0x4e29fea7,
315 	0x6366e52d, 0x02d1c000, 0xc4ac8e05, 0x9377f571, 0x0c05372a,
316 	0x578535f2, 0x2261be02, 0xd642a0c9,
317 	0xdf13a280, 0x74b55bd2, 0x682199c0, 0xd421e5ec, 0x53fb3ce8,
318 	0xc8adedb3, 0x28a87fc9, 0x3d959981,
319 	0x5c1ff900, 0xfe38d399, 0x0c4eff0b, 0x062407ea, 0xaa2f4fb1,
320 	0x4fb96976, 0x90c79505, 0xb0a8a774,
321 	0xef55a1ff, 0xe59ca2c2, 0xa6b62d27, 0xe66a4263, 0xdf65001f,
322 	0x0ec50966, 0xdfdd55bc, 0x29de0655,
323 	0x911e739a, 0x17af8975, 0x32c7911c, 0x89f89468, 0x0d01e980,
324 	0x524755f4, 0x03b63cc9, 0x0cc844b2,
325 	0xbcf3f0aa, 0x87ac36e9, 0xe53a7426, 0x01b3d82b, 0x1a9e7449,
326 	0x64ee2d7e, 0xcddbb1da, 0x01c94910,
327 	0xb868bf80, 0x0d26f3fd, 0x9342ede7, 0x04a5c284, 0x636737b6,
328 	0x50f5b616, 0xf24766e3, 0x8eca36c1,
329 	0x136e05db, 0xfef18391, 0xfb887a37, 0xd6e7f7d4, 0xc7fb7dc9,
330 	0x3063fcdf, 0xb6f589de, 0xec2941da,
331 	0x26e46695, 0xb7566419, 0xf654efc5, 0xd08d58b7, 0x48925401,
332 	0xc1bacb7f, 0xe5ff550f, 0xb6083049,
333 	0x5bb5d0e8, 0x87d72e5a, 0xab6a6ee1, 0x223a66ce, 0xc62bf3cd,
334 	0x9e0885f9, 0x68cb3e47, 0x086c010f,
335 	0xa21de820, 0xd18b69de, 0xf3f65777, 0xfa02c3f6, 0x407edac3,
336 	0xcbb3d550, 0x1793084d, 0xb0d70eba,
337 	0x0ab378d5, 0xd951fb0c, 0xded7da56, 0x4124bbe4, 0x94ca0b56,
338 	0x0f5755d1, 0xe0e1e56e, 0x6184b5be,
339 	0x580a249f, 0x94f74bc0, 0xe327888e, 0x9f7b5561, 0xc3dc0280,
340 	0x05687715, 0x646c6bd7, 0x44904db3,
341 	0x66b4f0a3, 0xc0f1648a, 0x697ed5af, 0x49e92ff6, 0x309e374f,
342 	0x2cb6356a, 0x85808573, 0x4991f840,
343 	0x76f0ae02, 0x083be84d, 0x28421c9a, 0x44489406, 0x736e4cb8,
344 	0xc1092910, 0x8bc95fc6, 0x7d869cf4,
345 	0x134f616f, 0x2e77118d, 0xb31b2be1, 0xaa90b472, 0x3ca5d717,
346 	0x7d161bba, 0x9cad9010, 0xaf462ba2,
347 	0x9fe459d2, 0x45d34559, 0xd9f2da13, 0xdbc65487, 0xf3e4f94e,
348 	0x176d486f, 0x097c13ea, 0x631da5c7,
349 	0x445f7382, 0x175683f4, 0xcdc66a97, 0x70be0288, 0xb3cdcf72,
350 	0x6e5dd2f3, 0x20936079, 0x459b80a5,
351 	0xbe60e2db, 0xa9c23101, 0xeba5315c, 0x224e42f2, 0x1c5c1572,
352 	0xf6721b2c, 0x1ad2fff3, 0x8c25404e,
353 	0x324ed72f, 0x4067b7fd, 0x0523138e, 0x5ca3bc78, 0xdc0fd66e,
354 	0x75922283, 0x784d6b17, 0x58ebb16e,
355 	0x44094f85, 0x3f481d87, 0xfcfeae7b, 0x77b5ff76, 0x8c2302bf,
356 	0xaaf47556, 0x5f46b02a, 0x2b092801,
357 	0x3d38f5f7, 0x0ca81f36, 0x52af4a8a, 0x66d5e7c0, 0xdf3b0874,
358 	0x95055110, 0x1b5ad7a8, 0xf61ed5ad,
359 	0x6cf6e479, 0x20758184, 0xd0cefa65, 0x88f7be58, 0x4a046826,
360 	0x0ff6f8f3, 0xa09c7f70, 0x5346aba0,
361 	0x5ce96c28, 0xe176eda3, 0x6bac307f, 0x376829d2, 0x85360fa9,
362 	0x17e3fe2a, 0x24b79767, 0xf5a96b20,
363 	0xd6cd2595, 0x68ff1ebf, 0x7555442c, 0xf19f06be, 0xf9e0659a,
364 	0xeeb9491d, 0x34010718, 0xbb30cab8,
365 	0xe822fe15, 0x88570983, 0x750e6249, 0xda627e55, 0x5e76ffa8,
366 	0xb1534546, 0x6d47de08, 0xefe9e7d4
367 };
368 static const u32 s6[256] = {
369 	0xf6fa8f9d, 0x2cac6ce1, 0x4ca34867, 0xe2337f7c, 0x95db08e7,
370 	0x016843b4, 0xeced5cbc, 0x325553ac,
371 	0xbf9f0960, 0xdfa1e2ed, 0x83f0579d, 0x63ed86b9, 0x1ab6a6b8,
372 	0xde5ebe39, 0xf38ff732, 0x8989b138,
373 	0x33f14961, 0xc01937bd, 0xf506c6da, 0xe4625e7e, 0xa308ea99,
374 	0x4e23e33c, 0x79cbd7cc, 0x48a14367,
375 	0xa3149619, 0xfec94bd5, 0xa114174a, 0xeaa01866, 0xa084db2d,
376 	0x09a8486f, 0xa888614a, 0x2900af98,
377 	0x01665991, 0xe1992863, 0xc8f30c60, 0x2e78ef3c, 0xd0d51932,
378 	0xcf0fec14, 0xf7ca07d2, 0xd0a82072,
379 	0xfd41197e, 0x9305a6b0, 0xe86be3da, 0x74bed3cd, 0x372da53c,
380 	0x4c7f4448, 0xdab5d440, 0x6dba0ec3,
381 	0x083919a7, 0x9fbaeed9, 0x49dbcfb0, 0x4e670c53, 0x5c3d9c01,
382 	0x64bdb941, 0x2c0e636a, 0xba7dd9cd,
383 	0xea6f7388, 0xe70bc762, 0x35f29adb, 0x5c4cdd8d, 0xf0d48d8c,
384 	0xb88153e2, 0x08a19866, 0x1ae2eac8,
385 	0x284caf89, 0xaa928223, 0x9334be53, 0x3b3a21bf, 0x16434be3,
386 	0x9aea3906, 0xefe8c36e, 0xf890cdd9,
387 	0x80226dae, 0xc340a4a3, 0xdf7e9c09, 0xa694a807, 0x5b7c5ecc,
388 	0x221db3a6, 0x9a69a02f, 0x68818a54,
389 	0xceb2296f, 0x53c0843a, 0xfe893655, 0x25bfe68a, 0xb4628abc,
390 	0xcf222ebf, 0x25ac6f48, 0xa9a99387,
391 	0x53bddb65, 0xe76ffbe7, 0xe967fd78, 0x0ba93563, 0x8e342bc1,
392 	0xe8a11be9, 0x4980740d, 0xc8087dfc,
393 	0x8de4bf99, 0xa11101a0, 0x7fd37975, 0xda5a26c0, 0xe81f994f,
394 	0x9528cd89, 0xfd339fed, 0xb87834bf,
395 	0x5f04456d, 0x22258698, 0xc9c4c83b, 0x2dc156be, 0x4f628daa,
396 	0x57f55ec5, 0xe2220abe, 0xd2916ebf,
397 	0x4ec75b95, 0x24f2c3c0, 0x42d15d99, 0xcd0d7fa0, 0x7b6e27ff,
398 	0xa8dc8af0, 0x7345c106, 0xf41e232f,
399 	0x35162386, 0xe6ea8926, 0x3333b094, 0x157ec6f2, 0x372b74af,
400 	0x692573e4, 0xe9a9d848, 0xf3160289,
401 	0x3a62ef1d, 0xa787e238, 0xf3a5f676, 0x74364853, 0x20951063,
402 	0x4576698d, 0xb6fad407, 0x592af950,
403 	0x36f73523, 0x4cfb6e87, 0x7da4cec0, 0x6c152daa, 0xcb0396a8,
404 	0xc50dfe5d, 0xfcd707ab, 0x0921c42f,
405 	0x89dff0bb, 0x5fe2be78, 0x448f4f33, 0x754613c9, 0x2b05d08d,
406 	0x48b9d585, 0xdc049441, 0xc8098f9b,
407 	0x7dede786, 0xc39a3373, 0x42410005, 0x6a091751, 0x0ef3c8a6,
408 	0x890072d6, 0x28207682, 0xa9a9f7be,
409 	0xbf32679d, 0xd45b5b75, 0xb353fd00, 0xcbb0e358, 0x830f220a,
410 	0x1f8fb214, 0xd372cf08, 0xcc3c4a13,
411 	0x8cf63166, 0x061c87be, 0x88c98f88, 0x6062e397, 0x47cf8e7a,
412 	0xb6c85283, 0x3cc2acfb, 0x3fc06976,
413 	0x4e8f0252, 0x64d8314d, 0xda3870e3, 0x1e665459, 0xc10908f0,
414 	0x513021a5, 0x6c5b68b7, 0x822f8aa0,
415 	0x3007cd3e, 0x74719eef, 0xdc872681, 0x073340d4, 0x7e432fd9,
416 	0x0c5ec241, 0x8809286c, 0xf592d891,
417 	0x08a930f6, 0x957ef305, 0xb7fbffbd, 0xc266e96f, 0x6fe4ac98,
418 	0xb173ecc0, 0xbc60b42a, 0x953498da,
419 	0xfba1ae12, 0x2d4bd736, 0x0f25faab, 0xa4f3fceb, 0xe2969123,
420 	0x257f0c3d, 0x9348af49, 0x361400bc,
421 	0xe8816f4a, 0x3814f200, 0xa3f94043, 0x9c7a54c2, 0xbc704f57,
422 	0xda41e7f9, 0xc25ad33a, 0x54f4a084,
423 	0xb17f5505, 0x59357cbe, 0xedbd15c8, 0x7f97c5ab, 0xba5ac7b5,
424 	0xb6f6deaf, 0x3a479c3a, 0x5302da25,
425 	0x653d7e6a, 0x54268d49, 0x51a477ea, 0x5017d55b, 0xd7d25d88,
426 	0x44136c76, 0x0404a8c8, 0xb8e5a121,
427 	0xb81a928a, 0x60ed5869, 0x97c55b96, 0xeaec991b, 0x29935913,
428 	0x01fdb7f1, 0x088e8dfa, 0x9ab6f6f5,
429 	0x3b4cbf9f, 0x4a5de3ab, 0xe6051d35, 0xa0e1d855, 0xd36b4cf1,
430 	0xf544edeb, 0xb0e93524, 0xbebb8fbd,
431 	0xa2d762cf, 0x49c92f54, 0x38b5f331, 0x7128a454, 0x48392905,
432 	0xa65b1db8, 0x851c97bd, 0xd675cf2f
433 };
434 static const u32 s7[256] = {
435 	0x85e04019, 0x332bf567, 0x662dbfff, 0xcfc65693, 0x2a8d7f6f,
436 	0xab9bc912, 0xde6008a1, 0x2028da1f,
437 	0x0227bce7, 0x4d642916, 0x18fac300, 0x50f18b82, 0x2cb2cb11,
438 	0xb232e75c, 0x4b3695f2, 0xb28707de,
439 	0xa05fbcf6, 0xcd4181e9, 0xe150210c, 0xe24ef1bd, 0xb168c381,
440 	0xfde4e789, 0x5c79b0d8, 0x1e8bfd43,
441 	0x4d495001, 0x38be4341, 0x913cee1d, 0x92a79c3f, 0x089766be,
442 	0xbaeeadf4, 0x1286becf, 0xb6eacb19,
443 	0x2660c200, 0x7565bde4, 0x64241f7a, 0x8248dca9, 0xc3b3ad66,
444 	0x28136086, 0x0bd8dfa8, 0x356d1cf2,
445 	0x107789be, 0xb3b2e9ce, 0x0502aa8f, 0x0bc0351e, 0x166bf52a,
446 	0xeb12ff82, 0xe3486911, 0xd34d7516,
447 	0x4e7b3aff, 0x5f43671b, 0x9cf6e037, 0x4981ac83, 0x334266ce,
448 	0x8c9341b7, 0xd0d854c0, 0xcb3a6c88,
449 	0x47bc2829, 0x4725ba37, 0xa66ad22b, 0x7ad61f1e, 0x0c5cbafa,
450 	0x4437f107, 0xb6e79962, 0x42d2d816,
451 	0x0a961288, 0xe1a5c06e, 0x13749e67, 0x72fc081a, 0xb1d139f7,
452 	0xf9583745, 0xcf19df58, 0xbec3f756,
453 	0xc06eba30, 0x07211b24, 0x45c28829, 0xc95e317f, 0xbc8ec511,
454 	0x38bc46e9, 0xc6e6fa14, 0xbae8584a,
455 	0xad4ebc46, 0x468f508b, 0x7829435f, 0xf124183b, 0x821dba9f,
456 	0xaff60ff4, 0xea2c4e6d, 0x16e39264,
457 	0x92544a8b, 0x009b4fc3, 0xaba68ced, 0x9ac96f78, 0x06a5b79a,
458 	0xb2856e6e, 0x1aec3ca9, 0xbe838688,
459 	0x0e0804e9, 0x55f1be56, 0xe7e5363b, 0xb3a1f25d, 0xf7debb85,
460 	0x61fe033c, 0x16746233, 0x3c034c28,
461 	0xda6d0c74, 0x79aac56c, 0x3ce4e1ad, 0x51f0c802, 0x98f8f35a,
462 	0x1626a49f, 0xeed82b29, 0x1d382fe3,
463 	0x0c4fb99a, 0xbb325778, 0x3ec6d97b, 0x6e77a6a9, 0xcb658b5c,
464 	0xd45230c7, 0x2bd1408b, 0x60c03eb7,
465 	0xb9068d78, 0xa33754f4, 0xf430c87d, 0xc8a71302, 0xb96d8c32,
466 	0xebd4e7be, 0xbe8b9d2d, 0x7979fb06,
467 	0xe7225308, 0x8b75cf77, 0x11ef8da4, 0xe083c858, 0x8d6b786f,
468 	0x5a6317a6, 0xfa5cf7a0, 0x5dda0033,
469 	0xf28ebfb0, 0xf5b9c310, 0xa0eac280, 0x08b9767a, 0xa3d9d2b0,
470 	0x79d34217, 0x021a718d, 0x9ac6336a,
471 	0x2711fd60, 0x438050e3, 0x069908a8, 0x3d7fedc4, 0x826d2bef,
472 	0x4eeb8476, 0x488dcf25, 0x36c9d566,
473 	0x28e74e41, 0xc2610aca, 0x3d49a9cf, 0xbae3b9df, 0xb65f8de6,
474 	0x92aeaf64, 0x3ac7d5e6, 0x9ea80509,
475 	0xf22b017d, 0xa4173f70, 0xdd1e16c3, 0x15e0d7f9, 0x50b1b887,
476 	0x2b9f4fd5, 0x625aba82, 0x6a017962,
477 	0x2ec01b9c, 0x15488aa9, 0xd716e740, 0x40055a2c, 0x93d29a22,
478 	0xe32dbf9a, 0x058745b9, 0x3453dc1e,
479 	0xd699296e, 0x496cff6f, 0x1c9f4986, 0xdfe2ed07, 0xb87242d1,
480 	0x19de7eae, 0x053e561a, 0x15ad6f8c,
481 	0x66626c1c, 0x7154c24c, 0xea082b2a, 0x93eb2939, 0x17dcb0f0,
482 	0x58d4f2ae, 0x9ea294fb, 0x52cf564c,
483 	0x9883fe66, 0x2ec40581, 0x763953c3, 0x01d6692e, 0xd3a0c108,
484 	0xa1e7160e, 0xe4f2dfa6, 0x693ed285,
485 	0x74904698, 0x4c2b0edd, 0x4f757656, 0x5d393378, 0xa132234f,
486 	0x3d321c5d, 0xc3f5e194, 0x4b269301,
487 	0xc79f022f, 0x3c997e7e, 0x5e4f9504, 0x3ffafbbd, 0x76f7ad0e,
488 	0x296693f4, 0x3d1fce6f, 0xc61e45be,
489 	0xd3b5ab34, 0xf72bf9b7, 0x1b0434c0, 0x4e72b567, 0x5592a33d,
490 	0xb5229301, 0xcfd2a87f, 0x60aeb767,
491 	0x1814386b, 0x30bcc33d, 0x38a0c07d, 0xfd1606f2, 0xc363519b,
492 	0x589dd390, 0x5479f8e6, 0x1cb8d647,
493 	0x97fd61a9, 0xea7759f4, 0x2d57539d, 0x569a58cf, 0xe84e63ad,
494 	0x462e1b78, 0x6580f87e, 0xf3817914,
495 	0x91da55f4, 0x40a230f3, 0xd1988f35, 0xb6e318d2, 0x3ffa50bc,
496 	0x3d40f021, 0xc3c0bdae, 0x4958c24c,
497 	0x518f36b2, 0x84b1d370, 0x0fedce83, 0x878ddada, 0xf2a279c7,
498 	0x94e01be8, 0x90716f4b, 0x954b8aa3
499 };
500 static const u32 sb8[256] = {
501 	0xe216300d, 0xbbddfffc, 0xa7ebdabd, 0x35648095, 0x7789f8b7,
502 	0xe6c1121b, 0x0e241600, 0x052ce8b5,
503 	0x11a9cfb0, 0xe5952f11, 0xece7990a, 0x9386d174, 0x2a42931c,
504 	0x76e38111, 0xb12def3a, 0x37ddddfc,
505 	0xde9adeb1, 0x0a0cc32c, 0xbe197029, 0x84a00940, 0xbb243a0f,
506 	0xb4d137cf, 0xb44e79f0, 0x049eedfd,
507 	0x0b15a15d, 0x480d3168, 0x8bbbde5a, 0x669ded42, 0xc7ece831,
508 	0x3f8f95e7, 0x72df191b, 0x7580330d,
509 	0x94074251, 0x5c7dcdfa, 0xabbe6d63, 0xaa402164, 0xb301d40a,
510 	0x02e7d1ca, 0x53571dae, 0x7a3182a2,
511 	0x12a8ddec, 0xfdaa335d, 0x176f43e8, 0x71fb46d4, 0x38129022,
512 	0xce949ad4, 0xb84769ad, 0x965bd862,
513 	0x82f3d055, 0x66fb9767, 0x15b80b4e, 0x1d5b47a0, 0x4cfde06f,
514 	0xc28ec4b8, 0x57e8726e, 0x647a78fc,
515 	0x99865d44, 0x608bd593, 0x6c200e03, 0x39dc5ff6, 0x5d0b00a3,
516 	0xae63aff2, 0x7e8bd632, 0x70108c0c,
517 	0xbbd35049, 0x2998df04, 0x980cf42a, 0x9b6df491, 0x9e7edd53,
518 	0x06918548, 0x58cb7e07, 0x3b74ef2e,
519 	0x522fffb1, 0xd24708cc, 0x1c7e27cd, 0xa4eb215b, 0x3cf1d2e2,
520 	0x19b47a38, 0x424f7618, 0x35856039,
521 	0x9d17dee7, 0x27eb35e6, 0xc9aff67b, 0x36baf5b8, 0x09c467cd,
522 	0xc18910b1, 0xe11dbf7b, 0x06cd1af8,
523 	0x7170c608, 0x2d5e3354, 0xd4de495a, 0x64c6d006, 0xbcc0c62c,
524 	0x3dd00db3, 0x708f8f34, 0x77d51b42,
525 	0x264f620f, 0x24b8d2bf, 0x15c1b79e, 0x46a52564, 0xf8d7e54e,
526 	0x3e378160, 0x7895cda5, 0x859c15a5,
527 	0xe6459788, 0xc37bc75f, 0xdb07ba0c, 0x0676a3ab, 0x7f229b1e,
528 	0x31842e7b, 0x24259fd7, 0xf8bef472,
529 	0x835ffcb8, 0x6df4c1f2, 0x96f5b195, 0xfd0af0fc, 0xb0fe134c,
530 	0xe2506d3d, 0x4f9b12ea, 0xf215f225,
531 	0xa223736f, 0x9fb4c428, 0x25d04979, 0x34c713f8, 0xc4618187,
532 	0xea7a6e98, 0x7cd16efc, 0x1436876c,
533 	0xf1544107, 0xbedeee14, 0x56e9af27, 0xa04aa441, 0x3cf7c899,
534 	0x92ecbae6, 0xdd67016d, 0x151682eb,
535 	0xa842eedf, 0xfdba60b4, 0xf1907b75, 0x20e3030f, 0x24d8c29e,
536 	0xe139673b, 0xefa63fb8, 0x71873054,
537 	0xb6f2cf3b, 0x9f326442, 0xcb15a4cc, 0xb01a4504, 0xf1e47d8d,
538 	0x844a1be5, 0xbae7dfdc, 0x42cbda70,
539 	0xcd7dae0a, 0x57e85b7a, 0xd53f5af6, 0x20cf4d8c, 0xcea4d428,
540 	0x79d130a4, 0x3486ebfb, 0x33d3cddc,
541 	0x77853b53, 0x37effcb5, 0xc5068778, 0xe580b3e6, 0x4e68b8f4,
542 	0xc5c8b37e, 0x0d809ea2, 0x398feb7c,
543 	0x132a4f94, 0x43b7950e, 0x2fee7d1c, 0x223613bd, 0xdd06caa2,
544 	0x37df932b, 0xc4248289, 0xacf3ebc3,
545 	0x5715f6b7, 0xef3478dd, 0xf267616f, 0xc148cbe4, 0x9052815e,
546 	0x5e410fab, 0xb48a2465, 0x2eda7fa4,
547 	0xe87b40e4, 0xe98ea084, 0x5889e9e1, 0xefd390fc, 0xdd07d35b,
548 	0xdb485694, 0x38d7e5b2, 0x57720101,
549 	0x730edebc, 0x5b643113, 0x94917e4f, 0x503c2fba, 0x646f1282,
550 	0x7523d24a, 0xe0779695, 0xf9c17a8f,
551 	0x7a5b2121, 0xd187b896, 0x29263a4d, 0xba510cdf, 0x81f47c9f,
552 	0xad1163ed, 0xea7b5965, 0x1a00726e,
553 	0x11403092, 0x00da6d77, 0x4a0cdd61, 0xad1f4603, 0x605bdfb0,
554 	0x9eedc364, 0x22ebe6a8, 0xcee7d28a,
555 	0xa0e736a0, 0x5564a6b9, 0x10853209, 0xc7eb8f37, 0x2de705ca,
556 	0x8951570f, 0xdf09822b, 0xbd691a6c,
557 	0xaa12e4f2, 0x87451c0f, 0xe0f6a27a, 0x3ada4819, 0x4cf1764f,
558 	0x0d771c2b, 0x67cdb156, 0x350d8384,
559 	0x5938fa0f, 0x42399ef3, 0x36997b07, 0x0e84093d, 0x4aa93e61,
560 	0x8360d87b, 0x1fa98b0c, 0x1149382c,
561 	0xe97625a5, 0x0614d1b7, 0x0e25244b, 0x0c768347, 0x589e8d82,
562 	0x0d2059d1, 0xa466bb1e, 0xf8da0a82,
563 	0x04f19130, 0xba6e4ec0, 0x99265164, 0x1ee7230d, 0x50b2ad80,
564 	0xeaee6801, 0x8db2a283, 0xea8bf59e
565 };
566 
567 #define s1 cast5_s1
568 #define s2 cast5_s2
569 #define s3 cast5_s3
570 #define s4 cast5_s4
571 
572 #define F1(D, m, r)  ((I = ((m) + (D))), (I = rol32(I, (r))),   \
573 	(((s1[I >> 24] ^ s2[(I>>16)&0xff]) - s3[(I>>8)&0xff]) + s4[I&0xff]))
574 #define F2(D, m, r)  ((I = ((m) ^ (D))), (I = rol32(I, (r))),   \
575 	(((s1[I >> 24] - s2[(I>>16)&0xff]) + s3[(I>>8)&0xff]) ^ s4[I&0xff]))
576 #define F3(D, m, r)  ((I = ((m) - (D))), (I = rol32(I, (r))),   \
577 	(((s1[I >> 24] + s2[(I>>16)&0xff]) ^ s3[(I>>8)&0xff]) - s4[I&0xff]))
578 
579 
580 void __cast5_encrypt(struct cast5_ctx *c, u8 *outbuf, const u8 *inbuf)
581 {
582 	const __be32 *src = (const __be32 *)inbuf;
583 	__be32 *dst = (__be32 *)outbuf;
584 	u32 l, r, t;
585 	u32 I;			/* used by the Fx macros */
586 	u32 *Km;
587 	u8 *Kr;
588 
589 	Km = c->Km;
590 	Kr = c->Kr;
591 
592 	/* (L0,R0) <-- (m1...m64).  (Split the plaintext into left and
593 	 * right 32-bit halves L0 = m1...m32 and R0 = m33...m64.)
594 	 */
595 	l = be32_to_cpu(src[0]);
596 	r = be32_to_cpu(src[1]);
597 
598 	/* (16 rounds) for i from 1 to 16, compute Li and Ri as follows:
599 	 *  Li = Ri-1;
600 	 *  Ri = Li-1 ^ f(Ri-1,Kmi,Kri), where f is defined in Section 2.2
601 	 * Rounds 1, 4, 7, 10, 13, and 16 use f function Type 1.
602 	 * Rounds 2, 5, 8, 11, and 14 use f function Type 2.
603 	 * Rounds 3, 6, 9, 12, and 15 use f function Type 3.
604 	 */
605 
606 	t = l; l = r; r = t ^ F1(r, Km[0], Kr[0]);
607 	t = l; l = r; r = t ^ F2(r, Km[1], Kr[1]);
608 	t = l; l = r; r = t ^ F3(r, Km[2], Kr[2]);
609 	t = l; l = r; r = t ^ F1(r, Km[3], Kr[3]);
610 	t = l; l = r; r = t ^ F2(r, Km[4], Kr[4]);
611 	t = l; l = r; r = t ^ F3(r, Km[5], Kr[5]);
612 	t = l; l = r; r = t ^ F1(r, Km[6], Kr[6]);
613 	t = l; l = r; r = t ^ F2(r, Km[7], Kr[7]);
614 	t = l; l = r; r = t ^ F3(r, Km[8], Kr[8]);
615 	t = l; l = r; r = t ^ F1(r, Km[9], Kr[9]);
616 	t = l; l = r; r = t ^ F2(r, Km[10], Kr[10]);
617 	t = l; l = r; r = t ^ F3(r, Km[11], Kr[11]);
618 	if (!(c->rr)) {
619 		t = l; l = r; r = t ^ F1(r, Km[12], Kr[12]);
620 		t = l; l = r; r = t ^ F2(r, Km[13], Kr[13]);
621 		t = l; l = r; r = t ^ F3(r, Km[14], Kr[14]);
622 		t = l; l = r; r = t ^ F1(r, Km[15], Kr[15]);
623 	}
624 
625 	/* c1...c64 <-- (R16,L16).  (Exchange final blocks L16, R16 and
626 	 *  concatenate to form the ciphertext.) */
627 	dst[0] = cpu_to_be32(r);
628 	dst[1] = cpu_to_be32(l);
629 }
630 EXPORT_SYMBOL_GPL(__cast5_encrypt);
631 
632 static void cast5_encrypt(struct crypto_tfm *tfm, u8 *outbuf, const u8 *inbuf)
633 {
634 	__cast5_encrypt(crypto_tfm_ctx(tfm), outbuf, inbuf);
635 }
636 
637 void __cast5_decrypt(struct cast5_ctx *c, u8 *outbuf, const u8 *inbuf)
638 {
639 	const __be32 *src = (const __be32 *)inbuf;
640 	__be32 *dst = (__be32 *)outbuf;
641 	u32 l, r, t;
642 	u32 I;
643 	u32 *Km;
644 	u8 *Kr;
645 
646 	Km = c->Km;
647 	Kr = c->Kr;
648 
649 	l = be32_to_cpu(src[0]);
650 	r = be32_to_cpu(src[1]);
651 
652 	if (!(c->rr)) {
653 		t = l; l = r; r = t ^ F1(r, Km[15], Kr[15]);
654 		t = l; l = r; r = t ^ F3(r, Km[14], Kr[14]);
655 		t = l; l = r; r = t ^ F2(r, Km[13], Kr[13]);
656 		t = l; l = r; r = t ^ F1(r, Km[12], Kr[12]);
657 	}
658 	t = l; l = r; r = t ^ F3(r, Km[11], Kr[11]);
659 	t = l; l = r; r = t ^ F2(r, Km[10], Kr[10]);
660 	t = l; l = r; r = t ^ F1(r, Km[9], Kr[9]);
661 	t = l; l = r; r = t ^ F3(r, Km[8], Kr[8]);
662 	t = l; l = r; r = t ^ F2(r, Km[7], Kr[7]);
663 	t = l; l = r; r = t ^ F1(r, Km[6], Kr[6]);
664 	t = l; l = r; r = t ^ F3(r, Km[5], Kr[5]);
665 	t = l; l = r; r = t ^ F2(r, Km[4], Kr[4]);
666 	t = l; l = r; r = t ^ F1(r, Km[3], Kr[3]);
667 	t = l; l = r; r = t ^ F3(r, Km[2], Kr[2]);
668 	t = l; l = r; r = t ^ F2(r, Km[1], Kr[1]);
669 	t = l; l = r; r = t ^ F1(r, Km[0], Kr[0]);
670 
671 	dst[0] = cpu_to_be32(r);
672 	dst[1] = cpu_to_be32(l);
673 }
674 EXPORT_SYMBOL_GPL(__cast5_decrypt);
675 
676 static void cast5_decrypt(struct crypto_tfm *tfm, u8 *outbuf, const u8 *inbuf)
677 {
678 	__cast5_decrypt(crypto_tfm_ctx(tfm), outbuf, inbuf);
679 }
680 
681 static void key_schedule(u32 *x, u32 *z, u32 *k)
682 {
683 
684 #define xi(i)   ((x[(i)/4] >> (8*(3-((i)%4)))) & 0xff)
685 #define zi(i)   ((z[(i)/4] >> (8*(3-((i)%4)))) & 0xff)
686 
687 	z[0] = x[0] ^ s5[xi(13)] ^ s6[xi(15)] ^ s7[xi(12)] ^ sb8[xi(14)] ^
688 	    s7[xi(8)];
689 	z[1] = x[2] ^ s5[zi(0)] ^ s6[zi(2)] ^ s7[zi(1)] ^ sb8[zi(3)] ^
690 	    sb8[xi(10)];
691 	z[2] = x[3] ^ s5[zi(7)] ^ s6[zi(6)] ^ s7[zi(5)] ^ sb8[zi(4)] ^
692 	    s5[xi(9)];
693 	z[3] = x[1] ^ s5[zi(10)] ^ s6[zi(9)] ^ s7[zi(11)] ^ sb8[zi(8)] ^
694 	    s6[xi(11)];
695 	k[0] = s5[zi(8)] ^ s6[zi(9)] ^ s7[zi(7)] ^ sb8[zi(6)] ^ s5[zi(2)];
696 	k[1] = s5[zi(10)] ^ s6[zi(11)] ^ s7[zi(5)] ^ sb8[zi(4)] ^
697 	    s6[zi(6)];
698 	k[2] = s5[zi(12)] ^ s6[zi(13)] ^ s7[zi(3)] ^ sb8[zi(2)] ^
699 	    s7[zi(9)];
700 	k[3] = s5[zi(14)] ^ s6[zi(15)] ^ s7[zi(1)] ^ sb8[zi(0)] ^
701 	    sb8[zi(12)];
702 
703 	x[0] = z[2] ^ s5[zi(5)] ^ s6[zi(7)] ^ s7[zi(4)] ^ sb8[zi(6)] ^
704 	    s7[zi(0)];
705 	x[1] = z[0] ^ s5[xi(0)] ^ s6[xi(2)] ^ s7[xi(1)] ^ sb8[xi(3)] ^
706 	    sb8[zi(2)];
707 	x[2] = z[1] ^ s5[xi(7)] ^ s6[xi(6)] ^ s7[xi(5)] ^ sb8[xi(4)] ^
708 	    s5[zi(1)];
709 	x[3] = z[3] ^ s5[xi(10)] ^ s6[xi(9)] ^ s7[xi(11)] ^ sb8[xi(8)] ^
710 	    s6[zi(3)];
711 	k[4] = s5[xi(3)] ^ s6[xi(2)] ^ s7[xi(12)] ^ sb8[xi(13)] ^
712 	    s5[xi(8)];
713 	k[5] = s5[xi(1)] ^ s6[xi(0)] ^ s7[xi(14)] ^ sb8[xi(15)] ^
714 	    s6[xi(13)];
715 	k[6] = s5[xi(7)] ^ s6[xi(6)] ^ s7[xi(8)] ^ sb8[xi(9)] ^ s7[xi(3)];
716 	k[7] = s5[xi(5)] ^ s6[xi(4)] ^ s7[xi(10)] ^ sb8[xi(11)] ^
717 	    sb8[xi(7)];
718 
719 	z[0] = x[0] ^ s5[xi(13)] ^ s6[xi(15)] ^ s7[xi(12)] ^ sb8[xi(14)] ^
720 	    s7[xi(8)];
721 	z[1] = x[2] ^ s5[zi(0)] ^ s6[zi(2)] ^ s7[zi(1)] ^ sb8[zi(3)] ^
722 	    sb8[xi(10)];
723 	z[2] = x[3] ^ s5[zi(7)] ^ s6[zi(6)] ^ s7[zi(5)] ^ sb8[zi(4)] ^
724 	    s5[xi(9)];
725 	z[3] = x[1] ^ s5[zi(10)] ^ s6[zi(9)] ^ s7[zi(11)] ^ sb8[zi(8)] ^
726 	    s6[xi(11)];
727 	k[8] = s5[zi(3)] ^ s6[zi(2)] ^ s7[zi(12)] ^ sb8[zi(13)] ^
728 	    s5[zi(9)];
729 	k[9] = s5[zi(1)] ^ s6[zi(0)] ^ s7[zi(14)] ^ sb8[zi(15)] ^
730 	    s6[zi(12)];
731 	k[10] = s5[zi(7)] ^ s6[zi(6)] ^ s7[zi(8)] ^ sb8[zi(9)] ^ s7[zi(2)];
732 	k[11] = s5[zi(5)] ^ s6[zi(4)] ^ s7[zi(10)] ^ sb8[zi(11)] ^
733 	    sb8[zi(6)];
734 
735 	x[0] = z[2] ^ s5[zi(5)] ^ s6[zi(7)] ^ s7[zi(4)] ^ sb8[zi(6)] ^
736 	    s7[zi(0)];
737 	x[1] = z[0] ^ s5[xi(0)] ^ s6[xi(2)] ^ s7[xi(1)] ^ sb8[xi(3)] ^
738 	    sb8[zi(2)];
739 	x[2] = z[1] ^ s5[xi(7)] ^ s6[xi(6)] ^ s7[xi(5)] ^ sb8[xi(4)] ^
740 	    s5[zi(1)];
741 	x[3] = z[3] ^ s5[xi(10)] ^ s6[xi(9)] ^ s7[xi(11)] ^ sb8[xi(8)] ^
742 	    s6[zi(3)];
743 	k[12] = s5[xi(8)] ^ s6[xi(9)] ^ s7[xi(7)] ^ sb8[xi(6)] ^ s5[xi(3)];
744 	k[13] = s5[xi(10)] ^ s6[xi(11)] ^ s7[xi(5)] ^ sb8[xi(4)] ^
745 	    s6[xi(7)];
746 	k[14] = s5[xi(12)] ^ s6[xi(13)] ^ s7[xi(3)] ^ sb8[xi(2)] ^
747 	    s7[xi(8)];
748 	k[15] = s5[xi(14)] ^ s6[xi(15)] ^ s7[xi(1)] ^ sb8[xi(0)] ^
749 	    sb8[xi(13)];
750 
751 #undef xi
752 #undef zi
753 }
754 
755 
756 int cast5_setkey(struct crypto_tfm *tfm, const u8 *key, unsigned int key_len)
757 {
758 	struct cast5_ctx *c = crypto_tfm_ctx(tfm);
759 	int i;
760 	u32 x[4];
761 	u32 z[4];
762 	u32 k[16];
763 	__be32 p_key[4];
764 
765 	c->rr = key_len <= 10 ? 1 : 0;
766 
767 	memset(p_key, 0, 16);
768 	memcpy(p_key, key, key_len);
769 
770 
771 	x[0] = be32_to_cpu(p_key[0]);
772 	x[1] = be32_to_cpu(p_key[1]);
773 	x[2] = be32_to_cpu(p_key[2]);
774 	x[3] = be32_to_cpu(p_key[3]);
775 
776 	key_schedule(x, z, k);
777 	for (i = 0; i < 16; i++)
778 		c->Km[i] = k[i];
779 	key_schedule(x, z, k);
780 	for (i = 0; i < 16; i++)
781 		c->Kr[i] = k[i] & 0x1f;
782 	return 0;
783 }
784 EXPORT_SYMBOL_GPL(cast5_setkey);
785 
786 static struct crypto_alg alg = {
787 	.cra_name		= "cast5",
788 	.cra_driver_name	= "cast5-generic",
789 	.cra_priority		= 100,
790 	.cra_flags		= CRYPTO_ALG_TYPE_CIPHER,
791 	.cra_blocksize		= CAST5_BLOCK_SIZE,
792 	.cra_ctxsize		= sizeof(struct cast5_ctx),
793 	.cra_alignmask		= 3,
794 	.cra_module		= THIS_MODULE,
795 	.cra_u			= {
796 		.cipher = {
797 			.cia_min_keysize = CAST5_MIN_KEY_SIZE,
798 			.cia_max_keysize = CAST5_MAX_KEY_SIZE,
799 			.cia_setkey  = cast5_setkey,
800 			.cia_encrypt = cast5_encrypt,
801 			.cia_decrypt = cast5_decrypt
802 		}
803 	}
804 };
805 
806 static int __init cast5_mod_init(void)
807 {
808 	return crypto_register_alg(&alg);
809 }
810 
811 static void __exit cast5_mod_fini(void)
812 {
813 	crypto_unregister_alg(&alg);
814 }
815 
816 module_init(cast5_mod_init);
817 module_exit(cast5_mod_fini);
818 
819 MODULE_LICENSE("GPL");
820 MODULE_DESCRIPTION("Cast5 Cipher Algorithm");
821 MODULE_ALIAS("cast5");
822