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