This commit was generated by cvs2svn to track changes on a CVS vendor
[oweals/openssl.git] / crypto / des / des_locl.h
1 /* crypto/des/des_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 des_locl.org since des_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 #ifndef HEADER_DES_LOCL_H
68 #define HEADER_DES_LOCL_H
69
70 #if defined(WIN32) || defined(WIN16)
71 #ifndef MSDOS
72 #define MSDOS
73 #endif
74 #endif
75
76 #include <stdio.h>
77 #include <stdlib.h>
78 #ifndef MSDOS
79 #include <unistd.h>
80 #endif
81 #include "des.h"
82
83 #ifndef DES_DEFAULT_OPTIONS
84 /* the following is tweaked from a config script, that is why it is a
85  * protected undef/define */
86 #ifndef DES_PTR
87 #undef DES_PTR
88 #endif
89
90 /* This helps C compiler generate the correct code for multiple functional
91  * units.  It reduces register dependancies at the expense of 2 more
92  * registers */
93 #ifndef DES_RISC1
94 #undef DES_RISC1
95 #endif
96
97 #ifndef DES_RISC2
98 #undef DES_RISC2
99 #endif
100
101 #if defined(DES_RISC1) && defined(DES_RISC2)
102 YOU SHOULD NOT HAVE BOTH DES_RISC1 AND DES_RISC2 DEFINED!!!!!
103 #endif
104
105 /* Unroll the inner loop, this sometimes helps, sometimes hinders.
106  * Very mucy CPU dependant */
107 #ifndef DES_UNROLL
108 #undef DES_UNROLL
109 #endif
110
111 /* These default values were supplied by
112  * Peter Gutman <pgut001@cs.auckland.ac.nz>
113  * They are only used if nothing else has been defined */
114 #if !defined(DES_PTR) && !defined(DES_RISC1) && !defined(DES_RISC2) && !defined(DES_UNROLL)
115 /* Special defines which change the way the code is built depending on the
116    CPU and OS.  For SGI machines you can use _MIPS_SZLONG (32 or 64) to find
117    even newer MIPS CPU's, but at the moment one size fits all for
118    optimization options.  Older Sparc's work better with only UNROLL, but
119    there's no way to tell at compile time what it is you're running on */
120  
121 #if defined( sun )              /* Newer Sparc's */
122 #  define DES_PTR
123 #  define DES_RISC1
124 #  define DES_UNROLL
125 #elif defined( __ultrix )       /* Older MIPS */
126 #  define DES_PTR
127 #  define DES_RISC2
128 #  define DES_UNROLL
129 #elif defined( __osf1__ )       /* Alpha */
130 #  define DES_PTR
131 #  define DES_RISC2
132 #elif defined ( _AIX )          /* RS6000 */
133   /* Unknown */
134 #elif defined( __hpux )         /* HP-PA */
135   /* Unknown */
136 #elif defined( __aux )          /* 68K */
137   /* Unknown */
138 #elif defined( __dgux )         /* 88K (but P6 in latest boxes) */
139 #  define DES_UNROLL
140 #elif defined( __sgi )          /* Newer MIPS */
141 #  define DES_PTR
142 #  define DES_RISC2
143 #  define DES_UNROLL
144 #elif defined( i386 )           /* x86 boxes, should be gcc */
145 #  define DES_PTR
146 #  define DES_RISC1
147 #  define DES_UNROLL
148 #endif /* Systems-specific speed defines */
149 #endif
150
151 #endif /* DES_DEFAULT_OPTIONS */
152
153 #ifdef MSDOS            /* Visual C++ 2.1 (Windows NT/95) */
154 #include <stdlib.h>
155 #include <errno.h>
156 #include <time.h>
157 #include <io.h>
158 #ifndef RAND
159 #define RAND
160 #endif
161 #undef NOPROTO
162 #endif
163
164 #if defined(__STDC__) || defined(VMS) || defined(M_XENIX) || defined(MSDOS)
165 #include <string.h>
166 #endif
167
168 #ifndef RAND
169 #define RAND
170 #endif
171
172 #ifdef linux
173 #undef RAND
174 #endif
175
176 #ifdef MSDOS
177 #define getpid() 2
178 #define RAND
179 #undef NOPROTO
180 #endif
181
182 #if defined(NOCONST)
183 #define const
184 #endif
185
186 #ifdef __STDC__
187 #undef NOPROTO
188 #endif
189
190 #ifdef RAND
191 #define srandom(s) srand(s)
192 #define random rand
193 #endif
194
195 #define ITERATIONS 16
196 #define HALF_ITERATIONS 8
197
198 /* used in des_read and des_write */
199 #define MAXWRITE        (1024*16)
200 #define BSIZE           (MAXWRITE+4)
201
202 #define c2l(c,l)        (l =((DES_LONG)(*((c)++)))    , \
203                          l|=((DES_LONG)(*((c)++)))<< 8L, \
204                          l|=((DES_LONG)(*((c)++)))<<16L, \
205                          l|=((DES_LONG)(*((c)++)))<<24L)
206
207 /* NOTE - c is not incremented as per c2l */
208 #define c2ln(c,l1,l2,n) { \
209                         c+=n; \
210                         l1=l2=0; \
211                         switch (n) { \
212                         case 8: l2 =((DES_LONG)(*(--(c))))<<24L; \
213                         case 7: l2|=((DES_LONG)(*(--(c))))<<16L; \
214                         case 6: l2|=((DES_LONG)(*(--(c))))<< 8L; \
215                         case 5: l2|=((DES_LONG)(*(--(c))));     \
216                         case 4: l1 =((DES_LONG)(*(--(c))))<<24L; \
217                         case 3: l1|=((DES_LONG)(*(--(c))))<<16L; \
218                         case 2: l1|=((DES_LONG)(*(--(c))))<< 8L; \
219                         case 1: l1|=((DES_LONG)(*(--(c))));     \
220                                 } \
221                         }
222
223 #define l2c(l,c)        (*((c)++)=(unsigned char)(((l)     )&0xff), \
224                          *((c)++)=(unsigned char)(((l)>> 8L)&0xff), \
225                          *((c)++)=(unsigned char)(((l)>>16L)&0xff), \
226                          *((c)++)=(unsigned char)(((l)>>24L)&0xff))
227
228 /* replacements for htonl and ntohl since I have no idea what to do
229  * when faced with machines with 8 byte longs. */
230 #define HDRSIZE 4
231
232 #define n2l(c,l)        (l =((DES_LONG)(*((c)++)))<<24L, \
233                          l|=((DES_LONG)(*((c)++)))<<16L, \
234                          l|=((DES_LONG)(*((c)++)))<< 8L, \
235                          l|=((DES_LONG)(*((c)++))))
236
237 #define l2n(l,c)        (*((c)++)=(unsigned char)(((l)>>24L)&0xff), \
238                          *((c)++)=(unsigned char)(((l)>>16L)&0xff), \
239                          *((c)++)=(unsigned char)(((l)>> 8L)&0xff), \
240                          *((c)++)=(unsigned char)(((l)     )&0xff))
241
242 /* NOTE - c is not incremented as per l2c */
243 #define l2cn(l1,l2,c,n) { \
244                         c+=n; \
245                         switch (n) { \
246                         case 8: *(--(c))=(unsigned char)(((l2)>>24L)&0xff); \
247                         case 7: *(--(c))=(unsigned char)(((l2)>>16L)&0xff); \
248                         case 6: *(--(c))=(unsigned char)(((l2)>> 8L)&0xff); \
249                         case 5: *(--(c))=(unsigned char)(((l2)     )&0xff); \
250                         case 4: *(--(c))=(unsigned char)(((l1)>>24L)&0xff); \
251                         case 3: *(--(c))=(unsigned char)(((l1)>>16L)&0xff); \
252                         case 2: *(--(c))=(unsigned char)(((l1)>> 8L)&0xff); \
253                         case 1: *(--(c))=(unsigned char)(((l1)     )&0xff); \
254                                 } \
255                         }
256
257 #if defined(WIN32)
258 #define ROTATE(a,n)     (_lrotr(a,n))
259 #else
260 #define ROTATE(a,n)     (((a)>>(n))+((a)<<(32-(n))))
261 #endif
262
263 /* Don't worry about the LOAD_DATA() stuff, that is used by
264  * fcrypt() to add it's little bit to the front */
265
266 #ifdef DES_FCRYPT
267
268 #define LOAD_DATA_tmp(R,S,u,t,E0,E1) \
269         { DES_LONG tmp; LOAD_DATA(R,S,u,t,E0,E1,tmp); }
270
271 #define LOAD_DATA(R,S,u,t,E0,E1,tmp) \
272         t=R^(R>>16L); \
273         u=t&E0; t&=E1; \
274         tmp=(u<<16); u^=R^s[S  ]; u^=tmp; \
275         tmp=(t<<16); t^=R^s[S+1]; t^=tmp
276 #else
277 #define LOAD_DATA_tmp(a,b,c,d,e,f) LOAD_DATA(a,b,c,d,e,f,g)
278 #define LOAD_DATA(R,S,u,t,E0,E1,tmp) \
279         u=R^s[S  ]; \
280         t=R^s[S+1]
281 #endif
282
283 /* The changes to this macro may help or hinder, depending on the
284  * compiler and the achitecture.  gcc2 always seems to do well :-).
285  * Inspired by Dana How <how@isl.stanford.edu>
286  * DO NOT use the alternative version on machines with 8 byte longs.
287  * It does not seem to work on the Alpha, even when DES_LONG is 4
288  * bytes, probably an issue of accessing non-word aligned objects :-( */
289 #ifdef DES_PTR
290
291 /* It recently occured to me that 0^0^0^0^0^0^0 == 0, so there
292  * is no reason to not xor all the sub items together.  This potentially
293  * saves a register since things can be xored directly into L */
294
295 #if defined(DES_RISC1) || defined(DES_RISC2)
296 #ifdef DES_RISC1
297 #define D_ENCRYPT(LL,R,S) { \
298         unsigned int u1,u2,u3; \
299         LOAD_DATA(R,S,u,t,E0,E1,u1); \
300         u2=(int)u>>8L; \
301         u1=(int)u&0xfc; \
302         u2&=0xfc; \
303         t=ROTATE(t,4); \
304         u>>=16L; \
305         LL^= *(DES_LONG *)((unsigned char *)des_SP      +u1); \
306         LL^= *(DES_LONG *)((unsigned char *)des_SP+0x200+u2); \
307         u3=(int)(u>>8L); \
308         u1=(int)u&0xfc; \
309         u3&=0xfc; \
310         LL^= *(DES_LONG *)((unsigned char *)des_SP+0x400+u1); \
311         LL^= *(DES_LONG *)((unsigned char *)des_SP+0x600+u3); \
312         u2=(int)t>>8L; \
313         u1=(int)t&0xfc; \
314         u2&=0xfc; \
315         t>>=16L; \
316         LL^= *(DES_LONG *)((unsigned char *)des_SP+0x100+u1); \
317         LL^= *(DES_LONG *)((unsigned char *)des_SP+0x300+u2); \
318         u3=(int)t>>8L; \
319         u1=(int)t&0xfc; \
320         u3&=0xfc; \
321         LL^= *(DES_LONG *)((unsigned char *)des_SP+0x500+u1); \
322         LL^= *(DES_LONG *)((unsigned char *)des_SP+0x700+u3); }
323 #endif
324 #ifdef DES_RISC2
325 #define D_ENCRYPT(LL,R,S) { \
326         unsigned int u1,u2,s1,s2; \
327         LOAD_DATA(R,S,u,t,E0,E1,u1); \
328         u2=(int)u>>8L; \
329         u1=(int)u&0xfc; \
330         u2&=0xfc; \
331         t=ROTATE(t,4); \
332         LL^= *(DES_LONG *)((unsigned char *)des_SP      +u1); \
333         LL^= *(DES_LONG *)((unsigned char *)des_SP+0x200+u2); \
334         s1=(int)(u>>16L); \
335         s2=(int)(u>>24L); \
336         s1&=0xfc; \
337         s2&=0xfc; \
338         LL^= *(DES_LONG *)((unsigned char *)des_SP+0x400+s1); \
339         LL^= *(DES_LONG *)((unsigned char *)des_SP+0x600+s2); \
340         u2=(int)t>>8L; \
341         u1=(int)t&0xfc; \
342         u2&=0xfc; \
343         LL^= *(DES_LONG *)((unsigned char *)des_SP+0x100+u1); \
344         LL^= *(DES_LONG *)((unsigned char *)des_SP+0x300+u2); \
345         s1=(int)(t>>16L); \
346         s2=(int)(t>>24L); \
347         s1&=0xfc; \
348         s2&=0xfc; \
349         LL^= *(DES_LONG *)((unsigned char *)des_SP+0x500+s1); \
350         LL^= *(DES_LONG *)((unsigned char *)des_SP+0x700+s2); }
351 #endif
352 #else
353 #define D_ENCRYPT(LL,R,S) { \
354         LOAD_DATA_tmp(R,S,u,t,E0,E1); \
355         t=ROTATE(t,4); \
356         LL^= \
357         *(DES_LONG *)((unsigned char *)des_SP      +((u     )&0xfc))^ \
358         *(DES_LONG *)((unsigned char *)des_SP+0x200+((u>> 8L)&0xfc))^ \
359         *(DES_LONG *)((unsigned char *)des_SP+0x400+((u>>16L)&0xfc))^ \
360         *(DES_LONG *)((unsigned char *)des_SP+0x600+((u>>24L)&0xfc))^ \
361         *(DES_LONG *)((unsigned char *)des_SP+0x100+((t     )&0xfc))^ \
362         *(DES_LONG *)((unsigned char *)des_SP+0x300+((t>> 8L)&0xfc))^ \
363         *(DES_LONG *)((unsigned char *)des_SP+0x500+((t>>16L)&0xfc))^ \
364         *(DES_LONG *)((unsigned char *)des_SP+0x700+((t>>24L)&0xfc)); }
365 #endif
366
367 #else /* original version */
368
369 #if defined(DES_RISC1) || defined(DES_RISC2)
370 #ifdef DES_RISC1
371 #define D_ENCRYPT(LL,R,S) {\
372         unsigned int u1,u2,u3; \
373         LOAD_DATA(R,S,u,t,E0,E1,u1); \
374         u>>=2L; \
375         t=ROTATE(t,6); \
376         u2=(int)u>>8L; \
377         u1=(int)u&0x3f; \
378         u2&=0x3f; \
379         u>>=16L; \
380         LL^=des_SPtrans[0][u1]; \
381         LL^=des_SPtrans[2][u2]; \
382         u3=(int)u>>8L; \
383         u1=(int)u&0x3f; \
384         u3&=0x3f; \
385         LL^=des_SPtrans[4][u1]; \
386         LL^=des_SPtrans[6][u3]; \
387         u2=(int)t>>8L; \
388         u1=(int)t&0x3f; \
389         u2&=0x3f; \
390         t>>=16L; \
391         LL^=des_SPtrans[1][u1]; \
392         LL^=des_SPtrans[3][u2]; \
393         u3=(int)t>>8L; \
394         u1=(int)t&0x3f; \
395         u3&=0x3f; \
396         LL^=des_SPtrans[5][u1]; \
397         LL^=des_SPtrans[7][u3]; }
398 #endif
399 #ifdef DES_RISC2
400 #define D_ENCRYPT(LL,R,S) {\
401         unsigned int u1,u2,s1,s2; \
402         LOAD_DATA(R,S,u,t,E0,E1,u1); \
403         u>>=2L; \
404         t=ROTATE(t,6); \
405         u2=(int)u>>8L; \
406         u1=(int)u&0x3f; \
407         u2&=0x3f; \
408         LL^=des_SPtrans[0][u1]; \
409         LL^=des_SPtrans[2][u2]; \
410         s1=(int)u>>16L; \
411         s2=(int)u>>24L; \
412         s1&=0x3f; \
413         s2&=0x3f; \
414         LL^=des_SPtrans[4][s1]; \
415         LL^=des_SPtrans[6][s2]; \
416         u2=(int)t>>8L; \
417         u1=(int)t&0x3f; \
418         u2&=0x3f; \
419         LL^=des_SPtrans[1][u1]; \
420         LL^=des_SPtrans[3][u2]; \
421         s1=(int)t>>16; \
422         s2=(int)t>>24L; \
423         s1&=0x3f; \
424         s2&=0x3f; \
425         LL^=des_SPtrans[5][s1]; \
426         LL^=des_SPtrans[7][s2]; }
427 #endif
428
429 #else
430
431 #define D_ENCRYPT(LL,R,S) {\
432         LOAD_DATA_tmp(R,S,u,t,E0,E1); \
433         t=ROTATE(t,4); \
434         LL^=\
435                 des_SPtrans[0][(u>> 2L)&0x3f]^ \
436                 des_SPtrans[2][(u>>10L)&0x3f]^ \
437                 des_SPtrans[4][(u>>18L)&0x3f]^ \
438                 des_SPtrans[6][(u>>26L)&0x3f]^ \
439                 des_SPtrans[1][(t>> 2L)&0x3f]^ \
440                 des_SPtrans[3][(t>>10L)&0x3f]^ \
441                 des_SPtrans[5][(t>>18L)&0x3f]^ \
442                 des_SPtrans[7][(t>>26L)&0x3f]; }
443 #endif
444 #endif
445
446         /* IP and FP
447          * The problem is more of a geometric problem that random bit fiddling.
448          0  1  2  3  4  5  6  7      62 54 46 38 30 22 14  6
449          8  9 10 11 12 13 14 15      60 52 44 36 28 20 12  4
450         16 17 18 19 20 21 22 23      58 50 42 34 26 18 10  2
451         24 25 26 27 28 29 30 31  to  56 48 40 32 24 16  8  0
452
453         32 33 34 35 36 37 38 39      63 55 47 39 31 23 15  7
454         40 41 42 43 44 45 46 47      61 53 45 37 29 21 13  5
455         48 49 50 51 52 53 54 55      59 51 43 35 27 19 11  3
456         56 57 58 59 60 61 62 63      57 49 41 33 25 17  9  1
457
458         The output has been subject to swaps of the form
459         0 1 -> 3 1 but the odd and even bits have been put into
460         2 3    2 0
461         different words.  The main trick is to remember that
462         t=((l>>size)^r)&(mask);
463         r^=t;
464         l^=(t<<size);
465         can be used to swap and move bits between words.
466
467         So l =  0  1  2  3  r = 16 17 18 19
468                 4  5  6  7      20 21 22 23
469                 8  9 10 11      24 25 26 27
470                12 13 14 15      28 29 30 31
471         becomes (for size == 2 and mask == 0x3333)
472            t =   2^16  3^17 -- --   l =  0  1 16 17  r =  2  3 18 19
473                  6^20  7^21 -- --        4  5 20 21       6  7 22 23
474                 10^24 11^25 -- --        8  9 24 25      10 11 24 25
475                 14^28 15^29 -- --       12 13 28 29      14 15 28 29
476
477         Thanks for hints from Richard Outerbridge - he told me IP&FP
478         could be done in 15 xor, 10 shifts and 5 ands.
479         When I finally started to think of the problem in 2D
480         I first got ~42 operations without xors.  When I remembered
481         how to use xors :-) I got it to its final state.
482         */
483 #define PERM_OP(a,b,t,n,m) ((t)=((((a)>>(n))^(b))&(m)),\
484         (b)^=(t),\
485         (a)^=((t)<<(n)))
486
487 #define IP(l,r) \
488         { \
489         register DES_LONG tt; \
490         PERM_OP(r,l,tt, 4,0x0f0f0f0fL); \
491         PERM_OP(l,r,tt,16,0x0000ffffL); \
492         PERM_OP(r,l,tt, 2,0x33333333L); \
493         PERM_OP(l,r,tt, 8,0x00ff00ffL); \
494         PERM_OP(r,l,tt, 1,0x55555555L); \
495         }
496
497 #define FP(l,r) \
498         { \
499         register DES_LONG tt; \
500         PERM_OP(l,r,tt, 1,0x55555555L); \
501         PERM_OP(r,l,tt, 8,0x00ff00ffL); \
502         PERM_OP(l,r,tt, 2,0x33333333L); \
503         PERM_OP(r,l,tt,16,0x0000ffffL); \
504         PERM_OP(l,r,tt, 4,0x0f0f0f0fL); \
505         }
506
507 extern const DES_LONG des_SPtrans[8][64];
508
509 #ifndef NOPROTO
510 void fcrypt_body(DES_LONG *out,des_key_schedule ks,
511         DES_LONG Eswap0, DES_LONG Eswap1);
512 #else
513 void fcrypt_body();
514 #endif
515
516 #endif