1 | /* $NetBSD: bf_locl.h,v 1.5 2009/06/30 13:14:40 pooka Exp $ */ |
2 | /* $KAME: bf_locl.h,v 1.5 2000/08/31 06:03:48 itojun Exp $ */ |
3 | |
4 | /* crypto/bf/bf_local.h */ |
5 | /* Copyright (C) 1995-1997 Eric Young (eay@mincom.oz.au) |
6 | * All rights reserved. |
7 | * |
8 | * This package is an SSL implementation written |
9 | * by Eric Young (eay@mincom.oz.au). |
10 | * The implementation was written so as to conform with Netscapes SSL. |
11 | * |
12 | * This library is free for commercial and non-commercial use as long as |
13 | * the following conditions are aheared to. The following conditions |
14 | * apply to all code found in this distribution, be it the RC4, RSA, |
15 | * lhash, DES, etc., code; not just the SSL code. The SSL documentation |
16 | * included with this distribution is covered by the same copyright terms |
17 | * except that the holder is Tim Hudson (tjh@mincom.oz.au). |
18 | * |
19 | * Copyright remains Eric Young's, and as such any Copyright notices in |
20 | * the code are not to be removed. |
21 | * If this package is used in a product, Eric Young should be given attribution |
22 | * as the author of the parts of the library used. |
23 | * This can be in the form of a textual message at program startup or |
24 | * in documentation (online or textual) provided with the package. |
25 | * |
26 | * Redistribution and use in source and binary forms, with or without |
27 | * modification, are permitted provided that the following conditions |
28 | * are met: |
29 | * 1. Redistributions of source code must retain the copyright |
30 | * notice, this list of conditions and the following disclaimer. |
31 | * 2. Redistributions in binary form must reproduce the above copyright |
32 | * notice, this list of conditions and the following disclaimer in the |
33 | * documentation and/or other materials provided with the distribution. |
34 | * 3. All advertising materials mentioning features or use of this software |
35 | * must display the following acknowledgement: |
36 | * "This product includes cryptographic software written by |
37 | * Eric Young (eay@mincom.oz.au)" |
38 | * The word 'cryptographic' can be left out if the rouines from the library |
39 | * being used are not cryptographic related :-). |
40 | * 4. If you include any Windows specific code (or a derivative thereof) from |
41 | * the apps directory (application code) you must include an acknowledgement: |
42 | * "This product includes software written by Tim Hudson (tjh@mincom.oz.au)" |
43 | * |
44 | * THIS SOFTWARE IS PROVIDED BY ERIC YOUNG ``AS IS'' AND |
45 | * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE |
46 | * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE |
47 | * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE |
48 | * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL |
49 | * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS |
50 | * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) |
51 | * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT |
52 | * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY |
53 | * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF |
54 | * SUCH DAMAGE. |
55 | * |
56 | * The licence and distribution terms for any publically available version or |
57 | * derivative of this code cannot be changed. i.e. this code cannot simply be |
58 | * copied and put under another distribution licence |
59 | * [including the GNU Public Licence.] |
60 | */ |
61 | /* WARNING WARNING WARNING WARNING WARNING WARNING WARNING WARNING WARNING |
62 | * |
63 | * Always modify bf_locl.org since bf_locl.h is automatically generated from |
64 | * it during SSLeay configuration. |
65 | * |
66 | * WARNING WARNING WARNING WARNING WARNING WARNING WARNING WARNING WARNING |
67 | */ |
68 | |
69 | #undef c2l |
70 | #define c2l(c,l) (l =((BF_LONG)(*((c)++))) , \ |
71 | l|=((BF_LONG)(*((c)++)))<< 8L, \ |
72 | l|=((BF_LONG)(*((c)++)))<<16L, \ |
73 | l|=((BF_LONG)(*((c)++)))<<24L) |
74 | |
75 | /* NOTE - c is not incremented as per c2l */ |
76 | #undef c2ln |
77 | #define c2ln(c,l1,l2,n) { \ |
78 | c+=n; \ |
79 | l1=l2=0; \ |
80 | switch (n) { \ |
81 | case 8: l2 =((BF_LONG)(*(--(c))))<<24L; \ |
82 | case 7: l2|=((BF_LONG)(*(--(c))))<<16L; \ |
83 | case 6: l2|=((BF_LONG)(*(--(c))))<< 8L; \ |
84 | case 5: l2|=((BF_LONG)(*(--(c)))); \ |
85 | case 4: l1 =((BF_LONG)(*(--(c))))<<24L; \ |
86 | case 3: l1|=((BF_LONG)(*(--(c))))<<16L; \ |
87 | case 2: l1|=((BF_LONG)(*(--(c))))<< 8L; \ |
88 | case 1: l1|=((BF_LONG)(*(--(c)))); \ |
89 | } \ |
90 | } |
91 | |
92 | #undef l2c |
93 | #define l2c(l,c) (*((c)++)=(unsigned char)(((l) )&0xff), \ |
94 | *((c)++)=(unsigned char)(((l)>> 8L)&0xff), \ |
95 | *((c)++)=(unsigned char)(((l)>>16L)&0xff), \ |
96 | *((c)++)=(unsigned char)(((l)>>24L)&0xff)) |
97 | |
98 | /* NOTE - c is not incremented as per l2c */ |
99 | #undef l2cn |
100 | #define l2cn(l1,l2,c,n) { \ |
101 | c+=n; \ |
102 | switch (n) { \ |
103 | case 8: *(--(c))=(unsigned char)(((l2)>>24L)&0xff); \ |
104 | case 7: *(--(c))=(unsigned char)(((l2)>>16L)&0xff); \ |
105 | case 6: *(--(c))=(unsigned char)(((l2)>> 8L)&0xff); \ |
106 | case 5: *(--(c))=(unsigned char)(((l2) )&0xff); \ |
107 | case 4: *(--(c))=(unsigned char)(((l1)>>24L)&0xff); \ |
108 | case 3: *(--(c))=(unsigned char)(((l1)>>16L)&0xff); \ |
109 | case 2: *(--(c))=(unsigned char)(((l1)>> 8L)&0xff); \ |
110 | case 1: *(--(c))=(unsigned char)(((l1) )&0xff); \ |
111 | } \ |
112 | } |
113 | |
114 | /* NOTE - c is not incremented as per n2l */ |
115 | #define n2ln(c,l1,l2,n) { \ |
116 | c+=n; \ |
117 | l1=l2=0; \ |
118 | switch (n) { \ |
119 | case 8: l2 =((BF_LONG)(*(--(c)))) ; \ |
120 | case 7: l2|=((BF_LONG)(*(--(c))))<< 8; \ |
121 | case 6: l2|=((BF_LONG)(*(--(c))))<<16; \ |
122 | case 5: l2|=((BF_LONG)(*(--(c))))<<24; \ |
123 | case 4: l1 =((BF_LONG)(*(--(c)))) ; \ |
124 | case 3: l1|=((BF_LONG)(*(--(c))))<< 8; \ |
125 | case 2: l1|=((BF_LONG)(*(--(c))))<<16; \ |
126 | case 1: l1|=((BF_LONG)(*(--(c))))<<24; \ |
127 | } \ |
128 | } |
129 | |
130 | /* NOTE - c is not incremented as per l2n */ |
131 | #define l2nn(l1,l2,c,n) { \ |
132 | c+=n; \ |
133 | switch (n) { \ |
134 | case 8: *(--(c))=(unsigned char)(((l2) )&0xff); \ |
135 | case 7: *(--(c))=(unsigned char)(((l2)>> 8)&0xff); \ |
136 | case 6: *(--(c))=(unsigned char)(((l2)>>16)&0xff); \ |
137 | case 5: *(--(c))=(unsigned char)(((l2)>>24)&0xff); \ |
138 | case 4: *(--(c))=(unsigned char)(((l1) )&0xff); \ |
139 | case 3: *(--(c))=(unsigned char)(((l1)>> 8)&0xff); \ |
140 | case 2: *(--(c))=(unsigned char)(((l1)>>16)&0xff); \ |
141 | case 1: *(--(c))=(unsigned char)(((l1)>>24)&0xff); \ |
142 | } \ |
143 | } |
144 | |
145 | #undef n2l |
146 | #define n2l(c,l) (l =((BF_LONG)(*((c)++)))<<24L, \ |
147 | l|=((BF_LONG)(*((c)++)))<<16L, \ |
148 | l|=((BF_LONG)(*((c)++)))<< 8L, \ |
149 | l|=((BF_LONG)(*((c)++)))) |
150 | |
151 | #undef l2n |
152 | #define l2n(l,c) (*((c)++)=(unsigned char)(((l)>>24L)&0xff), \ |
153 | *((c)++)=(unsigned char)(((l)>>16L)&0xff), \ |
154 | *((c)++)=(unsigned char)(((l)>> 8L)&0xff), \ |
155 | *((c)++)=(unsigned char)(((l) )&0xff)) |
156 | |
157 | /* This is actually a big endian algorithm, the most significate byte |
158 | * is used to lookup array 0 */ |
159 | |
160 | /* use BF_PTR2 for intel boxes, |
161 | * BF_PTR for sparc and MIPS/SGI |
162 | * use nothing for Alpha and HP. |
163 | */ |
164 | #undef BF_PTR |
165 | #undef BF_PTR2 |
166 | #ifdef __i386__ |
167 | #define BF_PTR2 |
168 | #else |
169 | #ifdef __mips__ |
170 | #define BF_PTR |
171 | #endif |
172 | #endif |
173 | |
174 | #define BF_M 0x3fc |
175 | #define BF_0 22L |
176 | #define BF_1 14L |
177 | #define BF_2 6L |
178 | #define BF_3 2L /* left shift */ |
179 | |
180 | #if defined(BF_PTR2) |
181 | |
182 | /* This is basically a special pentium verson */ |
183 | #define BF_ENC(LL,R,S,P) \ |
184 | { \ |
185 | BF_LONG t,u,v; \ |
186 | u=R>>BF_0; \ |
187 | v=R>>BF_1; \ |
188 | u&=BF_M; \ |
189 | v&=BF_M; \ |
190 | t= *(const BF_LONG *)((const unsigned char *)&(S[ 0])+u); \ |
191 | u=R>>BF_2; \ |
192 | t+= *(const BF_LONG *)((const unsigned char *)&(S[256])+v); \ |
193 | v=R<<BF_3; \ |
194 | u&=BF_M; \ |
195 | v&=BF_M; \ |
196 | t^= *(const BF_LONG *)((const unsigned char *)&(S[512])+u); \ |
197 | LL^=P; \ |
198 | t+= *(const BF_LONG *)((const unsigned char *)&(S[768])+v); \ |
199 | LL^=t; \ |
200 | } |
201 | |
202 | #elif defined(BF_PTR) |
203 | |
204 | /* This is normally very good */ |
205 | |
206 | #define BF_ENC(LL,R,S,P) \ |
207 | LL^=P; \ |
208 | LL^= (((*(const BF_LONG *)((const unsigned char *)&(S[ 0])+((R>>BF_0)&BF_M))+ \ |
209 | *(const BF_LONG *)((const unsigned char *)&(S[256])+((R>>BF_1)&BF_M)))^ \ |
210 | *(const BF_LONG *)((const unsigned char *)&(S[512])+((R>>BF_2)&BF_M)))+ \ |
211 | *(const BF_LONG *)((const unsigned char *)&(S[768])+((R<<BF_3)&BF_M))); |
212 | #else |
213 | |
214 | /* This will always work, even on 64 bit machines and strangly enough, |
215 | * on the Alpha it is faster than the pointer versions (both 32 and 64 |
216 | * versions of BF_LONG) */ |
217 | |
218 | #define BF_ENC(LL,R,S,P) \ |
219 | LL^=P; \ |
220 | LL^=((( S[ (R>>24L) ] + \ |
221 | S[0x0100+((R>>16L)&0xff)])^ \ |
222 | S[0x0200+((R>> 8L)&0xff)])+ \ |
223 | S[0x0300+((R )&0xff)])&0xffffffff; |
224 | #endif |
225 | |