source: trunk/third/ssh/crypt.c @ 10564

Revision 10564, 20.5 KB checked in by danw, 27 years ago (diff)
This commit was generated by cvs2svn to compensate for changes in r10563, which included commits to RCS files with non-trunk default branches.
Line 
1/* This file is fcrypt.c taken from SSLeay-0.4.3a.  This file is only compiled
2   in on those systems that don't have crypt() in the system libraries.
3   //ylo */
4
5/* fcrypt.c */
6/* Copyright (C) 1995 Eric Young (eay@mincom.oz.au).
7 * All rights reserved.
8 * Copyright remains Eric Young's, and as such any Copyright notices in
9 * the code are not to be removed.
10 * See the COPYRIGHT file in the libdes distribution for more details.
11 */
12
13#include <stdio.h>
14
15/* Eric Young.
16 * This version of crypt has been developed from my MIT compatable
17 * DES library.
18 * The library is available at pub/Crypto/DES at ftp.psy.uq.oz.au
19 * eay@mincom.oz.au or eay@psych.psy.uq.oz.au
20 */
21
22#if !defined(_LIBC) || defined(NOCONST)
23#define const
24#endif
25
26typedef unsigned char des_cblock[8];
27
28typedef struct des_ks_struct
29        {
30        union   {
31                des_cblock _;
32                /* make sure things are correct size on machines with
33                 * 8 byte longs */
34                unsigned long pad[2];
35                } ks;
36#define _       ks._
37        } des_key_schedule[16];
38
39#define DES_KEY_SZ      (sizeof(des_cblock))
40#define DES_ENCRYPT     1
41#define DES_DECRYPT     0
42
43#define ITERATIONS 16
44#define HALF_ITERATIONS 8
45
46#define c2l(c,l)        (l =((unsigned long)(*((c)++)))    , \
47                         l|=((unsigned long)(*((c)++)))<< 8, \
48                         l|=((unsigned long)(*((c)++)))<<16, \
49                         l|=((unsigned long)(*((c)++)))<<24)
50
51#define l2c(l,c)        (*((c)++)=(unsigned char)(((l)    )&0xff), \
52                         *((c)++)=(unsigned char)(((l)>> 8)&0xff), \
53                         *((c)++)=(unsigned char)(((l)>>16)&0xff), \
54                         *((c)++)=(unsigned char)(((l)>>24)&0xff))
55
56static const unsigned long SPtrans[8][64]={
57/* nibble 0 */
580x00820200, 0x00020000, 0x80800000, 0x80820200,
590x00800000, 0x80020200, 0x80020000, 0x80800000,
600x80020200, 0x00820200, 0x00820000, 0x80000200,
610x80800200, 0x00800000, 0x00000000, 0x80020000,
620x00020000, 0x80000000, 0x00800200, 0x00020200,
630x80820200, 0x00820000, 0x80000200, 0x00800200,
640x80000000, 0x00000200, 0x00020200, 0x80820000,
650x00000200, 0x80800200, 0x80820000, 0x00000000,
660x00000000, 0x80820200, 0x00800200, 0x80020000,
670x00820200, 0x00020000, 0x80000200, 0x00800200,
680x80820000, 0x00000200, 0x00020200, 0x80800000,
690x80020200, 0x80000000, 0x80800000, 0x00820000,
700x80820200, 0x00020200, 0x00820000, 0x80800200,
710x00800000, 0x80000200, 0x80020000, 0x00000000,
720x00020000, 0x00800000, 0x80800200, 0x00820200,
730x80000000, 0x80820000, 0x00000200, 0x80020200,
74/* nibble 1 */
750x10042004, 0x00000000, 0x00042000, 0x10040000,
760x10000004, 0x00002004, 0x10002000, 0x00042000,
770x00002000, 0x10040004, 0x00000004, 0x10002000,
780x00040004, 0x10042000, 0x10040000, 0x00000004,
790x00040000, 0x10002004, 0x10040004, 0x00002000,
800x00042004, 0x10000000, 0x00000000, 0x00040004,
810x10002004, 0x00042004, 0x10042000, 0x10000004,
820x10000000, 0x00040000, 0x00002004, 0x10042004,
830x00040004, 0x10042000, 0x10002000, 0x00042004,
840x10042004, 0x00040004, 0x10000004, 0x00000000,
850x10000000, 0x00002004, 0x00040000, 0x10040004,
860x00002000, 0x10000000, 0x00042004, 0x10002004,
870x10042000, 0x00002000, 0x00000000, 0x10000004,
880x00000004, 0x10042004, 0x00042000, 0x10040000,
890x10040004, 0x00040000, 0x00002004, 0x10002000,
900x10002004, 0x00000004, 0x10040000, 0x00042000,
91/* nibble 2 */
920x41000000, 0x01010040, 0x00000040, 0x41000040,
930x40010000, 0x01000000, 0x41000040, 0x00010040,
940x01000040, 0x00010000, 0x01010000, 0x40000000,
950x41010040, 0x40000040, 0x40000000, 0x41010000,
960x00000000, 0x40010000, 0x01010040, 0x00000040,
970x40000040, 0x41010040, 0x00010000, 0x41000000,
980x41010000, 0x01000040, 0x40010040, 0x01010000,
990x00010040, 0x00000000, 0x01000000, 0x40010040,
1000x01010040, 0x00000040, 0x40000000, 0x00010000,
1010x40000040, 0x40010000, 0x01010000, 0x41000040,
1020x00000000, 0x01010040, 0x00010040, 0x41010000,
1030x40010000, 0x01000000, 0x41010040, 0x40000000,
1040x40010040, 0x41000000, 0x01000000, 0x41010040,
1050x00010000, 0x01000040, 0x41000040, 0x00010040,
1060x01000040, 0x00000000, 0x41010000, 0x40000040,
1070x41000000, 0x40010040, 0x00000040, 0x01010000,
108/* nibble 3 */
1090x00100402, 0x04000400, 0x00000002, 0x04100402,
1100x00000000, 0x04100000, 0x04000402, 0x00100002,
1110x04100400, 0x04000002, 0x04000000, 0x00000402,
1120x04000002, 0x00100402, 0x00100000, 0x04000000,
1130x04100002, 0x00100400, 0x00000400, 0x00000002,
1140x00100400, 0x04000402, 0x04100000, 0x00000400,
1150x00000402, 0x00000000, 0x00100002, 0x04100400,
1160x04000400, 0x04100002, 0x04100402, 0x00100000,
1170x04100002, 0x00000402, 0x00100000, 0x04000002,
1180x00100400, 0x04000400, 0x00000002, 0x04100000,
1190x04000402, 0x00000000, 0x00000400, 0x00100002,
1200x00000000, 0x04100002, 0x04100400, 0x00000400,
1210x04000000, 0x04100402, 0x00100402, 0x00100000,
1220x04100402, 0x00000002, 0x04000400, 0x00100402,
1230x00100002, 0x00100400, 0x04100000, 0x04000402,
1240x00000402, 0x04000000, 0x04000002, 0x04100400,
125/* nibble 4 */
1260x02000000, 0x00004000, 0x00000100, 0x02004108,
1270x02004008, 0x02000100, 0x00004108, 0x02004000,
1280x00004000, 0x00000008, 0x02000008, 0x00004100,
1290x02000108, 0x02004008, 0x02004100, 0x00000000,
1300x00004100, 0x02000000, 0x00004008, 0x00000108,
1310x02000100, 0x00004108, 0x00000000, 0x02000008,
1320x00000008, 0x02000108, 0x02004108, 0x00004008,
1330x02004000, 0x00000100, 0x00000108, 0x02004100,
1340x02004100, 0x02000108, 0x00004008, 0x02004000,
1350x00004000, 0x00000008, 0x02000008, 0x02000100,
1360x02000000, 0x00004100, 0x02004108, 0x00000000,
1370x00004108, 0x02000000, 0x00000100, 0x00004008,
1380x02000108, 0x00000100, 0x00000000, 0x02004108,
1390x02004008, 0x02004100, 0x00000108, 0x00004000,
1400x00004100, 0x02004008, 0x02000100, 0x00000108,
1410x00000008, 0x00004108, 0x02004000, 0x02000008,
142/* nibble 5 */
1430x20000010, 0x00080010, 0x00000000, 0x20080800,
1440x00080010, 0x00000800, 0x20000810, 0x00080000,
1450x00000810, 0x20080810, 0x00080800, 0x20000000,
1460x20000800, 0x20000010, 0x20080000, 0x00080810,
1470x00080000, 0x20000810, 0x20080010, 0x00000000,
1480x00000800, 0x00000010, 0x20080800, 0x20080010,
1490x20080810, 0x20080000, 0x20000000, 0x00000810,
1500x00000010, 0x00080800, 0x00080810, 0x20000800,
1510x00000810, 0x20000000, 0x20000800, 0x00080810,
1520x20080800, 0x00080010, 0x00000000, 0x20000800,
1530x20000000, 0x00000800, 0x20080010, 0x00080000,
1540x00080010, 0x20080810, 0x00080800, 0x00000010,
1550x20080810, 0x00080800, 0x00080000, 0x20000810,
1560x20000010, 0x20080000, 0x00080810, 0x00000000,
1570x00000800, 0x20000010, 0x20000810, 0x20080800,
1580x20080000, 0x00000810, 0x00000010, 0x20080010,
159/* nibble 6 */
1600x00001000, 0x00000080, 0x00400080, 0x00400001,
1610x00401081, 0x00001001, 0x00001080, 0x00000000,
1620x00400000, 0x00400081, 0x00000081, 0x00401000,
1630x00000001, 0x00401080, 0x00401000, 0x00000081,
1640x00400081, 0x00001000, 0x00001001, 0x00401081,
1650x00000000, 0x00400080, 0x00400001, 0x00001080,
1660x00401001, 0x00001081, 0x00401080, 0x00000001,
1670x00001081, 0x00401001, 0x00000080, 0x00400000,
1680x00001081, 0x00401000, 0x00401001, 0x00000081,
1690x00001000, 0x00000080, 0x00400000, 0x00401001,
1700x00400081, 0x00001081, 0x00001080, 0x00000000,
1710x00000080, 0x00400001, 0x00000001, 0x00400080,
1720x00000000, 0x00400081, 0x00400080, 0x00001080,
1730x00000081, 0x00001000, 0x00401081, 0x00400000,
1740x00401080, 0x00000001, 0x00001001, 0x00401081,
1750x00400001, 0x00401080, 0x00401000, 0x00001001,
176/* nibble 7 */
1770x08200020, 0x08208000, 0x00008020, 0x00000000,
1780x08008000, 0x00200020, 0x08200000, 0x08208020,
1790x00000020, 0x08000000, 0x00208000, 0x00008020,
1800x00208020, 0x08008020, 0x08000020, 0x08200000,
1810x00008000, 0x00208020, 0x00200020, 0x08008000,
1820x08208020, 0x08000020, 0x00000000, 0x00208000,
1830x08000000, 0x00200000, 0x08008020, 0x08200020,
1840x00200000, 0x00008000, 0x08208000, 0x00000020,
1850x00200000, 0x00008000, 0x08000020, 0x08208020,
1860x00008020, 0x08000000, 0x00000000, 0x00208000,
1870x08200020, 0x08008020, 0x08008000, 0x00200020,
1880x08208000, 0x00000020, 0x00200020, 0x08008000,
1890x08208020, 0x00200000, 0x08200000, 0x08000020,
1900x00208000, 0x00008020, 0x08008020, 0x08200000,
1910x00000020, 0x08208000, 0x00208020, 0x00000000,
1920x08000000, 0x08200020, 0x00008000, 0x00208020};
193static const unsigned long skb[8][64]={
194/* for C bits (numbered as per FIPS 46) 1 2 3 4 5 6 */
1950x00000000,0x00000010,0x20000000,0x20000010,
1960x00010000,0x00010010,0x20010000,0x20010010,
1970x00000800,0x00000810,0x20000800,0x20000810,
1980x00010800,0x00010810,0x20010800,0x20010810,
1990x00000020,0x00000030,0x20000020,0x20000030,
2000x00010020,0x00010030,0x20010020,0x20010030,
2010x00000820,0x00000830,0x20000820,0x20000830,
2020x00010820,0x00010830,0x20010820,0x20010830,
2030x00080000,0x00080010,0x20080000,0x20080010,
2040x00090000,0x00090010,0x20090000,0x20090010,
2050x00080800,0x00080810,0x20080800,0x20080810,
2060x00090800,0x00090810,0x20090800,0x20090810,
2070x00080020,0x00080030,0x20080020,0x20080030,
2080x00090020,0x00090030,0x20090020,0x20090030,
2090x00080820,0x00080830,0x20080820,0x20080830,
2100x00090820,0x00090830,0x20090820,0x20090830,
211/* for C bits (numbered as per FIPS 46) 7 8 10 11 12 13 */
2120x00000000,0x02000000,0x00002000,0x02002000,
2130x00200000,0x02200000,0x00202000,0x02202000,
2140x00000004,0x02000004,0x00002004,0x02002004,
2150x00200004,0x02200004,0x00202004,0x02202004,
2160x00000400,0x02000400,0x00002400,0x02002400,
2170x00200400,0x02200400,0x00202400,0x02202400,
2180x00000404,0x02000404,0x00002404,0x02002404,
2190x00200404,0x02200404,0x00202404,0x02202404,
2200x10000000,0x12000000,0x10002000,0x12002000,
2210x10200000,0x12200000,0x10202000,0x12202000,
2220x10000004,0x12000004,0x10002004,0x12002004,
2230x10200004,0x12200004,0x10202004,0x12202004,
2240x10000400,0x12000400,0x10002400,0x12002400,
2250x10200400,0x12200400,0x10202400,0x12202400,
2260x10000404,0x12000404,0x10002404,0x12002404,
2270x10200404,0x12200404,0x10202404,0x12202404,
228/* for C bits (numbered as per FIPS 46) 14 15 16 17 19 20 */
2290x00000000,0x00000001,0x00040000,0x00040001,
2300x01000000,0x01000001,0x01040000,0x01040001,
2310x00000002,0x00000003,0x00040002,0x00040003,
2320x01000002,0x01000003,0x01040002,0x01040003,
2330x00000200,0x00000201,0x00040200,0x00040201,
2340x01000200,0x01000201,0x01040200,0x01040201,
2350x00000202,0x00000203,0x00040202,0x00040203,
2360x01000202,0x01000203,0x01040202,0x01040203,
2370x08000000,0x08000001,0x08040000,0x08040001,
2380x09000000,0x09000001,0x09040000,0x09040001,
2390x08000002,0x08000003,0x08040002,0x08040003,
2400x09000002,0x09000003,0x09040002,0x09040003,
2410x08000200,0x08000201,0x08040200,0x08040201,
2420x09000200,0x09000201,0x09040200,0x09040201,
2430x08000202,0x08000203,0x08040202,0x08040203,
2440x09000202,0x09000203,0x09040202,0x09040203,
245/* for C bits (numbered as per FIPS 46) 21 23 24 26 27 28 */
2460x00000000,0x00100000,0x00000100,0x00100100,
2470x00000008,0x00100008,0x00000108,0x00100108,
2480x00001000,0x00101000,0x00001100,0x00101100,
2490x00001008,0x00101008,0x00001108,0x00101108,
2500x04000000,0x04100000,0x04000100,0x04100100,
2510x04000008,0x04100008,0x04000108,0x04100108,
2520x04001000,0x04101000,0x04001100,0x04101100,
2530x04001008,0x04101008,0x04001108,0x04101108,
2540x00020000,0x00120000,0x00020100,0x00120100,
2550x00020008,0x00120008,0x00020108,0x00120108,
2560x00021000,0x00121000,0x00021100,0x00121100,
2570x00021008,0x00121008,0x00021108,0x00121108,
2580x04020000,0x04120000,0x04020100,0x04120100,
2590x04020008,0x04120008,0x04020108,0x04120108,
2600x04021000,0x04121000,0x04021100,0x04121100,
2610x04021008,0x04121008,0x04021108,0x04121108,
262/* for D bits (numbered as per FIPS 46) 1 2 3 4 5 6 */
2630x00000000,0x10000000,0x00010000,0x10010000,
2640x00000004,0x10000004,0x00010004,0x10010004,
2650x20000000,0x30000000,0x20010000,0x30010000,
2660x20000004,0x30000004,0x20010004,0x30010004,
2670x00100000,0x10100000,0x00110000,0x10110000,
2680x00100004,0x10100004,0x00110004,0x10110004,
2690x20100000,0x30100000,0x20110000,0x30110000,
2700x20100004,0x30100004,0x20110004,0x30110004,
2710x00001000,0x10001000,0x00011000,0x10011000,
2720x00001004,0x10001004,0x00011004,0x10011004,
2730x20001000,0x30001000,0x20011000,0x30011000,
2740x20001004,0x30001004,0x20011004,0x30011004,
2750x00101000,0x10101000,0x00111000,0x10111000,
2760x00101004,0x10101004,0x00111004,0x10111004,
2770x20101000,0x30101000,0x20111000,0x30111000,
2780x20101004,0x30101004,0x20111004,0x30111004,
279/* for D bits (numbered as per FIPS 46) 8 9 11 12 13 14 */
2800x00000000,0x08000000,0x00000008,0x08000008,
2810x00000400,0x08000400,0x00000408,0x08000408,
2820x00020000,0x08020000,0x00020008,0x08020008,
2830x00020400,0x08020400,0x00020408,0x08020408,
2840x00000001,0x08000001,0x00000009,0x08000009,
2850x00000401,0x08000401,0x00000409,0x08000409,
2860x00020001,0x08020001,0x00020009,0x08020009,
2870x00020401,0x08020401,0x00020409,0x08020409,
2880x02000000,0x0A000000,0x02000008,0x0A000008,
2890x02000400,0x0A000400,0x02000408,0x0A000408,
2900x02020000,0x0A020000,0x02020008,0x0A020008,
2910x02020400,0x0A020400,0x02020408,0x0A020408,
2920x02000001,0x0A000001,0x02000009,0x0A000009,
2930x02000401,0x0A000401,0x02000409,0x0A000409,
2940x02020001,0x0A020001,0x02020009,0x0A020009,
2950x02020401,0x0A020401,0x02020409,0x0A020409,
296/* for D bits (numbered as per FIPS 46) 16 17 18 19 20 21 */
2970x00000000,0x00000100,0x00080000,0x00080100,
2980x01000000,0x01000100,0x01080000,0x01080100,
2990x00000010,0x00000110,0x00080010,0x00080110,
3000x01000010,0x01000110,0x01080010,0x01080110,
3010x00200000,0x00200100,0x00280000,0x00280100,
3020x01200000,0x01200100,0x01280000,0x01280100,
3030x00200010,0x00200110,0x00280010,0x00280110,
3040x01200010,0x01200110,0x01280010,0x01280110,
3050x00000200,0x00000300,0x00080200,0x00080300,
3060x01000200,0x01000300,0x01080200,0x01080300,
3070x00000210,0x00000310,0x00080210,0x00080310,
3080x01000210,0x01000310,0x01080210,0x01080310,
3090x00200200,0x00200300,0x00280200,0x00280300,
3100x01200200,0x01200300,0x01280200,0x01280300,
3110x00200210,0x00200310,0x00280210,0x00280310,
3120x01200210,0x01200310,0x01280210,0x01280310,
313/* for D bits (numbered as per FIPS 46) 22 23 24 25 27 28 */
3140x00000000,0x04000000,0x00040000,0x04040000,
3150x00000002,0x04000002,0x00040002,0x04040002,
3160x00002000,0x04002000,0x00042000,0x04042000,
3170x00002002,0x04002002,0x00042002,0x04042002,
3180x00000020,0x04000020,0x00040020,0x04040020,
3190x00000022,0x04000022,0x00040022,0x04040022,
3200x00002020,0x04002020,0x00042020,0x04042020,
3210x00002022,0x04002022,0x00042022,0x04042022,
3220x00000800,0x04000800,0x00040800,0x04040800,
3230x00000802,0x04000802,0x00040802,0x04040802,
3240x00002800,0x04002800,0x00042800,0x04042800,
3250x00002802,0x04002802,0x00042802,0x04042802,
3260x00000820,0x04000820,0x00040820,0x04040820,
3270x00000822,0x04000822,0x00040822,0x04040822,
3280x00002820,0x04002820,0x00042820,0x04042820,
3290x00002822,0x04002822,0x00042822,0x04042822,
330};
331
332/* See ecb_encrypt.c for a pseudo description of these macros. */
333#define PERM_OP(a,b,t,n,m) ((t)=((((a)>>(n))^(b))&(m)),\
334        (b)^=(t),\
335        (a)^=((t)<<(n)))
336
337#define HPERM_OP(a,t,n,m) ((t)=((((a)<<(16-(n)))^(a))&(m)),\
338        (a)=(a)^(t)^(t>>(16-(n))))\
339
340static const char shifts2[16]={0,0,1,1,1,1,1,1,0,1,1,1,1,1,1,0};
341
342#ifdef PROTO
343static int body(unsigned long *out0, unsigned long *out1, des_key_schedule ks, unsigned long Eswap0, unsigned long Eswap1);
344static int des_set_key(des_cblock (*key), struct des_ks_struct *schedule);
345#else
346static int body();
347static int des_set_key();
348#endif
349
350static int des_set_key(key, schedule)
351des_cblock (*key);
352struct des_ks_struct *schedule;
353        {
354        register unsigned long c,d,t,s;
355        register unsigned char *in;
356        register unsigned long *k;
357        register int i;
358
359        k=(unsigned long *)schedule;
360        in=(unsigned char *)key;
361
362        c2l(in,c);
363        c2l(in,d);
364
365        /* I now do it in 47 simple operations :-)
366         * Thanks to John Fletcher (john_fletcher@lccmail.ocf.llnl.gov)
367         * for the inspiration. :-) */
368        PERM_OP (d,c,t,4,0x0f0f0f0f);
369        HPERM_OP(c,t,-2,0xcccc0000);
370        HPERM_OP(d,t,-2,0xcccc0000);
371        PERM_OP (d,c,t,1,0x55555555);
372        PERM_OP (c,d,t,8,0x00ff00ff);
373        PERM_OP (d,c,t,1,0x55555555);
374        d=      (((d&0x000000ff)<<16)| (d&0x0000ff00)     |
375                 ((d&0x00ff0000)>>16)|((c&0xf0000000)>>4));
376        c&=0x0fffffff;
377
378        for (i=0; i<ITERATIONS; i++)
379                {
380                if (shifts2[i])
381                        { c=((c>>2)|(c<<26)); d=((d>>2)|(d<<26)); }
382                else
383                        { c=((c>>1)|(c<<27)); d=((d>>1)|(d<<27)); }
384                c&=0x0fffffff;
385                d&=0x0fffffff;
386                /* could be a few less shifts but I am to lazy at this
387                 * point in time to investigate */
388                s=      skb[0][ (c    )&0x3f                ]|
389                        skb[1][((c>> 6)&0x03)|((c>> 7)&0x3c)]|
390                        skb[2][((c>>13)&0x0f)|((c>>14)&0x30)]|
391                        skb[3][((c>>20)&0x01)|((c>>21)&0x06) |
392                                              ((c>>22)&0x38)];
393                t=      skb[4][ (d    )&0x3f                ]|
394                        skb[5][((d>> 7)&0x03)|((d>> 8)&0x3c)]|
395                        skb[6][ (d>>15)&0x3f                ]|
396                        skb[7][((d>>21)&0x0f)|((d>>22)&0x30)];
397
398                /* table contained 0213 4657 */
399                *(k++)=((t<<16)|(s&0x0000ffff))&0xffffffff;
400                s=     ((s>>16)|(t&0xffff0000));
401               
402                s=(s<<4)|(s>>28);
403                *(k++)=s&0xffffffff;
404                }
405        return(0);
406        }
407
408/******************************************************************
409 * modified stuff for crypt.
410 ******************************************************************/
411
412/* The changes to this macro may help or hinder, depending on the
413 * compiler and the achitecture.  gcc2 always seems to do well :-).
414 * Inspired by Dana How <how@isl.stanford.edu>
415 * DO NOT use the alternative version on machines with 8 byte longs.
416 */
417#ifdef ALT_ECB
418#define D_ENCRYPT(L,R,S) \
419        t=(R^(R>>16)); \
420        u=(t&E0); \
421        t=(t&E1); \
422        u=((u^(u<<16))^R^s[S  ])<<2; \
423        t=(t^(t<<16))^R^s[S+1]; \
424        t=(t>>2)|(t<<30); \
425        L^= \
426        *(unsigned long *)(des_SP+0x0100+((t    )&0xfc))+ \
427        *(unsigned long *)(des_SP+0x0300+((t>> 8)&0xfc))+ \
428        *(unsigned long *)(des_SP+0x0500+((t>>16)&0xfc))+ \
429        *(unsigned long *)(des_SP+0x0700+((t>>24)&0xfc))+ \
430        *(unsigned long *)(des_SP+       ((u    )&0xfc))+ \
431        *(unsigned long *)(des_SP+0x0200+((u>> 8)&0xfc))+ \
432        *(unsigned long *)(des_SP+0x0400+((u>>16)&0xfc))+ \
433        *(unsigned long *)(des_SP+0x0600+((u>>24)&0xfc));
434#else /* original version */
435#define D_ENCRYPT(L,R,S)        \
436        t=(R^(R>>16)); \
437        u=(t&E0); \
438        t=(t&E1); \
439        u=(u^(u<<16))^R^s[S  ]; \
440        t=(t^(t<<16))^R^s[S+1]; \
441        t=(t>>4)|(t<<28); \
442        L^=     SPtrans[1][(t    )&0x3f]| \
443                SPtrans[3][(t>> 8)&0x3f]| \
444                SPtrans[5][(t>>16)&0x3f]| \
445                SPtrans[7][(t>>24)&0x3f]| \
446                SPtrans[0][(u    )&0x3f]| \
447                SPtrans[2][(u>> 8)&0x3f]| \
448                SPtrans[4][(u>>16)&0x3f]| \
449                SPtrans[6][(u>>24)&0x3f];
450#endif
451
452static unsigned const char con_salt[128]={
4530x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
4540x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
4550x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
4560x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
4570x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
4580x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,
4590x02,0x03,0x04,0x05,0x06,0x07,0x08,0x09,
4600x0A,0x0B,0x05,0x06,0x07,0x08,0x09,0x0A,
4610x0B,0x0C,0x0D,0x0E,0x0F,0x10,0x11,0x12,
4620x13,0x14,0x15,0x16,0x17,0x18,0x19,0x1A,
4630x1B,0x1C,0x1D,0x1E,0x1F,0x20,0x21,0x22,
4640x23,0x24,0x25,0x20,0x21,0x22,0x23,0x24,
4650x25,0x26,0x27,0x28,0x29,0x2A,0x2B,0x2C,
4660x2D,0x2E,0x2F,0x30,0x31,0x32,0x33,0x34,
4670x35,0x36,0x37,0x38,0x39,0x3A,0x3B,0x3C,
4680x3D,0x3E,0x3F,0x00,0x00,0x00,0x00,0x00,
469};
470
471static unsigned const char cov_2char[64]={
4720x2E,0x2F,0x30,0x31,0x32,0x33,0x34,0x35,
4730x36,0x37,0x38,0x39,0x41,0x42,0x43,0x44,
4740x45,0x46,0x47,0x48,0x49,0x4A,0x4B,0x4C,
4750x4D,0x4E,0x4F,0x50,0x51,0x52,0x53,0x54,
4760x55,0x56,0x57,0x58,0x59,0x5A,0x61,0x62,
4770x63,0x64,0x65,0x66,0x67,0x68,0x69,0x6A,
4780x6B,0x6C,0x6D,0x6E,0x6F,0x70,0x71,0x72,
4790x73,0x74,0x75,0x76,0x77,0x78,0x79,0x7A
480};
481
482#ifdef PERL5
483char *des_crypt(buf,salt)
484#else
485char *crypt(buf, salt)
486char *buf;
487char *salt;
488         
489           
490#endif
491     
492     
493        {
494        unsigned int i,j,x,y;
495        unsigned long Eswap0=0,Eswap1=0;
496        unsigned long out[2],ll;
497        des_cblock key;
498        des_key_schedule ks;
499        static unsigned char buff[20];
500        unsigned char bb[9];
501        unsigned char *b=bb;
502        unsigned char c,u;
503
504        /* eay 25/08/92
505         * If you call crypt("pwd","*") as often happens when you
506         * have * as the pwd field in /etc/passwd, the function
507         * returns *\0XXXXXXXXX
508         * The \0 makes the string look like * so the pwd "*" would
509         * crypt to "*".  This was found when replacing the crypt in
510         * our shared libraries.  People found that the disbled
511         * accounts effectivly had no passwd :-(. */
512        x=buff[0]=((salt[0] == '\0')?'A':salt[0]);
513        Eswap0=con_salt[x];
514        x=buff[1]=((salt[1] == '\0')?'A':salt[1]);
515        Eswap1=con_salt[x]<<4;
516
517        for (i=0; i<8; i++)
518                {
519                c= *(buf++);
520                if (!c) break;
521                key[i]=(c<<1);
522                }
523        for (; i<8; i++)
524                key[i]=0;
525
526        des_set_key((des_cblock *)(key),ks);
527        body(&(out[0]),&(out[1]),ks,Eswap0,Eswap1);
528
529        ll=out[0]; l2c(ll,b);
530        ll=out[1]; l2c(ll,b);
531        y=0;
532        u=0x80;
533        bb[8]=0;
534        for (i=2; i<13; i++)
535                {
536                c=0;
537                for (j=0; j<6; j++)
538                        {
539                        c<<=1;
540                        if (bb[y] & u) c|=1;
541                        u>>=1;
542                        if (!u)
543                                {
544                                y++;
545                                u=0x80;
546                                }
547                        }
548                buff[i]=cov_2char[c];
549                }
550        buff[13]='\0';
551        return((char *)buff);
552        }
553
554static int body(out0, out1, ks, Eswap0, Eswap1)
555unsigned long *out0;
556unsigned long *out1;
557des_key_schedule ks;
558unsigned long Eswap0;
559unsigned long Eswap1;
560        {
561        register unsigned long l,r,t,u;
562#ifdef ALT_ECB
563        register unsigned char *des_SP=(unsigned char *)SPtrans;
564#endif
565        register unsigned long *s;
566        register int i,j;
567        register unsigned long E0,E1;
568
569        l=0;
570        r=0;
571
572        s=(unsigned long *)ks;
573        E0=Eswap0;
574        E1=Eswap1;
575
576        for (j=0; j<25; j++)
577                {
578                for (i=0; i<(ITERATIONS*2); i+=4)
579                        {
580                        D_ENCRYPT(l,r,  i);     /*  1 */
581                        D_ENCRYPT(r,l,  i+2);   /*  2 */
582                        }
583                t=l;
584                l=r;
585                r=t;
586                }
587        t=r;
588        r=(l>>1)|(l<<31);
589        l=(t>>1)|(t<<31);
590        /* clear the top bits on machines with 8byte longs */
591        l&=0xffffffff;
592        r&=0xffffffff;
593
594        PERM_OP(r,l,t, 1,0x55555555);
595        PERM_OP(l,r,t, 8,0x00ff00ff);
596        PERM_OP(r,l,t, 2,0x33333333);
597        PERM_OP(l,r,t,16,0x0000ffff);
598        PERM_OP(r,l,t, 4,0x0f0f0f0f);
599
600        *out0=l;
601        *out1=r;
602        return(0);
603        }
604
Note: See TracBrowser for help on using the repository browser.