Go to the documentation of this file.
32 #define TRACE_LEVEL TLS_TRACE_LEVEL
45 #if (TLS_SUPPORT == ENABLED && TLS_CLIENT_SUPPORT == ENABLED)
92 uint8_t *
p,
size_t *written)
96 #if (TLS_MAX_VERSION >= TLS_VERSION_1_2 && TLS_MIN_VERSION <= TLS_VERSION_1_3)
169 n *=
sizeof(uint16_t);
171 supportedVersionList->length = (uint8_t)
n;
176 extension->length =
htons(
n);
200 uint8_t *
p,
size_t *written)
204 #if (TLS_SNI_SUPPORT == ENABLED)
207 if(context->serverName != NULL)
231 serverName->length =
htons(
n);
233 osMemcpy(serverName->hostname, context->serverName,
n);
238 serverNameList->length =
htons(
n);
243 extension->length =
htons(
n);
273 uint8_t *
p,
size_t *written)
277 #if (TLS_MAX_FRAG_LEN_SUPPORT == ENABLED)
280 if(context->maxFragLen == 512 || context->maxFragLen == 1024 ||
281 context->maxFragLen == 2048 || context->maxFragLen == 4096)
291 switch(context->maxFragLen)
313 extension->length =
htons(
n);
337 uint8_t *
p,
size_t *written)
341 #if (TLS_RECORD_SIZE_LIMIT_SUPPORT == ENABLED)
342 size_t recordSizeLimit;
366 STORE16BE(recordSizeLimit, extension->value);
369 n =
sizeof(uint16_t);
371 extension->length =
htons(
n);
404 #if (TLS_TRUSTED_CA_KEYS_SUPPORT == ENABLED)
406 if(context->trustedCaKeysEnabled && context->versionMin <=
TLS_VERSION_1_2)
426 extension->length =
htons(
n);
461 #if (TLS_ECDH_SUPPORT == ENABLED || TLS_FFDHE_SUPPORT == ENABLED || \
462 TLS_MLKEM_SUPPORT == ENABLED || TLS_HYBRID_SUPPORT == ENABLED)
464 uint_t numSupportedGroups;
465 const uint16_t *supportedGroups;
478 if(context->numSupportedGroups > 0)
481 supportedGroups = context->supportedGroups;
482 numSupportedGroups = context->numSupportedGroups;
495 for(i = 0; i < numSupportedGroups; i++)
497 #if (TLS_FFDHE_SUPPORT == ENABLED)
506 supportedGroupList->value[
n++] =
htons(supportedGroups[i]);
511 #if (TLS_ECDH_SUPPORT == ENABLED)
513 if(
tlsGetCurve(context, supportedGroups[i]) != NULL)
522 supportedGroupList->value[
n++] =
htons(supportedGroups[i]);
532 supportedGroupList->value[
n++] =
htons(supportedGroups[i]);
538 #if (TLS_MLKEM_SUPPORT == ENABLED)
546 supportedGroupList->value[
n++] =
htons(supportedGroups[i]);
551 #if (TLS_HYBRID_SUPPORT == ENABLED)
560 supportedGroupList->value[
n++] =
htons(supportedGroups[i]);
579 supportedGroupList->length =
htons(
n);
584 extension->length =
htons(
n);
608 uint8_t *
p,
size_t *written)
612 #if (TLS_MAX_VERSION >= TLS_VERSION_1_0 && TLS_MIN_VERSION <= TLS_VERSION_1_2)
617 #if (TLS_ECDH_ANON_KE_SUPPORT == ENABLED || TLS_ECDHE_RSA_KE_SUPPORT == ENABLED || \
618 TLS_ECDHE_ECDSA_KE_SUPPORT == ENABLED || TLS_ECDHE_PSK_KE_SUPPORT == ENABLED)
639 ecPointFormatList->length = (uint8_t)
n;
644 extension->length =
htons(
n);
670 uint8_t *
p,
size_t *written)
674 #if (TLS_ALPN_SUPPORT == ENABLED)
677 if(context->protocolList != NULL)
702 if(context->protocolList[i] ==
',' || context->protocolList[i] ==
'\0')
711 protocolName->length = i - j;
713 osMemcpy(protocolName->value, context->protocolList + j, i - j);
724 }
while(context->protocolList[i++] !=
'\0');
727 protocolNameList->length =
htons(
n);
732 extension->length =
htons(
n);
756 uint8_t *
p,
size_t *written)
760 #if (TLS_RAW_PUBLIC_KEY_SUPPORT == ENABLED)
784 clientCertTypeList->length = (uint8_t)
n;
789 extension->length =
htons(
n);
812 uint8_t *
p,
size_t *written)
816 #if (TLS_RAW_PUBLIC_KEY_SUPPORT == ENABLED)
818 if(context->rpkVerifyCallback != NULL)
843 serverCertTypeList->length = (uint8_t)
n;
848 extension->length =
htons(
n);
872 uint8_t *
p,
size_t *written)
876 #if (TLS_MAX_VERSION >= TLS_VERSION_1_0 && TLS_MIN_VERSION <= TLS_VERSION_1_2)
882 #if (TLS_ENCRYPT_THEN_MAC_SUPPORT == ENABLED)
892 extension->length =
HTONS(0);
917 uint8_t *
p,
size_t *written)
921 #if (TLS_MAX_VERSION >= TLS_VERSION_1_0 && TLS_MIN_VERSION <= TLS_VERSION_1_2)
928 #if (TLS_EXT_MASTER_SECRET_SUPPORT == ENABLED)
937 extension->length =
HTONS(0);
962 uint8_t *
p,
size_t *written)
966 #if (TLS_MAX_VERSION >= TLS_VERSION_1_0 && TLS_MIN_VERSION <= TLS_VERSION_1_2)
972 #if (TLS_TICKET_SUPPORT == ENABLED)
974 if(context->sessionTicketEnabled)
989 osMemcpy(extension->value, context->ticket, context->ticketLen);
993 n = context->ticketLen;
1004 extension->length =
htons(
n);
1030 uint8_t *
p,
size_t *written)
1034 #if (TLS_MAX_VERSION >= TLS_VERSION_1_0 && TLS_MIN_VERSION <= TLS_VERSION_1_2)
1038 #if (TLS_SECURE_RENEGOTIATION_SUPPORT == ENABLED)
1040 if(context->secureRenegoEnabled)
1044 if(context->secureRenegoFlag)
1050 n = context->clientVerifyDataLen;
1060 renegoInfo->length = (uint8_t)
n;
1064 osMemcpy(renegoInfo->value, context->clientVerifyData,
n);
1070 extension->length =
htons(
n);
1098 size_t clientHelloLen, uint8_t *
p,
size_t *written)
1102 #if (TLS_CLIENT_HELLO_PADDING_SUPPORT == ENABLED)
1114 if(clientHelloLen >= 256 && clientHelloLen < 512)
1136 extension->length =
htons(
n);
1162 #if (TLS_SNI_SUPPORT == ENABLED)
1164 if(serverNameList != NULL)
1169 if(context->serverName == NULL)
1189 #if (TLS_MAX_FRAG_LEN_SUPPORT == ENABLED)
1191 if(maxFragLen != NULL)
1196 switch(maxFragLen->value[0])
1222 if(
n != context->maxFragLen)
1242 #if (TLS_RECORD_SIZE_LIMIT_SUPPORT == ENABLED)
1244 if(recordSizeLimit != NULL)
1274 context->recordSizeLimitExtReceived =
TRUE;
1283 context->recordSizeLimitExtReceived =
FALSE;
1307 #if (TLS_ECDH_ANON_KE_SUPPORT == ENABLED || TLS_ECDHE_RSA_KE_SUPPORT == ENABLED || \
1308 TLS_ECDHE_ECDSA_KE_SUPPORT == ENABLED || TLS_ECDHE_PSK_KE_SUPPORT == ENABLED)
1310 if(ecPointFormatList != NULL)
1315 for(i = 0; i < ecPointFormatList->length; i++)
1327 if(i >= ecPointFormatList->length)
1350 #if (TLS_ALPN_SUPPORT == ENABLED)
1352 if(protocolNameList != NULL)
1360 if(context->protocolList == NULL)
1390 if(!context->unknownProtocolsAllowed)
1395 if(context->selectedProtocol != NULL)
1399 context->selectedProtocol = NULL;
1405 if(context->selectedProtocol == NULL)
1409 osMemcpy(context->selectedProtocol, protocolName->value,
length);
1411 context->selectedProtocol[
length] =
'\0';
1430 #if (TLS_RAW_PUBLIC_KEY_SUPPORT == ENABLED)
1432 if(clientCertType != NULL)
1464 #if (TLS_RAW_PUBLIC_KEY_SUPPORT == ENABLED)
1466 if(serverCertType != NULL)
1471 if(context->rpkVerifyCallback == NULL &&
1506 #if (TLS_ENCRYPT_THEN_MAC_SUPPORT == ENABLED)
1508 if(encryptThenMac != NULL)
1519 context->etmExtReceived =
TRUE;
1524 context->etmExtReceived =
FALSE;
1543 #if (TLS_EXT_MASTER_SECRET_SUPPORT == ENABLED)
1553 if(!context->emsExtReceived)
1558 context->emsExtReceived =
TRUE;
1568 if(context->emsExtReceived)
1573 context->emsExtReceived =
FALSE;
1592 #if (TLS_TICKET_SUPPORT == ENABLED)
1594 if(sessionTicket != NULL)
1599 if(!context->sessionTicketEnabled)
1605 context->sessionTicketExtReceived =
TRUE;
1610 context->sessionTicketExtReceived =
FALSE;
1629 #if (TLS_SECURE_RENEGOTIATION_SUPPORT == ENABLED)
1631 if(context->clientVerifyDataLen == 0)
1637 context->secureRenegoFlag =
TRUE;
1651 context->secureRenegoFlag =
FALSE;
1661 if(
extensions->renegoInfo->length != (context->clientVerifyDataLen +
1662 context->serverVerifyDataLen))
1671 context->clientVerifyDataLen))
1680 context->serverVerifyData, context->serverVerifyDataLen))
1686 #if (TLS_EXT_MASTER_SECRET_SUPPORT == ENABLED)
1693 if(!context->emsExtReceived)
1701 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
@ TLS_TRANSPORT_PROTOCOL_QUIC
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.
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.
@ TLS_TRANSPORT_PROTOCOL_EAP
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.