Linux Kernel  3.7.1
 All Data Structures Namespaces Files Functions Variables Typedefs Enumerations Enumerator Macros Groups Pages
cast5_generic.c
Go to the documentation of this file.
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 <[email protected]>.
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 };
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 };
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 };
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 };
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 }
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 }
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 }
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");