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);
148 error =
mpiExport(&context->dhContext.ya,
155 keyShareEntry->length =
htons(
n);
162 #if (TLS13_ECDHE_KE_SUPPORT == ENABLED || TLS13_PSK_ECDHE_KE_SUPPORT == ENABLED)
167 keyShareEntry->group =
htons(context->namedGroup);
178 keyShareEntry->length =
htons(
n);
185 #if (TLS13_MLKEM_KE_SUPPORT == ENABLED || TLS13_PSK_MLKEM_KE_SUPPORT == ENABLED)
192 kemAlgo = context->kemContext.kemAlgo;
195 keyShareEntry->group =
htons(context->namedGroup);
199 osMemcpy(keyShareEntry->keyExchange, context->kemContext.pk,
206 keyShareEntry->length =
htons(
n);
213 #if (TLS13_HYBRID_KE_SUPPORT == ENABLED || TLS13_PSK_HYBRID_KE_SUPPORT == ENABLED)
221 kemAlgo = context->kemContext.kemAlgo;
224 keyShareEntry->group =
htons(context->namedGroup);
258 osMemcpy(keyShareEntry->keyExchange + offset, context->kemContext.pk,
266 keyShareEntry->length =
htons(
n);
280 keyShareList->length =
htons(
n);
285 extension->length =
htons(
n);
308 uint8_t *
p,
size_t *written)
312 #if (TLS13_PSK_KE_SUPPORT == ENABLED || TLS13_PSK_DHE_KE_SUPPORT == ENABLED || \
313 TLS13_PSK_ECDHE_KE_SUPPORT == ENABLED || TLS13_PSK_HYBRID_KE_SUPPORT == ENABLED)
332 #if (TLS13_PSK_KE_SUPPORT == ENABLED)
338 pskKeModeList->length = (uint8_t)
n;
343 extension->length =
htons(
n);
375 #if (TLS13_PSK_KE_SUPPORT == ENABLED || TLS13_PSK_DHE_KE_SUPPORT == ENABLED || \
376 TLS13_PSK_ECDHE_KE_SUPPORT == ENABLED || TLS13_PSK_HYBRID_KE_SUPPORT == ENABLED)
406 osMemcpy(pskIdentity->value, context->pskIdentity,
n);
423 n = context->ticketLen;
425 osMemcpy(pskIdentity->value, context->ticket,
n);
437 ticketAge = context->clientHelloTimestamp - context->ticketTimestamp;
442 ticketAge += context->ticketAgeAdd;
466 context->cipherSuite.prfHashAlgo = hashAlgo;
470 pskIdentity->length =
htons(
n);
475 STORE32BE(ticketAge, (uint8_t *) pskIdentity +
n);
477 n +=
sizeof(uint32_t);
480 (*identityList)->length =
htons(
n);
495 pskBinder->length = (uint8_t)
m;
500 (*binderList)->length =
htons(
m);
505 extension->length =
htons(
n);
513 *identityList = NULL;
534 uint8_t *
p,
size_t *written)
538 #if (TLS13_EARLY_DATA_SUPPORT == ENABLED)
541 if(context->earlyDataEnabled && !context->earlyDataRejected)
551 extension->length =
HTONS(0);
588 TRACE_INFO(
" selectedVersion = 0x%04" PRIX16
" (%s)\r\n",
630 if(context->cookie != NULL)
634 context->cookie = NULL;
635 context->cookieLen = 0;
641 if(context->cookie == NULL)
646 context->cookieLen =
n;
669 #if (TLS13_DHE_KE_SUPPORT == ENABLED || TLS13_PSK_DHE_KE_SUPPORT == ENABLED || \
670 TLS13_ECDHE_KE_SUPPORT == ENABLED || TLS13_PSK_ECDHE_KE_SUPPORT == ENABLED || \
671 TLS13_MLKEM_KE_SUPPORT == ENABLED || TLS13_PSK_MLKEM_KE_SUPPORT == ENABLED || \
672 TLS13_HYBRID_KE_SUPPORT == ENABLED || TLS13_PSK_HYBRID_KE_SUPPORT == ENABLED)
674 if(selectedGroup != NULL)
680 namedGroup =
LOAD16BE(selectedGroup->value);
683 if(namedGroup != context->namedGroup)
691 if(selectedGroup != NULL)
720 #if (TLS13_DHE_KE_SUPPORT == ENABLED || TLS13_PSK_DHE_KE_SUPPORT == ENABLED || \
721 TLS13_ECDHE_KE_SUPPORT == ENABLED || TLS13_PSK_ECDHE_KE_SUPPORT == ENABLED || \
722 TLS13_MLKEM_KE_SUPPORT == ENABLED || TLS13_PSK_MLKEM_KE_SUPPORT == ENABLED || \
723 TLS13_HYBRID_KE_SUPPORT == ENABLED || TLS13_PSK_HYBRID_KE_SUPPORT == ENABLED)
726 if(serverShare != NULL)
731 namedGroup =
ntohs(serverShare->group);
735 if(namedGroup == context->namedGroup)
745 ntohs(serverShare->length));
755 ntohs(serverShare->length));
766 ntohs(serverShare->length));
777 ntohs(serverShare->length));
802 if(serverShare != NULL)
832 context->selectedIdentity = -1;
834 #if (TLS13_PSK_KE_SUPPORT == ENABLED || TLS13_PSK_DHE_KE_SUPPORT == ENABLED || \
835 TLS13_PSK_ECDHE_KE_SUPPORT == ENABLED || TLS13_PSK_HYBRID_KE_SUPPORT == ENABLED)
837 if(selectedIdentity != NULL)
849 context->selectedIdentity =
LOAD16BE(selectedIdentity->value);
853 if(context->selectedIdentity != 0)
857 hashAlgo = context->cipherSuite.prfHashAlgo;
884 #if (TLS13_PSK_KE_SUPPORT == ENABLED)
890 #if (TLS13_PSK_DHE_KE_SUPPORT == ENABLED)
896 #if (TLS13_PSK_ECDHE_KE_SUPPORT == ENABLED)
902 #if (TLS13_PSK_MLKEM_KE_SUPPORT == ENABLED)
908 #if (TLS13_PSK_HYBRID_KE_SUPPORT == ENABLED)
917 if(selectedIdentity != NULL)
942 #if (TLS13_EARLY_DATA_SUPPORT == ENABLED)
948 if(earlyDataIndication != NULL)
953 if(!context->earlyDataEnabled || context->earlyDataRejected)
960 if(context->selectedIdentity != 0)
964 context->earlyDataExtReceived =
TRUE;
970 context->earlyDataExtReceived =
FALSE;
977 if(earlyDataIndication != NULL)
979 context->maxEarlyDataSize =
LOAD32BE(earlyDataIndication->value);
983 context->maxEarlyDataSize = 0;
995 if(earlyDataIndication != NULL)
1006 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 mpiExport(const Mpi *a, uint8_t *output, size_t length, MpiFormat format)
Integer to octet string conversion.
error_t tls13FormatClientPreSharedKeyExtension(TlsContext *context, uint8_t *p, size_t *written, Tls13PskIdentityList **identityList, Tls13PskBinderList **binderList)
Format PreSharedKey extension.
error_t ecExportPublicKey(const EcPublicKey *key, uint8_t *data, size_t *length, EcPublicKeyFormat format)
Export an EC 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
uint_t mpiGetByteLength(const Mpi *a)
Get the actual length in bytes.
error_t tls13ParseServerEarlyDataExtension(TlsContext *context, TlsMessageType msgType, const TlsExtension *earlyDataIndication)
Parse EarlyData extension.