|
|
1.1 root 1: /* crypto/des/des_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 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: #define 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: #define 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: #define DES_UNROLL
109: #endif
110:
111: /* These default values were supplied by
112: * Peter Gutman <[email protected]>
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 <[email protected]>
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
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.