summaryrefslogtreecommitdiff
path: root/lib/state.c
diff options
context:
space:
mode:
authorNikos Mavrogiannopoulos <nmav@redhat.com>2017-11-08 13:13:31 +0100
committerNikos Mavrogiannopoulos <nmav@redhat.com>2018-02-19 15:29:36 +0100
commit1b12320a6938d327b07fc3c1e48ea6fe03d59a9b (patch)
tree9791f6bc4e1c559f949b7d12bdf58ae282bda02d /lib/state.c
parentdcf2a8d3bd69ed0b994bed1753fe47a83366786e (diff)
downloadgnutls-1b12320a6938d327b07fc3c1e48ea6fe03d59a9b.tar.gz
session state: TLS1.2 and TLS1.3 state is stored as union
That is, to reduce memory usage as these protocol cannot be used in parallel. Relates: #281 Signed-off-by: Nikos Mavrogiannopoulos <nmav@redhat.com>
Diffstat (limited to 'lib/state.c')
-rw-r--r--lib/state.c61
1 files changed, 38 insertions, 23 deletions
diff --git a/lib/state.c b/lib/state.c
index 79353b5c87..708f7649c7 100644
--- a/lib/state.c
+++ b/lib/state.c
@@ -169,33 +169,45 @@ gnutls_compression_get(gnutls_session_t session)
static void deinit_keys(gnutls_session_t session)
{
- gnutls_pk_params_release(&session->key.proto.tls12.ecdh.params);
- gnutls_pk_params_release(&session->key.proto.tls12.dh.params);
+ const version_entry_st *vers = get_version(session);
- gnutls_pk_params_release(&session->key.proto.kshare.ecdhx_params);
- gnutls_pk_params_release(&session->key.proto.kshare.ecdh_params);
- gnutls_pk_params_release(&session->key.proto.kshare.dh_params);
-
- zrelease_temp_mpi_key(&session->key.proto.tls12.ecdh.x);
- zrelease_temp_mpi_key(&session->key.proto.tls12.ecdh.y);
- _gnutls_free_temp_key_datum(&session->key.proto.tls12.ecdh.raw);
-
- zrelease_temp_mpi_key(&session->key.proto.tls12.dh.client_Y);
-
- /* SRP */
- zrelease_temp_mpi_key(&session->key.proto.tls12.srp.srp_p);
- zrelease_temp_mpi_key(&session->key.proto.tls12.srp.srp_g);
- zrelease_temp_mpi_key(&session->key.proto.tls12.srp.srp_key);
+ if (vers == NULL)
+ return;
- zrelease_temp_mpi_key(&session->key.proto.tls12.srp.u);
- zrelease_temp_mpi_key(&session->key.proto.tls12.srp.a);
- zrelease_temp_mpi_key(&session->key.proto.tls12.srp.x);
- zrelease_temp_mpi_key(&session->key.proto.tls12.srp.A);
- zrelease_temp_mpi_key(&session->key.proto.tls12.srp.B);
- zrelease_temp_mpi_key(&session->key.proto.tls12.srp.b);
+ gnutls_pk_params_release(&session->key.kshare.ecdhx_params);
+ gnutls_pk_params_release(&session->key.kshare.ecdh_params);
+ gnutls_pk_params_release(&session->key.kshare.dh_params);
+
+ if (!vers->tls13_sem) {
+ gnutls_pk_params_release(&session->key.proto.tls12.ecdh.params);
+ gnutls_pk_params_release(&session->key.proto.tls12.dh.params);
+ zrelease_temp_mpi_key(&session->key.proto.tls12.ecdh.x);
+ zrelease_temp_mpi_key(&session->key.proto.tls12.ecdh.y);
+ _gnutls_free_temp_key_datum(&session->key.proto.tls12.ecdh.raw);
+
+ zrelease_temp_mpi_key(&session->key.proto.tls12.dh.client_Y);
+
+ /* SRP */
+ zrelease_temp_mpi_key(&session->key.proto.tls12.srp.srp_p);
+ zrelease_temp_mpi_key(&session->key.proto.tls12.srp.srp_g);
+ zrelease_temp_mpi_key(&session->key.proto.tls12.srp.srp_key);
+
+ zrelease_temp_mpi_key(&session->key.proto.tls12.srp.u);
+ zrelease_temp_mpi_key(&session->key.proto.tls12.srp.a);
+ zrelease_temp_mpi_key(&session->key.proto.tls12.srp.x);
+ zrelease_temp_mpi_key(&session->key.proto.tls12.srp.A);
+ zrelease_temp_mpi_key(&session->key.proto.tls12.srp.B);
+ zrelease_temp_mpi_key(&session->key.proto.tls12.srp.b);
+ } else {
+ gnutls_memset(session->key.proto.tls13.temp_secret, 0,
+ sizeof(session->key.proto.tls13.temp_secret));
+ gnutls_memset(session->key.proto.tls13.hs_ckey, 0,
+ sizeof(session->key.proto.tls13.hs_ckey));
+ gnutls_memset(session->key.proto.tls13.hs_skey, 0,
+ sizeof(session->key.proto.tls13.hs_skey));
+ }
_gnutls_free_temp_key_datum(&session->key.key);
- _gnutls_free_temp_key_datum(&session->key.key);
}
/* An internal version of _gnutls_handshake_internal_state_clear(),
@@ -435,6 +447,9 @@ void gnutls_deinit(gnutls_session_t session)
/* we rely on priorities' internal reference counting */
gnutls_priority_deinit(session->internals.priorities);
+ /* overwrite any temp TLS1.3 keys */
+ gnutls_memset(&session->key.proto, 0, sizeof(session->key.proto));
+
gnutls_free(session);
}