From 3db04fa4afff52fd406ed85cd2fa2debf54deb7d Mon Sep 17 00:00:00 2001 From: jchx Date: Sat, 23 May 2026 10:56:04 +0000 Subject: [PATCH] Ignore unsupported decoder providers during chain discovery Cherry-picked from: https://gitcode.com/openHiTLS/openhitls/merge_requests/1507 Signed-off-by: Dongjianwei001 --- codecs/src/decode_chain.c | 2 +- .../pki/cert/test_suite_sdv_x509_cert.c | 60 ++++++++++++++++++- .../pki/cert/test_suite_sdv_x509_cert.data | 3 + testcode/testdata/provider/provider_sha256.c | 3 +- 4 files changed, 65 insertions(+), 3 deletions(-) diff --git a/codecs/src/decode_chain.c b/codecs/src/decode_chain.c index e4d15ed1..2101fcb3 100644 --- a/codecs/src/decode_chain.c +++ b/codecs/src/decode_chain.c @@ -414,7 +414,7 @@ static int32_t ProcessEachProviderDecoder(CRYPT_EAL_ProvMgrCtx *ctx, void *args) } ret = CRYPT_EAL_ProviderQuery(ctx, CRYPT_EAL_OPERAID_DECODER, &algInfos); - if (ret == CRYPT_NOT_SUPPORT) { + if (algInfos == NULL) { return CRYPT_SUCCESS; } if (ret != CRYPT_SUCCESS) { diff --git a/testcode/sdv/testcase/pki/cert/test_suite_sdv_x509_cert.c b/testcode/sdv/testcase/pki/cert/test_suite_sdv_x509_cert.c index 2d5abd84..63b977f7 100644 --- a/testcode/sdv/testcase/pki/cert/test_suite_sdv_x509_cert.c +++ b/testcode/sdv/testcase/pki/cert/test_suite_sdv_x509_cert.c @@ -36,9 +36,11 @@ #include "sal_file.h" #include "crypt_codecskey.h" #include "crypt_eal_codecs.h" +#include "crypt_eal_provider.h" +#include "crypt_eal_rand.h" #include "hitls_x509_local.h" #include "stub_utils.h" - +#include "test.h" /* END_HEADER */ /* ============================================================================ @@ -49,6 +51,32 @@ STUB_DEFINE_RET1(void *, BSL_SAL_Malloc, uint32_t); #endif STUB_DEFINE_RET2(int32_t, HITLS_X509_ParseCertTbs, BSL_ASN1_Buffer *, HITLS_X509_Cert *); +#if defined(HITLS_PKI_X509_CRT_PARSE) && defined(HITLS_CRYPTO_PROVIDER) +#define HITLS_X509_SHA256_LIB_NAME "provider_sha256." BSL_SAL_DL_EXT +#define HITLS_X509_SHA256_PROVIDER_PATH "provider_test_data/path2" + +static CRYPT_EAL_LibCtx *X509_LoadSha256ProviderWithDefault(void) +{ + CRYPT_EAL_LibCtx *libCtx = NULL; + int32_t ret = CRYPT_EAL_RandInit(CRYPT_RAND_SHA256, NULL, NULL, NULL, 0); + if (ret != CRYPT_SUCCESS && ret != CRYPT_EAL_ERR_DRBG_REPEAT_INIT) { + ASSERT_EQ(ret, CRYPT_SUCCESS); + } + + libCtx = CRYPT_EAL_LibCtxNew(); + ASSERT_TRUE(libCtx != NULL); + + ASSERT_EQ(CRYPT_EAL_ProviderSetLoadPath(libCtx, HITLS_X509_SHA256_PROVIDER_PATH), CRYPT_SUCCESS); + ASSERT_EQ(CRYPT_EAL_ProviderLoad(libCtx, 0, HITLS_X509_SHA256_LIB_NAME, NULL, NULL), CRYPT_SUCCESS); + ASSERT_EQ(CRYPT_EAL_ProviderLoad(libCtx, 0, "default", NULL, NULL), CRYPT_SUCCESS); + return libCtx; + +EXIT: + CRYPT_EAL_LibCtxFree(libCtx); + return NULL; +} +#endif + static uint32_t g_certSerialMemAllocCount = 0; static uint32_t g_certSerialMemFreeCount = 0; @@ -926,6 +954,36 @@ EXIT: } /* END_CASE */ +/* BEGIN_CASE */ +void SDV_X509_PROVIDER_CERT_PARSE_WITH_UNSUPPORTED_PROVIDER_TC001(char *attrName, char *format, char *path, int certNum) +{ +#if !defined(HITLS_PKI_X509_CRT_PARSE) || !defined(HITLS_CRYPTO_PROVIDER) + (void)attrName; + (void)format; + (void)path; + (void)certNum; + SKIP_TEST(); +#else + TestMemInit(); + BSL_GLOBAL_Init(); + CRYPT_EAL_LibCtx *libCtx = X509_LoadSha256ProviderWithDefault(); + HITLS_X509_List *list = NULL; + ASSERT_TRUE(libCtx != NULL); + + ASSERT_EQ(HITLS_X509_ProviderCertParseBundleFile((HITLS_PKI_LibCtx *)libCtx, attrName, format, path, &list), + HITLS_PKI_SUCCESS); + ASSERT_EQ(BSL_LIST_COUNT(list), certNum); + ASSERT_TRUE(TestIsErrStackEmpty()); + +EXIT: + BSL_LIST_FREE(list, (BSL_LIST_PFUNC_FREE)HITLS_X509_CertFree); + CRYPT_EAL_RandDeinitEx(libCtx); + CRYPT_EAL_LibCtxFree(libCtx); + BSL_GLOBAL_DeInit(); +#endif +} +/* END_CASE */ + /* BEGIN_CASE */ void SDV_X509_CERT_SET_VERIOSN_FUNC_TC001(void) { diff --git a/testcode/sdv/testcase/pki/cert/test_suite_sdv_x509_cert.data b/testcode/sdv/testcase/pki/cert/test_suite_sdv_x509_cert.data index 30cf879b..665f4af2 100644 --- a/testcode/sdv/testcase/pki/cert/test_suite_sdv_x509_cert.data +++ b/testcode/sdv/testcase/pki/cert/test_suite_sdv_x509_cert.data @@ -3436,6 +3436,9 @@ SDV_X509_PROVIDER_CERT_PARSE_BUNDLE_BUFF_FUNC_TC001:"ASN1":"../testdata/cert/sm2 SDV_X509_PROVIDER_CERT_PARSE_BUNDLE_BUFF_FUNC_TC001 provider parse bundle buff with 1 der cert SDV_X509_PROVIDER_CERT_PARSE_BUNDLE_BUFF_FUNC_TC001:"ASN1":"../testdata/cert/asn1/sha256Rsaca.crt":1 +SDV_X509_PROVIDER_CERT_PARSE_WITH_UNSUPPORTED_PROVIDER_TC001 provider parse rsa bundle file with unsupported sha256 provider +SDV_X509_PROVIDER_CERT_PARSE_WITH_UNSUPPORTED_PROVIDER_TC001:"provider=default":"PEM":"../testdata/tls/certificate/pem/rsa_sha256/server.pem":1 + SDV_X509_CERT_GET_BCONS_TEST_TC001 SDV_X509_CERT_GET_BCONS_TEST_TC001:BSL_FORMAT_ASN1:"../testdata/cert/asn1/ecdsa_cert/ca.der":1:1:-1 diff --git a/testcode/testdata/provider/provider_sha256.c b/testcode/testdata/provider/provider_sha256.c index 3526e093..5c373512 100644 --- a/testcode/testdata/provider/provider_sha256.c +++ b/testcode/testdata/provider/provider_sha256.c @@ -29,6 +29,7 @@ #include "bsl_err_internal.h" #define CRYPT_EAL_DEFAULT_ATTR "provider=sha256_test" +#define PROVIDER_SHA256_NOT_SUPPORT 0x7F000001 CRYPT_SHA2_256_Ctx *Sha256NewCtx(void *provCtx, int32_t algId) @@ -65,7 +66,7 @@ static int32_t CRYPT_EAL_Sha256ProvQuery(void *provCtx, int32_t operaId, const C *algInfos = defMds; return CRYPT_SUCCESS; default: - return CRYPT_NOT_SUPPORT; + return PROVIDER_SHA256_NOT_SUPPORT; } }