version 1.28, 2001/06/25 08:25:37 |
version 1.28.2.2, 2002/10/11 14:53:06 |
|
|
* pointer over the key. Skips any whitespace at the beginning and at end. |
* pointer over the key. Skips any whitespace at the beginning and at end. |
*/ |
*/ |
|
|
static int |
int |
hostfile_read_key(char **cpp, u_int *bitsp, Key *ret) |
hostfile_read_key(char **cpp, u_int *bitsp, Key *ret) |
{ |
{ |
char *cp; |
char *cp; |
|
|
return 1; |
return 1; |
} |
} |
|
|
int |
|
auth_rsa_read_key(char **cpp, u_int *bitsp, BIGNUM * e, BIGNUM * n) |
|
{ |
|
Key *k = key_new(KEY_RSA1); |
|
int ret = hostfile_read_key(cpp, bitsp, k); |
|
BN_copy(e, k->rsa->e); |
|
BN_copy(n, k->rsa->n); |
|
key_free(k); |
|
return ret; |
|
} |
|
|
|
static int |
static int |
hostfile_check_key(int bits, Key *key, const char *host, const char *filename, int linenum) |
hostfile_check_key(int bits, Key *key, const char *host, const char *filename, int linenum) |
{ |
{ |
|
|
* in the list of our known hosts. Returns HOST_OK if the host is known and |
* in the list of our known hosts. Returns HOST_OK if the host is known and |
* has the specified key, HOST_NEW if the host is not known, and HOST_CHANGED |
* has the specified key, HOST_NEW if the host is not known, and HOST_CHANGED |
* if the host is known but used to have a different host key. |
* if the host is known but used to have a different host key. |
|
* |
|
* If no 'key' has been specified and a key of type 'keytype' is known |
|
* for the specified host, then HOST_FOUND is returned. |
*/ |
*/ |
|
|
HostStatus |
static HostStatus |
check_host_in_hostfile(const char *filename, const char *host, Key *key, |
check_host_in_hostfile_by_key_or_type(const char *filename, |
Key *found, int *numret) |
const char *host, Key *key, int keytype, Key *found, int *numret) |
{ |
{ |
FILE *f; |
FILE *f; |
char line[8192]; |
char line[8192]; |
|
|
HostStatus end_return; |
HostStatus end_return; |
|
|
debug3("check_host_in_hostfile: filename %s", filename); |
debug3("check_host_in_hostfile: filename %s", filename); |
if (key == NULL) |
|
fatal("no key to look up"); |
|
/* Open the file containing the list of known hosts. */ |
/* Open the file containing the list of known hosts. */ |
f = fopen(filename, "r"); |
f = fopen(filename, "r"); |
if (!f) |
if (!f) |
|
|
*/ |
*/ |
if (!hostfile_read_key(&cp, &kbits, found)) |
if (!hostfile_read_key(&cp, &kbits, found)) |
continue; |
continue; |
if (!hostfile_check_key(kbits, found, host, filename, linenum)) |
|
continue; |
|
|
|
if (numret != NULL) |
if (numret != NULL) |
*numret = linenum; |
*numret = linenum; |
|
|
|
if (key == NULL) { |
|
/* we found a key of the requested type */ |
|
if (found->type == keytype) |
|
return HOST_FOUND; |
|
continue; |
|
} |
|
|
|
if (!hostfile_check_key(kbits, found, host, filename, linenum)) |
|
continue; |
|
|
/* Check if the current key is the same as the given key. */ |
/* Check if the current key is the same as the given key. */ |
if (key_equal(key, found)) { |
if (key_equal(key, found)) { |
/* Ok, they match. */ |
/* Ok, they match. */ |
|
|
* saw a different key for the host. |
* saw a different key for the host. |
*/ |
*/ |
return end_return; |
return end_return; |
|
} |
|
|
|
HostStatus |
|
check_host_in_hostfile(const char *filename, const char *host, Key *key, |
|
Key *found, int *numret) |
|
{ |
|
if (key == NULL) |
|
fatal("no key to look up"); |
|
return (check_host_in_hostfile_by_key_or_type(filename, host, key, 0, |
|
found, numret)); |
|
} |
|
|
|
int |
|
lookup_key_in_hostfile_by_type(const char *filename, const char *host, |
|
int keytype, Key *found, int *numret) |
|
{ |
|
return (check_host_in_hostfile_by_key_or_type(filename, host, NULL, |
|
keytype, found, numret) == HOST_FOUND); |
} |
} |
|
|
/* |
/* |