diff --git a/Makefile b/Makefile index 88efca3..c202416 100644 --- a/Makefile +++ b/Makefile @@ -257,73 +257,6 @@ ecdsa-policy-test: echo "FAIL: ECDSA policy probe environment unusable"; \ exit 1; \ fi; \ - for backend in \ - "-DWOLF_CRYPTO_CB -DWOLF_CRYPTO_CB_FIND" \ - "-DWOLF_CRYPTO_CB -DWOLF_CRYPTO_CB_ONLY_ECC" \ - "-DWOLFSSL_STM32_PKA" \ - "-DWOLFSSL_ATECC508A" \ - "-DWOLFSSL_ATECC608A" \ - "-DWOLFSSL_MICROCHIP_TA100" \ - "-DPLUTON_CRYPTO_ECC" \ - "-DWOLFSSL_CRYPTOCELL" \ - "-DWOLFSSL_SILABS_SE_ACCEL" \ - "-DWOLFSSL_KCAPI_ECC" \ - "-DWOLFSSL_SE050" \ - "-DWOLFSSL_ASYNC_CRYPT -DWC_ASYNC_ENABLE_ECC -DHAVE_CAVIUM -DHAVE_CAVIUM_V" \ - "-DWOLFSSL_ASYNC_CRYPT -DWC_ASYNC_ENABLE_ECC -DHAVE_INTEL_QA"; do \ - if $(CC) $(ECDSA_POLICY_FLAGS) $$backend $(ECDSA_POLICY_HEADER) \ - >"$$log_file" 2>&1; then \ - echo "FAIL: unverified ECDSA backend accepted: $$backend"; \ - exit 1; \ - fi; \ - if ! grep -Fq \ - "ECDSA backend does not support deterministic signing" \ - "$$log_file"; then \ - cat "$$log_file"; \ - echo "FAIL: ECDSA backend probe failed unexpectedly: $$backend"; \ - exit 1; \ - fi; \ - if ! $(CC) $(ECDSA_POLICY_BASE_FLAGS) $$backend \ - $(ECDSA_POLICY_HEADER) \ - >"$$log_file" 2>&1; then \ - cat "$$log_file"; \ - echo "FAIL: default ECDSA backend rejected: $$backend"; \ - exit 1; \ - fi; \ - done; \ - if ! $(CC) $(ECDSA_POLICY_FLAGS) -DWOLFSSL_XILINX_CRYPT_VERSAL \ - $(ECDSA_POLICY_HEADER) >"$$log_file" 2>&1; then \ - cat "$$log_file"; \ - echo "FAIL: deterministic Xilinx Versal ECDSA backend rejected"; \ - exit 1; \ - fi; \ - if ! $(CC) $(ECDSA_POLICY_FLAGS) -DWOLFSSL_STM32_PKA \ - -DWC_STM32_PKA_VERIFY_ONLY $(ECDSA_POLICY_HEADER) \ - >"$$log_file" 2>&1; then \ - cat "$$log_file"; \ - echo "FAIL: STM32 PKA verify-only backend rejected"; \ - exit 1; \ - fi; \ - if ! $(CC) $(ECDSA_POLICY_FLAGS) -DWOLF_CRYPTO_CB \ - $(ECDSA_POLICY_HEADER) >"$$log_file" 2>&1; then \ - cat "$$log_file"; \ - echo "FAIL: software-fallback crypto callback rejected"; \ - exit 1; \ - fi; \ - if ! $(CC) $(ECDSA_POLICY_FLAGS) -DWOLF_CRYPTO_CB \ - -DWOLFCOSE_LEAN_VERIFY $(ECDSA_POLICY_HEADER) \ - >"$$log_file" 2>&1; then \ - cat "$$log_file"; \ - echo "FAIL: ECDSA offload rejected in a verification-only build"; \ - exit 1; \ - fi; \ - if ! $(CC) $(ECDSA_POLICY_FLAGS) -DWOLFSSL_SE050 \ - -DWOLFSSL_SE050_ONLY_KEY_ID $(ECDSA_POLICY_HEADER) \ - >"$$log_file" 2>&1; then \ - cat "$$log_file"; \ - echo "FAIL: deterministic ECDSA rejected for SE050 software keys"; \ - exit 1; \ - fi; \ echo "PASS: optional ECDSA nonce policy enforced" rsapss-policy-test: diff --git a/docs/Macros.md b/docs/Macros.md index 5a28738..ea19c06 100644 --- a/docs/Macros.md +++ b/docs/Macros.md @@ -198,14 +198,9 @@ chooses its own nonce policy. For a `WOLFSSL_USER_SETTINGS` test build, override the policy probe include, for example with `ECDSA_POLICY_OPTS='-DWOLFSSL_USER_SETTINGS -Ipath/to/settings'`. -wolfCOSE also rejects local signing through wolfSSL dispatchers that do not -consume the key's deterministic nonce state: crypto callbacks that always -search or require callback-only ECC, STM32 PKA signing, ATECC508A/608A, -Microchip TA100, Pluton, CryptoCell, Silicon Labs SE acceleration, KCAPI, -SE050, and Cavium/Intel async ECC when the feature is enabled. A plain -crypto-callback build may use the software fallback, but a device-bound key is -rejected at runtime. The Xilinx Versal path remains permitted because wolfSSL -passes its RFC 6979-derived nonce to that hardware signer. +The wolfSSL build must provide deterministic-signing backend enforcement. +wolfSSL rejects signing when the selected backend cannot honor the requested +nonce policy, while permitting software fallback and compatible hardware. Without `WOLFSSL_NO_MALLOC`, wolfSSL may allocate a temporary deterministic nonce object per signature. In an ES256-only x86_64 macOS link, deterministic diff --git a/include/wolfcose/settings.h b/include/wolfcose/settings.h index 19c9e3a..514dced 100644 --- a/include/wolfcose/settings.h +++ b/include/wolfcose/settings.h @@ -547,25 +547,6 @@ extern "C" { #endif #define WOLFCOSE_HAVE_DETERMINISTIC_ECDSA - - /* These wolfSSL sign dispatchers do not consume the key's deterministic - * nonce state. Fail closed rather than silently bypassing the policy. The - * Xilinx Versal path is not listed because it passes the derived nonce to - * its hardware signer. */ - #if (defined(WOLF_CRYPTO_CB) && defined(WOLF_CRYPTO_CB_FIND)) || \ - defined(WOLF_CRYPTO_CB_ONLY_ECC) || \ - (defined(WOLFSSL_STM32_PKA) && \ - !defined(WC_STM32_PKA_VERIFY_ONLY)) || \ - defined(WOLFSSL_ATECC508A) || defined(WOLFSSL_ATECC608A) || \ - defined(WOLFSSL_MICROCHIP_TA100) || defined(PLUTON_CRYPTO_ECC) || \ - defined(WOLFSSL_CRYPTOCELL) || defined(WOLFSSL_SILABS_SE_ACCEL) || \ - defined(WOLFSSL_KCAPI_ECC) || \ - (defined(WOLFSSL_SE050) && \ - !defined(WOLFSSL_SE050_ONLY_KEY_ID)) || \ - (defined(WOLFSSL_ASYNC_CRYPT) && defined(WC_ASYNC_ENABLE_ECC) && \ - (defined(HAVE_CAVIUM_V) || defined(HAVE_INTEL_QA))) - #error "ECDSA backend does not support deterministic signing" - #endif #endif /* COSE_Encrypt multi-recipient — extension */ diff --git a/src/wolfcose_ecc.c b/src/wolfcose_ecc.c index 17e92d9..4c029bc 100644 --- a/src/wolfcose_ecc.c +++ b/src/wolfcose_ecc.c @@ -77,23 +77,9 @@ int wolfCose_EccSignRaw(const uint8_t* hash, size_t hashLen, #ifdef WOLFCOSE_HAVE_DETERMINISTIC_ECDSA savedDeterministic = (byte)eccKey->deterministic; savedHashType = eccKey->hashType; -#if defined(WOLF_CRYPTO_CB) && !defined(WOLF_CRYPTO_CB_FIND) - if (eccKey->devId != INVALID_DEVID) { - ret = WOLFCOSE_E_UNSUPPORTED; - } - else -#endif -#if defined(WOLFSSL_SE050) && defined(WOLFSSL_SE050_ONLY_KEY_ID) - if (eccKey->keyIdSet != 0) { - ret = WOLFCOSE_E_UNSUPPORTED; - } - else -#endif - { - ret = wc_ecc_set_deterministic_ex(eccKey, 1u, hashType); - if (ret != 0) { - ret = WOLFCOSE_E_CRYPTO; - } + ret = wc_ecc_set_deterministic_ex(eccKey, 1u, hashType); + if (ret != 0) { + ret = WOLFCOSE_E_CRYPTO; } #else (void)hashType; @@ -143,8 +129,8 @@ int wolfCose_EccSignRaw(const uint8_t* hash, size_t hashLen, } (void)wolfCose_ForceZero(derSig, sizeof(derSig)); #ifdef WOLFCOSE_HAVE_DETERMINISTIC_ECDSA - eccKey->deterministic = savedDeterministic; - eccKey->hashType = savedHashType; + (void)wc_ecc_set_deterministic_ex(eccKey, savedDeterministic, + savedHashType); #endif } return ret; diff --git a/src/wolfcose_internal.h b/src/wolfcose_internal.h index 82def28..2f9295e 100644 --- a/src/wolfcose_internal.h +++ b/src/wolfcose_internal.h @@ -44,7 +44,7 @@ * incompatible math layout or cannot roll back accepted or provisioned key * material. */ #if defined(HAVE_ECC) && defined(WOLFCOSE_KEY_DECODE) && \ - (defined(WOLFSSL_CRYPTOCELL) || defined(WOLFSSL_QNX_CAAM) || \ + (defined(WOLFSSL_QNX_CAAM) || \ defined(WOLFSSL_IMXRT1170_CAAM) || \ defined(WOLFSSL_SILABS_SE_ACCEL) || \ defined(WOLFSSL_MAXQ10XX_CRYPTO) || \