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