summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--libssh/keyfiles.c77
1 files changed, 48 insertions, 29 deletions
diff --git a/libssh/keyfiles.c b/libssh/keyfiles.c
index 8a7678a..51b99e8 100644
--- a/libssh/keyfiles.c
+++ b/libssh/keyfiles.c
@@ -512,43 +512,62 @@ error:
static int read_dsa_privatekey(FILE *fp, gcry_sexp_t *r, ssh_auth_callback cb,
void *userdata, const char *desc) {
- STRING *p;
- STRING *q;
- STRING *g;
- STRING *y;
- STRING *x;
- STRING *v;
- BUFFER *buffer;
-
- if (!(buffer=privatekey_file_to_buffer(fp, TYPE_DSS, cb, userdata, desc)))
+ BUFFER *buffer = NULL;
+ STRING *p = NULL;
+ STRING *q = NULL;
+ STRING *g = NULL;
+ STRING *y = NULL;
+ STRING *x = NULL;
+ STRING *v = NULL;
+ int rc = 1;
+
+ buffer = privatekey_file_to_buffer(fp, TYPE_DSS, cb, userdata, desc);
+ if (buffer == NULL) {
return 0;
- if (!asn1_check_sequence(buffer))
- {
+ }
+
+ if (!asn1_check_sequence(buffer)) {
buffer_free(buffer);
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);
return 0;
}
- p=asn1_get_int(buffer);
- q=asn1_get_int(buffer);
- g=asn1_get_int(buffer);
- y=asn1_get_int(buffer);
- x=asn1_get_int(buffer);
+
+ p = asn1_get_int(buffer);
+ q = asn1_get_int(buffer);
+ g = asn1_get_int(buffer);
+ y = asn1_get_int(buffer);
+ x = asn1_get_int(buffer);
buffer_free(buffer);
- if (!p || !q || !g || !y || !x)
- return 0;
- gcry_sexp_build(r,NULL,"(private-key(dsa(p %b)(q %b)(g %b)(y %b)(x %b)))",ntohl(p->size),p->string,ntohl(q->size),q->string,ntohl(g->size),g->string,ntohl(y->size),y->string,ntohl(x->size),x->string);
- free(p);
- free(q);
- free(g);
- free(y);
- free(x);
- free(v);
- return 1;
+
+ if (p == NULL || q == NULL || g == NULL || y == NULL || x == NULL) {
+ rc = 0;
+ goto error;
+ }
+
+ if (gcry_sexp_build(r, NULL,
+ "(private-key(dsa(p %b)(q %b)(g %b)(y %b)(x %b)))",
+ ntohl(p->size), p->string,
+ ntohl(q->size), q->string,
+ ntohl(g->size), g->string,
+ ntohl(y->size), y->string,
+ ntohl(x->size), x->string)) {
+ rc = 0;
+ }
+
+error:
+ string_free(p);
+ string_free(q);
+ string_free(g);
+ string_free(y);
+ string_free(x);
+ string_free(v);
+
+ return rc;
}
#endif /* HAVE_LIBGCRYPT */