Go to the documentation of this file.
32 #define TRACE_LEVEL TLS_TRACE_LEVEL
45 #if (TLS_SUPPORT == ENABLED)
57 context->state = newState;
60 if(context->stateChangeCallback != NULL)
63 context->stateChangeCallback(context, newState);
212 if(context->prngAlgo != NULL && context->prngContext != NULL)
216 error = context->prngAlgo->read(context->prngContext,
random, 32);
224 #if (TLS_MAX_VERSION >= TLS_VERSION_1_3 && TLS_MIN_VERSION <= TLS_VERSION_1_3)
275 if(context->prngAlgo != NULL && context->prngContext != NULL)
279 error = context->prngAlgo->read(context->prngContext, context->sessionId,
286 context->sessionIdLen =
length;
315 if(
version >= context->versionMin && version <= context->versionMax)
361 if(context->numCipherSuites > 0)
364 for(i = 0; i < context->numCipherSuites; i++)
372 if(i >= context->numCipherSuites)
382 context->version, context->transportProtocol))
394 context->keyExchMethod =
cipherSuite->keyExchMethod;
398 if(context->cipherSuite.prfHashAlgo == NULL)
407 context->cipherSuite.verifyDataLen = 12;
433 #if (TLS_MAX_VERSION >= TLS_VERSION_1_0 && TLS_MIN_VERSION <= TLS_VERSION_1_2)
439 if(context->sessionIdLen == 0)
443 if(context->cipherSuite.identifier == 0)
450 session->
version = context->version;
451 session->
cipherSuite = context->cipherSuite.identifier;
460 #if (TLS_EXT_MASTER_SECRET_SUPPORT == ENABLED)
465 #if (TLS_SNI_SUPPORT == ENABLED)
468 context->serverName != NULL)
505 #if (TLS_MAX_VERSION >= TLS_VERSION_1_0 && TLS_MIN_VERSION <= TLS_VERSION_1_2)
511 if(context->ticket == NULL || context->ticketLen == 0)
515 if(context->cipherSuite.identifier == 0)
519 session->
version = context->version;
520 session->
cipherSuite = context->cipherSuite.identifier;
525 if(session->
ticket == NULL)
535 #if (TLS_EXT_MASTER_SECRET_SUPPORT == ENABLED)
559 #if (TLS_MAX_VERSION >= TLS_VERSION_1_0 && TLS_MIN_VERSION <= TLS_VERSION_1_2)
573 context->version = session->
version;
574 context->cipherSuite.identifier = session->
cipherSuite;
575 context->sessionIdLen = 0;
584 #if (TLS_EXT_MASTER_SECRET_SUPPORT == ENABLED)
608 #if (TLS_MAX_VERSION >= TLS_VERSION_1_0 && TLS_MIN_VERSION <= TLS_VERSION_1_2)
622 context->version = session->
version;
623 context->cipherSuite.identifier = session->
cipherSuite;
624 context->sessionIdLen = 0;
627 if(context->ticket != NULL)
629 osMemset(context->ticket, 0, context->ticketLen);
631 context->ticket = NULL;
632 context->ticketLen = 0;
638 if(context->ticket == NULL)
648 #if (TLS_EXT_MASTER_SECRET_SUPPORT == ENABLED)
686 encryptionEngine->version = context->version;
692 #if (DTLS_SUPPORT == ENABLED)
695 encryptionEngine->epoch++;
702 #if (TLS_RECORD_SIZE_LIMIT_SUPPORT == ENABLED)
706 if(entity == context->entity)
708 encryptionEngine->recordSizeLimit = context->recordSizeLimit;
712 encryptionEngine->recordSizeLimit =
MIN(context->rxBufferMaxLen,
717 #if (TLS_ENCRYPT_THEN_MAC_SUPPORT == ENABLED)
721 encryptionEngine->encryptThenMac = context->etmExtReceived;
726 encryptionEngine->macKeyLen =
cipherSuite->macKeyLen;
727 encryptionEngine->encKeyLen =
cipherSuite->encKeyLen;
728 encryptionEngine->fixedIvLen =
cipherSuite->fixedIvLen;
729 encryptionEngine->recordIvLen =
cipherSuite->recordIvLen;
730 encryptionEngine->authTagLen =
cipherSuite->authTagLen;
733 encryptionEngine->cipherAlgo =
cipherSuite->cipherAlgo;
734 encryptionEngine->cipherMode =
cipherSuite->cipherMode;
735 encryptionEngine->hashAlgo =
cipherSuite->hashAlgo;
738 encryptionEngine->cipherContext = NULL;
740 #if (TLS_MAX_VERSION >= TLS_VERSION_1_0 && TLS_MIN_VERSION <= TLS_VERSION_1_2)
742 encryptionEngine->hmacContext = &context->hmacContext;
745 #if (TLS_GCM_CIPHER_SUPPORT == ENABLED)
747 encryptionEngine->gcmContext = NULL;
750 #if (TLS_MAX_VERSION >= TLS_VERSION_1_0 && TLS_MIN_VERSION <= TLS_VERSION_1_2)
760 p = context->keyBlock;
797 #if (TLS_MAX_VERSION >= TLS_VERSION_1_3 && TLS_MIN_VERSION <= TLS_VERSION_1_3)
858 if(encryptionEngine->cipherContext != NULL)
861 error = cipherAlgo->
init(encryptionEngine->cipherContext,
883 #if (TLS_GCM_CIPHER_SUPPORT == ENABLED)
894 if(encryptionEngine->gcmContext != NULL)
897 error =
gcmInit(encryptionEngine->gcmContext, cipherAlgo,
898 encryptionEngine->cipherContext);
922 if(encryptionEngine->cipherContext != NULL)
925 encryptionEngine->cipherAlgo->deinit(encryptionEngine->cipherContext);
929 encryptionEngine->cipherContext = NULL;
932 #if (TLS_GCM_CIPHER_SUPPORT == ENABLED)
934 if(encryptionEngine->gcmContext != NULL)
941 encryptionEngine->gcmContext = NULL;
946 encryptionEngine->cipherAlgo = NULL;
948 encryptionEngine->hashAlgo = NULL;
1039 #if (TLS_ECDH_ANON_KE_SUPPORT == ENABLED || TLS_ECDHE_RSA_KE_SUPPORT == ENABLED || \
1040 TLS_ECDHE_ECDSA_KE_SUPPORT == ENABLED || TLS_ECDHE_PSK_KE_SUPPORT == ENABLED)
1076 const uint8_t *
data,
size_t size,
size_t *
length)
1078 #if (TLS_ECDH_ANON_KE_SUPPORT == ENABLED || TLS_ECDHE_RSA_KE_SUPPORT == ENABLED || \
1079 TLS_ECDHE_ECDSA_KE_SUPPORT == ENABLED || TLS_ECDHE_PSK_KE_SUPPORT == ENABLED)
1128 static const char_t *
const label[] =
1191 #if (TLS_MD5_SUPPORT == ENABLED)
1197 #if (TLS_SHA1_SUPPORT == ENABLED)
1203 #if (TLS_SHA224_SUPPORT == ENABLED)
1209 #if (TLS_SHA256_SUPPORT == ENABLED)
1215 #if (TLS_SHA384_SUPPORT == ENABLED)
1221 #if (TLS_SHA512_SUPPORT == ENABLED)
1227 #if (TLS_SM3_SUPPORT == ENABLED)
1259 #if (TLS_ECDH_SUPPORT == ENABLED)
1263 #if (TLS_SECP160K1_SUPPORT == ENABLED)
1269 #if (TLS_SECP160R1_SUPPORT == ENABLED)
1275 #if (TLS_SECP160R2_SUPPORT == ENABLED)
1281 #if (TLS_SECP192K1_SUPPORT == ENABLED)
1287 #if (TLS_SECP192R1_SUPPORT == ENABLED)
1293 #if (TLS_SECP224K1_SUPPORT == ENABLED)
1299 #if (TLS_SECP224R1_SUPPORT == ENABLED)
1305 #if (TLS_SECP256K1_SUPPORT == ENABLED)
1311 #if (TLS_SECP256R1_SUPPORT == ENABLED)
1317 #if (TLS_SECP384R1_SUPPORT == ENABLED)
1323 #if (TLS_SECP521R1_SUPPORT == ENABLED)
1329 #if (TLS_BRAINPOOLP256R1_SUPPORT == ENABLED)
1336 #if (TLS_BRAINPOOLP384R1_SUPPORT == ENABLED)
1343 #if (TLS_BRAINPOOLP512R1_SUPPORT == ENABLED)
1350 #if (TLS_SM2_SUPPORT == ENABLED)
1356 #if (TLS_X25519_SUPPORT == ENABLED)
1362 #if (TLS_X448_SUPPORT == ENABLED)
1376 if(context->numSupportedGroups > 0)
1379 for(i = 0; i < context->numSupportedGroups; i++)
1382 if(context->supportedGroups[i] == namedCurve)
1387 if(i >= context->numSupportedGroups)
1412 #if (TLS_ECDSA_SIGN_SUPPORT == ENABLED)
1418 #if (TLS_SECP160K1_SUPPORT == ENABLED)
1425 #if (TLS_SECP160R1_SUPPORT == ENABLED)
1432 #if (TLS_SECP160R2_SUPPORT == ENABLED)
1439 #if (TLS_SECP192K1_SUPPORT == ENABLED)
1446 #if (TLS_SECP192R1_SUPPORT == ENABLED)
1453 #if (TLS_SECP224K1_SUPPORT == ENABLED)
1460 #if (TLS_SECP224R1_SUPPORT == ENABLED)
1467 #if (TLS_SECP256K1_SUPPORT == ENABLED)
1474 #if (TLS_SECP256R1_SUPPORT == ENABLED)
1481 #if (TLS_SECP384R1_SUPPORT == ENABLED)
1488 #if (TLS_SECP521R1_SUPPORT == ENABLED)
1495 #if (TLS_BRAINPOOLP256R1_SUPPORT == ENABLED)
1502 #if (TLS_BRAINPOOLP384R1_SUPPORT == ENABLED)
1509 #if (TLS_BRAINPOOLP512R1_SUPPORT == ENABLED)
1516 #if (TLS_SM2_SUPPORT == ENABLED)
1551 if(encryptionEngine->hashAlgo != NULL)
1552 n += encryptionEngine->hashAlgo->digestSize;
1560 n += encryptionEngine->recordIvLen;
1565 n += encryptionEngine->cipherAlgo->blockSize -
1566 ((
payloadLen +
n) % encryptionEngine->cipherAlgo->blockSize);
1572 n += encryptionEngine->recordIvLen + encryptionEngine->authTagLen;
1577 n += encryptionEngine->authTagLen;
1605 for(i = 0; i <
length && valid; i++)
1610 if(
name[i] ==
'-' ||
name[i] ==
'.')
1614 else if(
name[i] >=
'0' &&
name[i] <=
'9')
1618 else if(
name[i] >=
'A' &&
name[i] <=
'Z')
1622 else if(
name[i] >=
'a' &&
name[i] <=
'z')
1626 else if(
name[i] ==
'_')
@ TLS_GROUP_BRAINPOOLP512R1_TLS13
#define TLS_MAX_RECORD_LENGTH
#define tlsAllocMem(size)
size_t ticketLen
Length of the session ticket.
const uint8_t tls11DowngradeRandom[8]
@ TLS_ALERT_UNEXPECTED_MESSAGE
@ TLS_GROUP_BRAINPOOLP256R1_TLS13
uint16_t cipherSuite
Cipher suite identifier.
error_t tlsSaveSessionTicket(const TlsContext *context, TlsSessionState *session)
Save session ticket.
@ TLS_ALERT_CERTIFICATE_REQUIRED
error_t ecImportPublicKey(EcPublicKey *key, const EcCurve *curve, const uint8_t *data, size_t length, EcPublicKeyFormat format)
Import an EC public key.
const HashAlgo * tlsGetHashAlgo(TlsHashAlgo hashAlgoId)
Get the hash algorithm that matches the specified identifier.
const uint8_t X25519_OID[3]
Arbitrary precision integer.
error_t tlsGenerateSessionId(TlsContext *context, size_t length)
Generate a random session identifier.
@ TLS_ALERT_ILLEGAL_PARAMETER
@ ERROR_VERSION_NOT_SUPPORTED
uint8_t * ticket
Session ticket.
@ ERROR_UNKNOWN_CERTIFICATE
@ ERROR_ILLEGAL_PARAMETER
const EcCurve * tlsGetCurve(TlsContext *context, uint16_t namedCurve)
Get the EC domain parameters that match the specified named curve.
@ ERROR_DECRYPTION_FAILED
uint8_t secret[TLS_MASTER_SECRET_SIZE]
Master secret (TLS 1.2) or ticket PSK (TLS 1.3)
@ TLS_ALERT_UNSUPPORTED_EXTENSION
@ ERROR_UNEXPECTED_MESSAGE
@ TLS_ALERT_RECORD_OVERFLOW
error_t tlsSelectVersion(TlsContext *context, uint16_t version)
Set the TLS version to be used.
TlsConnectionEnd
TLS connection end.
systime_t timestamp
Time stamp to manage entry lifetime.
const uint8_t SECP224R1_OID[5]
error_t tlsSaveSessionId(const TlsContext *context, TlsSessionState *session)
Save session ID.
const uint8_t BRAINPOOLP512R1_OID[9]
Structure describing a cipher suite.
const uint8_t SECP160K1_OID[5]
size_t sessionIdLen
Length of the session identifier.
const uint8_t SECP256K1_OID[5]
error_t tlsWriteMpi(const Mpi *a, uint8_t *data, size_t *length)
Encode a multiple precision integer to an opaque vector.
TlsHashAlgo
Hash algorithms.
const uint8_t BRAINPOOLP384R1_OID[9]
const uint8_t tls12DowngradeRandom[8]
@ EC_PUBLIC_KEY_FORMAT_X963
__weak_func error_t gcmInit(GcmContext *context, const CipherAlgo *cipherAlgo, void *cipherContext)
Initialize GCM context.
@ ERROR_UNSUPPORTED_CERTIFICATE
@ TLS_ALERT_DECRYPT_ERROR
@ TLS_GROUP_BRAINPOOLP256R1
const uint8_t SECP256R1_OID[8]
const uint8_t SECP224K1_OID[5]
const uint8_t SECP521R1_OID[5]
uint16_t cipherSuite
Cipher suite identifier.
error_t tlsSendAlert(TlsContext *context, uint8_t level, uint8_t description)
Send Alert message.
#define osMemcpy(dest, src, length)
@ ERROR_UNSUPPORTED_EXTENSION
@ TLS_ALERT_BAD_RECORD_MAC
@ TLS_CONNECTION_END_SERVER
void tlsFreeEncryptionEngine(TlsEncryptionEngine *encryptionEngine)
Release encryption engine.
@ ERROR_FAILURE
Generic error code.
error_t tlsSelectCipherSuite(TlsContext *context, uint16_t identifier)
Set cipher suite.
error_t mpiImport(Mpi *r, const uint8_t *input, size_t length, MpiFormat format)
Octet string to integer conversion.
@ TLS_ALERT_UNSUPPORTED_CERTIFICATE
bool_t tlsCheckDnsHostname(const char_t *name, size_t length)
DNS hostname verification.
@ ERROR_MISSING_EXTENSION
Handshake message processing (TLS client and server)
@ TLS_ALERT_MISSING_EXTENSION
@ TLS_TRANSPORT_PROTOCOL_EAP
const uint8_t SECP160R1_OID[5]
error_t mpiExport(const Mpi *a, uint8_t *output, size_t length, MpiFormat format)
Integer to octet string conversion.
size_t tlsComputeEncryptionOverhead(TlsEncryptionEngine *encryptionEngine, size_t payloadLen)
Compute overhead caused by encryption.
TlsNamedGroup tlsGetNamedCurve(const uint8_t *oid, size_t length)
Get the named curve that matches the specified OID.
@ TLS_GROUP_BRAINPOOLP512R1
@ TLS_ALERT_PROTOCOL_VERSION
const uint8_t SECP192R1_OID[8]
error_t ecExportPublicKey(const EcPublicKey *key, uint8_t *data, size_t *length, EcPublicKeyFormat format)
Export an EC public key.
#define TLS_MASTER_SECRET_SIZE
@ TLS_GROUP_BRAINPOOLP384R1_TLS13
const uint8_t SECP384R1_OID[5]
uint8_t secret[TLS_MASTER_SECRET_SIZE]
Master secret.
const uint8_t X448_OID[3]
bool_t tlsIsCipherSuiteAcceptable(const TlsCipherSuiteInfo *cipherSuite, uint16_t minVersion, uint16_t maxVersion, TlsTransportProtocol transportProtocol)
Check whether a cipher suite can be used with a given protocol version.
error_t tlsRestoreSessionId(TlsContext *context, const TlsSessionState *session)
Restore a TLS session using session ID.
char_t * serverName
ServerName extension.
error_t tlsWriteEcPoint(const EcPublicKey *publicKey, uint8_t *data, size_t *length)
Encode an EC point to an opaque vector.
const uint8_t SECP192K1_OID[5]
error_t tlsReadMpi(Mpi *a, const uint8_t *data, size_t size, size_t *length)
Read a multiple precision integer from an opaque vector.
@ TLS_ALERT_BAD_CERTIFICATE
@ TLS_ALERT_INAPPROPRIATE_FALLBACK
#define TRACE_DEBUG_ARRAY(p, a, n)
@ ERROR_NO_APPLICATION_PROTOCOL
#define OID_COMP(oid1, oidLen1, oid2)
uint8_t sessionId[32]
Session identifier.
@ ERROR_INAPPROPRIATE_FALLBACK
@ TLS_ALERT_CERTIFICATE_EXPIRED
const TlsCipherSuiteInfo tlsSupportedCipherSuites[]
@ ERROR_CERTIFICATE_EXPIRED
@ TLS_ALERT_NO_APPLICATION_PROTOCOL
@ TLS_CONNECTION_END_CLIENT
Common interface for encryption algorithms.
TLS (Transport Layer Security)
error_t tlsReadEcPoint(EcPublicKey *publicKey, const EcCurve *curve, const uint8_t *data, size_t size, size_t *length)
Read an EC point from an opaque vector.
uint16_t version
TLS protocol version.
const EcCurve * ecGetCurve(const uint8_t *oid, size_t length)
Get the elliptic curve that matches the specified OID.
const uint8_t SECP160R2_OID[5]
@ TLS_TRANSPORT_PROTOCOL_STREAM
Common interface for hash algorithms.
__weak_func error_t tlsInitEncryptionEngine(TlsContext *context, TlsEncryptionEngine *encryptionEngine, TlsConnectionEnd entity, const uint8_t *secret)
Initialize encryption engine.
@ CIPHER_MODE_CHACHA20_POLY1305
void tlsProcessError(TlsContext *context, error_t errorCode)
Translate an error code to an alert message.
error_t tls13HkdfExpandLabel(TlsTransportProtocol transportProtocol, const HashAlgo *hash, const uint8_t *secret, size_t secretLen, const char_t *label, const uint8_t *context, size_t contextLen, uint8_t *output, size_t outputLen)
HKDF-Expand-Label function.
const char_t * tlsGetVersionName(uint16_t version)
Convert TLS version to string representation.
uint_t tlsGetNumSupportedCipherSuites(void)
Determine the number of cipher suites supported.
void tlsChangeState(TlsContext *context, TlsState newState)
Update TLS state.
TlsNamedGroup
Named groups.
#define osMemset(p, value, length)
@ TLS_ALERT_HANDSHAKE_FAILURE
@ ERROR_CERTIFICATE_REQUIRED
error_t tlsGenerateRandomValue(TlsContext *context, uint8_t *random)
Generate client or server random value.
@ TLS_ALERT_INTERNAL_ERROR
@ ERROR_INVALID_SIGNATURE
#define TlsEncryptionEngine
bool_t extendedMasterSecret
Extended master secret computation.
@ TLS_GROUP_BRAINPOOLP384R1
@ TLS_ALERT_CERTIFICATE_UNKNOWN
const uint8_t BRAINPOOLP256R1_OID[9]
uint_t mpiGetByteLength(const Mpi *a)
Get the actual length in bytes.
systime_t osGetSystemTime(void)
Retrieve system time.
error_t tlsRestoreSessionTicket(TlsContext *context, const TlsSessionState *session)
Restore a TLS session using session ticket.