diff --git a/src/common/crypto.c b/src/common/crypto.c index e0badacfca..7a548a2d14 100644 --- a/src/common/crypto.c +++ b/src/common/crypto.c @@ -1158,12 +1158,20 @@ int crypto_dh_get_bytes(crypto_dh_env_t *dh) assert(dh); return DH_size(dh->dh); } +int crypto_dh_generate_public(crypto_dh_env_t *dh) +{ + if (!DH_generate_key(dh->dh)) + return -1; + return 0; +} int crypto_dh_get_public(crypto_dh_env_t *dh, char *pubkey, int pubkey_len) { int bytes; assert(dh); - if (!DH_generate_key(dh->dh)) - return -1; + if (!dh->dh->pub_key) { + if (!DH_generate_key(dh->dh)) + return -1; + } assert(dh->dh->pub_key); bytes = BN_num_bytes(dh->dh->pub_key); diff --git a/src/common/crypto.h b/src/common/crypto.h index d256b1cb0b..a09a4deda1 100644 --- a/src/common/crypto.h +++ b/src/common/crypto.h @@ -86,6 +86,7 @@ typedef struct crypto_dh_env_st { #define CRYPTO_DH_SIZE (1024 / 8) crypto_dh_env_t *crypto_dh_new(); int crypto_dh_get_bytes(crypto_dh_env_t *dh); +int crypto_dh_generate_public(crypto_dh_env_t *dh); int crypto_dh_get_public(crypto_dh_env_t *dh, char *pubkey_out, int pubkey_out_len); int crypto_dh_compute_secret(crypto_dh_env_t *dh,