1
1

Add error checking to publickey_make_rsa().

git-svn-id: svn+ssh://svn.berlios.de/svnroot/repos/libssh/trunk@431 7dcaeef0-15fb-0310-b436-a5af3365683c
Этот коммит содержится в:
Andreas Schneider 2009-04-08 13:03:50 +00:00
родитель da1eee8c89
Коммит 29c57bab33

Просмотреть файл

@ -121,6 +121,12 @@ PUBLIC_KEY *publickey_make_dss(SSH_SESSION *session, BUFFER *buffer) {
} }
#endif /* HAVE_LIBCRYPTO */ #endif /* HAVE_LIBCRYPTO */
#ifdef DEBUG_CRYPTO
ssh_print_hexa("p", p->string, string_len(p));
ssh_print_hexa("q", q->string, string_len(q));
ssh_print_hexa("g", g->string, string_len(g));
#endif
string_burn(p); string_burn(p);
string_free(p); string_free(p);
string_burn(q); string_burn(q);
@ -147,44 +153,71 @@ error:
PUBLIC_KEY *publickey_make_rsa(SSH_SESSION *session, BUFFER *buffer, PUBLIC_KEY *publickey_make_rsa(SSH_SESSION *session, BUFFER *buffer,
const char *type) { const char *type) {
STRING *e,*n; STRING *e = NULL;
PUBLIC_KEY *key; STRING *n = NULL;
PUBLIC_KEY *key = NULL;
key = malloc(sizeof(PUBLIC_KEY)); key = malloc(sizeof(PUBLIC_KEY));
if (key == NULL) { if (key == NULL) {
return NULL; return NULL;
} }
if(!strcmp(type,"ssh-rsa"))
key->type=TYPE_RSA; if (strcmp(type, "ssh-rsa") == 0) {
else key->type = TYPE_RSA;
key->type=TYPE_RSA1; } else {
key->type_c=type; key->type = TYPE_RSA1;
e=buffer_get_ssh_string(buffer); }
n=buffer_get_ssh_string(buffer);
key->type_c = type;
e = buffer_get_ssh_string(buffer);
n = buffer_get_ssh_string(buffer);
buffer_free(buffer); /* we don't need it anymore */ buffer_free(buffer); /* we don't need it anymore */
if(!e || !n){
ssh_set_error(session,SSH_FATAL,"Invalid RSA public key"); if(e == NULL || n == NULL) {
if(e) ssh_set_error(session, SSH_FATAL, "Invalid RSA public key");
free(e); goto error;
if(n)
free(n);
free(key);
return NULL;
} }
#ifdef HAVE_LIBGCRYPT #ifdef HAVE_LIBGCRYPT
gcry_sexp_build(&key->rsa_pub,NULL,"(public-key(rsa(n %b)(e %b)))",string_len(n),n->string,string_len(e),e->string); gcry_sexp_build(&key->rsa_pub, NULL,
"(public-key(rsa(n %b)(e %b)))",
string_len(n), n->string,
string_len(e),e->string);
if (key->rsa_pub == NULL) {
goto error;
}
#elif HAVE_LIBCRYPTO #elif HAVE_LIBCRYPTO
key->rsa_pub=RSA_new(); key->rsa_pub = RSA_new();
key->rsa_pub->e=make_string_bn(e); if (key->rsa_pub == NULL) {
key->rsa_pub->n=make_string_bn(n); goto error;
}
key->rsa_pub->e = make_string_bn(e);
key->rsa_pub->n = make_string_bn(n);
if (key->rsa_pub->e == NULL ||
key->rsa_pub->n == NULL) {
goto error;
}
#endif #endif
#ifdef DEBUG_CRYPTO #ifdef DEBUG_CRYPTO
ssh_print_hexa("e",e->string,string_len(e)); ssh_print_hexa("e", e->string, string_len(e));
ssh_print_hexa("n",n->string,string_len(n)); ssh_print_hexa("n", n->string, string_len(n));
#endif #endif
free(e);
free(n); string_burn(e);
string_free(e);
string_burn(n);
string_free(n);
return key; return key;
error:
string_burn(e);
string_free(e);
string_burn(n);
string_free(n);
publickey_free(key);
return NULL;
} }
void publickey_free(PUBLIC_KEY *key) { void publickey_free(PUBLIC_KEY *key) {