@@ -96,6 +96,9 @@ ASN Options:
9696 cost of taking up more memory. Adds initials, givenname, dnQualifer for
9797 example.
9898 * WC_ASN_HASH_SHA256: Force use of SHA2-256 for the internal hash ID calcs.
99+ * WOLFSSL_ALLOW_ENCODING_CA_FALSE: Allow encoding BasicConstraints CA:FALSE
100+ * which is discouraged by X.690 (DER) specification - default values shall not
101+ * be encoded.
99102*/
100103
101104#include <wolfssl/wolfcrypt/error-crypt.h>
@@ -18548,7 +18551,7 @@ static int DecodeBasicCaConstraint(const byte* input, int sz, DecodedCert* cert)
1854818551 WOLFSSL_MSG("\tfail: constraint not valid BOOLEAN, set default FALSE");
1854918552 ret = 0;
1855018553 }
18551- #if defined(OPENSSL_EXTRA) || defined(OPENSSL_EXTRA_X509_SMALL)
18554+ #ifdef WOLFSSL_ALLOW_ENCODING_CA_FALSE
1855218555 else {
1855318556 /* CA Boolean asserted, GetBoolean didn't return error. */
1855418557 cert->isCaSet = 1;
@@ -18590,18 +18593,15 @@ static int DecodeBasicCaConstraint(const byte* input, int sz, DecodedCert* cert)
1859018593
1859118594 /* Empty SEQUENCE is OK - nothing to store. */
1859218595 if ((ret == 0) && (dataASN[BASICCONSASN_IDX_SEQ].length != 0)) {
18593- #if !defined(OPENSSL_EXTRA) && !defined(OPENSSL_EXTRA_X509_SMALL)
1859418596 /* Bad encoding when CA Boolean is false
1859518597 * (default when not present). */
18598+ #if !defined(ASN_TEMPLATE_SKIP_ISCA_CHECK) && \
18599+ !defined(WOLFSSL_ALLOW_ENCODING_CA_FALSE)
1859618600 if ((dataASN[BASICCONSASN_IDX_CA].length != 0) && (!isCA)) {
1859718601 WOLFSSL_ERROR_VERBOSE(ASN_PARSE_E);
1859818602 ret = ASN_PARSE_E;
1859918603 }
18600- #else
18601- if (dataASN[BASICCONSASN_IDX_CA].length != 0) {
18602- cert->isCaSet = 1;
18603- }
18604- #endif
18604+ #endif
1860518605 /* Path length must be a 7-bit value. */
1860618606 if ((ret == 0) && (cert->pathLength >= (1 << 7))) {
1860718607 WOLFSSL_ERROR_VERBOSE(ASN_PARSE_E);
@@ -27811,7 +27811,7 @@ static int EncodeExtensions(Cert* cert, byte* output, word32 maxSz,
2781127811 dataASN[CERTEXTSASN_IDX_BC_PATHLEN].noOut = 1;
2781227812 }
2781327813 }
27814- #if defined(OPENSSL_EXTRA) || defined(OPENSSL_EXTRA_X509_SMALL)
27814+ #ifdef WOLFSSL_ALLOW_ENCODING_CA_FALSE
2781527815 else if (cert->isCaSet) {
2781627816 SetASN_Boolean(&dataASN[CERTEXTSASN_IDX_BC_CA], 0);
2781727817 SetASN_Buffer(&dataASN[CERTEXTSASN_IDX_BC_OID], bcOID, sizeof(bcOID));
@@ -28466,7 +28466,7 @@ static int EncodeCert(Cert* cert, DerCert* der, RsaKey* rsaKey, ecc_key* eccKey,
2846628466
2846728467 der->extensionsSz += der->caSz;
2846828468 }
28469- #if defined(OPENSSL_EXTRA) || defined(OPENSSL_EXTRA_X509_SMALL)
28469+ #ifdef WOLFSSL_ALLOW_ENCODING_CA_FALSE
2847028470 /* Set CA */
2847128471 else if (cert->isCaSet) {
2847228472 der->caSz = SetCaEx(der->ca, sizeof(der->ca), cert->isCA);
@@ -29874,7 +29874,7 @@ static int EncodeCertReq(Cert* cert, DerCert* der, RsaKey* rsaKey,
2987429874
2987529875 der->extensionsSz += der->caSz;
2987629876 }
29877- #if defined(OPENSSL_EXTRA) || defined(OPENSSL_EXTRA_X509_SMALL)
29877+ #ifdef WOLFSSL_ALLOW_ENCODING_CA_FALSE
2987829878 /* Set CA */
2987929879 else if (cert->isCaSet) {
2988029880 der->caSz = SetCaEx(der->ca, sizeof(der->ca), cert->isCA);
0 commit comments