version 1.18.2.3, 2000/11/08 21:30:49 |
version 1.18.2.4, 2001/03/12 15:44:10 |
|
|
|
|
#include "packet.h" |
#include "packet.h" |
#include "match.h" |
#include "match.h" |
#include "ssh.h" |
|
#include <openssl/rsa.h> |
|
#include <openssl/dsa.h> |
|
#include "key.h" |
#include "key.h" |
#include "hostfile.h" |
#include "hostfile.h" |
|
#include "log.h" |
|
|
/* |
/* |
* Parses an RSA (number of bits, e, n) or DSA key from a string. Moves the |
* Parses an RSA (number of bits, e, n) or DSA key from a string. Moves the |
|
|
*/ |
*/ |
|
|
int |
int |
hostfile_read_key(char **cpp, unsigned int *bitsp, Key *ret) |
hostfile_read_key(char **cpp, u_int *bitsp, Key *ret) |
{ |
{ |
unsigned int bits; |
|
char *cp; |
char *cp; |
|
|
/* Skip leading whitespace. */ |
/* Skip leading whitespace. */ |
for (cp = *cpp; *cp == ' ' || *cp == '\t'; cp++) |
for (cp = *cpp; *cp == ' ' || *cp == '\t'; cp++) |
; |
; |
|
|
bits = key_read(ret, &cp); |
if (key_read(ret, &cp) != 1) |
if (bits == 0) |
|
return 0; |
return 0; |
|
|
/* Skip trailing whitespace. */ |
/* Skip trailing whitespace. */ |
|
|
|
|
/* Return results. */ |
/* Return results. */ |
*cpp = cp; |
*cpp = cp; |
*bitsp = bits; |
*bitsp = key_size(ret); |
return 1; |
return 1; |
} |
} |
|
|
int |
int |
auth_rsa_read_key(char **cpp, unsigned int *bitsp, BIGNUM * e, BIGNUM * n) |
auth_rsa_read_key(char **cpp, u_int *bitsp, BIGNUM * e, BIGNUM * n) |
{ |
{ |
Key *k = key_new(KEY_RSA); |
Key *k = key_new(KEY_RSA1); |
int ret = hostfile_read_key(cpp, bitsp, k); |
int ret = hostfile_read_key(cpp, bitsp, k); |
BN_copy(e, k->rsa->e); |
BN_copy(e, k->rsa->e); |
BN_copy(n, k->rsa->n); |
BN_copy(n, k->rsa->n); |
|
|
int |
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) |
{ |
{ |
if (key == NULL || key->type != KEY_RSA || key->rsa == NULL) |
if (key == NULL || key->type != KEY_RSA1 || key->rsa == NULL) |
return 1; |
return 1; |
if (bits != BN_num_bits(key->rsa->n)) { |
if (bits != BN_num_bits(key->rsa->n)) { |
log("Warning: %s, line %d: keysize mismatch for host %s: " |
log("Warning: %s, line %d: keysize mismatch for host %s: " |
|
|
*/ |
*/ |
|
|
HostStatus |
HostStatus |
check_host_in_hostfile(const char *filename, const char *host, Key *key, Key *found) |
check_host_in_hostfile(const char *filename, const char *host, Key *key, |
|
Key *found, int *numret) |
{ |
{ |
FILE *f; |
FILE *f; |
char line[8192]; |
char line[8192]; |
int linenum = 0; |
int linenum = 0; |
unsigned int kbits, hostlen; |
u_int kbits, hostlen; |
char *cp, *cp2; |
char *cp, *cp2; |
HostStatus end_return; |
HostStatus end_return; |
|
|
|
|
; |
; |
|
|
/* Check if the host name matches. */ |
/* Check if the host name matches. */ |
if (match_hostname(host, cp, (unsigned int) (cp2 - cp)) != 1) |
if (match_hostname(host, cp, (u_int) (cp2 - cp)) != 1) |
continue; |
continue; |
|
|
/* Got a match. Skip host name. */ |
/* Got a match. Skip host name. */ |
|
|
continue; |
continue; |
if (!hostfile_check_key(kbits, found, host, filename, linenum)) |
if (!hostfile_check_key(kbits, found, host, filename, linenum)) |
continue; |
continue; |
|
|
|
if (numret != NULL) |
|
*numret = linenum; |
|
|
/* 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)) { |