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