@@ -23773,67 +23773,69 @@ static int test_PathLenNoKeyUsage(void)
2377323773 return EXPECT_RESULT();
2377423774}
2377523775
23776- static int test_MakeCertWith0Ser(void)
23776+ /* Exhaustive matrix coverage of the serial-0 predicate in
23777+ * ParseCertRelative (asn.c). Inputs are openssl-generated PEM fixtures
23778+ * under certs/test-serial0/ — no cert-under-test data is generated by
23779+ * wolfSSL, so the test cannot pass for the wrong reason if wc_MakeCert
23780+ * encoding ever drifts.
23781+ *
23782+ * Predicate exempts only (CA_TYPE|TRUSTED_PEER_TYPE) && isCA && selfSigned.
23783+ *
23784+ * Fixture isCA selfSigned CERT_TYPE CA_TYPE
23785+ * root_serial0.pem 1 1 reject accept
23786+ * intermediate_serial0.pem 1 0 reject reject
23787+ * selfsigned_nonca_serial0.pem 0 1 reject reject
23788+ * ee_serial0.pem 0 0 reject reject
23789+ */
23790+ static int test_ParseSerial0FixtureMatrix(void)
2377723791{
2377823792 EXPECT_DECLS;
23779- #if defined(WOLFSSL_CERT_REQ) && !defined(NO_ASN_TIME) && \
23780- defined(WOLFSSL_CERT_GEN) && !defined(NO_RSA) && \
23781- defined(WOLFSSL_KEY_GEN) && defined(WOLFSSL_ASN_TEMPLATE)
23782- Cert cert;
23783- DecodedCert decodedCert;
23784- byte der[FOURK_BUF];
23785- int derSize = 0;
23786- WC_RNG rng;
23787- RsaKey key;
23788- int ret;
23789-
23790- XMEMSET(&rng, 0, sizeof(WC_RNG));
23791- XMEMSET(&key, 0, sizeof(RsaKey));
23792- XMEMSET(&cert, 0, sizeof(Cert));
23793- XMEMSET(&decodedCert, 0, sizeof(DecodedCert));
23794-
23795- ExpectIntEQ(wc_InitRng(&rng), 0);
23796- ExpectIntEQ(wc_InitRsaKey(&key, NULL), 0);
23797- ExpectIntEQ(wc_MakeRsaKey(&key, 2048, WC_RSA_EXPONENT, &rng), 0);
23798- ExpectIntEQ(wc_InitCert(&cert), 0);
23799-
23800- (void)XSTRNCPY(cert.subject.country, "US", CTC_NAME_SIZE);
23801- (void)XSTRNCPY(cert.subject.state, "state", CTC_NAME_SIZE);
23802- (void)XSTRNCPY(cert.subject.locality, "Bozeman", CTC_NAME_SIZE);
23803- (void)XSTRNCPY(cert.subject.org, "yourOrgNameHere", CTC_NAME_SIZE);
23804- (void)XSTRNCPY(cert.subject.unit, "yourUnitNameHere", CTC_NAME_SIZE);
23805- (void)XSTRNCPY(cert.subject.commonName, "www.yourDomain.com",
23806- CTC_NAME_SIZE);
23807- (void)XSTRNCPY(cert.subject.email, "yourEmail@yourDomain.com",
23808- CTC_NAME_SIZE);
23793+ #if !defined(NO_CERTS) && !defined(NO_FILESYSTEM) && \
23794+ defined(WOLFSSL_PEM_TO_DER) && !defined(WOLFSSL_NO_PEM) && \
23795+ !defined(WOLFSSL_NO_ASN_STRICT) && !defined(WOLFSSL_PYTHON) && \
23796+ !defined(WOLFSSL_ASN_ALLOW_0_SERIAL)
23797+ struct {
23798+ const char* path;
23799+ int expectedCertType; /* expected wc_ParseCert(..., CERT_TYPE) */
23800+ int expectedCaType; /* expected wc_ParseCert(..., CA_TYPE) */
23801+ } cases[] = {
23802+ { "./certs/test-serial0/root_serial0.pem",
23803+ WC_NO_ERR_TRACE(ASN_PARSE_E), 0 },
23804+ { "./certs/test-serial0/intermediate_serial0.pem",
23805+ WC_NO_ERR_TRACE(ASN_PARSE_E), WC_NO_ERR_TRACE(ASN_PARSE_E) },
23806+ { "./certs/test-serial0/selfsigned_nonca_serial0.pem",
23807+ WC_NO_ERR_TRACE(ASN_PARSE_E), WC_NO_ERR_TRACE(ASN_PARSE_E) },
23808+ { "./certs/test-serial0/ee_serial0.pem",
23809+ WC_NO_ERR_TRACE(ASN_PARSE_E), WC_NO_ERR_TRACE(ASN_PARSE_E) },
23810+ };
23811+ size_t i;
2380923812
23810- cert.selfSigned = 1;
23811- cert.isCA = 0;
23812- cert.sigType = CTC_SHA256wRSA;
23813+ for (i = 0; i < sizeof(cases) / sizeof(cases[0]); ++i) {
23814+ byte* pemBuf = NULL;
23815+ size_t pemSz = 0;
23816+ byte* derBuf = NULL;
23817+ int derSz = 0;
23818+ DecodedCert dc;
2381323819
23814- /* set serial number to 0 */
23815- cert.serialSz = 1;
23816- cert.serial[0] = 0;
23820+ ExpectIntEQ(load_file(cases[i].path, &pemBuf, &pemSz), 0);
23821+ ExpectNotNull(derBuf = (byte*)XMALLOC(pemSz, NULL,
23822+ DYNAMIC_TYPE_TMP_BUFFER));
23823+ ExpectIntGE(derSz = wc_CertPemToDer(pemBuf, (int)pemSz, derBuf,
23824+ (int)pemSz, CERT_TYPE), 0);
2381723825
23818- ExpectIntGE(wc_MakeCert(&cert, der, FOURK_BUF, &key, NULL, &rng), 0);
23819- ExpectIntGE(derSize = wc_SignCert(cert.bodySz, cert.sigType, der,
23820- FOURK_BUF, &key, NULL, &rng), 0);
23826+ wc_InitDecodedCert(&dc, derBuf, (word32)derSz, NULL);
23827+ ExpectIntEQ(wc_ParseCert(&dc, CERT_TYPE, NO_VERIFY, NULL),
23828+ cases[i].expectedCertType);
23829+ wc_FreeDecodedCert(&dc);
2382123830
23822- wc_InitDecodedCert(&decodedCert, der, (word32)derSize, NULL);
23831+ wc_InitDecodedCert(&dc, derBuf, (word32)derSz, NULL);
23832+ ExpectIntEQ(wc_ParseCert(&dc, CA_TYPE, NO_VERIFY, NULL),
23833+ cases[i].expectedCaType);
23834+ wc_FreeDecodedCert(&dc);
2382323835
23824- #if !defined(WOLFSSL_NO_ASN_STRICT) && !defined(WOLFSSL_PYTHON) && \
23825- !defined(WOLFSSL_ASN_ALLOW_0_SERIAL)
23826- ExpectIntEQ(wc_ParseCert(&decodedCert, CERT_TYPE, NO_VERIFY, NULL),
23827- WC_NO_ERR_TRACE(ASN_PARSE_E));
23828- #else
23829- ExpectIntEQ(wc_ParseCert(&decodedCert, CERT_TYPE, NO_VERIFY, NULL), 0);
23830- #endif
23831-
23832- wc_FreeDecodedCert(&decodedCert);
23833- ret = wc_FreeRsaKey(&key);
23834- ExpectIntEQ(ret, 0);
23835- ret = wc_FreeRng(&rng);
23836- ExpectIntEQ(ret, 0);
23836+ XFREE(derBuf, NULL, DYNAMIC_TYPE_TMP_BUFFER);
23837+ XFREE(pemBuf, NULL, DYNAMIC_TYPE_TMP_BUFFER);
23838+ }
2383723839#endif
2383823840 return EXPECT_RESULT();
2383923841}
@@ -39135,7 +39137,7 @@ TEST_CASE testCases[] = {
3913539137 TEST_DECL(test_PathLenSelfIssuedAllowed),
3913639138 TEST_DECL(test_PathLenNoKeyUsage),
3913739139 TEST_DECL(test_NameConstraints_OtherName),
39138- TEST_DECL(test_MakeCertWith0Ser ),
39140+ TEST_DECL(test_ParseSerial0FixtureMatrix ),
3913939141 TEST_DECL(test_MakeCertWithCaFalse),
3914039142#ifdef WOLFSSL_CERT_SIGN_CB
3914139143 TEST_DECL(test_wc_SignCert_cb),
0 commit comments