int _gnutls_check_resumed_params(gnutls_session_t session)
{
- if (session->internals.resumed_security_parameters.ext_master_secret !=
- session->security_parameters.ext_master_secret)
- return gnutls_assert_val(GNUTLS_E_INVALID_SESSION);
-
- if (!_gnutls_server_name_matches_resumed(session))
- return gnutls_assert_val(GNUTLS_E_INVALID_SESSION);
+ time_t timestamp = gnutls_time(0);
+ const version_entry_st *vers;
+
+ /* check whether the session is expired */
+ if (timestamp -
+ session->internals.resumed_security_parameters.timestamp >
+ session->internals.expire_time
+ || session->internals.resumed_security_parameters.timestamp >
+ timestamp)
+ return gnutls_assert_val(GNUTLS_E_EXPIRED);
+
+ /* check various parameters applicable to resumption in TLS1.2 or earlier
+ */
+ vers = get_version(session);
+ if (!vers || !vers->tls13_sem) {
+ if (session->internals.resumed_security_parameters.ext_master_secret !=
+ session->security_parameters.ext_master_secret)
+ return gnutls_assert_val(GNUTLS_E_INVALID_SESSION);
+
+ if (!_gnutls_server_name_matches_resumed(session))
+ return gnutls_assert_val(GNUTLS_E_INVALID_SESSION);
+ }
return 0;
}
return GNUTLS_E_INVALID_SESSION;
}
- /* expiration check is performed inside */
ret = gnutls_session_set_data(session, data.data, data.size);
gnutls_free(data.data);
return ret;
}
+ /* expiration check is performed inside */
ret = _gnutls_check_resumed_params(session);
if (ret < 0)
return gnutls_assert_val(ret);
unpack_session(gnutls_session_t session, const gnutls_datum_t *state)
{
int ret;
- time_t timestamp = gnutls_time(0);
if (unlikely(!state))
return gnutls_assert_val(GNUTLS_E_INTERNAL_ERROR);
if (ret < 0)
return gnutls_assert_val(ret);
- if (timestamp -
- session->internals.resumed_security_parameters.timestamp >
- session->internals.expire_time
- || session->internals.resumed_security_parameters.timestamp >
- timestamp)
- return gnutls_assert_val(GNUTLS_E_EXPIRED);
-
ret = _gnutls_check_resumed_params(session);
if (ret < 0)
return gnutls_assert_val(ret);
session->internals.resumed_security_parameters.timestamp =
timestamp;
- timestamp = gnutls_time(0);
-
BUFFER_POP_NUM(ps,
session->internals.resumed_security_parameters.
entity);
}
}
- if (timestamp -
- session->internals.resumed_security_parameters.timestamp >
- session->internals.expire_time
- || session->internals.resumed_security_parameters.timestamp >
- timestamp) {
- gnutls_assert();
- return GNUTLS_E_EXPIRED;
- }
-
ret = 0;
error:
#include "auth/cert.h"
#include "tls13/session_ticket.h"
#include "session_pack.h"
+#include "db.h"
static int
pack_ticket(gnutls_session_t session, tls13_ticket_t *ticket, gnutls_datum_t *packed)
/* Return ticket parameters */
ret = unpack_ticket(session, &decrypted, ticket_data);
_gnutls_free_datum(&decrypted);
- if (ret < 0) {
+ if (ret < 0)
return ret;
- }
+
+ ret = _gnutls_check_resumed_params(session);
+ if (ret < 0)
+ return gnutls_assert_val(ret);
return 0;
}