/* INTERNET WORM CRYPT() ROUTINE notes from 'Password Cracking: A Game of Wits' by Donn Seeley CACM, June89 v32n6 pp700-703 : The Worm's crypt algorithm appears to be a compramise between time and space: the time needed to encrypt one password guess verses the substantial extra table space needed to squeeze performance out of the algorithm...The traditional UNIX algorithm stores each bit of the password in a byte, while the worms algorithm packs packs the bits into into two 32-bit words. This permits the worms algorithm to use bitfield and shift operations on the password data. (also saves a little space!) Other speedups include unrolling loops, combining tables, precomputing shifts and masks, and eliminating redundant initial and final permutations when performing the 25 applications of modified DES that the password encryption algorithm uses. The biggest performance improvement comes from combining permutations: the worm uses expanded arrays which are indexed by groups of bits rather than single bits. Bishops DESZIP.c does all these things and also precomputes more functions yielding twice the performance of the worms algorithm, but requiring nearly 200KB of initialized data as opposed to the 6KB used by the worm, and the less than 2KB used by the normal crypt(). The worms version of crypt ran 9 times faster than the normal crypt while DESZIP runs about 20 time faster (FDES + DESZIP are about equivalent). on a VAX 6800 encrypting 271 passwords it took the worms crypt less than 6 seconds or 45 passwords per sec, and the normal crypt took 54 seconds or 5 passwords per second. - Tangent */ static char e[48] = { /* 0x20404 */ 31, 0, 1, 2, 3, 4, 3, 4, 5, 6, 7, 8, 7, 8, 9, 10, 11, 12, 11, 12, 13, 14, 15, 16, 15, 16, 17, 18, 19, 20, 19, 20, 21, 22, 23, 24, 23, 24, 25, 26, 27, 28, 27, 28, 29, 30, 31, 0, }; int shift[16] = { /* 0x20434 */ 1,1,2,2, 2,2,2,2, 1,2,2,2, 2,2,2,1, }; int ip_L0[] = { 0x00000008, 0x00000008, 0x08000808, 0x08000808, 0x00000008, 0x00000008, 0x08000808, 0x08000808,}; int ip_L1[] = { 0x00000000, 0x00080000, 0x00000000, 0x00080000, 0x08000000, 0x08080000, 0x08000000, 0x08080000, 0x00000000, 0x00080000, 0x00000000, 0x00080000, 0x08000000, 0x08080000, 0x08000000, 0x08080000,}; int ip_L2[] = { 0x00000004, 0x00000004, 0x04000404, 0x04000404, 0x00000004, 0x00000004, 0x04000404, 0x04000404,}; int ip_L3[] = { 0x00000000, 0x00040000, 0x00000000, 0x00040000, 0x04000000, 0x04040000, 0x04000000, 0x04040000, 0x00000000, 0x00040000, 0x00000000, 0x00040000, 0x04000000, 0x04040000, 0x04000000, 0x04040000,}; int ip_L4[] = { 0x00000002, 0x00000002, 0x02000202, 0x02000202, 0x00000002, 0x00000002, 0x02000202, 0x02000202,}; int ip_L5[] = { 0x00000000, 0x00020000, 0x00000000, 0x00020000, 0x02000000, 0x02020000, 0x02000000, 0x02020000, 0x00000000, 0x00020000, 0x00000000, 0x00020000, 0x02000000, 0x02020000, 0x02000000, 0x02020000,}; int ip_L6[] = { 0x00000001, 0x00000001, 0x01000101, 0x01000101, 0x00000001, 0x00000001, 0x01000101, 0x01000101,}; int ip_L7[] = { 0x00000000, 0x00010000, 0x00000000, 0x00010000, 0x01000000, 0x01010000, 0x01000000, 0x01010000, 0x00000000, 0x00010000, 0x00000000, 0x00010000, 0x01000000, 0x01010000, 0x01000000, 0x01010000,}; int ip_L8[] = { 0x00000080, 0x00000080, 0x80008080, 0x80008080, 0x00000080, 0x00000080, 0x80008080, 0x80008080,}; int ip_L9[] = { 0x00000000, 0x00800000, 0x00000000, 0x00800000, 0x80000000, 0x80800000, 0x80000000, 0x80800000, 0x00000000, 0x00800000, 0x00000000, 0x00800000, 0x80000000, 0x80800000, 0x80000000, 0x80800000,}; int ip_La[] = { 0x00000040, 0x00000040, 0x40004040, 0x40004040, 0x00000040, 0x00000040, 0x40004040, 0x40004040,}; int ip_Lb[] = { 0x00000000, 0x00400000, 0x00000000, 0x00400000, 0x40000000, 0x40400000, 0x40000000, 0x40400000, 0x00000000, 0x00400000, 0x00000000, 0x00400000, 0x40000000, 0x40400000, 0x40000000, 0x40400000,}; int ip_Lc[] = { 0x00000020, 0x00000020, 0x20002020, 0x20002020, 0x00000020, 0x00000020, 0x20002020, 0x20002020,}; int ip_Ld[] = { 0x00000000, 0x00200000, 0x00000000, 0x00200000, 0x20000000, 0x20200000, 0x20000000, 0x20200000, 0x00000000, 0x00200000, 0x00000000, 0x00200000, 0x20000000, 0x20200000, 0x20000000, 0x20200000,}; int ip_Le[] = { 0x00000010, 0x00000010, 0x10001010, 0x10001010, 0x00000010, 0x00000010, 0x10001010, 0x10001010,}; int ip_Lf[] = { 0x00000000, 0x00100000, 0x00000000, 0x00100000, 0x10000000, 0x10100000, 0x10000000, 0x10100000, 0x00000000, 0x00100000, 0x00000000, 0x00100000, 0x10000000, 0x10100000, 0x10000000, 0x10100000,}; int ip_H0[] = { 0x00000000, 0x00080008, 0x00000000, 0x00080008, 0x08000800, 0x08080808, 0x08000800, 0x08080808,}; int ip_H1[] = { 0x00000000, 0x00000000, 0x00080000, 0x00080000, 0x00000000, 0x00000000, 0x00080000, 0x00080000, 0x08000000, 0x08000000, 0x08080000, 0x08080000, 0x08000000, 0x08000000, 0x08080000, 0x08080000,}; int ip_H2[] = { 0x00000000, 0x00040004, 0x00000000, 0x00040004, 0x04000400, 0x04040404, 0x04000400, 0x04040404,}; int ip_H3[] = { 0x00000000, 0x00000000, 0x00040000, 0x00040000, 0x00000000, 0x00000000, 0x00040000, 0x00040000, 0x04000000, 0x04000000, 0x04040000, 0x04040000, 0x04000000, 0x04000000, 0x04040000, 0x04040000,}; int ip_H4[] = { 0x00000000, 0x00020002, 0x00000000, 0x00020002, 0x02000200, 0x02020202, 0x02000200, 0x02020202,}; int ip_H5[] = { 0x00000000, 0x00000000, 0x00020000, 0x00020000, 0x00000000, 0x00000000, 0x00020000, 0x00020000, 0x02000000, 0x02000000, 0x02020000, 0x02020000, 0x02000000, 0x02000000, 0x02020000, 0x02020000,}; int ip_H6[] = { 0x00000000, 0x00010001, 0x00000000, 0x00010001, 0x01000100, 0x01010101, 0x01000100, 0x01010101,}; int ip_H7[] = { 0x00000000, 0x00000000, 0x00010000, 0x00010000, 0x00000000, 0x00000000, 0x00010000, 0x00010000, 0x01000000, 0x01000000, 0x01010000, 0x01010000, 0x01000000, 0x01000000, 0x01010000, 0x01010000,}; int ip_H8[] = { 0x00000000, 0x00800080, 0x00000000, 0x00800080, 0x80008000, 0x80808080, 0x80008000, 0x80808080,}; int ip_H9[] = { 0x00000000, 0x00000000, 0x00800000, 0x00800000, 0x00000000, 0x00000000, 0x00800000, 0x00800000, 0x80000000, 0x80000000, 0x80800000, 0x80800000, 0x80000000, 0x80000000, 0x80800000, 0x80800000,}; int ip_Ha[] = { 0x00000000, 0x00400040, 0x00000000, 0x00400040, 0x40004000, 0x40404040, 0x40004000, 0x40404040,}; int ip_Hb[] = { 0x00000000, 0x00000000, 0x00400000, 0x00400000, 0x00000000, 0x00000000, 0x00400000, 0x00400000, 0x40000000, 0x40000000, 0x40400000, 0x40400000, 0x40000000, 0x40000000, 0x40400000, 0x40400000,}; int ip_Hc[] = { 0x00000000, 0x00200020, 0x00000000, 0x00200020, 0x20002000, 0x20202020, 0x20002000, 0x20202020,}; int ip_Hd[] = { 0x00000000, 0x00000000, 0x00200000, 0x00200000, 0x00000000, 0x00000000, 0x00200000, 0x00200000, 0x20000000, 0x20000000, 0x20200000, 0x20200000, 0x20000000, 0x20000000, 0x20200000, 0x20200000,}; int ip_He[] = { 0x00000000, 0x00100010, 0x00000000, 0x00100010, 0x10001000, 0x10101010, 0x10001000, 0x10101010,}; int ip_Hf[] = { 0x00000000, 0x00000000, 0x00100000, 0x00100000, 0x00000000, 0x00000000, 0x00100000, 0x00100000, 0x10000000, 0x10000000, 0x10100000, 0x10100000, 0x10000000, 0x10000000, 0x10100000, 0x10100000,}; int ipi_L0[] = { 0x00000000, 0x01000000, 0x00010000, 0x01010000, 0x00000100, 0x01000100, 0x00010100, 0x01010100, 0x00000001, 0x01000001, 0x00010001, 0x01010001, 0x00000101, 0x01000101, 0x00010101, 0x01010101,}; int ipi_L2[] = { 0x00000000, 0x04000000, 0x00040000, 0x04040000, 0x00000400, 0x04000400, 0x00040400, 0x04040400, 0x00000004, 0x04000004, 0x00040004, 0x04040004, 0x00000404, 0x04000404, 0x00040404, 0x04040404,}; int ipi_L4[] = { 0x00000000, 0x10000000, 0x00100000, 0x10100000, 0x00001000, 0x10001000, 0x00101000, 0x10101000, 0x00000010, 0x10000010, 0x00100010, 0x10100010, 0x00001010, 0x10001010, 0x00101010, 0x10101010,}; int ipi_L6[] = { 0x00000000, 0x40000000, 0x00400000, 0x40400000, 0x00004000, 0x40004000, 0x00404000, 0x40404000, 0x00000040, 0x40000040, 0x00400040, 0x40400040, 0x00004040, 0x40004040, 0x00404040, 0x40404040,}; int ipi_L8[] = { 0x00000000, 0x02000000, 0x00020000, 0x02020000, 0x00000200, 0x02000200, 0x00020200, 0x02020200, 0x00000002, 0x02000002, 0x00020002, 0x02020002, 0x00000202, 0x02000202, 0x00020202, 0x02020202,}; int ipi_La[] = { 0x00000000, 0x08000000, 0x00080000, 0x08080000, 0x00000800, 0x08000800, 0x00080800, 0x08080800, 0x00000008, 0x08000008, 0x00080008, 0x08080008, 0x00000808, 0x08000808, 0x00080808, 0x08080808,}; int ipi_Lc[] = { 0x00000000, 0x20000000, 0x00200000, 0x20200000, 0x00002000, 0x20002000, 0x00202000, 0x20202000, 0x00000020, 0x20000020, 0x00200020, 0x20200020, 0x00002020, 0x20002020, 0x00202020, 0x20202020,}; int ipi_Le[] = { 0x00000000, 0x80000000, 0x00800000, 0x80800000, 0x00008000, 0x80008000, 0x00808000, 0x80808000, 0x00000080, 0x80000080, 0x00800080, 0x80800080, 0x00008080, 0x80008080, 0x00808080, 0x80808080,}; int ipi_H1[] = { 0x00000000, 0x01000000, 0x00010000, 0x01010000, 0x00000100, 0x01000100, 0x00010100, 0x01010100, 0x00000001, 0x01000001, 0x00010001, 0x01010001, 0x00000101, 0x01000101, 0x00010101, 0x01010101,}; int ipi_H3[] = { 0x00000000, 0x04000000, 0x00040000, 0x04040000, 0x00000400, 0x04000400, 0x00040400, 0x04040400, 0x00000004, 0x04000004, 0x00040004, 0x04040004, 0x00000404, 0x04000404, 0x00040404, 0x04040404,}; int ipi_H5[] = { 0x00000000, 0x10000000, 0x00100000, 0x10100000, 0x00001000, 0x10001000, 0x00101000, 0x10101000, 0x00000010, 0x10000010, 0x00100010, 0x10100010, 0x00001010, 0x10001010, 0x00101010, 0x10101010,}; int ipi_H7[] = { 0x00000000, 0x40000000, 0x00400000, 0x40400000, 0x00004000, 0x40004000, 0x00404000, 0x40404000, 0x00000040, 0x40000040, 0x00400040, 0x40400040, 0x00004040, 0x40004040, 0x00404040, 0x40404040,}; int ipi_H9[] = { 0x00000000, 0x02000000, 0x00020000, 0x02020000, 0x00000200, 0x02000200, 0x00020200, 0x02020200, 0x00000002, 0x02000002, 0x00020002, 0x02020002, 0x00000202, 0x02000202, 0x00020202, 0x02020202,}; int ipi_Hb[] = { 0x00000000, 0x08000000, 0x00080000, 0x08080000, 0x00000800, 0x08000800, 0x00080800, 0x08080800, 0x00000008, 0x08000008, 0x00080008, 0x08080008, 0x00000808, 0x08000808, 0x00080808, 0x08080808,}; int ipi_Hd[] = { 0x00000000, 0x20000000, 0x00200000, 0x20200000, 0x00002000, 0x20002000, 0x00202000, 0x20202000, 0x00000020, 0x20000020, 0x00200020, 0x20200020, 0x00002020, 0x20002020, 0x00202020, 0x20202020,}; int ipi_Hf[] = { 0x00000000, 0x80000000, 0x00800000, 0x80800000, 0x00008000, 0x80008000, 0x00808000, 0x80808000, 0x00000080, 0x80000080, 0x00800080, 0x80800080, 0x00008080, 0x80008080, 0x00808080, 0x80808080,}; int SP0[] = { 0x08000820, 0x00000800, 0x00020000, 0x08020820, 0x08000000, 0x08000820, 0x00000020, 0x08000000, 0x00020020, 0x08020000, 0x08020820, 0x00020800, 0x08020800, 0x00020820, 0x00000800, 0x00000020, 0x08020000, 0x08000020, 0x08000800, 0x00000820, 0x00020800, 0x00020020, 0x08020020, 0x08020800, 0x00000820, 0x00000000, 0x00000000, 0x08020020, 0x08000020, 0x08000800, 0x00020820, 0x00020000, 0x00020820, 0x00020000, 0x08020800, 0x00000800, 0x00000020, 0x08020020, 0x00000800, 0x00020820, 0x08000800, 0x00000020, 0x08000020, 0x08020000, 0x08020020, 0x08000000, 0x00020000, 0x08000820, 0x00000000, 0x08020820, 0x00020020, 0x08000020, 0x08020000, 0x08000800, 0x08000820, 0x00000000, 0x08020820, 0x00020800, 0x00020800, 0x00000820, 0x00000820, 0x00020020, 0x08000000, 0x08020800,}; int SP1[] = { 0x00100000, 0x02100001, 0x02000401, 0x00000000, 0x00000400, 0x02000401, 0x00100401, 0x02100400, 0x02100401, 0x00100000, 0x00000000, 0x02000001, 0x00000001, 0x02000000, 0x02100001, 0x00000401, 0x02000400, 0x00100401, 0x00100001, 0x02000400, 0x02000001, 0x02100000, 0x02100400, 0x00100001, 0x02100000, 0x00000400, 0x00000401, 0x02100401, 0x00100400, 0x00000001, 0x02000000, 0x00100400, 0x02000000, 0x00100400, 0x00100000, 0x02000401, 0x02000401, 0x02100001, 0x02100001, 0x00000001, 0x00100001, 0x02000000, 0x02000400, 0x00100000, 0x02100400, 0x00000401, 0x00100401, 0x02100400, 0x00000401, 0x02000001, 0x02100401, 0x02100000, 0x00100400, 0x00000000, 0x00000001, 0x02100401, 0x00000000, 0x00100401, 0x02100000, 0x00000400, 0x02000001, 0x02000400, 0x00000400, 0x00100001,}; int SP2[] = { 0x10000008, 0x10200000, 0x00002000, 0x10202008, 0x10200000, 0x00000008, 0x10202008, 0x00200000, 0x10002000, 0x00202008, 0x00200000, 0x10000008, 0x00200008, 0x10002000, 0x10000000, 0x00002008, 0x00000000, 0x00200008, 0x10002008, 0x00002000, 0x00202000, 0x10002008, 0x00000008, 0x10200008, 0x10200008, 0x00000000, 0x00202008, 0x10202000, 0x00002008, 0x00202000, 0x10202000, 0x10000000, 0x10002000, 0x00000008, 0x10200008, 0x00202000, 0x10202008, 0x00200000, 0x00002008, 0x10000008, 0x00200000, 0x10002000, 0x10000000, 0x00002008, 0x10000008, 0x10202008, 0x00202000, 0x10200000, 0x00202008, 0x10202000, 0x00000000, 0x10200008, 0x00000008, 0x00002000, 0x10200000, 0x00202008, 0x00002000, 0x00200008, 0x10002008, 0x00000000, 0x10202000, 0x10000000, 0x00200008, 0x10002008,}; int SP3[] = { 0x00000080, 0x01040080, 0x01040000, 0x21000080, 0x00040000, 0x00000080, 0x20000000, 0x01040000, 0x20040080, 0x00040000, 0x01000080, 0x20040080, 0x21000080, 0x21040000, 0x00040080, 0x20000000, 0x01000000, 0x20040000, 0x20040000, 0x00000000, 0x20000080, 0x21040080, 0x21040080, 0x01000080, 0x21040000, 0x20000080, 0x00000000, 0x21000000, 0x01040080, 0x01000000, 0x21000000, 0x00040080, 0x00040000, 0x21000080, 0x00000080, 0x01000000, 0x20000000, 0x01040000, 0x21000080, 0x20040080, 0x01000080, 0x20000000, 0x21040000, 0x01040080, 0x20040080, 0x00000080, 0x01000000, 0x21040000, 0x21040080, 0x00040080, 0x21000000, 0x21040080, 0x01040000, 0x00000000, 0x20040000, 0x21000000, 0x00040080, 0x01000080, 0x20000080, 0x00040000, 0x00000000, 0x20040000, 0x01040080, 0x20000080,}; int SP4[] = { 0x80401000, 0x80001040, 0x80001040, 0x00000040, 0x00401040, 0x80400040, 0x80400000, 0x80001000, 0x00000000, 0x00401000, 0x00401000, 0x80401040, 0x80000040, 0x00000000, 0x00400040, 0x80400000, 0x80000000, 0x00001000, 0x00400000, 0x80401000, 0x00000040, 0x00400000, 0x80001000, 0x00001040, 0x80400040, 0x80000000, 0x00001040, 0x00400040, 0x00001000, 0x00401040, 0x80401040, 0x80000040, 0x00400040, 0x80400000, 0x00401000, 0x80401040, 0x80000040, 0x00000000, 0x00000000, 0x00401000, 0x00001040, 0x00400040, 0x80400040, 0x80000000, 0x80401000, 0x80001040, 0x80001040, 0x00000040, 0x80401040, 0x80000040, 0x80000000, 0x00001000, 0x80400000, 0x80001000, 0x00401040, 0x80400040, 0x80001000, 0x00001040, 0x00400000, 0x80401000, 0x00000040, 0x00400000, 0x00001000, 0x00401040,}; int SP5[] = { 0x00000104, 0x04010100, 0x00000000, 0x04010004, 0x04000100, 0x00000000, 0x00010104, 0x04000100, 0x00010004, 0x04000004, 0x04000004, 0x00010000, 0x04010104, 0x00010004, 0x04010000, 0x00000104, 0x04000000, 0x00000004, 0x04010100, 0x00000100, 0x00010100, 0x04010000, 0x04010004, 0x00010104, 0x04000104, 0x00010100, 0x00010000, 0x04000104, 0x00000004, 0x04010104, 0x00000100, 0x04000000, 0x04010100, 0x04000000, 0x00010004, 0x00000104, 0x00010000, 0x04010100, 0x04000100, 0x00000000, 0x00000100, 0x00010004, 0x04010104, 0x04000100, 0x04000004, 0x00000100, 0x00000000, 0x04010004, 0x04000104, 0x00010000, 0x04000000, 0x04010104, 0x00000004, 0x00010104, 0x00010100, 0x04000004, 0x04010000, 0x04000104, 0x00000104, 0x04010000, 0x00010104, 0x00000004, 0x04010004, 0x00010100,}; int SP6[] = { 0x40084010, 0x40004000, 0x00004000, 0x00084010, 0x00080000, 0x00000010, 0x40080010, 0x40004010, 0x40000010, 0x40084010, 0x40084000, 0x40000000, 0x40004000, 0x00080000, 0x00000010, 0x40080010, 0x00084000, 0x00080010, 0x40004010, 0x00000000, 0x40000000, 0x00004000, 0x00084010, 0x40080000, 0x00080010, 0x40000010, 0x00000000, 0x00084000, 0x00004010, 0x40084000, 0x40080000, 0x00004010, 0x00000000, 0x00084010, 0x40080010, 0x00080000, 0x40004010, 0x40080000, 0x40084000, 0x00004000, 0x40080000, 0x40004000, 0x00000010, 0x40084010, 0x00084010, 0x00000010, 0x00004000, 0x40000000, 0x00004010, 0x40084000, 0x00080000, 0x40000010, 0x00080010, 0x40004010, 0x40000010, 0x00080010, 0x00084000, 0x00000000, 0x40004000, 0x00004010, 0x40000000, 0x40080010, 0x40084010, 0x00084000,}; int SP7[] = { 0x00808200, 0x00000000, 0x00008000, 0x00808202, 0x00808002, 0x00008202, 0x00000002, 0x00008000, 0x00000200, 0x00808200, 0x00808202, 0x00000200, 0x00800202, 0x00808002, 0x00800000, 0x00000002, 0x00000202, 0x00800200, 0x00800200, 0x00008200, 0x00008200, 0x00808000, 0x00808000, 0x00800202, 0x00008002, 0x00800002, 0x00800002, 0x00008002, 0x00000000, 0x00000202, 0x00008202, 0x00800000, 0x00008000, 0x00808202, 0x00000002, 0x00808000, 0x00808200, 0x00800000, 0x00800000, 0x00000200, 0x00808002, 0x00008000, 0x00008200, 0x00800002, 0x00000200, 0x00000002, 0x00800202, 0x00008202, 0x00808202, 0x00008002, 0x00808000, 0x00800202, 0x00800002, 0x00000202, 0x00008202, 0x00808200, 0x00000202, 0x00800200, 0x00800200, 0x00000000, 0x00008002, 0x00008200, 0x00000000, 0x00808002,}; int PC1[] = { 0x10000000, 0x00000000, 0x00100000, 0x00000000, 0x00001000, 0x00000000, 0x00000010, 0x00000000, 0x00000000, 0x00010000, 0x00000000, 0x01000000, 0x00000001, 0x00000000, 0x00000000, 0x00000000, 0x20000000, 0x00000000, 0x00200000, 0x00000000, 0x00002000, 0x00000000, 0x00000020, 0x00000000, 0x00000000, 0x00020000, 0x00000000, 0x02000000, 0x00000002, 0x00000000, 0x00000000, 0x00000000, 0x40000000, 0x00000000, 0x00400000, 0x00000000, 0x00004000, 0x00000000, 0x00000040, 0x00000000, 0x00000000, 0x00040000, 0x00000000, 0x04000000, 0x00000004, 0x00000000, 0x00000000, 0x00000000, 0x80000000, 0x00000000, 0x00800000, 0x00000000, 0x00008000, 0x00000000, 0x00000080, 0x00000000, 0x00000000, 0x00080000, 0x00000000, 0x08000000, 0x00000008, 0x00000000, 0x00000000, 0x00000000, 0x01000000, 0x00000000, 0x00010000, 0x00000000, 0x00000100, 0x00000000, 0x00000000, 0x00000100, 0x00000000, 0x00001000, 0x00000000, 0x00100000, 0x00000000, 0x10000000, 0x00000000, 0x00000000, 0x02000000, 0x00000000, 0x00020000, 0x00000000, 0x00000200, 0x00000000, 0x00000000, 0x00000200, 0x00000000, 0x00002000, 0x00000000, 0x00200000, 0x00000000, 0x20000000, 0x00000000, 0x00000000, 0x04000000, 0x00000000, 0x00040000, 0x00000000, 0x00000400, 0x00000000, 0x00000000, 0x00000400, 0x00000000, 0x00004000, 0x00000000, 0x00400000, 0x00000000, 0x40000000, 0x00000000, 0x00000000, 0x08000000, 0x00000000, 0x00080000, 0x00000000, 0x00000800, 0x00000000, 0x00000000, 0x00000800, 0x00000000, 0x00008000, 0x00000000, 0x00800000, 0x00000000, 0x80000000, 0x00000000, 0x00000000,}; int PC2[] = { 0x00000000, 0x20000000, 0x00000000, 0x00800000, 0x00000000, 0x00000000, 0x00000000, 0x00040000, 0x00000010, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x02000000, 0x00000001, 0x00000000, 0x00000080, 0x00000000, 0x00000000, 0x00100000, 0x00000000, 0x00000000, 0x00000000, 0x08000000, 0x00000000, 0x40000000, 0x00000000, 0x00200000, 0x00000008, 0x00000000, 0x00000000, 0x10000000, 0x00000000, 0x04000000, 0x00000000, 0x00080000, 0x00000000, 0x80000000, 0x00000040, 0x00000000, 0x00000000, 0x00400000, 0x00000000, 0x00000000, 0x00000004, 0x00000000, 0x00000000, 0x01000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x08000000, 0x00000000, 0x00000100, 0x00000000, 0x02000000, 0x00000000, 0x00010000, 0x00000000, 0x04000000, 0x00000000, 0x00400000, 0x00000000, 0x00001000, 0x00000000, 0x00004000, 0x00000000, 0x00000000, 0x00000000, 0x00100000, 0x00000000, 0x20000000, 0x00000000, 0x00020000, 0x00000000, 0x00000200, 0x00000000, 0x80000000, 0x00000000, 0x00800000, 0x00000000, 0x00002000, 0x00000000, 0x40000000, 0x00000000, 0x00000000, 0x00000000, 0x00040000, 0x00000000, 0x00000400, 0x00000000, 0x00200000, 0x00000000, 0x00000000, 0x00000000, 0x00080000, 0x00000000, 0x10000000, 0x00000000, 0x00000000, 0x00000000, 0x00008000, 0x00000000, 0x00000800, 0x00000000, 0x01000000, 0x00000000, 0x00000000, 0x00020000, 0x00000002, 0x00000000, 0x00000020, 0x00000000, 0x00000000, 0x00010000,}; static extra; char E[48]; /* 0x255c4 */ char *crypt(passwd, salt) /* 0x68f8 */ char *passwd, *salt; { int temp, l8; register i, j; register c; /*d7, d6, d5*/ static char iobuf[10]; /* 0x27f34 */ static unsigned x27f44; static unsigned x27f48; x27f44 = 0; x27f48 = 0; for( i = 0; i < 48; i++) E[i] = e[i]; for(i = 0; (c = *passwd) && (i < 32); i++, passwd++) for(j = 0; j < 7; j++, i++) { l8 = (c >> (6 - j)) & 01; x27f44 |= (l8 << (31 - i)); } for (i = 0; (c = *passwd) && (i < 32); i++, passwd++) for(j = 0; j < 7; j++, i++) { l8 = (c >> (6 - j)) & 01; x27f48 |= (l8 << (31 - i)); } compkeys(&x27f44, 0); for(i=0;i<2;i++){ c = *salt++; iobuf[i] = c; if(c>'Z') c -= 6; if(c>'9') c -= 7; c -= '.'; for(j=0;j<6;j++){ if((c>>j) & 01){ temp = E[6*i+j]; E[6*i+j] = E[6*i+j+24]; E[6*i+j+24] = temp; } } } mungE(); x27f44 = 0; x27f48 = 0; des(&x27f44, &x27f44); ipi(&x27f44, &x27f44); for(i=0; i<11; i++){ c = x27f44 >> 26; x27f44 = x27f44 << 6; x27f44 |= x27f48 >> 26; x27f48 = x27f48 << 6; c += '.'; if(c > '9') c += 7; if(c > 'Z') c += 6; iobuf[i+2] = c; } iobuf[i+2] = 0; if(iobuf[1] == 0) iobuf[1] = iobuf[0]; return(iobuf); } int E_H[8][16]; /* 0x251c4 */ int E_L[8][16]; /* 0x253c4 */ mungE() /* 0x6b2a */ { register i, j, d5, d4, d3, d2; register *a5, *a4; int l28; for(i = 0; i < 8; i++) { a5 = E_L[i]; a4 = E_H[i]; for(j = 0; j < 16; j++) { *a5++ = 0; *a4++ = 0; } } for (j = 0; j < 32; j++) { d2 = 1 << (31 - j); d3 = 31 - E[j]; d4 = 1 << (d3 & 3); a5 = E_L[d3 >> 2]; for (i = 1; i < 16; i++) if (i & d4) a5[i] |= d2; } for (j = 32; j < 48; j++) { d2 = 1 << (63-j); d3 = 31 - E[j]; d4 = 1 << (d3 & 3); a5 = E_H[d3 >> 2]; for (i = 1; i < 16; i++) if (i & d4) a5[i] |= d2; } } int keys_H[16], keys_L[16]; /* 0x255f4,0x25634 */ compkeys(iptr, key) /* 0x6c04 */ int *iptr; { int i, l8, l12, l16; register d7, d6, d5, d4, d3, d2; d7 = 0; d6 = 0; for (d3 = 0, d2 = iptr[1]; d3 < 64; d2*=2, d3+=2) if (d2 < 0) { d7 |= PC1[d3]; d6 |= PC1[d3+1]; } for (d2 = iptr[0]; d3 < 128; d2*=2, d3+=2) if (d2 < 0) { d7 |= PC1[d3]; d6 |= PC1[d3+1]; } for (i = 0; i < 16; i++) { for (d2 = 0; d2 < shift[i]; d2++) { l16 = l12 = l8 = 0; if (d7 < 0) l8 = 16; if (d7 & 0x08) l12 = 256; if (d6 < 0) l16 = 1; d7 = ((d7 << 1) & ~0x10) | l8 | l16; d6 = (d6 << 1) | l12; } d5 = 0; d4 = 0; for (d3=0, d2=d6; d3 < 64; d2*=2, d3+=2) { if (d2 < 0) { d5 |= PC2[d3]; d4 |= PC2[d3+1]; } } for (d2=d7; d3 < 128; d2*=2, d3+=2) { if (d2 < 0) { d5 |= PC2[d3]; d4 |= PC2[d3+1]; } } if (key) { keys_L[15-i] = d5; keys_H[15-i] = d4; } else { keys_L[i] = d5; keys_H[i] = d4; } } } setupE() { int i, j, l12; for(i = 0; i < 8; i++) for(j = 0; j < 16; j++) E_H[i][j] = E_H[i][j] = 0; for (j = 0; j < 32; j++) { l12 = 31 - E[j]; for (i = 0; i < 16; i++) if ((1 << (l12 % 4)) & i) E_L[l12 / 4][i] |= (1 << (31 - j)); } for (j = 32; j < 48; j++) { l12 = 31 - E[j]; for (i = 0; i < 16; i++) if ((1 << (l12 % 4)) & i) E_H[l12 / 4][i] |= (1 << (63 - j)); } } des(adr1, adr2) int *adr1, *adr2; { int l4, *l8, *l12, l16; register unsigned d7; register unsigned d6, d5; register d4, d3, d2; l4 = adr1[0]; d2 = adr1[1]; for (l16 = 0; l16 < 25; l16++) { l8 = keys_L; l12 = keys_H; for( d3 = 0; d3 < 16; d3++) { d5 = d2; d7 = E_L[0][d4 = d5 & 0x0f]; d6 = E_H[0][d4]; d5 >>= 4; d7 |= E_L[1][d4 = (d5 & 0x0f)]; d6 |= E_H[1][d4]; d5 >>= 4; d7 |= E_L[2][d4 = (d5 & 0x0f)]; d6 |= E_H[2][d4]; d5 >>= 4; d7 |= E_L[3][d4 = (d5 & 0x0f)]; d6 |= E_H[3][d4]; d5 >>= 4; d7 |= E_L[4][d4 = (d5 & 0x0f)]; d6 |= E_H[4][d4]; d5 >>= 4; d7 |= E_L[5][d4 = (d5 & 0x0f)]; d6 |= E_H[5][d4]; d5 >>= 4; d7 |= E_L[6][d4 = (d5 & 0x0f)]; d6 |= E_H[6][d4]; d5 >>= 4; d7 |= E_L[7][d4 = (d5 & 0x0f)]; d6 |= E_H[7][d4]; d7 ^= *l8++; d6 ^= *l12++; d5 = SPO[(d6 >> 16) & 0x3f]; d5 |= SP1[(d6 >> 22) & 00x3f]; d5 |= SP2[((d7 & 0x03) << 4) | ((d6 >> 28) & 0x0f)]; d5 |= SP3[(d7 >> 2) & 0x3f]; d5 |= SP4[(d7 >> 8) & 0x3f]; d5 |= SP5[(d7 >> 14) & 0x3f]; d5 |= SP6[(d7 >> 20) & 0x3f]; d5 |= SP7[(d7 >> 26) & 0x3f]; { d6 = 14; l4 = d2; d2 = d6 ^ d5; } } d5 = l4; l4 = d2; d2 = d5; } adr2[0] = l4; adr2[1] = d2; } ipi(iptr1, iptr2) int *iptr1, *iptr2; { register unsigned d7, d6, d5; d5 = iptr1[0]; d7 = ipi_L0[d5 & 0x0f]; d5 = >>= 4; d6 = ipi_H1[d5 & 0x0f]; d5 >>= 4; d7 |= ipi_L2[d5 & 0x0f]; d5 >>= 4; d6 |= ipi_H3[d5 & 0x0f]; d5 >>= 4; d7 |= ipi_L4[d5 & 0x0f]; d5 >>= 4; d6 |= ipi_H5[d5 & 0x0f]; d5 >>= 4; d7 | ipi_L6[d5 & 0x0f]; d5 >>=4; d6 |= ipi_H7[d5 & 0x0f]; d5 = iptr1[1]; d7 |= ipi_L8[d5 & 0x0f]; d5 >>= 4; d6 |= ipi_H9[d5 & 0x0f]; d5 >>= 4; d7 |= ipi_La[d5 & 0x0f]; d5 >>= 4; d6 |= ipi_Hb[d5 & 0x0f]; d5 >>=4; d7 |= ipi_Lc[d5 & 0x0f]; d5 >>= 4; d6 |= ipi_Hd[d5 & 0x0f]; d5 >>= 4; d7 |= ipi_Le[d5 & 0x0f]; d5 >>= 4; d6 |= ipi_Hf[d5 & 0x0f]; iptr2[0] = d7; ipyr2[1] = d6; } /* * Local variables: * compile-command: "make" * comment-collumn: 48 * End: */