@@ -21386,67 +21386,69 @@ static int test_MakeCertWithPathLen(void)
2138621386 return EXPECT_RESULT();
2138721387}
2138821388
21389- static int test_MakeCertWith0Ser(void)
21389+ /* Exhaustive matrix coverage of the serial-0 predicate in
21390+ * ParseCertRelative (asn.c). Inputs are openssl-generated PEM fixtures
21391+ * under certs/test-serial0/ — no cert-under-test data is generated by
21392+ * wolfSSL, so the test cannot pass for the wrong reason if wc_MakeCert
21393+ * encoding ever drifts.
21394+ *
21395+ * Predicate exempts only (CA_TYPE|TRUSTED_PEER_TYPE) && isCA && selfSigned.
21396+ *
21397+ * Fixture isCA selfSigned CERT_TYPE CA_TYPE
21398+ * root_serial0.pem 1 1 reject accept
21399+ * intermediate_serial0.pem 1 0 reject reject
21400+ * selfsigned_nonca_serial0.pem 0 1 reject reject
21401+ * ee_serial0.pem 0 0 reject reject
21402+ */
21403+ static int test_ParseSerial0FixtureMatrix(void)
2139021404{
2139121405 EXPECT_DECLS;
21392- #if defined(WOLFSSL_CERT_REQ) && !defined(NO_ASN_TIME) && \
21393- defined(WOLFSSL_CERT_GEN) && !defined(NO_RSA) && \
21394- defined(WOLFSSL_KEY_GEN) && defined(WOLFSSL_ASN_TEMPLATE)
21395- Cert cert;
21396- DecodedCert decodedCert;
21397- byte der[FOURK_BUF];
21398- int derSize = 0;
21399- WC_RNG rng;
21400- RsaKey key;
21401- int ret;
21402-
21403- XMEMSET(&rng, 0, sizeof(WC_RNG));
21404- XMEMSET(&key, 0, sizeof(RsaKey));
21405- XMEMSET(&cert, 0, sizeof(Cert));
21406- XMEMSET(&decodedCert, 0, sizeof(DecodedCert));
21407-
21408- ExpectIntEQ(wc_InitRng(&rng), 0);
21409- ExpectIntEQ(wc_InitRsaKey(&key, NULL), 0);
21410- ExpectIntEQ(wc_MakeRsaKey(&key, 2048, WC_RSA_EXPONENT, &rng), 0);
21411- ExpectIntEQ(wc_InitCert(&cert), 0);
21412-
21413- (void)XSTRNCPY(cert.subject.country, "US", CTC_NAME_SIZE);
21414- (void)XSTRNCPY(cert.subject.state, "state", CTC_NAME_SIZE);
21415- (void)XSTRNCPY(cert.subject.locality, "Bozeman", CTC_NAME_SIZE);
21416- (void)XSTRNCPY(cert.subject.org, "yourOrgNameHere", CTC_NAME_SIZE);
21417- (void)XSTRNCPY(cert.subject.unit, "yourUnitNameHere", CTC_NAME_SIZE);
21418- (void)XSTRNCPY(cert.subject.commonName, "www.yourDomain.com",
21419- CTC_NAME_SIZE);
21420- (void)XSTRNCPY(cert.subject.email, "yourEmail@yourDomain.com",
21421- CTC_NAME_SIZE);
21422-
21423- cert.selfSigned = 1;
21424- cert.isCA = 0;
21425- cert.sigType = CTC_SHA256wRSA;
21406+ #if !defined(NO_CERTS) && !defined(NO_FILESYSTEM) && \
21407+ defined(WOLFSSL_PEM_TO_DER) && !defined(WOLFSSL_NO_PEM) && \
21408+ !defined(WOLFSSL_NO_ASN_STRICT) && !defined(WOLFSSL_PYTHON) && \
21409+ !defined(WOLFSSL_ASN_ALLOW_0_SERIAL)
21410+ struct {
21411+ const char* path;
21412+ int expectedCertType; /* expected wc_ParseCert(..., CERT_TYPE) */
21413+ int expectedCaType; /* expected wc_ParseCert(..., CA_TYPE) */
21414+ } cases[] = {
21415+ { "./certs/test-serial0/root_serial0.pem",
21416+ WC_NO_ERR_TRACE(ASN_PARSE_E), 0 },
21417+ { "./certs/test-serial0/intermediate_serial0.pem",
21418+ WC_NO_ERR_TRACE(ASN_PARSE_E), WC_NO_ERR_TRACE(ASN_PARSE_E) },
21419+ { "./certs/test-serial0/selfsigned_nonca_serial0.pem",
21420+ WC_NO_ERR_TRACE(ASN_PARSE_E), WC_NO_ERR_TRACE(ASN_PARSE_E) },
21421+ { "./certs/test-serial0/ee_serial0.pem",
21422+ WC_NO_ERR_TRACE(ASN_PARSE_E), WC_NO_ERR_TRACE(ASN_PARSE_E) },
21423+ };
21424+ size_t i;
2142621425
21427- /* set serial number to 0 */
21428- cert.serialSz = 1;
21429- cert.serial[0] = 0;
21426+ for (i = 0; i < sizeof(cases) / sizeof(cases[0]); ++i) {
21427+ byte* pemBuf = NULL;
21428+ size_t pemSz = 0;
21429+ byte* derBuf = NULL;
21430+ int derSz = 0;
21431+ DecodedCert dc;
2143021432
21431- ExpectIntGE(wc_MakeCert(&cert, der, FOURK_BUF, &key, NULL, &rng), 0);
21432- ExpectIntGE(derSize = wc_SignCert(cert.bodySz, cert.sigType, der,
21433- FOURK_BUF, &key, NULL, &rng), 0);
21433+ ExpectIntEQ(load_file(cases[i].path, &pemBuf, &pemSz), 0);
21434+ ExpectNotNull(derBuf = (byte*)XMALLOC(pemSz, NULL,
21435+ DYNAMIC_TYPE_TMP_BUFFER));
21436+ ExpectIntGE(derSz = wc_CertPemToDer(pemBuf, (int)pemSz, derBuf,
21437+ (int)pemSz, CERT_TYPE), 0);
2143421438
21435- wc_InitDecodedCert(&decodedCert, der, (word32)derSize, NULL);
21439+ wc_InitDecodedCert(&dc, derBuf, (word32)derSz, NULL);
21440+ ExpectIntEQ(wc_ParseCert(&dc, CERT_TYPE, NO_VERIFY, NULL),
21441+ cases[i].expectedCertType);
21442+ wc_FreeDecodedCert(&dc);
2143621443
21437- #if !defined(WOLFSSL_NO_ASN_STRICT) && !defined(WOLFSSL_PYTHON) && \
21438- !defined(WOLFSSL_ASN_ALLOW_0_SERIAL)
21439- ExpectIntEQ(wc_ParseCert(&decodedCert, CERT_TYPE, NO_VERIFY, NULL),
21440- WC_NO_ERR_TRACE(ASN_PARSE_E));
21441- #else
21442- ExpectIntEQ(wc_ParseCert(&decodedCert, CERT_TYPE, NO_VERIFY, NULL), 0);
21443- #endif
21444+ wc_InitDecodedCert(&dc, derBuf, (word32)derSz, NULL);
21445+ ExpectIntEQ(wc_ParseCert(&dc, CA_TYPE, NO_VERIFY, NULL),
21446+ cases[i].expectedCaType);
21447+ wc_FreeDecodedCert(&dc);
2144421448
21445- wc_FreeDecodedCert(&decodedCert);
21446- ret = wc_FreeRsaKey(&key);
21447- ExpectIntEQ(ret, 0);
21448- ret = wc_FreeRng(&rng);
21449- ExpectIntEQ(ret, 0);
21449+ XFREE(derBuf, NULL, DYNAMIC_TYPE_TMP_BUFFER);
21450+ XFREE(pemBuf, NULL, DYNAMIC_TYPE_TMP_BUFFER);
21451+ }
2145021452#endif
2145121453 return EXPECT_RESULT();
2145221454}
@@ -34536,7 +34538,7 @@ TEST_CASE testCases[] = {
3453634538 TEST_DECL(test_wc_ParseCert),
3453734539 TEST_DECL(test_wc_ParseCert_Error),
3453834540 TEST_DECL(test_MakeCertWithPathLen),
34539- TEST_DECL(test_MakeCertWith0Ser ),
34541+ TEST_DECL(test_ParseSerial0FixtureMatrix ),
3454034542 TEST_DECL(test_MakeCertWithCaFalse),
3454134543#ifdef WOLFSSL_CERT_SIGN_CB
3454234544 TEST_DECL(test_wc_SignCert_cb),
0 commit comments