Go to the documentation of this file.
32 #define TRACE_LEVEL TLS_TRACE_LEVEL
42 #if (TLS_SUPPORT == ENABLED && TLS_CLIENT_SUPPORT == ENABLED && \
43 TLS_MAX_VERSION >= TLS_VERSION_1_3)
66 if(context->cookieLen > 0)
86 extension->length =
htons(
n);
109 uint8_t *
p,
size_t *written)
113 #if (TLS13_DHE_KE_SUPPORT == ENABLED || TLS13_PSK_DHE_KE_SUPPORT == ENABLED || \
114 TLS13_ECDHE_KE_SUPPORT == ENABLED || TLS13_PSK_ECDHE_KE_SUPPORT == ENABLED || \
115 TLS13_MLKEM_KE_SUPPORT == ENABLED || TLS13_PSK_MLKEM_KE_SUPPORT == ENABLED || \
116 TLS13_HYBRID_KE_SUPPORT == ENABLED || TLS13_PSK_HYBRID_KE_SUPPORT == ENABLED)
134 #if (TLS13_DHE_KE_SUPPORT == ENABLED || TLS13_PSK_DHE_KE_SUPPORT == ENABLED)
139 keyShareEntry->group =
htons(context->namedGroup);
152 keyShareEntry->length =
htons(
n);
159 #if (TLS13_ECDHE_KE_SUPPORT == ENABLED || TLS13_PSK_ECDHE_KE_SUPPORT == ENABLED)
164 keyShareEntry->group =
htons(context->namedGroup);
175 keyShareEntry->length =
htons(
n);
182 #if (TLS13_MLKEM_KE_SUPPORT == ENABLED || TLS13_PSK_MLKEM_KE_SUPPORT == ENABLED)
189 kemAlgo = context->kemContext.kemAlgo;
192 keyShareEntry->group =
htons(context->namedGroup);
196 osMemcpy(keyShareEntry->keyExchange, context->kemContext.pk,
203 keyShareEntry->length =
htons(
n);
210 #if (TLS13_HYBRID_KE_SUPPORT == ENABLED || TLS13_PSK_HYBRID_KE_SUPPORT == ENABLED)
218 kemAlgo = context->kemContext.kemAlgo;
221 keyShareEntry->group =
htons(context->namedGroup);
255 osMemcpy(keyShareEntry->keyExchange + offset, context->kemContext.pk,
263 keyShareEntry->length =
htons(
n);
277 keyShareList->length =
htons(
n);
282 extension->length =
htons(
n);
305 uint8_t *
p,
size_t *written)
309 #if (TLS13_PSK_KE_SUPPORT == ENABLED || TLS13_PSK_DHE_KE_SUPPORT == ENABLED || \
310 TLS13_PSK_ECDHE_KE_SUPPORT == ENABLED || TLS13_PSK_HYBRID_KE_SUPPORT == ENABLED)
329 #if (TLS13_PSK_KE_SUPPORT == ENABLED)
335 pskKeModeList->length = (uint8_t)
n;
340 extension->length =
htons(
n);
372 #if (TLS13_PSK_KE_SUPPORT == ENABLED || TLS13_PSK_DHE_KE_SUPPORT == ENABLED || \
373 TLS13_PSK_ECDHE_KE_SUPPORT == ENABLED || TLS13_PSK_HYBRID_KE_SUPPORT == ENABLED)
403 osMemcpy(pskIdentity->value, context->pskIdentity,
n);
420 n = context->ticketLen;
422 osMemcpy(pskIdentity->value, context->ticket,
n);
434 ticketAge = context->clientHelloTimestamp - context->ticketTimestamp;
439 ticketAge += context->ticketAgeAdd;
463 context->cipherSuite.prfHashAlgo = hashAlgo;
467 pskIdentity->length =
htons(
n);
472 STORE32BE(ticketAge, (uint8_t *) pskIdentity +
n);
474 n +=
sizeof(uint32_t);
477 (*identityList)->length =
htons(
n);
492 pskBinder->length = (uint8_t)
m;
497 (*binderList)->length =
htons(
m);
502 extension->length =
htons(
n);
510 *identityList = NULL;
531 uint8_t *
p,
size_t *written)
535 #if (TLS13_EARLY_DATA_SUPPORT == ENABLED)
538 if(context->earlyDataEnabled && !context->earlyDataRejected)
548 extension->length =
HTONS(0);
580 TRACE_INFO(
" selectedVersion = 0x%04" PRIX16
" (%s)\r\n",
583 #if (DTLS_SUPPORT == ENABLED)
649 if(context->cookie != NULL)
653 context->cookie = NULL;
654 context->cookieLen = 0;
660 if(context->cookie == NULL)
665 context->cookieLen =
n;
688 #if (TLS13_DHE_KE_SUPPORT == ENABLED || TLS13_PSK_DHE_KE_SUPPORT == ENABLED || \
689 TLS13_ECDHE_KE_SUPPORT == ENABLED || TLS13_PSK_ECDHE_KE_SUPPORT == ENABLED || \
690 TLS13_MLKEM_KE_SUPPORT == ENABLED || TLS13_PSK_MLKEM_KE_SUPPORT == ENABLED || \
691 TLS13_HYBRID_KE_SUPPORT == ENABLED || TLS13_PSK_HYBRID_KE_SUPPORT == ENABLED)
693 if(selectedGroup != NULL)
699 namedGroup =
LOAD16BE(selectedGroup->value);
702 if(namedGroup != context->namedGroup)
710 if(selectedGroup != NULL)
739 #if (TLS13_DHE_KE_SUPPORT == ENABLED || TLS13_PSK_DHE_KE_SUPPORT == ENABLED || \
740 TLS13_ECDHE_KE_SUPPORT == ENABLED || TLS13_PSK_ECDHE_KE_SUPPORT == ENABLED || \
741 TLS13_MLKEM_KE_SUPPORT == ENABLED || TLS13_PSK_MLKEM_KE_SUPPORT == ENABLED || \
742 TLS13_HYBRID_KE_SUPPORT == ENABLED || TLS13_PSK_HYBRID_KE_SUPPORT == ENABLED)
745 if(serverShare != NULL)
750 namedGroup =
ntohs(serverShare->group);
754 if(namedGroup == context->namedGroup)
764 ntohs(serverShare->length));
774 ntohs(serverShare->length));
785 ntohs(serverShare->length));
796 ntohs(serverShare->length));
821 if(serverShare != NULL)
851 context->selectedIdentity = -1;
853 #if (TLS13_PSK_KE_SUPPORT == ENABLED || TLS13_PSK_DHE_KE_SUPPORT == ENABLED || \
854 TLS13_PSK_ECDHE_KE_SUPPORT == ENABLED || TLS13_PSK_HYBRID_KE_SUPPORT == ENABLED)
856 if(selectedIdentity != NULL)
868 context->selectedIdentity =
LOAD16BE(selectedIdentity->value);
872 if(context->selectedIdentity != 0)
876 hashAlgo = context->cipherSuite.prfHashAlgo;
903 #if (TLS13_PSK_KE_SUPPORT == ENABLED)
909 #if (TLS13_PSK_DHE_KE_SUPPORT == ENABLED)
915 #if (TLS13_PSK_ECDHE_KE_SUPPORT == ENABLED)
921 #if (TLS13_PSK_MLKEM_KE_SUPPORT == ENABLED)
927 #if (TLS13_PSK_HYBRID_KE_SUPPORT == ENABLED)
936 if(selectedIdentity != NULL)
961 #if (TLS13_EARLY_DATA_SUPPORT == ENABLED)
967 if(earlyDataIndication != NULL)
972 if(!context->earlyDataEnabled || context->earlyDataRejected)
979 if(context->selectedIdentity != 0)
983 context->earlyDataExtReceived =
TRUE;
989 context->earlyDataExtReceived =
FALSE;
996 if(earlyDataIndication != NULL)
998 context->maxEarlyDataSize =
LOAD32BE(earlyDataIndication->value);
1002 context->maxEarlyDataSize = 0;
1014 if(earlyDataIndication != NULL)
1025 context->maxEarlyDataSize = 0;
@ TLS_GROUP_X25519_MLKEM768
@ TLS_EXT_PSK_KEY_EXCHANGE_MODES
#define tlsAllocMem(size)
#define TLS13_PSK_DHE_KE_SUPPORT
uint16_t cipherSuite
Cipher suite identifier.
error_t dtlsSelectVersion(TlsContext *context, uint16_t version)
Set the DTLS version to be used.
const HashAlgo * tlsGetHashAlgo(TlsHashAlgo hashAlgoId)
Get the hash algorithm that matches the specified identifier.
@ ERROR_ILLEGAL_PARAMETER
error_t tlsSelectVersion(TlsContext *context, uint16_t version)
Set the TLS version to be used.
#define TLS13_MAX_COOKIE_SIZE
error_t tls13ParseServerKeyShareExtension(TlsContext *context, const Tls13KeyShareEntry *serverShare)
Parse KeyShare extension (ServerHello message)
@ TLS_TRANSPORT_PROTOCOL_DATAGRAM
TlsMessageType
Handshake message type.
@ TLS13_KEY_EXCH_PSK_MLKEM
bool_t tls13IsMlkemGroupSupported(TlsContext *context, uint16_t namedGroup)
Check whether a given ML-KEM exchange method is supported.
@ EC_PUBLIC_KEY_FORMAT_X963
error_t tls13FormatCookieExtension(TlsContext *context, uint8_t *p, size_t *written)
Format Cookie extension.
@ TLS13_KEY_EXCH_PSK_HYBRID
error_t tls13FormatClientEarlyDataExtension(TlsContext *context, uint8_t *p, size_t *written)
Format EarlyData extension.
@ TLS_PSK_KEY_EXCH_MODE_PSK_KE
error_t tls13ParseSelectedGroupExtension(TlsContext *context, const TlsExtension *selectedGroup)
Parse KeyShare extension (HelloRetryRequest message)
@ TLS_PSK_KEY_EXCH_MODE_PSK_DHE_KE
error_t tls13ParseServerSupportedVersionsExtension(TlsContext *context, const TlsExtension *selectedVersion)
Parse SupportedVersions extension.
#define osMemcpy(dest, src, length)
@ ERROR_UNSUPPORTED_EXTENSION
bool_t tls13IsEcdheGroupSupported(TlsContext *context, uint16_t namedGroup)
Check whether a given ECDHE group is supported.
@ ERROR_FAILURE
Generic error code.
error_t tlsSelectCipherSuite(TlsContext *context, uint16_t identifier)
Set cipher suite.
error_t tls13Decapsulate(TlsContext *context, const uint8_t *keyShare, size_t length)
Decapsulation algorithm.
error_t tls13FormatClientKeyShareExtension(TlsContext *context, uint8_t *p, size_t *written)
Format KeyShare extension (ClientHello message)
@ TLS_TYPE_ENCRYPTED_EXTENSIONS
bool_t tls13IsTicketValid(TlsContext *context)
Check whether a session ticket is valid.
bool_t tls13IsFfdheGroupSupported(TlsContext *context, uint16_t namedGroup)
Check whether a given FFDHE group is supported.
bool_t tls13IsHybridGroupSupported(TlsContext *context, uint16_t namedGroup)
Check whether a given hybrid key exchange method is supported.
error_t tls13FormatClientPreSharedKeyExtension(TlsContext *context, uint8_t *p, size_t *written, Tls13PskIdentityList **identityList, Tls13PskBinderList **binderList)
Format PreSharedKey extension.
error_t dhExportPublicKey(DhContext *context, uint8_t *output, size_t *written, MpiFormat format)
Export our own public key.
error_t tls13ParseCookieExtension(TlsContext *context, const Tls13Cookie *cookie)
Parse Cookie extension.
#define TLS13_PSK_HYBRID_KE_SUPPORT
@ TLS13_KEY_EXCH_PSK_ECDHE
error_t tls13GenerateSharedSecret(TlsContext *context, const uint8_t *keyShare, size_t length)
(EC)DHE shared secret generation
bool_t tls13IsPskValid(TlsContext *context)
Check whether an externally established PSK is valid.
error_t tls13GenerateKeyShare(TlsContext *context, uint16_t namedGroup)
Key share generation.
error_t tls13ParseServerPreSharedKeyExtension(TlsContext *context, const TlsExtension *selectedIdentity)
Parse PreSharedKey extension.
error_t tls13FormatPskKeModesExtension(TlsContext *context, uint8_t *p, size_t *written)
Format PskKeyExchangeModes extension.
Common interface for key encapsulation mechanisms (KEM)
Formatting and parsing of extensions (TLS 1.3 client)
TLS (Transport Layer Security)
Common interface for hash algorithms.
const char_t * tlsGetVersionName(uint16_t version)
Convert TLS version to string representation.
@ TLS_TYPE_NEW_SESSION_TICKET
#define osMemset(p, value, length)
#define TLS13_PSK_ECDHE_KE_SUPPORT
error_t ecdhExportPublicKey(EcdhContext *context, uint8_t *output, size_t *written, EcPublicKeyFormat format)
Export our own public key.
error_t tls13ParseServerEarlyDataExtension(TlsContext *context, TlsMessageType msgType, const TlsExtension *earlyDataIndication)
Parse EarlyData extension.