Go to the documentation of this file.
32 #define TRACE_LEVEL TLS_TRACE_LEVEL
45 #if (TLS_SUPPORT == ENABLED && TLS_CLIENT_SUPPORT == ENABLED)
93 uint8_t *
p,
size_t *written)
97 #if (TLS_MAX_VERSION >= TLS_VERSION_1_2 && TLS_MIN_VERSION <= TLS_VERSION_1_3)
177 n *=
sizeof(uint16_t);
179 supportedVersionList->length = (uint8_t)
n;
184 extension->length =
htons(
n);
208 uint8_t *
p,
size_t *written)
212 #if (TLS_SNI_SUPPORT == ENABLED)
215 if(context->serverName != NULL)
239 serverName->length =
htons(
n);
241 osMemcpy(serverName->hostname, context->serverName,
n);
246 serverNameList->length =
htons(
n);
251 extension->length =
htons(
n);
281 uint8_t *
p,
size_t *written)
285 #if (TLS_MAX_FRAG_LEN_SUPPORT == ENABLED)
288 if(context->maxFragLen == 512 || context->maxFragLen == 1024 ||
289 context->maxFragLen == 2048 || context->maxFragLen == 4096)
299 switch(context->maxFragLen)
321 extension->length =
htons(
n);
345 uint8_t *
p,
size_t *written)
349 #if (TLS_RECORD_SIZE_LIMIT_SUPPORT == ENABLED)
350 size_t recordSizeLimit;
371 STORE16BE(recordSizeLimit, extension->value);
374 n =
sizeof(uint16_t);
376 extension->length =
htons(
n);
409 #if (TLS_TRUSTED_CA_KEYS_SUPPORT == ENABLED)
411 if(context->trustedCaKeysEnabled && context->versionMin <=
TLS_VERSION_1_2)
431 extension->length =
htons(
n);
466 #if (TLS_ECDH_SUPPORT == ENABLED || TLS_FFDHE_SUPPORT == ENABLED || \
467 TLS_MLKEM_SUPPORT == ENABLED || TLS_HYBRID_SUPPORT == ENABLED)
469 uint_t numSupportedGroups;
470 const uint16_t *supportedGroups;
483 if(context->numSupportedGroups > 0)
486 supportedGroups = context->supportedGroups;
487 numSupportedGroups = context->numSupportedGroups;
500 for(i = 0; i < numSupportedGroups; i++)
502 #if (TLS_FFDHE_SUPPORT == ENABLED)
511 supportedGroupList->value[
n++] =
htons(supportedGroups[i]);
516 #if (TLS_ECDH_SUPPORT == ENABLED)
518 if(
tlsGetCurve(context, supportedGroups[i]) != NULL)
527 supportedGroupList->value[
n++] =
htons(supportedGroups[i]);
537 supportedGroupList->value[
n++] =
htons(supportedGroups[i]);
543 #if (TLS_MLKEM_SUPPORT == ENABLED)
551 supportedGroupList->value[
n++] =
htons(supportedGroups[i]);
556 #if (TLS_HYBRID_SUPPORT == ENABLED)
565 supportedGroupList->value[
n++] =
htons(supportedGroups[i]);
584 supportedGroupList->length =
htons(
n);
589 extension->length =
htons(
n);
613 uint8_t *
p,
size_t *written)
617 #if (TLS_MAX_VERSION >= TLS_VERSION_1_0 && TLS_MIN_VERSION <= TLS_VERSION_1_2)
622 #if (TLS_ECDH_ANON_KE_SUPPORT == ENABLED || TLS_ECDHE_RSA_KE_SUPPORT == ENABLED || \
623 TLS_ECDHE_ECDSA_KE_SUPPORT == ENABLED || TLS_ECDHE_PSK_KE_SUPPORT == ENABLED)
644 ecPointFormatList->length = (uint8_t)
n;
649 extension->length =
htons(
n);
675 uint8_t *
p,
size_t *written)
679 #if (TLS_ALPN_SUPPORT == ENABLED)
682 if(context->protocolList != NULL)
707 if(context->protocolList[i] ==
',' || context->protocolList[i] ==
'\0')
716 protocolName->length = i - j;
718 osMemcpy(protocolName->value, context->protocolList + j, i - j);
729 }
while(context->protocolList[i++] !=
'\0');
732 protocolNameList->length =
htons(
n);
737 extension->length =
htons(
n);
761 uint8_t *
p,
size_t *written)
765 #if (TLS_RAW_PUBLIC_KEY_SUPPORT == ENABLED)
789 clientCertTypeList->length = (uint8_t)
n;
794 extension->length =
htons(
n);
817 uint8_t *
p,
size_t *written)
821 #if (TLS_RAW_PUBLIC_KEY_SUPPORT == ENABLED)
823 if(context->rpkVerifyCallback != NULL)
848 serverCertTypeList->length = (uint8_t)
n;
853 extension->length =
htons(
n);
877 uint8_t *
p,
size_t *written)
881 #if (TLS_MAX_VERSION >= TLS_VERSION_1_0 && TLS_MIN_VERSION <= TLS_VERSION_1_2)
887 #if (TLS_ENCRYPT_THEN_MAC_SUPPORT == ENABLED)
897 extension->length =
HTONS(0);
922 uint8_t *
p,
size_t *written)
926 #if (TLS_MAX_VERSION >= TLS_VERSION_1_0 && TLS_MIN_VERSION <= TLS_VERSION_1_2)
933 #if (TLS_EXT_MASTER_SECRET_SUPPORT == ENABLED)
942 extension->length =
HTONS(0);
967 uint8_t *
p,
size_t *written)
971 #if (TLS_MAX_VERSION >= TLS_VERSION_1_0 && TLS_MIN_VERSION <= TLS_VERSION_1_2)
977 #if (TLS_TICKET_SUPPORT == ENABLED)
979 if(context->sessionTicketEnabled)
994 osMemcpy(extension->value, context->ticket, context->ticketLen);
998 n = context->ticketLen;
1009 extension->length =
htons(
n);
1035 uint8_t *
p,
size_t *written)
1039 #if (TLS_MAX_VERSION >= TLS_VERSION_1_0 && TLS_MIN_VERSION <= TLS_VERSION_1_2)
1043 #if (TLS_SECURE_RENEGOTIATION_SUPPORT == ENABLED)
1045 if(context->secureRenegoEnabled)
1049 if(context->secureRenegoFlag)
1055 n = context->clientVerifyDataLen;
1065 renegoInfo->length = (uint8_t)
n;
1069 osMemcpy(renegoInfo->value, context->clientVerifyData,
n);
1075 extension->length =
htons(
n);
1103 size_t clientHelloLen, uint8_t *
p,
size_t *written)
1107 #if (TLS_CLIENT_HELLO_PADDING_SUPPORT == ENABLED)
1119 if(clientHelloLen >= 256 && clientHelloLen < 512)
1141 extension->length =
htons(
n);
1167 #if (TLS_SNI_SUPPORT == ENABLED)
1169 if(serverNameList != NULL)
1174 if(context->serverName == NULL)
1194 #if (TLS_MAX_FRAG_LEN_SUPPORT == ENABLED)
1196 if(maxFragLen != NULL)
1201 switch(maxFragLen->value[0])
1227 if(
n != context->maxFragLen)
1247 #if (TLS_RECORD_SIZE_LIMIT_SUPPORT == ENABLED)
1249 if(recordSizeLimit != NULL)
1279 context->recordSizeLimitExtReceived =
TRUE;
1288 context->recordSizeLimitExtReceived =
FALSE;
1312 #if (TLS_ECDH_ANON_KE_SUPPORT == ENABLED || TLS_ECDHE_RSA_KE_SUPPORT == ENABLED || \
1313 TLS_ECDHE_ECDSA_KE_SUPPORT == ENABLED || TLS_ECDHE_PSK_KE_SUPPORT == ENABLED)
1315 if(ecPointFormatList != NULL)
1320 for(i = 0; i < ecPointFormatList->length; i++)
1332 if(i >= ecPointFormatList->length)
1355 #if (TLS_ALPN_SUPPORT == ENABLED)
1357 if(protocolNameList != NULL)
1365 if(context->protocolList == NULL)
1395 if(!context->unknownProtocolsAllowed)
1400 if(context->selectedProtocol != NULL)
1404 context->selectedProtocol = NULL;
1410 if(context->selectedProtocol == NULL)
1414 osMemcpy(context->selectedProtocol, protocolName->value,
length);
1416 context->selectedProtocol[
length] =
'\0';
1435 #if (TLS_RAW_PUBLIC_KEY_SUPPORT == ENABLED)
1437 if(clientCertType != NULL)
1469 #if (TLS_RAW_PUBLIC_KEY_SUPPORT == ENABLED)
1471 if(serverCertType != NULL)
1476 if(context->rpkVerifyCallback == NULL &&
1511 #if (TLS_ENCRYPT_THEN_MAC_SUPPORT == ENABLED)
1513 if(encryptThenMac != NULL)
1524 context->etmExtReceived =
TRUE;
1529 context->etmExtReceived =
FALSE;
1548 #if (TLS_EXT_MASTER_SECRET_SUPPORT == ENABLED)
1558 if(!context->emsExtReceived)
1563 context->emsExtReceived =
TRUE;
1573 if(context->emsExtReceived)
1578 context->emsExtReceived =
FALSE;
1597 #if (TLS_TICKET_SUPPORT == ENABLED)
1599 if(sessionTicket != NULL)
1604 if(!context->sessionTicketEnabled)
1610 context->sessionTicketExtReceived =
TRUE;
1615 context->sessionTicketExtReceived =
FALSE;
1634 #if (TLS_SECURE_RENEGOTIATION_SUPPORT == ENABLED)
1636 if(context->clientVerifyDataLen == 0)
1642 context->secureRenegoFlag =
TRUE;
1656 context->secureRenegoFlag =
FALSE;
1666 if(
extensions->renegoInfo->length != (context->clientVerifyDataLen +
1667 context->serverVerifyDataLen))
1676 context->clientVerifyDataLen))
1685 context->serverVerifyData, context->serverVerifyDataLen))
1691 #if (TLS_EXT_MASTER_SECRET_SUPPORT == ENABLED)
1698 if(!context->emsExtReceived)
1706 if(context->emsExtReceived)
@ TLS_GROUP_X25519_MLKEM768
@ TLS_GROUP_BRAINPOOLP512R1_TLS13
#define TLS_MAX_RECORD_LENGTH
#define tlsAllocMem(size)
@ TLS_EXT_MAX_FRAGMENT_LENGTH
Parsing and checking of TLS extensions.
@ TLS_CERT_FORMAT_RAW_PUBLIC_KEY
@ TLS_GROUP_BRAINPOOLP256R1_TLS13
error_t tlsFormatClientSupportedVersionsExtension(TlsContext *context, uint8_t *p, size_t *written)
Format SupportedVersions extension.
error_t tlsFormatClientEcPointFormatsExtension(TlsContext *context, uint8_t *p, size_t *written)
Format EcPointFormats extension.
@ ERROR_ILLEGAL_PARAMETER
const EcCurve * tlsGetCurve(TlsContext *context, uint16_t namedCurve)
Get the EC domain parameters that match the specified named curve.
@ TLS_EXT_SUPPORTED_VERSIONS
Helper functions for TLS client.
bool_t tlsIsAlpnProtocolSupported(TlsContext *context, const char_t *protocol, size_t length)
Check whether the specified ALPN protocol is supported.
error_t tlsParseServerRecordSizeLimitExtension(TlsContext *context, const TlsExtension *recordSizeLimit)
Parse RecordSizeLimit extension.
@ TLS_TRANSPORT_PROTOCOL_DATAGRAM
error_t tlsFormatClientSessionTicketExtension(TlsContext *context, uint8_t *p, size_t *written)
Format SessionTicket extension.
#define osMemcmp(p1, p2, length)
error_t tlsParseServerSniExtension(TlsContext *context, const TlsServerNameList *serverNameList)
Parse SNI extension.
error_t tlsParseClientCertTypeExtension(TlsContext *context, const TlsExtension *clientCertType)
Parse ClientCertType extension.
error_t tlsFormatTrustedAuthorities(TlsContext *context, uint8_t *p, size_t *written)
Format the list of trusted authorities.
@ TLS_GROUP_BRAINPOOLP256R1
@ TLS_CIPHER_SUITE_TYPE_TLS13
@ TLS_MAX_FRAGMENT_LENGTH_4096
error_t tlsFormatSupportedGroupsExtension(TlsContext *context, uint8_t *p, size_t *written)
Format SupportedGroups extension.
error_t tlsFormatClientSniExtension(TlsContext *context, uint8_t *p, size_t *written)
Format SNI extension.
bool_t extendedMasterSecret
Extended master secret computation.
@ TLS_CIPHER_SUITE_TYPE_SM
error_t tlsParseServerEtmExtension(TlsContext *context, const TlsExtension *encryptThenMac)
Parse EncryptThenMac extension.
@ TLS_GROUP_CURVE_SM2_MLKEM768
error_t tlsFormatTrustedCaKeysExtension(TlsContext *context, uint8_t *p, size_t *written)
Format TrustedCaKeys extension.
@ TLS_EXT_TRUSTED_CA_KEYS
error_t tlsParseServerMaxFragLenExtension(TlsContext *context, const TlsExtension *maxFragLen)
Parse MaxFragmentLength extension.
#define osMemcpy(dest, src, length)
@ ERROR_UNSUPPORTED_EXTENSION
TlsCertificateFormat
Certificate formats.
@ TLS_EXT_CLIENT_CERT_TYPE
error_t tlsParseServerCertTypeExtension(TlsContext *context, const TlsExtension *serverCertType)
Parse ServerCertType extension.
@ TLS_EXT_EXTENDED_MASTER_SECRET
error_t tlsFormatClientRenegoInfoExtension(TlsContext *context, uint8_t *p, size_t *written)
Format RenegotiationInfo extension.
error_t tlsFormatClientEtmExtension(TlsContext *context, uint8_t *p, size_t *written)
Format EncryptThenMac extension.
@ TLS_GROUP_SECP256R1_MLKEM768
@ TLS_EXT_SUPPORTED_GROUPS
const KemAlgo * tls13GetMlkemAlgo(TlsContext *context, uint16_t namedGroup)
Get the ML-KEM algorithm that matches the specified named group.
@ TLS_EXT_RENEGOTIATION_INFO
const KemAlgo * tls13GetNextGenAlgo(TlsContext *context, uint16_t namedGroup)
Get the next-gen algorithm used by the hybrid key exchange method.
error_t tlsParseServerSessionTicketExtension(TlsContext *context, const TlsExtension *sessionTicket)
Parse SessionTicket extension.
@ TLS_EXT_ENCRYPT_THEN_MAC
@ TLS_CIPHER_SUITE_TYPE_ECDH
bool_t tlsCheckDnsHostname(const char_t *name, size_t length)
DNS hostname verification.
@ TLS_MAX_FRAGMENT_LENGTH_2048
error_t tlsFormatClientAlpnExtension(TlsContext *context, uint8_t *p, size_t *written)
Format ALPN extension.
error_t tlsParseServerEcPointFormatsExtension(TlsContext *context, const TlsEcPointFormatList *ecPointFormatList)
Parse EcPointFormats extension.
@ TLS_EC_POINT_FORMAT_UNCOMPRESSED
@ TLS_GROUP_BRAINPOOLP512R1
const TlsFfdheGroup * tlsGetFfdheGroup(TlsContext *context, uint16_t namedGroup)
Get the FFDHE parameters that match the specified named group.
@ TLS_EXT_EC_POINT_FORMATS
@ TLS_GROUP_BRAINPOOLP384R1_TLS13
Formatting and parsing of extensions (TLS client)
error_t tlsFormatClientHelloPaddingExtension(TlsContext *context, size_t clientHelloLen, uint8_t *p, size_t *written)
Format ClientHello Padding extension.
error_t tlsParseServerEmsExtension(TlsContext *context, const TlsExtension *extendedMasterSecret)
Parse ExtendedMasterSecret extension.
@ TLS_CIPHER_SUITE_TYPE_DH
error_t tlsFormatClientEmsExtension(TlsContext *context, uint8_t *p, size_t *written)
Format ExtendedMasterSecret extension.
@ TLS_EXT_SERVER_CERT_TYPE
@ TLS_MAX_FRAGMENT_LENGTH_1024
const uint16_t tlsSupportedGroups[]
error_t tlsFormatClientCertTypeListExtension(TlsContext *context, uint8_t *p, size_t *written)
Format ClientCertType extension.
TLS (Transport Layer Security)
@ TLS_TRANSPORT_PROTOCOL_STREAM
error_t tlsParseServerRenegoInfoExtension(TlsContext *context, const TlsHelloExtensions *extensions)
Parse RenegotiationInfo extension.
error_t tlsFormatClientRecordSizeLimitExtension(TlsContext *context, uint8_t *p, size_t *written)
Format RecordSizeLimit extension.
const EcCurve * tls13GetTraditionalAlgo(TlsContext *context, uint16_t namedGroup)
Get the traditional algorithm used by the hybrid key exchange method.
error_t tlsParseServerAlpnExtension(TlsContext *context, const TlsProtocolNameList *protocolNameList)
Parse ALPN extension.
error_t tlsFormatServerCertTypeListExtension(TlsContext *context, uint8_t *p, size_t *written)
Format ServerCertType extension.
#define osMemset(p, value, length)
@ TLS_EXT_RECORD_SIZE_LIMIT
@ TLS_GROUP_BRAINPOOLP384R1
@ TLS_MAX_FRAGMENT_LENGTH_512
bool_t tlsIsTicketValid(TlsContext *context)
Check whether a session ticket is valid.
@ TLS_GROUP_SECP384R1_MLKEM1024
error_t tlsFormatClientMaxFragLenExtension(TlsContext *context, uint8_t *p, size_t *written)
Format MaxFragmentLength extension.