]> git.ipfire.org Git - thirdparty/gnutls.git/commitdiff
handshake: ffdhe flags merged with handshake flags
authorNikos Mavrogiannopoulos <nmav@redhat.com>
Tue, 7 Nov 2017 15:25:31 +0000 (16:25 +0100)
committerNikos Mavrogiannopoulos <nmav@redhat.com>
Mon, 19 Feb 2018 14:29:36 +0000 (15:29 +0100)
Signed-off-by: Nikos Mavrogiannopoulos <nmav@redhat.com>
lib/algorithms/ciphersuites.c
lib/auth/dh_common.c
lib/dh.c
lib/ext/ecc.c
lib/gnutls_int.h
lib/state.c

index d417da3b25399fe3d4f5b7a8f6f458c52bc727bb..a541925029f94c43f59e8f163cd0d781be91d8d5 100644 (file)
@@ -1246,7 +1246,7 @@ check_server_dh_params(gnutls_session_t session,
                return 1;
        }
 
-       if (session->internals.have_ffdhe) {
+       if (session->internals.hsk_flags & HSK_HAVE_FFDHE) {
                /* if the client has advertized FFDHE then it doesn't matter
                 * whether we have server DH parameters. They are no good. */
                gnutls_assert();
@@ -1548,7 +1548,8 @@ _gnutls_figure_common_ciphersuite(gnutls_session_t session,
         * we must also distinguish between not matching a ciphersuite due to an
         * incompatible certificate which we traditionally return GNUTLS_E_INSUFFICIENT_SECURITY.
         */
-       if (!no_cert_found && session->internals.have_ffdhe && session->internals.priorities->groups.have_ffdhe)
+       if (!no_cert_found && (session->internals.hsk_flags & HSK_HAVE_FFDHE) &&
+           session->internals.priorities->groups.have_ffdhe)
                return gnutls_assert_val(GNUTLS_E_INSUFFICIENT_SECURITY);
        else
                return gnutls_assert_val(GNUTLS_E_NO_CIPHER_SUITES);
index 659921dfdf5c7ed907e371c748eeade7c52e3501..6e11d9ff7ded7b274dbc6438370a2d945f7eb219 100644 (file)
@@ -190,8 +190,6 @@ _gnutls_proc_dh_common_server_kx(gnutls_session_t session,
        unsigned j;
        ssize_t data_size = _data_size;
 
-       session->internals.used_ffdhe = 0;
-
        /* just in case we are resuming a session */
        gnutls_pk_params_release(&session->key.dh_params);
 
@@ -244,14 +242,14 @@ _gnutls_proc_dh_common_server_kx(gnutls_session_t session,
                            memcmp(session->internals.priorities->groups.entry[j]->prime->data,
                                   data_p, n_p) == 0) {
 
-                               session->internals.used_ffdhe = 1;
+                               session->internals.hsk_flags |= HSK_USED_FFDHE;
                                _gnutls_session_group_set(session, session->internals.priorities->groups.entry[j]);
                                session->key.dh_params.qbits = *session->internals.priorities->groups.entry[j]->q_bits;
                                break;
                        }
                }
 
-               if (!session->internals.used_ffdhe) {
+               if (!(session->internals.hsk_flags & HSK_USED_FFDHE)) {
                        _gnutls_audit_log(session, "FFDHE groups advertised, but server didn't support it; falling back to server's choice\n");
                }
        }
@@ -271,7 +269,7 @@ _gnutls_proc_dh_common_server_kx(gnutls_session_t session,
        session->key.dh_params.params_nr = 3; /* include empty q */
        session->key.dh_params.algo = GNUTLS_PK_DH;
 
-       if (session->internals.used_ffdhe == 0) {
+       if (!(session->internals.hsk_flags & HSK_USED_FFDHE)) {
                bits = _gnutls_dh_get_min_prime_bits(session);
                if (bits < 0) {
                        gnutls_assert();
index e265d1e3d082c0c8ed6a4b1003aa48a964c17ccb..1cec637d2486ed28cc674e37d794a7597df76b52 100644 (file)
--- a/lib/dh.c
+++ b/lib/dh.c
@@ -79,7 +79,6 @@ _gnutls_figure_dh_params(gnutls_session_t session, gnutls_dh_params_t dh_params,
        group = get_group(session);
 
        params.deinit = 0;
-       session->internals.used_ffdhe = 0;
 
        /* if we negotiated RFC7919 FFDHE */
        if (group && group->pk == GNUTLS_PK_DH) {
@@ -101,7 +100,7 @@ _gnutls_figure_dh_params(gnutls_session_t session, gnutls_dh_params_t dh_params,
                                        goto cleanup;
                                }
 
-                               session->internals.used_ffdhe = 1;
+                               session->internals.hsk_flags |= HSK_USED_FFDHE;
                                q_bits = *session->internals.priorities->groups.entry[i]->q_bits;
                                goto finished;
                        }
index 797046bb2f0539f83ea58e69fd79e9f466bba8ed..58cf3d86b232a8543271c3278439f348f78dc985 100644 (file)
@@ -179,7 +179,8 @@ _gnutls_supported_ecc_recv_params(gnutls_session_t session,
                        }
                }
 
-               session->internals.have_ffdhe = have_ffdhe;
+               if (have_ffdhe)
+                       session->internals.hsk_flags |= HSK_HAVE_FFDHE;
        }
 
        return 0;
index 750da73ad6074e8bed801978589197d1be20f30c..0956a9915130f8a076e1fd102fe7c4135c262c83 100644 (file)
@@ -1146,6 +1146,8 @@ typedef struct {
 #define HSK_CRT_REQ_GOT_SIG_ALGO (1<<6)
 #define HSK_KEY_UPDATE_ASKED (1<<7) /* flag is not used during handshake */
 #define HSK_FALSE_START_USED (1<<8) /* TLS1.2 only */
+#define HSK_HAVE_FFDHE (1<<9) /* whether the peer has advertized at least an FFDHE group */
+#define HSK_USED_FFDHE (1<<10) /* whether ffdhe was actually negotiated and used */
        unsigned hsk_flags;
        time_t last_key_update;
 
@@ -1224,10 +1226,6 @@ typedef struct {
         * receive size */
        unsigned max_recv_size;
 
-       /* whether the peer has advertized at least an FFDHE group */
-       bool have_ffdhe;
-       bool used_ffdhe; /* whether ffdhe was actually negotiated and used */
-
        /* candidate groups to be selected for security params groups */
        const gnutls_group_entry_st *cand_ec_group;
        const gnutls_group_entry_st *cand_dh_group;
index 8bd81b8c48ad09d99d8bc3f9292c8c41927d0af9..2b2fcb3b14c345e22584b4e643e07b5dd13c5e44 100644 (file)
@@ -219,7 +219,6 @@ static void handshake_internal_state_clear1(gnutls_session_t session)
        session->internals.dtls.hsk_read_seq = 0;
        session->internals.dtls.hsk_write_seq = 0;
 
-       session->internals.have_ffdhe = 0;
        session->internals.cand_ec_group = 0;
        session->internals.cand_dh_group = 0;
 
@@ -1296,7 +1295,7 @@ unsigned gnutls_session_get_flags(gnutls_session_t session)
                flags |= GNUTLS_SFLAGS_HB_PEER_SEND;
        if (session->internals.hsk_flags & HSK_FALSE_START_USED)
                flags |= GNUTLS_SFLAGS_FALSE_START;
-       if (session->internals.used_ffdhe)
+       if (session->internals.hsk_flags & HSK_USED_FFDHE)
                flags |= GNUTLS_SFLAGS_RFC7919;
 
        return flags;