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)
365 context->keyExchMethod);
377 #if (TLS_CLIENT_SUPPORT == ENABLED)
406 subjectName = context->serverName;
438 error = certValidResult;
446 #if (TLS_MAX_VERSION >= TLS_VERSION_1_3 && TLS_MIN_VERSION <= TLS_VERSION_1_3)
464 for(i = 0;
length > 0; i++)
539 error = certValidResult;
545 *certInfo = *issuerCertInfo;
551 #if (TLS_MAX_VERSION >= TLS_VERSION_1_3 && TLS_MIN_VERSION <= TLS_VERSION_1_3)
603 #if (TLS_RAW_PUBLIC_KEY_SUPPORT == ENABLED)
605 if(context->rpkVerifyCallback != NULL)
608 size_t rawPublicKeyLen;
609 const uint8_t *rawPublicKey;
612 #if (TLS_MAX_VERSION >= TLS_VERSION_1_3 && TLS_MIN_VERSION <= TLS_VERSION_1_3)
628 if(
length < rawPublicKeyLen)
644 &subjectPublicKeyInfo);
650 p += rawPublicKeyLen;
652 length -= rawPublicKeyLen;
654 #if (TLS_MAX_VERSION >= TLS_VERSION_1_3 && TLS_MIN_VERSION <= TLS_VERSION_1_3)
686 error = context->rpkVerifyCallback(context, rawPublicKey,
719 const uint8_t *certTypes,
size_t numCertTypes,
const TlsSignHashAlgos *signHashAlgos,
732 #if (TLS_RSA_SIGN_SUPPORT == ENABLED || TLS_RSA_PSS_SIGN_SUPPORT == ENABLED)
749 if(acceptable && certTypes != NULL)
752 for(i = 0, acceptable =
FALSE; i < numCertTypes && !acceptable; i++)
764 if(acceptable && signHashAlgos != NULL)
770 for(i = 0, acceptable =
FALSE; i <
n && !acceptable; i++)
776 signAlgo = signHashAlgos->value[i].signature;
777 hashAlgo = signHashAlgos->value[i].hash;
779 #if (TLS_RSA_SIGN_SUPPORT == ENABLED)
789 #if (TLS_RSA_PSS_SIGN_SUPPORT == ENABLED && TLS_SHA256_SUPPORT == ENABLED)
799 #if (TLS_RSA_PSS_SIGN_SUPPORT == ENABLED && TLS_SHA384_SUPPORT == ENABLED)
809 #if (TLS_RSA_PSS_SIGN_SUPPORT == ENABLED && TLS_SHA512_SUPPORT == ENABLED)
828 #if (TLS_RSA_PSS_SIGN_SUPPORT == ENABLED)
837 if(signHashAlgos != NULL)
843 for(i = 0, acceptable =
FALSE; i <
n && !acceptable; i++)
849 signAlgo = signHashAlgos->value[i].signature;
850 hashAlgo = signHashAlgos->value[i].hash;
852 #if (TLS_SHA256_SUPPORT == ENABLED)
861 #if (TLS_SHA384_SUPPORT == ENABLED)
870 #if (TLS_SHA512_SUPPORT == ENABLED)
900 #if (TLS_DSA_SIGN_SUPPORT == ENABLED)
920 if(acceptable && certTypes != NULL)
923 for(i = 0, acceptable =
FALSE; i < numCertTypes && !acceptable; i++)
935 if(acceptable && signHashAlgos != NULL)
941 for(i = 0, acceptable =
FALSE; i <
n && !acceptable; i++)
959 #if (TLS_ECDSA_SIGN_SUPPORT == ENABLED)
978 if(acceptable && certTypes != NULL)
981 for(i = 0, acceptable =
FALSE; i < numCertTypes && !acceptable; i++)
996 if(acceptable && curveList != NULL)
999 n =
ntohs(curveList->length) /
sizeof(uint16_t);
1002 for(i = 0, acceptable =
FALSE; i <
n && !acceptable; i++)
1015 if(acceptable && signHashAlgos != NULL)
1021 for(i = 0, acceptable =
FALSE; i <
n && !acceptable; i++)
1033 #if (TLS_EDDSA_SIGN_SUPPORT == ENABLED)
1048 if(certTypes != NULL)
1051 for(i = 0, acceptable =
FALSE; i < numCertTypes && !acceptable; i++)
1063 if(acceptable && signHashAlgos != NULL)
1069 for(i = 0, acceptable =
FALSE; i <
n && !acceptable; i++)
1071 #if (TLS_ED25519_SUPPORT == ENABLED)
1084 #if (TLS_ED448_SUPPORT == ENABLED)
1124 if(acceptable && certSignHashAlgos != NULL)
1130 for(i = 0, acceptable =
FALSE; i <
n && !acceptable; i++)
1133 if(certSignHashAlgos->value[i].signature == cert->
signAlgo &&
1134 certSignHashAlgos->value[i].hash == cert->
hashAlgo)
1142 if(acceptable && certAuthorities != NULL)
1154 size_t certChainLen;
1172 if(certInfo != NULL)
1175 while(certChainLen > 0 && !acceptable)
1180 &derCertLen, &pemCertLen);
1193 derCert, &derCertLen, NULL);
1207 for(i = 0; i <
length; i +=
n + 2)
1215 n =
LOAD16BE(certAuthorities->value + i);
1237 certChain += pemCertLen;
1238 certChainLen -= pemCertLen;
1269 const char_t *subjectName)
1273 const char_t *trustedCaList;
1274 size_t trustedCaListLen;
1283 if(context->certVerifyCallback != NULL)
1286 error = context->certVerifyCallback(context, certInfo, pathLen,
1287 context->certVerifyParam);
1298 if(context->trustedCaListLen > 0)
1301 trustedCaList = context->trustedCaList;
1303 trustedCaListLen = context->trustedCaListLen;
1309 if(caCertInfo != NULL)
1317 NULL, &derCertLen, &pemCertLen);
1330 trustedCaListLen, derCert, &derCertLen, NULL);
1377 trustedCaList += pemCertLen;
1378 trustedCaListLen -= pemCertLen;
1383 trustedCaListLen = 0;
1438 if(certInfo == NULL || certType == NULL || namedCurve == NULL)
1445 #if (TLS_RSA_SIGN_SUPPORT == ENABLED || TLS_RSA_PSS_SIGN_SUPPORT == ENABLED)
1456 #if (TLS_RSA_PSS_SIGN_SUPPORT == ENABLED)
1467 #if (TLS_DSA_SIGN_SUPPORT == ENABLED)
1478 #if (TLS_ECDSA_SIGN_SUPPORT == ENABLED)
1494 #if (TLS_EDDSA_SIGN_SUPPORT == ENABLED)
1540 if(certInfo == NULL || signAlgo == NULL || hashAlgo == NULL)
1547 #if (RSA_SUPPORT == ENABLED)
1586 #if (RSA_PSS_SUPPORT == ENABLED)
1591 const uint8_t *hashAlgo;
1597 #if (SHA256_SUPPORT == ENABLED)
1607 #if (SHA384_SUPPORT == ENABLED)
1617 #if (SHA512_SUPPORT == ENABLED)
1635 #if (DSA_SUPPORT == ENABLED)
1660 #if (ECDSA_SUPPORT == ENABLED)
1699 #if (ED25519_SUPPORT == ENABLED)
1709 #if (ED448_SUPPORT == ENABLED)
1745 oid = subjectPublicKeyInfo->
oid;
1748 #if (TLS_RSA_SIGN_SUPPORT == ENABLED || TLS_RSA_PSS_SIGN_SUPPORT == ENABLED)
1757 &context->peerRsaPublicKey);
1797 #if (TLS_DSA_SIGN_SUPPORT == ENABLED)
1805 &context->peerDsaPublicKey);
1830 #if (TLS_ECDSA_SIGN_SUPPORT == ENABLED)
1841 if(curveInfo != NULL)
1850 error =
ecImport(&context->peerEcParams, &context->peerEcPublicKey.q,
1869 #if (TLS_EDDSA_SIGN_SUPPORT == ENABLED)
1880 if(curveInfo != NULL)
1889 error =
ecImport(&context->peerEcParams, &context->peerEcPublicKey.q,
1928 #if (TLS_CLIENT_SUPPORT == ENABLED)
2007 #if (TLS_CERT_KEY_USAGE_SUPPORT == ENABLED)
2019 if(keyUsage->
bitmap != 0)
2071 if(extKeyUsage->
bitmap != 0)
__start_packed struct @14 TlsSupportedGroupList
List of supported groups.
#define tlsAllocMem(size)
@ TLS_SIGN_ALGO_RSA_PSS_RSAE_SHA256
bool_t tlsIsCertificateAcceptable(TlsContext *context, const TlsCertDesc *cert, const uint8_t *certTypes, size_t numCertTypes, const TlsSignHashAlgos *signHashAlgos, const TlsSignHashAlgos *certSignHashAlgos, const TlsSupportedGroupList *curveList, const TlsCertAuthorities *certAuthorities)
Check whether a certificate is acceptable.
X.509 certificate parsing.
const uint8_t DSA_WITH_SHA224_OID[9]
const EcCurveInfo * x509GetCurveInfo(const uint8_t *oid, size_t length)
Get the elliptic curve that matches the specified OID.
const uint8_t MD5_WITH_RSA_ENCRYPTION_OID[9]
const uint8_t SHA512_WITH_RSA_ENCRYPTION_OID[9]
error_t x509ImportRsaPublicKey(const X509SubjectPublicKeyInfo *publicKeyInfo, RsaPublicKey *publicKey)
Import an RSA public key.
#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
error_t ecImport(const EcDomainParameters *params, EcPoint *r, const uint8_t *data, size_t length)
Convert an octet string to an EC point.
X509Extensions extensions
error_t x509ParseSubjectPublicKeyInfo(const uint8_t *data, size_t length, size_t *totalLength, X509SubjectPublicKeyInfo *publicKeyInfo)
Parse SubjectPublicKeyInfo structure.
TlsConnectionEnd
TLS connection end.
@ TLS_SIGN_ALGO_RSA_PSS_PSS_SHA384
X509RsaPssParameters rsaPssParams
const uint8_t EC_PUBLIC_KEY_OID[7]
TlsHashAlgo hashAlgo
Hash algorithm used to sign the end entity certificate.
TlsCertificateType type
End entity certificate type.
X509EcParameters ecParams
X509ExtendedKeyUsage extKeyUsage
error_t asn1DumpObject(const uint8_t *data, size_t length, uint_t level)
Display an ASN.1 data object.
TlsHashAlgo
Hash algorithms.
@ X509_EXT_KEY_USAGE_CLIENT_AUTH
@ ERROR_UNSUPPORTED_CERTIFICATE
@ TLS_SIGN_ALGO_RSA_PSS_PSS_SHA512
error_t tlsReadSubjectPublicKey(TlsContext *context, const X509SubjectPublicKeyInfo *subjectPublicKeyInfo)
Extract the subject public key from the received certificate.
const uint8_t RSASSA_PSS_OID[9]
const uint8_t ECDSA_WITH_SHA256_OID[8]
@ ERROR_CERTIFICATE_REVOKED
int_t oidComp(const uint8_t *oid1, size_t oidLen1, const uint8_t *oid2, size_t oidLen2)
Compare object identifiers.
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 x509CheckNameConstraints(const char_t *subjectName, const X509CertificateInfo *certInfo)
Check name constraints.
error_t tlsCheckKeyUsage(const X509CertificateInfo *certInfo, TlsConnectionEnd entity, TlsKeyExchMethod keyExchMethod)
Check certificate key usage.
@ TLS_KEY_EXCH_ECDHE_ECDSA
error_t ecLoadDomainParameters(EcDomainParameters *params, const EcCurveInfo *curveInfo)
Load EC domain parameters.
error_t tlsGetCertificateSignAlgo(const X509CertificateInfo *certInfo, TlsSignatureAlgo *signAlgo, TlsHashAlgo *hashAlgo)
Retrieve the signature algorithm used to sign the certificate.
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.
Elliptic curve parameters.
__start_packed struct @3 TlsSignHashAlgo
Signature algorithm.
PEM file import functions.
@ ERROR_INVALID_PARAMETER
Invalid parameter.
#define osMemcpy(dest, src, length)
error_t x509ImportDsaPublicKey(const X509SubjectPublicKeyInfo *publicKeyInfo, DsaPublicKey *publicKey)
Import a DSA public key.
@ TLS_CONNECTION_END_SERVER
TlsKeyExchMethod
Key exchange methods.
@ TLS_HASH_ALGO_INTRINSIC
const uint8_t ECDSA_WITH_SHA384_OID[8]
__start_packed struct @4 TlsSignHashAlgos
List of signature algorithms.
error_t tlsFormatRawPublicKey(TlsContext *context, uint8_t *p, size_t *written)
Format raw public key.
__start_packed struct @6 TlsCertAuthorities
List of certificate authorities.
@ 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.
error_t tls13FormatCertExtensions(uint8_t *p, size_t *written)
Format certificate extensions.
error_t tlsValidateCertificate(TlsContext *context, const X509CertificateInfo *certInfo, uint_t pathLen, const char_t *subjectName)
Verify certificate against root CAs.
const uint8_t ECDSA_WITH_SHA1_OID[7]
const uint8_t ECDSA_WITH_SHA224_OID[8]
const uint8_t SHA256_WITH_RSA_ENCRYPTION_OID[9]
TlsCertificateType
Certificate types.
const uint8_t ED448_OID[3]
error_t tlsFormatCertificateList(TlsContext *context, uint8_t *p, size_t *written)
Format certificate chain.
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(...)
TlsSignatureAlgo signAlgo
Signature algorithm used to sign the end entity certificate.
error_t tlsParseRawPublicKey(TlsContext *context, const uint8_t *p, size_t length)
Parse raw public key.
Subject public key information.
@ TLS_SIGN_ALGO_RSA_PSS_RSAE_SHA512
@ TLS_SIGN_ALGO_RSA_PSS_PSS_SHA256
#define TLS_MAX_RSA_MODULUS_SIZE
@ ERROR_CERTIFICATE_EXPIRED
TlsSignatureAlgo
Signature algorithms.
const uint8_t DSA_WITH_SHA1_OID[7]
@ TLS_CONNECTION_END_CLIENT
const uint8_t DSA_WITH_SHA256_OID[9]
X.509 certificate handling.
const EcCurveInfo * tlsGetCurveInfo(TlsContext *context, uint16_t namedCurve)
Get the EC domain parameters that match the specified named curve.
TLS (Transport Layer Security)
error_t x509ValidateCertificate(const X509CertificateInfo *certInfo, const X509CertificateInfo *issuerCertInfo, uint_t pathLen)
X.509 certificate validation.
X.509 certificate validation.
error_t x509ParseCertificate(const uint8_t *data, size_t length, X509CertificateInfo *certInfo)
Parse a X.509 certificate.
X509SignatureAlgoId signatureAlgo
const char_t * certChain
End entity certificate chain (PEM format)
Parsing of ASN.1 encoded keys.
TlsNamedGroup
Named groups.
@ X509_KEY_USAGE_KEY_ENCIPHERMENT
X509EcPublicKey ecPublicKey
X509SubjectPublicKeyInfo subjectPublicKeyInfo
error_t tlsGetCertificateType(const X509CertificateInfo *certInfo, TlsCertificateType *certType, TlsNamedGroup *namedCurve)
Retrieve the certificate type.
const uint8_t * namedCurve
const uint8_t SHA1_WITH_RSA_ENCRYPTION_OID[9]
@ TLS_SIGN_ALGO_RSA_PSS_RSAE_SHA384
TlsNamedGroup namedCurve
Named curve used to generate the EC public key.
X509TbsCertificate tbsCert
ASN.1 (Abstract Syntax Notation One)
error_t x509CheckSubjectName(const X509CertificateInfo *certInfo, const char_t *fqdn)
Check whether the certificate matches the specified FQDN.