summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorFrantisek Krenzelok <krenzelok.frantisek@gmail.com>2023-01-06 12:24:47 +0100
committerFrantisek Krenzelok <krenzelok.frantisek@gmail.com>2023-02-20 16:32:13 +0100
commitcaf3be8fdb3fe115406b5523633bf6ffdc8bb615 (patch)
tree5b88440212dd70d98e28525184a4d8383bfcc4c2
parent38cf20c60222bed755f46aebe15bf8632d669662 (diff)
downloadgnutls-caf3be8fdb3fe115406b5523633bf6ffdc8bb615.tar.gz
DTLS1_3: Omit header fields transcript
DTLS1.3 only Signed-off-by: Frantisek Krenzelok <krenzelok.frantisek@gmail.com>
-rw-r--r--lib/cipher.c9
-rw-r--r--lib/handshake.c54
2 files changed, 61 insertions, 2 deletions
diff --git a/lib/cipher.c b/lib/cipher.c
index ab697db96b..eb032dd37f 100644
--- a/lib/cipher.c
+++ b/lib/cipher.c
@@ -881,8 +881,13 @@ decrypt_packet_tls13(gnutls_session_t session,
}
aad[0] = GNUTLS_APPLICATION_DATA;
- aad[1] = 0x03;
- aad[2] = 0x03;
+ if (session->internals.transport == GNUTLS_STREAM) {
+ aad[1] = 0x03;
+ aad[2] = 0x03;
+ } else {
+ aad[1] = 0xfe;
+ aad[2] = 0xfc;
+ }
_gnutls_write_uint16(ciphertext->size, &aad[3]);
ret = gnutls_aead_cipher_decrypt(&params->read.ctx.aead,
diff --git a/lib/handshake.c b/lib/handshake.c
index 1633157230..72f531da13 100644
--- a/lib/handshake.c
+++ b/lib/handshake.c
@@ -1471,6 +1471,7 @@ handshake_hash_add_recvd(gnutls_session_t session,
{
int ret;
const version_entry_st *vers = get_version(session);
+ const version_entry_st *max = _gnutls_version_max(session);
if (unlikely(vers == NULL))
return gnutls_assert_val(GNUTLS_E_INTERNAL_ERROR);
@@ -1486,6 +1487,30 @@ handshake_hash_add_recvd(gnutls_session_t session,
session->internals.handshake_hash_buffer.length;
if (vers->id != GNUTLS_DTLS0_9) {
+ if (max->id >= GNUTLS_DTLS1_3) {
+ /* DTLS 1.3 doesn't include message_seq, fragment_offset, and
+ * fragment_length.
+ */
+ if (header_size < 4) {
+ gnutls_assert();
+ return GNUTLS_E_INTERNAL_ERROR;
+ }
+ ret = _gnutls_buffer_append_data(&session->internals.
+ handshake_hash_buffer,
+ header, 4);
+ if (ret < 0) {
+ return gnutls_assert_val(ret);
+ }
+ header_size -= 4;
+ header += 4;
+
+ if (header_size < 8) {
+ gnutls_assert();
+ return GNUTLS_E_INTERNAL_ERROR;
+ }
+ header_size -= 8;
+ header += 8;
+ }
ret =
_gnutls_buffer_append_data(&session->internals.
handshake_hash_buffer,
@@ -1530,6 +1555,7 @@ handshake_hash_add_sent(gnutls_session_t session,
{
int ret;
const version_entry_st *vers = get_version(session);
+ const version_entry_st *max = _gnutls_version_max(session);
if (unlikely(vers == NULL))
return gnutls_assert_val(GNUTLS_E_INTERNAL_ERROR);
@@ -1550,6 +1576,34 @@ handshake_hash_add_sent(gnutls_session_t session,
if (datalen == 0)
return 0;
+ } else if (max->id >= GNUTLS_DTLS1_3) {
+ /* DTLS 1.3 doesn't include message_seq, fragment_offset, and
+ * fragment_length.
+ */
+ if (datalen < 4) {
+ gnutls_assert();
+ return GNUTLS_E_INTERNAL_ERROR;
+ }
+
+ ret = _gnutls_buffer_append_data(&session->internals.
+ handshake_hash_buffer,
+ dataptr, 4);
+ if (ret < 0) {
+ return gnutls_assert_val(ret);
+ }
+ dataptr += 4;
+ datalen -= 4;
+
+ if (datalen < 8) {
+ gnutls_assert();
+ return GNUTLS_E_INTERNAL_ERROR;
+ }
+ dataptr += 8;
+ datalen -= 8;
+
+ if (datalen == 0) {
+ return 0;
+ }
}
ret =