/* * Copyright 2026 The OpenSSL Project Authors. All Rights Reserved. * * Licensed under the Apache License 2.0 (the "License"). You may not use * this file except in compliance with the License. You can obtain a copy * in the file LICENSE in the source distribution or at * https://www.openssl.org/source/license.html */ #include "ssl_local.h" /* * RFC 9147 ยง5.2: strip msg_seq, fragment_offset, and fragment_length from * each DTLS handshake message header before feeding into the transcript hash. * Used by both ssl3_finish_mac and tls13_change_cipher_state. */ int dtls13_transcript_hash_update(EVP_MD_CTX *mdctx, const unsigned char *buf, size_t len) { while (len > 0) { PACKET hmhdr; unsigned long hmbodylen; unsigned int msgtype; size_t hmhdrlen; if (!ossl_assert(len >= SSL3_HM_HEADER_LENGTH) || !PACKET_buf_init(&hmhdr, buf, SSL3_HM_HEADER_LENGTH) || !PACKET_get_1(&hmhdr, &msgtype) || !PACKET_get_net_3(&hmhdr, &hmbodylen)) return 0; hmhdrlen = (msgtype == SSL3_MT_MESSAGE_HASH) ? SSL3_HM_HEADER_LENGTH : DTLS1_HM_HEADER_LENGTH; if (!ossl_assert(hmhdrlen + hmbodylen <= len) || !EVP_DigestUpdate(mdctx, buf, SSL3_HM_HEADER_LENGTH) || !EVP_DigestUpdate(mdctx, buf + hmhdrlen, hmbodylen)) return 0; buf += hmhdrlen + hmbodylen; len -= hmhdrlen + hmbodylen; } return 1; }