1 /* crypto/cast/c_skey.c */
2 /* Copyright (C) 1995-1998 Eric Young (eay@cryptsoft.com)
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.
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).
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.
23 * Redistribution and use in source and binary forms, with or without
24 * modification, are permitted provided that the following conditions
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)"
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
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.]
59 #include <openssl/crypto.h>
60 #include <openssl/cast.h>
64 #define CAST_exp(l,A,a,n) \
67 a[n+2]=(l>> 8)&0xff; \
68 a[n+1]=(l>>16)&0xff; \
71 #define S4 CAST_S_table4
72 #define S5 CAST_S_table5
73 #define S6 CAST_S_table6
74 #define S7 CAST_S_table7
75 void CAST_set_key(CAST_KEY
*key
, int len
, const unsigned char *data
)
78 fips_cipher_abort(CAST
);
79 private_CAST_set_key(key
, len
, data
);
81 void private_CAST_set_key(CAST_KEY
*key
, int len
, const unsigned char *data
)
91 for (i
=0; i
<16; i
++) x
[i
]=0;
101 X
[0]=((x
[ 0]<<24)|(x
[ 1]<<16)|(x
[ 2]<<8)|x
[ 3])&0xffffffffL
;
102 X
[1]=((x
[ 4]<<24)|(x
[ 5]<<16)|(x
[ 6]<<8)|x
[ 7])&0xffffffffL
;
103 X
[2]=((x
[ 8]<<24)|(x
[ 9]<<16)|(x
[10]<<8)|x
[11])&0xffffffffL
;
104 X
[3]=((x
[12]<<24)|(x
[13]<<16)|(x
[14]<<8)|x
[15])&0xffffffffL
;
108 l
=X
[0]^S4
[x
[13]]^S5
[x
[15]]^S6
[x
[12]]^S7
[x
[14]]^S6
[x
[ 8]];
110 l
=X
[2]^S4
[z
[ 0]]^S5
[z
[ 2]]^S6
[z
[ 1]]^S7
[z
[ 3]]^S7
[x
[10]];
112 l
=X
[3]^S4
[z
[ 7]]^S5
[z
[ 6]]^S6
[z
[ 5]]^S7
[z
[ 4]]^S4
[x
[ 9]];
114 l
=X
[1]^S4
[z
[10]]^S5
[z
[ 9]]^S6
[z
[11]]^S7
[z
[ 8]]^S5
[x
[11]];
117 K
[ 0]= S4
[z
[ 8]]^S5
[z
[ 9]]^S6
[z
[ 7]]^S7
[z
[ 6]]^S4
[z
[ 2]];
118 K
[ 1]= S4
[z
[10]]^S5
[z
[11]]^S6
[z
[ 5]]^S7
[z
[ 4]]^S5
[z
[ 6]];
119 K
[ 2]= S4
[z
[12]]^S5
[z
[13]]^S6
[z
[ 3]]^S7
[z
[ 2]]^S6
[z
[ 9]];
120 K
[ 3]= S4
[z
[14]]^S5
[z
[15]]^S6
[z
[ 1]]^S7
[z
[ 0]]^S7
[z
[12]];
122 l
=Z
[2]^S4
[z
[ 5]]^S5
[z
[ 7]]^S6
[z
[ 4]]^S7
[z
[ 6]]^S6
[z
[ 0]];
124 l
=Z
[0]^S4
[x
[ 0]]^S5
[x
[ 2]]^S6
[x
[ 1]]^S7
[x
[ 3]]^S7
[z
[ 2]];
126 l
=Z
[1]^S4
[x
[ 7]]^S5
[x
[ 6]]^S6
[x
[ 5]]^S7
[x
[ 4]]^S4
[z
[ 1]];
128 l
=Z
[3]^S4
[x
[10]]^S5
[x
[ 9]]^S6
[x
[11]]^S7
[x
[ 8]]^S5
[z
[ 3]];
131 K
[ 4]= S4
[x
[ 3]]^S5
[x
[ 2]]^S6
[x
[12]]^S7
[x
[13]]^S4
[x
[ 8]];
132 K
[ 5]= S4
[x
[ 1]]^S5
[x
[ 0]]^S6
[x
[14]]^S7
[x
[15]]^S5
[x
[13]];
133 K
[ 6]= S4
[x
[ 7]]^S5
[x
[ 6]]^S6
[x
[ 8]]^S7
[x
[ 9]]^S6
[x
[ 3]];
134 K
[ 7]= S4
[x
[ 5]]^S5
[x
[ 4]]^S6
[x
[10]]^S7
[x
[11]]^S7
[x
[ 7]];
136 l
=X
[0]^S4
[x
[13]]^S5
[x
[15]]^S6
[x
[12]]^S7
[x
[14]]^S6
[x
[ 8]];
138 l
=X
[2]^S4
[z
[ 0]]^S5
[z
[ 2]]^S6
[z
[ 1]]^S7
[z
[ 3]]^S7
[x
[10]];
140 l
=X
[3]^S4
[z
[ 7]]^S5
[z
[ 6]]^S6
[z
[ 5]]^S7
[z
[ 4]]^S4
[x
[ 9]];
142 l
=X
[1]^S4
[z
[10]]^S5
[z
[ 9]]^S6
[z
[11]]^S7
[z
[ 8]]^S5
[x
[11]];
145 K
[ 8]= S4
[z
[ 3]]^S5
[z
[ 2]]^S6
[z
[12]]^S7
[z
[13]]^S4
[z
[ 9]];
146 K
[ 9]= S4
[z
[ 1]]^S5
[z
[ 0]]^S6
[z
[14]]^S7
[z
[15]]^S5
[z
[12]];
147 K
[10]= S4
[z
[ 7]]^S5
[z
[ 6]]^S6
[z
[ 8]]^S7
[z
[ 9]]^S6
[z
[ 2]];
148 K
[11]= S4
[z
[ 5]]^S5
[z
[ 4]]^S6
[z
[10]]^S7
[z
[11]]^S7
[z
[ 6]];
150 l
=Z
[2]^S4
[z
[ 5]]^S5
[z
[ 7]]^S6
[z
[ 4]]^S7
[z
[ 6]]^S6
[z
[ 0]];
152 l
=Z
[0]^S4
[x
[ 0]]^S5
[x
[ 2]]^S6
[x
[ 1]]^S7
[x
[ 3]]^S7
[z
[ 2]];
154 l
=Z
[1]^S4
[x
[ 7]]^S5
[x
[ 6]]^S6
[x
[ 5]]^S7
[x
[ 4]]^S4
[z
[ 1]];
156 l
=Z
[3]^S4
[x
[10]]^S5
[x
[ 9]]^S6
[x
[11]]^S7
[x
[ 8]]^S5
[z
[ 3]];
159 K
[12]= S4
[x
[ 8]]^S5
[x
[ 9]]^S6
[x
[ 7]]^S7
[x
[ 6]]^S4
[x
[ 3]];
160 K
[13]= S4
[x
[10]]^S5
[x
[11]]^S6
[x
[ 5]]^S7
[x
[ 4]]^S5
[x
[ 7]];
161 K
[14]= S4
[x
[12]]^S5
[x
[13]]^S6
[x
[ 3]]^S7
[x
[ 2]]^S6
[x
[ 8]];
162 K
[15]= S4
[x
[14]]^S5
[x
[15]]^S6
[x
[ 1]]^S7
[x
[ 0]]^S7
[x
[13]];
170 key
->data
[i
*2+1]=((k
[i
+16])+16)&0x1f;