version 1.15, 2000/06/21 16:46:10 |
version 1.16, 2000/07/16 08:27:22 |
|
|
return 1; |
return 1; |
} |
} |
|
|
int |
typedef int sign_fn( |
ssh2_try_pubkey(char *filename, |
Key *key, |
|
unsigned char **sigp, int *lenp, |
|
unsigned char *data, int datalen); |
|
|
|
void |
|
ssh2_sign_and_send_pubkey(Key *k, sign_fn *do_sign, |
const char *server_user, const char *host, const char *service) |
const char *server_user, const char *host, const char *service) |
{ |
{ |
Buffer b; |
Buffer b; |
Key *k; |
|
unsigned char *blob, *signature; |
unsigned char *blob, *signature; |
int bloblen, slen; |
int bloblen, slen; |
struct stat st; |
|
int skip = 0; |
int skip = 0; |
|
|
if (stat(filename, &st) != 0) { |
|
debug("key does not exist: %s", filename); |
|
return 0; |
|
} |
|
debug("try pubkey: %s", filename); |
|
|
|
k = key_new(KEY_DSA); |
|
if (!load_private_key(filename, "", k, NULL)) { |
|
int success = 0; |
|
char *passphrase; |
|
char prompt[300]; |
|
snprintf(prompt, sizeof prompt, |
|
"Enter passphrase for DSA key '%.100s': ", |
|
filename); |
|
passphrase = read_passphrase(prompt, 0); |
|
success = load_private_key(filename, passphrase, k, NULL); |
|
memset(passphrase, 0, strlen(passphrase)); |
|
xfree(passphrase); |
|
if (!success) { |
|
key_free(k); |
|
return 0; |
|
} |
|
} |
|
dsa_make_key_blob(k, &blob, &bloblen); |
dsa_make_key_blob(k, &blob, &bloblen); |
|
|
/* data to be signed */ |
/* data to be signed */ |
|
|
buffer_put_string(&b, blob, bloblen); |
buffer_put_string(&b, blob, bloblen); |
|
|
/* generate signature */ |
/* generate signature */ |
dsa_sign(k, &signature, &slen, buffer_ptr(&b), buffer_len(&b)); |
do_sign(k, &signature, &slen, buffer_ptr(&b), buffer_len(&b)); |
key_free(k); |
key_free(k); /* XXX */ |
#ifdef DEBUG_DSS |
#ifdef DEBUG_DSS |
buffer_dump(&b); |
buffer_dump(&b); |
#endif |
#endif |
|
|
/* send */ |
/* send */ |
packet_send(); |
packet_send(); |
packet_write_wait(); |
packet_write_wait(); |
|
} |
|
|
|
int |
|
ssh2_try_pubkey(char *filename, |
|
const char *server_user, const char *host, const char *service) |
|
{ |
|
Key *k; |
|
struct stat st; |
|
|
|
if (stat(filename, &st) != 0) { |
|
debug("key does not exist: %s", filename); |
|
return 0; |
|
} |
|
debug("try pubkey: %s", filename); |
|
|
|
k = key_new(KEY_DSA); |
|
if (!load_private_key(filename, "", k, NULL)) { |
|
int success = 0; |
|
char *passphrase; |
|
char prompt[300]; |
|
snprintf(prompt, sizeof prompt, |
|
"Enter passphrase for DSA key '%.100s': ", |
|
filename); |
|
passphrase = read_passphrase(prompt, 0); |
|
success = load_private_key(filename, passphrase, k, NULL); |
|
memset(passphrase, 0, strlen(passphrase)); |
|
xfree(passphrase); |
|
if (!success) { |
|
key_free(k); |
|
return 0; |
|
} |
|
} |
|
ssh2_sign_and_send_pubkey(k, dsa_sign, server_user, host, service); |
return 1; |
return 1; |
} |
} |
|
|