version 1.35, 2002/05/17 15:54:13 |
version 1.36, 2002/05/19 02:09:28 |
|
|
#define SKEY_NAMELEN 4 |
#define SKEY_NAMELEN 4 |
#endif |
#endif |
|
|
void usage(char *); |
void usage(void); |
void secure_mode(int *, char *, char *, char *, char *, size_t); |
void secure_mode(int *, char *, char *, char *, char *, size_t); |
void normal_mode(char *, int, char *, char *, char *); |
void normal_mode(char *, int, char *, char *, char *); |
void timedout(int); |
void timedout(int); |
|
|
void enable_db(int); |
void enable_db(int); |
|
|
int |
int |
main(argc, argv) |
main(int argc, char **argv) |
int argc; |
|
char *argv[]; |
|
{ |
{ |
int rval, i, l, n, defaultsetup, rmkey, hexmode, enable, convert; |
int rval, i, l, n, defaultsetup, rmkey, hexmode, enable, convert; |
char hostname[MAXHOSTNAMELEN]; |
char hostname[MAXHOSTNAMELEN]; |
|
|
switch (argv[i][1]) { |
switch (argv[i][1]) { |
case 'a': |
case 'a': |
if (argv[++i] == NULL || argv[i][0] == '\0') |
if (argv[++i] == NULL || argv[i][0] == '\0') |
usage(argv[0]); |
usage(); |
auth_type = argv[i]; |
auth_type = argv[i]; |
break; |
break; |
case 's': |
case 's': |
|
|
break; |
break; |
case 'n': |
case 'n': |
if (argv[++i] == NULL || argv[i][0] == '\0') |
if (argv[++i] == NULL || argv[i][0] == '\0') |
usage(argv[0]); |
usage(); |
if ((n = atoi(argv[i])) < 1 || n >= SKEY_MAX_SEQ) |
if ((n = atoi(argv[i])) < 1 || n >= SKEY_MAX_SEQ) |
errx(1, "count must be > 0 and < %d", |
errx(1, "count must be > 0 and < %d", |
SKEY_MAX_SEQ); |
SKEY_MAX_SEQ); |
|
|
enable = 1; |
enable = 1; |
break; |
break; |
default: |
default: |
usage(argv[0]); |
usage(); |
} |
} |
} else { |
} else { |
/* Multi character switches are hash types */ |
/* Multi character switches are hash types */ |
if ((ht = skey_set_algorithm(&argv[i][1])) == NULL) { |
if ((ht = skey_set_algorithm(&argv[i][1])) == NULL) { |
warnx("Unknown hash algorithm %s", &argv[i][1]); |
warnx("Unknown hash algorithm %s", &argv[i][1]); |
usage(argv[0]); |
usage(); |
} |
} |
} |
} |
i++; |
i++; |
|
|
|
|
if (argc > 1 || (enable && convert) || (enable && argc) || |
if (argc > 1 || (enable && convert) || (enable && argc) || |
(convert && argc)) |
(convert && argc)) |
usage(argv[0]); |
usage(); |
|
|
/* Handle -C, -D, and -E */ |
/* Handle -C, -D, and -E */ |
if (convert || enable) { |
if (convert || enable) { |
|
|
|
|
/* Check for optional user string. */ |
/* Check for optional user string. */ |
if (argc == 1) { |
if (argc == 1) { |
if ((pp = getpwnam(argv[i])) == NULL) { |
if ((pp = getpwnam(argv[0])) == NULL) { |
if (getuid() == 0) { |
if (getuid() == 0) { |
static struct passwd _pp; |
static struct passwd _pp; |
|
|
_pp.pw_name = argv[i]; |
_pp.pw_name = argv[0]; |
pp = &_pp; |
pp = &_pp; |
warnx("Warning, user unknown: %s", argv[i]); |
warnx("Warning, user unknown: %s", argv[0]); |
} else { |
} else { |
errx(1, "User unknown: %s", argv[i]); |
errx(1, "User unknown: %s", argv[0]); |
} |
} |
} else if (strcmp(pp->pw_name, me) != 0 && getuid() != 0) { |
} else if (strcmp(pp->pw_name, me) != 0 && getuid() != 0) { |
/* Only root can change other's S/Keys. */ |
/* Only root can change other's S/Keys. */ |
|
|
errno = ENAMETOOLONG; |
errno = ENAMETOOLONG; |
err(1, "Cannot create S/Key entry"); |
err(1, "Cannot create S/Key entry"); |
} |
} |
if ((l = open(filename, O_RDWR | O_CREAT | O_EXCL, |
if ((l = open(filename, |
|
O_RDWR | O_NONBLOCK | O_CREAT | O_TRUNC |O_NOFOLLOW, |
S_IRUSR | S_IWUSR)) == -1 || |
S_IRUSR | S_IWUSR)) == -1 || |
flock(l, LOCK_EX) != 0 || |
flock(l, LOCK_EX) != 0 || |
(skey.keyfile = fdopen(l, "r+")) == NULL) |
(skey.keyfile = fdopen(l, "r+")) == NULL) |
|
|
} |
} |
|
|
void |
void |
secure_mode(count, key, seed, defaultseed, buf, bufsiz) |
secure_mode(int *count, char *key, char *seed, char *defaultseed, char *buf, |
int *count; |
size_t bufsiz) |
char *key; |
|
char *seed; |
|
char *defaultseed; |
|
char *buf; |
|
size_t bufsiz; |
|
{ |
{ |
int i, n; |
int i, n; |
char *p; |
char *p; |
|
|
} |
} |
|
|
void |
void |
normal_mode(username, n, key, seed, defaultseed) |
normal_mode(char *username, int n, char *key, char *seed, char *defaultseed) |
char *username; |
|
int n; |
|
char *key; |
|
char *seed; |
|
char *defaultseed; |
|
{ |
{ |
int i, nn; |
int i, nn; |
char passwd[SKEY_MAX_PW_LEN+2], passwd2[SKEY_MAX_PW_LEN+2]; |
char passwd[SKEY_MAX_PW_LEN+2], passwd2[SKEY_MAX_PW_LEN+2]; |
|
|
} |
} |
|
|
void |
void |
enable_db(op) |
enable_db(int op) |
int op; |
|
{ |
{ |
if (op == 1) { |
if (op == 1) { |
/* enable */ |
/* enable */ |
|
|
|
|
#define TIMEOUT_MSG "Timed out waiting for input.\n" |
#define TIMEOUT_MSG "Timed out waiting for input.\n" |
void |
void |
timedout(signo) |
timedout(int signo) |
int signo; |
|
{ |
{ |
|
|
write(STDERR_FILENO, TIMEOUT_MSG, sizeof(TIMEOUT_MSG) - 1); |
write(STDERR_FILENO, TIMEOUT_MSG, sizeof(TIMEOUT_MSG) - 1); |
|
|
} |
} |
|
|
void |
void |
usage(s) |
usage(void) |
char *s; |
|
{ |
{ |
(void)fprintf(stderr, "usage: %s [-s] [-x] [-z] [-C] [-D] [-E] " |
extern char *__progname; |
|
|
|
(void)fprintf(stderr, "usage: %s [-r] [-s] [-x] [-C] [-D] [-E] " |
"[-a auth_type] [-n count]\n " |
"[-a auth_type] [-n count]\n " |
"[-md4|-md5|-sha1|-rmd160] [user]\n", s); |
"[-md4|-md5|-sha1|-rmd160] [user]\n", __progname); |
exit(1); |
exit(1); |
} |
} |