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