|
|
1.1 root 1: /* crypto/bf/bf_locl.org */
2: /* Copyright (C) 1995-1997 Eric Young ([email protected])
3: * All rights reserved.
4: *
5: * This package is an SSL implementation written
6: * by Eric Young ([email protected]).
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 ([email protected]).
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 ([email protected])"
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 ([email protected])"
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: /* WARNING WARNING WARNING WARNING WARNING WARNING WARNING WARNING WARNING
60: *
61: * Always modify bf_locl.org since bf_locl.h is automatically generated from
62: * it during SSLeay configuration.
63: *
64: * WARNING WARNING WARNING WARNING WARNING WARNING WARNING WARNING WARNING
65: */
66:
67: /* Special defines which change the way the code is built depending on the
68: CPU and OS. For SGI machines you can use _MIPS_SZLONG (32 or 64) to find
69: even newer MIPS CPU's, but at the moment one size fits all for
70: optimization options. Older Sparc's work better with only UNROLL, but
71: there's no way to tell at compile time what it is you're running on */
72:
73: #if defined( sun ) /* Newer Sparc's */
74: # define BF_PTR
75: #elif defined( __ultrix ) /* Older MIPS */
76: # define BF_PTR
77: #elif defined( __osf1__ ) /* Alpha */
78: /* None */
79: #elif defined ( _AIX ) /* RS6000 */
80: /* Unknown */
81: #elif defined( __hpux ) /* HP-PA */
82: /* None */
83: #elif defined( __aux ) /* 68K */
84: /* Unknown */
85: #elif defined( __dgux ) /* 88K (but P6 in latest boxes) */
86: /* Unknown */
87: #elif defined( __sgi ) /* Newer MIPS */
88: # define BF_PTR
89: #elif defined( i386 ) /* x86 boxes, should be gcc */
90: # define BF_PTR2
91: #elif defined( _MSC_VER ) /* x86 boxes, Visual C */
92: # define BF_PTR2
93: #endif /* Systems-specific speed defines */
94:
95: #undef c2l
96: #define c2l(c,l) (l =((unsigned long)(*((c)++))) , \
97: l|=((unsigned long)(*((c)++)))<< 8L, \
98: l|=((unsigned long)(*((c)++)))<<16L, \
99: l|=((unsigned long)(*((c)++)))<<24L)
100:
101: /* NOTE - c is not incremented as per c2l */
102: #undef c2ln
103: #define c2ln(c,l1,l2,n) { \
104: c+=n; \
105: l1=l2=0; \
106: switch (n) { \
107: case 8: l2 =((unsigned long)(*(--(c))))<<24L; \
108: case 7: l2|=((unsigned long)(*(--(c))))<<16L; \
109: case 6: l2|=((unsigned long)(*(--(c))))<< 8L; \
110: case 5: l2|=((unsigned long)(*(--(c)))); \
111: case 4: l1 =((unsigned long)(*(--(c))))<<24L; \
112: case 3: l1|=((unsigned long)(*(--(c))))<<16L; \
113: case 2: l1|=((unsigned long)(*(--(c))))<< 8L; \
114: case 1: l1|=((unsigned long)(*(--(c)))); \
115: } \
116: }
117:
118: #undef l2c
119: #define l2c(l,c) (*((c)++)=(unsigned char)(((l) )&0xff), \
120: *((c)++)=(unsigned char)(((l)>> 8L)&0xff), \
121: *((c)++)=(unsigned char)(((l)>>16L)&0xff), \
122: *((c)++)=(unsigned char)(((l)>>24L)&0xff))
123:
124: /* NOTE - c is not incremented as per l2c */
125: #undef l2cn
126: #define l2cn(l1,l2,c,n) { \
127: c+=n; \
128: switch (n) { \
129: case 8: *(--(c))=(unsigned char)(((l2)>>24L)&0xff); \
130: case 7: *(--(c))=(unsigned char)(((l2)>>16L)&0xff); \
131: case 6: *(--(c))=(unsigned char)(((l2)>> 8L)&0xff); \
132: case 5: *(--(c))=(unsigned char)(((l2) )&0xff); \
133: case 4: *(--(c))=(unsigned char)(((l1)>>24L)&0xff); \
134: case 3: *(--(c))=(unsigned char)(((l1)>>16L)&0xff); \
135: case 2: *(--(c))=(unsigned char)(((l1)>> 8L)&0xff); \
136: case 1: *(--(c))=(unsigned char)(((l1) )&0xff); \
137: } \
138: }
139:
140: /* NOTE - c is not incremented as per n2l */
141: #define n2ln(c,l1,l2,n) { \
142: c+=n; \
143: l1=l2=0; \
144: switch (n) { \
145: case 8: l2 =((unsigned long)(*(--(c)))) ; \
146: case 7: l2|=((unsigned long)(*(--(c))))<< 8; \
147: case 6: l2|=((unsigned long)(*(--(c))))<<16; \
148: case 5: l2|=((unsigned long)(*(--(c))))<<24; \
149: case 4: l1 =((unsigned long)(*(--(c)))) ; \
150: case 3: l1|=((unsigned long)(*(--(c))))<< 8; \
151: case 2: l1|=((unsigned long)(*(--(c))))<<16; \
152: case 1: l1|=((unsigned long)(*(--(c))))<<24; \
153: } \
154: }
155:
156: /* NOTE - c is not incremented as per l2n */
157: #define l2nn(l1,l2,c,n) { \
158: c+=n; \
159: switch (n) { \
160: case 8: *(--(c))=(unsigned char)(((l2) )&0xff); \
161: case 7: *(--(c))=(unsigned char)(((l2)>> 8)&0xff); \
162: case 6: *(--(c))=(unsigned char)(((l2)>>16)&0xff); \
163: case 5: *(--(c))=(unsigned char)(((l2)>>24)&0xff); \
164: case 4: *(--(c))=(unsigned char)(((l1) )&0xff); \
165: case 3: *(--(c))=(unsigned char)(((l1)>> 8)&0xff); \
166: case 2: *(--(c))=(unsigned char)(((l1)>>16)&0xff); \
167: case 1: *(--(c))=(unsigned char)(((l1)>>24)&0xff); \
168: } \
169: }
170:
171: #undef n2l
172: #define n2l(c,l) (l =((unsigned long)(*((c)++)))<<24L, \
173: l|=((unsigned long)(*((c)++)))<<16L, \
174: l|=((unsigned long)(*((c)++)))<< 8L, \
175: l|=((unsigned long)(*((c)++))))
176:
177: #undef l2n
178: #define l2n(l,c) (*((c)++)=(unsigned char)(((l)>>24L)&0xff), \
179: *((c)++)=(unsigned char)(((l)>>16L)&0xff), \
180: *((c)++)=(unsigned char)(((l)>> 8L)&0xff), \
181: *((c)++)=(unsigned char)(((l) )&0xff))
182:
183: /* This is actually a big endian algorithm, the most significate byte
184: * is used to lookup array 0 */
185:
186: /* use BF_PTR2 for intel boxes,
187: * BF_PTR for sparc and MIPS/SGI
188: * use nothing for Alpha and HP.
189: */
190: #if !defined(BF_PTR) && !defined(BF_PTR2)
191: #define BF_PTR2
192: #endif
193:
194: #define BF_M 0x3fc
195: #define BF_0 22L
196: #define BF_1 14L
197: #define BF_2 6L
198: #define BF_3 2L /* left shift */
199:
200: #if defined(BF_PTR2)
201:
202: /* This is basically a special pentium verson */
203: #define BF_ENC(LL,R,S,P) \
204: { \
205: BF_LONG t,u,v; \
206: u=R>>BF_0; \
207: v=R>>BF_1; \
208: u&=BF_M; \
209: v&=BF_M; \
210: t= *(BF_LONG *)((unsigned char *)&(S[ 0])+u); \
211: u=R>>BF_2; \
212: t+= *(BF_LONG *)((unsigned char *)&(S[256])+v); \
213: v=R<<BF_3; \
214: u&=BF_M; \
215: v&=BF_M; \
216: t^= *(BF_LONG *)((unsigned char *)&(S[512])+u); \
217: LL^=P; \
218: t+= *(BF_LONG *)((unsigned char *)&(S[768])+v); \
219: LL^=t; \
220: }
221:
222: #elif defined(BF_PTR)
223:
224: /* This is normally very good */
225:
226: #define BF_ENC(LL,R,S,P) \
227: LL^=P; \
228: LL^= (((*(BF_LONG *)((unsigned char *)&(S[ 0])+((R>>BF_0)&BF_M))+ \
229: *(BF_LONG *)((unsigned char *)&(S[256])+((R>>BF_1)&BF_M)))^ \
230: *(BF_LONG *)((unsigned char *)&(S[512])+((R>>BF_2)&BF_M)))+ \
231: *(BF_LONG *)((unsigned char *)&(S[768])+((R<<BF_3)&BF_M)));
232: #else
233:
234: /* This will always work, even on 64 bit machines and strangly enough,
235: * on the Alpha it is faster than the pointer versions (both 32 and 64
236: * versions of BF_LONG) */
237:
238: #define BF_ENC(LL,R,S,P) \
239: LL^=P; \
240: LL^=((( S[ (int)(R>>24L) ] + \
241: S[0x0100+((int)(R>>16L)&0xff)])^ \
242: S[0x0200+((int)(R>> 8L)&0xff)])+ \
243: S[0x0300+((int)(R )&0xff)])&0xffffffffL;
244: #endif
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.