Merge tag 'pinctrl-for-3.7-late' of git://git.kernel.org/pub/scm/linux/kernel/git...
[linux-3.10.git] / crypto / cast5_generic.c
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");