@@ -1035,6 +1035,12 @@ WOLFSSL_TEST_SUBROUTINE wc_test_ret_t certext_test(void);
10351035 defined(WOLFSSL_CERT_EXT) && defined(WOLFSSL_CERT_GEN)
10361036WOLFSSL_TEST_SUBROUTINE wc_test_ret_t decodedCertCache_test(void);
10371037#endif
1038+ #if defined(WOLFSSL_CERT_GEN) && defined(WOLFSSL_ALT_NAMES) && \
1039+ defined(WOLFSSL_ASN_TEMPLATE) && \
1040+ (defined(WOLFSSL_TEST_CERT) || defined(OPENSSL_EXTRA) || \
1041+ defined(OPENSSL_EXTRA_X509_SMALL) || defined(WOLFSSL_PUBLIC_ASN))
1042+ WOLFSSL_TEST_SUBROUTINE wc_test_ret_t flattenAltNames_test(void);
1043+ #endif
10381044WOLFSSL_TEST_SUBROUTINE wc_test_ret_t memory_test(void);
10391045#if defined(WOLFSSL_PUBLIC_MP) && \
10401046 ((defined(WOLFSSL_SP_MATH_ALL) && !defined(WOLFSSL_RSA_VERIFY_ONLY)) || \
@@ -3089,6 +3095,16 @@ options: [-s max_relative_stack_bytes] [-m max_relative_heap_memory_bytes]\n\
30893095 TEST_PASS("DECODED CERT CACHE test passed!\n");
30903096#endif
30913097
3098+ #if defined(WOLFSSL_CERT_GEN) && defined(WOLFSSL_ALT_NAMES) && \
3099+ defined(WOLFSSL_ASN_TEMPLATE) && \
3100+ (defined(WOLFSSL_TEST_CERT) || defined(OPENSSL_EXTRA) || \
3101+ defined(OPENSSL_EXTRA_X509_SMALL) || defined(WOLFSSL_PUBLIC_ASN))
3102+ if ( (ret = flattenAltNames_test()) != 0)
3103+ TEST_FAIL("FLATTEN ALT NAMES test failed!\n", ret);
3104+ else
3105+ TEST_PASS("FLATTEN ALT NAMES test passed!\n");
3106+ #endif
3107+
30923108#ifdef HAVE_CURVE25519
30933109 if ( (ret = curve25519_test()) != 0)
30943110 TEST_FAIL("CURVE25519 test failed!\n", ret);
@@ -26485,6 +26501,118 @@ WOLFSSL_TEST_SUBROUTINE wc_test_ret_t decodedCertCache_test(void)
2648526501#endif /* defined(WOLFSSL_CERT_GEN_CACHE) && defined(WOLFSSL_TEST_CERT) &&
2648626502 defined(WOLFSSL_CERT_EXT) && defined(WOLFSSL_CERT_GEN) */
2648726503
26504+ #if defined(WOLFSSL_CERT_GEN) && defined(WOLFSSL_ALT_NAMES) && \
26505+ defined(WOLFSSL_ASN_TEMPLATE) && \
26506+ (defined(WOLFSSL_TEST_CERT) || defined(OPENSSL_EXTRA) || \
26507+ defined(OPENSSL_EXTRA_X509_SMALL) || defined(WOLFSSL_PUBLIC_ASN))
26508+ /* Exercise the public wc_SetDNSEntry() + wc_FlattenAltNames() pair: build an
26509+ * alt-name list and encode it into a GeneralNames SEQUENCE. The order entries
26510+ * land in depends on build config (OPENSSL_EXTRA appends, otherwise prepends),
26511+ * so presence checks are order-independent. Also exercise the
26512+ * wc_SetAltNamesFromList() convenience that encodes straight into a Cert. */
26513+ WOLFSSL_TEST_SUBROUTINE wc_test_ret_t flattenAltNames_test(void)
26514+ {
26515+ wc_test_ret_t ret = 0;
26516+ DNS_entry* list = NULL;
26517+ Cert* cert = NULL;
26518+ byte out[256];
26519+ int len;
26520+ /* dNSName "example.com" -> [2] IMPLICIT IA5String */
26521+ static const byte dnsTlv[] = {
26522+ 0x82, 0x0B, 'e','x','a','m','p','l','e','.','c','o','m'
26523+ };
26524+ /* iPAddress 10.0.0.7 -> [7] IMPLICIT OCTET STRING */
26525+ static const byte ipTlv[] = { 0x87, 0x04, 0x0A, 0x00, 0x00, 0x07 };
26526+ static const byte ip[] = { 0x0A, 0x00, 0x00, 0x07 };
26527+ const int innerSz = (int)sizeof(dnsTlv) + (int)sizeof(ipTlv); /* 19 */
26528+ const int expSz = 2 + innerSz; /* 0x30,len + body */
26529+ int i, foundDns = 0, foundIp = 0;
26530+
26531+ WOLFSSL_ENTER("flattenAltNames_test");
26532+
26533+ /* A NULL list encodes to nothing. */
26534+ len = wc_FlattenAltNames(out, sizeof(out), NULL);
26535+ if (len != 0)
26536+ ret = WC_TEST_RET_ENC_EC(len);
26537+
26538+ if (ret == 0) {
26539+ ret = wc_SetDNSEntry(HEAP_HINT, "example.com", 11, ASN_DNS_TYPE, &list);
26540+ if (ret != 0)
26541+ ret = WC_TEST_RET_ENC_EC(ret);
26542+ }
26543+ if (ret == 0) {
26544+ ret = wc_SetDNSEntry(HEAP_HINT, (const char*)ip, (int)sizeof(ip),
26545+ ASN_IP_TYPE, &list);
26546+ if (ret != 0)
26547+ ret = WC_TEST_RET_ENC_EC(ret);
26548+ }
26549+ if (ret == 0) {
26550+ len = wc_FlattenAltNames(out, sizeof(out), list);
26551+ if (len != expSz)
26552+ ret = WC_TEST_RET_ENC_EC(len);
26553+ }
26554+ if (ret == 0 && (out[0] != ASN_SEQUENCE + ASN_CONSTRUCTED ||
26555+ out[1] != (byte)innerSz))
26556+ ret = WC_TEST_RET_ENC_NC;
26557+ /* Both GeneralName TLVs must be present, regardless of order. */
26558+ for (i = 0; ret == 0 && i + (int)sizeof(dnsTlv) <= len; i++) {
26559+ if (XMEMCMP(out + i, dnsTlv, sizeof(dnsTlv)) == 0)
26560+ foundDns = 1;
26561+ }
26562+ for (i = 0; ret == 0 && i + (int)sizeof(ipTlv) <= len; i++) {
26563+ if (XMEMCMP(out + i, ipTlv, sizeof(ipTlv)) == 0)
26564+ foundIp = 1;
26565+ }
26566+ if (ret == 0 && (!foundDns || !foundIp))
26567+ ret = WC_TEST_RET_ENC_NC;
26568+ /* NULL output is rejected. */
26569+ if (ret == 0) {
26570+ len = wc_FlattenAltNames(NULL, sizeof(out), list);
26571+ if (len != WC_NO_ERR_TRACE(BAD_FUNC_ARG))
26572+ ret = WC_TEST_RET_ENC_EC(len);
26573+ }
26574+ /* Output one byte too small is rejected with BUFFER_E. */
26575+ if (ret == 0) {
26576+ len = wc_FlattenAltNames(out, (word32)expSz - 1, list);
26577+ if (len != WC_NO_ERR_TRACE(BUFFER_E))
26578+ ret = WC_TEST_RET_ENC_EC(len);
26579+ }
26580+
26581+ /* wc_SetAltNamesFromList() encodes the same list straight into a Cert and
26582+ * records the length; the result must match the standalone encoding. */
26583+ if (ret == 0) {
26584+ cert = (Cert*)XMALLOC(sizeof(Cert), HEAP_HINT, DYNAMIC_TYPE_TMP_BUFFER);
26585+ if (cert == NULL)
26586+ ret = WC_TEST_RET_ENC_EC(MEMORY_E);
26587+ }
26588+ if (ret == 0) {
26589+ ret = wc_InitCert_ex(cert, HEAP_HINT, devId);
26590+ if (ret != 0)
26591+ ret = WC_TEST_RET_ENC_EC(ret);
26592+ }
26593+ if (ret == 0) {
26594+ ret = wc_SetAltNamesFromList(cert, list);
26595+ if (ret != 0)
26596+ ret = WC_TEST_RET_ENC_EC(ret);
26597+ }
26598+ if (ret == 0 && (cert->altNamesSz != expSz ||
26599+ XMEMCMP(cert->altNames, out, (size_t)expSz) != 0))
26600+ ret = WC_TEST_RET_ENC_NC;
26601+ /* NULL cert is rejected. */
26602+ if (ret == 0) {
26603+ int r = wc_SetAltNamesFromList(NULL, list);
26604+ if (r != WC_NO_ERR_TRACE(BAD_FUNC_ARG))
26605+ ret = WC_TEST_RET_ENC_EC(r);
26606+ }
26607+
26608+ XFREE(cert, HEAP_HINT, DYNAMIC_TYPE_TMP_BUFFER);
26609+ FreeAltNames(list, HEAP_HINT);
26610+ return ret;
26611+ }
26612+ #endif /* WOLFSSL_CERT_GEN && WOLFSSL_ALT_NAMES && WOLFSSL_ASN_TEMPLATE &&
26613+ * (WOLFSSL_TEST_CERT || OPENSSL_EXTRA || OPENSSL_EXTRA_X509_SMALL ||
26614+ * WOLFSSL_PUBLIC_ASN) */
26615+
2648826616#define RSA_TEST_BYTES (RSA_MAX_SIZE / 8)
2648926617
2649026618#if !defined(NO_ASN) && !defined(WOLFSSL_RSA_PUBLIC_ONLY) && \
0 commit comments