32#ifndef DETERMINISTICESPASYNCWEBSERVER_DTLS_RECORD_H
33#define DETERMINISTICESPASYNCWEBSERVER_DTLS_RECORD_H
45static constexpr uint8_t DTLS_CT_CHANGE_CIPHER_SPEC = 20;
46static constexpr uint8_t DTLS_CT_ALERT = 21;
47static constexpr uint8_t DTLS_CT_HANDSHAKE = 22;
48static constexpr uint8_t DTLS_CT_APPLICATION_DATA = 23;
49static constexpr uint8_t DTLS_CT_ACK = 26;
53static constexpr uint16_t DTLS_LEGACY_VERSION = 0xFEFD;
56static constexpr size_t DTLS_PLAINTEXT_HDR_LEN = 13;
59static constexpr size_t DTLS_TAG_LEN = 16;
64static constexpr size_t DTLS_CID_MAX = 8;
67enum class DtlsCipher : uint8_t
69 AES_128_GCM_SHA256 = 0
93void dtls_record_keys_derive(DtlsRecordKeys *out, DtlsCipher cipher, uint16_t epoch,
const uint8_t secret[32]);
103size_t dtls_plaintext_build(uint8_t content_type, uint16_t epoch, uint64_t seq,
const uint8_t *fragment,
104 size_t frag_len, uint8_t *out,
size_t out_cap);
109 uint8_t content_type;
112 const uint8_t *fragment;
120size_t dtls_plaintext_parse(
const uint8_t *rec,
size_t rec_len, DtlsPlaintext *out);
142size_t dtls_ciphertext_protect(
const DtlsRecordKeys *keys, uint64_t seq, uint8_t content_type,
const uint8_t *plaintext,
143 size_t pt_len, uint8_t *out,
size_t out_cap,
const uint8_t *cid =
nullptr,
149 uint8_t content_type;
172bool dtls_ciphertext_unprotect(
const DtlsRecordKeys *keys, uint64_t next_seq,
const uint8_t *rec,
size_t rec_len,
173 uint8_t *out,
size_t out_cap, DtlsCiphertext *info,
174 const uint8_t *expected_cid =
nullptr,
size_t expected_cid_len = 0);
181struct DtlsReplayWindow
189void dtls_replay_init(DtlsReplayWindow *w);
195bool dtls_replay_check(
const DtlsReplayWindow *w, uint64_t seq);
198void dtls_replay_mark(DtlsReplayWindow *w, uint64_t seq);
User-facing configuration for DeterministicESPAsyncWebServer.