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