Amazon Kinesis Webrtc C SDK
Loading...
Searching...
No Matches
Dtls.h
Go to the documentation of this file.
1//
2// Dtls
3//
4
5#ifndef __KINESIS_VIDEO_WEBRTC_CLIENT_DTLS_DTLS__
6#define __KINESIS_VIDEO_WEBRTC_CLIENT_DTLS_DTLS__
7
8#pragma once
9
10#include "Tls.h"
11
12#ifdef __cplusplus
13extern "C" {
14#endif
15
16#define MAX_SRTP_MASTER_KEY_LEN 16
17#define MAX_SRTP_SALT_KEY_LEN 14
18#define MAX_DTLS_RANDOM_BYTES_LEN 32
19#define MAX_DTLS_MASTER_KEY_LEN 48
20
21#define GENERATED_CERTIFICATE_MAX_SIZE 4096
22#define GENERATED_CERTIFICATE_BITS 2048
23#define DTLS_CERT_MIN_SERIAL_NUM_SIZE 8
24#define DTLS_CERT_MAX_SERIAL_NUM_SIZE 20
25#define GENERATED_CERTIFICATE_DAYS 365
26#define GENERATED_CERTIFICATE_NAME "KVS-WebRTC-Client"
27#define KEYING_EXTRACTOR_LABEL "EXTRACTOR-dtls_srtp"
28
29// All DTLS certificate fingerprints emitted and validated by this SDK use
30// SHA-256 (see `dtlsCertificateFingerprint` in both Dtls_mbedtls.c and
31// Dtls_openssl.c). The corresponding `a=fingerprint:` SDP attribute value is
32// therefore prefixed by "sha-256 " (RFC 8122 ยง5).
33#define DTLS_FINGERPRINT_SHA256_HASH_NAME "sha-256"
34#define DTLS_FINGERPRINT_SHA256_PREFIX DTLS_FINGERPRINT_SHA256_HASH_NAME " "
35#define DTLS_FINGERPRINT_SHA256_PREFIX_LEN (SIZEOF(DTLS_FINGERPRINT_SHA256_PREFIX) - 1)
36
37/*
38 * DTLS transmission interval timer (in 100ns)
39 */
40#define DTLS_TRANSMISSION_INTERVAL (200 * HUNDREDS_OF_NANOS_IN_A_MILLISECOND)
41
42#define DTLS_SESSION_TIMER_START_DELAY (100 * HUNDREDS_OF_NANOS_IN_A_MILLISECOND)
43
44#define SECONDS_IN_A_DAY (24 * 60 * 60LL)
45
46#define HUNDREDS_OF_NANOS_IN_A_DAY (HUNDREDS_OF_NANOS_IN_AN_HOUR * 24LL)
47
48typedef enum {
50 RTC_DTLS_TRANSPORT_STATE_CONNECTING, /* DTLS is in the process of negotiating a secure connection and verifying the remote fingerprint. */
51 RTC_DTLS_TRANSPORT_STATE_CONNECTED, /* DTLS has completed negotiation of a secure connection and verified the remote fingerprint. */
52 RTC_DTLS_TRANSPORT_STATE_CLOSED, /* The transport has been closed intentionally as the result of receipt of a close_notify alert */
53 RTC_DTLS_TRANSPORT_STATE_FAILED, /* The transport has failed as the result of an error */
55
62
63/* Callback that is fired when Dtls Server wishes to send packet */
64typedef VOID (*DtlsSessionOutboundPacketFunc)(UINT64, PBYTE, UINT32);
65
66/* Callback that is fired when Dtls state has changed */
68
75
76typedef enum {
77 DTLS_SESSION_VALIDATION_MODE_RELAXED, /* Default peer DTLS flow. Identity is validated later via SDP fingerprint and is not
78 * recommended for production server certificate validation. */
79 DTLS_SESSION_VALIDATION_MODE_STRICT_SERVER, /* Require the remote certificate chain and hostname to validate against
80 * pExpectedServerHostname and the configured CA bundle. */
82
87
88// DtlsKeyingMaterial is information extracted via https://tools.ietf.org/html/rfc5705
89// also includes the use_srtp value from Handshake
97
98#ifdef KVS_USE_OPENSSL
99typedef struct {
100 BOOL created;
101 X509* pCert;
102 EVP_PKEY* pKey;
103} DtlsSessionCertificateInfo, *PDtlsSessionCertificateInfo;
104
105#elif KVS_USE_MBEDTLS
106typedef struct {
107 mbedtls_x509_crt cert;
108 mbedtls_pk_context privateKey;
109 CHAR fingerprint[CERTIFICATE_FINGERPRINT_LENGTH + 1];
110} DtlsSessionCertificateInfo, *PDtlsSessionCertificateInfo;
111
112typedef struct {
113 UINT64 updatedTime;
114 UINT32 intermediateDelay, finalDelay;
115} DtlsSessionTimer, *PDtlsSessionTimer;
116
117typedef struct {
118 BYTE masterSecret[MAX_DTLS_MASTER_KEY_LEN];
119 // client random bytes + server random bytes
120 BYTE randBytes[2 * MAX_DTLS_RANDOM_BYTES_LEN];
121 mbedtls_tls_prf_types tlsProfile;
122} TlsKeys, *PTlsKeys;
123
124// mbedTLS 4 takes its RNG from PSA, so sessions keep no DRBG of their own
125#if MBEDTLS_VERSION_MAJOR < 4
126#define KVS_MBEDTLS_DRBG(pSession) (&(pSession)->ctrDrbg)
127#else
128#define KVS_MBEDTLS_DRBG(pSession) (NULL)
129#endif
130#else
131#error "A Crypto implementation is required."
132#endif
133
136 volatile ATOMIC_BOOL isStarted;
137 volatile ATOMIC_BOOL isShutdown;
138 volatile ATOMIC_BOOL isCleanUp;
141 TIMER_QUEUE_HANDLE timerQueueHandle;
142 UINT32 timerId;
147 MUTEX sslLock;
148 volatile ATOMIC_BOOL remoteCertVerificationFailed;
151
152#ifdef KVS_USE_OPENSSL
153 volatile ATOMIC_BOOL sslInitFinished;
154 volatile SIZE_T objRefCount;
155 CVAR receivePacketCvar;
156 // dtls message must fit into a UDP packet
157 BYTE outgoingDataBuffer[MAX_UDP_PACKET_SIZE];
158 UINT32 outgoingDataLen;
160 SSL_CTX* pSslCtx;
161 SSL* pSsl;
162#elif KVS_USE_MBEDTLS
163 DtlsSessionTimer transmissionTimer;
164 TlsKeys tlsKeys;
165 PIOBuffer pReadBuffer;
166
167#if MBEDTLS_VERSION_MAJOR < 4
168 mbedtls_entropy_context entropy;
169 mbedtls_ctr_drbg_context ctrDrbg;
170#endif
171 mbedtls_ssl_config sslCtxConfig;
172 mbedtls_ssl_context sslCtx;
173 mbedtls_x509_crt trustedCaCert;
174 DtlsSessionCertificateInfo certificates[MAX_RTCCONFIGURATION_CERTIFICATES];
175#else
176#error "A Crypto implementation is required."
177#endif
178};
179
191STATUS createDtlsSession(PDtlsSessionCallbacks, TIMER_QUEUE_HANDLE, INT32, BOOL, PRtcCertificate, PDtlsSession*);
193
200
207STATUS dtlsSessionStart(PDtlsSession, BOOL);
208STATUS dtlsSessionProcessPacket(PDtlsSession, PBYTE, PINT32);
213STATUS dtlsSessionPutApplicationData(PDtlsSession, PBYTE, INT32);
215
219
220/******** Internal Functions **********/
228
229STATUS dtlsFillPseudoRandomBits(PBYTE, UINT32);
230
231#ifdef KVS_USE_OPENSSL
233STATUS dtlsCertificateFingerprint(X509*, PCHAR);
234STATUS dtlsGenerateCertificateFingerprints(PDtlsSession, PDtlsSessionCertificateInfo);
235STATUS createCertificateAndKey(INT32, BOOL, X509** ppCert, EVP_PKEY** ppPkey);
236STATUS freeCertificateAndKey(X509** ppCert, EVP_PKEY** ppPkey);
238STATUS createSslCtx(PDtlsSessionCertificateInfo, UINT32, SSL_CTX**);
239#elif KVS_USE_MBEDTLS
240STATUS dtlsCertificateFingerprint(mbedtls_x509_crt*, PCHAR);
241STATUS copyCertificateAndKey(mbedtls_x509_crt*, mbedtls_pk_context*, PDtlsSessionCertificateInfo, mbedtls_ctr_drbg_context*);
242STATUS createCertificateAndKey(INT32, BOOL, mbedtls_x509_crt*, mbedtls_pk_context*);
243STATUS freeCertificateAndKey(mbedtls_x509_crt*, mbedtls_pk_context*);
244
245// following are required callbacks for mbedtls
246// NOTE: const is not a pure C qualifier, they're here because there's no way to type cast
247// a callback signature.
248INT32 dtlsSessionSendCallback(PVOID, const unsigned char*, ULONG);
249INT32 dtlsSessionReceiveCallback(PVOID, unsigned char*, ULONG);
250VOID dtlsSessionSetTimerCallback(PVOID, UINT32, UINT32);
251INT32 dtlsSessionGetTimerCallback(PVOID);
252
253#if MBEDTLS_BEFORE_V3
254INT32 dtlsSessionKeyDerivationCallback(PVOID, const unsigned char*, const unsigned char*, ULONG, ULONG, ULONG,
255 const unsigned char[MAX_DTLS_RANDOM_BYTES_LEN], const unsigned char[MAX_DTLS_RANDOM_BYTES_LEN],
256 mbedtls_tls_prf_types);
257#elif !MBEDTLS_V4_OR_LATER
258VOID dtlsSessionKeyDerivationCallback(PVOID customData, mbedtls_ssl_key_export_type secret_type, const unsigned char* pMasterSecret,
259 size_t pMasterSecretLen, const unsigned char clientRandom[MAX_DTLS_RANDOM_BYTES_LEN],
260 const unsigned char serverRandom[MAX_DTLS_RANDOM_BYTES_LEN], mbedtls_tls_prf_types tlsProfile);
261#endif
262/* mbedTLS 4 uses mbedtls_ssl_export_keying_material() in dtlsSessionPopulateKeyingMaterial(),
263 * so no key-derivation callback is needed. */
264
265#else
266#error "A Crypto implementation is required."
267#endif
268
269#ifdef __cplusplus
270}
271#endif
272#endif //__KINESIS_VIDEO_WEBRTC_CLIENT_DTLS_DTLS__
STATUS dtlsFillPseudoRandomBits(PBYTE, UINT32)
Definition Dtls.c:119
struct DtlsSessionOptions * PDtlsSessionOptions
DTLS_HANDSHAKE_STATE
Definition Dtls.h:56
@ DTLS_STATE_HANDSHAKE_ERROR
Definition Dtls.h:60
@ DTLS_STATE_HANDSHAKE_COMPLETED
Definition Dtls.h:59
@ DTLS_STATE_HANDSHAKE_IN_PROGRESS
Definition Dtls.h:58
@ DTLS_STATE_HANDSHAKE_NEW
Definition Dtls.h:57
VOID(* DtlsSessionOnStateChange)(UINT64, RTC_DTLS_TRANSPORT_STATE)
Definition Dtls.h:67
struct __DtlsSession * PDtlsSession
Definition Dtls.h:134
STATUS createDtlsSessionWithOptions(PDtlsSessionCallbacks, TIMER_QUEUE_HANDLE, INT32, BOOL, PRtcCertificate, PDtlsSessionOptions, PDtlsSession *)
Definition Dtls_mbedtls.c:154
STATUS dtlsSessionVerifyRemoteCertificateFingerprint(PDtlsSession, PCHAR)
Definition Dtls_mbedtls.c:673
#define MAX_SRTP_MASTER_KEY_LEN
Definition Dtls.h:16
STATUS dtlsSessionPopulateKeyingMaterial(PDtlsSession, PDtlsKeyingMaterial)
Definition Dtls_mbedtls.c:700
STATUS dtlsSessionGetLocalCertificateFingerprint(PDtlsSession, PCHAR, UINT32)
Definition Dtls_mbedtls.c:649
#define MAX_SRTP_SALT_KEY_LEN
Definition Dtls.h:17
STATUS dtlsSessionChangeState(PDtlsSession, RTC_DTLS_TRANSPORT_STATE)
Definition Dtls.c:62
#define MAX_DTLS_MASTER_KEY_LEN
Definition Dtls.h:19
struct DtlsSessionCallbacks * PDtlsSessionCallbacks
struct DtlsKeyingMaterial * PDtlsKeyingMaterial
STATUS dtlsSessionProcessPacket(PDtlsSession, PBYTE, PINT32)
Definition Dtls_mbedtls.c:539
#define MAX_DTLS_RANDOM_BYTES_LEN
Definition Dtls.h:18
RTC_DTLS_TRANSPORT_STATE
Definition Dtls.h:48
@ RTC_DTLS_TRANSPORT_STATE_CLOSED
Definition Dtls.h:52
@ RTC_DTLS_TRANSPORT_STATE_CONNECTING
Definition Dtls.h:50
@ RTC_DTLS_TRANSPORT_STATE_NEW
Definition Dtls.h:49
@ RTC_DTLS_TRANSPORT_STATE_FAILED
Definition Dtls.h:53
@ RTC_DTLS_TRANSPORT_STATE_CONNECTED
Definition Dtls.h:51
STATUS dtlsSessionStart(PDtlsSession, BOOL)
Definition Dtls_mbedtls.c:449
STATUS dtlsSessionShutdown(PDtlsSession)
Definition Dtls_mbedtls.c:760
STATUS dtlsSessionCopyOptions(PDtlsSession, PDtlsSessionOptions)
Definition Dtls.c:88
STATUS dtlsValidateRtcCertificates(PRtcCertificate, PUINT32)
Definition Dtls.c:36
STATUS createDtlsSession(PDtlsSessionCallbacks, TIMER_QUEUE_HANDLE, INT32, BOOL, PRtcCertificate, PDtlsSession *)
Definition Dtls_mbedtls.c:147
DTLS_SESSION_VALIDATION_MODE
Definition Dtls.h:76
@ DTLS_SESSION_VALIDATION_MODE_RELAXED
Definition Dtls.h:77
@ DTLS_SESSION_VALIDATION_MODE_STRICT_SERVER
Definition Dtls.h:79
STATUS dtlsSessionIsInitFinished(PDtlsSession, PBOOL)
Definition Dtls_mbedtls.c:525
STATUS dtlsSessionOnOutBoundData(PDtlsSession, UINT64, DtlsSessionOutboundPacketFunc)
Definition Dtls.c:4
STATUS dtlsSessionPutApplicationData(PDtlsSession, PBYTE, INT32)
Definition Dtls_mbedtls.c:609
VOID(* DtlsSessionOutboundPacketFunc)(UINT64, PBYTE, UINT32)
Definition Dtls.h:64
struct __DtlsSession DtlsSession
Definition Dtls.h:134
STATUS dtlsSessionOnStateChange(PDtlsSession, UINT64, DtlsSessionOnStateChange)
Definition Dtls.c:19
STATUS freeDtlsSession(PDtlsSession *)
Definition Dtls_mbedtls.c:227
STATUS dtlsSessionHandshakeInThread(PDtlsSession, BOOL)
Definition Dtls_mbedtls.c:443
INT32 dtlsSessionReceiveCallback(PVOID customData, unsigned char *pBuf, ULONG len)
Definition Dtls_mbedtls.c:281
STATUS copyCertificateAndKey(mbedtls_x509_crt *pCert, mbedtls_pk_context *pKey, PDtlsSessionCertificateInfo pDst, mbedtls_ctr_drbg_context *pCtrDrbg)
Definition Dtls_mbedtls.c:789
INT32 dtlsSessionGetTimerCallback(PVOID customData)
Definition Dtls_mbedtls.c:326
VOID dtlsSessionSetTimerCallback(PVOID customData, UINT32 intermediateDelayInMs, UINT32 finalDelayInMs)
Definition Dtls_mbedtls.c:304
STATUS freeCertificateAndKey(mbedtls_x509_crt *pCert, mbedtls_pk_context *pKey)
Definition Dtls_mbedtls.c:1126
INT32 dtlsSessionSendCallback(PVOID customData, const unsigned char *pBuf, ULONG len)
Definition Dtls_mbedtls.c:268
STATUS dtlsCertificateFingerprint(mbedtls_x509_crt *pCert, PCHAR pBuff)
Definition Dtls_mbedtls.c:1142
VOID dtlsSessionKeyDerivationCallback(PVOID customData, mbedtls_ssl_key_export_type secret_type, const unsigned char *pMasterSecret, size_t pMasterSecretLen, const unsigned char clientRandom[32], const unsigned char serverRandom[32], mbedtls_tls_prf_types tlsProfile)
Definition Dtls_mbedtls.c:410
STATUS createCertificateAndKey(INT32 certificateBits, BOOL generateRSACertificate, mbedtls_x509_crt *pCert, mbedtls_pk_context *pKey)
Definition Dtls_mbedtls.c:1026
STATUS dtlsGenerateCertificateFingerprints(PDtlsSession pDtlsSession, PDtlsSessionCertificateInfo pDtlsSessionCertificateInfo)
Definition Dtls_openssl.c:491
STATUS dtlsCheckOutgoingDataBuffer(PDtlsSession pDtlsSession)
Definition Dtls_openssl.c:899
STATUS createSslCtx(PDtlsSessionCertificateInfo pCertificates, UINT32 certCount, SSL_CTX **ppSslCtx)
Definition Dtls_openssl.c:279
struct __IOBuffer * PIOBuffer
Definition IOBuffer.h:10
#define MAX_UDP_PACKET_SIZE
Definition Include_i.h:138
#define CERTIFICATE_FINGERPRINT_LENGTH
Definition Include_i.h:136
#define MAX_RTCCONFIGURATION_CERTIFICATES
Definition Include.h:679
struct RtcCertificate * PRtcCertificate
Definition Dtls.h:90
BYTE serverWriteKey[16+14]
Definition Dtls.h:92
KVS_SRTP_PROFILE srtpProfile
Definition Dtls.h:95
BYTE clientWriteKey[16+14]
Definition Dtls.h:91
UINT8 key_length
Definition Dtls.h:93
Definition Dtls.h:69
DtlsSessionOutboundPacketFunc outboundPacketFn
Definition Dtls.h:71
DtlsSessionOnStateChange stateChangeFn
Definition Dtls.h:73
UINT64 outBoundPacketFnCustomData
Definition Dtls.h:70
UINT64 stateChangeFnCustomData
Definition Dtls.h:72
Definition Dtls.h:83
PCHAR pExpectedServerHostname
Definition Dtls.h:85
DTLS_SESSION_VALIDATION_MODE validationMode
Definition Dtls.h:84
Definition Dtls.h:135
TIMER_QUEUE_HANDLE timerQueueHandle
Definition Dtls.h:141
UINT64 dtlsSessionSetupTime
Definition Dtls.h:144
RTC_DTLS_TRANSPORT_STATE state
Definition Dtls.h:145
UINT32 timerId
Definition Dtls.h:142
volatile ATOMIC_BOOL isStarted
Definition Dtls.h:136
DTLS_HANDSHAKE_STATE handshakeState
Definition Dtls.h:146
volatile ATOMIC_BOOL remoteCertVerificationFailed
Definition Dtls.h:148
UINT32 certificateCount
Definition Dtls.h:139
UINT64 dtlsSessionStartTime
Definition Dtls.h:143
volatile ATOMIC_BOOL isCleanUp
Definition Dtls.h:138
MUTEX sslLock
Definition Dtls.h:147
DTLS_SESSION_VALIDATION_MODE validationMode
Definition Dtls.h:149
PCHAR pExpectedServerHostname
Definition Dtls.h:150
volatile ATOMIC_BOOL isShutdown
Definition Dtls.h:137
DtlsSessionCallbacks dtlsSessionCallbacks
Definition Dtls.h:140