linuxkm on x86: global refactor across PK implementations of sp-asm vector register preservation, including removal of all residual can't-fail vector paths in PK algs.

wolfcrypt/src/sp_x86_64.c:

* fix ASSERT_SAVED_VECTOR_REGISTERS() in C wrappers: add where missing for implementations that use AVX2, and remove frivolous checks for ones that don't.

* refactor vector save-restore with a single locally tracked save in sp_RsaPublic_#(), sp_RsaPrivate_#(), sp_ecc_mulmod_add_#(), sp_ecc_mulmod_base_add_#(), sp_ecc_make_key_#(), and sp_#_calc_s_#().

* fix feature test in sp_ModExp_Fp_star_1024(), sp_Pairing_1024(), and sp_Pairing_gen_precomp_1024(), to properly gate on IS_INTEL_AVX2(cpuid_flags) and SAVE_VECTOR_REGISTERS2() == 0.

wolfcrypt/src/{dh.c,dsa.c,ecc.c,eccsi.c,rsa.c,sp_int.c}:

* remove all vector register provisions (SAVE_VECTOR_REGISTERS(), RESTORE_VECTOR_REGISTERS(), ASSERT_SAVED_VECTOR_REGISTERS());

* add explicit WC_CHECK_FOR_INTR_SIGNALS() and WC_RELAX_LONG_LOOP() to the lengthy loops in wc_DhGenerateParams(), wc_MakeDsaParameters(), ecc_sign_hash_sw(), and wc_MakeRsaKey().

wolfssl/wolfcrypt/{error-crypt.h,logging.h,memory.h}:

* make wc_backtrace_render() and wc_backtrace_set_fp() available whenever defined(WOLFSSL_DEBUG_BACKTRACE_ERROR_CODES);

* add support for DEBUG_VECTOR_REGISTERS_BACKTRACE_ON_FAIL, activating backtraces on vector register errors.

* also improve the debugging format from the DEBUG_VECTOR_REGISTER_ACCESS variants of SAVE_VECTOR_REGISTERS() and friends.

linuxkm/lkcapi_{dh,ecdh,ecdsa,rsa}_glue.c: harmonize PK driver names with AES, SHA, and DRBG, notably adding AVX2 annotation when enabled.

wolfcrypt/src/{sp_x86_64_asm.S,sp_x86_64_asm.asm}: synchronize with wolfssl/scripts#581 (removes SSE2 implementations of sp_#_get_from_table_#(), which no longer have users).
This commit is contained in:
Daniel Pouzzner
2026-05-30 15:11:15 -05:00
parent f6f27652dd
commit 3121c55e4e
14 changed files with 550 additions and 760 deletions
+1 -1
View File
@@ -741,10 +741,10 @@ WOLFSSL_CONTIKI
WOLFSSL_CRL_ALLOW_MISSING_CDP
WOLFSSL_DISABLE_EARLY_SANITY_CHECKS
WOLFSSL_DRBG_SHA256
WOLFSSL_DTLS13_ECHO_LEGACY_SESSION_ID
WOLFSSL_DTLS_DISALLOW_FUTURE
WOLFSSL_DTLS_RECORDS_CAN_SPAN_DATAGRAMS
WOLFSSL_DTLS_RESEND_ONLY_TIMEOUT
WOLFSSL_DTLS13_ECHO_LEGACY_SESSION_ID
WOLFSSL_DUMP_MEMIO_STREAM
WOLFSSL_DUP_CERTPOL
WOLFSSL_EARLY_DATA_NO_ANTI_REPLAY
+15 -12
View File
@@ -89,37 +89,40 @@
#include <crypto/dh.h>
#define WOLFKM_DH_NAME ("dh")
#define WOLFKM_DH_DRIVER ("dh" WOLFKM_DRIVER_FIPS \
"-wolfcrypt")
#if defined(WOLFSSL_SP_X86_64_ASM) && !defined(NO_AVX2_SUPPORT)
#define WOLFKM_DH_DRIVER_ISA_EXT "-avx2"
#else
#define WOLFKM_DH_DRIVER_ISA_EXT ""
#endif
#define WOLFKM_DH_DRIVER_SUFFIX WOLFKM_DH_DRIVER_ISA_EXT \
WOLFKM_DRIVER_SUFFIX_BASE
#define WOLFKM_DH_DRIVER ("dh" WOLFKM_DH_DRIVER_SUFFIX)
#ifdef HAVE_FFDHE_2048
#define WOLFKM_FFDHE2048_NAME ("ffdhe2048(dh)")
#define WOLFKM_FFDHE2048_DRIVER ("ffdhe2048" WOLFKM_DRIVER_FIPS \
"-wolfcrypt")
#define WOLFKM_FFDHE2048_DRIVER ("ffdhe2048" WOLFKM_DH_DRIVER_SUFFIX)
#endif /* HAVE_FFDHE_2048 */
#ifdef HAVE_FFDHE_3072
#define WOLFKM_FFDHE3072_NAME ("ffdhe3072(dh)")
#define WOLFKM_FFDHE3072_DRIVER ("ffdhe3072" WOLFKM_DRIVER_FIPS \
"-wolfcrypt")
#define WOLFKM_FFDHE3072_DRIVER ("ffdhe3072" WOLFKM_DH_DRIVER_SUFFIX)
#endif /* HAVE_FFDHE_3072 */
#ifdef HAVE_FFDHE_4096
#define WOLFKM_FFDHE4096_NAME ("ffdhe4096(dh)")
#define WOLFKM_FFDHE4096_DRIVER ("ffdhe4096" WOLFKM_DRIVER_FIPS \
"-wolfcrypt")
#define WOLFKM_FFDHE4096_DRIVER ("ffdhe4096" WOLFKM_DH_DRIVER_SUFFIX)
#endif /* HAVE_FFDHE_4096 */
#ifdef HAVE_FFDHE_6144
#define WOLFKM_FFDHE6144_NAME ("ffdhe6144(dh)")
#define WOLFKM_FFDHE6144_DRIVER ("ffdhe6144" WOLFKM_DRIVER_FIPS \
"-wolfcrypt")
#define WOLFKM_FFDHE6144_DRIVER ("ffdhe6144" WOLFKM_DH_DRIVER_SUFFIX)
#endif /* HAVE_FFDHE_6144 */
#ifdef HAVE_FFDHE_8192
#define WOLFKM_FFDHE8192_NAME ("ffdhe8192(dh)")
#define WOLFKM_FFDHE8192_DRIVER ("ffdhe8192" WOLFKM_DRIVER_FIPS \
"-wolfcrypt")
#define WOLFKM_FFDHE8192_DRIVER ("ffdhe8192" WOLFKM_DH_DRIVER_SUFFIX)
#endif /* HAVE_FFDHE_8192 */
static int linuxkm_test_kpp_driver(const char * driver,
+12 -7
View File
@@ -63,19 +63,24 @@
#include <wolfssl/wolfcrypt/ecc.h>
#include <crypto/ecdh.h>
#define WOLFKM_ECDH_DRIVER ("ecdh-wolfcrypt")
#if defined(WOLFSSL_SP_X86_64_ASM) && !defined(NO_AVX2_SUPPORT)
#define WOLFKM_ECDH_DRIVER_ISA_EXT "-avx2"
#else
#define WOLFKM_ECDH_DRIVER_ISA_EXT ""
#endif
#define WOLFKM_ECDH_DRIVER_SUFFIX WOLFKM_ECDH_DRIVER_ISA_EXT \
WOLFKM_DRIVER_SUFFIX_BASE
#define WOLFKM_ECDH_DRIVER ("ecdh" WOLFKM_ECDH_DRIVER_SUFFIX)
#define WOLFKM_ECDH_P192_NAME ("ecdh-nist-p192")
#define WOLFKM_ECDH_P192_DRIVER ("ecdh-nist-p192" WOLFKM_DRIVER_FIPS \
"-wolfcrypt")
#define WOLFKM_ECDH_P192_DRIVER ("ecdh-nist-p192" WOLFKM_ECDH_DRIVER_SUFFIX)
#define WOLFKM_ECDH_P256_NAME ("ecdh-nist-p256")
#define WOLFKM_ECDH_P256_DRIVER ("ecdh-nist-p256" WOLFKM_DRIVER_FIPS \
"-wolfcrypt")
#define WOLFKM_ECDH_P256_DRIVER ("ecdh-nist-p256" WOLFKM_ECDH_DRIVER_SUFFIX)
#define WOLFKM_ECDH_P384_NAME ("ecdh-nist-p384")
#define WOLFKM_ECDH_P384_DRIVER ("ecdh-nist-p384" WOLFKM_DRIVER_FIPS \
"-wolfcrypt")
#define WOLFKM_ECDH_P384_DRIVER ("ecdh-nist-p384" WOLFKM_ECDH_DRIVER_SUFFIX)
static int linuxkm_test_ecdh_nist_driver(const char * driver,
const byte * b_pub,
+13 -9
View File
@@ -82,23 +82,27 @@
#include <wolfssl/wolfcrypt/asn.h>
#include <wolfssl/wolfcrypt/ecc.h>
#define WOLFKM_ECDSA_DRIVER ("ecdsa-wolfcrypt")
#if defined(WOLFSSL_SP_X86_64_ASM) && !defined(NO_AVX2_SUPPORT)
#define WOLFKM_ECDSA_DRIVER_ISA_EXT "-avx2"
#else
#define WOLFKM_ECDSA_DRIVER_ISA_EXT ""
#endif
#define WOLFKM_ECDSA_DRIVER_SUFFIX WOLFKM_ECDSA_DRIVER_ISA_EXT \
WOLFKM_DRIVER_SUFFIX_BASE
#define WOLFKM_ECDSA_DRIVER ("ecdsa" WOLFKM_ECDSA_DRIVER_SUFFIX)
#define WOLFKM_ECDSA_P192_NAME ("ecdsa-nist-p192")
#define WOLFKM_ECDSA_P192_DRIVER ("ecdsa-nist-p192" WOLFKM_DRIVER_FIPS \
"-wolfcrypt")
#define WOLFKM_ECDSA_P192_DRIVER ("ecdsa-nist-p192" WOLFKM_ECDSA_DRIVER_SUFFIX)
#define WOLFKM_ECDSA_P256_NAME ("ecdsa-nist-p256")
#define WOLFKM_ECDSA_P256_DRIVER ("ecdsa-nist-p256" WOLFKM_DRIVER_FIPS \
"-wolfcrypt")
#define WOLFKM_ECDSA_P256_DRIVER ("ecdsa-nist-p256" WOLFKM_ECDSA_DRIVER_SUFFIX)
#define WOLFKM_ECDSA_P384_NAME ("ecdsa-nist-p384")
#define WOLFKM_ECDSA_P384_DRIVER ("ecdsa-nist-p384" WOLFKM_DRIVER_FIPS \
"-wolfcrypt")
#define WOLFKM_ECDSA_P384_DRIVER ("ecdsa-nist-p384" WOLFKM_ECDSA_DRIVER_SUFFIX)
#define WOLFKM_ECDSA_P521_NAME ("ecdsa-nist-p521")
#define WOLFKM_ECDSA_P521_DRIVER ("ecdsa-nist-p521" WOLFKM_DRIVER_FIPS \
"-wolfcrypt")
#define WOLFKM_ECDSA_P521_DRIVER ("ecdsa-nist-p521" WOLFKM_ECDSA_DRIVER_SUFFIX)
static int linuxkm_test_ecdsa_nist_driver(const char * driver,
+19 -18
View File
@@ -99,45 +99,46 @@
#include <wolfssl/wolfcrypt/rsa.h>
#define WOLFKM_RSA_NAME ("rsa")
#define WOLFKM_RSA_DRIVER ("rsa" WOLFKM_DRIVER_FIPS "-wolfcrypt")
#if defined(WOLFSSL_SP_X86_64_ASM) && !defined(NO_AVX2_SUPPORT)
#define WOLFKM_RSA_DRIVER_ISA_EXT "-avx2"
#else
#define WOLFKM_RSA_DRIVER_ISA_EXT ""
#endif
#define WOLFKM_RSA_DRIVER_SUFFIX WOLFKM_RSA_DRIVER_ISA_EXT \
WOLFKM_DRIVER_SUFFIX_BASE
#define WOLFKM_RSA_DRIVER ("rsa" WOLFKM_RSA_DRIVER_SUFFIX)
#if defined(LINUXKM_AKCIPHER_NO_SIGNVERIFY)
/* the akcipher alg */
#define WOLFKM_PKCS1PAD_NAME ("pkcs1pad(rsa)")
#define WOLFKM_PKCS1PAD_DRIVER ("pkcs1pad(rsa" WOLFKM_DRIVER_FIPS \
"-wolfcrypt)")
#define WOLFKM_PKCS1PAD_NAME "pkcs1pad(rsa)"
#define WOLFKM_PKCS1PAD_DRIVER "pkcs1pad-rsa" WOLFKM_RSA_DRIVER_SUFFIX
#endif /* LINUXKM_AKCIPHER_NO_SIGNVERIFY */
/*
* pkcs1 sign verify alg names
* */
#define WOLFKM_PKCS1_SHA224_NAME (PKCS1_NAME "(rsa,sha224)")
#define WOLFKM_PKCS1_SHA224_DRIVER (PKCS1_NAME "(rsa" WOLFKM_DRIVER_FIPS \
"-wolfcrypt,sha224)")
#define WOLFKM_PKCS1_SHA224_DRIVER ("pkcs1pad-rsa-sha224" WOLFKM_RSA_DRIVER_SUFFIX)
#define WOLFKM_PKCS1_SHA256_NAME (PKCS1_NAME "(rsa,sha256)")
#define WOLFKM_PKCS1_SHA256_DRIVER (PKCS1_NAME "(rsa" WOLFKM_DRIVER_FIPS \
"-wolfcrypt,sha256)")
#define WOLFKM_PKCS1_SHA256_DRIVER ("pkcs1pad-rsa-sha256" WOLFKM_RSA_DRIVER_SUFFIX)
#define WOLFKM_PKCS1_SHA384_NAME (PKCS1_NAME "(rsa,sha384)")
#define WOLFKM_PKCS1_SHA384_DRIVER (PKCS1_NAME "(rsa" WOLFKM_DRIVER_FIPS \
"-wolfcrypt,sha384)")
#define WOLFKM_PKCS1_SHA384_DRIVER ("pkcs1pad-rsa-sha384" WOLFKM_RSA_DRIVER_SUFFIX)
#define WOLFKM_PKCS1_SHA512_NAME (PKCS1_NAME "(rsa,sha512)")
#define WOLFKM_PKCS1_SHA512_DRIVER (PKCS1_NAME "(rsa" WOLFKM_DRIVER_FIPS \
"-wolfcrypt,sha512)")
#define WOLFKM_PKCS1_SHA512_DRIVER ("pkcs1pad-rsa-sha512" WOLFKM_RSA_DRIVER_SUFFIX)
#define WOLFKM_PKCS1_SHA3_256_NAME (PKCS1_NAME "(rsa,sha3-256)")
#define WOLFKM_PKCS1_SHA3_256_DRIVER (PKCS1_NAME "(rsa" WOLFKM_DRIVER_FIPS \
"-wolfcrypt,sha3-256)")
#define WOLFKM_PKCS1_SHA3_256_DRIVER ("pkcs1pad-rsa-sha3-256" WOLFKM_RSA_DRIVER_SUFFIX)
#define WOLFKM_PKCS1_SHA3_384_NAME (PKCS1_NAME "(rsa,sha3-384)")
#define WOLFKM_PKCS1_SHA3_384_DRIVER (PKCS1_NAME "(rsa" WOLFKM_DRIVER_FIPS \
"-wolfcrypt,sha3-384)")
#define WOLFKM_PKCS1_SHA3_384_DRIVER ("pkcs1pad-rsa-sha3-384" WOLFKM_RSA_DRIVER_SUFFIX)
#define WOLFKM_PKCS1_SHA3_512_NAME (PKCS1_NAME "(rsa,sha3-512)")
#define WOLFKM_PKCS1_SHA3_512_DRIVER (PKCS1_NAME "(rsa" WOLFKM_DRIVER_FIPS \
"-wolfcrypt,sha3-512)")
#define WOLFKM_PKCS1_SHA3_512_DRIVER ("pkcs1pad-rsa-sha3-512" WOLFKM_RSA_DRIVER_SUFFIX)
#if defined(WOLFSSL_KEY_GEN)
#if defined(LINUXKM_DIRECT_RSA)
+4 -44
View File
@@ -57,14 +57,6 @@
}
#endif
#if defined(WOLFSSL_USE_SAVE_VECTOR_REGISTERS) && !defined(WOLFSSL_SP_ASM)
/* force off unneeded vector register save/restore. */
#undef SAVE_VECTOR_REGISTERS
#define SAVE_VECTOR_REGISTERS(fail_clause) SAVE_NO_VECTOR_REGISTERS(fail_clause)
#undef RESTORE_VECTOR_REGISTERS
#define RESTORE_VECTOR_REGISTERS() RESTORE_NO_VECTOR_REGISTERS()
#endif
/*
Possible DH enable options:
* NO_RSA: Overall control of DH default: on (not defined)
@@ -1425,8 +1417,6 @@ int wc_DhGeneratePublic(DhKey* key, byte* priv, word32 privSz,
return BAD_FUNC_ARG;
}
SAVE_VECTOR_REGISTERS(return _svr_ret;);
ret = GeneratePublicDh(key, priv, privSz, pub, pubSz);
#if FIPS_VERSION_GE(5,0) || defined(WOLFSSL_VALIDATE_DH_KEYGEN)
@@ -1436,8 +1426,6 @@ int wc_DhGeneratePublic(DhKey* key, byte* priv, word32 privSz,
ret = _ffc_pairwise_consistency_test(key, pub, *pubSz, priv, privSz);
#endif /* FIPS V5 or later || WOLFSSL_VALIDATE_DH_KEYGEN */
RESTORE_VECTOR_REGISTERS();
return ret;
}
@@ -1451,8 +1439,6 @@ static int wc_DhGenerateKeyPair_Sync(DhKey* key, WC_RNG* rng,
return BAD_FUNC_ARG;
}
SAVE_VECTOR_REGISTERS(return _svr_ret;);
ret = GeneratePrivateDh(key, rng, priv, privSz);
if (ret == 0)
@@ -1464,9 +1450,6 @@ static int wc_DhGenerateKeyPair_Sync(DhKey* key, WC_RNG* rng,
ret = _ffc_pairwise_consistency_test(key, pub, *pubSz, priv, *privSz);
#endif /* FIPS V5 or later || WOLFSSL_VALIDATE_DH_KEYGEN */
RESTORE_VECTOR_REGISTERS();
return ret;
}
#endif /* !WOLFSSL_KCAPI_DH */
@@ -1589,8 +1572,6 @@ static int _ffc_validate_public_key(DhKey* key, const byte* pub, word32 pubSz,
return MP_INIT_E;
}
SAVE_VECTOR_REGISTERS(ret = _svr_ret;);
if (mp_read_unsigned_bin(y, pub, pubSz) != MP_OKAY) {
ret = MP_READ_E;
}
@@ -1679,8 +1660,6 @@ static int _ffc_validate_public_key(DhKey* key, const byte* pub, word32 pubSz,
mp_clear(p);
mp_clear(q);
RESTORE_VECTOR_REGISTERS();
#if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_NO_MALLOC)
XFREE(q, key->heap, DYNAMIC_TYPE_DH);
XFREE(p, key->heap, DYNAMIC_TYPE_DH);
@@ -1919,8 +1898,6 @@ static int _ffc_pairwise_consistency_test(DhKey* key,
return MP_INIT_E;
}
SAVE_VECTOR_REGISTERS(ret = _svr_ret;);
/* Load the private and public keys into big integers. */
if (mp_read_unsigned_bin(publicKey, pub, pubSz) != MP_OKAY ||
mp_read_unsigned_bin(privateKey, priv, privSz) != MP_OKAY) {
@@ -1979,8 +1956,6 @@ static int _ffc_pairwise_consistency_test(DhKey* key,
mp_clear(publicKey);
mp_clear(checkKey);
RESTORE_VECTOR_REGISTERS();
#if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_NO_MALLOC)
XFREE(checkKey, key->heap, DYNAMIC_TYPE_DH);
XFREE(privateKey, key->heap, DYNAMIC_TYPE_DH);
@@ -2174,8 +2149,6 @@ static int wc_DhAgree_Sync(DhKey* key, byte* agree, word32* agreeSz,
ret = MP_INIT_E;
if (ret == 0) {
SAVE_VECTOR_REGISTERS(ret = _svr_ret;);
if (ret == 0 && mp_read_unsigned_bin(y, otherPub, pubSz) != MP_OKAY)
ret = MP_READ_E;
@@ -2201,8 +2174,6 @@ static int wc_DhAgree_Sync(DhKey* key, byte* agree, word32* agreeSz,
}
mp_clear(y);
RESTORE_VECTOR_REGISTERS();
}
/* make sure agree is > 1 (SP800-56A, 5.7.1.1) */
@@ -2253,8 +2224,6 @@ static int wc_DhAgree_Sync(DhKey* key, byte* agree, word32* agreeSz,
}
#endif
SAVE_VECTOR_REGISTERS(ret = _svr_ret;);
if (mp_read_unsigned_bin(x, priv, privSz) != MP_OKAY)
ret = MP_READ_E;
#ifdef WOLFSSL_CHECK_MEM_ZERO
@@ -2313,8 +2282,6 @@ static int wc_DhAgree_Sync(DhKey* key, byte* agree, word32* agreeSz,
mp_clear(y);
mp_forcezero(x);
RESTORE_VECTOR_REGISTERS();
#else
(void)ct;
ret = WC_KEY_SIZE_E;
@@ -2601,8 +2568,6 @@ static int _DhSetKey(DhKey* key, const byte* p, word32 pSz, const byte* g,
ret = BAD_FUNC_ARG;
}
SAVE_VECTOR_REGISTERS(return _svr_ret;);
if (ret == 0) {
/* may have leading 0 */
if (p[0] == 0) {
@@ -2714,8 +2679,6 @@ static int _DhSetKey(DhKey* key, const byte* p, word32 pSz, const byte* g,
mp_clear(keyP);
}
RESTORE_VECTOR_REGISTERS();
return ret;
}
@@ -3204,8 +3167,6 @@ int wc_DhGenerateParams(WC_RNG *rng, int modSz, DhKey *dh)
}
#endif
SAVE_VECTOR_REGISTERS(ret = _svr_ret;);
if (ret == 0) {
/* force magnitude */
buf[0] |= 0xC0;
@@ -3264,9 +3225,10 @@ int wc_DhGenerateParams(WC_RNG *rng, int modSz, DhKey *dh)
if (ret != 0 || primeCheck == MP_YES)
break;
/* linuxkm: release the kernel for a moment before iterating. */
RESTORE_VECTOR_REGISTERS();
SAVE_VECTOR_REGISTERS(ret = _svr_ret; break;);
ret = WC_CHECK_FOR_INTR_SIGNALS();
if (ret != 0)
break;
WC_RELAX_LONG_LOOP();
};
}
@@ -3308,8 +3270,6 @@ int wc_DhGenerateParams(WC_RNG *rng, int modSz, DhKey *dh)
mp_clear(&dh->g);
}
RESTORE_VECTOR_REGISTERS();
#ifndef WOLFSSL_NO_MALLOC
if (buf != NULL)
#endif
+5 -16
View File
@@ -36,14 +36,6 @@
#include <wolfcrypt/src/misc.c>
#endif
#if defined(WOLFSSL_USE_SAVE_VECTOR_REGISTERS) && !defined(WOLFSSL_SP_ASM)
/* force off unneeded vector register save/restore. */
#undef SAVE_VECTOR_REGISTERS
#define SAVE_VECTOR_REGISTERS(fail_clause) SAVE_NO_VECTOR_REGISTERS(fail_clause)
#undef RESTORE_VECTOR_REGISTERS
#define RESTORE_VECTOR_REGISTERS() RESTORE_NO_VECTOR_REGISTERS()
#endif
#ifdef _MSC_VER
/* disable for while(0) cases (MSVC bug) */
#pragma warning(disable:4127)
@@ -269,8 +261,6 @@ int wc_MakeDsaKey(WC_RNG *rng, DsaKey *dsa)
}
#endif
SAVE_VECTOR_REGISTERS(;);
#if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_NO_MALLOC)
if ((tmpQ = (mp_int *)XMALLOC(sizeof(*tmpQ), dsa->heap,
DYNAMIC_TYPE_TMP_BUFFER)) == NULL)
@@ -338,8 +328,6 @@ int wc_MakeDsaKey(WC_RNG *rng, DsaKey *dsa)
mp_clear(tmpQ);
#endif
RESTORE_VECTOR_REGISTERS();
return err;
}
@@ -454,6 +442,11 @@ int wc_MakeDsaParameters(WC_RNG *rng, int modulus_size, DsaKey *dsa)
break;
loop_check_prime++;
}
err = WC_CHECK_FOR_INTR_SIGNALS();
if (err != 0)
break;
WC_RELAX_LONG_LOOP();
}
}
@@ -794,8 +787,6 @@ int wc_DsaSign_ex(const byte* digest, word32 digestSz, byte* out, DsaKey* key,
return BAD_LENGTH_E;
}
SAVE_VECTOR_REGISTERS(return _svr_ret;);
do {
#ifdef WOLFSSL_SMALL_STACK
k = (mp_int *)XMALLOC(sizeof *k, key->heap, DYNAMIC_TYPE_TMP_BUFFER);
@@ -1040,8 +1031,6 @@ int wc_DsaSign_ex(const byte* digest, word32 digestSz, byte* out, DsaKey* key,
}
} while (0);
RESTORE_VECTOR_REGISTERS();
#ifdef WOLFSSL_SMALL_STACK
if (k) {
if ((ret != WC_NO_ERR_TRACE(MP_INIT_E)) &&
+5 -118
View File
@@ -275,14 +275,6 @@ ECC Curve Sizes:
#include <wolfssl/wolfcrypt/hmac.h>
#endif
#if defined(WOLFSSL_USE_SAVE_VECTOR_REGISTERS) && !defined(WOLFSSL_SP_ASM)
/* force off unneeded vector register save/restore. */
#undef SAVE_VECTOR_REGISTERS
#define SAVE_VECTOR_REGISTERS(fail_clause) SAVE_NO_VECTOR_REGISTERS(fail_clause)
#undef RESTORE_VECTOR_REGISTERS
#define RESTORE_VECTOR_REGISTERS() RESTORE_NO_VECTOR_REGISTERS()
#endif
#if !defined(WOLFSSL_ATECC508A) && !defined(WOLFSSL_ATECC608A) && \
!defined(WOLFSSL_MICROCHIP_TA100) && \
!defined(WOLFSSL_CRYPTOCELL) && !defined(WOLFSSL_SILABS_SE_ACCEL) && \
@@ -5150,8 +5142,6 @@ int wc_ecc_shared_secret_ex(ecc_key* private_key, ecc_point* point,
return ECC_BAD_ARG_E;
}
SAVE_VECTOR_REGISTERS(return _svr_ret;);
switch (private_key->state) {
case ECC_STATE_NONE:
case ECC_STATE_SHARED_SEC_GEN:
@@ -5194,8 +5184,6 @@ int wc_ecc_shared_secret_ex(ecc_key* private_key, ecc_point* point,
err = BAD_STATE_E;
} /* switch */
RESTORE_VECTOR_REGISTERS();
/* if async pending then return and skip done cleanup below */
if (err == WC_NO_ERR_TRACE(WC_PENDING_E)) {
return err;
@@ -5280,8 +5268,6 @@ int wc_ecc_point_is_on_curve(ecc_point *p, int curve_idx)
return ECC_BAD_ARG_E;
}
SAVE_VECTOR_REGISTERS(return _svr_ret;);
ALLOC_CURVE_SPECS(3, err);
if (err == MP_OKAY) {
err = wc_ecc_curve_load(wc_ecc_get_curve_params(curve_idx), &curve,
@@ -5296,8 +5282,6 @@ int wc_ecc_point_is_on_curve(ecc_point *p, int curve_idx)
wc_ecc_curve_free(curve);
FREE_CURVE_SPECS();
RESTORE_VECTOR_REGISTERS();
return err;
}
@@ -5456,8 +5440,6 @@ static int ecc_make_pub_ex(ecc_key* key, ecc_curve_spec* curve,
return BAD_FUNC_ARG;
}
SAVE_VECTOR_REGISTERS(return _svr_ret;);
#ifdef HAVE_ECC_MAKE_PUB
/* if ecc_point passed in then use it as output for public key point */
if (pubOut != NULL) {
@@ -5603,8 +5585,6 @@ static int ecc_make_pub_ex(ecc_key* key, ecc_curve_spec* curve,
key->type = ECC_PRIVATEKEY;
}
RESTORE_VECTOR_REGISTERS();
return err;
}
@@ -6107,8 +6087,6 @@ int wc_ecc_make_key_ex2(WC_RNG* rng, int keysize, ecc_key* key, int curve_id,
{
int err;
SAVE_VECTOR_REGISTERS(return _svr_ret;);
err = _ecc_make_key_ex(rng, keysize, key, curve_id, flags);
#if (FIPS_VERSION_GE(5,0) || defined(WOLFSSL_VALIDATE_ECC_KEYGEN)) && \
@@ -6132,8 +6110,6 @@ int wc_ecc_make_key_ex2(WC_RNG* rng, int keysize, ecc_key* key, int curve_id,
}
#endif
RESTORE_VECTOR_REGISTERS();
return err;
}
@@ -7195,6 +7171,11 @@ static int ecc_sign_hash_sw(ecc_key* key, ecc_key* pubkey, WC_RNG* rng,
mp_clear(pubkey->pubkey.z);
#endif
mp_forcezero(pubkey->k);
err = WC_CHECK_FOR_INTR_SIGNALS();
if (err != 0)
break;
WC_RELAX_LONG_LOOP();
}
mp_forcezero(b);
FREE_MP_INT_SIZE(b, key->heap, DYNAMIC_TYPE_ECC);
@@ -7244,10 +7225,8 @@ static int ecc_sign_hash_sp(const byte* in, word32 inlen, WC_RNG* rng,
#if !defined(WC_ECC_NONBLOCK) || (defined(WC_ECC_NONBLOCK) && !defined(WC_ECC_NONBLOCK_ONLY))
{
int ret;
SAVE_VECTOR_REGISTERS(return _svr_ret;);
ret = sp_ecc_sign_256(in, inlen, rng, ecc_get_k(key), r, s,
sign_k, key->heap);
RESTORE_VECTOR_REGISTERS();
return ret;
}
#endif
@@ -7256,10 +7235,8 @@ static int ecc_sign_hash_sp(const byte* in, word32 inlen, WC_RNG* rng,
#if defined(WOLFSSL_SM2) && defined(WOLFSSL_SP_SM2)
if (ecc_sets[key->idx].id == ECC_SM2P256V1) {
int ret;
SAVE_VECTOR_REGISTERS(return _svr_ret;);
ret = sp_ecc_sign_sm2_256(in, inlen, rng, ecc_get_k(key), r, s,
sign_k, key->heap);
RESTORE_VECTOR_REGISTERS();
return ret;
}
#endif
@@ -7284,10 +7261,8 @@ static int ecc_sign_hash_sp(const byte* in, word32 inlen, WC_RNG* rng,
#if !defined(WC_ECC_NONBLOCK) || (defined(WC_ECC_NONBLOCK) && !defined(WC_ECC_NONBLOCK_ONLY))
{
int ret;
SAVE_VECTOR_REGISTERS(return _svr_ret;);
ret = sp_ecc_sign_384(in, inlen, rng, ecc_get_k(key), r, s,
sign_k, key->heap);
RESTORE_VECTOR_REGISTERS();
return ret;
}
#endif
@@ -7314,10 +7289,8 @@ static int ecc_sign_hash_sp(const byte* in, word32 inlen, WC_RNG* rng,
#if !defined(WC_ECC_NONBLOCK) || (defined(WC_ECC_NONBLOCK) && !defined(WC_ECC_NONBLOCK_ONLY))
{
int ret;
SAVE_VECTOR_REGISTERS(return _svr_ret;);
ret = sp_ecc_sign_521(in, inlen, rng, ecc_get_k(key), r, s,
sign_k, key->heap);
RESTORE_VECTOR_REGISTERS();
return ret;
}
#endif
@@ -8938,10 +8911,8 @@ static int ecc_verify_hash_sp(mp_int *r, mp_int *s, const byte* hash,
#if !defined(WC_ECC_NONBLOCK) || (defined(WC_ECC_NONBLOCK) && !defined(WC_ECC_NONBLOCK_ONLY))
{
int ret;
SAVE_VECTOR_REGISTERS(return _svr_ret;);
ret = sp_ecc_verify_256(hash, hashlen, key->pubkey.x,
key->pubkey.y, key->pubkey.z, r, s, res, key->heap);
RESTORE_VECTOR_REGISTERS();
return ret;
}
#endif
@@ -8982,10 +8953,8 @@ static int ecc_verify_hash_sp(mp_int *r, mp_int *s, const byte* hash,
#if !defined(WC_ECC_NONBLOCK) || (defined(WC_ECC_NONBLOCK) && !defined(WC_ECC_NONBLOCK_ONLY))
{
int ret;
SAVE_VECTOR_REGISTERS(return _svr_ret;);
ret = sp_ecc_verify_384(hash, hashlen, key->pubkey.x,
key->pubkey.y, key->pubkey.z, r, s, res, key->heap);
RESTORE_VECTOR_REGISTERS();
return ret;
}
#endif
@@ -9011,10 +8980,8 @@ static int ecc_verify_hash_sp(mp_int *r, mp_int *s, const byte* hash,
#if !defined(WC_ECC_NONBLOCK) || (defined(WC_ECC_NONBLOCK) && !defined(WC_ECC_NONBLOCK_ONLY))
{
int ret;
SAVE_VECTOR_REGISTERS(return _svr_ret;);
ret = sp_ecc_verify_521(hash, hashlen, key->pubkey.x,
key->pubkey.y, key->pubkey.z, r, s, res, key->heap);
RESTORE_VECTOR_REGISTERS();
return ret;
}
#endif
@@ -9652,8 +9619,6 @@ int wc_ecc_import_point_der_ex(const byte* in, word32 inLen,
if (err != MP_OKAY)
return MEMORY_E;
SAVE_VECTOR_REGISTERS(return _svr_ret;);
/* check for point type (4, 2, or 3) */
pointType = in[0];
if (pointType != ECC_POINT_UNCOMP && pointType != ECC_POINT_COMP_EVEN &&
@@ -9845,8 +9810,6 @@ int wc_ecc_import_point_der_ex(const byte* in, word32 inLen,
mp_clear(point->z);
}
RESTORE_VECTOR_REGISTERS();
return err;
}
@@ -10197,8 +10160,6 @@ static int _ecc_is_point(ecc_point* ecp, mp_int* a, mp_int* b, mp_int* prime)
return err;
}
SAVE_VECTOR_REGISTERS(err = _svr_ret;);
/* compute y^2 */
if (err == MP_OKAY)
err = mp_sqr(ecp->y, t1);
@@ -10267,8 +10228,6 @@ static int _ecc_is_point(ecc_point* ecp, mp_int* a, mp_int* b, mp_int* prime)
mp_clear(t1);
mp_clear(t2);
RESTORE_VECTOR_REGISTERS();
WC_FREE_VAR_EX(t2, NULL, DYNAMIC_TYPE_ECC);
WC_FREE_VAR_EX(t1, NULL, DYNAMIC_TYPE_ECC);
@@ -10718,8 +10677,6 @@ static int _ecc_validate_public_key(ecc_key* key, int partial, int priv)
DECLARE_CURVE_SPECS(4);
#endif
ASSERT_SAVED_VECTOR_REGISTERS();
if (key == NULL)
return BAD_FUNC_ARG;
@@ -10871,9 +10828,7 @@ WOLFSSL_ABI
int wc_ecc_check_key(ecc_key* key)
{
int ret;
SAVE_VECTOR_REGISTERS(return _svr_ret;);
ret = _ecc_validate_public_key(key, 0, 1);
RESTORE_VECTOR_REGISTERS();
return ret;
}
@@ -10938,8 +10893,6 @@ static int _ecc_import_x963_ex2(const byte* in, word32 inLen, ecc_key* key,
mp_forcezero(key->kb);
#endif
SAVE_VECTOR_REGISTERS(return _svr_ret;);
/* check for point type (4, 2, or 3) */
pointType = in[0];
if (pointType != ECC_POINT_UNCOMP && pointType != ECC_POINT_COMP_EVEN &&
@@ -11271,8 +11224,6 @@ static int _ecc_import_x963_ex2(const byte* in, word32 inLen, ecc_key* key,
mp_forcezero(key->k);
}
RESTORE_VECTOR_REGISTERS();
return err;
}
@@ -11691,10 +11642,6 @@ static int _ecc_import_private_key_ex(const byte* priv, word32 privSz,
}
#else
#ifdef WOLFSSL_VALIDATE_ECC_IMPORT
SAVE_VECTOR_REGISTERS(return _svr_ret;);
#endif
ret = mp_read_unsigned_bin(key->k, priv, privSz);
#ifdef HAVE_WOLF_BIGINT
if (ret == 0 && wc_bigint_from_unsigned_bin(&key->k->raw, priv,
@@ -11745,10 +11692,6 @@ static int _ecc_import_private_key_ex(const byte* priv, word32 privSz,
#endif
#ifdef WOLFSSL_VALIDATE_ECC_IMPORT
RESTORE_VECTOR_REGISTERS();
#endif
#ifdef WOLFSSL_MAXQ10XX_CRYPTO
if ((ret == 0) && (key->devId != INVALID_DEVID)) {
ret = wc_MAXQ10XX_EccSetKey(key, key->dp->size);
@@ -12137,10 +12080,6 @@ static int _ecc_import_raw_private(ecc_key* key, const char* qx,
}
#endif
#ifdef WOLFSSL_VALIDATE_ECC_IMPORT
SAVE_VECTOR_REGISTERS(return _svr_ret;);
#endif
/* import private key */
if (err == MP_OKAY) {
if (d != NULL) {
@@ -12234,10 +12173,6 @@ static int _ecc_import_raw_private(ecc_key* key, const char* qx,
}
#endif
#ifdef WOLFSSL_VALIDATE_ECC_IMPORT
RESTORE_VECTOR_REGISTERS();
#endif
#ifdef WOLFSSL_MAXQ10XX_CRYPTO
if (err == MP_OKAY) {
err = wc_MAXQ10XX_EccSetKey(key, key->dp->size);
@@ -13858,8 +13793,6 @@ int ecc_mul2add(ecc_point* A, mp_int* kA,
}
#endif /* HAVE_THREAD_LS */
SAVE_VECTOR_REGISTERS(err = _svr_ret;);
/* find point */
idx1 = find_base(A);
@@ -13942,8 +13875,6 @@ int ecc_mul2add(ecc_point* A, mp_int* kA,
}
}
RESTORE_VECTOR_REGISTERS();
#ifndef HAVE_THREAD_LS
wc_UnLockMutex(&ecc_fp_lock);
#endif /* HAVE_THREAD_LS */
@@ -14011,8 +13942,6 @@ int wc_ecc_mulmod_ex(const mp_int* k, ecc_point *G, ecc_point *R, mp_int* a,
got_ecc_fp_lock = 1;
#endif /* HAVE_THREAD_LS */
SAVE_VECTOR_REGISTERS(err = _svr_ret; goto out;);
/* find point */
idx = find_base(G);
@@ -14061,8 +13990,6 @@ int wc_ecc_mulmod_ex(const mp_int* k, ecc_point *G, ecc_point *R, mp_int* a,
}
}
RESTORE_VECTOR_REGISTERS();
out:
#ifndef HAVE_THREAD_LS
@@ -14088,36 +14015,28 @@ int wc_ecc_mulmod_ex(const mp_int* k, ecc_point *G, ecc_point *R, mp_int* a,
#if defined(WOLFSSL_SM2) && defined(WOLFSSL_SP_SM2)
if ((mp_count_bits(modulus) == 256) && (!mp_is_bit_set(modulus, 224))) {
int ret;
SAVE_VECTOR_REGISTERS(return _svr_ret);
ret = sp_ecc_mulmod_sm2_256(k, G, R, map, heap);
RESTORE_VECTOR_REGISTERS();
return ret;
}
#endif
#ifndef WOLFSSL_SP_NO_256
if (mp_count_bits(modulus) == 256) {
int ret;
SAVE_VECTOR_REGISTERS(return _svr_ret;);
ret = sp_ecc_mulmod_256(k, G, R, map, heap);
RESTORE_VECTOR_REGISTERS();
return ret;
}
#endif
#ifdef WOLFSSL_SP_384
if (mp_count_bits(modulus) == 384) {
int ret;
SAVE_VECTOR_REGISTERS(return _svr_ret;);
ret = sp_ecc_mulmod_384(k, G, R, map, heap);
RESTORE_VECTOR_REGISTERS();
return ret;
}
#endif
#ifdef WOLFSSL_SP_521
if (mp_count_bits(modulus) == 521) {
int ret;
SAVE_VECTOR_REGISTERS(return _svr_ret;);
ret = sp_ecc_mulmod_521(k, G, R, map, heap);
RESTORE_VECTOR_REGISTERS();
return ret;
}
#endif
@@ -14182,8 +14101,6 @@ int wc_ecc_mulmod_ex2(const mp_int* k, ecc_point *G, ecc_point *R, mp_int* a,
got_ecc_fp_lock = 1;
#endif /* HAVE_THREAD_LS */
SAVE_VECTOR_REGISTERS(err = _svr_ret; goto out;);
/* find point */
idx = find_base(G);
@@ -14232,8 +14149,6 @@ int wc_ecc_mulmod_ex2(const mp_int* k, ecc_point *G, ecc_point *R, mp_int* a,
}
}
RESTORE_VECTOR_REGISTERS();
out:
#ifndef HAVE_THREAD_LS
@@ -14262,36 +14177,28 @@ int wc_ecc_mulmod_ex2(const mp_int* k, ecc_point *G, ecc_point *R, mp_int* a,
#if defined(WOLFSSL_SM2) && defined(WOLFSSL_SP_SM2)
if ((mp_count_bits(modulus) == 256) && (!mp_is_bit_set(modulus, 224))) {
int ret;
SAVE_VECTOR_REGISTERS(return _svr_ret;);
ret = sp_ecc_mulmod_sm2_256(k, G, R, map, heap);
RESTORE_VECTOR_REGISTERS();
return ret;
}
#endif
#ifndef WOLFSSL_SP_NO_256
if (mp_count_bits(modulus) == 256) {
int ret;
SAVE_VECTOR_REGISTERS(return _svr_ret;);
ret = sp_ecc_mulmod_256(k, G, R, map, heap);
RESTORE_VECTOR_REGISTERS();
return ret;
}
#endif
#ifdef WOLFSSL_SP_384
if (mp_count_bits(modulus) == 384) {
int ret;
SAVE_VECTOR_REGISTERS(return _svr_ret;);
ret = sp_ecc_mulmod_384(k, G, R, map, heap);
RESTORE_VECTOR_REGISTERS();
return ret;
}
#endif
#ifdef WOLFSSL_SP_521
if (mp_count_bits(modulus) == 521) {
int ret;
SAVE_VECTOR_REGISTERS(return _svr_ret;);
ret = sp_ecc_mulmod_521(k, G, R, map, heap);
RESTORE_VECTOR_REGISTERS();
return ret;
}
#endif
@@ -14887,8 +14794,6 @@ int wc_ecc_encrypt_ex(ecc_key* privKey, ecc_key* pubKey, const byte* msg,
}
#endif
SAVE_VECTOR_REGISTERS(ret = _svr_ret;);
#ifdef WOLFSSL_ECIES_ISO18033
XMEMCPY(sharedSecret, out - pubKeySz, pubKeySz);
sharedSz -= pubKeySz;
@@ -15105,8 +15010,6 @@ int wc_ecc_encrypt_ex(ecc_key* privKey, ecc_key* pubKey, const byte* msg,
#endif
}
RESTORE_VECTOR_REGISTERS();
ForceZero(sharedSecret, sharedSz);
ForceZero(keys, (word32)keysLen);
WC_FREE_VAR_EX(sharedSecret, ctx->heap, DYNAMIC_TYPE_ECC_BUFFER);
@@ -15266,8 +15169,6 @@ int wc_ecc_decrypt(ecc_key* privKey, ecc_key* pubKey, const byte* msg,
}
#endif
SAVE_VECTOR_REGISTERS(ret = _svr_ret;);
#ifndef WOLFSSL_ECIES_OLD
if (pubKey == NULL) {
WC_ALLOC_VAR_EX(peerKey, ecc_key, 1, ctx->heap,
@@ -15501,8 +15402,6 @@ int wc_ecc_decrypt(ecc_key* privKey, ecc_key* pubKey, const byte* msg,
if (ret == 0)
*outSz = msgSz - digestSz;
RESTORE_VECTOR_REGISTERS();
#ifndef WOLFSSL_ECIES_OLD
if (pubKey == peerKey)
wc_ecc_free(peerKey);
@@ -15576,8 +15475,6 @@ static int mp_jacobi(mp_int* a, mp_int* n, int* c)
return res;
}
SAVE_VECTOR_REGISTERS(return _svr_ret;);
if ((res = mp_mod(a, n, a1)) != MP_OKAY) {
goto done;
}
@@ -15635,8 +15532,6 @@ static int mp_jacobi(mp_int* a, mp_int* n, int* c)
done:
RESTORE_VECTOR_REGISTERS();
/* cleanup */
mp_clear(n1);
mp_clear(a1);
@@ -15674,8 +15569,6 @@ static int mp_sqrtmod_prime(mp_int* n, mp_int* prime, mp_int* ret)
return MP_VAL;
}
SAVE_VECTOR_REGISTERS(return _svr_ret;);
res = mp_init(&e);
if (res == MP_OKAY)
res = mp_mod_d(prime, 8, &i);
@@ -15699,8 +15592,6 @@ static int mp_sqrtmod_prime(mp_int* n, mp_int* prime, mp_int* ret)
mp_clear(&e);
RESTORE_VECTOR_REGISTERS();
return res;
#else
int res, legendre, done = 0;
@@ -15720,8 +15611,6 @@ static int mp_sqrtmod_prime(mp_int* n, mp_int* prime, mp_int* ret)
mp_int t1[1], C[1], Q[1], S[1], Z[1], M[1], T[1], R[1], N[1], two[1];
#endif
SAVE_VECTOR_REGISTERS(res = _svr_ret; goto out;);
if ((mp_init_multi(t1, C, Q, S, Z, M) != MP_OKAY) ||
(mp_init_multi(T, R, N, two, NULL, NULL) != MP_OKAY)) {
res = MP_INIT_E;
@@ -15933,8 +15822,6 @@ static int mp_sqrtmod_prime(mp_int* n, mp_int* prime, mp_int* ret)
out:
RESTORE_VECTOR_REGISTERS();
#ifdef WOLFSSL_SMALL_STACK
if (t1) {
if (res != WC_NO_ERR_TRACE(MP_INIT_E))
+10 -55
View File
@@ -60,14 +60,6 @@ RSA keys can be used to encrypt, decrypt, sign and verify data.
#include <wolfssl/wolfcrypt/port/nxp/casper_port.h>
#endif
#if defined(WOLFSSL_USE_SAVE_VECTOR_REGISTERS) && !defined(WOLFSSL_SP_ASM)
/* force off unneeded vector register save/restore. */
#undef SAVE_VECTOR_REGISTERS
#define SAVE_VECTOR_REGISTERS(fail_clause) SAVE_NO_VECTOR_REGISTERS(fail_clause)
#undef RESTORE_VECTOR_REGISTERS
#define RESTORE_VECTOR_REGISTERS() RESTORE_NO_VECTOR_REGISTERS()
#endif
/*
* RSA Build Options:
*
@@ -868,8 +860,6 @@ int wc_CheckRsaKey(RsaKey* key)
}
}
SAVE_VECTOR_REGISTERS(ret = _svr_ret;);
if (ret == 0) {
if (INIT_MP_INT_SIZE(tmp, mp_bitsused(&key->n)) != MP_OKAY)
ret = MP_INIT_E;
@@ -982,8 +972,6 @@ int wc_CheckRsaKey(RsaKey* key)
mp_forcezero(tmp);
RESTORE_VECTOR_REGISTERS();
if ((rng != NULL) && (rng != key->rng)) {
wc_FreeRng(rng);
#ifdef WOLFSSL_SMALL_STACK
@@ -3571,7 +3559,6 @@ static int wc_RsaFunction_ex(const byte* in, word32 inLen, byte* out,
#ifdef WOLF_CRYPTO_CB_ONLY_RSA
return NO_VALID_DEVID;
#else /* !WOLF_CRYPTO_CB_ONLY_RSA */
SAVE_VECTOR_REGISTERS(return _svr_ret;);
#if !defined(WOLFSSL_RSA_VERIFY_ONLY) && !defined(TEST_UNPAD_CONSTANT_TIME) && \
!defined(NO_RSA_BOUNDS_CHECK)
@@ -3580,7 +3567,6 @@ static int wc_RsaFunction_ex(const byte* in, word32 inLen, byte* out,
ret = RsaFunctionCheckIn(in, inLen, key, checkSmallCt);
if (ret != 0) {
RESTORE_VECTOR_REGISTERS();
return ret;
}
}
@@ -3592,7 +3578,6 @@ static int wc_RsaFunction_ex(const byte* in, word32 inLen, byte* out,
ret = RsaFunctionCheckIn(in, inLen, key, checkSmallCt);
if (ret != 0) {
RESTORE_VECTOR_REGISTERS();
return ret;
}
}
@@ -3623,8 +3608,6 @@ static int wc_RsaFunction_ex(const byte* in, word32 inLen, byte* out,
ret = wc_RsaFunctionSync(in, inLen, out, outLen, type, key, rng);
}
RESTORE_VECTOR_REGISTERS();
/* handle error */
if (ret < 0 && ret != WC_NO_ERR_TRACE(WC_PENDING_E)
#ifdef WC_RSA_NONBLOCK
@@ -4172,11 +4155,9 @@ int wc_RsaPublicEncrypt(const byte* in, word32 inLen, byte* out, word32 outLen,
RsaKey* key, WC_RNG* rng)
{
int ret;
SAVE_VECTOR_REGISTERS(return _svr_ret;);
ret = RsaPublicEncryptEx(in, inLen, out, outLen, key,
RSA_PUBLIC_ENCRYPT, RSA_BLOCK_TYPE_2, WC_RSA_PKCSV15_PAD,
WC_HASH_TYPE_NONE, WC_MGF1NONE, NULL, 0, 0, rng);
RESTORE_VECTOR_REGISTERS();
return ret;
}
@@ -4188,10 +4169,8 @@ int wc_RsaPublicEncrypt_ex(const byte* in, word32 inLen, byte* out,
word32 labelSz)
{
int ret;
SAVE_VECTOR_REGISTERS(return _svr_ret;);
ret = RsaPublicEncryptEx(in, inLen, out, outLen, key, RSA_PUBLIC_ENCRYPT,
RSA_BLOCK_TYPE_2, type, hash, mgf, label, labelSz, 0, rng);
RESTORE_VECTOR_REGISTERS();
return ret;
}
#endif /* WC_NO_RSA_OAEP */
@@ -4211,11 +4190,9 @@ int wc_RsaPrivateDecryptInline(byte* in, word32 inLen, byte** out, RsaKey* key)
#else
rng = NULL;
#endif
SAVE_VECTOR_REGISTERS(return _svr_ret;);
ret = RsaPrivateDecryptEx(in, inLen, in, inLen, out, key,
RSA_PRIVATE_DECRYPT, RSA_BLOCK_TYPE_2, WC_RSA_PKCSV15_PAD,
WC_HASH_TYPE_NONE, WC_MGF1NONE, NULL, 0, 0, rng);
RESTORE_VECTOR_REGISTERS();
return ret;
}
@@ -4235,11 +4212,9 @@ int wc_RsaPrivateDecryptInline_ex(byte* in, word32 inLen, byte** out,
#else
rng = NULL;
#endif
SAVE_VECTOR_REGISTERS(return _svr_ret;);
ret = RsaPrivateDecryptEx(in, inLen, in, inLen, out, key,
RSA_PRIVATE_DECRYPT, RSA_BLOCK_TYPE_2, type, hash,
mgf, label, labelSz, 0, rng);
RESTORE_VECTOR_REGISTERS();
return ret;
}
#endif /* WC_NO_RSA_OAEP */
@@ -4258,11 +4233,9 @@ int wc_RsaPrivateDecrypt(const byte* in, word32 inLen, byte* out,
#else
rng = NULL;
#endif
SAVE_VECTOR_REGISTERS(return _svr_ret;);
ret = RsaPrivateDecryptEx(in, inLen, out, outLen, NULL, key,
RSA_PRIVATE_DECRYPT, RSA_BLOCK_TYPE_2, WC_RSA_PKCSV15_PAD,
WC_HASH_TYPE_NONE, WC_MGF1NONE, NULL, 0, 0, rng);
RESTORE_VECTOR_REGISTERS();
return ret;
}
@@ -4282,11 +4255,9 @@ int wc_RsaPrivateDecrypt_ex(const byte* in, word32 inLen, byte* out,
#else
rng = NULL;
#endif
SAVE_VECTOR_REGISTERS(return _svr_ret;);
ret = RsaPrivateDecryptEx(in, inLen, out, outLen, NULL, key,
RSA_PRIVATE_DECRYPT, RSA_BLOCK_TYPE_2, type, hash, mgf, label,
labelSz, 0, rng);
RESTORE_VECTOR_REGISTERS();
return ret;
}
#endif /* WC_NO_RSA_OAEP || WC_RSA_NO_PADDING */
@@ -4305,11 +4276,9 @@ int wc_RsaSSL_VerifyInline(byte* in, word32 inLen, byte** out, RsaKey* key)
#else
rng = NULL;
#endif
SAVE_VECTOR_REGISTERS(return _svr_ret;);
ret = RsaPrivateDecryptEx(in, inLen, in, inLen, out, key,
RSA_PUBLIC_DECRYPT, RSA_BLOCK_TYPE_1, WC_RSA_PKCSV15_PAD,
WC_HASH_TYPE_NONE, WC_MGF1NONE, NULL, 0, 0, rng);
RESTORE_VECTOR_REGISTERS();
return ret;
}
#endif
@@ -4325,10 +4294,8 @@ int wc_RsaSSL_Verify_ex(const byte* in, word32 inLen, byte* out, word32 outLen,
RsaKey* key, int pad_type)
{
int ret;
SAVE_VECTOR_REGISTERS(return _svr_ret;);
ret = wc_RsaSSL_Verify_ex2(in, inLen, out, outLen, key, pad_type,
WC_HASH_TYPE_NONE);
RESTORE_VECTOR_REGISTERS();
return ret;
}
@@ -4348,7 +4315,6 @@ int wc_RsaSSL_Verify_ex2(const byte* in, word32 inLen, byte* out, word32 outLen
rng = NULL;
#endif
SAVE_VECTOR_REGISTERS(return _svr_ret;);
#ifndef WOLFSSL_PSS_SALT_LEN_DISCOVER
ret = RsaPrivateDecryptEx(in, inLen, out, outLen, NULL, key,
RSA_PUBLIC_DECRYPT, RSA_BLOCK_TYPE_1, pad_type,
@@ -4358,7 +4324,6 @@ int wc_RsaSSL_Verify_ex2(const byte* in, word32 inLen, byte* out, word32 outLen
RSA_PUBLIC_DECRYPT, RSA_BLOCK_TYPE_1, pad_type,
hash, wc_hash2mgf(hash), NULL, 0, RSA_PSS_SALT_LEN_DISCOVER, rng);
#endif
RESTORE_VECTOR_REGISTERS();
return ret;
}
#endif
@@ -4416,11 +4381,9 @@ int wc_RsaPSS_VerifyInline_ex(byte* in, word32 inLen, byte** out,
#else
rng = NULL;
#endif
SAVE_VECTOR_REGISTERS(return _svr_ret;);
ret = RsaPrivateDecryptEx(in, inLen, in, inLen, out, key,
RSA_PUBLIC_DECRYPT, RSA_BLOCK_TYPE_1, WC_RSA_PSS_PAD,
hash, mgf, NULL, 0, saltLen, rng);
RESTORE_VECTOR_REGISTERS();
return ret;
}
@@ -4474,11 +4437,9 @@ int wc_RsaPSS_Verify_ex(const byte* in, word32 inLen, byte* out, word32 outLen,
#else
rng = NULL;
#endif
SAVE_VECTOR_REGISTERS(return _svr_ret;);
ret = RsaPrivateDecryptEx(in, inLen, out, outLen, NULL, key,
RSA_PUBLIC_DECRYPT, RSA_BLOCK_TYPE_1, WC_RSA_PSS_PAD,
hash, mgf, NULL, 0, saltLen, rng);
RESTORE_VECTOR_REGISTERS();
return ret;
}
@@ -4754,11 +4715,9 @@ int wc_RsaSSL_Sign(const byte* in, word32 inLen, byte* out, word32 outLen,
RsaKey* key, WC_RNG* rng)
{
int ret;
SAVE_VECTOR_REGISTERS(return _svr_ret;);
ret = RsaPublicEncryptEx(in, inLen, out, outLen, key,
RSA_PRIVATE_ENCRYPT, RSA_BLOCK_TYPE_1, WC_RSA_PKCSV15_PAD,
WC_HASH_TYPE_NONE, WC_MGF1NONE, NULL, 0, 0, rng);
RESTORE_VECTOR_REGISTERS();
return ret;
}
@@ -4805,11 +4764,9 @@ int wc_RsaPSS_Sign_ex(const byte* in, word32 inLen, byte* out, word32 outLen,
WC_RNG* rng)
{
int ret;
SAVE_VECTOR_REGISTERS(return _svr_ret;);
ret = RsaPublicEncryptEx(in, inLen, out, outLen, key,
RSA_PRIVATE_ENCRYPT, RSA_BLOCK_TYPE_1, WC_RSA_PSS_PAD,
hash, mgf, NULL, 0, saltLen, rng);
RESTORE_VECTOR_REGISTERS();
return ret;
}
#endif
@@ -5350,12 +5307,8 @@ int wc_CheckProbablePrime_ex(const byte* pRaw, word32 pRawSz,
if (ret == MP_OKAY)
ret = mp_read_unsigned_bin(e, eRaw, eRawSz);
if (ret == MP_OKAY)
SAVE_VECTOR_REGISTERS(ret = _svr_ret;);
if (ret == 0) {
ret = _CheckProbablePrime(p, Q, e, nlen, isPrime, rng);
RESTORE_VECTOR_REGISTERS();
}
ret = (ret == MP_OKAY) ? 0 : PRIME_GEN_E;
@@ -5549,8 +5502,6 @@ int wc_MakeRsaKey(RsaKey* key, int size, long e, WC_RNG* rng)
}
#endif
SAVE_VECTOR_REGISTERS(err = _svr_ret;);
/* make p */
if (err == MP_OKAY) {
#ifdef WOLFSSL_CHECK_MEM_ZERO
@@ -5591,9 +5542,10 @@ int wc_MakeRsaKey(RsaKey* key, int size, long e, WC_RNG* rng)
if (err != MP_OKAY || isPrime || i >= failCount)
break;
/* linuxkm: release the kernel for a moment before iterating. */
RESTORE_VECTOR_REGISTERS();
SAVE_VECTOR_REGISTERS(err = _svr_ret; break;);
err = WC_CHECK_FOR_INTR_SIGNALS();
if (err != 0)
break;
WC_RELAX_LONG_LOOP();
};
}
@@ -5644,6 +5596,12 @@ int wc_MakeRsaKey(RsaKey* key, int size, long e, WC_RNG* rng)
/* Keep the old retry behavior in non-FIPS build. */
(void)i;
#endif
err = WC_CHECK_FOR_INTR_SIGNALS();
if (err != 0)
break;
WC_RELAX_LONG_LOOP();
} while (err == MP_OKAY && !isPrime && i < failCount);
}
@@ -5769,9 +5727,6 @@ int wc_MakeRsaKey(RsaKey* key, int size, long e, WC_RNG* rng)
}
#endif
if (err != WC_NO_ERR_TRACE(WC_ACCEL_INHIBIT_E))
RESTORE_VECTOR_REGISTERS();
/* Last value p - 1. */
mp_forcezero(tmp1);
/* Last value q - 1. */
+16 -29
View File
@@ -125,8 +125,6 @@ This library provides single precision (SP) integer math functions.
* WOLFSSL_NO_ASM: Disable all assembly implementations
* WOLFSSL_KEIL: Keil compiler in use, affects inline assembly
* syntax
* WOLFSSL_USE_SAVE_VECTOR_REGISTERS: Save/restore vector registers around
* SP ASM calls
* WOLFSSL_SP_INT_LARGE_COMBA: Enable large Comba multiplication and
* squaring
* WOLFSSL_SP_INT_SQR_VOLATILE: Declare squaring intermediate variables as
@@ -198,15 +196,6 @@ This library provides single precision (SP) integer math functions.
PRAGMA_GCC("GCC diagnostic ignored \"-Warray-bounds\"")
#endif
#if defined(WOLFSSL_USE_SAVE_VECTOR_REGISTERS) && !defined(WOLFSSL_SP_ASM)
/* force off unneeded vector register save/restore. */
#undef SAVE_VECTOR_REGISTERS
#define SAVE_VECTOR_REGISTERS(fail_clause) \
SAVE_NO_VECTOR_REGISTERS(fail_clause)
#undef RESTORE_VECTOR_REGISTERS
#define RESTORE_VECTOR_REGISTERS() RESTORE_NO_VECTOR_REGISTERS()
#endif
/* DECL_SP_INT: Declare one variable of type 'sp_int'. */
#if (defined(WOLFSSL_SMALL_STACK) || defined(SP_ALLOC)) && \
!defined(WOLFSSL_SP_NO_MALLOC)
@@ -5487,6 +5476,22 @@ static void _sp_copy_2_ct(const sp_int* a1, const sp_int* a2, sp_int* r1,
sp_int* r2, int y, unsigned int used)
{
unsigned int i;
#ifdef WC_NO_GLOBAL_OBJECT_POINTERS
static const wc_ptr_t wc_off_on_addr[2] =
{
#if defined(WC_64BIT_CPU)
W64LIT(0x0000000000000000),
W64LIT(0xffffffffffffffff)
#elif defined(WC_16BIT_CPU)
0x0000U,
0xffffU
#else
/* 32 bit */
0x00000000U,
0xffffffffU
#endif
};
#endif
/* Copy data - constant time. */
for (i = 0; i < used; i++) {
@@ -14329,11 +14334,9 @@ int sp_exptmod(const sp_int* b, const sp_int* e, const sp_int* m, sp_int* r)
if ((b == NULL) || (e == NULL) || (m == NULL) || (r == NULL)) {
err = MP_VAL;
}
SAVE_VECTOR_REGISTERS(err = _svr_ret;);
if (err == MP_OKAY) {
err = sp_exptmod_ex(b, e, (int)e->used, m, r);
}
RESTORE_VECTOR_REGISTERS();
return err;
}
#endif
@@ -19554,8 +19557,6 @@ int sp_prime_is_prime(const sp_int* a, int trials, int* result)
haveRes = 1;
}
SAVE_VECTOR_REGISTERS(err = _svr_ret;);
/* Check against known small primes when a has 1 digit. */
if ((err == MP_OKAY) && (!haveRes) && (a->used == 1) &&
(a->dp[0] <= sp_primes[SP_PRIME_SIZE - 1])) {
@@ -19572,8 +19573,6 @@ int sp_prime_is_prime(const sp_int* a, int trials, int* result)
err = _sp_prime_trials(a, trials, result);
}
RESTORE_VECTOR_REGISTERS();
return err;
}
@@ -19714,8 +19713,6 @@ int sp_prime_is_prime_ex(const sp_int* a, int trials, int* result, WC_RNG* rng)
haveRes = 1;
}
SAVE_VECTOR_REGISTERS(err = _svr_ret;);
/* Check against known small primes when a has 1 digit. */
if ((err == MP_OKAY) && (!haveRes) && (a->used == 1) &&
(a->dp[0] <= (sp_int_digit)sp_primes[SP_PRIME_SIZE - 1])) {
@@ -19740,8 +19737,6 @@ int sp_prime_is_prime_ex(const sp_int* a, int trials, int* result, WC_RNG* rng)
*result = ret;
}
RESTORE_VECTOR_REGISTERS();
return err;
}
#endif /* WOLFSSL_SP_PRIME_GEN */
@@ -19783,8 +19778,6 @@ static WC_INLINE int _sp_gcd(const sp_int* a, const sp_int* b, sp_int* r)
unsigned int used = (a->used >= b->used) ? a->used + 1U : b->used + 1U;
DECL_SP_INT_ARRAY(d, used, 3);
SAVE_VECTOR_REGISTERS(err = _svr_ret;);
ALLOC_SP_INT_ARRAY(d, used, 3, err, NULL);
if (err == MP_OKAY) {
u = d[0];
@@ -19849,8 +19842,6 @@ static WC_INLINE int _sp_gcd(const sp_int* a, const sp_int* b, sp_int* r)
FREE_SP_INT_ARRAY(d, NULL);
RESTORE_VECTOR_REGISTERS();
return err;
}
@@ -19955,8 +19946,6 @@ static int _sp_lcm(const sp_int* a, const sp_int* b, sp_int* r)
_sp_init_size(t[0], used);
_sp_init_size(t[1], used);
SAVE_VECTOR_REGISTERS(err = _svr_ret;);
if (err == MP_OKAY) {
/* 1. t0 = gcd(a, b) */
err = sp_gcd(a, b, t[0]);
@@ -19985,8 +19974,6 @@ static int _sp_lcm(const sp_int* a, const sp_int* b, sp_int* r)
}
}
}
RESTORE_VECTOR_REGISTERS();
}
FREE_SP_INT_ARRAY(t, NULL);
+416 -431
View File
File diff suppressed because it is too large Load Diff
+4 -1
View File
@@ -356,10 +356,13 @@ WOLFSSL_API void wc_ErrorString(int err, char* buff);
WOLFSSL_ABI WOLFSSL_API const char* wc_GetErrorString(int error);
#endif
#ifdef WOLFSSL_DEBUG_BACKTRACE_ERROR_CODES
WOLFSSL_API extern int wc_backtrace_render(void);
#endif
#if defined(WOLFSSL_DEBUG_TRACE_ERROR_CODES) && \
(defined(BUILDING_WOLFSSL) || \
defined(WOLFSSL_DEBUG_TRACE_ERROR_CODES_ALWAYS))
WOLFSSL_API extern int wc_backtrace_render(void);
#define WC_NO_ERR_TRACE(label) (CONST_NUM_ERR_ ## label)
#ifndef WOLFSSL_DEBUG_BACKTRACE_RENDER_CLAUSE
#ifdef WOLFSSL_DEBUG_BACKTRACE_ERROR_CODES
+4 -3
View File
@@ -579,12 +579,13 @@ WOLFSSL_API void wolfSSL_SetLoggingPrefix(const char* prefix);
#error "Failed: Cannot WOLFSSL_DEBUG_CERTS with WOLFSSL_DEBUG_ERRORS_ONLY"
#endif
#if defined(WOLFSSL_DEBUG_BACKTRACE_ERROR_CODES) && defined(XFILE)
WOLFSSL_API XFILE wc_backtrace_set_fp(XFILE new_fp);
#endif
#ifdef WOLFSSL_DEBUG_TRACE_ERROR_CODES
WOLFSSL_API int wc_debug_trace_error_codes_enabled(void);
WOLFSSL_API int wc_debug_trace_error_codes_set(int state);
#ifdef XFILE
WOLFSSL_API XFILE wc_backtrace_set_fp(XFILE new_fp);
#endif
#endif
#ifdef __cplusplus
+26 -16
View File
@@ -370,6 +370,8 @@ WOLFSSL_LOCAL int wc_debug_CipherLifecycleFree(void **CipherLifecycleTag,
#define DEBUG_VECTOR_REGISTERS_EXTRA_FAIL_CLAUSE abort();
#elif defined(DEBUG_VECTOR_REGISTERS_EXIT_ON_FAIL)
#define DEBUG_VECTOR_REGISTERS_EXTRA_FAIL_CLAUSE exit(1);
#elif defined(DEBUG_VECTOR_REGISTERS_BACKTRACE_ON_FAIL)
#define DEBUG_VECTOR_REGISTERS_EXTRA_FAIL_CLAUSE wc_backtrace_render();
#elif !defined(DEBUG_VECTOR_REGISTERS_EXTRA_FAIL_CLAUSE)
#define DEBUG_VECTOR_REGISTERS_EXTRA_FAIL_CLAUSE
#endif
@@ -381,8 +383,9 @@ WOLFSSL_LOCAL int wc_debug_CipherLifecycleFree(void **CipherLifecycleTag,
++wc_svr_count; \
if (wc_svr_count > 5) { \
fprintf(stderr, \
("%s @ L%d : incr : " \
"wc_svr_count %d (last op %s L%d)\n"), \
("%s() %s @ L %d : incr : " \
"wc_svr_count %d (last op %s L %d)\n"), \
__FUNCTION__, \
__FILE__, \
__LINE__, \
wc_svr_count, \
@@ -403,8 +406,9 @@ WOLFSSL_LOCAL int wc_debug_CipherLifecycleFree(void **CipherLifecycleTag,
#define WC_DEBUG_SET_VECTOR_REGISTERS_RETVAL(x) do { \
if (((x) != 0) && (wc_svr_count > 0)) { \
fprintf(stderr, \
("%s @ L%d : incr : " \
"wc_svr_count %d (last op %s L%d)\n"), \
("%s() %s @ L %d : incr : " \
"wc_svr_count %d (last op %s L %d)\n"), \
__FUNCTION__, \
__FILE__, \
__LINE__, \
wc_svr_count, \
@@ -422,8 +426,9 @@ WOLFSSL_LOCAL int wc_debug_CipherLifecycleFree(void **CipherLifecycleTag,
++wc_svr_count; \
if (wc_svr_count > 5) { \
fprintf(stderr, \
("%s @ L%d : incr : " \
"wc_svr_count %d (last op %s L%d)\n"), \
("%s() %s @ L %d : incr : " \
"wc_svr_count %d (last op %s L %d)\n"), \
__FUNCTION__, \
__FILE__, \
__LINE__, \
wc_svr_count, \
@@ -445,8 +450,9 @@ WOLFSSL_LOCAL int wc_debug_CipherLifecycleFree(void **CipherLifecycleTag,
if (wc_debug_vector_registers_retval != 0) { \
if (wc_svr_count > 0) { \
fprintf(stderr, \
("%s @ L%d : incr : " \
"wc_svr_count %d (last op %s L%d)\n"), \
("%s() %s @ L %d : incr : " \
"wc_svr_count %d (last op %s L %d)\n"), \
__FUNCTION__, \
__FILE__, \
__LINE__, \
wc_svr_count, \
@@ -459,8 +465,9 @@ WOLFSSL_LOCAL int wc_debug_CipherLifecycleFree(void **CipherLifecycleTag,
++wc_svr_count; \
if (wc_svr_count > 5) { \
fprintf(stderr, \
("%s @ L%d : incr : " \
"wc_svr_count %d (last op %s L%d)\n"), \
("%s() %s @ L %d : incr : " \
"wc_svr_count %d (last op %s L %d)\n"), \
__FUNCTION__, \
__FILE__, \
__LINE__, \
wc_svr_count, \
@@ -480,8 +487,9 @@ WOLFSSL_LOCAL int wc_debug_CipherLifecycleFree(void **CipherLifecycleTag,
#define ASSERT_SAVED_VECTOR_REGISTERS() do { \
if (wc_svr_count <= 0) { \
fprintf(stderr, \
("ASSERT_SAVED_VECTOR_REGISTERS : %s @ L%d : " \
"wc_svr_count %d (last op %s L%d)\n"), \
("ASSERT_SAVED_VECTOR_REGISTERS : %s() %s @ L %d : " \
"wc_svr_count %d (last op %s L %d)\n"), \
__FUNCTION__, \
__FILE__, \
__LINE__, \
wc_svr_count, \
@@ -493,8 +501,9 @@ WOLFSSL_LOCAL int wc_debug_CipherLifecycleFree(void **CipherLifecycleTag,
#define ASSERT_RESTORED_VECTOR_REGISTERS(fail_clause) do { \
if (wc_svr_count != 0) { \
fprintf(stderr, \
("ASSERT_RESTORED_VECTOR_REGISTERS : %s @ L%d" \
" : wc_svr_count %d (last op %s L%d)\n"), \
("ASSERT_RESTORED_VECTOR_REGISTERS : %s() %s @ L %d" \
" : wc_svr_count %d (last op %s L %d)\n"), \
__FUNCTION__, \
__FILE__, \
__LINE__, \
wc_svr_count, \
@@ -508,8 +517,9 @@ WOLFSSL_LOCAL int wc_debug_CipherLifecycleFree(void **CipherLifecycleTag,
--wc_svr_count; \
if ((wc_svr_count > 4) || (wc_svr_count < 0)) { \
fprintf(stderr, \
("%s @ L%d : decr : " \
"wc_svr_count %d (last op %s L%d)\n"), \
("%s() %s @ L %d : decr : " \
"wc_svr_count %d (last op %s L %d)\n"), \
__FUNCTION__, \
__FILE__, \
__LINE__, \
wc_svr_count, \