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