Advertisement
FlyFar

wormdes.c

Feb 28th, 2023
644
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 28.61 KB | Cybersecurity | 0 0
  1. /* INTERNET WORM CRYPT() ROUTINE
  2. notes from 'Password Cracking: A Game of Wits' by Donn Seeley CACM,
  3. June89 v32n6 pp700-703 : The Worm's crypt algorithm appears to be a
  4. compramise between time and space: the time needed to encrypt one
  5. password guess verses the substantial extra table space needed to
  6. squeeze performance out of the algorithm...The traditional UNIX
  7. algorithm stores each bit of the password in a byte, while the worms
  8. algorithm packs packs the bits into into two 32-bit words. This
  9. permits the worms algorithm to use bitfield and shift operations on
  10. the password data. (also saves a little space!)
  11.   Other speedups include unrolling loops, combining tables,
  12. precomputing shifts and masks, and eliminating redundant initial and
  13. final permutations when performing the 25 applications of modified
  14. DES that the password encryption algorithm uses.
  15.   The biggest performance improvement comes from combining
  16. permutations: the worm uses expanded arrays which are indexed by
  17. groups of bits rather than single bits.
  18.   Bishops DESZIP.c does all these things and also precomputes more
  19. functions yielding twice the performance of the worms algorithm, but
  20. requiring nearly 200KB of initialized data as opposed to the 6KB
  21. used by the worm, and the less than 2KB used by the normal crypt().
  22.   The worms version of crypt ran 9 times faster than the normal crypt
  23. while DESZIP runs about 20 time faster (FDES + DESZIP are about
  24. equivalent). on a VAX 6800 encrypting 271 passwords it took the worms
  25. crypt less than 6 seconds or 45 passwords per sec, and the normal
  26. crypt took 54 seconds or 5 passwords per second. - Tangent */
  27.  
  28. static  char    e[48] = {           /* 0x20404 */
  29.     31,  0,  1,  2,  3,  4,  3,  4,
  30.     5,   6,  7,  8,  7,  8,  9, 10,
  31.     11, 12, 11, 12, 13, 14, 15, 16,
  32.     15, 16, 17, 18, 19, 20, 19, 20,
  33.     21, 22, 23, 24, 23, 24, 25, 26,
  34.     27, 28, 27, 28, 29, 30, 31,  0,
  35. };
  36.  
  37. int shift[16] = {                   /* 0x20434 */
  38.     1,1,2,2, 2,2,2,2, 1,2,2,2, 2,2,2,1,
  39. };
  40. int ip_L0[] = {
  41.    0x00000008,   0x00000008,   0x08000808,   0x08000808,
  42.    0x00000008,   0x00000008,   0x08000808,   0x08000808,};
  43. int ip_L1[] = {
  44.    0x00000000,   0x00080000,   0x00000000,   0x00080000,
  45.    0x08000000,   0x08080000,   0x08000000,   0x08080000,
  46.    0x00000000,   0x00080000,   0x00000000,   0x00080000,
  47.    0x08000000,   0x08080000,   0x08000000,   0x08080000,};
  48. int ip_L2[] = {
  49.    0x00000004,   0x00000004,   0x04000404,   0x04000404,
  50.    0x00000004,   0x00000004,   0x04000404,   0x04000404,};
  51. int ip_L3[] = {
  52.    0x00000000,   0x00040000,   0x00000000,   0x00040000,
  53.    0x04000000,   0x04040000,   0x04000000,   0x04040000,
  54.    0x00000000,   0x00040000,   0x00000000,   0x00040000,
  55.    0x04000000,   0x04040000,   0x04000000,   0x04040000,};
  56. int ip_L4[] = {
  57.    0x00000002,   0x00000002,   0x02000202,   0x02000202,
  58.    0x00000002,   0x00000002,   0x02000202,   0x02000202,};
  59. int ip_L5[] = {
  60.    0x00000000,   0x00020000,   0x00000000,   0x00020000,
  61.    0x02000000,   0x02020000,   0x02000000,   0x02020000,
  62.    0x00000000,   0x00020000,   0x00000000,   0x00020000,
  63.    0x02000000,   0x02020000,   0x02000000,   0x02020000,};
  64. int ip_L6[] = {
  65.    0x00000001,   0x00000001,   0x01000101,   0x01000101,
  66.    0x00000001,   0x00000001,   0x01000101,   0x01000101,};
  67. int ip_L7[] = {
  68.    0x00000000,   0x00010000,   0x00000000,   0x00010000,
  69.    0x01000000,   0x01010000,   0x01000000,   0x01010000,
  70.    0x00000000,   0x00010000,   0x00000000,   0x00010000,
  71.    0x01000000,   0x01010000,   0x01000000,   0x01010000,};
  72. int ip_L8[] = {
  73.    0x00000080,   0x00000080,   0x80008080,   0x80008080,
  74.    0x00000080,   0x00000080,   0x80008080,   0x80008080,};
  75. int ip_L9[] = {
  76.    0x00000000,   0x00800000,   0x00000000,   0x00800000,
  77.    0x80000000,   0x80800000,   0x80000000,   0x80800000,
  78.    0x00000000,   0x00800000,   0x00000000,   0x00800000,
  79.    0x80000000,   0x80800000,   0x80000000,   0x80800000,};
  80. int ip_La[] = {
  81.    0x00000040,   0x00000040,   0x40004040,   0x40004040,
  82.    0x00000040,   0x00000040,   0x40004040,   0x40004040,};
  83. int ip_Lb[] = {
  84.    0x00000000,   0x00400000,   0x00000000,   0x00400000,
  85.    0x40000000,   0x40400000,   0x40000000,   0x40400000,
  86.    0x00000000,   0x00400000,   0x00000000,   0x00400000,
  87.    0x40000000,   0x40400000,   0x40000000,   0x40400000,};
  88. int ip_Lc[] = {
  89.    0x00000020,   0x00000020,   0x20002020,   0x20002020,
  90.    0x00000020,   0x00000020,   0x20002020,   0x20002020,};
  91. int ip_Ld[] = {
  92.    0x00000000,   0x00200000,   0x00000000,   0x00200000,
  93.    0x20000000,   0x20200000,   0x20000000,   0x20200000,
  94.    0x00000000,   0x00200000,   0x00000000,   0x00200000,
  95.    0x20000000,   0x20200000,   0x20000000,   0x20200000,};
  96. int ip_Le[] = {
  97.    0x00000010,   0x00000010,   0x10001010,   0x10001010,
  98.    0x00000010,   0x00000010,   0x10001010,   0x10001010,};
  99. int ip_Lf[] = {
  100.    0x00000000,   0x00100000,   0x00000000,   0x00100000,
  101.    0x10000000,   0x10100000,   0x10000000,   0x10100000,
  102.    0x00000000,   0x00100000,   0x00000000,   0x00100000,
  103.    0x10000000,   0x10100000,   0x10000000,   0x10100000,};
  104. int ip_H0[] = {
  105.    0x00000000,   0x00080008,   0x00000000,   0x00080008,
  106.    0x08000800,   0x08080808,   0x08000800,   0x08080808,};
  107. int ip_H1[] = {
  108.    0x00000000,   0x00000000,   0x00080000,   0x00080000,
  109.    0x00000000,   0x00000000,   0x00080000,   0x00080000,
  110.    0x08000000,   0x08000000,   0x08080000,   0x08080000,
  111.    0x08000000,   0x08000000,   0x08080000,   0x08080000,};
  112. int ip_H2[] = {
  113.    0x00000000,   0x00040004,   0x00000000,   0x00040004,
  114.    0x04000400,   0x04040404,   0x04000400,   0x04040404,};
  115. int ip_H3[] = {
  116.    0x00000000,   0x00000000,   0x00040000,   0x00040000,
  117.    0x00000000,   0x00000000,   0x00040000,   0x00040000,
  118.    0x04000000,   0x04000000,   0x04040000,   0x04040000,
  119.    0x04000000,   0x04000000,   0x04040000,   0x04040000,};
  120. int ip_H4[] = {
  121.    0x00000000,   0x00020002,   0x00000000,   0x00020002,
  122.    0x02000200,   0x02020202,   0x02000200,   0x02020202,};
  123. int ip_H5[] = {
  124.    0x00000000,   0x00000000,   0x00020000,   0x00020000,
  125.    0x00000000,   0x00000000,   0x00020000,   0x00020000,
  126.    0x02000000,   0x02000000,   0x02020000,   0x02020000,
  127.    0x02000000,   0x02000000,   0x02020000,   0x02020000,};
  128. int ip_H6[] = {
  129.    0x00000000,   0x00010001,   0x00000000,   0x00010001,
  130.    0x01000100,   0x01010101,   0x01000100,   0x01010101,};
  131. int ip_H7[] = {
  132.    0x00000000,   0x00000000,   0x00010000,   0x00010000,
  133.    0x00000000,   0x00000000,   0x00010000,   0x00010000,
  134.    0x01000000,   0x01000000,   0x01010000,   0x01010000,
  135.    0x01000000,   0x01000000,   0x01010000,   0x01010000,};
  136. int ip_H8[] = {
  137.    0x00000000,   0x00800080,   0x00000000,   0x00800080,
  138.    0x80008000,   0x80808080,   0x80008000,   0x80808080,};
  139. int ip_H9[] = {
  140.    0x00000000,   0x00000000,   0x00800000,   0x00800000,
  141.    0x00000000,   0x00000000,   0x00800000,   0x00800000,
  142.    0x80000000,   0x80000000,   0x80800000,   0x80800000,
  143.    0x80000000,   0x80000000,   0x80800000,   0x80800000,};
  144. int ip_Ha[] = {
  145.    0x00000000,   0x00400040,   0x00000000,   0x00400040,
  146.    0x40004000,   0x40404040,   0x40004000,   0x40404040,};
  147. int ip_Hb[] = {
  148.    0x00000000,   0x00000000,   0x00400000,   0x00400000,
  149.    0x00000000,   0x00000000,   0x00400000,   0x00400000,
  150.    0x40000000,   0x40000000,   0x40400000,   0x40400000,
  151.    0x40000000,   0x40000000,   0x40400000,   0x40400000,};
  152. int ip_Hc[] = {
  153.    0x00000000,   0x00200020,   0x00000000,   0x00200020,
  154.    0x20002000,   0x20202020,   0x20002000,   0x20202020,};
  155. int ip_Hd[] = {
  156.    0x00000000,   0x00000000,   0x00200000,   0x00200000,
  157.    0x00000000,   0x00000000,   0x00200000,   0x00200000,
  158.    0x20000000,   0x20000000,   0x20200000,   0x20200000,
  159.    0x20000000,   0x20000000,   0x20200000,   0x20200000,};
  160. int ip_He[] = {
  161.    0x00000000,   0x00100010,   0x00000000,   0x00100010,
  162.    0x10001000,   0x10101010,   0x10001000,   0x10101010,};
  163. int ip_Hf[] = {
  164.    0x00000000,   0x00000000,   0x00100000,   0x00100000,
  165.    0x00000000,   0x00000000,   0x00100000,   0x00100000,
  166.    0x10000000,   0x10000000,   0x10100000,   0x10100000,
  167.    0x10000000,   0x10000000,   0x10100000,   0x10100000,};
  168. int ipi_L0[] = {
  169.    0x00000000,   0x01000000,   0x00010000,   0x01010000,
  170.    0x00000100,   0x01000100,   0x00010100,   0x01010100,
  171.    0x00000001,   0x01000001,   0x00010001,   0x01010001,
  172.    0x00000101,   0x01000101,   0x00010101,   0x01010101,};
  173. int ipi_L2[] = {
  174.    0x00000000,   0x04000000,   0x00040000,   0x04040000,
  175.    0x00000400,   0x04000400,   0x00040400,   0x04040400,
  176.    0x00000004,   0x04000004,   0x00040004,   0x04040004,
  177.    0x00000404,   0x04000404,   0x00040404,   0x04040404,};
  178. int ipi_L4[] = {
  179.    0x00000000,   0x10000000,   0x00100000,   0x10100000,
  180.    0x00001000,   0x10001000,   0x00101000,   0x10101000,
  181.    0x00000010,   0x10000010,   0x00100010,   0x10100010,
  182.    0x00001010,   0x10001010,   0x00101010,   0x10101010,};
  183. int ipi_L6[] = {
  184.    0x00000000,   0x40000000,   0x00400000,   0x40400000,
  185.    0x00004000,   0x40004000,   0x00404000,   0x40404000,
  186.    0x00000040,   0x40000040,   0x00400040,   0x40400040,
  187.    0x00004040,   0x40004040,   0x00404040,   0x40404040,};
  188. int ipi_L8[] = {
  189.    0x00000000,   0x02000000,   0x00020000,   0x02020000,
  190.    0x00000200,   0x02000200,   0x00020200,   0x02020200,
  191.    0x00000002,   0x02000002,   0x00020002,   0x02020002,
  192.    0x00000202,   0x02000202,   0x00020202,   0x02020202,};
  193. int ipi_La[] = {
  194.    0x00000000,   0x08000000,   0x00080000,   0x08080000,
  195.    0x00000800,   0x08000800,   0x00080800,   0x08080800,
  196.    0x00000008,   0x08000008,   0x00080008,   0x08080008,
  197.    0x00000808,   0x08000808,   0x00080808,   0x08080808,};
  198. int ipi_Lc[] = {
  199.    0x00000000,   0x20000000,   0x00200000,   0x20200000,
  200.    0x00002000,   0x20002000,   0x00202000,   0x20202000,
  201.    0x00000020,   0x20000020,   0x00200020,   0x20200020,
  202.    0x00002020,   0x20002020,   0x00202020,   0x20202020,};
  203. int ipi_Le[] = {
  204.    0x00000000,   0x80000000,   0x00800000,   0x80800000,
  205.    0x00008000,   0x80008000,   0x00808000,   0x80808000,
  206.    0x00000080,   0x80000080,   0x00800080,   0x80800080,
  207.    0x00008080,   0x80008080,   0x00808080,   0x80808080,};
  208. int ipi_H1[] = {
  209.    0x00000000,   0x01000000,   0x00010000,   0x01010000,
  210.    0x00000100,   0x01000100,   0x00010100,   0x01010100,
  211.    0x00000001,   0x01000001,   0x00010001,   0x01010001,
  212.    0x00000101,   0x01000101,   0x00010101,   0x01010101,};
  213. int ipi_H3[] = {
  214.    0x00000000,   0x04000000,   0x00040000,   0x04040000,
  215.    0x00000400,   0x04000400,   0x00040400,   0x04040400,
  216.    0x00000004,   0x04000004,   0x00040004,   0x04040004,
  217.    0x00000404,   0x04000404,   0x00040404,   0x04040404,};
  218. int ipi_H5[] = {
  219.    0x00000000,   0x10000000,   0x00100000,   0x10100000,
  220.    0x00001000,   0x10001000,   0x00101000,   0x10101000,
  221.    0x00000010,   0x10000010,   0x00100010,   0x10100010,
  222.    0x00001010,   0x10001010,   0x00101010,   0x10101010,};
  223. int ipi_H7[] = {
  224.    0x00000000,   0x40000000,   0x00400000,   0x40400000,
  225.    0x00004000,   0x40004000,   0x00404000,   0x40404000,
  226.    0x00000040,   0x40000040,   0x00400040,   0x40400040,
  227.    0x00004040,   0x40004040,   0x00404040,   0x40404040,};
  228. int ipi_H9[] = {
  229.    0x00000000,   0x02000000,   0x00020000,   0x02020000,
  230.    0x00000200,   0x02000200,   0x00020200,   0x02020200,
  231.    0x00000002,   0x02000002,   0x00020002,   0x02020002,
  232.    0x00000202,   0x02000202,   0x00020202,   0x02020202,};
  233. int ipi_Hb[] = {
  234.    0x00000000,   0x08000000,   0x00080000,   0x08080000,
  235.    0x00000800,   0x08000800,   0x00080800,   0x08080800,
  236.    0x00000008,   0x08000008,   0x00080008,   0x08080008,
  237.    0x00000808,   0x08000808,   0x00080808,   0x08080808,};
  238. int ipi_Hd[] = {
  239.    0x00000000,   0x20000000,   0x00200000,   0x20200000,
  240.    0x00002000,   0x20002000,   0x00202000,   0x20202000,
  241.    0x00000020,   0x20000020,   0x00200020,   0x20200020,
  242.    0x00002020,   0x20002020,   0x00202020,   0x20202020,};
  243. int ipi_Hf[] = {
  244.    0x00000000,   0x80000000,   0x00800000,   0x80800000,
  245.    0x00008000,   0x80008000,   0x00808000,   0x80808000,
  246.    0x00000080,   0x80000080,   0x00800080,   0x80800080,
  247.    0x00008080,   0x80008080,   0x00808080,   0x80808080,};
  248. int SP0[] = {
  249.    0x08000820,   0x00000800,   0x00020000,   0x08020820,
  250.    0x08000000,   0x08000820,   0x00000020,   0x08000000,
  251.    0x00020020,   0x08020000,   0x08020820,   0x00020800,
  252.    0x08020800,   0x00020820,   0x00000800,   0x00000020,
  253.    0x08020000,   0x08000020,   0x08000800,   0x00000820,
  254.    0x00020800,   0x00020020,   0x08020020,   0x08020800,
  255.    0x00000820,   0x00000000,   0x00000000,   0x08020020,
  256.    0x08000020,   0x08000800,   0x00020820,   0x00020000,
  257.    0x00020820,   0x00020000,   0x08020800,   0x00000800,
  258.    0x00000020,   0x08020020,   0x00000800,   0x00020820,
  259.    0x08000800,   0x00000020,   0x08000020,   0x08020000,
  260.    0x08020020,   0x08000000,   0x00020000,   0x08000820,
  261.    0x00000000,   0x08020820,   0x00020020,   0x08000020,
  262.    0x08020000,   0x08000800,   0x08000820,   0x00000000,
  263.    0x08020820,   0x00020800,   0x00020800,   0x00000820,
  264.    0x00000820,   0x00020020,   0x08000000,   0x08020800,};
  265. int SP1[] = {
  266.    0x00100000,   0x02100001,   0x02000401,   0x00000000,
  267.    0x00000400,   0x02000401,   0x00100401,   0x02100400,
  268.    0x02100401,   0x00100000,   0x00000000,   0x02000001,
  269.    0x00000001,   0x02000000,   0x02100001,   0x00000401,
  270.    0x02000400,   0x00100401,   0x00100001,   0x02000400,
  271.    0x02000001,   0x02100000,   0x02100400,   0x00100001,
  272.    0x02100000,   0x00000400,   0x00000401,   0x02100401,
  273.    0x00100400,   0x00000001,   0x02000000,   0x00100400,
  274.    0x02000000,   0x00100400,   0x00100000,   0x02000401,
  275.    0x02000401,   0x02100001,   0x02100001,   0x00000001,
  276.    0x00100001,   0x02000000,   0x02000400,   0x00100000,
  277.    0x02100400,   0x00000401,   0x00100401,   0x02100400,
  278.    0x00000401,   0x02000001,   0x02100401,   0x02100000,
  279.    0x00100400,   0x00000000,   0x00000001,   0x02100401,
  280.    0x00000000,   0x00100401,   0x02100000,   0x00000400,
  281.    0x02000001,   0x02000400,   0x00000400,   0x00100001,};
  282. int SP2[] = {
  283.    0x10000008,   0x10200000,   0x00002000,   0x10202008,
  284.    0x10200000,   0x00000008,   0x10202008,   0x00200000,
  285.    0x10002000,   0x00202008,   0x00200000,   0x10000008,
  286.    0x00200008,   0x10002000,   0x10000000,   0x00002008,
  287.    0x00000000,   0x00200008,   0x10002008,   0x00002000,
  288.    0x00202000,   0x10002008,   0x00000008,   0x10200008,
  289.    0x10200008,   0x00000000,   0x00202008,   0x10202000,
  290.    0x00002008,   0x00202000,   0x10202000,   0x10000000,
  291.    0x10002000,   0x00000008,   0x10200008,   0x00202000,
  292.    0x10202008,   0x00200000,   0x00002008,   0x10000008,
  293.    0x00200000,   0x10002000,   0x10000000,   0x00002008,
  294.    0x10000008,   0x10202008,   0x00202000,   0x10200000,
  295.    0x00202008,   0x10202000,   0x00000000,   0x10200008,
  296.    0x00000008,   0x00002000,   0x10200000,   0x00202008,
  297.    0x00002000,   0x00200008,   0x10002008,   0x00000000,
  298.    0x10202000,   0x10000000,   0x00200008,   0x10002008,};
  299. int SP3[] = {
  300.    0x00000080,   0x01040080,   0x01040000,   0x21000080,
  301.    0x00040000,   0x00000080,   0x20000000,   0x01040000,
  302.    0x20040080,   0x00040000,   0x01000080,   0x20040080,
  303.    0x21000080,   0x21040000,   0x00040080,   0x20000000,
  304.    0x01000000,   0x20040000,   0x20040000,   0x00000000,
  305.    0x20000080,   0x21040080,   0x21040080,   0x01000080,
  306.    0x21040000,   0x20000080,   0x00000000,   0x21000000,
  307.    0x01040080,   0x01000000,   0x21000000,   0x00040080,
  308.    0x00040000,   0x21000080,   0x00000080,   0x01000000,
  309.    0x20000000,   0x01040000,   0x21000080,   0x20040080,
  310.    0x01000080,   0x20000000,   0x21040000,   0x01040080,
  311.    0x20040080,   0x00000080,   0x01000000,   0x21040000,
  312.    0x21040080,   0x00040080,   0x21000000,   0x21040080,
  313.    0x01040000,   0x00000000,   0x20040000,   0x21000000,
  314.    0x00040080,   0x01000080,   0x20000080,   0x00040000,
  315.    0x00000000,   0x20040000,   0x01040080,   0x20000080,};
  316. int SP4[] = {
  317.    0x80401000,   0x80001040,   0x80001040,   0x00000040,
  318.    0x00401040,   0x80400040,   0x80400000,   0x80001000,
  319.    0x00000000,   0x00401000,   0x00401000,   0x80401040,
  320.    0x80000040,   0x00000000,   0x00400040,   0x80400000,
  321.    0x80000000,   0x00001000,   0x00400000,   0x80401000,
  322.    0x00000040,   0x00400000,   0x80001000,   0x00001040,
  323.    0x80400040,   0x80000000,   0x00001040,   0x00400040,
  324.    0x00001000,   0x00401040,   0x80401040,   0x80000040,
  325.    0x00400040,   0x80400000,   0x00401000,   0x80401040,
  326.    0x80000040,   0x00000000,   0x00000000,   0x00401000,
  327.    0x00001040,   0x00400040,   0x80400040,   0x80000000,
  328.    0x80401000,   0x80001040,   0x80001040,   0x00000040,
  329.    0x80401040,   0x80000040,   0x80000000,   0x00001000,
  330.    0x80400000,   0x80001000,   0x00401040,   0x80400040,
  331.    0x80001000,   0x00001040,   0x00400000,   0x80401000,
  332.    0x00000040,   0x00400000,   0x00001000,   0x00401040,};
  333. int SP5[] = {
  334.    0x00000104,   0x04010100,   0x00000000,   0x04010004,
  335.    0x04000100,   0x00000000,   0x00010104,   0x04000100,
  336.    0x00010004,   0x04000004,   0x04000004,   0x00010000,
  337.    0x04010104,   0x00010004,   0x04010000,   0x00000104,
  338.    0x04000000,   0x00000004,   0x04010100,   0x00000100,
  339.    0x00010100,   0x04010000,   0x04010004,   0x00010104,
  340.    0x04000104,   0x00010100,   0x00010000,   0x04000104,
  341.    0x00000004,   0x04010104,   0x00000100,   0x04000000,
  342.    0x04010100,   0x04000000,   0x00010004,   0x00000104,
  343.    0x00010000,   0x04010100,   0x04000100,   0x00000000,
  344.    0x00000100,   0x00010004,   0x04010104,   0x04000100,
  345.    0x04000004,   0x00000100,   0x00000000,   0x04010004,
  346.    0x04000104,   0x00010000,   0x04000000,   0x04010104,
  347.    0x00000004,   0x00010104,   0x00010100,   0x04000004,
  348.    0x04010000,   0x04000104,   0x00000104,   0x04010000,
  349.    0x00010104,   0x00000004,   0x04010004,   0x00010100,};
  350. int SP6[] = {
  351.    0x40084010,   0x40004000,   0x00004000,   0x00084010,
  352.    0x00080000,   0x00000010,   0x40080010,   0x40004010,
  353.    0x40000010,   0x40084010,   0x40084000,   0x40000000,
  354.    0x40004000,   0x00080000,   0x00000010,   0x40080010,
  355.    0x00084000,   0x00080010,   0x40004010,   0x00000000,
  356.    0x40000000,   0x00004000,   0x00084010,   0x40080000,
  357.    0x00080010,   0x40000010,   0x00000000,   0x00084000,
  358.    0x00004010,   0x40084000,   0x40080000,   0x00004010,
  359.    0x00000000,   0x00084010,   0x40080010,   0x00080000,
  360.    0x40004010,   0x40080000,   0x40084000,   0x00004000,
  361.    0x40080000,   0x40004000,   0x00000010,   0x40084010,
  362.    0x00084010,   0x00000010,   0x00004000,   0x40000000,
  363.    0x00004010,   0x40084000,   0x00080000,   0x40000010,
  364.    0x00080010,   0x40004010,   0x40000010,   0x00080010,
  365.    0x00084000,   0x00000000,   0x40004000,   0x00004010,
  366.    0x40000000,   0x40080010,   0x40084010,   0x00084000,};
  367. int SP7[] = {
  368.    0x00808200,   0x00000000,   0x00008000,   0x00808202,
  369.    0x00808002,   0x00008202,   0x00000002,   0x00008000,
  370.    0x00000200,   0x00808200,   0x00808202,   0x00000200,
  371.    0x00800202,   0x00808002,   0x00800000,   0x00000002,
  372.    0x00000202,   0x00800200,   0x00800200,   0x00008200,
  373.    0x00008200,   0x00808000,   0x00808000,   0x00800202,
  374.    0x00008002,   0x00800002,   0x00800002,   0x00008002,
  375.    0x00000000,   0x00000202,   0x00008202,   0x00800000,
  376.    0x00008000,   0x00808202,   0x00000002,   0x00808000,
  377.    0x00808200,   0x00800000,   0x00800000,   0x00000200,
  378.    0x00808002,   0x00008000,   0x00008200,   0x00800002,
  379.    0x00000200,   0x00000002,   0x00800202,   0x00008202,
  380.    0x00808202,   0x00008002,   0x00808000,   0x00800202,
  381.    0x00800002,   0x00000202,   0x00008202,   0x00808200,
  382.    0x00000202,   0x00800200,   0x00800200,   0x00000000,
  383.    0x00008002,   0x00008200,   0x00000000,   0x00808002,};
  384. int PC1[] = {
  385.    0x10000000,   0x00000000,   0x00100000,   0x00000000,
  386.    0x00001000,   0x00000000,   0x00000010,   0x00000000,
  387.    0x00000000,   0x00010000,   0x00000000,   0x01000000,
  388.    0x00000001,   0x00000000,   0x00000000,   0x00000000,
  389.    0x20000000,   0x00000000,   0x00200000,   0x00000000,
  390.    0x00002000,   0x00000000,   0x00000020,   0x00000000,
  391.    0x00000000,   0x00020000,   0x00000000,   0x02000000,
  392.    0x00000002,   0x00000000,   0x00000000,   0x00000000,
  393.    0x40000000,   0x00000000,   0x00400000,   0x00000000,
  394.    0x00004000,   0x00000000,   0x00000040,   0x00000000,
  395.    0x00000000,   0x00040000,   0x00000000,   0x04000000,
  396.    0x00000004,   0x00000000,   0x00000000,   0x00000000,
  397.    0x80000000,   0x00000000,   0x00800000,   0x00000000,
  398.    0x00008000,   0x00000000,   0x00000080,   0x00000000,
  399.    0x00000000,   0x00080000,   0x00000000,   0x08000000,
  400.    0x00000008,   0x00000000,   0x00000000,   0x00000000,
  401.    0x01000000,   0x00000000,   0x00010000,   0x00000000,
  402.    0x00000100,   0x00000000,   0x00000000,   0x00000100,
  403.    0x00000000,   0x00001000,   0x00000000,   0x00100000,
  404.    0x00000000,   0x10000000,   0x00000000,   0x00000000,
  405.    0x02000000,   0x00000000,   0x00020000,   0x00000000,
  406.    0x00000200,   0x00000000,   0x00000000,   0x00000200,
  407.    0x00000000,   0x00002000,   0x00000000,   0x00200000,
  408.    0x00000000,   0x20000000,   0x00000000,   0x00000000,
  409.    0x04000000,   0x00000000,   0x00040000,   0x00000000,
  410.    0x00000400,   0x00000000,   0x00000000,   0x00000400,
  411.    0x00000000,   0x00004000,   0x00000000,   0x00400000,
  412.    0x00000000,   0x40000000,   0x00000000,   0x00000000,
  413.    0x08000000,   0x00000000,   0x00080000,   0x00000000,
  414.    0x00000800,   0x00000000,   0x00000000,   0x00000800,
  415.    0x00000000,   0x00008000,   0x00000000,   0x00800000,
  416.    0x00000000,   0x80000000,   0x00000000,   0x00000000,};
  417. int PC2[] = {
  418.    0x00000000,   0x20000000,   0x00000000,   0x00800000,
  419.    0x00000000,   0x00000000,   0x00000000,   0x00040000,
  420.    0x00000010,   0x00000000,   0x00000000,   0x00000000,
  421.    0x00000000,   0x02000000,   0x00000001,   0x00000000,
  422.    0x00000080,   0x00000000,   0x00000000,   0x00100000,
  423.    0x00000000,   0x00000000,   0x00000000,   0x08000000,
  424.    0x00000000,   0x40000000,   0x00000000,   0x00200000,
  425.    0x00000008,   0x00000000,   0x00000000,   0x10000000,
  426.    0x00000000,   0x04000000,   0x00000000,   0x00080000,
  427.    0x00000000,   0x80000000,   0x00000040,   0x00000000,
  428.    0x00000000,   0x00400000,   0x00000000,   0x00000000,
  429.    0x00000004,   0x00000000,   0x00000000,   0x01000000,
  430.    0x00000000,   0x00000000,   0x00000000,   0x00000000,
  431.    0x00000000,   0x00000000,   0x00000000,   0x00000000,
  432.    0x00000000,   0x00000000,   0x00000000,   0x00000000,
  433.    0x00000000,   0x00000000,   0x00000000,   0x00000000,
  434.    0x08000000,   0x00000000,   0x00000100,   0x00000000,
  435.    0x02000000,   0x00000000,   0x00010000,   0x00000000,
  436.    0x04000000,   0x00000000,   0x00400000,   0x00000000,
  437.    0x00001000,   0x00000000,   0x00004000,   0x00000000,
  438.    0x00000000,   0x00000000,   0x00100000,   0x00000000,
  439.    0x20000000,   0x00000000,   0x00020000,   0x00000000,
  440.    0x00000200,   0x00000000,   0x80000000,   0x00000000,
  441.    0x00800000,   0x00000000,   0x00002000,   0x00000000,
  442.    0x40000000,   0x00000000,   0x00000000,   0x00000000,
  443.    0x00040000,   0x00000000,   0x00000400,   0x00000000,
  444.    0x00200000,   0x00000000,   0x00000000,   0x00000000,
  445.    0x00080000,   0x00000000,   0x10000000,   0x00000000,
  446.    0x00000000,   0x00000000,   0x00008000,   0x00000000,
  447.    0x00000800,   0x00000000,   0x01000000,   0x00000000,
  448.    0x00000000,   0x00020000,   0x00000002,   0x00000000,
  449.    0x00000020,   0x00000000,   0x00000000,   0x00010000,};
  450.  
  451. static extra;
  452. char E[48];                 /* 0x255c4 */
  453.  
  454. char *crypt(passwd, salt)           /* 0x68f8 */
  455.      char *passwd, *salt;
  456. {
  457.     int temp, l8;
  458.     register i, j;
  459.     register  c;                /*d7, d6, d5*/
  460.     static char iobuf[10];          /* 0x27f34 */
  461.     static unsigned x27f44;
  462.     static unsigned x27f48;
  463.  
  464.     x27f44 = 0;
  465.     x27f48 = 0;
  466.  
  467.     for( i = 0; i < 48; i++)
  468.     E[i] = e[i];
  469.  
  470.     for(i = 0; (c = *passwd)  &&  (i < 32); i++, passwd++)
  471.     for(j = 0; j < 7; j++, i++) {
  472.         l8 = (c >> (6 - j)) & 01;
  473.         x27f44 |= (l8 << (31 - i));
  474.     }
  475.  
  476.     for (i = 0; (c = *passwd)  &&  (i < 32); i++, passwd++)
  477.     for(j = 0; j < 7; j++, i++) {
  478.         l8 = (c >> (6 - j)) & 01;
  479.         x27f48 |= (l8 << (31 - i));
  480.     }
  481.  
  482.     compkeys(&x27f44, 0);
  483.  
  484.     for(i=0;i<2;i++){
  485.     c = *salt++;
  486.     iobuf[i] = c;
  487.     if(c>'Z') c -= 6;
  488.     if(c>'9') c -= 7;
  489.     c -= '.';
  490.     for(j=0;j<6;j++){
  491.         if((c>>j) & 01){
  492.         temp = E[6*i+j];
  493.         E[6*i+j] = E[6*i+j+24];
  494.         E[6*i+j+24] = temp;
  495.         }
  496.     }
  497.     }
  498.  
  499.     mungE();
  500.     x27f44 = 0;
  501.     x27f48 = 0;
  502.     des(&x27f44, &x27f44);
  503.     ipi(&x27f44, &x27f44);
  504.  
  505.     for(i=0; i<11; i++){
  506.     c = x27f44 >> 26;
  507.     x27f44  = x27f44 << 6;
  508.     x27f44 |= x27f48 >> 26;
  509.     x27f48 = x27f48 << 6;
  510.     c += '.';
  511.     if(c > '9') c += 7;
  512.     if(c > 'Z') c += 6;
  513.     iobuf[i+2] = c;
  514.     }
  515.     iobuf[i+2] = 0;
  516.     if(iobuf[1] == 0)
  517.     iobuf[1] = iobuf[0];
  518.     return(iobuf);
  519. }
  520.  
  521. int E_H[8][16];                 /* 0x251c4 */
  522. int E_L[8][16];                 /* 0x253c4 */
  523. mungE()                     /* 0x6b2a */
  524. {
  525.     register i, j, d5, d4, d3, d2;
  526.     register *a5, *a4;
  527.     int l28;
  528.  
  529.     for(i = 0; i < 8; i++) {
  530.     a5 = E_L[i];
  531.     a4 = E_H[i];
  532.     for(j = 0; j < 16; j++) {
  533.         *a5++ = 0;
  534.         *a4++ = 0;
  535.     }
  536.     }
  537.     for (j = 0; j < 32; j++) {
  538.     d2 = 1 << (31 - j);
  539.     d3 = 31 - E[j];
  540.     d4 = 1 << (d3 & 3);
  541.     a5 = E_L[d3 >> 2];
  542.     for (i = 1; i < 16; i++)
  543.         if (i & d4)
  544.         a5[i] |= d2;
  545.     }
  546.     for (j = 32; j < 48; j++) {
  547.     d2 = 1 << (63-j);
  548.     d3 = 31 - E[j];
  549.     d4 = 1 << (d3 & 3);
  550.     a5 = E_H[d3 >> 2];
  551.     for (i = 1; i < 16; i++)
  552.         if (i & d4)
  553.         a5[i] |= d2;
  554.     }
  555. }
  556.  
  557. int keys_H[16], keys_L[16];         /* 0x255f4,0x25634 */
  558.  
  559. compkeys(iptr, key)                 /* 0x6c04 */
  560.      int *iptr;
  561. {
  562.     int i, l8, l12, l16;
  563.     register d7, d6, d5, d4, d3, d2;
  564.  
  565.     d7 = 0;
  566.     d6 = 0;
  567.     for (d3 = 0, d2 = iptr[1];  d3 < 64; d2*=2, d3+=2)
  568.     if (d2 < 0) {
  569.         d7 |= PC1[d3];
  570.         d6 |= PC1[d3+1];
  571.     }
  572.  
  573.     for (d2 = iptr[0];  d3 < 128; d2*=2, d3+=2)
  574.     if (d2 < 0) {
  575.         d7 |= PC1[d3];
  576.         d6 |= PC1[d3+1];
  577.     }
  578.  
  579.  
  580.     for (i = 0; i < 16; i++) {
  581.     for (d2 = 0; d2 < shift[i]; d2++) {
  582.         l16 = l12 = l8 = 0;
  583.         if (d7 < 0)
  584.         l8 = 16;
  585.         if (d7 & 0x08)
  586.         l12 = 256;
  587.         if (d6 < 0)
  588.         l16 = 1;
  589.         d7 = ((d7 << 1) & ~0x10) | l8 | l16;
  590.         d6 = (d6 << 1) | l12;
  591.     }
  592.  
  593.  
  594.     d5 = 0;
  595.     d4 = 0;
  596.     for (d3=0, d2=d6;  d3 < 64;  d2*=2, d3+=2) {
  597.         if (d2 < 0) {
  598.         d5 |= PC2[d3];
  599.         d4 |= PC2[d3+1];
  600.         }
  601.     }
  602.     for (d2=d7;  d3 < 128;  d2*=2, d3+=2) {
  603.         if (d2 < 0) {
  604.         d5 |= PC2[d3];
  605.         d4 |= PC2[d3+1];
  606.         }
  607.     }
  608.  
  609.     if (key) {
  610.         keys_L[15-i] = d5;
  611.         keys_H[15-i] = d4;
  612.     } else {
  613.         keys_L[i] = d5;
  614.         keys_H[i] = d4;
  615.     }
  616.     }
  617.  
  618. }
  619.  
  620. setupE()
  621. {
  622.     int i, j, l12;
  623.  
  624.     for(i = 0; i < 8; i++)
  625.     for(j = 0; j < 16; j++)
  626.         E_H[i][j] = E_H[i][j] = 0;
  627.  
  628.     for (j = 0; j < 32; j++) {
  629.     l12 = 31 - E[j];
  630.     for (i = 0; i < 16; i++)
  631.         if ((1 << (l12 % 4)) & i)
  632.         E_L[l12 / 4][i] |= (1 << (31 - j));
  633.     }
  634.  
  635.     for (j = 32; j < 48; j++) {
  636.     l12 = 31 - E[j];
  637.     for (i = 0; i < 16; i++)
  638.         if ((1 << (l12 % 4)) & i)
  639.         E_H[l12 / 4][i] |= (1 << (63 - j));
  640.     }
  641. }
  642.  
  643. des(adr1, adr2)
  644.      int *adr1, *adr2;
  645. {
  646.     int l4, *l8, *l12, l16;
  647.     register unsigned d7;
  648.     register unsigned d6, d5;
  649.     register d4, d3, d2;
  650.  
  651.     l4 = adr1[0];
  652.     d2 = adr1[1];
  653.     for (l16 = 0; l16 < 25; l16++) {
  654.     l8 = keys_L;
  655.     l12 = keys_H;
  656.     for( d3 = 0;  d3 < 16;  d3++) {
  657.         d5 = d2;
  658.         d7 = E_L[0][d4 = d5 & 0x0f];
  659.         d6 = E_H[0][d4];
  660.         d5 >>= 4;
  661.         d7 |= E_L[1][d4 = (d5 & 0x0f)];
  662.         d6 |= E_H[1][d4];
  663.         d5 >>= 4;
  664.         d7 |= E_L[2][d4 = (d5 & 0x0f)];
  665.         d6 |= E_H[2][d4];
  666.         d5 >>= 4;
  667.         d7 |= E_L[3][d4 = (d5 & 0x0f)];
  668.         d6 |= E_H[3][d4];
  669.         d5 >>= 4;
  670.         d7 |= E_L[4][d4 = (d5 & 0x0f)];
  671.         d6 |= E_H[4][d4];
  672.         d5 >>= 4;
  673.         d7 |= E_L[5][d4 = (d5 & 0x0f)];
  674.         d6 |= E_H[5][d4];
  675.         d5 >>= 4;
  676.             d7 |= E_L[6][d4 = (d5 & 0x0f)];
  677.             d6 |= E_H[6][d4];
  678.             d5 >>= 4;
  679.             d7 |= E_L[7][d4 = (d5 & 0x0f)];
  680.             d6 |= E_H[7][d4];
  681.             d7 ^= *l8++;
  682.             d6 ^= *l12++;
  683.  
  684.             d5 = SPO[(d6 >> 16) & 0x3f];
  685.             d5 |= SP1[(d6 >> 22) & 00x3f];
  686.             d5 |= SP2[((d7 & 0x03) << 4) | ((d6 >> 28) & 0x0f)];
  687.             d5 |= SP3[(d7 >> 2) & 0x3f];
  688.             d5 |= SP4[(d7 >> 8) & 0x3f];
  689.             d5 |= SP5[(d7 >> 14) & 0x3f];
  690.             d5 |= SP6[(d7 >> 20) & 0x3f];
  691.             d5 |= SP7[(d7 >> 26) & 0x3f];
  692.             {   d6 = 14;
  693.                 l4 = d2;
  694.                 d2 = d6 ^ d5;
  695.             }
  696.        }
  697.        d5 = l4;
  698.        l4 = d2;
  699.        d2 = d5;
  700.    }
  701.    adr2[0] = l4;
  702.    adr2[1] = d2;
  703. }
  704. ipi(iptr1, iptr2)
  705.             int *iptr1, *iptr2;
  706. {
  707.    register unsigned d7, d6, d5;
  708.  
  709.    d5 = iptr1[0];
  710.    d7 = ipi_L0[d5 & 0x0f];
  711.    d5 = >>= 4;
  712.    d6 = ipi_H1[d5 & 0x0f];
  713.  
  714.    d5 >>= 4;
  715.    d7 |= ipi_L2[d5 & 0x0f];
  716.    d5 >>= 4;
  717.    d6 |= ipi_H3[d5 & 0x0f];
  718.  
  719.    d5 >>= 4;
  720.    d7 |= ipi_L4[d5 & 0x0f];
  721.    d5 >>= 4;
  722.    d6 |= ipi_H5[d5 & 0x0f];
  723.  
  724.    d5 >>= 4;
  725.    d7 | ipi_L6[d5 & 0x0f];
  726.    d5 >>=4;
  727.    d6 |= ipi_H7[d5 & 0x0f];
  728.  
  729.    d5 = iptr1[1];
  730.    d7 |= ipi_L8[d5 & 0x0f];
  731.    d5 >>= 4;
  732.    d6 |= ipi_H9[d5 & 0x0f];
  733.  
  734.    d5 >>= 4;
  735.    d7 |= ipi_La[d5 & 0x0f];
  736.    d5 >>= 4;
  737.    d6 |= ipi_Hb[d5 & 0x0f];
  738.  
  739.    d5 >>=4;
  740.    d7 |= ipi_Lc[d5 & 0x0f];
  741.    d5 >>= 4;
  742.    d6 |= ipi_Hd[d5 & 0x0f];
  743.  
  744.    d5 >>= 4;
  745.    d7 |= ipi_Le[d5 & 0x0f];
  746.    d5 >>= 4;
  747.    d6 |= ipi_Hf[d5 & 0x0f];
  748.  
  749.    iptr2[0] = d7;
  750.    ipyr2[1] = d6;
  751. }
  752.  
  753. /*
  754.  * Local variables:
  755.  * compile-command: "make"
  756.  * comment-collumn: 48
  757.  * End:
  758.  */
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement