ddn.net.dtls.client12
DTLS 1.2 client handshake state machine (RFC 6347).
Drives the DTLS 1.2 client handshake as a resumable state machine. Adapts the TLS 1.2 handshake for datagram transports with:
- DTLS record framing (13-byte header)
- DTLS handshake framing (12-byte header with message_seq)
- Flight-based retransmission with exponential backoff
- Cookie exchange (HelloVerifyRequest)
- Handshake message fragmentation
- Anti-replay protection
Reuses cryptographic primitives from the TLS 1.2 implementation: PRF (Tls12Prf), AEAD (TlsAead), key exchange (X25519, ECDH P-256), certificate parsing, and signature verification.
Types 1
DTLS 1.2 client handshake engine.
Drives the client side of a DTLS 1.2 handshake over a datagram transport. Uses flight-based retransmission with exponential backoff and supports the HelloVerifyRequest cookie exchange for DoS mitigation.
Call handshake() repeatedly until it returns TlsProgress.DONE. Between calls, wait for socket readiness as indicated by the return value.
private DtlsTransport transport_private DtlsTimerSink timer_private DatagramEndpoint serverAddr_private Dtls12ClientPhase phase_private ushort epoch_private ushort readEpoch_private ulong recordSeq_private int lastPeerMsgSeq_Highest fully processed peer handshake message_seq (RFC 6347 §4.2.2); -1 until the first message completes.private ushort messageSeq_Per-direction transmit counter (RFC 6347 §4.2.2).private ushort lastRecvSeq_message_seq from the most recently received handshake message, used when hashing inbound messages into the transcript.private SecureRandom rng_private DtlsFlight pendingFlight_private int retryCount_private ubyte[32] clientRandom_private ubyte[32] serverRandom_private ubyte[] preMasterSecret_private ubyte[] masterSecret_private ubyte[] receivedCookie_private X25519PrivateKey ecdhePrivate_private EcdhP256 ecdheP256_private bool ecdheP256Valid_private NamedGroup selectedGroup_private string serverName_private DtlsVersion minVersion_private DtlsVersion maxVersion_private string[] alpnProtocols_private SrtpProfile[] srtpProfiles_private string negotiatedAlpn_private CipherSuiteId negotiatedCipher_private DtlsVersion negotiatedVersion_private SrtpProfile negotiatedSrtpProfile_private Tls12Prf prf_private TranscriptHash transcript_private TlsAead writeAead_private TlsAead readAead_private X509Certificate[] peerX509Certs_private TlsCertificateChain peerCerts_private TlsVerifyMode verifyMode_private DtlsVerifyCallback verifyCallback_private NativeTlsTrustStore trustStore_private DtlsFragmentBuffer reassembly_private ubyte[65536] recvBuffer_private ubyte[] pendingDatagram_void setSrtpProfiles(SrtpProfile[] profiles) @safe pure nothrowSets the DTLS-SRTP profiles to negotiate (RFC 5764).void setVerifyMode(TlsVerifyMode mode) @safe pure nothrow @nogcSets the certificate verification mode.void setVerifyCallback(DtlsVerifyCallback callback) @safe pure nothrowSets a custom certificate verification callback.void setTrustStore(NativeTlsTrustStore trustStore) @safe pure nothrowSets the trust store for certificate chain validation.ubyte[] buildDtlsClientHello(const(ubyte)[] cookie)Builds a DTLS ClientHello handshake message.bool processServerResponse(const(ubyte)[] datagram)Process a received datagram during the handshake.bool processHandshakePayload(const(ubyte)[] payload)Process a handshake payload from a DTLS record.bool dispatchHandshakeType(HandshakeType msgType, const(ubyte)[] body)Dispatch a complete handshake message to the appropriate handler.void processServerHello(const(ubyte)[] body)Process a ServerHello message body.void processServerHelloExtensions(const(ubyte)[] extData)Process extensions from a ServerHello.void processCertificate(const(ubyte)[] body)Process a Certificate message body.void processServerKeyExchange(const(ubyte)[] body)Process a ServerKeyExchange message body.void performKeyExchange(NamedGroup group, const(ubyte)[] peerPubKey)Perform ECDHE key exchange.void verifyServerKeyExchange(SignatureScheme sigScheme,
const(ubyte)[] params, const(ubyte)[] signature)Verify the server's signature on ServerKeyExchange parameters.ubyte[] buildClientKeyExchange()Builds a ClientKeyExchange handshake message.ubyte[] buildChangeCipherSpec()Builds a ChangeCipherSpec record.void deriveKeys()Derives master secret and key material from the premaster secret.ubyte[] buildFinished()Builds a Finished handshake message.void processServerFinished(const(ubyte)[] body)Process a server Finished message body.const(ubyte)[] decryptRecordPayload(const(ubyte)[] payload,
DtlsRecordHeader header)Decrypts an encrypted DTLS 1.2 record payload using the read AEAD.const(ubyte)[] extractHelloVerifyCookie(const(ubyte)[] body)Extract the cookie from a HelloVerifyRequest body.void updateTranscript(HandshakeType msgType, ushort msgSeq,
const(ubyte)[] body)Update the handshake transcript hash with a DTLS handshake message.ubyte[] wrapHandshakeMessage(HandshakeType msgType, const(ubyte)[] body,
bool intoTranscript = true)Wraps a handshake message body in a DTLS handshake header.ubyte[] wrapInRecord(ContentType contentType, const(ubyte)[] payload)Wraps a handshake message in a DTLS record.ubyte[] buildDtlsRecord(ContentType contentType, const(ubyte)[] payload)Builds a complete DTLS record with 13-byte header.ubyte[] encryptRecord(ContentType contentType, const(ubyte)[] plaintext)Encrypts a record payload using the current write AEAD.const(ubyte)[] receiveDatagram()Receive a single datagram from the transport.void sendDatagram(const(ubyte)[] data)Send a datagram via the transport.void sendFlight(ubyte[][] records)Send a flight of records as one or more datagrams.void scheduleRetransmit()Schedule retransmission timer for the current flight.void retransmitFlight()Retransmit the pending flight.Dtls12ClientPhase phase() @property const @safe pure nothrow @nogcReturns: The current handshake phase.CipherSuiteId negotiatedCipher() @property const @safe pure nothrow @nogcReturns: The negotiated cipher suite.DtlsVersion negotiatedVersion() @property const @safe pure nothrow @nogcReturns: The negotiated DTLS version.ulong recordSeq() @property const @safe pure nothrow @nogcReturns: The next outgoing record sequence number for the current epoch.SrtpProfile negotiatedSrtpProfile() @property const @safe pure nothrow @nogcReturns: The negotiated DTLS-SRTP profile (`SrtpProfile.init` when SRTP was not negotiated).this(DtlsTransport transport, DtlsTimerSink timer,
DatagramEndpoint serverAddr, string serverName)Constructs a DTLS 1.2 client handshake engine.Variables 1
DTLS_1_2_RECORD_VERSION = [0xFE, 0xFD]DTLS 1.2 record version used on the wire.