Go to the documentation of this file.
32 #define TRACE_LEVEL TLS_TRACE_LEVEL
49 #if (TLS_SUPPORT == ENABLED)
76 if(context->cert != NULL)
79 certChain = context->cert->certChain;
81 certChainLen = context->cert->certChainLen;
92 while(certChainLen > 0)
106 if((*written +
n + 3) > context->txBufferMaxLen)
130 #if (TLS_MAX_VERSION >= TLS_VERSION_1_3 && TLS_MIN_VERSION <= TLS_VERSION_1_3)
171 #if (TLS_RAW_PUBLIC_KEY_SUPPORT == ENABLED)
173 if(context->cert != NULL)
189 context->cert->certChainLen, NULL, &derCertLen, NULL);
205 context->cert->certChainLen, derCert, &derCertLen, NULL);
228 #if (TLS_MAX_VERSION >= TLS_VERSION_1_3 && TLS_MIN_VERSION <= TLS_VERSION_1_3)
288 const uint8_t *
p,
size_t length)
294 const char_t *subjectName;
300 issuerCertInfo = NULL;
318 if(issuerCertInfo == NULL)
359 #if (TLS_MAX_EMPTY_RECORDS > 0)
369 context->keyExchMethod);
381 #if (TLS_CLIENT_SUPPORT == ENABLED)
410 subjectName = context->serverName;
442 error = certValidResult;
450 #if (TLS_MAX_VERSION >= TLS_VERSION_1_3 && TLS_MIN_VERSION <= TLS_VERSION_1_3)
468 for(i = 0;
length > 0; i++)
547 error = certValidResult;
553 *certInfo = *issuerCertInfo;
559 #if (TLS_MAX_VERSION >= TLS_VERSION_1_3 && TLS_MIN_VERSION <= TLS_VERSION_1_3)
611 #if (TLS_RAW_PUBLIC_KEY_SUPPORT == ENABLED)
613 if(context->rpkVerifyCallback != NULL)
616 size_t rawPublicKeyLen;
617 const uint8_t *rawPublicKey;
620 #if (TLS_MAX_VERSION >= TLS_VERSION_1_3 && TLS_MIN_VERSION <= TLS_VERSION_1_3)
636 if(
length < rawPublicKeyLen)
652 &subjectPublicKeyInfo);
658 p += rawPublicKeyLen;
660 length -= rawPublicKeyLen;
662 #if (TLS_MAX_VERSION >= TLS_VERSION_1_3 && TLS_MIN_VERSION <= TLS_VERSION_1_3)
694 error = context->rpkVerifyCallback(context, rawPublicKey,
725 const TlsCertDesc *cert,
const uint8_t *certTypes,
size_t numCertTypes,
742 #if (TLS_MAX_VERSION >= TLS_VERSION_1_0 && TLS_MIN_VERSION <= TLS_VERSION_1_1)
774 #if (TLS_MAX_VERSION >= TLS_VERSION_1_0 && TLS_MIN_VERSION <= TLS_VERSION_1_2)
779 if(acceptable && certTypes != NULL)
782 for(i = 0, acceptable =
FALSE; i < numCertTypes && !acceptable; i++)
824 if(acceptable && curveList != NULL)
827 n =
ntohs(curveList->length) /
sizeof(uint16_t);
830 for(i = 0, acceptable =
FALSE; i <
n && !acceptable; i++)
843 #if (TLS_SM2_SIGN_SUPPORT == ENABLED)
857 if(acceptable && certSignAlgoList != NULL)
860 n =
ntohs(certSignAlgoList->length) /
sizeof(uint16_t);
863 for(i = 0, acceptable =
FALSE; i <
n && !acceptable; i++)
874 if(acceptable && certAuthorities != NULL)
907 while(certChainLen > 0 && !acceptable)
912 &derCertLen, &pemCertLen);
925 derCert, &derCertLen, NULL);
939 for(i = 0; i <
length; i +=
n + 2)
947 n =
LOAD16BE(certAuthorities->value + i);
969 certChain += pemCertLen;
970 certChainLen -= pemCertLen;
1004 const char_t *trustedCaList;
1005 size_t trustedCaListLen;
1014 if(context->certVerifyCallback != NULL)
1017 error = context->certVerifyCallback(context, certInfo, pathLen,
1018 context->certVerifyParam);
1029 if(context->trustedCaListLen > 0)
1032 trustedCaList = context->trustedCaList;
1034 trustedCaListLen = context->trustedCaListLen;
1040 if(caCertInfo != NULL)
1048 NULL, &derCertLen, &pemCertLen);
1061 trustedCaListLen, derCert, &derCertLen, NULL);
1108 trustedCaList += pemCertLen;
1109 trustedCaListLen -= pemCertLen;
1114 trustedCaListLen = 0;
1169 if(certInfo == NULL || certType == NULL || namedCurve == NULL)
1176 #if (TLS_RSA_SIGN_SUPPORT == ENABLED || TLS_RSA_PSS_SIGN_SUPPORT == ENABLED)
1187 #if (TLS_RSA_PSS_SIGN_SUPPORT == ENABLED)
1198 #if (TLS_DSA_SIGN_SUPPORT == ENABLED)
1209 #if (TLS_ECDSA_SIGN_SUPPORT == ENABLED || TLS_SM2_SIGN_SUPPORT == ENABLED)
1242 #if (TLS_ED25519_SIGN_SUPPORT == ENABLED)
1253 #if (TLS_ED448_SIGN_SUPPORT == ENABLED)
1289 if(certInfo == NULL || signScheme == NULL)
1296 #if (RSA_SUPPORT == ENABLED)
1325 #if (RSA_SUPPORT == ENABLED && X509_RSA_PSS_SUPPORT == ENABLED)
1333 #if (SHA256_SUPPORT == ENABLED)
1342 #if (SHA384_SUPPORT == ENABLED)
1351 #if (SHA512_SUPPORT == ENABLED)
1368 #if (DSA_SUPPORT == ENABLED)
1387 #if (ECDSA_SUPPORT == ENABLED)
1416 #if (SM2_SUPPORT == ENABLED)
1425 #if (ED25519_SUPPORT == ENABLED)
1434 #if (ED448_SUPPORT == ENABLED)
1472 #if (TLS_RSA_SIGN_SUPPORT == ENABLED || TLS_RSA_PSS_SIGN_SUPPORT == ENABLED)
1481 subjectPublicKeyInfo);
1521 #if (TLS_DSA_SIGN_SUPPORT == ENABLED)
1529 subjectPublicKeyInfo);
1554 #if (TLS_ECDSA_SIGN_SUPPORT == ENABLED || TLS_SM2_SIGN_SUPPORT == ENABLED)
1560 subjectPublicKeyInfo);
1581 #if (TLS_ED25519_SIGN_SUPPORT == ENABLED || TLS_ED448_SIGN_SUPPORT == ENABLED)
1588 subjectPublicKeyInfo);
1619 #if (TLS_CLIENT_SUPPORT == ENABLED)
1701 #if (TLS_CERT_KEY_USAGE_SUPPORT == ENABLED)
1713 if(keyUsage->
bitmap != 0)
1767 if(extKeyUsage->
bitmap != 0)
#define tlsAllocMem(size)
X.509 certificate parsing.
error_t x509ImportEcPublicKey(EcPublicKey *publicKey, const X509SubjectPublicKeyInfo *publicKeyInfo)
Import an EC public key.
X509SignAlgoId signatureAlgo
error_t x509ValidateCertificate(const X509CertInfo *certInfo, const X509CertInfo *issuerCertInfo, uint_t pathLen)
X.509 certificate validation.
const uint8_t DSA_WITH_SHA224_OID[9]
X509TbsCertificate tbsCert
const uint8_t MD5_WITH_RSA_ENCRYPTION_OID[9]
const uint8_t SHA512_WITH_RSA_ENCRYPTION_OID[9]
#define TLS_MAX_DSA_MODULUS_SIZE
__weak_func error_t tlsParseCertificateList(TlsContext *context, const uint8_t *p, size_t length)
Parse certificate chain.
@ ERROR_UNKNOWN_CERTIFICATE
const EcCurve * tlsGetCurve(TlsContext *context, uint16_t namedCurve)
Get the EC domain parameters that match the specified named curve.
X509Extensions extensions
error_t x509ParseSubjectPublicKeyInfo(const uint8_t *data, size_t length, size_t *totalLength, X509SubjectPublicKeyInfo *publicKeyInfo)
Parse SubjectPublicKeyInfo structure.
TlsConnectionEnd
TLS connection end.
error_t x509ParseCertificate(const uint8_t *data, size_t length, X509CertInfo *certInfo)
Parse a X.509 certificate.
bool_t tlsIsCertificateAcceptable(TlsContext *context, const TlsCertDesc *cert, const uint8_t *certTypes, size_t numCertTypes, const TlsSupportedGroupList *curveList, const TlsSignSchemeList *certSignAlgoList, const TlsCertAuthorities *certAuthorities)
Check whether a certificate is acceptable.
const uint8_t EC_PUBLIC_KEY_OID[7]
TlsCertificateType type
End entity certificate type.
X509EcParameters ecParams
@ TLS_SIGN_SCHEME_RSA_PSS_PSS_SHA512
X509ExtendedKeyUsage extKeyUsage
error_t asn1DumpObject(const uint8_t *data, size_t length, uint_t level)
Display an ASN.1 data object.
@ X509_EXT_KEY_USAGE_CLIENT_AUTH
@ ERROR_UNSUPPORTED_CERTIFICATE
@ TLS_SIGN_SCHEME_ED25519
error_t tlsReadSubjectPublicKey(TlsContext *context, const X509SubjectPublicKeyInfo *subjectPublicKeyInfo)
Extract the subject public key from the received certificate.
const uint8_t RSASSA_PSS_OID[9]
error_t x509ImportDsaPublicKey(DsaPublicKey *publicKey, const X509SubjectPublicKeyInfo *publicKeyInfo)
Import a DSA public key.
const uint8_t ECDSA_WITH_SHA256_OID[8]
@ ERROR_CERTIFICATE_REVOKED
@ TLS_SIGN_SCHEME_RSA_PSS_PSS_SHA384
error_t tls13ParseCertExtensions(const uint8_t *p, size_t length, size_t *consumed)
Parse certificate extensions.
bool_t x509CompareName(const uint8_t *name1, size_t nameLen1, const uint8_t *name2, size_t nameLen2)
Compare distinguished names.
const uint8_t SHA384_WITH_RSA_ENCRYPTION_OID[9]
error_t tlsValidateCertificate(TlsContext *context, const X509CertInfo *certInfo, uint_t pathLen, const char_t *subjectName)
Verify certificate against root CAs.
@ TLS_KEY_EXCH_ECDHE_ECDSA
size_t certChainLen
Length of the certificate chain.
error_t pemImportCertificate(const char_t *input, size_t inputLen, uint8_t *output, size_t *outputLen, size_t *consumed)
Decode a PEM file containing a certificate.
PEM file import functions.
@ ERROR_INVALID_PARAMETER
Invalid parameter.
#define osMemcpy(dest, src, length)
@ TLS_SIGN_SCHEME_RSA_PSS_PSS_SHA256
@ TLS_CONNECTION_END_SERVER
TlsKeyExchMethod
Key exchange methods.
Extended Key Usage extension.
const uint8_t SHA256_OID[9]
error_t x509ImportEddsaPublicKey(EddsaPublicKey *publicKey, const X509SubjectPublicKeyInfo *publicKeyInfo)
Import an EdDSA public key.
TlsSignatureScheme signScheme
Signature scheme used to sign the end entity certificate.
const uint8_t ECDSA_WITH_SHA384_OID[8]
error_t tlsFormatRawPublicKey(TlsContext *context, uint8_t *p, size_t *written)
Format raw public key.
@ X509_EXT_KEY_USAGE_SERVER_AUTH
@ X509_KEY_USAGE_DIGITAL_SIGNATURE
TlsNamedGroup tlsGetNamedCurve(const uint8_t *oid, size_t length)
Get the named curve that matches the specified OID.
const uint8_t SM2_WITH_SM3_OID[8]
error_t tls13FormatCertExtensions(uint8_t *p, size_t *written)
Format certificate extensions.
const uint8_t ECDSA_WITH_SHA1_OID[7]
const uint8_t ECDSA_WITH_SHA224_OID[8]
error_t tlsCheckKeyUsage(const X509CertInfo *certInfo, TlsConnectionEnd entity, TlsKeyExchMethod keyExchMethod)
Check certificate key usage.
const uint8_t SHA256_WITH_RSA_ENCRYPTION_OID[9]
X509OctetString namedCurve
TlsCertificateType
Certificate types.
const uint8_t ED448_OID[3]
error_t tlsFormatCertificateList(TlsContext *context, uint8_t *p, size_t *written)
Format certificate chain.
error_t x509CheckNameConstraints(const char_t *subjectName, const X509CertInfo *certInfo)
Check name constraints.
uint_t mpiGetBitLength(const Mpi *a)
Get the actual length in bits.
const uint8_t ECDSA_WITH_SHA512_OID[8]
const uint8_t ED25519_OID[3]
const uint8_t RSA_ENCRYPTION_OID[9]
#define TRACE_WARNING(...)
error_t tlsParseRawPublicKey(TlsContext *context, const uint8_t *p, size_t length)
Parse raw public key.
#define OID_COMP(oid1, oidLen1, oid2)
error_t x509ImportRsaPublicKey(RsaPublicKey *publicKey, const X509SubjectPublicKeyInfo *publicKeyInfo)
Import an RSA public key.
Subject Public Key Information extension.
@ TLS_SIGN_SCHEME_SM2SIG_SM3
#define TLS_MAX_RSA_MODULUS_SIZE
error_t tlsGetCertificateSignAlgo(const X509CertInfo *certInfo, TlsSignatureScheme *signScheme)
Retrieve the signature algorithm used to sign the certificate.
@ ERROR_CERTIFICATE_EXPIRED
const uint8_t DSA_WITH_SHA1_OID[7]
@ TLS_CONNECTION_END_CLIENT
const uint8_t DSA_WITH_SHA256_OID[9]
X.509 certificate handling.
Helper functions for signature generation and verification.
TLS (Transport Layer Security)
const uint8_t SHA512_OID[9]
X.509 certificate validation.
error_t x509CheckSubjectName(const X509CertInfo *certInfo, const char_t *fqdn)
Check whether the certificate matches the specified FQDN.
const char_t * certChain
End entity certificate chain (PEM format)
#define TLS_SIGN_ALGO(signScheme)
error_t tlsGetCertificateType(const X509CertInfo *certInfo, TlsCertificateType *certType, TlsNamedGroup *namedCurve)
Retrieve the certificate type.
Parsing of ASN.1 encoded keys.
TlsNamedGroup
Named groups.
TlsSignatureScheme
Signature schemes.
@ X509_KEY_USAGE_KEY_ENCIPHERMENT
X509SubjectPublicKeyInfo subjectPublicKeyInfo
const uint8_t SHA384_OID[9]
X509RsaPssParameters rsaPssParams
#define TLS_SIGN_SCHEME(signAlgo, hashAlgo)
const uint8_t SHA1_WITH_RSA_ENCRYPTION_OID[9]
TlsNamedGroup namedCurve
Named curve used to generate the EC public key.
ASN.1 (Abstract Syntax Notation One)