summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAnder Juaristi <a@juaristi.eus>2018-02-21 20:11:24 +0100
committerAnder Juaristi <a@juaristi.eus>2018-02-21 20:11:24 +0100
commit99c543532b28068e90657b6043be9f1d1d03c695 (patch)
tree0ac0dffdd630b751ec7e1cb466894c5fb3d92c62
parentf7941bd5d8ca4dec093fc55dd4d47bfb4e196dae (diff)
downloadgnutls-tmp-draft-ietf-tls-tls13-21-ajuaristi-session-resumption.tar.gz
TLS 1.3 - session resumption - Fix RMS storagetmp-draft-ietf-tls-tls13-21-ajuaristi-session-resumption
Signed-off-by: Ander Juaristi <a@juaristi.eus>
-rw-r--r--lib/session_pack.c7
-rw-r--r--lib/tls13/session_ticket.c28
-rw-r--r--lib/tls13/session_ticket.h1
3 files changed, 28 insertions, 8 deletions
diff --git a/lib/session_pack.c b/lib/session_pack.c
index 6bb65b4ba0..aedd44f273 100644
--- a/lib/session_pack.c
+++ b/lib/session_pack.c
@@ -336,16 +336,15 @@ tls13_pack_security_parameters(gnutls_session_t session, gnutls_buffer_st *ps)
BUFFER_APPEND_PFX4(ps,
ticket.ticket_nonce.data,
ticket.ticket_nonce.size);
-
length += (4 + ticket.ticket_nonce.size);
BUFFER_APPEND_PFX4(ps,
ticket.ticket.data,
ticket.ticket.size);
length += (4 + ticket.ticket.size);
BUFFER_APPEND_PFX4(ps,
- session->key.proto.tls13.ap_rms,
- session->key.proto.tls13.temp_secret_size);
- length += (4 + session->key.proto.tls13.temp_secret_size);
+ ticket.rms.data,
+ ticket.rms.size);
+ length += (4 + ticket.rms.size);
/* Overwrite the length field */
_gnutls_write_uint32(length, ps->data + length_pos);
diff --git a/lib/tls13/session_ticket.c b/lib/tls13/session_ticket.c
index cd97f4bf7d..94990ea4cf 100644
--- a/lib/tls13/session_ticket.c
+++ b/lib/tls13/session_ticket.c
@@ -310,7 +310,7 @@ static int generate_session_ticket(gnutls_session_t session, struct tls13_nst_st
struct ticket_st encrypted_ticket;
/* This is the resumption master secret */
const uint8_t *rms = session->key.proto.tls13.ap_rms;
- unsigned rms_len = MAX_HASH_SIZE;
+ unsigned rms_len = session->key.proto.tls13.temp_secret_size;
gnutls_mac_algorithm_t kdf_id;
struct tls13_ticket_data tdata;
@@ -624,6 +624,7 @@ void _gnutls13_session_ticket_destroy(struct tls13_nst_st *ticket)
if (ticket) {
_gnutls_free_datum(&ticket->ticket);
_gnutls_free_datum(&ticket->ticket_nonce);
+ _gnutls_free_datum(&ticket->rms);
memset(ticket, 0, sizeof(struct tls13_nst_st));
}
}
@@ -710,10 +711,21 @@ int _gnutls13_session_ticket_get(gnutls_session_t session, struct tls13_nst_st *
return gnutls_assert_val(ret);
}
- ret = session->internals.tls13_ticket_len;
+ if ((ret = _gnutls_set_datum(&dst->rms,
+ session->key.proto.tls13.ap_rms_original.data,
+ session->key.proto.tls13.ap_rms_original.size)) < 0) {
+ gnutls_assert();
+ goto error;
+ }
+
+ ret = session->internals.tls13_ticket_len + dst->rms.size;
}
return ret;
+
+error:
+ _gnutls13_session_ticket_destroy(dst);
+ return ret;
}
/*
@@ -732,11 +744,19 @@ int _gnutls13_session_ticket_peek(gnutls_session_t session, struct tls13_nst_st
if (!src)
return gnutls_assert_val(GNUTLS_E_INTERNAL_ERROR);
- if (dst)
+ if (dst) {
memcpy(dst, src, sizeof(struct tls13_nst_st));
+ memcpy(&dst->rms, &session->key.proto.tls13.ap_rms_original, sizeof(gnutls_datum_t));
+ }
- ret = session->internals.tls13_ticket_len;
+ ret = session->internals.tls13_ticket_len + session->key.proto.tls13.ap_rms_original.size;
}
return ret;
}
+
+int _gnutls13_session_ticket_unset(gnutls_session_t session)
+{
+ /* TODO implement this */
+ return 0;
+}
diff --git a/lib/tls13/session_ticket.h b/lib/tls13/session_ticket.h
index 7c3a66de83..93e6a7bd58 100644
--- a/lib/tls13/session_ticket.h
+++ b/lib/tls13/session_ticket.h
@@ -28,6 +28,7 @@ struct tls13_nst_st {
uint32_t ticket_age_add;
gnutls_datum_t ticket_nonce;
gnutls_datum_t ticket;
+ gnutls_datum_t rms;
};
struct tls13_ticket_data {