home *** CD-ROM | disk | FTP | other *** search
/ The World of Computer Software / World_Of_Computer_Software-02-385-Vol-1of3.iso / x / xntp3.zip / authstuff / mkrandkeys.c < prev    next >
C/C++ Source or Header  |  1992-08-07  |  3KB  |  162 lines

  1. /*
  2.  * mkrandkeys - make a key file for xntpd with some quite random keys
  3.  */
  4. #include <stdio.h>
  5. #include <sys/types.h>
  6. #include <sys/stat.h>
  7.  
  8. #define    STREQ(a, b)    (*(a) == *(b) && strcmp((a), (b)) == 0)
  9.  
  10. char *progname;
  11. int debug;
  12.  
  13. u_long keydata[2];
  14.  
  15. int std = 1;        /* DES standard key format */
  16. u_char dokey[16] = { 0 };
  17.  
  18. /*
  19.  * main - parse arguments and handle options
  20.  */
  21. main(argc, argv)
  22. int argc;
  23. char *argv[];
  24. {
  25.     int c;
  26.     int i;
  27.     int j;
  28.     int errflg = 0;
  29.     int numkeys;
  30.     u_long tmp;
  31.     char *passwd;
  32.     extern int optind;
  33.     extern char *optarg;
  34.     extern char *getpass();
  35.  
  36.     numkeys = 0;
  37.     progname = argv[0];
  38.     passwd = NULL;
  39.     while ((c = getopt(argc, argv, "dnp:s")) != EOF)
  40.         switch (c) {
  41.         case 'd':
  42.             ++debug;
  43.             break;
  44.         case 'n':
  45.             std = 0;
  46.             break;
  47.         case 'p':
  48.             passwd = optarg;
  49.             break;
  50.         case 's':
  51.             std = 1;
  52.             break;
  53.         default:
  54.             errflg++;
  55.             break;
  56.         }
  57.  
  58.     numkeys = 0;
  59.     for (; !errflg && optind < argc; optind++) {
  60.         c = atoi(argv[optind]);
  61.         if (c <= 0 || c > 15) {
  62.             (void) fprintf("%s: invalid key number `%s'\n",
  63.                 progname, argv[optind]);
  64.             exit(2);
  65.         }
  66.         dokey[c] = 1;
  67.         numkeys++;
  68.     }
  69.  
  70.     if (errflg || numkeys == 0) {
  71.         (void) fprintf(stderr,
  72.             "usage: %s [-ns] [-p seed] key# [key# ...]\n",
  73.             progname);
  74.         exit(2);
  75.     }
  76.  
  77.     while (passwd == 0 || *passwd == '\0') {
  78.         passwd = getpass("Seed: ");
  79.         if (*passwd == '\0') {
  80.             (void) fprintf(stderr,
  81.                 "better use a better seed than that\n");
  82.         }
  83.     }
  84.  
  85.     keydata[0] = keydata[1] = 0;
  86.     for (i = 0; i < 8 && *passwd != '\0'; i++) {
  87.         keydata[i/4] |= ((((u_long)(*passwd))&0xff)<<(1+((3-(i%4))*8)));
  88.         passwd++;
  89.     }
  90.  
  91.     for (i = 1; i <= 15; i++) {
  92.         if (dokey[i]) {
  93.             for (c = 0, tmp = 0; c < 32; c += 4)
  94.                 tmp |= (i << c);
  95.             keydata[0] ^= tmp;
  96.             keydata[1] ^= tmp;
  97.             rand_data(keydata);
  98.             DESauth_parity(keydata);
  99.  
  100.             if (std) {
  101.                 (void)printf("%-2d S\t%08x%08x\n",
  102.                     i, keydata[0], keydata[1]);
  103.             } else {
  104.                 for (j = 0; j < 2; j++) {
  105.                     keydata[j]
  106.                         = ((keydata[j] & 0xfefefefe) >> 1)
  107.                         | ((keydata[j] & 0x01010101) << 7);
  108.                 }
  109.                 (void)printf("%-2d N\t%08x%08x\n",
  110.                     i, keydata[0], keydata[1]);
  111.             }
  112.         }
  113.     }
  114.     exit(0);
  115. }
  116.  
  117. char *volatile_file[] = {
  118.     "/bin/echo",
  119.     "/bin/sh",
  120.     "/bin/cat",
  121.     "/bin/ls",
  122.     "/bin/stty",
  123.     "/bin/date",
  124.     "/bin/cat",
  125.     "/bin/cc",
  126.     "/etc/motd",
  127.     "/etc/utmp",
  128.     "/dev/kmem",
  129.     "/dev/null",
  130.     "",
  131. };
  132.  
  133. #define NEXT(X) (0x1e1f2f2d*(X) + 0x361962e9)
  134.  
  135. rand_data(data)
  136.     u_long *data;
  137. {
  138.     register i;
  139.     struct stat buf;
  140.     extern long time();
  141.     char ekeys[128], dkeys[128];
  142.  
  143.     *data ^= 0x9662f394;
  144.     *(data+1) ^= 0x9f17c55f;
  145.     DESauth_subkeys(data, ekeys, dkeys);
  146.     *data ^= NEXT(getpid() + (getuid() << 16));
  147.     *(data+1) ^= NEXT(time((long *)0));
  148.     DESauth_des(data, ekeys);
  149.     for (i = 0; strlen(volatile_file[i]); i++) {
  150.         if (stat(volatile_file[i], &buf) == -1)
  151.             continue;
  152.         if (i & 1) {
  153.             *data ^= NEXT(buf.st_atime);
  154.             *(data+1) ^= NEXT(buf.st_mtime);
  155.         } else {
  156.             *data ^= NEXT(buf.st_mtime);
  157.             *(data+1) ^= NEXT(buf.st_atime);
  158.         }
  159.         DESauth_des(data, ekeys);
  160.     }
  161. }
  162.