32#ifndef PROTOCORE_DTLS_RECORD_H
33#define PROTOCORE_DTLS_RECORD_H
46#define PC_DTLS_CT_CHANGE_CIPHER_SPEC 20
47#define PC_DTLS_CT_ALERT 21
48#define PC_DTLS_CT_HANDSHAKE 22
49#define PC_DTLS_CT_APPLICATION_DATA 23
50#define PC_DTLS_CT_ACK 26
54#define PC_DTLS_LEGACY_VERSION 0xFEFD
57#define PC_DTLS_PLAINTEXT_HDR_LEN 13
60#define PC_DTLS_TAG_LEN 16
65#define PC_DTLS_CID_MAX 8
68enum class DtlsCipher : uint8_t
70 AES_128_GCM_SHA256 = 0
97void pc_dtls_record_keys_derive(DtlsRecordKeys *out, DtlsCipher cipher, uint16_t epoch,
const uint8_t secret[32]);
107size_t pc_dtls_plaintext_build(uint8_t content_type, uint16_t epoch, uint64_t seq,
const uint8_t *fragment,
108 size_t frag_len, uint8_t *out,
size_t out_cap);
113 uint8_t content_type;
116 const uint8_t *fragment;
124size_t pc_dtls_plaintext_parse(
const uint8_t *rec,
size_t rec_len, DtlsPlaintext *out);
146size_t pc_dtls_ciphertext_protect(DtlsRecordKeys &keys, uint64_t seq, uint8_t content_type,
const uint8_t *plaintext,
147 size_t pt_len, uint8_t *out,
size_t out_cap,
const uint8_t *cid =
nullptr,
153 uint8_t content_type;
176bool pc_dtls_ciphertext_unprotect(DtlsRecordKeys &keys, uint64_t next_seq,
const uint8_t *rec,
size_t rec_len,
177 uint8_t *out,
size_t out_cap, DtlsCiphertext *info,
178 const uint8_t *expected_cid =
nullptr,
size_t expected_cid_len = 0);
185struct DtlsReplayWindow
193void pc_dtls_replay_init(DtlsReplayWindow *w);
199bool pc_dtls_replay_check(
const DtlsReplayWindow *w, uint64_t seq);
202void pc_dtls_replay_mark(DtlsReplayWindow *w, uint64_t seq);
AES-128 block cipher + AEAD_AES_128_GCM (RFC 5116 / NIST SP 800-38D).
User-facing configuration for ProtoCore.
#define PC_WORK_AES128GCM