diff options
author | Nikos Mavrogiannopoulos <nmav@redhat.com> | 2017-11-08 13:13:31 +0100 |
---|---|---|
committer | Nikos Mavrogiannopoulos <nmav@redhat.com> | 2018-02-19 15:29:36 +0100 |
commit | 1b12320a6938d327b07fc3c1e48ea6fe03d59a9b (patch) | |
tree | 9791f6bc4e1c559f949b7d12bdf58ae282bda02d /lib/state.c | |
parent | dcf2a8d3bd69ed0b994bed1753fe47a83366786e (diff) | |
download | gnutls-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.c | 61 |
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); } |