aboutsummaryrefslogtreecommitdiff
path: root/libssh/dh.c
diff options
context:
space:
mode:
authorAndreas Schneider <mail@cynapses.org>2009-04-16 14:04:19 +0000
committerAndreas Schneider <mail@cynapses.org>2009-04-16 14:04:19 +0000
commit1ed7c908908593346bc2e3cdf37aa26a4ac200ed (patch)
tree4f79d636f6bd04baed456097f95728da014f7efd /libssh/dh.c
parent24fc1b2028ed03ac7355c05ad2c93d81f0d5497a (diff)
downloadlibssh-1ed7c908908593346bc2e3cdf37aa26a4ac200ed.tar.gz
libssh-1ed7c908908593346bc2e3cdf37aa26a4ac200ed.tar.xz
libssh-1ed7c908908593346bc2e3cdf37aa26a4ac200ed.zip
Revert commit 491.
git-svn-id: svn+ssh://svn.berlios.de/svnroot/repos/libssh/trunk@492 7dcaeef0-15fb-0310-b436-a5af3365683c
Diffstat (limited to 'libssh/dh.c')
-rw-r--r--libssh/dh.c89
1 files changed, 35 insertions, 54 deletions
diff --git a/libssh/dh.c b/libssh/dh.c
index 93bd090..1d825b2 100644
--- a/libssh/dh.c
+++ b/libssh/dh.c
@@ -69,6 +69,9 @@ static unsigned char p_value[] = {
#define P_LEN 128 /* Size in bytes of the p number */
static unsigned long g_int = 2 ; /* G is defined as 2 by the ssh2 standards */
+static bignum g;
+static bignum p;
+static int ssh_crypto_inited=0;
int ssh_get_random(void *where, int len, int strong){
@@ -93,51 +96,37 @@ int ssh_get_random(void *where, int len, int strong){
/* it inits the values g and p which are used for DH key agreement */
-int ssh_crypto_init(struct ssh_session *session) {
+void ssh_crypto_init(void){
+ if(ssh_crypto_inited == 0){
#ifdef HAVE_LIBGCRYPT
- gcry_check_version(NULL);
-
- if (!gcry_control(GCRYCTL_INITIALIZATION_FINISHED_P,0)) {
- gcry_control(GCRYCTL_INIT_SECMEM, 4096);
- gcry_control(GCRYCTL_INITIALIZATION_FINISHED,0);
- }
-#endif
-
- session->dh_g = bignum_new();
- if (session->dh_g == NULL) {
- return -1;
- }
- bignum_set_word(session->dh_g, g_int);
-
+ gcry_check_version(NULL);
+ if (!gcry_control(GCRYCTL_INITIALIZATION_FINISHED_P,0))
+ {
+ gcry_control(GCRYCTL_INIT_SECMEM, 4096);
+ gcry_control(GCRYCTL_INITIALIZATION_FINISHED,0);
+ }
+#endif
+ g=bignum_new();
+ bignum_set_word(g,g_int);
#ifdef HAVE_LIBGCRYPT
- bignum_bin2bn(p_value, P_LEN, &session->dh_p);
- if (session->dh_p == NULL) {
- bignum_free(session->dh_g);
- session->dh_g = NULL;
- return -1;
- }
+ bignum_bin2bn(p_value,P_LEN,&p);
#elif defined HAVE_LIBCRYPTO
- session->dh_p = bignum_new();
- if (session->dh_p == NULL) {
- bignum_free(session->dh_g);
- session->dh_g = NULL;
- return -1;
- }
- bignum_bin2bn(p_value, P_LEN, session->dh_p);
- OpenSSL_add_all_algorithms();
+ p=bignum_new();
+ bignum_bin2bn(p_value,P_LEN,p);
+ OpenSSL_add_all_algorithms();
#endif
-
- return 0;
+ ssh_crypto_inited++;
+ }
}
-void ssh_crypto_finalize(struct ssh_session *session) {
- bignum_free(session->dh_g);
- session->dh_g = NULL;
-
- bignum_free(session->dh_p);
- session->dh_p = NULL;
+void ssh_crypto_finalize(void){
+ if(ssh_crypto_inited){
+ bignum_free(g);
+ bignum_free(p);
+ ssh_crypto_inited=0;
+ }
}
-
+
/* prints the bignum on stderr */
void ssh_print_bignum(const char *which,bignum num){
#ifdef HAVE_LIBGCRYPT
@@ -234,11 +223,9 @@ void dh_generate_e(SSH_SESSION *session){
#endif
session->next_crypto->e=bignum_new();
#ifdef HAVE_LIBGCRYPT
- bignum_mod_exp(session->next_crypto->e, session->dh_g,
- session->next_crypto->x, session->dh_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, session->dh_g,
- session->next_crypto->x, session->dh_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);
@@ -254,11 +241,9 @@ void dh_generate_f(SSH_SESSION *session){
#endif
session->next_crypto->f=bignum_new();
#ifdef HAVE_LIBGCRYPT
- bignum_mod_exp(session->next_crypto->f, session->dh_g,
- session->next_crypto->y, session->dh_p);
+ bignum_mod_exp(session->next_crypto->f,g,session->next_crypto->y,p);
#elif defined HAVE_LIBCRYPTO
- bignum_mod_exp(session->next_crypto->f, session->dh_g,
- session->next_crypto->y, session->dh_p, ctx);
+ bignum_mod_exp(session->next_crypto->f,g,session->next_crypto->y,p,ctx);
#endif
#ifdef DEBUG_CRYPTO
ssh_print_bignum("f",session->next_crypto->f);
@@ -342,19 +327,15 @@ void dh_build_k(SSH_SESSION *session){
/* the server and clients don't use the same numbers */
#ifdef HAVE_LIBGCRYPT
if(session->client){
- bignum_mod_exp(session->next_crypto->k, session->next_crypto->f,
- session->next_crypto->x, session->dh_p);
+ bignum_mod_exp(session->next_crypto->k,session->next_crypto->f,session->next_crypto->x,p);
} else {
- bignum_mod_exp(session->next_crypto->k, session->next_crypto->e,
- session->next_crypto->y, session->dh_p);
+ bignum_mod_exp(session->next_crypto->k,session->next_crypto->e,session->next_crypto->y,p);
}
#elif defined HAVE_LIBCRYPTO
if(session->client){
- bignum_mod_exp(session->next_crypto->k, session->next_crypto->f,
- session->next_crypto->x, session->dh_p, ctx);
+ bignum_mod_exp(session->next_crypto->k,session->next_crypto->f,session->next_crypto->x,p,ctx);
} else {
- bignum_mod_exp(session->next_crypto->k, session->next_crypto->e,
- session->next_crypto->y, session->dh_p, ctx);
+ bignum_mod_exp(session->next_crypto->k,session->next_crypto->e,session->next_crypto->y,p,ctx);
}
#endif
#ifdef DEBUG_CRYPTO