@@ -22124,67 +22124,69 @@ static int test_PathLenNoKeyUsage(void)
2212422124 return EXPECT_RESULT();
2212522125}
2212622126
22127- static int test_MakeCertWith0Ser(void)
22127+ /* Exhaustive matrix coverage of the serial-0 predicate in
22128+ * ParseCertRelative (asn.c). Inputs are openssl-generated PEM fixtures
22129+ * under certs/test-serial0/ — no cert-under-test data is generated by
22130+ * wolfSSL, so the test cannot pass for the wrong reason if wc_MakeCert
22131+ * encoding ever drifts.
22132+ *
22133+ * Predicate exempts only (CA_TYPE|TRUSTED_PEER_TYPE) && isCA && selfSigned.
22134+ *
22135+ * Fixture isCA selfSigned CERT_TYPE CA_TYPE
22136+ * root_serial0.pem 1 1 reject accept
22137+ * intermediate_serial0.pem 1 0 reject reject
22138+ * selfsigned_nonca_serial0.pem 0 1 reject reject
22139+ * ee_serial0.pem 0 0 reject reject
22140+ */
22141+ static int test_ParseSerial0FixtureMatrix(void)
2212822142{
2212922143 EXPECT_DECLS;
22130- #if defined(WOLFSSL_CERT_REQ) && !defined(NO_ASN_TIME) && \
22131- defined(WOLFSSL_CERT_GEN) && !defined(NO_RSA) && \
22132- defined(WOLFSSL_KEY_GEN) && defined(WOLFSSL_ASN_TEMPLATE)
22133- Cert cert;
22134- DecodedCert decodedCert;
22135- byte der[FOURK_BUF];
22136- int derSize = 0;
22137- WC_RNG rng;
22138- RsaKey key;
22139- int ret;
22140-
22141- XMEMSET(&rng, 0, sizeof(WC_RNG));
22142- XMEMSET(&key, 0, sizeof(RsaKey));
22143- XMEMSET(&cert, 0, sizeof(Cert));
22144- XMEMSET(&decodedCert, 0, sizeof(DecodedCert));
22145-
22146- ExpectIntEQ(wc_InitRng(&rng), 0);
22147- ExpectIntEQ(wc_InitRsaKey(&key, NULL), 0);
22148- ExpectIntEQ(wc_MakeRsaKey(&key, 2048, WC_RSA_EXPONENT, &rng), 0);
22149- ExpectIntEQ(wc_InitCert(&cert), 0);
22150-
22151- (void)XSTRNCPY(cert.subject.country, "US", CTC_NAME_SIZE);
22152- (void)XSTRNCPY(cert.subject.state, "state", CTC_NAME_SIZE);
22153- (void)XSTRNCPY(cert.subject.locality, "Bozeman", CTC_NAME_SIZE);
22154- (void)XSTRNCPY(cert.subject.org, "yourOrgNameHere", CTC_NAME_SIZE);
22155- (void)XSTRNCPY(cert.subject.unit, "yourUnitNameHere", CTC_NAME_SIZE);
22156- (void)XSTRNCPY(cert.subject.commonName, "www.yourDomain.com",
22157- CTC_NAME_SIZE);
22158- (void)XSTRNCPY(cert.subject.email, "yourEmail@yourDomain.com",
22159- CTC_NAME_SIZE);
22144+ #if !defined(NO_CERTS) && !defined(NO_FILESYSTEM) && \
22145+ defined(WOLFSSL_PEM_TO_DER) && !defined(WOLFSSL_NO_PEM) && \
22146+ !defined(WOLFSSL_NO_ASN_STRICT) && !defined(WOLFSSL_PYTHON) && \
22147+ !defined(WOLFSSL_ASN_ALLOW_0_SERIAL)
22148+ struct {
22149+ const char* path;
22150+ int expectedCertType; /* expected wc_ParseCert(..., CERT_TYPE) */
22151+ int expectedCaType; /* expected wc_ParseCert(..., CA_TYPE) */
22152+ } cases[] = {
22153+ { "./certs/test-serial0/root_serial0.pem",
22154+ WC_NO_ERR_TRACE(ASN_PARSE_E), 0 },
22155+ { "./certs/test-serial0/intermediate_serial0.pem",
22156+ WC_NO_ERR_TRACE(ASN_PARSE_E), WC_NO_ERR_TRACE(ASN_PARSE_E) },
22157+ { "./certs/test-serial0/selfsigned_nonca_serial0.pem",
22158+ WC_NO_ERR_TRACE(ASN_PARSE_E), WC_NO_ERR_TRACE(ASN_PARSE_E) },
22159+ { "./certs/test-serial0/ee_serial0.pem",
22160+ WC_NO_ERR_TRACE(ASN_PARSE_E), WC_NO_ERR_TRACE(ASN_PARSE_E) },
22161+ };
22162+ size_t i;
2216022163
22161- cert.selfSigned = 1;
22162- cert.isCA = 0;
22163- cert.sigType = CTC_SHA256wRSA;
22164+ for (i = 0; i < sizeof(cases) / sizeof(cases[0]); ++i) {
22165+ byte* pemBuf = NULL;
22166+ size_t pemSz = 0;
22167+ byte* derBuf = NULL;
22168+ int derSz = 0;
22169+ DecodedCert dc;
2216422170
22165- /* set serial number to 0 */
22166- cert.serialSz = 1;
22167- cert.serial[0] = 0;
22171+ ExpectIntEQ(load_file(cases[i].path, &pemBuf, &pemSz), 0);
22172+ ExpectNotNull(derBuf = (byte*)XMALLOC(pemSz, NULL,
22173+ DYNAMIC_TYPE_TMP_BUFFER));
22174+ ExpectIntGE(derSz = wc_CertPemToDer(pemBuf, (int)pemSz, derBuf,
22175+ (int)pemSz, CERT_TYPE), 0);
2216822176
22169- ExpectIntGE(wc_MakeCert(&cert, der, FOURK_BUF, &key, NULL, &rng), 0);
22170- ExpectIntGE(derSize = wc_SignCert(cert.bodySz, cert.sigType, der,
22171- FOURK_BUF, &key, NULL, &rng), 0);
22177+ wc_InitDecodedCert(&dc, derBuf, (word32)derSz, NULL);
22178+ ExpectIntEQ(wc_ParseCert(&dc, CERT_TYPE, NO_VERIFY, NULL),
22179+ cases[i].expectedCertType);
22180+ wc_FreeDecodedCert(&dc);
2217222181
22173- wc_InitDecodedCert(&decodedCert, der, (word32)derSize, NULL);
22182+ wc_InitDecodedCert(&dc, derBuf, (word32)derSz, NULL);
22183+ ExpectIntEQ(wc_ParseCert(&dc, CA_TYPE, NO_VERIFY, NULL),
22184+ cases[i].expectedCaType);
22185+ wc_FreeDecodedCert(&dc);
2217422186
22175- #if !defined(WOLFSSL_NO_ASN_STRICT) && !defined(WOLFSSL_PYTHON) && \
22176- !defined(WOLFSSL_ASN_ALLOW_0_SERIAL)
22177- ExpectIntEQ(wc_ParseCert(&decodedCert, CERT_TYPE, NO_VERIFY, NULL),
22178- WC_NO_ERR_TRACE(ASN_PARSE_E));
22179- #else
22180- ExpectIntEQ(wc_ParseCert(&decodedCert, CERT_TYPE, NO_VERIFY, NULL), 0);
22181- #endif
22182-
22183- wc_FreeDecodedCert(&decodedCert);
22184- ret = wc_FreeRsaKey(&key);
22185- ExpectIntEQ(ret, 0);
22186- ret = wc_FreeRng(&rng);
22187- ExpectIntEQ(ret, 0);
22187+ XFREE(derBuf, NULL, DYNAMIC_TYPE_TMP_BUFFER);
22188+ XFREE(pemBuf, NULL, DYNAMIC_TYPE_TMP_BUFFER);
22189+ }
2218822190#endif
2218922191 return EXPECT_RESULT();
2219022192}
@@ -37008,7 +37010,7 @@ TEST_CASE testCases[] = {
3700837010 TEST_DECL(test_PathLenSelfIssued),
3700937011 TEST_DECL(test_PathLenSelfIssuedAllowed),
3701037012 TEST_DECL(test_PathLenNoKeyUsage),
37011- TEST_DECL(test_MakeCertWith0Ser ),
37013+ TEST_DECL(test_ParseSerial0FixtureMatrix ),
3701237014 TEST_DECL(test_MakeCertWithCaFalse),
3701337015#ifdef WOLFSSL_CERT_SIGN_CB
3701437016 TEST_DECL(test_wc_SignCert_cb),
0 commit comments