summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--include/libssh/priv.h2
-rw-r--r--libssh/client.c4
-rw-r--r--libssh/dh.c26
3 files changed, 23 insertions, 9 deletions
diff --git a/include/libssh/priv.h b/include/libssh/priv.h
index ece643d0..26c6f0e2 100644
--- a/include/libssh/priv.h
+++ b/include/libssh/priv.h
@@ -514,7 +514,7 @@ void ssh_set_error(void *error, int code, const char *descr, ...) PRINTF_ATTRIBU
/* in dh.c */
/* DH key generation */
-void dh_generate_e(SSH_SESSION *session);
+int dh_generate_e(SSH_SESSION *session);
void ssh_print_bignum(const char *which,bignum num);
int dh_generate_x(SSH_SESSION *session);
int dh_generate_y(SSH_SESSION *session);
diff --git a/libssh/client.c b/libssh/client.c
index 57cbd18e..70956c98 100644
--- a/libssh/client.c
+++ b/libssh/client.c
@@ -204,7 +204,9 @@ static int dh_handshake(SSH_SESSION *session) {
if (dh_generate_x(session) < 0) {
goto error;
}
- dh_generate_e(session);
+ if (dh_generate_e(session) < 0) {
+ goto error;
+ }
e = dh_get_e(session);
if (e == NULL) {
diff --git a/libssh/dh.c b/libssh/dh.c
index f9684215..db916b87 100644
--- a/libssh/dh.c
+++ b/libssh/dh.c
@@ -255,22 +255,34 @@ int dh_generate_y(SSH_SESSION *session) {
}
/* used by server */
-void dh_generate_e(SSH_SESSION *session){
+int dh_generate_e(SSH_SESSION *session) {
#ifdef HAVE_LIBCRYPTO
- bignum_CTX ctx=bignum_ctx_new();
+ bignum_CTX ctx = bignum_ctx_new();
+ if (ctx == NULL) {
+ return -1;
+ }
#endif
- session->next_crypto->e=bignum_new();
+
+ session->next_crypto->e = bignum_new();
+ if (session->next_crypto->e == NULL) {
+ return -1;
+ }
+
#ifdef HAVE_LIBGCRYPT
- bignum_mod_exp(session->next_crypto->e,g,session->next_crypto->x,p);
+ bignum_mod_exp(session->next_crypto->e, g, session->next_crypto->x, p);
#elif defined HAVE_LIBCRYPTO
- bignum_mod_exp(session->next_crypto->e,g,session->next_crypto->x,p,ctx);
+ bignum_mod_exp(session->next_crypto->e, g, session->next_crypto->x, p, ctx);
#endif
+
#ifdef DEBUG_CRYPTO
- ssh_print_bignum("e",session->next_crypto->e);
+ ssh_print_bignum("e", session->next_crypto->e);
#endif
+
#ifdef HAVE_LIBCRYPTO
- bignum_ctx_free(ctx);
+ bignum_ctx_free(ctx);
#endif
+
+ return 0;
}
void dh_generate_f(SSH_SESSION *session){