summaryrefslogtreecommitdiff
path: root/lib/dh.c
diff options
context:
space:
mode:
Diffstat (limited to 'lib/dh.c')
-rw-r--r--lib/dh.c26
1 files changed, 22 insertions, 4 deletions
diff --git a/lib/dh.c b/lib/dh.c
index 06bc2e1be4..ded939d0d4 100644
--- a/lib/dh.c
+++ b/lib/dh.c
@@ -37,7 +37,7 @@
static
int set_dh_pk_params(gnutls_session_t session, bigint_t g, bigint_t p,
- unsigned q_bits)
+ bigint_t q, unsigned q_bits)
{
/* just in case we are resuming a session */
gnutls_pk_params_release(&session->key.proto.tls12.dh.params);
@@ -54,7 +54,16 @@ int set_dh_pk_params(gnutls_session_t session, bigint_t g, bigint_t p,
return gnutls_assert_val(GNUTLS_E_MEMORY_ERROR);
}
- session->key.proto.tls12.dh.params.params_nr = 3; /* include empty q */
+ if (q) {
+ session->key.proto.tls12.dh.params.params[DH_Q] = _gnutls_mpi_copy(q);
+ if (session->key.proto.tls12.dh.params.params[DH_Q] == NULL) {
+ _gnutls_mpi_release(&session->key.proto.tls12.dh.params.params[DH_P]);
+ _gnutls_mpi_release(&session->key.proto.tls12.dh.params.params[DH_G]);
+ return gnutls_assert_val(GNUTLS_E_MEMORY_ERROR);
+ }
+ }
+ /* include, possibly empty, q */
+ session->key.proto.tls12.dh.params.params_nr = 3;
session->key.proto.tls12.dh.params.algo = GNUTLS_PK_DH;
session->key.proto.tls12.dh.params.qbits = q_bits;
@@ -70,7 +79,7 @@ _gnutls_figure_dh_params(gnutls_session_t session, gnutls_dh_params_t dh_params,
gnutls_params_function * func, gnutls_sec_param_t sec_param)
{
gnutls_params_st params;
- bigint_t p, g;
+ bigint_t p, g, q = NULL;
unsigned free_pg = 0;
int ret;
unsigned q_bits = 0, i;
@@ -100,6 +109,14 @@ _gnutls_figure_dh_params(gnutls_session_t session, gnutls_dh_params_t dh_params,
goto cleanup;
}
+ ret = _gnutls_mpi_init_scan_nz(&q,
+ session->internals.priorities->groups.entry[i]->q->data,
+ session->internals.priorities->groups.entry[i]->q->size);
+ if (ret < 0) {
+ gnutls_assert();
+ goto cleanup;
+ }
+
session->internals.hsk_flags |= HSK_USED_FFDHE;
q_bits = *session->internals.priorities->groups.entry[i]->q_bits;
goto finished;
@@ -158,7 +175,7 @@ _gnutls_figure_dh_params(gnutls_session_t session, gnutls_dh_params_t dh_params,
finished:
_gnutls_dh_save_group(session, g, p);
- ret = set_dh_pk_params(session, g, p, q_bits);
+ ret = set_dh_pk_params(session, g, p, q, q_bits);
if (ret < 0) {
gnutls_assert();
}
@@ -166,6 +183,7 @@ _gnutls_figure_dh_params(gnutls_session_t session, gnutls_dh_params_t dh_params,
cleanup:
if (free_pg) {
_gnutls_mpi_release(&p);
+ _gnutls_mpi_release(&q);
_gnutls_mpi_release(&g);
}
if (params.deinit && params.type == GNUTLS_PARAMS_DH)