Merge pull request #8581 from dgarske/no_ecc_check_public_order

Add option to disable ECC public key order checking
pull/8596/head
Sean Parkinson 2025-03-25 09:13:56 +10:00 committed by GitHub
commit cfc774c152
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
2 changed files with 29 additions and 32 deletions

View File

@ -314,6 +314,7 @@ NO_ECC384
NO_ECC521 NO_ECC521
NO_ECC_CACHE_CURVE NO_ECC_CACHE_CURVE
NO_ECC_CHECK_KEY NO_ECC_CHECK_KEY
NO_ECC_CHECK_PUBKEY_ORDER
NO_ECC_KEY_IMPORT NO_ECC_KEY_IMPORT
NO_ECC_MAKE_PUB NO_ECC_MAKE_PUB
NO_ED25519_CLIENT_AUTH NO_ED25519_CLIENT_AUTH

View File

@ -257,12 +257,12 @@ ECC Curve Sizes:
/* macro guard for ecc_check_pubkey_order functionality */ /* macro guard for ecc_check_pubkey_order functionality */
#if !defined(WOLFSSL_SP_MATH) && \ #if (!defined(NO_ECC_CHECK_PUBKEY_ORDER) && \
!defined(WOLFSSL_ATECC508A) && !defined(WOLFSSL_ATECC608A) && \ !defined(WOLF_CRYPTO_CB_ONLY_ECC) && \
!defined(WOLFSSL_CRYPTOCELL) && !defined(WOLFSSL_SILABS_SE_ACCEL) && \ !defined(WOLFSSL_ATECC508A) && !defined(WOLFSSL_ATECC608A) && \
!defined(WOLFSSL_SE050) && !defined(WOLFSSL_STM32_PKA) && \ !defined(WOLFSSL_CRYPTOCELL) && !defined(WOLFSSL_SILABS_SE_ACCEL) && \
(!defined(WOLF_CRYPTO_CB_ONLY_ECC) || defined(WOLFSSL_IMXRT1170_CAAM) || \ !defined(WOLFSSL_SE050) && !defined(WOLFSSL_STM32_PKA)) || \
defined(WOLFSSL_QNX_CAAM)) defined(WOLFSSL_IMXRT1170_CAAM) || defined(WOLFSSL_QNX_CAAM)
/* CAAM builds use public key validation as a means to check if an /* CAAM builds use public key validation as a means to check if an
* imported private key is an encrypted black key or not */ * imported private key is an encrypted black key or not */
@ -1441,7 +1441,7 @@ size_t wc_ecc_get_sets_count(void) {
#if defined(HAVE_COMP_KEY) && defined(HAVE_ECC_KEY_EXPORT) #if defined(HAVE_COMP_KEY) && defined(HAVE_ECC_KEY_EXPORT)
static int wc_ecc_export_x963_compressed(ecc_key* key, byte* out, word32* outLen); static int wc_ecc_export_x963_compressed(ecc_key* key, byte* out, word32* outLen);
#endif #endif
#ifdef HAVE_ECC_CHECK_PUBKEY_ORDER #if defined(HAVE_ECC_CHECK_PUBKEY_ORDER) && !defined(WOLFSSL_SP_MATH)
static int ecc_check_pubkey_order(ecc_key* key, ecc_point* pubkey, mp_int* a, static int ecc_check_pubkey_order(ecc_key* key, ecc_point* pubkey, mp_int* a,
mp_int* prime, mp_int* order); mp_int* prime, mp_int* order);
#endif #endif
@ -9944,11 +9944,7 @@ int wc_ecc_export_x963_ex(ecc_key* key, byte* out, word32* outLen,
#endif /* HAVE_ECC_KEY_EXPORT */ #endif /* HAVE_ECC_KEY_EXPORT */
#if !defined(WOLFSSL_ATECC508A) && !defined(WOLFSSL_ATECC608A) && \ #ifdef HAVE_ECC_CHECK_PUBKEY_ORDER
!defined(WOLFSSL_CRYPTOCELL) && !defined(WOLFSSL_SE050) && \
!defined(WOLFSSL_STM32_PKA) && \
(!defined(WOLF_CRYPTO_CB_ONLY_ECC) || defined(WOLFSSL_QNX_CAAM) || \
defined(WOLFSSL_IMXRT1170_CAAM))
/* is ecc point on curve described by dp ? */ /* is ecc point on curve described by dp ? */
static int _ecc_is_point(ecc_point* ecp, mp_int* a, mp_int* b, mp_int* prime) static int _ecc_is_point(ecc_point* ecp, mp_int* a, mp_int* b, mp_int* prime)
@ -10385,9 +10381,10 @@ static int _ecc_pairwise_consistency_test(ecc_key* key, WC_RNG* rng)
return err; return err;
} }
#endif /* (FIPS v5 or later || WOLFSSL_VALIDATE_ECC_KEYGEN) &&!WOLFSSL_KCAPI_ECC */ #endif /* (FIPS v5 or later || WOLFSSL_VALIDATE_ECC_KEYGEN) && \
!WOLFSSL_KCAPI_ECC */
#ifdef HAVE_ECC_CHECK_PUBKEY_ORDER #ifndef WOLFSSL_SP_MATH
/* validate order * pubkey = point at infinity, 0 on success */ /* validate order * pubkey = point at infinity, 0 on success */
static int ecc_check_pubkey_order(ecc_key* key, ecc_point* pubkey, mp_int* a, static int ecc_check_pubkey_order(ecc_key* key, ecc_point* pubkey, mp_int* a,
mp_int* prime, mp_int* order) mp_int* prime, mp_int* order)
@ -10460,12 +10457,8 @@ static int ecc_check_pubkey_order(ecc_key* key, ecc_point* pubkey, mp_int* a,
return err; return err;
} }
#endif /* !WOLFSSL_SP_MATH */ #endif /* !WOLFSSL_SP_MATH */
#endif /* HAVE_ECC_CHECK_PUBKEY_ORDER */
#endif /* !WOLFSSL_ATECC508A && !WOLFSSL_ATECC608A &&
!WOLFSSL_CRYPTOCELL && !WOLFSSL_SE050 && !WOLFSSL_STM32_PKA &&
(!WOLF_CRYPTO_CB_ONLY_ECC || WOLFSSL_QNX_CAAM ||
WOLFSSL_IMXRT1170_CAAM)
*/
#ifdef OPENSSL_EXTRA #ifdef OPENSSL_EXTRA
int wc_ecc_get_generator(ecc_point* ecp, int curve_idx) int wc_ecc_get_generator(ecc_point* ecp, int curve_idx)
@ -10493,7 +10486,7 @@ int wc_ecc_get_generator(ecc_point* ecp, int curve_idx)
return err; return err;
} }
#endif /* OPENSSLALL */ #endif /* OPENSSL_EXTRA */
/* Validate the public key per SP 800-56Ar3 section 5.6.2.3.3, /* Validate the public key per SP 800-56Ar3 section 5.6.2.3.3,
@ -10505,7 +10498,7 @@ int wc_ecc_get_generator(ecc_point* ecp, int curve_idx)
static int _ecc_validate_public_key(ecc_key* key, int partial, int priv) static int _ecc_validate_public_key(ecc_key* key, int partial, int priv)
{ {
int err = MP_OKAY; int err = MP_OKAY;
#ifdef HAVE_ECC_CHECK_PUBKEY_ORDER #if defined(HAVE_ECC_CHECK_PUBKEY_ORDER) && !defined(WOLFSSL_SP_MATH)
mp_int* b = NULL; mp_int* b = NULL;
#ifdef USE_ECC_B_PARAM #ifdef USE_ECC_B_PARAM
DECLARE_CURVE_SPECS(4); DECLARE_CURVE_SPECS(4);
@ -10515,13 +10508,23 @@ static int _ecc_validate_public_key(ecc_key* key, int partial, int priv)
#endif #endif
DECLARE_CURVE_SPECS(3); DECLARE_CURVE_SPECS(3);
#endif /* USE_ECC_B_PARAM */ #endif /* USE_ECC_B_PARAM */
#endif /* HAVE_ECC_CHECK_PUBKEY_ORDER */ #endif
ASSERT_SAVED_VECTOR_REGISTERS(); ASSERT_SAVED_VECTOR_REGISTERS();
if (key == NULL) if (key == NULL)
return BAD_FUNC_ARG; return BAD_FUNC_ARG;
#ifndef HAVE_ECC_CHECK_PUBKEY_ORDER
/* consider key check success on HW crypto
* ex: ATECC508/608A, CryptoCell and Silabs
*
* consider key check success on most Crypt Cb only builds
*/
err = MP_OKAY;
#else
#ifdef WOLFSSL_HAVE_SP_ECC #ifdef WOLFSSL_HAVE_SP_ECC
#ifndef WOLFSSL_SP_NO_256 #ifndef WOLFSSL_SP_NO_256
if (key->idx != ECC_CUSTOM_IDX && ecc_sets[key->idx].id == ECC_SECP256R1) { if (key->idx != ECC_CUSTOM_IDX && ecc_sets[key->idx].id == ECC_SECP256R1) {
@ -10556,15 +10559,6 @@ static int _ecc_validate_public_key(ecc_key* key, int partial, int priv)
#endif #endif
#ifndef WOLFSSL_SP_MATH #ifndef WOLFSSL_SP_MATH
#ifndef HAVE_ECC_CHECK_PUBKEY_ORDER
/* consider key check success on HW crypto
* ex: ATECC508/608A, CryptoCell and Silabs
*
* consider key check success on most Crypt Cb only builds
*/
err = MP_OKAY;
#else
#ifdef USE_ECC_B_PARAM #ifdef USE_ECC_B_PARAM
ALLOC_CURVE_SPECS(4, err); ALLOC_CURVE_SPECS(4, err);
#else #else
@ -10688,11 +10682,13 @@ static int _ecc_validate_public_key(ecc_key* key, int partial, int priv)
#endif #endif
FREE_CURVE_SPECS(); FREE_CURVE_SPECS();
#endif /* HAVE_ECC_CHECK_PUBKEY_ORDER */
#else #else
/* The single precision math curve is not available */
err = WC_KEY_SIZE_E; err = WC_KEY_SIZE_E;
#endif /* !WOLFSSL_SP_MATH */ #endif /* !WOLFSSL_SP_MATH */
#endif /* HAVE_ECC_CHECK_PUBKEY_ORDER */
(void)partial; (void)partial;
(void)priv; (void)priv;
return err; return err;