27#ifndef PROTOCORE_TLS13_MSG_H
28#define PROTOCORE_TLS13_MSG_H
35#if (PC_ENABLE_HTTP3 || PC_ENABLE_DTLS)
43 static constexpr uint8_t TLS_HS_CLIENT_HELLO = 1;
44 static constexpr uint8_t TLS_HS_SERVER_HELLO = 2;
45 static constexpr uint8_t TLS_HS_ENCRYPTED_EXTENSIONS = 8;
46 static constexpr uint8_t TLS_HS_CERTIFICATE = 11;
47 static constexpr uint8_t TLS_HS_CERTIFICATE_VERIFY = 15;
48 static constexpr uint8_t TLS_HS_FINISHED = 20;
51#define TLS_CIPHER_AES_128_GCM_SHA256 0x1301
52#define TLS_GROUP_X25519 0x001d
53#define TLS_GROUP_X25519MLKEM768 0x11ec
54#define TLS_SIG_ED25519 0x0807
55#define TLS_CERT_TYPE_X509 0
56#define TLS_CERT_TYPE_RAW_PUBLIC_KEY 2
57#define TLS_VERSION_1_3 0x0304
58#define PC_TLS_VERSION_DTLS_1_3 0xFEFC
59#define PC_TLS_LEGACY_VERSION_DTLS 0xFEFD
60#define TLS_EXT_QUIC_TRANSPORT_PARAMS 0x0039
63struct Tls13ClientHello
65 const uint8_t *session_id;
66 uint8_t session_id_len;
67 uint8_t client_x25519[32];
70 bool offers_x25519mlkem768;
71 bool has_hybrid_share;
72 const uint8_t *client_mlkem_ek;
78 bool offers_rpk_server_cert;
81 const uint8_t *pc_quic_tp;
82 size_t pc_quic_tp_len;
85 const uint8_t *cookie;
88 const uint8_t *conn_id;
100bool pc_tls13_parse_client_hello(
const uint8_t *msg,
size_t len, Tls13ClientHello *out,
bool dtls =
false);
118size_t pc_tls13_build_server_hello(uint8_t *out,
size_t cap,
const uint8_t random[32],
const uint8_t *session_id,
119 uint8_t session_id_len,
const uint8_t *share,
size_t share_len = 32,
120 uint16_t group = TLS_GROUP_X25519,
bool dtls =
false,
121 const uint8_t *conn_id =
nullptr,
size_t conn_id_len = 0);
131size_t pc_tls13_build_encrypted_extensions(uint8_t *out,
size_t cap,
const uint8_t *pc_quic_tp,
size_t pc_quic_tp_len,
132 bool rpk_server_cert =
false);
138size_t pc_tls13_build_certificate(uint8_t *out,
size_t cap,
const uint8_t *cert_der,
size_t cert_len);
141#define PC_TLS13_ED25519_SPKI_LEN 44
148size_t pc_tls13_ed25519_spki(uint8_t *out,
size_t cap,
const uint8_t pub[32]);
155size_t pc_tls13_build_certificate_rpk(uint8_t *out,
size_t cap,
const uint8_t ed25519_pub[32]);
169size_t pc_tls13_build_cert_verify(uint8_t *out,
size_t cap,
const uint8_t transcript_hash[32],
const uint8_t seed[32]);
175size_t pc_tls13_build_finished(uint8_t *out,
size_t cap,
const uint8_t verify_data[32]);
184size_t pc_tls13_cert_verify_content(uint8_t *out,
size_t cap,
const uint8_t transcript_hash[32],
bool is_server);
192extern const uint8_t pc_tls13_hrr_random[32];
206size_t pc_tls13_build_hello_retry_request(uint8_t *out,
size_t cap,
const uint8_t *session_id, uint8_t session_id_len,
207 uint16_t selected_group,
const uint8_t *cookie,
size_t cookie_len,
216size_t pc_tls13_build_encrypted_extensions_empty(uint8_t *out,
size_t cap,
bool rpk_server_cert =
false);
223size_t pc_tls13_build_message_hash(uint8_t *out,
size_t cap,
const uint8_t ch1_hash[32]);
User-facing configuration for ProtoCore.