Add more error checks to read_rsa_privatekey().

git-svn-id: svn+ssh://svn.berlios.de/svnroot/repos/libssh/trunk@561 7dcaeef0-15fb-0310-b436-a5af3365683c
This commit is contained in:
Andreas Schneider
2009-04-19 09:20:24 +00:00
parent b7f93a4779
commit e6474a34c3

View File

@@ -440,52 +440,74 @@ static BUFFER *privatekey_file_to_buffer(FILE *fp, int type,
static int read_rsa_privatekey(FILE *fp, gcry_sexp_t *r, static int read_rsa_privatekey(FILE *fp, gcry_sexp_t *r,
ssh_auth_callback cb, void *userdata, const char *desc) { ssh_auth_callback cb, void *userdata, const char *desc) {
STRING *n; STRING *n = NULL;
STRING *e; STRING *e = NULL;
STRING *d; STRING *d = NULL;
STRING *p; STRING *p = NULL;
STRING *q; STRING *q = NULL;
STRING *unused1; STRING *unused1 = NULL;
STRING *unused2; STRING *unused2 = NULL;
STRING *u; STRING *u = NULL;
STRING *v; STRING *v = NULL;
BUFFER *buffer; BUFFER *buffer = NULL;
int rc = 1;
if (!(buffer=privatekey_file_to_buffer(fp, TYPE_RSA, cb, userdata, desc))) buffer = privatekey_file_to_buffer(fp, TYPE_RSA, cb, userdata, desc);
if (buffer == NULL) {
return 0; return 0;
if (!asn1_check_sequence(buffer)) }
{
if (!asn1_check_sequence(buffer)) {
buffer_free(buffer); buffer_free(buffer);
return 0; return 0;
} }
v=asn1_get_int(buffer);
if (ntohl(v->size)!=1 || v->string[0]!=0) v = asn1_get_int(buffer);
{ if (ntohl(v->size) != 1 || v->string[0] != 0) {
buffer_free(buffer); buffer_free(buffer);
return 0; return 0;
} }
n=asn1_get_int(buffer);
e=asn1_get_int(buffer); n = asn1_get_int(buffer);
d=asn1_get_int(buffer); e = asn1_get_int(buffer);
q=asn1_get_int(buffer); d = asn1_get_int(buffer);
p=asn1_get_int(buffer); q = asn1_get_int(buffer);
unused1=asn1_get_int(buffer); p = asn1_get_int(buffer);
unused2=asn1_get_int(buffer); unused1 = asn1_get_int(buffer);
u=asn1_get_int(buffer); unused2 = asn1_get_int(buffer);
u = asn1_get_int(buffer);
buffer_free(buffer); buffer_free(buffer);
if (!n || !e || !d || !p || !q || !unused1 || !unused2 || !u)
return 0; if (n == NULL || e == NULL || d == NULL || p == NULL || q == NULL ||
gcry_sexp_build(r,NULL,"(private-key(rsa(n %b)(e %b)(d %b)(p %b)(q %b)(u %b)))",ntohl(n->size),n->string,ntohl(e->size),e->string,ntohl(d->size),d->string,ntohl(p->size),p->string,ntohl(q->size),q->string,ntohl(u->size),u->string); unused1 == NULL || unused2 == NULL|| u == NULL) {
free(n); rc = 0;
free(e); goto error;
free(d); }
free(p);
free(q); if (gcry_sexp_build(r, NULL,
free(unused1); "(private-key(rsa(n %b)(e %b)(d %b)(p %b)(q %b)(u %b)))",
free(unused2); ntohl(n->size), n->string,
free(u); ntohl(e->size), e->string,
free(v); ntohl(d->size), d->string,
return 1; ntohl(p->size), p->string,
ntohl(q->size), q->string,
ntohl(u->size), u->string)) {
rc = 0;
}
error:
string_free(n);
string_free(e);
string_free(d);
string_free(p);
string_free(q);
string_free(unused1);
string_free(unused2);
string_free(u);
string_free(v);
return rc;
} }
static int read_dsa_privatekey(FILE *fp, gcry_sexp_t *r, ssh_auth_callback cb, static int read_dsa_privatekey(FILE *fp, gcry_sexp_t *r, ssh_auth_callback cb,