aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAndreas Schneider <mail@cynapses.org>2009-04-16 14:50:53 +0000
committerAndreas Schneider <mail@cynapses.org>2009-04-16 14:50:53 +0000
commitc6eb54c39e4663c8f9ea82e8bf29bfdb3c8d945a (patch)
tree6a5df0628e9356be11cac56f5068f5724f3b7709
parente8a9cb25febeccd97aed9eb8e04da0b9f89b5a33 (diff)
downloadlibssh-c6eb54c39e4663c8f9ea82e8bf29bfdb3c8d945a.tar.gz
libssh-c6eb54c39e4663c8f9ea82e8bf29bfdb3c8d945a.tar.xz
libssh-c6eb54c39e4663c8f9ea82e8bf29bfdb3c8d945a.zip
Improve dh_import() functions.
git-svn-id: svn+ssh://svn.berlios.de/svnroot/repos/libssh/trunk@505 7dcaeef0-15fb-0310-b436-a5af3365683c
-rw-r--r--include/libssh/priv.h4
-rw-r--r--libssh/client.c6
-rw-r--r--libssh/dh.c22
-rw-r--r--libssh/server.c5
4 files changed, 28 insertions, 9 deletions
diff --git a/include/libssh/priv.h b/include/libssh/priv.h
index 1deff590..4fe54a9e 100644
--- a/include/libssh/priv.h
+++ b/include/libssh/priv.h
@@ -525,8 +525,8 @@ void ssh_crypto_finalize(void);
STRING *dh_get_e(SSH_SESSION *session);
STRING *dh_get_f(SSH_SESSION *session);
-void dh_import_f(SSH_SESSION *session,STRING *f_string);
-void dh_import_e(SSH_SESSION *session, STRING *e_string);
+int dh_import_f(SSH_SESSION *session,STRING *f_string);
+int dh_import_e(SSH_SESSION *session, STRING *e_string);
void dh_import_pubkey(SSH_SESSION *session,STRING *pubkey_string);
void dh_build_k(SSH_SESSION *session);
int make_sessionid(SSH_SESSION *session);
diff --git a/libssh/client.c b/libssh/client.c
index 70956c98..166eb3a7 100644
--- a/libssh/client.c
+++ b/libssh/client.c
@@ -251,7 +251,11 @@ static int dh_handshake(SSH_SESSION *session) {
rc = SSH_ERROR;
goto error;
}
- dh_import_f(session, f);
+ if (dh_import_f(session, f) < 0) {
+ ssh_set_error(session, SSH_FATAL, "Cannot import f number");
+ rc = SSH_ERROR;
+ goto error;
+ }
string_burn(f);
string_free(f);
diff --git a/libssh/dh.c b/libssh/dh.c
index 9eb4810e..4f37615f 100644
--- a/libssh/dh.c
+++ b/libssh/dh.c
@@ -380,19 +380,31 @@ void dh_import_pubkey(SSH_SESSION *session, STRING *pubkey_string) {
session->next_crypto->server_pubkey = pubkey_string;
}
-void dh_import_f(SSH_SESSION *session,STRING *f_string){
- session->next_crypto->f=make_string_bn(f_string);
+int dh_import_f(SSH_SESSION *session, STRING *f_string) {
+ session->next_crypto->f = make_string_bn(f_string);
+ if (session->next_crypto->f == NULL) {
+ return -1;
+ }
+
#ifdef DEBUG_CRYPTO
- ssh_print_bignum("f",session->next_crypto->f);
+ ssh_print_bignum("f",session->next_crypto->f);
#endif
+
+ return 0;
}
/* used by the server implementation */
-void dh_import_e(SSH_SESSION *session, STRING *e_string){
- session->next_crypto->e=make_string_bn(e_string);
+int dh_import_e(SSH_SESSION *session, STRING *e_string) {
+ session->next_crypto->e = make_string_bn(e_string);
+ if (session->next_crypto->e == NULL) {
+ return -1;
+ }
+
#ifdef DEBUG_CRYPTO
ssh_print_bignum("e",session->next_crypto->e);
#endif
+
+ return 0;
}
void dh_build_k(SSH_SESSION *session){
diff --git a/libssh/server.c b/libssh/server.c
index 2809a8ec..7b3602b9 100644
--- a/libssh/server.c
+++ b/libssh/server.c
@@ -272,7 +272,10 @@ static int dh_handshake_server(SSH_SESSION *session){
ssh_set_error(session,SSH_FATAL,"No e number in client request");
return -1;
}
- dh_import_e(session,e);
+ if (dh_import_e(session, e) < 0) {
+ ssh_set_error(session,SSH_FATAL,"Cannot import e number");
+ return -1;
+ }
free(e);
if (dh_generate_y(session) < 0) {
ssh_set_error(session,SSH_FATAL,"Could not create y number");