]> git.ipfire.org Git - thirdparty/gnutls.git/commitdiff
handshake: simplify by storing a pointer to PRF mac entry
authorNikos Mavrogiannopoulos <nmav@redhat.com>
Thu, 14 Sep 2017 12:03:43 +0000 (14:03 +0200)
committerNikos Mavrogiannopoulos <nmav@redhat.com>
Mon, 19 Feb 2018 14:29:33 +0000 (15:29 +0100)
That way, we avoid multiple function calls to obtain information
such as hash size, and other MAC properties.

Signed-off-by: Nikos Mavrogiannopoulos <nmav@redhat.com>
lib/constate.c
lib/gnutls_int.h
lib/handshake.c
lib/prf.c
lib/secrets.c
lib/state.h

index 2b5211ac52986da6c99310ac435c688c50110ede..0f5c4f97d6d1e7dd5070b1bfbf33f631c4af0156 100644 (file)
@@ -248,9 +248,9 @@ _gnutls_set_cipher_suite2(gnutls_session_t session,
                if (cs->prf == GNUTLS_MAC_UNKNOWN ||
                    _gnutls_mac_is_ok(mac_to_entry(cs->prf)) == 0)
                        return gnutls_assert_val(GNUTLS_E_UNWANTED_ALGORITHM);
-               session->security_parameters.prf_mac = cs->prf;
+               session->security_parameters.prf = mac_to_entry(cs->prf);
        } else {
-               session->security_parameters.prf_mac = GNUTLS_MAC_MD5_SHA1;
+               session->security_parameters.prf = mac_to_entry(GNUTLS_MAC_MD5_SHA1);
        }
 
        session->security_parameters.cs = cs;
index 5676f72a5625764a7ff43f9d62f808e7b005b779..980b0ddfe20bbbac2f11fe8fb8ad136a91956ab3 100644 (file)
@@ -598,7 +598,8 @@ typedef struct {
 
        /* This is kept outside the ciphersuite entry as on certain
         * TLS versions we need a separate PRF MAC, i.e., MD5_SHA1. */
-       gnutls_mac_algorithm_t prf_mac;
+       const mac_entry_st *prf;
+
        uint8_t master_secret[GNUTLS_MASTER_SIZE];
        uint8_t client_random[GNUTLS_RANDOM_SIZE];
        uint8_t server_random[GNUTLS_RANDOM_SIZE];
@@ -636,7 +637,7 @@ typedef struct {
        uint8_t etm;
 
        /* Note: if you add anything in Security_Parameters struct, then
-        * also modify CPY_COMMON in gnutls_constate.c, and gnutls_session_pack.c,
+        * also modify CPY_COMMON in constate.c, and session_pack.c,
         * in order to save it in the session storage.
         */
 
index da1e24068aee4b4399776d1ba0c801f2b7bf7aee..cfaa290505a0fbb49d24fa45ea9a008a157ff54f 100644 (file)
@@ -334,7 +334,7 @@ _gnutls_finished(gnutls_session_t session, int type, void *ret,
        else
                len = session->internals.handshake_hash_buffer_prev_len;
 
-       algorithm = session->security_parameters.prf_mac;
+       algorithm = session->security_parameters.prf->id;
        rc = _gnutls_hash_fast(algorithm,
                               session->internals.
                               handshake_hash_buffer.data, len,
@@ -342,7 +342,7 @@ _gnutls_finished(gnutls_session_t session, int type, void *ret,
        if (rc < 0)
                return gnutls_assert_val(rc);
 
-       hash_len = _gnutls_hash_get_algo_len(mac_to_entry(algorithm));
+       hash_len = session->security_parameters.prf->output_size;
 
        if (type == GNUTLS_SERVER) {
                mesg = SERVER_MSG;
@@ -3125,7 +3125,6 @@ int _gnutls_handshake_get_session_hash(gnutls_session_t session, gnutls_datum_t
 {
        const version_entry_st *ver = get_version(session);
        int ret;
-       const mac_entry_st *me;
        uint8_t concat[2*MAX_HASH_SIZE];
 
        if (unlikely(ver == NULL))
@@ -3137,12 +3136,8 @@ int _gnutls_handshake_get_session_hash(gnutls_session_t session, gnutls_datum_t
                        return gnutls_assert_val(GNUTLS_E_INTERNAL_ERROR);
        }
 
-       me = mac_to_entry(session->security_parameters.prf_mac);
-       if (me == NULL)
-               return gnutls_assert_val(GNUTLS_E_INTERNAL_ERROR);
-
        ret =
-           _gnutls_hash_fast((gnutls_digest_algorithm_t)me->id,
+           _gnutls_hash_fast((gnutls_digest_algorithm_t)session->security_parameters.prf->id,
                              session->internals.handshake_hash_buffer.
                              data,
                              session->internals.handshake_hash_buffer_client_kx_len,
@@ -3150,5 +3145,5 @@ int _gnutls_handshake_get_session_hash(gnutls_session_t session, gnutls_datum_t
        if (ret < 0)
                return gnutls_assert_val(ret);
 
-       return _gnutls_set_datum(shash, concat, me->output_size);
+       return _gnutls_set_datum(shash, concat, session->security_parameters.prf->output_size);
 }
index d73e3402f193d39eccea01cb2cdb792ce037f325..7ac1090d92651ad1264790fa26d686102a46fc27 100644 (file)
--- a/lib/prf.c
+++ b/lib/prf.c
@@ -69,7 +69,7 @@ gnutls_prf_raw(gnutls_session_t session,
 {
        int ret;
 
-       ret = _gnutls_prf_raw(session->security_parameters.prf_mac,
+       ret = _gnutls_prf_raw(session->security_parameters.prf->id,
                          GNUTLS_MASTER_SIZE, session->security_parameters.master_secret,
                          label_size, label,
                          seed_size, (uint8_t *) seed,
@@ -210,7 +210,7 @@ gnutls_prf(gnutls_session_t session,
        }
 
        ret =
-           _gnutls_prf_raw(session->security_parameters.prf_mac,
+           _gnutls_prf_raw(session->security_parameters.prf->id,
                        GNUTLS_MASTER_SIZE, session->security_parameters.master_secret,
                        label_size, label,
                        seedsize, seed,
index adffd8b6bb0f00135958f8601d7aa95100f96f7b..f5a34336957f9b1b6dac3a782550b07bc4301b05 100644 (file)
@@ -34,7 +34,7 @@ int _tls13_init_secret(gnutls_session_t session, const uint8_t *psk, size_t psk_
 {
        char buf[128];
 
-       session->key.temp_secret_size = gnutls_hmac_get_len(session->security_parameters.prf_mac);
+       session->key.temp_secret_size = session->security_parameters.prf->output_size;
 
        /* when no PSK, use the zero-value */
        if (psk == NULL) {
@@ -46,7 +46,7 @@ int _tls13_init_secret(gnutls_session_t session, const uint8_t *psk, size_t psk_
                psk = (uint8_t*)buf;
        }
 
-       return gnutls_hmac_fast(session->security_parameters.prf_mac,
+       return gnutls_hmac_fast(session->security_parameters.prf->id,
                                "", 0,
                                psk, psk_size,
                                session->key.temp_secret);
@@ -55,7 +55,7 @@ int _tls13_init_secret(gnutls_session_t session, const uint8_t *psk, size_t psk_
 /* HKDF-Extract(Prev-Secret, key) */
 int _tls13_update_secret(gnutls_session_t session, const uint8_t *key, size_t key_size)
 {
-       return gnutls_hmac_fast(session->security_parameters.prf_mac,
+       return gnutls_hmac_fast(session->security_parameters.prf->id,
                                session->key.temp_secret, session->key.temp_secret_size,
                                key, key_size,
                                session->key.temp_secret);
@@ -71,12 +71,12 @@ int _tls13_expand_hash_secret(gnutls_session_t session,
 {
        uint8_t digest[MAX_HASH_SIZE];
        int ret;
-       unsigned digest_size = gnutls_hmac_get_len(session->security_parameters.prf_mac);
+       unsigned digest_size = session->security_parameters.prf->output_size;
 
        if (unlikely(label_size >= sizeof(digest)))
                return gnutls_assert_val(GNUTLS_E_INVALID_REQUEST);
 
-       ret = gnutls_hash_fast((gnutls_digest_algorithm_t)session->security_parameters.prf_mac,
+       ret = gnutls_hash_fast((gnutls_digest_algorithm_t)session->security_parameters.prf->id,
                                tbh, tbh_size, digest);
        if (ret < 0)
                return gnutls_assert_val(ret);
@@ -120,7 +120,7 @@ int _tls13_expand_secret(gnutls_session_t session,
                goto cleanup;
        }
 
-       switch(session->security_parameters.prf_mac) {
+       switch(session->security_parameters.prf->id) {
        case GNUTLS_MAC_SHA256:{
                struct hmac_sha256_ctx ctx;
 
index 253af0e17c19cdb273215b377434fd7a74402bf6..712b5d747f0eac5e1209858d94824735ecca3616 100644 (file)
@@ -92,7 +92,7 @@ _gnutls_PRF(gnutls_session_t session,
            const char *label, int label_size, const uint8_t * seed,
            int seed_size, int total_bytes, void *ret)
 {
-       return _gnutls_prf_raw(session->security_parameters.prf_mac,
+       return _gnutls_prf_raw(session->security_parameters.prf->id,
                               secret_size, secret,
                               label_size, label,
                               seed_size, seed,