version 1.16, 1996/10/23 18:09:27 |
version 1.17, 1996/11/03 18:57:46 |
|
|
#include <ctype.h> |
#include <ctype.h> |
#include <skey.h> |
#include <skey.h> |
|
|
#ifndef SKEY_MAXSEQ |
|
#define SKEY_MAXSEQ 10000 |
|
#endif |
|
#ifndef SKEY_NAMELEN |
#ifndef SKEY_NAMELEN |
#define SKEY_NAMELEN 4 |
#define SKEY_NAMELEN 4 |
#endif |
#endif |
#ifndef SKEY_MIN_PW_LEN |
|
#define SKEY_MIN_PW_LEN 10 |
|
#endif |
|
|
|
void usage __P((char *)); |
void usage __P((char *)); |
|
|
|
|
int argc; |
int argc; |
char *argv[]; |
char *argv[]; |
{ |
{ |
int rval, n, nn, i, l, defaultsetup=1, zerokey=0, hexmode=0; |
int rval, nn, i, l, n=0, defaultsetup=1, zerokey=0, hexmode=0; |
time_t now; |
time_t now; |
char hostname[MAXHOSTNAMELEN]; |
char hostname[MAXHOSTNAMELEN]; |
char seed[18], tmp[80], key[8], defaultseed[17]; |
char passwd[SKEY_MAX_PW_LEN+2], passwd2[SKEY_MAX_PW_LEN+2]; |
char passwd[256], passwd2[256], tbuf[27], buf[60]; |
char seed[SKEY_MAX_SEED_LEN+2], defaultseed[SKEY_MAX_SEED_LEN+1]; |
|
char tbuf[27], buf[80], key[SKEY_BINKEY_SIZE]; |
char lastc, me[UT_NAMESIZE+1], *salt, *p, *pw, *ht=NULL; |
char lastc, me[UT_NAMESIZE+1], *salt, *p, *pw, *ht=NULL; |
struct skey skey; |
struct skey skey; |
struct passwd *pp; |
struct passwd *pp; |
|
|
if (geteuid() != 0) |
if (geteuid() != 0) |
errx(1, "must be setuid root."); |
errx(1, "must be setuid root."); |
|
|
(void)time(&now); |
|
(void)sprintf(tbuf, "%05ld", (long) (now % 100000)); |
|
|
|
if (gethostname(hostname, sizeof(hostname)) < 0) |
if (gethostname(hostname, sizeof(hostname)) < 0) |
err(1, "gethostname"); |
err(1, "gethostname"); |
(void)strncpy(defaultseed, hostname, sizeof(defaultseed) - 1); |
(void)strncpy(defaultseed, hostname, sizeof(defaultseed) - 1); |
defaultseed[SKEY_NAMELEN] = '\0'; |
defaultseed[SKEY_NAMELEN] = '\0'; |
|
(void)time(&now); |
|
(void)sprintf(tbuf, "%05ld", (long) (now % 100000)); |
(void)strncat(defaultseed, tbuf, sizeof(defaultseed) - 5); |
(void)strncat(defaultseed, tbuf, sizeof(defaultseed) - 5); |
|
|
if ((pp = getpwuid(getuid())) == NULL) |
if ((pp = getpwuid(getuid())) == NULL) |
|
|
case 'z': |
case 'z': |
zerokey = 1; |
zerokey = 1; |
break; |
break; |
|
case 'n': |
|
if (argv[++i][0] == '\0') |
|
usage(argv[0]); |
|
if ((n = atoi(argv[i])) < 1 || n >= SKEY_MAX_SEQ) |
|
errx(1, "count must be > 0 and < %d", |
|
SKEY_MAX_SEQ); |
|
break; |
default: |
default: |
usage(argv[0]); |
usage(argv[0]); |
} |
} |
|
|
skey.seed); |
skey.seed); |
|
|
/* |
/* |
* Lets be nice if they have a skey.seed that |
* Let's be nice if they have an skey.seed that |
* ends in 0-8 just add one |
* ends in 0-8 just add one |
*/ |
*/ |
l = strlen(skey.seed); |
l = strlen(skey.seed); |
|
|
(void)printf("[Adding %s]\n", pp->pw_name); |
(void)printf("[Adding %s]\n", pp->pw_name); |
break; |
break; |
} |
} |
n = 99; |
if (n == 0) |
|
n = 99; |
|
|
/* Set hash type if asked to */ |
/* Set hash type if asked to */ |
if (ht) { |
if (ht) { |
|
|
|
|
if (!defaultsetup) { |
if (!defaultsetup) { |
(void)printf("You need the 6 english words generated from the \"skey\" command.\n"); |
(void)printf("You need the 6 english words generated from the \"skey\" command.\n"); |
for (i = 0;; i++) { |
for (i = 0; ; i++) { |
if (i >= 2) |
if (i >= 2) |
exit(1); |
exit(1); |
|
|
(void)printf("Enter sequence count from 1 to %d: ", |
(void)printf("Enter sequence count from 1 to %d: ", |
SKEY_MAXSEQ); |
SKEY_MAX_SEQ); |
(void)fgets(tmp, sizeof(tmp), stdin); |
(void)fgets(buf, sizeof(buf), stdin); |
n = atoi(tmp); |
n = atoi(buf); |
if (n > 0 && n < SKEY_MAXSEQ) |
if (n > 0 && n < SKEY_MAX_SEQ) |
break; /* Valid range */ |
break; /* Valid range */ |
(void)printf("Error: Count must be > 0 and < %d\n", |
(void)printf("Error: Count must be > 0 and < %d\n", |
SKEY_MAXSEQ); |
SKEY_MAX_SEQ); |
} |
} |
|
|
for (i = 0;; i++) { |
for (i = 0;; i++) { |
|
|
if (*p == '\0') |
if (*p == '\0') |
break; /* Valid seed */ |
break; /* Valid seed */ |
} |
} |
if (strlen(seed) > 16) { |
if (strlen(seed) > SKEY_MAX_SEED_LEN) { |
(void)puts("Notice: Seed truncated to 16 characters."); |
(void)printf("Notice: Seed truncated to %d characters.\n", |
seed[16] = '\0'; |
SKEY_MAX_SEED_LEN); |
} |
seed[SKEY_MAX_SEED_LEN] = '\0'; |
if (seed[0] == '\0') |
} else if (seed[0] == '\0') |
(void)strcpy(seed, defaultseed); |
(void)strcpy(seed, defaultseed); |
|
|
for (i = 0;; i++) { |
for (i = 0;; i++) { |
|
|
|
|
(void)printf("otp-%s %d %s\nS/Key access password: ", |
(void)printf("otp-%s %d %s\nS/Key access password: ", |
skey_get_algorithm(), n, seed); |
skey_get_algorithm(), n, seed); |
(void)fgets(tmp, sizeof(tmp), stdin); |
(void)fgets(buf, sizeof(buf), stdin); |
rip(tmp); |
rip(buf); |
backspace(tmp); |
backspace(buf); |
|
|
if (tmp[0] == '?') { |
if (buf[0] == '?') { |
(void)puts("Enter 6 English words from secure S/Key calculation."); |
(void)puts("Enter 6 English words from secure S/Key calculation."); |
continue; |
continue; |
} else if (tmp[0] == '\0') |
} else if (buf[0] == '\0') |
exit(1); |
exit(1); |
if (etob(key, tmp) == 1 || atob8(key, tmp) == 0) |
if (etob(key, buf) == 1 || atob8(key, buf) == 0) |
break; /* Valid format */ |
break; /* Valid format */ |
(void)puts("Invalid format - try again with 6 English words."); |
(void)puts("Invalid format - try again with 6 English words."); |
} |
} |
|
|
char *s; |
char *s; |
{ |
{ |
(void)fprintf(stderr, |
(void)fprintf(stderr, |
"Usage: %s [-s] [-x] [-z] [-md4|-md5|-sha1] [user]\n", s); |
"Usage: %s [-s] [-x] [-z] [-n count] [-md4|-md5|-sha1] [user]\n", s); |
exit(1); |
exit(1); |
} |
} |