home *** CD-ROM | disk | FTP | other *** search
/ OS/2 Shareware BBS: 8 Other / 08-Other.zip / rc5clnt.zip / client.c next >
C/C++ Source or Header  |  1997-03-12  |  14KB  |  634 lines

  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <signal.h>
  4. #include <unistd.h>
  5. #include <string.h>
  6. #include <errno.h>
  7. #include <sys/time.h>
  8. #include <sys/types.h>
  9. #include <netinet/in.h>
  10. #include <arpa/inet.h>
  11.  
  12. #include "common.h"
  13. #include "client.h"
  14.  
  15. #ifdef SOCKS
  16. #include "socks.h"
  17. #endif
  18.  
  19. #if !defined(lint)
  20. static char rcsid[] = "@(#)rc5-client.c, v2.01a 1997/00/00 earle (genx)\n";
  21. #endif /* ! lint */
  22.  
  23. static RC5_WORD L0[LL];
  24. static RC5_WORD S0[T];
  25. static RC5_WORD S[T];
  26.  
  27. char *client_id = "#root";
  28. int exiting = 0;
  29. int counting = 0;
  30. int count = 0;
  31. time_t stop_time = (time_t) 0;
  32. struct timeval start;
  33.  
  34. void sig_handler(int sig)
  35. {
  36.     exiting = 1;
  37.  
  38.     printf("rc5-56-client: Exiting after next block.\n");
  39.     fflush(stdout);
  40.  
  41.  
  42.     return;
  43. }
  44.  
  45. static int RC5_KEY_CHECK(key, iv, plain, cipher, numkeys)
  46.     RC5_WORD *key;
  47.     RC5_WORD *iv;
  48.     RC5_WORD *plain;
  49.     RC5_WORD *cipher;
  50.     unsigned int numkeys;
  51. {
  52.     register unsigned int i;
  53.  
  54.     register RC5_WORD A, B;
  55.     register RC5_WORD L_0, L_1;
  56.  
  57.     /* Plaintext and Ciphertext word pairs */
  58.     register RC5_WORD P_0, P_1;
  59.     register RC5_WORD C_0, C_1;
  60.  
  61.     L0[0] = ((key[1] >> 16) & 0x000000FF) |
  62.             ((key[1])       & 0x0000FF00) |
  63.             ((key[1] << 16) & 0x00FF0000) |
  64.             ((key[0])       & 0xFF000000);
  65.     L0[1] = ((key[0] >> 16) & 0x000000FF) |
  66.             ((key[0])       & 0x0000FF00) |
  67.             ((key[0] << 16) & 0x00FF0000);
  68.  
  69.     P_0 = plain[0] ^ iv[0];
  70.     P_1 = plain[1] ^ iv[1];
  71.  
  72.     C_0 = cipher[0];
  73.     C_1 = cipher[1];
  74.  
  75.     S0[0] = P;
  76.  
  77.     for(i = 1; i < T; i++)
  78.         S0[i] = S0[i - 1] + Q;
  79.  
  80.     i = numkeys;
  81.  
  82.     while (i--) {
  83.         A = B = 0;
  84.  
  85.         L_0 = L0[0];
  86.         L_1 = L0[1];
  87.  
  88.         /* Begin round 1 of key expansion */
  89.  
  90.         A = S[0] = ROTL3(S0[0]);
  91.         B = L_0 = ROTL(L_0 + A, A);
  92.  
  93.         A = S[1] = ROTL3(S0[1] + A + B);
  94.         B = L_1 = ROTL(L_1 + A + B, A + B);
  95.  
  96.         A = S[2] = ROTL3(S0[2] + A + B);
  97.         B = L_0 = ROTL(L_0 + A + B, A + B);
  98.  
  99.         A = S[3] = ROTL3(S0[3] + A + B);
  100.         B = L_1 = ROTL(L_1 + A + B, A + B);
  101.  
  102.         A = S[4] = ROTL3(S0[4] + A + B);
  103.         B = L_0 = ROTL(L_0 + A + B, A + B);
  104.  
  105.         A = S[5] = ROTL3(S0[5] + A + B);
  106.         B = L_1 = ROTL(L_1 + A + B, A + B);
  107.  
  108.         A = S[6] = ROTL3(S0[6] + A + B);
  109.         B = L_0 = ROTL(L_0 + A + B, A + B);
  110.  
  111.         A = S[7] = ROTL3(S0[7] + A + B);
  112.         B = L_1 = ROTL(L_1 + A + B, A + B);
  113.  
  114.         A = S[8] = ROTL3(S0[8] + A + B);
  115.         B = L_0 = ROTL(L_0 + A + B, A + B);
  116.  
  117.         A = S[9] = ROTL3(S0[9] + A + B);
  118.         B = L_1 = ROTL(L_1 + A + B, A + B);
  119.  
  120.         A = S[10] = ROTL3(S0[10] + A + B);
  121.         B = L_0 = ROTL(L_0 + A + B, A + B);
  122.  
  123.         A = S[11] = ROTL3(S0[11] + A + B);
  124.         B = L_1 = ROTL(L_1 + A + B, A + B);
  125.  
  126.         A = S[12] = ROTL3(S0[12] + A + B);
  127.         B = L_0 = ROTL(L_0 + A + B, A + B);
  128.  
  129.         A = S[13] = ROTL3(S0[13] + A + B);
  130.         B = L_1 = ROTL(L_1 + A + B, A + B);
  131.  
  132.         A = S[14] = ROTL3(S0[14] + A + B);
  133.         B = L_0 = ROTL(L_0 + A + B, A + B);
  134.  
  135.         A = S[15] = ROTL3(S0[15] + A + B);
  136.         B = L_1 = ROTL(L_1 + A + B, A + B);
  137.  
  138.         A = S[16] = ROTL3(S0[16] + A + B);
  139.         B = L_0 = ROTL(L_0 + A + B, A + B);
  140.  
  141.         A = S[17] = ROTL3(S0[17] + A + B);
  142.         B = L_1 = ROTL(L_1 + A + B, A + B);
  143.  
  144.         A = S[18] = ROTL3(S0[18] + A + B);
  145.         B = L_0 = ROTL(L_0 + A + B, A + B);
  146.  
  147.         A = S[19] = ROTL3(S0[19] + A + B);
  148.         B = L_1 = ROTL(L_1 + A + B, A + B);
  149.  
  150.         A = S[20] = ROTL3(S0[20] + A + B);
  151.         B = L_0 = ROTL(L_0 + A + B, A + B);
  152.  
  153.         A = S[21] = ROTL3(S0[21] + A + B);
  154.         B = L_1 = ROTL(L_1 + A + B, A + B);
  155.  
  156.         A = S[22] = ROTL3(S0[22] + A + B);
  157.         B = L_0 = ROTL(L_0 + A + B, A + B);
  158.  
  159.         A = S[23] = ROTL3(S0[23] + A + B);
  160.         B = L_1 = ROTL(L_1 + A + B, A + B);
  161.  
  162.         A = S[24] = ROTL3(S0[24] + A + B);
  163.         B = L_0 = ROTL(L_0 + A + B, A + B);
  164.  
  165.         A = S[25] = ROTL3(S0[25] + A + B);
  166.         B = L_1 = ROTL(L_1 + A + B, A + B);
  167.  
  168.         /* Begin round 2 of key expansion */
  169.  
  170.         A = S[0] = ROTL3(S[0] + A + B);
  171.         B = L_0 = ROTL(L_0 + A + B, A + B);
  172.  
  173.         A = S[1] = ROTL3(S[1] + A + B);
  174.         B = L_1 = ROTL(L_1 + A + B, A + B);
  175.  
  176.         A = S[2] = ROTL3(S[2] + A + B);
  177.         B = L_0 = ROTL(L_0 + A + B, A + B);
  178.  
  179.         A = S[3] = ROTL3(S[3] + A + B);
  180.         B = L_1 = ROTL(L_1 + A + B, A + B);
  181.  
  182.         A = S[4] = ROTL3(S[4] + A + B);
  183.         B = L_0 = ROTL(L_0 + A + B, A + B);
  184.  
  185.         A = S[5] = ROTL3(S[5] + A + B);
  186.         B = L_1 = ROTL(L_1 + A + B, A + B);
  187.  
  188.         A = S[6] = ROTL3(S[6] + A + B);
  189.         B = L_0 = ROTL(L_0 + A + B, A + B);
  190.  
  191.         A = S[7] = ROTL3(S[7] + A + B);
  192.         B = L_1 = ROTL(L_1 + A + B, A + B);
  193.  
  194.         A = S[8] = ROTL3(S[8] + A + B);
  195.         B = L_0 = ROTL(L_0 + A + B, A + B);
  196.  
  197.         A = S[9] = ROTL3(S[9] + A + B);
  198.         B = L_1 = ROTL(L_1 + A + B, A + B);
  199.  
  200.         A = S[10] = ROTL3(S[10] + A + B);
  201.         B = L_0 = ROTL(L_0 + A + B, A + B);
  202.  
  203.         A = S[11] = ROTL3(S[11] + A + B);
  204.         B = L_1 = ROTL(L_1 + A + B, A + B);
  205.  
  206.         A = S[12] = ROTL3(S[12] + A + B);
  207.         B = L_0 = ROTL(L_0 + A + B, A + B);
  208.  
  209.         A = S[13] = ROTL3(S[13] + A + B);
  210.         B = L_1 = ROTL(L_1 + A + B, A + B);
  211.  
  212.         A = S[14] = ROTL3(S[14] + A + B);
  213.         B = L_0 = ROTL(L_0 + A + B, A + B);
  214.  
  215.         A = S[15] = ROTL3(S[15] + A + B);
  216.         B = L_1 = ROTL(L_1 + A + B, A + B);
  217.  
  218.         A = S[16] = ROTL3(S[16] + A + B);
  219.         B = L_0 = ROTL(L_0 + A + B, A + B);
  220.  
  221.         A = S[17] = ROTL3(S[17] + A + B);
  222.         B = L_1 = ROTL(L_1 + A + B, A + B);
  223.  
  224.         A = S[18] = ROTL3(S[18] + A + B);
  225.         B = L_0 = ROTL(L_0 + A + B, A + B);
  226.  
  227.         A = S[19] = ROTL3(S[19] + A + B);
  228.         B = L_1 = ROTL(L_1 + A + B, A + B);
  229.  
  230.         A = S[20] = ROTL3(S[20] + A + B);
  231.         B = L_0 = ROTL(L_0 + A + B, A + B);
  232.  
  233.         A = S[21] = ROTL3(S[21] + A + B);
  234.         B = L_1 = ROTL(L_1 + A + B, A + B);
  235.  
  236.         A = S[22] = ROTL3(S[22] + A + B);
  237.         B = L_0 = ROTL(L_0 + A + B, A + B);
  238.  
  239.         A = S[23] = ROTL3(S[23] + A + B);
  240.         B = L_1 = ROTL(L_1 + A + B, A + B);
  241.  
  242.         A = S[24] = ROTL3(S[24] + A + B);
  243.         B = L_0 = ROTL(L_0 + A + B, A + B);
  244.  
  245.         A = S[25] = ROTL3(S[25] + A + B);
  246.         B = L_1 = ROTL(L_1 + A + B, A + B);
  247.  
  248.         /* Begin round 3 of key expansion */
  249.  
  250.         A = S[0] = ROTL3(S[0] + A + B);
  251.         B = L_0 = ROTL(L_0 + A + B, A + B);
  252.  
  253.         A = S[1] = ROTL3(S[1] + A + B);
  254.         B = L_1 = ROTL(L_1 + A + B, A + B);
  255.  
  256.         A = S[2] = ROTL3(S[2] + A + B);
  257.         B = L_0 = ROTL(L_0 + A + B, A + B);
  258.  
  259.         A = S[3] = ROTL3(S[3] + A + B);
  260.         B = L_1 = ROTL(L_1 + A + B, A + B);
  261.  
  262.         A = S[4] = ROTL3(S[4] + A + B);
  263.         B = L_0 = ROTL(L_0 + A + B, A + B);
  264.  
  265.         A = S[5] = ROTL3(S[5] + A + B);
  266.         B = L_1 = ROTL(L_1 + A + B, A + B);
  267.  
  268.         A = S[6] = ROTL3(S[6] + A + B);
  269.         B = L_0 = ROTL(L_0 + A + B, A + B);
  270.  
  271.         A = S[7] = ROTL3(S[7] + A + B);
  272.         B = L_1 = ROTL(L_1 + A + B, A + B);
  273.  
  274.         A = S[8] = ROTL3(S[8] + A + B);
  275.         B = L_0 = ROTL(L_0 + A + B, A + B);
  276.  
  277.         A = S[9] = ROTL3(S[9] + A + B);
  278.         B = L_1 = ROTL(L_1 + A + B, A + B);
  279.  
  280.         A = S[10] = ROTL3(S[10] + A + B);
  281.         B = L_0 = ROTL(L_0 + A + B, A + B);
  282.  
  283.         A = S[11] = ROTL3(S[11] + A + B);
  284.         B = L_1 = ROTL(L_1 + A + B, A + B);
  285.  
  286.         A = S[12] = ROTL3(S[12] + A + B);
  287.         B = L_0 = ROTL(L_0 + A + B, A + B);
  288.  
  289.         A = S[13] = ROTL3(S[13] + A + B);
  290.         B = L_1 = ROTL(L_1 + A + B, A + B);
  291.  
  292.         A = S[14] = ROTL3(S[14] + A + B);
  293.         B = L_0 = ROTL(L_0 + A + B, A + B);
  294.  
  295.         A = S[15] = ROTL3(S[15] + A + B);
  296.         B = L_1 = ROTL(L_1 + A + B, A + B);
  297.  
  298.         A = S[16] = ROTL3(S[16] + A + B);
  299.         B = L_0 = ROTL(L_0 + A + B, A + B);
  300.  
  301.         A = S[17] = ROTL3(S[17] + A + B);
  302.         B = L_1 = ROTL(L_1 + A + B, A + B);
  303.  
  304.         A = S[18] = ROTL3(S[18] + A + B);
  305.         B = L_0 = ROTL(L_0 + A + B, A + B);
  306.  
  307.         A = S[19] = ROTL3(S[19] + A + B);
  308.         B = L_1 = ROTL(L_1 + A + B, A + B);
  309.  
  310.         A = S[20] = ROTL3(S[20] + A + B);
  311.         B = L_0 = ROTL(L_0 + A + B, A + B);
  312.  
  313.         A = S[21] = ROTL3(S[21] + A + B);
  314.         B = L_1 = ROTL(L_1 + A + B, A + B);
  315.  
  316.         A = S[22] = ROTL3(S[22] + A + B);
  317.         B = L_0 = ROTL(L_0 + A + B, A + B);
  318.  
  319.         A = S[23] = ROTL3(S[23] + A + B);
  320.         B = L_1 = ROTL(L_1 + A + B, A + B);
  321.  
  322.         A = S[24] = ROTL3(S[24] + A + B);
  323.         B = L_0 = ROTL(L_0 + A + B, A + B);
  324.  
  325.         A = S[25] = ROTL3(S[25] + A + B);
  326.         B = L_1 = ROTL(L_1 + A + B, A + B);
  327.  
  328.         /* Begin the encryption */
  329.  
  330.         A = P_0 + S[0];
  331.         B = P_1 + S[1];
  332.  
  333.         A = ROTL(A ^ B, B) + S[2];
  334.         B = ROTL(B ^ A, A) + S[3];
  335.  
  336.         A = ROTL(A ^ B, B) + S[4];
  337.         B = ROTL(B ^ A, A) + S[5];
  338.  
  339.         A = ROTL(A ^ B, B) + S[6];
  340.         B = ROTL(B ^ A, A) + S[7];
  341.  
  342.         A = ROTL(A ^ B, B) + S[8];
  343.         B = ROTL(B ^ A, A) + S[9];
  344.  
  345.         A = ROTL(A ^ B, B) + S[10];
  346.         B = ROTL(B ^ A, A) + S[11];
  347.  
  348.         A = ROTL(A ^ B, B) + S[12];
  349.         B = ROTL(B ^ A, A) + S[13];
  350.  
  351.         A = ROTL(A ^ B, B) + S[14];
  352.         B = ROTL(B ^ A, A) + S[15];
  353.  
  354.         A = ROTL(A ^ B, B) + S[16];
  355.         B = ROTL(B ^ A, A) + S[17];
  356.  
  357.         A = ROTL(A ^ B, B) + S[18];
  358.         B = ROTL(B ^ A, A) + S[19];
  359.  
  360.         A = ROTL(A ^ B, B) + S[20];
  361.         B = ROTL(B ^ A, A) + S[21];
  362.  
  363.         A = ROTL(A ^ B, B) + S[22];
  364.         B = ROTL(B ^ A, A) + S[23];
  365.  
  366.         A = ROTL(A ^ B, B) + S[24];
  367.  
  368.         /* an 'if' is less expensive than a rotation, which we
  369.          * will avoid if the first part fails.
  370.          */
  371.  
  372.         if (C_0 == A && C_1 == ROTL(B ^ A, A) + S[25])
  373.             while(notify_server(L0, numkeys, i) < 0) {
  374.                 printf("rc5-56-client: Can't talk to "
  375.                        "keyserver!  Sleeping 2 minutes\n");
  376.                 fflush(stdout);
  377.                 sleep(120);
  378.             }
  379.  
  380.         L0[1] = (L0[1] + 0x00010000) & 0x00FFFFFF;
  381.  
  382.         if (!(L0[1] & 0x00FF0000)) {
  383.             L0[1] = (L0[1] + 0x00000100) & 0x0000FFFF;
  384.  
  385.             if (!(L0[1] & 0x0000FF00)) {
  386.                 L0[1] = (L0[1] + 0x00000001) & 0x000000FF;
  387.  
  388.                 if (!(L0[1] & 0x000000FF)) {
  389.                     L0[1] = 0x00000000;
  390.                     L0[0] = L0[0] + 0x01000000;
  391.  
  392.                     if (!(L0[0] & 0xFF000000)) {
  393.                         L0[0] = (L0[0] + 0x00010000) & 0x00FFFFFF;
  394.  
  395.                         if (!(L0[0] & 0x00FF0000)) {
  396.                             L0[0] = (L0[0] + 0x00000100) & 0x0000FFFF;
  397.  
  398.                             if (!(L0[0] & 0x0000FF00)) {
  399.                                 L0[0] = (L0[0] + 0x00000001) & 0x000000FF;
  400.                             }
  401.                         }
  402.                     }
  403.                 }
  404.             }
  405.         }
  406.     }
  407.  
  408.     return (0);
  409. }
  410.  
  411. static void do_test()
  412. {
  413.     RC5_WORD key[2] = { 0, 0 };
  414.     RC5_WORD iv[2] = { 0, 0 };
  415.     RC5_WORD pt[2] = { 0, 0 };
  416.     RC5_WORD ct[2] = { 0, 0 };
  417.     unsigned int numkeys = 1000000;
  418.     struct timeval stop;
  419.     struct timezone dummy;
  420.     double len;
  421.  
  422.     printf("rc5-56-client: Performance testing with %d crypts\n", 
  423.           numkeys);
  424.  
  425.     fflush(stdout);
  426.  
  427.     if (gettimeofday(&stop, &dummy) < 0) {
  428.         perror("gettimeofday");
  429.         return;
  430.     }
  431.  
  432.     len = stop.tv_sec * 1000000.0 + stop.tv_usec;
  433.  
  434.     RC5_KEY_CHECK(key, iv, pt, ct, numkeys);
  435.  
  436.     if (gettimeofday(&stop, &dummy) < 0) {
  437.         perror("gettimeofday");
  438.         return;
  439.     }
  440.  
  441.     len = (((double) (stop.tv_sec * 1000000.0 + stop.tv_usec)) - len)
  442.         / 1000000.0;
  443.  
  444.     printf("rc5-56-client: Complete in %4.3f seconds. (%.2f keys/sec)\n", 
  445.         len, ((double) numkeys / len));
  446. }
  447.  
  448. static void do_cipher()
  449. {
  450.     RC5_WORD key[2];
  451.     RC5_WORD iv[2];
  452.     RC5_WORD pt[2];
  453.     RC5_WORD ct[2];
  454.     RC5_WORD out[2] = { 0, 0 };
  455.     unsigned int numkeys;
  456.     struct timeval stop;
  457.     struct timezone dummy;
  458.     double len;
  459.  
  460.     if(gettimeofday(&start, &dummy) < 0) {
  461.         perror("gettimeofday");
  462.         return;
  463.     }
  464.  
  465.     for (;;) {
  466.         if (gettimeofday(&stop, &dummy) < 0) {
  467.             perror("gettimeofday");
  468.             return;
  469.         }
  470.  
  471.         len = stop.tv_sec * 1000000.0 + stop.tv_usec;
  472.  
  473.         printf("rc5-56-client: Obtaining Key Mask from ``%s:%u''.\n",
  474.             inet_name(keyserver_addr), keyserver_port);
  475.  
  476.         fflush(stdout);
  477.  
  478.         while (get_keyspace(key, iv, pt, ct, &numkeys) < 0) {
  479.             perror("get_keyspace");
  480.             printf("rc5-56-client: Error getting key.\n");
  481.             printf("rc5-56-client: Sleeping 2 minutes...\n");
  482.             sleep(120);
  483.             continue;
  484.         }
  485.  
  486.         printf("rc5-56-client: Received Keyspace Mask 0x%.14X\n", 
  487.             numkeys - 1);
  488.  
  489.         printf("rc5-56-client: Start Key 0x%.6X%.8X, trying %u keys.\n", 
  490.             key[1], key[0], numkeys);
  491.  
  492.         fflush(stdout);
  493.  
  494.         RC5_KEY_CHECK(key, iv, pt, ct, numkeys);
  495.  
  496.         out[1] = ((L0[1] >> 16) & 0x000000FF) |
  497.               ((L0[1])       & 0x0000FF00) |
  498.               ((L0[1] << 16) & 0x00FF0000) |
  499.               ((L0[0])       & 0xFF000000);
  500.         out[0] = ((L0[0] >> 16) & 0x000000FF) |
  501.               ((L0[0])       & 0x0000FF00) |
  502.               ((L0[0] << 16) & 0x00FF0000);
  503.  
  504.         if (gettimeofday(&stop, &dummy) < 0) {
  505.             perror("gettimeofday");
  506.             return;
  507.         }
  508.  
  509.         len = (((double) (stop.tv_sec * 1000000.0 + stop.tv_usec)) 
  510.             - len) / 1000000.0;
  511.  
  512.         printf("rc5-56-client: Processed %.2f keys per second.\n",
  513.             (double) ((double) numkeys / len));
  514.  
  515.         printf("rc5-56-client: Keyspace Exhausted in %4.2f minutes.\n", 
  516.             (double) (len / 60));
  517.  
  518.         printf("rc5-56-client: [0x%.06X%.08X -> 0x%.06X%.08X]\n",
  519.                   key[1], key[0], out[0], out[1] - 1);
  520.  
  521.         fflush(stdout);
  522.  
  523.         while (end_keyspace(key, iv, pt, ct, numkeys) < 0) {
  524.             perror("end_keyspace");
  525.             printf("rc5-56-client: Error notifying server.\n");
  526.             printf("rc5-56-client: Sleeping 1 minute...\n");
  527.             fflush(stdout);
  528.             sleep(60);
  529.         }
  530.  
  531.         if(exiting) {
  532.             printf("rc5-56-client: Exiting upon request.\n");
  533.             fflush(stdout);
  534.             exit(0);
  535.         }
  536.         if(counting) {
  537.             if(--count < 1) {
  538.                 printf("rc5-56-client: Key Blocks Complete.\n");
  539.                 exit(0);
  540.             }
  541.         }
  542.  
  543.         if (stop_time && time(NULL) > stop_time) {
  544.             float hours = (float) ((time(NULL) - (float) stop_time) / 3600.00);
  545.             printf("rc5-56-client: Exiting after %2.2f hours work.\n",
  546.                 hours);
  547.             exit(0);
  548.         }
  549.     }
  550. }
  551.  
  552. static void usage(const char *progname)
  553. {
  554.     fprintf(stderr, "Usage: %s [-m] [-n level] [-c count] [-h hours]\n"
  555.                 "       [-a <address>] [-p <port>] <identity>\n", 
  556.         progname);
  557.  
  558.     exit(-1);
  559. }
  560.  
  561. int main(int argc, char *argv[])
  562. {
  563.     register char *cp;
  564.     char *progname;
  565.     int arg;
  566.     int nicelevel;
  567.     extern int optind;
  568.     extern char *optarg;
  569.  
  570.     progname = ((cp = strrchr(argv[0], '/')) ? (cp + 1) : argv[0]);
  571.  
  572.     keyserver_addr.s_addr = inet_addr("206.64.4.18");
  573.  
  574.     while ((arg = getopt(argc, argv, "c:h:n:ma:p:H?")) != EOF) {
  575.         switch (arg) {
  576.         case 'a':
  577.             keyserver_addr.s_addr = inet_address(optarg);
  578.             break;
  579.  
  580.         case 'c':
  581.             counting = 1;
  582.             count = atoi(optarg);
  583.             break;
  584.  
  585.         case 'h':
  586.             stop_time = time(NULL) + (time_t) (atof(optarg) * 3600.0);
  587.             break;
  588.  
  589. /*         case 'n':
  590.             nicelevel = atoi(optarg);
  591.             if(nice(nicelevel) == -1) {
  592.                 perror("nice");
  593.                 exit(0);
  594.             }
  595.             break; */
  596.  
  597.         case 'm':
  598.             do_test();
  599.             exit(0);
  600.  
  601.  
  602.         case 'p':
  603.             keyserver_port = (unsigned short) atoi(optarg);
  604.             break;
  605.  
  606.         default:
  607.         case 'H': case '?':
  608.             usage(progname);
  609.             /* NOTREACHED */
  610.             break;
  611.         }
  612.     }
  613.  
  614.     argc -= optind - 1;
  615.     argv += optind - 1;
  616.  
  617.     if (argc != 2)
  618.         usage(progname);
  619.  
  620.     client_id = strdup(argv[1]);
  621.  
  622. #ifdef SOCKS
  623.     LIBPREFIX(init)(progname);
  624. #endif
  625.  
  626.     signal(SIGHUP, sig_handler);
  627.  
  628.     
  629.     do_cipher();
  630.  
  631.     exit(0);
  632. }
  633.  
  634.