bd620840323b16b85ad0b793192be5d9ea732466
[openssl.git] / crypto / bf / bf_locl.org
1 /* crypto/bf/bf_locl.org */
2 /* Copyright (C) 1995-1997 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 /* 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( __sgi )                /* Newer MIPS */
78 #  define BF_PTR
79 #endif /* Systems-specific speed defines */
80
81 #undef c2l
82 #define c2l(c,l)        (l =((unsigned long)(*((c)++)))    , \
83                          l|=((unsigned long)(*((c)++)))<< 8L, \
84                          l|=((unsigned long)(*((c)++)))<<16L, \
85                          l|=((unsigned long)(*((c)++)))<<24L)
86
87 /* NOTE - c is not incremented as per c2l */
88 #undef c2ln
89 #define c2ln(c,l1,l2,n) { \
90                         c+=n; \
91                         l1=l2=0; \
92                         switch (n) { \
93                         case 8: l2 =((unsigned long)(*(--(c))))<<24L; \
94                         case 7: l2|=((unsigned long)(*(--(c))))<<16L; \
95                         case 6: l2|=((unsigned long)(*(--(c))))<< 8L; \
96                         case 5: l2|=((unsigned long)(*(--(c))));     \
97                         case 4: l1 =((unsigned long)(*(--(c))))<<24L; \
98                         case 3: l1|=((unsigned long)(*(--(c))))<<16L; \
99                         case 2: l1|=((unsigned long)(*(--(c))))<< 8L; \
100                         case 1: l1|=((unsigned long)(*(--(c))));     \
101                                 } \
102                         }
103
104 #undef l2c
105 #define l2c(l,c)        (*((c)++)=(unsigned char)(((l)     )&0xff), \
106                          *((c)++)=(unsigned char)(((l)>> 8L)&0xff), \
107                          *((c)++)=(unsigned char)(((l)>>16L)&0xff), \
108                          *((c)++)=(unsigned char)(((l)>>24L)&0xff))
109
110 /* NOTE - c is not incremented as per l2c */
111 #undef l2cn
112 #define l2cn(l1,l2,c,n) { \
113                         c+=n; \
114                         switch (n) { \
115                         case 8: *(--(c))=(unsigned char)(((l2)>>24L)&0xff); \
116                         case 7: *(--(c))=(unsigned char)(((l2)>>16L)&0xff); \
117                         case 6: *(--(c))=(unsigned char)(((l2)>> 8L)&0xff); \
118                         case 5: *(--(c))=(unsigned char)(((l2)     )&0xff); \
119                         case 4: *(--(c))=(unsigned char)(((l1)>>24L)&0xff); \
120                         case 3: *(--(c))=(unsigned char)(((l1)>>16L)&0xff); \
121                         case 2: *(--(c))=(unsigned char)(((l1)>> 8L)&0xff); \
122                         case 1: *(--(c))=(unsigned char)(((l1)     )&0xff); \
123                                 } \
124                         }
125
126 /* NOTE - c is not incremented as per n2l */
127 #define n2ln(c,l1,l2,n) { \
128                         c+=n; \
129                         l1=l2=0; \
130                         switch (n) { \
131                         case 8: l2 =((unsigned long)(*(--(c))))    ; \
132                         case 7: l2|=((unsigned long)(*(--(c))))<< 8; \
133                         case 6: l2|=((unsigned long)(*(--(c))))<<16; \
134                         case 5: l2|=((unsigned long)(*(--(c))))<<24; \
135                         case 4: l1 =((unsigned long)(*(--(c))))    ; \
136                         case 3: l1|=((unsigned long)(*(--(c))))<< 8; \
137                         case 2: l1|=((unsigned long)(*(--(c))))<<16; \
138                         case 1: l1|=((unsigned long)(*(--(c))))<<24; \
139                                 } \
140                         }
141
142 /* NOTE - c is not incremented as per l2n */
143 #define l2nn(l1,l2,c,n) { \
144                         c+=n; \
145                         switch (n) { \
146                         case 8: *(--(c))=(unsigned char)(((l2)    )&0xff); \
147                         case 7: *(--(c))=(unsigned char)(((l2)>> 8)&0xff); \
148                         case 6: *(--(c))=(unsigned char)(((l2)>>16)&0xff); \
149                         case 5: *(--(c))=(unsigned char)(((l2)>>24)&0xff); \
150                         case 4: *(--(c))=(unsigned char)(((l1)    )&0xff); \
151                         case 3: *(--(c))=(unsigned char)(((l1)>> 8)&0xff); \
152                         case 2: *(--(c))=(unsigned char)(((l1)>>16)&0xff); \
153                         case 1: *(--(c))=(unsigned char)(((l1)>>24)&0xff); \
154                                 } \
155                         }
156
157 #undef n2l
158 #define n2l(c,l)        (l =((unsigned long)(*((c)++)))<<24L, \
159                          l|=((unsigned long)(*((c)++)))<<16L, \
160                          l|=((unsigned long)(*((c)++)))<< 8L, \
161                          l|=((unsigned long)(*((c)++))))
162
163 #undef l2n
164 #define l2n(l,c)        (*((c)++)=(unsigned char)(((l)>>24L)&0xff), \
165                          *((c)++)=(unsigned char)(((l)>>16L)&0xff), \
166                          *((c)++)=(unsigned char)(((l)>> 8L)&0xff), \
167                          *((c)++)=(unsigned char)(((l)     )&0xff))
168
169 /* This is actually a big endian algorithm, the most significate byte
170  * is used to lookup array 0 */
171
172 /* use BF_PTR2 for intel boxes,
173  * BF_PTR for sparc and MIPS/SGI
174  * use nothing for Alpha and HP.
175  */
176 #if !defined(BF_PTR) && !defined(BF_PTR2)
177 #undef BF_PTR
178 #endif
179
180 #define BF_M    0x3fc
181 #define BF_0    22L
182 #define BF_1    14L
183 #define BF_2     6L
184 #define BF_3     2L /* left shift */
185
186 #if defined(BF_PTR2)
187
188 /* This is basically a special pentium verson */
189 #define BF_ENC(LL,R,S,P) \
190         { \
191         BF_LONG t,u,v; \
192         u=R>>BF_0; \
193         v=R>>BF_1; \
194         u&=BF_M; \
195         v&=BF_M; \
196         t=  *(BF_LONG *)((unsigned char *)&(S[  0])+u); \
197         u=R>>BF_2; \
198         t+= *(BF_LONG *)((unsigned char *)&(S[256])+v); \
199         v=R<<BF_3; \
200         u&=BF_M; \
201         v&=BF_M; \
202         t^= *(BF_LONG *)((unsigned char *)&(S[512])+u); \
203         LL^=P; \
204         t+= *(BF_LONG *)((unsigned char *)&(S[768])+v); \
205         LL^=t; \
206         }
207
208 #elif defined(BF_PTR)
209
210 /* This is normally very good */
211
212 #define BF_ENC(LL,R,S,P) \
213         LL^=P; \
214         LL^= (((*(BF_LONG *)((unsigned char *)&(S[  0])+((R>>BF_0)&BF_M))+ \
215                 *(BF_LONG *)((unsigned char *)&(S[256])+((R>>BF_1)&BF_M)))^ \
216                 *(BF_LONG *)((unsigned char *)&(S[512])+((R>>BF_2)&BF_M)))+ \
217                 *(BF_LONG *)((unsigned char *)&(S[768])+((R<<BF_3)&BF_M)));
218 #else
219
220 /* This will always work, even on 64 bit machines and strangly enough,
221  * on the Alpha it is faster than the pointer versions (both 32 and 64
222  * versions of BF_LONG) */
223
224 #define BF_ENC(LL,R,S,P) \
225         LL^=P; \
226         LL^=((( S[        (int)(R>>24L)      ] + \
227                 S[0x0100+((int)(R>>16L)&0xff)])^ \
228                 S[0x0200+((int)(R>> 8L)&0xff)])+ \
229                 S[0x0300+((int)(R     )&0xff)])&0xffffffffL;
230 #endif