#include <stdio.h>
#include <ctype.h>
#include "ntp_types.h"
#include "ntp_string.h"
#include "ntp_stdlib.h"
#ifdef DES
#define KEY_TYPE_STD 1
#define KEY_TYPE_NTP 2
#define KEY_TYPE_ASCII 3
#define STD_PARITY_BITS ((unsigned)0x01010101)
#endif
#define KEY_TYPE_MD5 4
int
authusekey(
keyid_t keyno,
int keytype,
const u_char *str
)
{
#ifdef DES
u_int32 key[2];
u_char keybytes[8];
char *xdigit;
int i;
static const char *hex = "0123456789abcdef";
#endif
const u_char *cp;
int len;
cp = str;
len = strlen((const char *)cp);
if (len == 0)
return 0;
switch(keytype) {
#ifdef DES
case KEY_TYPE_STD:
case KEY_TYPE_NTP:
if (len != 16)
return 0;
key[0] = 0;
key[1] = 0;
for (i = 0; i < 16; i++) {
if (!isascii(*cp))
return 0;
xdigit = strchr(hex, isupper(*cp) ? tolower(*cp) : *cp);
cp++;
if (xdigit == 0)
return 0;
key[i>>3] <<= 4;
key[i>>3] |= (u_int32)(xdigit - hex) & 0xf;
}
if (keytype == KEY_TYPE_NTP) {
for (i = 0; i < 2; i++)
key[i] = ((key[i] << 1) & ~STD_PARITY_BITS)
| ((key[i] >> 7) & STD_PARITY_BITS);
}
if (!DESauth_parity(key)) {
return 0;
}
DESauth_setkey(keyno, key);
break;
case KEY_TYPE_ASCII:
memset((char *) keybytes, 0, sizeof(keybytes));
for (i = 0; i < 8 && i < len; i++)
keybytes[i] = *cp++ << 1;
key[0] = (u_int32)keybytes[0] << 24 | (u_int32)keybytes[1] << 16
| (u_int32)keybytes[2] << 8 | (u_int32)keybytes[3];
key[1] = (u_int32)keybytes[4] << 24 | (u_int32)keybytes[5] << 16
| (u_int32)keybytes[6] << 8 | (u_int32)keybytes[7];
(void)DESauth_parity(key);
DESauth_setkey(keyno, key);
break;
#endif
case KEY_TYPE_MD5:
MD5auth_setkey(keyno, str, (int)strlen((const char *)str));
break;
default:
return 0;
}
return 1;
}