This is a live mirror of the Perl 5 development currently hosted at https://github.com/perl/perl5
Defer loading main module
[perl5.git] / win32 / fcrypt.c
CommitLineData
4ace4afb
SH
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
SH
12#if defined(__BORLANDC__)
13#pragma warn -8004 /* "'foo' is assigned a value that is never used" */
14#endif
15
4ace4afb
SH
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
SH
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
SH
630x80000000, 0x80820000, 0x00000200, 0x80020200},
64{ /* nibble 1 */
4ace4afb
SH
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
SH
800x10002004, 0x00000004, 0x10040000, 0x00042000},
81{ /* nibble 2 */
4ace4afb
SH
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
SH
970x41000000, 0x40010040, 0x00000040, 0x01010000},
98{ /* nibble 3 */
4ace4afb
SH
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
SH
1140x00000402, 0x04000000, 0x04000002, 0x04100400},
115{ /* nibble 4 */
4ace4afb
SH
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
SH
1310x00000008, 0x00004108, 0x02004000, 0x02000008},
132{ /* nibble 5 */
4ace4afb
SH
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
SH
1480x20080000, 0x00000810, 0x00000010, 0x20080010},
149{ /* nibble 6 */
4ace4afb
SH
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
SH
1650x00400001, 0x00401080, 0x00401000, 0x00001001},
166{ /* nibble 7 */
4ace4afb
SH
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
SH
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
SH
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
SH
2010x00090820,0x00090830,0x20090820,0x20090830},
202{ /* for C bits (numbered as per FIPS 46) 7 8 10 11 12 13 */
4ace4afb
SH
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
SH
2180x10200404,0x12200404,0x10202404,0x12202404},
219{ /* for C bits (numbered as per FIPS 46) 14 15 16 17 19 20 */
4ace4afb
SH
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
SH
2350x09000202,0x09000203,0x09040202,0x09040203},
236{ /* for C bits (numbered as per FIPS 46) 21 23 24 26 27 28 */
4ace4afb
SH
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
SH
2520x04021008,0x04121008,0x04021108,0x04121108},
253{ /* for D bits (numbered as per FIPS 46) 1 2 3 4 5 6 */
4ace4afb
SH
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
SH
2690x20101004,0x30101004,0x20111004,0x30111004},
270{ /* for D bits (numbered as per FIPS 46) 8 9 11 12 13 14 */
4ace4afb
SH
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
SH
2860x02020401,0x0A020401,0x02020409,0x0A020409},
287{ /* for D bits (numbered as per FIPS 46) 16 17 18 19 20 21 */
4ace4afb
SH
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
SH
3030x01200210,0x01200310,0x01280210,0x01280310},
304{ /* for D bits (numbered as per FIPS 46) 22 23 24 25 27 28 */
4ace4afb
SH
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
SH
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
SH
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
SH
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
SH
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