home *** CD-ROM | disk | FTP | other *** search
/ Il CD di internet / CD.iso / SOURCE / N / TCPIP / NETKIT-A.06 / NETKIT-A / NetKit-A-0.06 / dip337d-uri / skey / skeyinit.c < prev    next >
Encoding:
C/C++ Source or Header  |  1994-06-22  |  6.1 KB  |  309 lines

  1. /* S/KEY v1.1b (skeyinit.c)
  2.  *
  3.  * Authors:
  4.  *          Neil M. Haller <nmh@thumper.bellcore.com>
  5.  *          Philip R. Karn <karn@chicago.qualcomm.com>
  6.  *          John S. Walden <jsw@thumper.bellcore.com>
  7.  *          Scott Chasin <chasin@crimelab.com>
  8.  *
  9.  * S/KEY initialization and seed update
  10.  */
  11.  
  12. #include <stdio.h>
  13. #include <string.h>
  14. #include <pwd.h>
  15. #ifdef linux
  16. #undef SHADOW
  17. #include <shadow.h>
  18. #endif
  19. #include <sys/resource.h>
  20. #include <time.h>
  21.  
  22. #ifdef __svr4__
  23. #include <sys/systeminfo.h>
  24. #include <unistd.h>
  25. #include <shadow.h>
  26. #include "sysv_shadow.h"
  27. #endif /* __svr4__ */
  28.  
  29.  
  30. #include "skey.h"
  31.  
  32. extern int optind;
  33. extern char *optarg;
  34.  
  35. char *readpass (), *malloc (), *getpass (), *crypt ();
  36.  
  37. int skeylookup __ARGS ((struct skey * mp, char *name));
  38.  
  39. #define NAMELEN 2
  40.  
  41.  
  42. main (argc, argv)
  43.   int argc;
  44.   char *argv[];
  45. {
  46.   int rval, n, nn, i, defaultsetup, l;
  47.   time_t now;
  48.   char seed[18], tmp[80], key[8], defaultseed[17], passwd[256], passwd2[256],
  49.        tbuf[27], buf[60], lastc, me[80], user [8], *salt, *p, *pw; 
  50.   struct skey skey;
  51.   struct passwd *pp;
  52.   struct spwd   *sp;
  53.   struct tm *tm;
  54.  
  55.  
  56.   time (&now);
  57.   tm = localtime (&now);
  58.   strftime (tbuf, sizeof (tbuf), "%M%j", tm);
  59.  
  60.   if ((gethostname (defaultseed, sizeof (defaultseed))) < 0)
  61.       exit (-1);
  62.  
  63.   strcpy (&defaultseed[NAMELEN], tbuf);
  64.  
  65.   pp = getpwuid (getuid ());
  66.   strcpy (me, pp->pw_name);
  67.  
  68.   if ((pp = getpwnam (me)) == NULL) {
  69.      fprintf(stderr, "Who are you?\n");
  70.      exit(1);
  71.   }
  72.  
  73.   defaultsetup = 1;
  74.  
  75.   if (argc > 1)
  76.   {
  77.     if (strcmp ("-s", argv[1]) == 0)
  78.       defaultsetup = 0;
  79.     else
  80.       pp = getpwnam (argv[1]);
  81.  
  82.     if (argc > 2)
  83.       pp = getpwnam (argv[2]);
  84.  
  85.   }
  86.  
  87.   if (pp == NULL)
  88.   {
  89.     printf ("User unknown\n");
  90.     exit (1);
  91.   }
  92.  
  93.   if (strcmp (pp->pw_name, me) != 0)
  94.   {
  95.     if (getuid () != 0)
  96.     {
  97.       /* Only root can change other's passwds */
  98.       printf ("Permission denied.\n");
  99.       exit (1);
  100.     }
  101.   }
  102.  
  103. #ifdef SHADOW
  104.   if ((sp = getspnam (pp->pw_name)) == NULL) {
  105.      fprintf(stderr, "Who are you?\n");
  106.      exit(1);
  107.   }
  108. #endif /* SHADOW */
  109.  
  110. #ifdef SHADOW
  111.   salt = sp->sp_pwdp;
  112. #else
  113.   salt = pp->pw_passwd;
  114. #endif
  115. #ifdef PRIO_PROCESS
  116.   setpriority (PRIO_PROCESS, 0, -4);
  117. #endif
  118.  
  119.   if (getuid () != 0) {
  120. #ifdef PRIO_PROCESS
  121.      setpriority (PRIO_PROCESS, 0, -4);
  122. #endif
  123.  
  124.      pw = getpass ("Password:");
  125.      p  = crypt (pw, salt);
  126. #ifdef PRIO_PROCESS
  127.      setpriority(PRIO_PROCESS, 0, 0);
  128. #endif
  129.  
  130. #ifdef SHADOW
  131.      if (pp && strcmp(p, sp->sp_pwdp)) {
  132. #else
  133.      if (pp && strcmp(p, pp->pw_passwd)) {
  134. #endif
  135.         printf ("Password incorrect.\n");
  136.         exit (-1);
  137.      }
  138.   }
  139.  
  140.   rval = skeylookup (&skey, pp->pw_name);
  141.   switch (rval)
  142.   {
  143.   case -1:
  144.     perror ("Error opening database: ");
  145.     exit (1);
  146.   case 0:
  147.     printf ("[Updating %s]\n", pp->pw_name);
  148.     printf ("Old key: %s\n", skey.seed);
  149.  
  150.     /* lets be nice if they have a skey.seed that ends in 0-8 just add one */
  151.     l = strlen (skey.seed);
  152.     if (l > 0)
  153.     {
  154.       lastc = skey.seed[l - 1];
  155.       if (isdigit (lastc) && lastc != '9')
  156.       {
  157.     strcpy (defaultseed, skey.seed);
  158.     defaultseed[l - 1] = lastc + 1;
  159.       }
  160.       if (isdigit (lastc) && lastc == '9' && l < 16)
  161.       {
  162.     strcpy (defaultseed, skey.seed);
  163.     defaultseed[l - 1] = '0';
  164.     defaultseed[l] = '0';
  165.     defaultseed[l + 1] = '\0';
  166.       }
  167.     }
  168.     break;
  169.   case 1:
  170.     printf ("[Adding %s]\n", pp->pw_name);
  171.     break;
  172.   }
  173.   n = 99;
  174.  
  175.   if (!defaultsetup)
  176.   {
  177.     printf ("You need the 6 english words generated from the \"key\" command.\n");
  178.     for (i = 0 ;; i++)
  179.     {
  180.       if (i >= 2)
  181.     exit (1);
  182.       printf ("Enter sequence count from 1 to 10000: ");
  183.       fgets (tmp, sizeof (tmp), stdin);
  184.       n = atoi (tmp);
  185.       if (n > 0 && n < 10000)
  186.     break;        /* Valid range */
  187.       printf ("\n Error: Count must be > 0 and < 10000\n");
  188.     }
  189.   }
  190.  
  191.   if (!defaultsetup)
  192.   {
  193.     printf ("Enter new key [default %s]: ", defaultseed);
  194.     fflush (stdout);
  195.     fgets (seed, sizeof (seed), stdin);
  196.     rip (seed);
  197.     if (strlen (seed) > 16)
  198.     {
  199.       printf ("Notice: Seed truncated to 16 characters.\n");
  200.       seed[16] = '\0';
  201.     }
  202.  
  203.     if (seed[0] == '\0')
  204.       strcpy (seed, defaultseed);
  205.  
  206.     for (i = 0 ;; i++)
  207.     {
  208.       if (i >= 2)
  209.     exit (1);
  210.  
  211.       printf ("s/key %d %s\ns/key access password: ", n, seed);
  212.       fgets (tmp, sizeof (tmp), stdin);
  213.       rip (tmp);
  214.       backspace (tmp);
  215.  
  216.       if (tmp[0] == '?')
  217.       {
  218.     printf ("Enter 6 English words from secure S/Key calculation.\n");
  219.     continue;
  220.       }
  221.  
  222.       if (tmp[0] == '\0')
  223.       {
  224.     exit (1);
  225.       }
  226.       if (etob (key, tmp) == 1 || atob8 (key, tmp) == 0)
  227.     break;            /* Valid format */
  228.       printf ("Invalid format - try again with 6 English words.\n");
  229.     }
  230.   }
  231.   else
  232.   {
  233.     /* Get user's secret password */
  234.     for (i = 0 ;; i++)
  235.     {
  236.  
  237.       if (i >= 2)
  238.     exit (1);
  239.  
  240.       printf ("Enter secret password: ");
  241.       readpass (passwd, sizeof (passwd));
  242.  
  243.       if (passwd[0] == '\0')
  244.     exit (1);
  245.  
  246.       printf ("Again secret password: ");
  247.       readpass (passwd2, sizeof (passwd));
  248.  
  249.       if (passwd2[0] == '\0')
  250.     exit (1);
  251.  
  252.       if (strlen (passwd) < 4 && strlen (passwd2) < 4)
  253.       {
  254.     fprintf (stderr, "Error: Your password must be longer.\n\r");
  255.     exit (1);
  256.       }
  257.  
  258.       if (strcmp (passwd, passwd2) == 0)
  259.     break;
  260.  
  261.       printf ("Error: Passwords dont match.\n");
  262.     }
  263.     strcpy (seed, defaultseed);
  264.  
  265.     /* Crunch seed and password into starting key */
  266.     if (keycrunch (key, seed, passwd) != 0)
  267.     {
  268.       fprintf (stderr, "%s: key crunch failed.\n", argv[0]);
  269.       exit (2);
  270.     }
  271.     nn = n;
  272.     while (nn-- != 0)
  273.       f (key);
  274.   }
  275.   time (&now);
  276.   tm = localtime (&now);
  277.   strftime (tbuf, sizeof (tbuf), " %b %d,%Y %T", tm);
  278.  
  279.   skey.val = malloc (16 + 1);
  280.  
  281.   btoa8 (skey.val, key);
  282.  
  283.   fprintf (skey.keyfile, "%s %04d %-16s %s %-21s\n", pp->pw_name, n,
  284.        seed, skey.val, tbuf);
  285.   fclose (skey.keyfile);
  286.   printf ("\nID %s s/key is %d %s\n", pp->pw_name, n, seed);
  287.   printf ("Next login password: %s\n", btoe (buf, key));
  288. #ifdef HEXIN
  289.   printf ("%s\n", put8 (buf, key));
  290. #endif
  291.  
  292.   exit (1);
  293. }
  294.  
  295. #ifdef __svr4__
  296. int gethostname (name, len)
  297. char *name;
  298. int len;
  299.    int  namelen = 128;
  300.  
  301.    if (sysinfo (SI_HOSTNAME, name, len) <0)  {
  302.         perror("hostname");
  303.         return -1;
  304.    }
  305.    return 0;
  306. }
  307. #endif
  308.