home *** CD-ROM | disk | FTP | other *** search
/ Serving the Web / ServingTheWeb1995.disc1of1.iso / linux / slacksrce / d / libc / libc-4.6 / libc-4 / libc-linux / des / des_impl.c < prev    next >
Encoding:
C/C++ Source or Header  |  1994-09-15  |  21.7 KB  |  590 lines

  1. /* Copyright (C) 1992 Eric Young - see COPYING for more details */
  2. /* Collected from libdes and modified for SECURE RPC by Martin Kuck 1994 */
  3. #include <string.h>
  4. #include "des.h"
  5.  
  6.  
  7. static unsigned long des_SPtrans[8][64]={
  8.     /* nibble 0 */
  9.     0x00820200, 0x00020000, 0x80800000, 0x80820200,
  10.     0x00800000, 0x80020200, 0x80020000, 0x80800000,
  11.     0x80020200, 0x00820200, 0x00820000, 0x80000200,
  12.     0x80800200, 0x00800000, 0x00000000, 0x80020000,
  13.     0x00020000, 0x80000000, 0x00800200, 0x00020200,
  14.     0x80820200, 0x00820000, 0x80000200, 0x00800200,
  15.     0x80000000, 0x00000200, 0x00020200, 0x80820000,
  16.     0x00000200, 0x80800200, 0x80820000, 0x00000000,
  17.     0x00000000, 0x80820200, 0x00800200, 0x80020000,
  18.     0x00820200, 0x00020000, 0x80000200, 0x00800200,
  19.     0x80820000, 0x00000200, 0x00020200, 0x80800000,
  20.     0x80020200, 0x80000000, 0x80800000, 0x00820000,
  21.     0x80820200, 0x00020200, 0x00820000, 0x80800200,
  22.     0x00800000, 0x80000200, 0x80020000, 0x00000000,
  23.     0x00020000, 0x00800000, 0x80800200, 0x00820200,
  24.     0x80000000, 0x80820000, 0x00000200, 0x80020200,
  25.  
  26.     /* nibble 1 */
  27.     0x10042004, 0x00000000, 0x00042000, 0x10040000,
  28.     0x10000004, 0x00002004, 0x10002000, 0x00042000,
  29.     0x00002000, 0x10040004, 0x00000004, 0x10002000,
  30.     0x00040004, 0x10042000, 0x10040000, 0x00000004,
  31.     0x00040000, 0x10002004, 0x10040004, 0x00002000,
  32.     0x00042004, 0x10000000, 0x00000000, 0x00040004,
  33.     0x10002004, 0x00042004, 0x10042000, 0x10000004,
  34.     0x10000000, 0x00040000, 0x00002004, 0x10042004,
  35.     0x00040004, 0x10042000, 0x10002000, 0x00042004,
  36.     0x10042004, 0x00040004, 0x10000004, 0x00000000,
  37.     0x10000000, 0x00002004, 0x00040000, 0x10040004,
  38.     0x00002000, 0x10000000, 0x00042004, 0x10002004,
  39.     0x10042000, 0x00002000, 0x00000000, 0x10000004,
  40.     0x00000004, 0x10042004, 0x00042000, 0x10040000,
  41.     0x10040004, 0x00040000, 0x00002004, 0x10002000,
  42.     0x10002004, 0x00000004, 0x10040000, 0x00042000,
  43.  
  44.     /* nibble 2 */
  45.     0x41000000, 0x01010040, 0x00000040, 0x41000040,
  46.     0x40010000, 0x01000000, 0x41000040, 0x00010040,
  47.     0x01000040, 0x00010000, 0x01010000, 0x40000000,
  48.     0x41010040, 0x40000040, 0x40000000, 0x41010000,
  49.     0x00000000, 0x40010000, 0x01010040, 0x00000040,
  50.     0x40000040, 0x41010040, 0x00010000, 0x41000000,
  51.     0x41010000, 0x01000040, 0x40010040, 0x01010000,
  52.     0x00010040, 0x00000000, 0x01000000, 0x40010040,
  53.     0x01010040, 0x00000040, 0x40000000, 0x00010000,
  54.     0x40000040, 0x40010000, 0x01010000, 0x41000040,
  55.     0x00000000, 0x01010040, 0x00010040, 0x41010000,
  56.     0x40010000, 0x01000000, 0x41010040, 0x40000000,
  57.     0x40010040, 0x41000000, 0x01000000, 0x41010040,
  58.     0x00010000, 0x01000040, 0x41000040, 0x00010040,
  59.     0x01000040, 0x00000000, 0x41010000, 0x40000040,
  60.     0x41000000, 0x40010040, 0x00000040, 0x01010000,
  61.  
  62.     /* nibble 3 */
  63.     0x00100402, 0x04000400, 0x00000002, 0x04100402,
  64.     0x00000000, 0x04100000, 0x04000402, 0x00100002,
  65.     0x04100400, 0x04000002, 0x04000000, 0x00000402,
  66.     0x04000002, 0x00100402, 0x00100000, 0x04000000,
  67.     0x04100002, 0x00100400, 0x00000400, 0x00000002,
  68.     0x00100400, 0x04000402, 0x04100000, 0x00000400,
  69.     0x00000402, 0x00000000, 0x00100002, 0x04100400,
  70.     0x04000400, 0x04100002, 0x04100402, 0x00100000,
  71.     0x04100002, 0x00000402, 0x00100000, 0x04000002,
  72.     0x00100400, 0x04000400, 0x00000002, 0x04100000,
  73.     0x04000402, 0x00000000, 0x00000400, 0x00100002,
  74.     0x00000000, 0x04100002, 0x04100400, 0x00000400,
  75.     0x04000000, 0x04100402, 0x00100402, 0x00100000,
  76.     0x04100402, 0x00000002, 0x04000400, 0x00100402,
  77.     0x00100002, 0x00100400, 0x04100000, 0x04000402,
  78.     0x00000402, 0x04000000, 0x04000002, 0x04100400,
  79.  
  80.     /* nibble 4 */
  81.     0x02000000, 0x00004000, 0x00000100, 0x02004108,
  82.     0x02004008, 0x02000100, 0x00004108, 0x02004000,
  83.     0x00004000, 0x00000008, 0x02000008, 0x00004100,
  84.     0x02000108, 0x02004008, 0x02004100, 0x00000000,
  85.     0x00004100, 0x02000000, 0x00004008, 0x00000108,
  86.     0x02000100, 0x00004108, 0x00000000, 0x02000008,
  87.     0x00000008, 0x02000108, 0x02004108, 0x00004008,
  88.     0x02004000, 0x00000100, 0x00000108, 0x02004100,
  89.     0x02004100, 0x02000108, 0x00004008, 0x02004000,
  90.     0x00004000, 0x00000008, 0x02000008, 0x02000100,
  91.     0x02000000, 0x00004100, 0x02004108, 0x00000000,
  92.     0x00004108, 0x02000000, 0x00000100, 0x00004008,
  93.     0x02000108, 0x00000100, 0x00000000, 0x02004108,
  94.     0x02004008, 0x02004100, 0x00000108, 0x00004000,
  95.     0x00004100, 0x02004008, 0x02000100, 0x00000108,
  96.     0x00000008, 0x00004108, 0x02004000, 0x02000008,
  97.  
  98.     /* nibble 5 */
  99.     0x20000010, 0x00080010, 0x00000000, 0x20080800,
  100.     0x00080010, 0x00000800, 0x20000810, 0x00080000,
  101.     0x00000810, 0x20080810, 0x00080800, 0x20000000,
  102.     0x20000800, 0x20000010, 0x20080000, 0x00080810,
  103.     0x00080000, 0x20000810, 0x20080010, 0x00000000,
  104.     0x00000800, 0x00000010, 0x20080800, 0x20080010,
  105.     0x20080810, 0x20080000, 0x20000000, 0x00000810,
  106.     0x00000010, 0x00080800, 0x00080810, 0x20000800,
  107.     0x00000810, 0x20000000, 0x20000800, 0x00080810,
  108.     0x20080800, 0x00080010, 0x00000000, 0x20000800,
  109.     0x20000000, 0x00000800, 0x20080010, 0x00080000,
  110.     0x00080010, 0x20080810, 0x00080800, 0x00000010,
  111.     0x20080810, 0x00080800, 0x00080000, 0x20000810,
  112.     0x20000010, 0x20080000, 0x00080810, 0x00000000,
  113.     0x00000800, 0x20000010, 0x20000810, 0x20080800,
  114.     0x20080000, 0x00000810, 0x00000010, 0x20080010,
  115.  
  116.     /* nibble 6 */
  117.     0x00001000, 0x00000080, 0x00400080, 0x00400001,
  118.     0x00401081, 0x00001001, 0x00001080, 0x00000000,
  119.     0x00400000, 0x00400081, 0x00000081, 0x00401000,
  120.     0x00000001, 0x00401080, 0x00401000, 0x00000081,
  121.     0x00400081, 0x00001000, 0x00001001, 0x00401081,
  122.     0x00000000, 0x00400080, 0x00400001, 0x00001080,
  123.     0x00401001, 0x00001081, 0x00401080, 0x00000001,
  124.     0x00001081, 0x00401001, 0x00000080, 0x00400000,
  125.     0x00001081, 0x00401000, 0x00401001, 0x00000081,
  126.     0x00001000, 0x00000080, 0x00400000, 0x00401001,
  127.     0x00400081, 0x00001081, 0x00001080, 0x00000000,
  128.     0x00000080, 0x00400001, 0x00000001, 0x00400080,
  129.     0x00000000, 0x00400081, 0x00400080, 0x00001080,
  130.     0x00000081, 0x00001000, 0x00401081, 0x00400000,
  131.     0x00401080, 0x00000001, 0x00001001, 0x00401081,
  132.     0x00400001, 0x00401080, 0x00401000, 0x00001001,
  133.  
  134.     /* nibble 7 */
  135.     0x08200020, 0x08208000, 0x00008020, 0x00000000,
  136.     0x08008000, 0x00200020, 0x08200000, 0x08208020,
  137.     0x00000020, 0x08000000, 0x00208000, 0x00008020,
  138.     0x00208020, 0x08008020, 0x08000020, 0x08200000,
  139.     0x00008000, 0x00208020, 0x00200020, 0x08008000,
  140.     0x08208020, 0x08000020, 0x00000000, 0x00208000,
  141.     0x08000000, 0x00200000, 0x08008020, 0x08200020,
  142.     0x00200000, 0x00008000, 0x08208000, 0x00000020,
  143.     0x00200000, 0x00008000, 0x08000020, 0x08208020,
  144.     0x00008020, 0x08000000, 0x00000000, 0x00208000,
  145.     0x08200020, 0x08008020, 0x08008000, 0x00200020,
  146.     0x08208000, 0x00000020, 0x00200020, 0x08008000,
  147.     0x08208020, 0x00200000, 0x08200000, 0x08000020,
  148.     0x00208000, 0x00008020, 0x08008020, 0x08200000,
  149.     0x00000020, 0x08208000, 0x00208020, 0x00000000,
  150.     0x08000000, 0x08200020, 0x00008000, 0x00208020};
  151.  
  152. static unsigned long des_skb[8][64]={
  153.     /* for C bits (numbered as per FIPS 46) 1 2 3 4 5 6 */
  154.     0x00000000,0x00000010,0x20000000,0x20000010,
  155.     0x00010000,0x00010010,0x20010000,0x20010010,
  156.     0x00000800,0x00000810,0x20000800,0x20000810,
  157.     0x00010800,0x00010810,0x20010800,0x20010810,
  158.     0x00000020,0x00000030,0x20000020,0x20000030,
  159.     0x00010020,0x00010030,0x20010020,0x20010030,
  160.     0x00000820,0x00000830,0x20000820,0x20000830,
  161.     0x00010820,0x00010830,0x20010820,0x20010830,
  162.     0x00080000,0x00080010,0x20080000,0x20080010,
  163.     0x00090000,0x00090010,0x20090000,0x20090010,
  164.     0x00080800,0x00080810,0x20080800,0x20080810,
  165.     0x00090800,0x00090810,0x20090800,0x20090810,
  166.     0x00080020,0x00080030,0x20080020,0x20080030,
  167.     0x00090020,0x00090030,0x20090020,0x20090030,
  168.     0x00080820,0x00080830,0x20080820,0x20080830,
  169.     0x00090820,0x00090830,0x20090820,0x20090830,
  170.     /* for C bits (numbered as per FIPS 46) 7 8 10 11 12 13 */
  171.     0x00000000,0x02000000,0x00002000,0x02002000,
  172.     0x00200000,0x02200000,0x00202000,0x02202000,
  173.     0x00000004,0x02000004,0x00002004,0x02002004,
  174.     0x00200004,0x02200004,0x00202004,0x02202004,
  175.     0x00000400,0x02000400,0x00002400,0x02002400,
  176.     0x00200400,0x02200400,0x00202400,0x02202400,
  177.     0x00000404,0x02000404,0x00002404,0x02002404,
  178.     0x00200404,0x02200404,0x00202404,0x02202404,
  179.     0x10000000,0x12000000,0x10002000,0x12002000,
  180.     0x10200000,0x12200000,0x10202000,0x12202000,
  181.     0x10000004,0x12000004,0x10002004,0x12002004,
  182.     0x10200004,0x12200004,0x10202004,0x12202004,
  183.     0x10000400,0x12000400,0x10002400,0x12002400,
  184.     0x10200400,0x12200400,0x10202400,0x12202400,
  185.     0x10000404,0x12000404,0x10002404,0x12002404,
  186.     0x10200404,0x12200404,0x10202404,0x12202404,
  187.     /* for C bits (numbered as per FIPS 46) 14 15 16 17 19 20 */
  188.     0x00000000,0x00000001,0x00040000,0x00040001,
  189.     0x01000000,0x01000001,0x01040000,0x01040001,
  190.     0x00000002,0x00000003,0x00040002,0x00040003,
  191.     0x01000002,0x01000003,0x01040002,0x01040003,
  192.     0x00000200,0x00000201,0x00040200,0x00040201,
  193.     0x01000200,0x01000201,0x01040200,0x01040201,
  194.     0x00000202,0x00000203,0x00040202,0x00040203,
  195.     0x01000202,0x01000203,0x01040202,0x01040203,
  196.     0x08000000,0x08000001,0x08040000,0x08040001,
  197.     0x09000000,0x09000001,0x09040000,0x09040001,
  198.     0x08000002,0x08000003,0x08040002,0x08040003,
  199.     0x09000002,0x09000003,0x09040002,0x09040003,
  200.     0x08000200,0x08000201,0x08040200,0x08040201,
  201.     0x09000200,0x09000201,0x09040200,0x09040201,
  202.     0x08000202,0x08000203,0x08040202,0x08040203,
  203.     0x09000202,0x09000203,0x09040202,0x09040203,
  204.     /* for C bits (numbered as per FIPS 46) 21 23 24 26 27 28 */
  205.     0x00000000,0x00100000,0x00000100,0x00100100,
  206.     0x00000008,0x00100008,0x00000108,0x00100108,
  207.     0x00001000,0x00101000,0x00001100,0x00101100,
  208.     0x00001008,0x00101008,0x00001108,0x00101108,
  209.     0x04000000,0x04100000,0x04000100,0x04100100,
  210.     0x04000008,0x04100008,0x04000108,0x04100108,
  211.     0x04001000,0x04101000,0x04001100,0x04101100,
  212.     0x04001008,0x04101008,0x04001108,0x04101108,
  213.     0x00020000,0x00120000,0x00020100,0x00120100,
  214.     0x00020008,0x00120008,0x00020108,0x00120108,
  215.     0x00021000,0x00121000,0x00021100,0x00121100,
  216.     0x00021008,0x00121008,0x00021108,0x00121108,
  217.     0x04020000,0x04120000,0x04020100,0x04120100,
  218.     0x04020008,0x04120008,0x04020108,0x04120108,
  219.     0x04021000,0x04121000,0x04021100,0x04121100,
  220.     0x04021008,0x04121008,0x04021108,0x04121108,
  221.     /* for D bits (numbered as per FIPS 46) 1 2 3 4 5 6 */
  222.     0x00000000,0x10000000,0x00010000,0x10010000,
  223.     0x00000004,0x10000004,0x00010004,0x10010004,
  224.     0x20000000,0x30000000,0x20010000,0x30010000,
  225.     0x20000004,0x30000004,0x20010004,0x30010004,
  226.     0x00100000,0x10100000,0x00110000,0x10110000,
  227.     0x00100004,0x10100004,0x00110004,0x10110004,
  228.     0x20100000,0x30100000,0x20110000,0x30110000,
  229.     0x20100004,0x30100004,0x20110004,0x30110004,
  230.     0x00001000,0x10001000,0x00011000,0x10011000,
  231.     0x00001004,0x10001004,0x00011004,0x10011004,
  232.     0x20001000,0x30001000,0x20011000,0x30011000,
  233.     0x20001004,0x30001004,0x20011004,0x30011004,
  234.     0x00101000,0x10101000,0x00111000,0x10111000,
  235.     0x00101004,0x10101004,0x00111004,0x10111004,
  236.     0x20101000,0x30101000,0x20111000,0x30111000,
  237.     0x20101004,0x30101004,0x20111004,0x30111004,
  238.     /* for D bits (numbered as per FIPS 46) 8 9 11 12 13 14 */
  239.     0x00000000,0x08000000,0x00000008,0x08000008,
  240.     0x00000400,0x08000400,0x00000408,0x08000408,
  241.     0x00020000,0x08020000,0x00020008,0x08020008,
  242.     0x00020400,0x08020400,0x00020408,0x08020408,
  243.     0x00000001,0x08000001,0x00000009,0x08000009,
  244.     0x00000401,0x08000401,0x00000409,0x08000409,
  245.     0x00020001,0x08020001,0x00020009,0x08020009,
  246.     0x00020401,0x08020401,0x00020409,0x08020409,
  247.     0x02000000,0x0A000000,0x02000008,0x0A000008,
  248.     0x02000400,0x0A000400,0x02000408,0x0A000408,
  249.     0x02020000,0x0A020000,0x02020008,0x0A020008,
  250.     0x02020400,0x0A020400,0x02020408,0x0A020408,
  251.     0x02000001,0x0A000001,0x02000009,0x0A000009,
  252.     0x02000401,0x0A000401,0x02000409,0x0A000409,
  253.     0x02020001,0x0A020001,0x02020009,0x0A020009,
  254.     0x02020401,0x0A020401,0x02020409,0x0A020409,
  255.     /* for D bits (numbered as per FIPS 46) 16 17 18 19 20 21 */
  256.     0x00000000,0x00000100,0x00080000,0x00080100,
  257.     0x01000000,0x01000100,0x01080000,0x01080100,
  258.     0x00000010,0x00000110,0x00080010,0x00080110,
  259.     0x01000010,0x01000110,0x01080010,0x01080110,
  260.     0x00200000,0x00200100,0x00280000,0x00280100,
  261.     0x01200000,0x01200100,0x01280000,0x01280100,
  262.     0x00200010,0x00200110,0x00280010,0x00280110,
  263.     0x01200010,0x01200110,0x01280010,0x01280110,
  264.     0x00000200,0x00000300,0x00080200,0x00080300,
  265.     0x01000200,0x01000300,0x01080200,0x01080300,
  266.     0x00000210,0x00000310,0x00080210,0x00080310,
  267.     0x01000210,0x01000310,0x01080210,0x01080310,
  268.     0x00200200,0x00200300,0x00280200,0x00280300,
  269.     0x01200200,0x01200300,0x01280200,0x01280300,
  270.     0x00200210,0x00200310,0x00280210,0x00280310,
  271.     0x01200210,0x01200310,0x01280210,0x01280310,
  272.     /* for D bits (numbered as per FIPS 46) 22 23 24 25 27 28 */
  273.     0x00000000,0x04000000,0x00040000,0x04040000,
  274.     0x00000002,0x04000002,0x00040002,0x04040002,
  275.     0x00002000,0x04002000,0x00042000,0x04042000,
  276.     0x00002002,0x04002002,0x00042002,0x04042002,
  277.     0x00000020,0x04000020,0x00040020,0x04040020,
  278.     0x00000022,0x04000022,0x00040022,0x04040022,
  279.     0x00002020,0x04002020,0x00042020,0x04042020,
  280.     0x00002022,0x04002022,0x00042022,0x04042022,
  281.     0x00000800,0x04000800,0x00040800,0x04040800,
  282.     0x00000802,0x04000802,0x00040802,0x04040802,
  283.     0x00002800,0x04002800,0x00042800,0x04042800,
  284.     0x00002802,0x04002802,0x00042802,0x04042802,
  285.     0x00000820,0x04000820,0x00040820,0x04040820,
  286.     0x00000822,0x04000822,0x00040822,0x04040822,
  287.     0x00002820,0x04002820,0x00042820,0x04042820,
  288.     0x00002822,0x04002822,0x00042822,0x04042822,
  289. };
  290.  
  291. #define c2l(c,l)    (l =((unsigned long)(*((c)++)))    , \
  292.              l|=((unsigned long)(*((c)++)))<< 8, \
  293.              l|=((unsigned long)(*((c)++)))<<16, \
  294.              l|=((unsigned long)(*((c)++)))<<24)
  295.  
  296. #define l2c(l,c)    (*((c)++)=(unsigned char)(((l)    )&0xff), \
  297.              *((c)++)=(unsigned char)(((l)>> 8)&0xff), \
  298.              *((c)++)=(unsigned char)(((l)>>16)&0xff), \
  299.              *((c)++)=(unsigned char)(((l)>>24)&0xff))
  300.  
  301. /*
  302.  * IP and FP
  303.  * The problem is more of a geometric problem that random bit fiddling.
  304.  *  0  1  2  3  4  5  6  7      62 54 46 38 30 22 14  6
  305.  *  8  9 10 11 12 13 14 15      60 52 44 36 28 20 12  4
  306.  * 16 17 18 19 20 21 22 23      58 50 42 34 26 18 10  2
  307.  * 24 25 26 27 28 29 30 31  to  56 48 40 32 24 16  8  0
  308.  *
  309.  * 32 33 34 35 36 37 38 39      63 55 47 39 31 23 15  7
  310.  * 40 41 42 43 44 45 46 47      61 53 45 37 29 21 13  5
  311.  * 48 49 50 51 52 53 54 55      59 51 43 35 27 19 11  3
  312.  * 56 57 58 59 60 61 62 63      57 49 41 33 25 17  9  1
  313.  *
  314.  * The output has been subject to swaps of the form
  315.  * 0 1 -> 3 1 but the odd and even bits have been put into
  316.  * 2 3    2 0
  317.  * different words.  The main trick is to remember that
  318.  * t=((l>>size)^r)&(mask);
  319.  * r^=t;
  320.  * l^=(t<<size);
  321.  * can be used to swap and move bits between words.
  322.  *
  323.  * So l =  0  1  2  3  r = 16 17 18 19
  324.  *         4  5  6  7      20 21 22 23
  325.  *         8  9 10 11      24 25 26 27
  326.  *        12 13 14 15      28 29 30 31
  327.  * becomes (for size == 2 and mask == 0x3333)
  328.  * t =   2^16  3^17 -- --   l =  0  1 16 17  r =  2  3 18 19
  329.  *       6^20  7^21 -- --        4  5 20 21       6  7 22 23
  330.  *    10^24 11^25 -- --        8  9 24 25      10 11 24 25
  331.  *     14^28 15^29 -- --       12 13 28 29      14 15 28 29
  332.  *
  333.  * Thanks for hints from Richard Outerbridge - he told me IP&FP
  334.  * could be done in 15 xor, 10 shifts and 5 ands.
  335.  * When I finally started to think of the problem in 2D
  336.  * I first got ~42 operations without xors.  When I remembered
  337.  * how to use xors :-) I got it to its final state.
  338.  */
  339.  
  340. #define PERM_OP(a,b,t,n,m) ((t)=((((a)>>(n))^(b))&(m)),\
  341.     (b)^=(t),\
  342.     (a)^=((t)<<(n)))
  343.  
  344. #define HPERM_OP(a,t,n,m) ((t)=((((a)<<(16-(n)))^(a))&(m)),\
  345.     (a)=(a)^(t)^(t>>(16-(n))))
  346.  
  347.  
  348. /* The changes to this macro may help or hinder, depending on the
  349.  * compiler and the achitecture.  gcc2 always seems to do well :-).
  350.  * Inspired by Dana How <how@isl.stanford.edu>
  351.  * DO NOT use the alternative version on machines with 8 byte longs.
  352.  */
  353. #ifdef ALT_ECB
  354. #define D_ENCRYPT(L,R,S) \
  355.     u=((R^s[S  ])<<2);    \
  356.     t= R^s[S+1]; \
  357.     t=((t>>2)+(t<<30)); \
  358.     L^= \
  359.     *(unsigned long *)(des_SP+0x0100+((t    )&0xfc))+ \
  360.     *(unsigned long *)(des_SP+0x0300+((t>> 8)&0xfc))+ \
  361.     *(unsigned long *)(des_SP+0x0500+((t>>16)&0xfc))+ \
  362.     *(unsigned long *)(des_SP+0x0700+((t>>24)&0xfc))+ \
  363.     *(unsigned long *)(des_SP+       ((u    )&0xfc))+ \
  364.       *(unsigned long *)(des_SP+0x0200+((u>> 8)&0xfc))+ \
  365.       *(unsigned long *)(des_SP+0x0400+((u>>16)&0xfc))+ \
  366.      *(unsigned long *)(des_SP+0x0600+((u>>24)&0xfc));
  367. #else /* original version */
  368. #define D_ENCRYPT(L,R,S)    \
  369.     u=(R^s[S  ]); \
  370.     t=R^s[S+1]; \
  371.     t=((t>>4)+(t<<28)); \
  372.     L^=    des_SPtrans[1][(t    )&0x3f]| \
  373.         des_SPtrans[3][(t>> 8)&0x3f]| \
  374.         des_SPtrans[5][(t>>16)&0x3f]| \
  375.         des_SPtrans[7][(t>>24)&0x3f]| \
  376.         des_SPtrans[0][(u    )&0x3f]| \
  377.         des_SPtrans[2][(u>> 8)&0x3f]| \
  378.         des_SPtrans[4][(u>>16)&0x3f]| \
  379.         des_SPtrans[6][(u>>24)&0x3f];
  380. #endif
  381.  
  382. #define ITERATIONS 16
  383.  
  384. static char shifts2[16]={0,0,1,1,1,1,1,1,0,1,1,1,1,1,1,0};
  385.  
  386. static void des_set_key(key,schedule)
  387.      char *key;
  388.      unsigned long *schedule;
  389. {
  390.     register unsigned long c,d,t,s;
  391.     register unsigned char *in;
  392.     register unsigned long *k;
  393.     register int i;
  394.  
  395.     k=(unsigned long *)schedule;
  396.     in=(unsigned char *)key;
  397.  
  398.     c2l(in,c);
  399.     c2l(in,d);
  400.  
  401.     /* I now do it in 47 simple operations :-)
  402.      * Thanks to John Fletcher (john_fletcher@lccmail.ocf.llnl.gov)
  403.      * for the inspiration. :-) */
  404.     PERM_OP (d,c,t,4,0x0f0f0f0f);
  405.     HPERM_OP(c,t,-2,0xcccc0000);
  406.     HPERM_OP(d,t,-2,0xcccc0000);
  407.     PERM_OP (d,c,t,1,0x55555555);
  408.     PERM_OP (c,d,t,8,0x00ff00ff);
  409.     PERM_OP (d,c,t,1,0x55555555);
  410.     d=    (((d&0x000000ff)<<16)| (d&0x0000ff00) |
  411.      ((d&0x00ff0000)>>16)|((c&0xf0000000)>>4));
  412.     c&=0x0fffffff;
  413.  
  414.     for (i=0; i<ITERATIONS; i++) {
  415.     if (shifts2[i])
  416.       { c=((c>>2)|(c<<26)); d=((d>>2)|(d<<26)); }
  417.     else
  418.       { c=((c>>1)|(c<<27)); d=((d>>1)|(d<<27)); }
  419.     c&=0x0fffffff;
  420.     d&=0x0fffffff;
  421.     /* could be a few less shifts but I am to lazy at this
  422.      * point in time to investigate */
  423.     s = des_skb[0][(c)&0x3f]|
  424.       des_skb[1][((c>> 6)&0x03)|((c>> 7)&0x3c)]|
  425.         des_skb[2][((c>>13)&0x0f)|((c>>14)&0x30)]|
  426.           des_skb[3][((c>>20)&0x01)|((c>>21)&0x06)|((c>>22)&0x38)];
  427.     t = des_skb[4][(d)&0x3f]|
  428.       des_skb[5][((d>> 7)&0x03)|((d>> 8)&0x3c)]|
  429.         des_skb[6][(d>>15)&0x3f]|
  430.           des_skb[7][((d>>21)&0x0f)|((d>>22)&0x30)];
  431.  
  432.     /* table contained 0213 4657 */
  433.     *(k++)=((t<<16)|(s&0x0000ffff))&0xffffffff;
  434.     s=     ((s>>16)|(t&0xffff0000));
  435.         
  436.     s=(s<<4)|(s>>28);
  437.     *(k++)=s&0xffffffff;
  438.     }
  439. }
  440.  
  441.  
  442. static void des_encrypt(buf,schedule,encrypt)
  443.      unsigned long *buf;
  444.      char *schedule;
  445.      int encrypt;
  446. {
  447.     register unsigned long l,r,t,u;
  448. #ifdef ALT_ECB
  449.     register unsigned char *des_SP=(unsigned char *)des_SPtrans;
  450. #endif
  451.     register int i;
  452.     register unsigned long *s;
  453.  
  454.     l=buf[0];
  455.     r=buf[1];
  456.  
  457.     /* do IP */
  458.     PERM_OP(r,l,t, 4,0x0f0f0f0f);
  459.     PERM_OP(l,r,t,16,0x0000ffff);
  460.     PERM_OP(r,l,t, 2,0x33333333);
  461.     PERM_OP(l,r,t, 8,0x00ff00ff);
  462.     PERM_OP(r,l,t, 1,0x55555555);
  463.     /* r and l are reversed - remember that :-) - fix
  464.      * it in the next step */
  465.  
  466.     /* Things have been modified so that the initial rotate is
  467.      * done outside the loop.  This required the
  468.      * des_SPtrans values in sp.h to be rotated 1 bit to the right.
  469.      * One perl script later and things have a 5% speed up on a sparc2.
  470.      * Thanks to Richard Outerbridge <71755.204@CompuServe.COM>
  471.      * for pointing this out. */
  472.     t=(r<<1)|(r>>31);
  473.     r=(l<<1)|(l>>31);
  474.     l=t;
  475.  
  476.     /* clear the top bits on machines with 8byte longs */
  477.     l&=0xffffffff;
  478.     r&=0xffffffff;
  479.  
  480.     s=(unsigned long *)schedule;
  481.     /* I don't know if it is worth the effort of loop unrolling the
  482.      * inner loop */
  483.     if (encrypt) {
  484.     for (i=0; i<32; i+=4) {
  485.         D_ENCRYPT(l,r,i+0); /*  1 */
  486.         D_ENCRYPT(r,l,i+2); /*  2 */
  487.     }
  488.     } else    {
  489.     for (i=30; i>0; i-=4) {
  490.         D_ENCRYPT(l,r,i-0); /* 16 */
  491.         D_ENCRYPT(r,l,i-2); /* 15 */
  492.     }
  493.     }
  494.     l=(l>>1)|(l<<31);
  495.     r=(r>>1)|(r<<31);
  496.     /* clear the top bits on machines with 8byte longs */
  497.     l&=0xffffffff;
  498.     r&=0xffffffff;
  499.  
  500.     /* swap l and r
  501.      * we will not do the swap so just remember they are
  502.      * reversed for the rest of the subroutine
  503.      * luckily FP fixes this problem :-) */
  504.  
  505.     PERM_OP(r,l,t, 1,0x55555555);
  506.     PERM_OP(l,r,t, 8,0x00ff00ff);
  507.     PERM_OP(r,l,t, 2,0x33333333);
  508.     PERM_OP(l,r,t,16,0x0000ffff);
  509.     PERM_OP(r,l,t, 4,0x0f0f0f0f);
  510.  
  511.     buf[0]=l;
  512.     buf[1]=r;
  513.  
  514.     l = r = t = u = 0;
  515. }
  516.  
  517.  
  518. int _des_crypt(buf,len,desp)
  519. char *buf;
  520. unsigned len;
  521. struct desparams *desp;
  522. {
  523.     unsigned long schedule[32];
  524.     register unsigned long tin0,tin1;
  525.     register unsigned long tout0,tout1,xor0,xor1;
  526.     register unsigned char *in, *out;
  527.     unsigned long tbuf[2];
  528.     unsigned char *iv, *oiv;
  529.     int cbc_mode;
  530.  
  531.     cbc_mode = (desp->des_mode == CBC) ? 1 : 0;
  532.  
  533.     in=(unsigned char *)buf;
  534.     out=(unsigned char *)buf;
  535.     oiv=iv=(unsigned char *)desp->des_ivec;
  536.     
  537.     des_set_key(desp->des_key,schedule);
  538.  
  539.     if (desp->des_dir == ENCRYPT) {
  540.     c2l(iv,tout0);
  541.     c2l(iv,tout1);
  542.     for (; len>0; len-=8) {
  543.         c2l(in,tin0);
  544.         c2l(in,tin1);
  545.         if (cbc_mode) {
  546.         tin0^=tout0;
  547.         tin1^=tout1;
  548.         }
  549.         tbuf[0]=tin0;
  550.         tbuf[1]=tin1;
  551.         des_encrypt(tbuf,schedule,1);
  552.         tout0=tbuf[0];
  553.         tout1=tbuf[1];
  554.         l2c(tout0,out);
  555.         l2c(tout1,out);
  556.     }
  557.     l2c(tout0,oiv);
  558.     l2c(tout1,oiv);
  559.     } else {
  560.     c2l(iv,xor0);
  561.     c2l(iv,xor1);
  562.     for (; len>0; len-=8) {
  563.         c2l(in,tin0);
  564.         c2l(in,tin1);
  565.         tbuf[0]=tin0;
  566.         tbuf[1]=tin1;
  567.         des_encrypt(tbuf,schedule,0);
  568.          if (cbc_mode) {
  569.         tout0=tbuf[0]^xor0;
  570.         tout1=tbuf[1]^xor1;
  571.         xor0=tin0;
  572.         xor1=tin1;
  573.         } else {
  574.         tout0=tbuf[0];
  575.         tout1=tbuf[1];
  576.         }
  577.         l2c(tout0,out);
  578.         l2c(tout1,out);
  579.     }
  580.     l2c(tin0,oiv);
  581.     l2c(tin1,oiv);
  582.     }
  583.     tin0=tin1=tout0=tout1=xor0=xor1=0;
  584.     tbuf[0]=tbuf[1]=0;
  585.     bzero(schedule, sizeof(schedule));
  586.  
  587.     return(1);
  588. }
  589.  
  590.