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);
585 TRACE_INFO(
" selectedVersion = 0x%04" PRIX16
" (%s)\r\n",
627 if(context->cookie != NULL)
631 context->cookie = NULL;
632 context->cookieLen = 0;
638 if(context->cookie == NULL)
643 context->cookieLen =
n;
666 #if (TLS13_DHE_KE_SUPPORT == ENABLED || TLS13_PSK_DHE_KE_SUPPORT == ENABLED || \
667 TLS13_ECDHE_KE_SUPPORT == ENABLED || TLS13_PSK_ECDHE_KE_SUPPORT == ENABLED || \
668 TLS13_MLKEM_KE_SUPPORT == ENABLED || TLS13_PSK_MLKEM_KE_SUPPORT == ENABLED || \
669 TLS13_HYBRID_KE_SUPPORT == ENABLED || TLS13_PSK_HYBRID_KE_SUPPORT == ENABLED)
671 if(selectedGroup != NULL)
677 namedGroup =
LOAD16BE(selectedGroup->value);
680 if(namedGroup != context->namedGroup)
688 if(selectedGroup != NULL)
717 #if (TLS13_DHE_KE_SUPPORT == ENABLED || TLS13_PSK_DHE_KE_SUPPORT == ENABLED || \
718 TLS13_ECDHE_KE_SUPPORT == ENABLED || TLS13_PSK_ECDHE_KE_SUPPORT == ENABLED || \
719 TLS13_MLKEM_KE_SUPPORT == ENABLED || TLS13_PSK_MLKEM_KE_SUPPORT == ENABLED || \
720 TLS13_HYBRID_KE_SUPPORT == ENABLED || TLS13_PSK_HYBRID_KE_SUPPORT == ENABLED)
723 if(serverShare != NULL)
728 namedGroup =
ntohs(serverShare->group);
732 if(namedGroup == context->namedGroup)
742 ntohs(serverShare->length));
752 ntohs(serverShare->length));
763 ntohs(serverShare->length));
774 ntohs(serverShare->length));
799 if(serverShare != NULL)
829 context->selectedIdentity = -1;
831 #if (TLS13_PSK_KE_SUPPORT == ENABLED || TLS13_PSK_DHE_KE_SUPPORT == ENABLED || \
832 TLS13_PSK_ECDHE_KE_SUPPORT == ENABLED || TLS13_PSK_HYBRID_KE_SUPPORT == ENABLED)
834 if(selectedIdentity != NULL)
846 context->selectedIdentity =
LOAD16BE(selectedIdentity->value);
850 if(context->selectedIdentity != 0)
854 hashAlgo = context->cipherSuite.prfHashAlgo;
881 #if (TLS13_PSK_KE_SUPPORT == ENABLED)
887 #if (TLS13_PSK_DHE_KE_SUPPORT == ENABLED)
893 #if (TLS13_PSK_ECDHE_KE_SUPPORT == ENABLED)
899 #if (TLS13_PSK_MLKEM_KE_SUPPORT == ENABLED)
905 #if (TLS13_PSK_HYBRID_KE_SUPPORT == ENABLED)
914 if(selectedIdentity != NULL)
939 #if (TLS13_EARLY_DATA_SUPPORT == ENABLED)
945 if(earlyDataIndication != NULL)
950 if(!context->earlyDataEnabled || context->earlyDataRejected)
957 if(context->selectedIdentity != 0)
961 context->earlyDataExtReceived =
TRUE;
967 context->earlyDataExtReceived =
FALSE;
974 if(earlyDataIndication != NULL)
976 context->maxEarlyDataSize =
LOAD32BE(earlyDataIndication->value);
980 context->maxEarlyDataSize = 0;
992 if(earlyDataIndication != NULL)
1003 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.
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)
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.