#include <stdio.h>
#include <ctype.h>
#include "ntp_fp.h"
#include "ntp.h"
#include "ntp_stdlib.h"
#include "ntp_syslog.h"
#ifdef DES
#define KEY_TYPE_STD 1
#define KEY_TYPE_NTP 2
#define KEY_TYPE_ASCII 3
#endif
#ifdef MD5
#define KEY_TYPE_MD5 4
#endif
static char *nexttok P((char **));
static char *
nexttok(
char **str
)
{
register char *cp;
char *starttok;
cp = *str;
while (*cp == ' ' || *cp == '\t')
cp++;
starttok = cp;
while (*cp != '\0' && *cp != '\n' && *cp != ' '
&& *cp != '\t' && *cp != '#')
cp++;
if (starttok == cp)
return 0;
if (*cp == ' ' || *cp == '\t')
*cp++ = '\0';
else
*cp = '\0';
*str = cp;
return starttok;
}
int
authreadkeys(
const char *file
)
{
FILE *fp;
char *line;
char *token;
u_long keyno;
int keytype;
char buf[512];
fp = fopen(file, "r");
if (fp == NULL) {
msyslog(LOG_ERR, "can't open key file %s: %m", file);
return 0;
}
auth_delkeys();
while ((line = fgets(buf, sizeof buf, fp)) != NULL) {
token = nexttok(&line);
if (token == 0)
continue;
keyno = atoi(token);
if (keyno == 0) {
msyslog(LOG_ERR,
"cannot change keyid 0, key entry `%s' ignored",
token);
continue;
}
if (keyno > NTP_MAXKEY) {
msyslog(LOG_ERR,
"keyid's > %d reserved for autokey, key entry `%s' ignored",
NTP_MAXKEY, token);
continue;
}
token = nexttok(&line);
if (token == 0) {
msyslog(LOG_ERR,
"no key type for key number %ld, entry ignored",
keyno);
continue;
}
switch (*token) {
#ifdef DES
case 'S':
case 's':
keytype = KEY_TYPE_STD; break;
case 'N':
case 'n':
keytype = KEY_TYPE_NTP; break;
case 'A':
case 'a':
keytype = KEY_TYPE_ASCII; break;
#endif
#ifdef MD5
case 'M':
case 'm':
keytype = KEY_TYPE_MD5; break;
#endif
default:
msyslog(LOG_ERR,
"invalid key type for key number %ld, entry ignored",
keyno);
continue;
}
token = nexttok(&line);
if (token == 0) {
msyslog(LOG_ERR,
"no key for number %ld entry, entry ignored",
keyno);
} else {
switch(keytype) {
#ifdef DES
case KEY_TYPE_STD:
case KEY_TYPE_NTP:
case KEY_TYPE_ASCII:
if (!authusekey(keyno, keytype,
(u_char *)token))
msyslog(LOG_ERR,
"format/parity error for DES key %ld, not used",
keyno);
break;
#endif
#ifdef MD5
case KEY_TYPE_MD5:
if (!authusekey(keyno, keytype,
(u_char *)token))
msyslog(LOG_ERR,
"format/parity error for MD5 key %ld, not used",
keyno);
break;
#endif
}
}
}
(void) fclose(fp);
return 1;
}