Implement all relevant mp functions in sp_int

pull/3362/head
Sean Parkinson 2020-01-06 15:23:45 +10:00
parent aa9ed17afa
commit 91d23d3f5a
23 changed files with 18363 additions and 3888 deletions

View File

@ -4693,16 +4693,17 @@ ENABLED_SP_EC_256=no
ENABLED_SP_EC_384=no
ENABLED_SP_NO_MALLOC=no
ENABLED_SP_NONBLOCK=no
ENABLED_SP_SMALL=no
for v in `echo $ENABLED_SP | tr "," " "`
do
case $v in
small)
ENABLED_SP_SMALL=yes
ENABLED_SP_RSA=yes
ENABLED_SP_DH=yes
ENABLED_SP_FF_2048=yes
ENABLED_SP_FF_3072=yes
ENABLED_SP_ECC=yes
ENABLED_SP_SMALL=yes
ENABLED_SP_EC_256=yes
if test "$host_cpu" = "x86_64"; then
ENABLED_SP_FF_4096=yes
@ -4727,8 +4728,8 @@ do
;;
smallec256 | smallp256 | small256)
ENABLED_SP_ECC=yes
ENABLED_SP_SMALL=yes
ENABLED_SP_ECC=yes
ENABLED_SP_EC_256=yes
;;
ec256 | p256 | 256)
@ -4736,8 +4737,8 @@ do
ENABLED_SP_EC_256=yes
;;
smallec384 | smallp384 | small384)
ENABLED_SP_ECC=yes
ENABLED_SP_SMALL=yes
ENABLED_SP_ECC=yes
ENABLED_SP_EC_384=yes
;;
ec384 | p384 | 384)
@ -4875,6 +4876,10 @@ if test "$ENABLED_SP_NONBLOCK" = "yes"; then
AM_CFLAGS="$AM_CFLAGS -DWOLFSSL_SP_NONBLOCK"
AM_CCASFLAGS="$AM_CCASFLAGS -DWOLFSSL_SP_NONBLOCK"
fi
if test "$ENABLED_SMALL" = "yes"; then
AM_CFLAGS="$AM_CFLAGS -DWOLFSSL_SP_SMALL"
AM_CCASFLAGS="$AM_CCASFLAGS -DWOLFSSL_SP_SMALL"
fi
AC_ARG_ENABLE([sp-asm],
@ -4960,11 +4965,97 @@ if test "$ENABLED_SP_MATH" = "yes"; then
ENABLED_FASTMATH="no"
ENABLED_SLOWMATH="no"
fi
AC_ARG_ENABLE([sp-math-all],
[AS_HELP_STRING([--enable-sp-math],[Enable Single Precision math implementation only (default: disabled)])],
[ ENABLED_SP_MATH_ALL=$enableval ],
[ ENABLED_SP_MATH_ALL=no ],
)
for v in `echo $ENABLED_SP_MATH_ALL | tr "," " "`
do
case $v in
yes | no)
;;
small)
ENABLED_SP_MATH_ALL="yes"
ENABLED_SP_SMALL="yes"
AM_CFLAGS="$AM_CFLAGS -DWOLFSSL_SP_SMALL"
AM_CCASFLAGS="$AM_CCASFLAGS -DWOLFSSL_SP_SMALL"
;;
huge)
ENABLED_SP_MATH_ALL="yes"
ENABLED_FASTHUGEMATH="yes"
AM_CFLAGS="$AM_CFLAGS $OPTIMIZE_HUGE_CFLAGS"
AM_CFLAGS="$AM_CFLAGS -DWOLFSSL_SP_INT_LARGE_COMBA"
;;
256 | 384 | 521 | 1024 | 2048 | 3072 | 4096)
AM_CFLAGS="$AM_CFLAGS -DSP_INT_BITS=$v"
ENABLED_SP_MATH_ALL="yes"
;;
*)
AC_MSG_ERROR([Support SP int bit sizes: 256, 384, 521, 1024, 2048, 3072, 4096. $ENABLED_SP_MATH_ALL not supported])
;;
esac
done
if test "$ENABLED_SP_MATH_ALL" = "yes"; then
ENABLED_FASTMATH="no"
ENABLED_SLOWMATH="no"
ENABLED_SP="yes"
#ENABLED_SP_MATH="yes"
AM_CFLAGS="$AM_CFLAGS -DWOLFSSL_SP_MATH_ALL"
case $host_cpu in
*x86_64*)
AM_CFLAGS="$AM_CFLAGS -DWOLFSSL_SP_X86_64"
;;
*x86*)
AM_CFLAGS="$AM_CFLAGS -DWOLFSSL_SP_X86"
;;
*aarch64*)
AM_CFLAGS="$AM_CFLAGS -DWOLFSSL_SP_ARM64"
;;
*arm*)
if test $host_alias = "thumb"; then
AM_CFLAGS="$AM_CFLAGS -DWOLFSSL_SP_ARM_THUMB -mthumb -march=armv6"
else
if test $host_alias = "cortex"; then
AM_CFLAGS="$AM_CFLAGS -DWOLFSSL_SP_ARM_CORTEX_M -mcpu=cortex-m4"
else
AM_CFLAGS="$AM_CFLAGS -DWOLFSSL_SP_ARM32"
fi
fi
;;
*ppc64* | *powerpc64*)
AM_CFLAGS="$AM_CFLAGS -DWOLFSSL_SP_PPC64"
;;
*ppc* | *powerpc*)
AM_CFLAGS="$AM_CFLAGS -DWOLFSSL_SP_PPC"
;;
*mips64*)
AM_CFLAGS="$AM_CFLAGS -DWOLFSSL_SP_MIPS64"
;;
*mips*)
AM_CFLAGS="$AM_CFLAGS -DWOLFSSL_SP_MIPS"
;;
*riscv32*)
AM_CFLAGS="$AM_CFLAGS -DWOLFSSL_SP_RISCV32"
;;
*riscv64*)
AM_CFLAGS="$AM_CFLAGS -DWOLFSSL_SP_RISCV64"
;;
*s390x*)
AM_CFLAGS="$AM_CFLAGS -DWOLFSSL_SP_S390X"
;;
esac
fi
if test "$ENABLED_SP_MATH" = "yes"; then
AM_CFLAGS="$AM_CFLAGS -DWOLFSSL_SP_MATH"
fi
# Fast RSA using Intel IPP
ippdir="${srcdir}/IPP"
ipplib="lib" # if autoconf guesses 32bit system changes lib directory
@ -5487,9 +5578,6 @@ then
fi
AM_CFLAGS="$AM_CFLAGS -DWOLFSSL_HAVE_WOLFSCEP"
fi
#if test "$ENABLED_SP_MATH" = "yes" && test "$ENABLED_KEYGEN" = "yes"; then
# AC_MSG_ERROR([Cannot use single precision math and key generation])
#fi
if test "x$ENABLED_PKCS7" = "xyes"
then
@ -5597,7 +5685,17 @@ then
AM_CFLAGS="$AM_CFLAGS $OPTIMIZE_HUGE_CFLAGS"
fi
else
AM_CFLAGS="$AM_CFLAGS $OPTIMIZE_CFLAGS"
if test "$ENABLED_SP" = "yes" && test "$ENABLED_SP_SMALL" = "no"
then
AM_CFLAGS="$AM_CFLAGS $OPTIMIZE_FAST_CFLAGS"
if test "$ENABLED_FASTHUGEMATH" = "yes"
then
AM_CFLAGS="$AM_CFLAGS $OPTIMIZE_HUGE_CFLAGS"
AM_CFLAGS="$AM_CFLAGS -DWOLFSSL_SP_INT_LARGE_COMBA"
fi
else
AM_CFLAGS="$AM_CFLAGS $OPTIMIZE_CFLAGS"
fi
fi
])
fi
@ -5813,7 +5911,7 @@ AM_CONDITIONAL([BUILD_SP_ARM32],[test "x$ENABLED_SP_ARM32_ASM" = "xyes" || test
AM_CONDITIONAL([BUILD_SP_ARM_THUMB],[test "x$ENABLED_SP_ARM_THUMB_ASM" = "xyes" || test "x$ENABLED_USERSETTINGS" = "xyes"])
AM_CONDITIONAL([BUILD_SP_ARM_CORTEX],[test "x$ENABLED_SP_ARM_CORTEX_ASM" = "xyes" || test "x$ENABLED_USERSETTINGS" = "xyes"])
AM_CONDITIONAL([BUILD_SP_X86_64],[test "x$ENABLED_SP_X86_64_ASM" = "xyes" || test "x$ENABLED_USERSETTINGS" = "xyes"])
AM_CONDITIONAL([BUILD_SP_INT],[test "x$ENABLED_SP_MATH" = "xyes" || test "x$ENABLED_USERSETTINGS" = "xyes"])
AM_CONDITIONAL([BUILD_SP_INT],[test "x$ENABLED_SP_MATH" = "xyes" || test "x$ENABLED_SP_MATH_ALL" = "xyes" || test "x$ENABLED_USERSETTINGS" = "xyes"])
AM_CONDITIONAL([BUILD_FAST_RSA],[test "x$ENABLED_FAST_RSA" = "xyes"])
AM_CONDITIONAL([BUILD_MCAPI],[test "x$ENABLED_MCAPI" = "xyes"])
AM_CONDITIONAL([BUILD_ASYNCCRYPT],[test "x$ENABLED_ASYNCCRYPT" = "xyes"])
@ -6126,6 +6224,7 @@ echo " * Stack sizes in tests: $ENABLED_STACKSIZE"
echo " * User Crypto: $ENABLED_USER_CRYPTO"
echo " * Fast RSA: $ENABLED_FAST_RSA"
echo " * Single Precision: $ENABLED_SP"
echo " * SP math implementation: $ENABLED_SP_MATH_ALL"
echo " * Async Crypto: $ENABLED_ASYNCCRYPT"
echo " * PKCS#11: $ENABLED_PKCS11"
echo " * PKCS#12: $ENABLED_PKCS12"

View File

@ -1308,7 +1308,11 @@ static void Usage(void)
printf("%s", msg[++msgid]);
#endif
#elif defined(USE_FAST_MATH)
#if !defined(WOLFSSL_SP_MATH_ALL) && !defined(WOLFSSL_SP_MATH)
printf("%d\n", FP_MAX_BITS/2);
#else
printf("%d\n", SP_INT_MAX_BITS/2);
#endif
#else
/* normal math has unlimited max size */
printf("%s", msg[++msgid]);

View File

@ -46101,7 +46101,6 @@ int wolfSSL_BN_mod_mul(WOLFSSL_BIGNUM *r, const WOLFSSL_BIGNUM *a,
return SSL_FAILURE;
}
#ifdef OPENSSL_EXTRA
const WOLFSSL_BIGNUM* wolfSSL_BN_value_one(void)
{
WOLFSSL_MSG("wolfSSL_BN_value_one");
@ -46119,7 +46118,6 @@ const WOLFSSL_BIGNUM* wolfSSL_BN_value_one(void)
return bn_one;
}
#endif
/* return compliant with OpenSSL
* size of BIGNUM in bytes, 0 if error */

View File

@ -2853,6 +2853,9 @@ int DoTls13ServerHello(WOLFSSL* ssl, const byte* input, word32* inOutIdx,
if (ssl->toInfoOn) AddLateName("ServerHello", &ssl->timeoutInfo);
#endif
if (ssl == NULL || ssl->arrays == NULL)
return BAD_FUNC_ARG;
/* Protocol version length check. */
if (OPAQUE16_LEN > helloSz)
return BUFFER_ERROR;

View File

@ -14237,7 +14237,7 @@ static int test_wc_MakeRsaKey (void)
RsaKey genKey;
WC_RNG rng;
#ifndef WOLFSSL_SP_MATH
#if !defined(WOLFSSL_SP_MATH) || defined(WOLFSSL_SP_MATH_ALL)
int bits = 1024;
#else
int bits = 2048;
@ -14898,7 +14898,7 @@ static int test_wc_RsaKeyToDer (void)
RsaKey genKey;
WC_RNG rng;
byte* der;
#ifndef WOLFSSL_SP_MATH
#if !defined(WOLFSSL_SP_MATH) || defined(WOLFSSL_SP_MATH_ALL)
int bits = 1024;
word32 derSz = 611;
/* (2 x 128) + 2 (possible leading 00) + (5 x 64) + 5 (possible leading 00)
@ -15008,7 +15008,7 @@ static int test_wc_RsaKeyToPublicDer (void)
RsaKey key;
WC_RNG rng;
byte* der;
#ifndef WOLFSSL_SP_MATH
#if !defined(WOLFSSL_SP_MATH) || defined(WOLFSSL_SP_MATH_ALL)
int bits = 1024;
word32 derLen = 162;
#else
@ -15107,7 +15107,7 @@ static int test_wc_RsaPublicEncryptDecrypt (void)
const char* inStr = "Everyone gets Friday off.";
word32 plainLen = 25;
word32 inLen = (word32)XSTRLEN(inStr);
#ifndef WOLFSSL_SP_MATH
#if !defined(WOLFSSL_SP_MATH) || defined(WOLFSSL_SP_MATH_ALL)
int bits = 1024;
word32 cipherLen = 128;
#else
@ -15197,7 +15197,7 @@ static int test_wc_RsaPublicEncryptDecrypt_ex (void)
const word32 plainSz = 25;
byte* res = NULL;
int idx = 0;
#ifndef WOLFSSL_SP_MATH
#if !defined(WOLFSSL_SP_MATH) || defined(WOLFSSL_SP_MATH_ALL)
int bits = 1024;
const word32 cipherSz = 128;
#else
@ -15314,7 +15314,7 @@ static int test_wc_RsaSSL_SignVerify (void)
const word32 plainSz = 25;
word32 inLen = (word32)XSTRLEN(inStr);
word32 idx = 0;
#ifndef WOLFSSL_SP_MATH
#if !defined(WOLFSSL_SP_MATH) || defined(WOLFSSL_SP_MATH_ALL)
int bits = 1024;
const word32 outSz = 128;
#else
@ -15476,7 +15476,7 @@ static int test_wc_RsaEncryptSize (void)
}
printf(testingFmt, "wc_RsaEncryptSize()");
#ifndef WOLFSSL_SP_MATH
#if !defined(WOLFSSL_SP_MATH) || defined(WOLFSSL_SP_MATH_ALL)
if (ret == 0) {
ret = MAKE_RSA_KEY(&key, 1024, WC_RSA_EXPONENT, &rng);
if (ret == 0) {
@ -15546,7 +15546,7 @@ static int test_wc_RsaFlattenPublicKey (void)
byte n[256];
word32 eSz = sizeof(e);
word32 nSz = sizeof(n);
#ifndef WOLFSSL_SP_MATH
#if !defined(WOLFSSL_SP_MATH) || defined(WOLFSSL_SP_MATH_ALL)
int bits = 1024;
#else
int bits = 2048;
@ -27928,6 +27928,8 @@ static void test_wolfSSL_BN(void)
AssertIntEQ((int)(value[0] & 0x03), 3);
BN_free(val);
#if !defined(WOLFSSL_SP_MATH) && (!defined(WOLFSSL_SP_MATH_ALL) || \
defined(WOLFSSL_SP_INT_NEGATIVE))
AssertIntEQ(BN_set_word(a, 1), SSL_SUCCESS);
AssertIntEQ(BN_set_word(b, 5), SSL_SUCCESS);
AssertIntEQ(BN_is_word(a, (WOLFSSL_BN_ULONG)BN_get_word(a)), SSL_SUCCESS);
@ -27942,6 +27944,7 @@ static void test_wolfSSL_BN(void)
}
#endif
AssertIntEQ(BN_get_word(c), 4);
#endif
BN_free(a);
BN_free(b);

View File

@ -587,8 +587,8 @@ static const char* bench_result_words1[][4] = {
defined(HAVE_CURVE25519) || defined(HAVE_CURVE25519_SHARED_SECRET) || \
defined(HAVE_ED25519) || defined(HAVE_CURVE448) || \
defined(HAVE_CURVE448_SHARED_SECRET) || defined(HAVE_ED448)
#if defined(HAVE_ECC) || !defined(WOLFSSL_RSA_PUBLIC_ONLY) || \
defined(WOLFSSL_PUBLIC_MP) || !defined(NO_DH)
#if defined(HAVE_ECC) || defined(WOLFSSL_PUBLIC_MP) || !defined(NO_DH) || \
(!defined(NO_RSA) && !defined(WOLFSSL_RSA_PUBLIC_ONLY))
static const char* bench_desc_words[][9] = {
/* 0 1 2 3 4 5 6 7 8 */
@ -927,6 +927,27 @@ static int rsa_sign_verify = 0;
static int use_ffdhe = 0;
#endif
#ifdef HAVE_ECC
/* Detect ECC key size to use */
#ifndef BENCH_ECC_SIZE
#ifndef NO_ECC256
#define BENCH_ECC_SIZE 32
#elif defined(HAVE_ECC384)
#define BENCH_ECC_SIZE 48
#elif defined(HAVE_ECC224)
#define BENCH_ECC_SIZE 28
#elif defined(HAVE_ECC521)
#define BENCH_ECC_SIZE 66
#else
#error No ECC keygen size defined for benchmark
#endif
#endif
#define BENCH_MAX_ECC_SIZE BENCH_ECC_SIZE
static int bench_ecc_size = BENCH_ECC_SIZE;
#endif
/* Don't print out in CSV format by default */
static int csv_format = 0;
#ifdef BENCH_ASYM
@ -4344,7 +4365,7 @@ exit:
void bench_rsaKeyGen(int doAsync)
{
int k, keySz;
#ifndef WOLFSSL_SP_MATH
#if !defined(WOLFSSL_SP_MATH) || defined(WOLFSSL_SP_MATH_ALL)
const int keySizes[2] = {1024, 2048};
#else
const int keySizes[1] = {2048};
@ -4713,7 +4734,7 @@ void bench_rsa(int doAsync)
for (i = 0; i < BENCH_MAX_PENDING; i++) {
/* setup an async context for each key */
if (wc_InitRsaKey_ex(&rsaKey[i], HEAP_HINT,
doAsync ? devId : INVALID_DEVID) < 0) {
doAsync ? devId : INVALID_DEVID) < 0) {
goto exit_bench_rsa;
}
@ -5228,23 +5249,6 @@ void bench_ntruKeyGen(void)
#endif
#ifdef HAVE_ECC
/* Detect ECC key size to use */
#ifndef BENCH_ECC_SIZE
#ifndef NO_ECC256
#define BENCH_ECC_SIZE 32
#elif defined(HAVE_ECC384)
#define BENCH_ECC_SIZE 48
#elif defined(HAVE_ECC224)
#define BENCH_ECC_SIZE 28
#elif defined(HAVE_ECC521)
#define BENCH_ECC_SIZE 66
#else
#error No ECC keygen size defined for benchmark
#endif
#endif
static int bench_ecc_size = BENCH_ECC_SIZE;
void bench_eccMakeKey(int doAsync)
{
int ret = 0, i, times, count, pending = 0;
@ -5308,11 +5312,11 @@ void bench_ecc(int doAsync)
const char**desc = bench_desc_words[lng_index];
#ifdef HAVE_ECC_DHE
DECLARE_ARRAY(shared, byte, BENCH_MAX_PENDING, BENCH_ECC_SIZE, HEAP_HINT);
DECLARE_ARRAY(shared, byte, BENCH_MAX_PENDING, BENCH_MAX_ECC_SIZE, HEAP_HINT);
#endif
#if !defined(NO_ASN) && defined(HAVE_ECC_SIGN)
DECLARE_ARRAY(sig, byte, BENCH_MAX_PENDING, ECC_MAX_SIG_SIZE, HEAP_HINT);
DECLARE_ARRAY(digest, byte, BENCH_MAX_PENDING, BENCH_ECC_SIZE, HEAP_HINT);
DECLARE_ARRAY(digest, byte, BENCH_MAX_PENDING, BENCH_MAX_ECC_SIZE, HEAP_HINT);
#endif
#ifdef DECLARE_VAR_IS_HEAP_ALLOC

View File

@ -990,7 +990,8 @@ static int CheckBitString(const byte* input, word32* inOutIdx, int* len,
(defined(WOLFSSL_CERT_GEN) || defined(WOLFSSL_KEY_GEN) || defined(OPENSSL_EXTRA))) || \
(defined(HAVE_ECC) && defined(HAVE_ECC_KEY_EXPORT)) || \
((defined(HAVE_ED25519) || defined(HAVE_ED448)) && \
(defined(WOLFSSL_CERT_GEN) || defined(WOLFSSL_KEY_GEN) || defined(OPENSSL_EXTRA)))
(defined(WOLFSSL_CERT_GEN) || defined(WOLFSSL_KEY_GEN) || defined(OPENSSL_EXTRA))) || \
(!defined(NO_DSA) && !defined(HAVE_SELFTEST) && defined(WOLFSSL_KEY_GEN))
/* Set the DER/BER encoding of the ASN.1 BIT_STRING header.
*

View File

@ -28,8 +28,8 @@
#include <wolfssl/wolfcrypt/cpuid.h>
#if (defined(WOLFSSL_X86_64_BUILD) || defined(USE_INTEL_SPEEDUP) || \
defined(WOLFSSL_AESNI)) && !defined(WOLFSSL_NO_ASM)
#if defined(WOLFSSL_X86_64_BUILD) || defined(USE_INTEL_SPEEDUP) || \
defined(WOLFSSL_AESNI) || defined(WOLFSSL_SP_X86_64_ASM)
/* Each platform needs to query info type 1 from cpuid to see if aesni is
* supported. Also, let's setup a macro for proper linkage w/o ABI conflicts
*/

View File

@ -1262,7 +1262,7 @@ static int GeneratePublicDh(DhKey* key, byte* priv, word32 privSz,
#endif
#endif
#ifndef WOLFSSL_SP_MATH
#if !defined(WOLFSSL_SP_MATH)
#ifdef WOLFSSL_SMALL_STACK
x = (mp_int*)XMALLOC(sizeof(mp_int), key->heap, DYNAMIC_TYPE_DH);
if (x == NULL)
@ -1482,6 +1482,7 @@ int wc_DhCheckPubKey_ex(DhKey* key, const byte* pub, word32 pubSz,
ret = MP_INIT_E;
}
/* SP 800-56Ar3, section 5.6.2.3.1, process step 2 */
if (ret == 0 && prime != NULL) {
#ifdef WOLFSSL_HAVE_SP_DH
#ifndef WOLFSSL_SP_NO_2048
@ -1511,8 +1512,7 @@ int wc_DhCheckPubKey_ex(DhKey* key, const byte* pub, word32 pubSz,
#endif
{
/* SP 800-56Ar3, section 5.6.2.3.1, process step 2 */
#ifndef WOLFSSL_SP_MATH
#if !defined(WOLFSSL_SP_MATH)
/* calculate (y^q) mod(p), store back into y */
if (mp_exptmod(y, q, p, y) != MP_OKAY)
ret = MP_EXPTMOD_E;
@ -1797,7 +1797,7 @@ int wc_DhCheckKeyPair(DhKey* key, const byte* pub, word32 pubSz,
#endif
#endif
{
#ifndef WOLFSSL_SP_MATH
#if !defined(WOLFSSL_SP_MATH)
if (mp_exptmod(&key->g, privateKey, &key->p, checkKey) != MP_OKAY)
ret = MP_EXPTMOD_E;
#else
@ -1853,14 +1853,14 @@ static int wc_DhAgree_Sync(DhKey* key, byte* agree, word32* agreeSz,
{
int ret = 0;
#ifdef WOLFSSL_SMALL_STACK
mp_int* y;
#ifndef WOLFSSL_SP_MATH
mp_int* x;
mp_int* z;
mp_int* y = NULL;
#if !defined(WOLFSSL_SP_MATH)
mp_int* x = NULL;
mp_int* z = NULL;
#endif
#else
mp_int y[1];
#ifndef WOLFSSL_SP_MATH
#if !defined(WOLFSSL_SP_MATH)
mp_int x[1];
mp_int z[1];
#endif
@ -1882,7 +1882,7 @@ static int wc_DhAgree_Sync(DhKey* key, byte* agree, word32* agreeSz,
y = (mp_int*)XMALLOC(sizeof(mp_int), key->heap, DYNAMIC_TYPE_DH);
if (y == NULL)
return MEMORY_E;
#ifndef WOLFSSL_SP_MATH
#if !defined(WOLFSSL_SP_MATH)
x = (mp_int*)XMALLOC(sizeof(mp_int), key->heap, DYNAMIC_TYPE_DH);
if (x == NULL) {
XFREE(y, key->heap, DYNAMIC_TYPE_DH);
@ -1911,7 +1911,7 @@ static int wc_DhAgree_Sync(DhKey* key, byte* agree, word32* agreeSz,
mp_clear(y);
#ifdef WOLFSSL_SMALL_STACK
#ifndef WOLFSSL_SP_MATH
#if !defined(WOLFSSL_SP_MATH)
XFREE(z, key->heap, DYNAMIC_TYPE_DH);
XFREE(x, key->heap, DYNAMIC_TYPE_DH);
#endif
@ -1933,7 +1933,7 @@ static int wc_DhAgree_Sync(DhKey* key, byte* agree, word32* agreeSz,
mp_clear(y);
#ifdef WOLFSSL_SMALL_STACK
#ifndef WOLFSSL_SP_MATH
#if !defined(WOLFSSL_SP_MATH)
XFREE(z, key->heap, DYNAMIC_TYPE_DH);
XFREE(x, key->heap, DYNAMIC_TYPE_DH);
#endif
@ -1955,7 +1955,7 @@ static int wc_DhAgree_Sync(DhKey* key, byte* agree, word32* agreeSz,
mp_clear(y);
#ifdef WOLFSSL_SMALL_STACK
#ifndef WOLFSSL_SP_MATH
#if !defined(WOLFSSL_SP_MATH)
XFREE(z, key->heap, DYNAMIC_TYPE_DH);
XFREE(x, key->heap, DYNAMIC_TYPE_DH);
#endif
@ -1966,7 +1966,7 @@ static int wc_DhAgree_Sync(DhKey* key, byte* agree, word32* agreeSz,
#endif
#endif
#ifndef WOLFSSL_SP_MATH
#if !defined(WOLFSSL_SP_MATH)
if (mp_init_multi(x, y, z, 0, 0, 0) != MP_OKAY) {
#ifdef WOLFSSL_SMALL_STACK
XFREE(z, key->heap, DYNAMIC_TYPE_DH);
@ -2001,7 +2001,7 @@ static int wc_DhAgree_Sync(DhKey* key, byte* agree, word32* agreeSz,
#endif
#ifdef WOLFSSL_SMALL_STACK
#ifndef WOLFSSL_SP_MATH
#if !defined(WOLFSSL_SP_MATH)
XFREE(z, key->heap, DYNAMIC_TYPE_DH);
XFREE(x, key->heap, DYNAMIC_TYPE_DH);
#endif

View File

@ -150,7 +150,7 @@ ECC Curve Sizes:
#include <wolfssl/wolfcrypt/port/cypress/psoc6_crypto.h>
#endif
#ifdef WOLFSSL_SP_MATH
#if defined(WOLFSSL_SP_MATH) || defined(WOLFSSL_SP_MATH_ALL)
#define GEN_MEM_ERR MP_MEM
#elif defined(USE_FAST_MATH)
#define GEN_MEM_ERR FP_MEM
@ -1569,7 +1569,7 @@ static void alt_fp_init(mp_int* a)
int ecc_projective_add_point(ecc_point* P, ecc_point* Q, ecc_point* R,
mp_int* a, mp_int* modulus, mp_digit mp)
{
#ifndef WOLFSSL_SP_MATH
#if !defined(WOLFSSL_SP_MATH)
#ifdef WOLFSSL_SMALL_STACK
mp_int* t1 = NULL;
mp_int* t2 = NULL;
@ -1936,7 +1936,7 @@ done:
int ecc_projective_dbl_point(ecc_point *P, ecc_point *R, mp_int* a,
mp_int* modulus, mp_digit mp)
{
#ifndef WOLFSSL_SP_MATH
#if !defined(WOLFSSL_SP_MATH)
#ifdef WOLFSSL_SMALL_STACK
mp_int* t1 = NULL;
mp_int* t2 = NULL;
@ -2252,7 +2252,7 @@ int ecc_projective_dbl_point(ecc_point *P, ecc_point *R, mp_int* a,
*/
int ecc_map_ex(ecc_point* P, mp_int* modulus, mp_digit mp, int ct)
{
#ifndef WOLFSSL_SP_MATH
#if !defined(WOLFSSL_SP_MATH)
#ifdef WOLFSSL_SMALL_STACK
mp_int* t1 = NULL;
mp_int* t2 = NULL;
@ -2369,7 +2369,8 @@ int ecc_map_ex(ecc_point* P, mp_int* modulus, mp_digit mp, int ct)
/* get 1/z */
if (err == MP_OKAY) {
#if defined(ECC_TIMING_RESISTANT) && defined(USE_FAST_MATH)
#if defined(ECC_TIMING_RESISTANT) && (defined(USE_FAST_MATH) || \
defined(WOLFSSL_SP_MATH) || defined(WOLFSSL_SP_MATH_ALL))
if (ct) {
err = mp_invmod_mont_ct(z, modulus, t1, mp);
if (err == MP_OKAY)
@ -2468,7 +2469,7 @@ int ecc_map(ecc_point* P, mp_int* modulus, mp_digit mp)
#if !defined(FREESCALE_LTC_ECC) && !defined(WOLFSSL_STM32_PKA)
#ifndef WOLFSSL_SP_MATH
#if !defined(WOLFSSL_SP_MATH)
#ifndef ECC_TIMING_RESISTANT
@ -2805,7 +2806,6 @@ static int ecc_mulmod(mp_int* k, ecc_point* P, ecc_point* Q, ecc_point** R,
#endif
#ifndef WOLFSSL_SP_MATH
/* Convert the point to montogmery form.
*
* @param [in] p Point to convert.
@ -2861,7 +2861,6 @@ static int ecc_point_to_mont(ecc_point* p, ecc_point* r, mp_int* modulus,
#endif
return err;
}
#endif /* !WOLFSSL_SP_MATH */
#ifdef WOLFSSL_SMALL_STACK_CACHE
static int ecc_key_tmp_init(ecc_key* key, void* heap)
@ -2926,7 +2925,7 @@ static int normal_ecc_mulmod(mp_int* k, ecc_point *G, ecc_point *R, mp_int* a,
int wc_ecc_mulmod_ex(mp_int* k, ecc_point *G, ecc_point *R, mp_int* a,
mp_int* modulus, int map, void* heap)
#endif
#ifndef WOLFSSL_SP_MATH
#if !defined(WOLFSSL_SP_MATH)
{
ecc_point *tG, *M[M_POINTS];
int i, err;
@ -3021,7 +3020,7 @@ exit:
return ECC_BAD_ARG_E;
}
#endif
#endif /* !defined(WOLFSSL_SP_MATH) && !defined(FP_ECC) */
#endif /* !WOLFSSL_SP_MATH || !FP_ECC */
#ifndef FP_ECC
/**
@ -3038,7 +3037,7 @@ exit:
int wc_ecc_mulmod_ex2(mp_int* k, ecc_point *G, ecc_point *R, mp_int* a,
mp_int* modulus, mp_int* order, WC_RNG* rng, int map,
void* heap)
#ifndef WOLFSSL_SP_MATH
#if !defined(WOLFSSL_SP_MATH)
{
ecc_point *tG, *M[M_POINTS];
int i, err;
@ -3783,7 +3782,7 @@ static int wc_ecc_shared_secret_gen_sync(ecc_key* private_key, ecc_point* point,
byte* out, word32* outlen, ecc_curve_spec* curve)
{
int err = MP_OKAY;
#ifndef WOLFSSL_SP_MATH
#if !defined(WOLFSSL_SP_MATH)
ecc_point* result = NULL;
word32 x = 0;
#endif
@ -3825,7 +3824,7 @@ static int wc_ecc_shared_secret_gen_sync(ecc_key* private_key, ecc_point* point,
else
#endif
#endif
#ifdef WOLFSSL_SP_MATH
#if defined(WOLFSSL_SP_MATH)
{
err = WC_KEY_SIZE_E;
@ -4185,7 +4184,7 @@ static int ecc_make_pub_ex(ecc_key* key, ecc_curve_spec* curveIn,
{
int err = MP_OKAY;
#if !defined(WOLFSSL_ATECC508A) && !defined(WOLFSSL_ATECC608A)
#ifndef WOLFSSL_SP_MATH
#if !defined(WOLFSSL_SP_MATH)
ecc_point* base = NULL;
#endif
ecc_point* pub;
@ -4223,13 +4222,8 @@ static int ecc_make_pub_ex(ecc_key* key, ecc_curve_spec* curveIn,
}
}
#ifndef WOLFSSL_SP_MATH
if ((err == MP_OKAY) && (mp_iszero(&key->k) || (key->k.sign == MP_NEG) ||
if ((err == MP_OKAY) && (mp_iszero(&key->k) || mp_isneg(&key->k) ||
(mp_cmp(&key->k, curve->order) != MP_LT)))
#else
if ((err == MP_OKAY) && (mp_iszero(&key->k) ||
(mp_cmp(&key->k, curve->order) != MP_LT)))
#endif
{
err = ECC_PRIV_KEY_E;
}
@ -4264,7 +4258,7 @@ static int ecc_make_pub_ex(ecc_key* key, ecc_curve_spec* curveIn,
else
#endif
#endif
#ifdef WOLFSSL_SP_MATH
#if defined(WOLFSSL_SP_MATH)
err = WC_KEY_SIZE_E;
#else
{
@ -4377,7 +4371,7 @@ int wc_ecc_make_key_ex2(WC_RNG* rng, int keysize, ecc_key* key, int curve_id,
int err;
#if !defined(WOLFSSL_ATECC508A) && !defined(WOLFSSL_ATECC608A) && \
!defined(WOLFSSL_CRYPTOCELL)
#ifndef WOLFSSL_SP_MATH
#if !defined(WOLFSSL_SP_MATH)
DECLARE_CURVE_SPECS(curve, ECC_CURVE_FIELD_COUNT);
#endif
#endif /* !WOLFSSL_ATECC508A */
@ -4527,7 +4521,7 @@ int wc_ecc_make_key_ex2(WC_RNG* rng, int keysize, ecc_key* key, int curve_id,
#endif /* WOLFSSL_HAVE_SP_ECC */
{ /* software key gen */
#ifdef WOLFSSL_SP_MATH
#if defined(WOLFSSL_SP_MATH)
err = WC_KEY_SIZE_E;
#else
@ -5108,7 +5102,7 @@ int wc_ecc_sign_hash_ex(const byte* in, word32 inlen, WC_RNG* rng,
ecc_key* key, mp_int *r, mp_int *s)
{
int err = 0;
#ifndef WOLFSSL_SP_MATH
#if !defined(WOLFSSL_SP_MATH)
mp_int* e;
#if (!defined(WOLFSSL_ASYNC_CRYPT) || !defined(HAVE_CAVIUM_V)) && \
!defined(WOLFSSL_SMALL_STACK)
@ -5138,7 +5132,7 @@ int wc_ecc_sign_hash_ex(const byte* in, word32 inlen, WC_RNG* rng,
return ECC_BAD_ARG_E;
}
#ifdef WOLFSSL_SP_MATH
#if defined(WOLFSSL_SP_MATH)
if (key->idx == ECC_CUSTOM_IDX ||
(ecc_sets[key->idx].id != ECC_SECP256R1 &&
ecc_sets[key->idx].id != ECC_SECP384R1)) {
@ -5146,7 +5140,8 @@ int wc_ecc_sign_hash_ex(const byte* in, word32 inlen, WC_RNG* rng,
}
#endif
#if defined(WOLFSSL_SP_MATH) || defined(WOLFSSL_HAVE_SP_ECC)
#if defined(WOLFSSL_SP_MATH) || defined(WOLFSSL_HAVE_SP_ECC) || \
(defined(WOLFSSL_SP_MATH_ALL) && defined(WOLFSSL_HAVE_SP_ECC))
if (key->idx != ECC_CUSTOM_IDX
#if defined(WOLFSSL_ASYNC_CRYPT) && defined(WC_ASYNC_ENABLE_ECC)
&& key->asyncDev.marker != WOLFSSL_ASYNC_MARKER_ECC
@ -5224,7 +5219,7 @@ int wc_ecc_sign_hash_ex(const byte* in, word32 inlen, WC_RNG* rng,
#endif
#ifndef WOLFSSL_SP_MATH
#if !defined(WOLFSSL_SP_MATH)
#if defined(WOLFSSL_ASYNC_CRYPT) && defined(HAVE_CAVIUM_V)
err = wc_ecc_alloc_mpint(key, &key->e);
@ -5516,7 +5511,7 @@ int wc_ecc_sign_hash_ex(const byte* in, word32 inlen, WC_RNG* rng,
XFREE(e, key->heap, DYNAMIC_TYPE_ECC);
#endif
FREE_CURVE_SPECS();
#endif /* WOLFSSL_SP_MATH */
#endif /* !WOLFSSL_SP_MATH */
return err;
}
@ -5525,11 +5520,17 @@ int wc_ecc_sign_hash_ex(const byte* in, word32 inlen, WC_RNG* rng,
int wc_ecc_sign_set_k(const byte* k, word32 klen, ecc_key* key)
{
int ret = 0;
DECLARE_CURVE_SPECS(curve, 1);
if (k == NULL || klen == 0 || key == NULL) {
ret = BAD_FUNC_ARG;
}
if (ret == 0) {
ALLOC_CURVE_SPECS(1);
ret = wc_ecc_curve_load(key->dp, &curve, ECC_CURVE_FIELD_ORDER);
}
if (ret == 0) {
if (key->sign_k == NULL) {
key->sign_k = (mp_int*)XMALLOC(sizeof(mp_int), key->heap,
@ -5546,7 +5547,11 @@ int wc_ecc_sign_set_k(const byte* k, word32 klen, ecc_key* key)
if (ret == 0) {
ret = mp_read_unsigned_bin(key->sign_k, k, klen);
}
if (ret == 0 && mp_cmp(key->sign_k, curve->order) != MP_LT) {
ret = MP_VAL;
}
FREE_CURVE_SPECS();
return ret;
}
#endif /* WOLFSSL_ECDSA_SET_K */
@ -6034,7 +6039,8 @@ int ecc_mul2add(ecc_point* A, mp_int* kA,
}
#endif /* ECC_SHAMIR */
#endif /* !WOLFSSL_SP_MATH && !WOLFSSL_ATECC508A && !WOLFSSL_CRYPTOCEL*/
#endif /* (!WOLFSSL_SP_MATH && !WOLFSSL_ATECC508A && !WOLFSSL_ATECC608A &&
* !WOLFSSL_CRYPTOCEL */
#ifdef HAVE_ECC_VERIFY
@ -6348,8 +6354,9 @@ int wc_ecc_verify_hash_ex(mp_int *r, mp_int *s, const byte* hash,
}
#endif
#if (defined(WOLFSSL_SP_MATH) || defined(WOLFSSL_HAVE_SP_ECC)) && \
!defined(FREESCALE_LTC_ECC)
#if defined(WOLFSSL_SP_MATH) || defined(WOLFSSL_HAVE_SP_ECC) || \
(defined(WOLFSSL_SP_MATH_ALL) && defined(WOLFSSL_HAVE_SP_ECC)) && \
!defined(FREESCALE_LTC_ECC)
if (key->idx != ECC_CUSTOM_IDX
#if defined(WOLFSSL_ASYNC_CRYPT) && defined(WC_ASYNC_ENABLE_ECC)
&& key->asyncDev.marker != WOLFSSL_ASYNC_MARKER_ECC
@ -6411,7 +6418,6 @@ int wc_ecc_verify_hash_ex(mp_int *r, mp_int *s, const byte* hash,
#endif
#if !defined(WOLFSSL_SP_MATH) || defined(FREESCALE_LTC_ECC)
ALLOC_CURVE_SPECS(ECC_CURVE_FIELD_COUNT);
#if defined(WOLFSSL_ASYNC_CRYPT) && defined(HAVE_CAVIUM_V)
@ -6737,81 +6743,87 @@ int wc_ecc_import_point_der_ex(byte* in, word32 inLen, const int curve_idx,
#ifdef HAVE_COMP_KEY
if (err == MP_OKAY && compressed == 1) { /* build y */
#ifndef WOLFSSL_SP_MATH
int did_init = 0;
mp_int t1, t2;
DECLARE_CURVE_SPECS(curve, 3);
ALLOC_CURVE_SPECS(3);
if (mp_init_multi(&t1, &t2, NULL, NULL, NULL, NULL) != MP_OKAY)
err = MEMORY_E;
else
did_init = 1;
/* load curve info */
if (err == MP_OKAY)
err = wc_ecc_curve_load(&ecc_sets[curve_idx], &curve,
(ECC_CURVE_FIELD_PRIME | ECC_CURVE_FIELD_AF |
ECC_CURVE_FIELD_BF));
/* compute x^3 */
if (err == MP_OKAY)
err = mp_sqr(point->x, &t1);
if (err == MP_OKAY)
err = mp_mulmod(&t1, point->x, curve->prime, &t1);
/* compute x^3 + a*x */
if (err == MP_OKAY)
err = mp_mulmod(curve->Af, point->x, curve->prime, &t2);
if (err == MP_OKAY)
err = mp_add(&t1, &t2, &t1);
/* compute x^3 + a*x + b */
if (err == MP_OKAY)
err = mp_add(&t1, curve->Bf, &t1);
/* compute sqrt(x^3 + a*x + b) */
if (err == MP_OKAY)
err = mp_sqrtmod_prime(&t1, curve->prime, &t2);
/* adjust y */
if (err == MP_OKAY) {
if ((mp_isodd(&t2) == MP_YES && pointType == ECC_POINT_COMP_ODD) ||
(mp_isodd(&t2) == MP_NO && pointType == ECC_POINT_COMP_EVEN)) {
err = mp_mod(&t2, curve->prime, point->y);
}
else {
err = mp_submod(curve->prime, &t2, curve->prime, point->y);
}
}
if (did_init) {
mp_clear(&t2);
mp_clear(&t1);
}
wc_ecc_curve_free(curve);
FREE_CURVE_SPECS();
#else
#ifndef WOLFSSL_SP_NO_256
#if defined(WOLFSSL_HAVE_SP_ECC)
#ifndef WOLFSSL_SP_NO_256
if (curve_idx != ECC_CUSTOM_IDX &&
ecc_sets[curve_idx].id == ECC_SECP256R1) {
sp_ecc_uncompress_256(point->x, pointType, point->y);
}
else
#endif
#ifdef WOLFSSL_SP_384
#endif
#ifdef WOLFSSL_SP_384
if (curve_idx != ECC_CUSTOM_IDX &&
ecc_sets[curve_idx].id == ECC_SECP384R1) {
sp_ecc_uncompress_384(point->x, pointType, point->y);
}
else
#endif
#endif
#if !defined(WOLFSSL_SP_MATH)
{
int did_init = 0;
mp_int t1, t2;
DECLARE_CURVE_SPECS(curve, 3);
ALLOC_CURVE_SPECS(3);
if (mp_init_multi(&t1, &t2, NULL, NULL, NULL, NULL) != MP_OKAY)
err = MEMORY_E;
else
did_init = 1;
/* load curve info */
if (err == MP_OKAY)
err = wc_ecc_curve_load(&ecc_sets[curve_idx], &curve,
(ECC_CURVE_FIELD_PRIME | ECC_CURVE_FIELD_AF |
ECC_CURVE_FIELD_BF));
/* compute x^3 */
if (err == MP_OKAY)
err = mp_sqr(point->x, &t1);
if (err == MP_OKAY)
err = mp_mulmod(&t1, point->x, curve->prime, &t1);
/* compute x^3 + a*x */
if (err == MP_OKAY)
err = mp_mulmod(curve->Af, point->x, curve->prime, &t2);
if (err == MP_OKAY)
err = mp_add(&t1, &t2, &t1);
/* compute x^3 + a*x + b */
if (err == MP_OKAY)
err = mp_add(&t1, curve->Bf, &t1);
/* compute sqrt(x^3 + a*x + b) */
if (err == MP_OKAY)
err = mp_sqrtmod_prime(&t1, curve->prime, &t2);
/* adjust y */
if (err == MP_OKAY) {
if ((mp_isodd(&t2) == MP_YES &&
pointType == ECC_POINT_COMP_ODD) ||
(mp_isodd(&t2) == MP_NO &&
pointType == ECC_POINT_COMP_EVEN)) {
err = mp_mod(&t2, curve->prime, point->y);
}
else {
err = mp_submod(curve->prime, &t2, curve->prime, point->y);
}
}
if (did_init) {
mp_clear(&t2);
mp_clear(&t1);
}
wc_ecc_curve_free(curve);
FREE_CURVE_SPECS();
}
#else
{
err = WC_KEY_SIZE_E;
}
#endif
#endif
}
#endif
@ -7089,7 +7101,7 @@ int wc_ecc_export_x963_ex(ecc_key* key, byte* out, word32* outLen,
/* is ecc point on curve described by dp ? */
int wc_ecc_is_point(ecc_point* ecp, mp_int* a, mp_int* b, mp_int* prime)
{
#ifndef WOLFSSL_SP_MATH
#if !defined(WOLFSSL_SP_MATH)
int err;
#ifdef WOLFSSL_SMALL_STACK
mp_int* t1;
@ -7131,7 +7143,7 @@ int wc_ecc_is_point(ecc_point* ecp, mp_int* a, mp_int* b, mp_int* prime)
/* compute y^2 - x^3 */
if (err == MP_OKAY)
err = mp_sub(t1, t2, t1);
err = mp_submod(t1, t2, prime, t1);
/* Determine if curve "a" should be used in calc */
#ifdef WOLFSSL_CUSTOM_CURVES
@ -7361,7 +7373,7 @@ static int ecc_check_pubkey_order(ecc_key* key, ecc_point* pubkey, mp_int* a,
else
#endif
#endif
#ifndef WOLFSSL_SP_MATH
#if !defined(WOLFSSL_SP_MATH)
err = wc_ecc_mulmod_ex(order, pubkey, inf, a, prime, 1, key->heap);
if (err == MP_OKAY && !wc_ecc_point_is_at_infinity(inf))
err = ECC_INF_E;
@ -7413,7 +7425,7 @@ int wc_ecc_get_generator(ecc_point* ecp, int curve_idx)
int wc_ecc_check_key(ecc_key* key)
{
int err;
#ifndef WOLFSSL_SP_MATH
#if !defined(WOLFSSL_SP_MATH)
#if !defined(WOLFSSL_ATECC508A) && !defined(WOLFSSL_ATECC608A) && \
!defined(WOLFSSL_CRYPTOCELL)
mp_int* b = NULL;
@ -7508,8 +7520,8 @@ int wc_ecc_check_key(ecc_key* key)
/* SP 800-56Ar3, section 5.6.2.1.2 */
/* private keys must be in the range [1, n-1] */
if ((err == MP_OKAY) && (key->type == ECC_PRIVATEKEY) &&
(mp_iszero(&key->k) || (key->k.sign == MP_NEG) ||
(mp_cmp(&key->k, curve->order) != MP_LT))) {
(mp_iszero(&key->k) || mp_isneg(&key->k) ||
(mp_cmp(&key->k, curve->order) != MP_LT))) {
err = ECC_PRIV_KEY_E;
}
@ -7644,7 +7656,7 @@ int wc_ecc_import_x963_ex(const byte* in, word32 inLen, ecc_key* key,
#ifdef HAVE_COMP_KEY
if (err == MP_OKAY && compressed == 1) { /* build y */
#ifndef WOLFSSL_SP_MATH
#if !defined(WOLFSSL_SP_MATH)
mp_int t1, t2;
int did_init = 0;
@ -8392,7 +8404,7 @@ int wc_ecc_sig_size(ecc_key* key)
#endif
#ifndef WOLFSSL_SP_MATH
#if !defined(WOLFSSL_SP_MATH)
/** Our FP cache */
typedef struct {
@ -9037,7 +9049,7 @@ static int add_entry(int idx, ecc_point *g)
}
#endif
#ifndef WOLFSSL_SP_MATH
#if !defined(WOLFSSL_SP_MATH)
/* build the LUT by spacing the bits of the input by #modulus/FP_LUT bits apart
*
* The algorithm builds patterns in increasing bit order by first making all
@ -9333,7 +9345,7 @@ done:
#endif
#ifdef ECC_SHAMIR
#ifndef WOLFSSL_SP_MATH
#if !defined(WOLFSSL_SP_MATH)
/* perform a fixed point ECC mulmod */
static int accel_fp_mul2add(int idx1, int idx2,
mp_int* kA, mp_int* kB,
@ -9713,7 +9725,7 @@ int ecc_mul2add(ecc_point* A, mp_int* kA,
int wc_ecc_mulmod_ex(mp_int* k, ecc_point *G, ecc_point *R, mp_int* a,
mp_int* modulus, int map, void* heap)
{
#ifndef WOLFSSL_SP_MATH
#if !defined(WOLFSSL_SP_MATH)
int idx, err = MP_OKAY;
mp_digit mp;
mp_int mu;
@ -9822,7 +9834,7 @@ int wc_ecc_mulmod_ex(mp_int* k, ecc_point *G, ecc_point *R, mp_int* a,
int wc_ecc_mulmod_ex2(mp_int* k, ecc_point *G, ecc_point *R, mp_int* a,
mp_int* modulus, mp_int* order, WC_RNG* rng, int map, void* heap)
{
#ifndef WOLFSSL_SP_MATH
#if !defined(WOLFSSL_SP_MATH)
int idx, err = MP_OKAY;
mp_digit mp;
mp_int mu;
@ -9927,7 +9939,7 @@ int wc_ecc_mulmod_ex2(mp_int* k, ecc_point *G, ecc_point *R, mp_int* a,
#endif
}
#ifndef WOLFSSL_SP_MATH
#if !defined(WOLFSSL_SP_MATH)
/* helper function for freeing the cache ...
must be called with the cache mutex locked */
static void wc_ecc_fp_free_cache(void)
@ -9968,7 +9980,7 @@ void wc_ecc_fp_init(void)
/** Free the Fixed Point cache */
void wc_ecc_fp_free(void)
{
#ifndef WOLFSSL_SP_MATH
#if !defined(WOLFSSL_SP_MATH)
#ifndef HAVE_THREAD_LS
if (initMutex == 0) { /* extra sanity check if wolfCrypt_Init not called */
wc_InitMutex(&ecc_fp_lock);

View File

@ -4700,21 +4700,21 @@ static int mp_prime_miller_rabin (mp_int * a, mp_int * b, int *result)
}
#if defined(WOLFSSL_HAVE_SP_RSA) || defined(WOLFSSL_HAVE_SP_DH)
#ifndef WOLFSSL_SP_NO_2048
if (mp_count_bits(a) == 1024)
if (mp_count_bits(a) == 1024 && mp_isodd(a))
err = sp_ModExp_1024(b, &r, a, &y);
else if (mp_count_bits(a) == 2048)
else if (mp_count_bits(a) == 2048 && mp_isodd(a))
err = sp_ModExp_2048(b, &r, a, &y);
else
#endif
#ifndef WOLFSSL_SP_NO_3072
if (mp_count_bits(a) == 1536)
if (mp_count_bits(a) == 1536 && mp_isodd(a))
err = sp_ModExp_1536(b, &r, a, &y);
else if (mp_count_bits(a) == 3072)
else if (mp_count_bits(a) == 3072 && mp_isodd(a))
err = sp_ModExp_3072(b, &r, a, &y);
else
#endif
#ifdef WOLFSSL_SP_4096
if (mp_count_bits(a) == 4096)
if (mp_count_bits(a) == 4096 && mp_isodd(a))
err = sp_ModExp_4096(b, &r, a, &y);
else
#endif
@ -5254,7 +5254,12 @@ int mp_radix_size (mp_int *a, int radix, int *size)
}
if (mp_iszero(a) == MP_YES) {
*size = 2;
#ifndef WC_DISABLE_RADIX_ZERO_PAD
if (radix == 16)
*size = 3;
else
#endif
*size = 2;
return MP_OKAY;
}
@ -5311,6 +5316,11 @@ int mp_toradix (mp_int *a, char *str, int radix)
/* quick out if its zero */
if (mp_iszero(a) == MP_YES) {
#ifndef WC_DISABLE_RADIX_ZERO_PAD
if (radix == 16) {
*str++ = '0';
}
#endif
*str++ = '0';
*str = '\0';
return MP_OKAY;

View File

@ -651,19 +651,25 @@ int wc_CheckRsaKey(RsaKey* key)
break;
#endif /* WOLFSSL_SP_4096 */
default:
/* If using only single prcsision math then issue key size error,
otherwise fall-back to multi-precision math calculation */
#ifdef WOLFSSL_SP_MATH
/* If using only single precsision math then issue key size
* error, otherwise fall-back to multi-precision math
* calculation */
#if defined(WOLFSSL_SP_MATH)
ret = WC_KEY_SIZE_E;
#else
if (mp_exptmod_nct(k, &key->e, &key->n, tmp) != MP_OKAY)
ret = MP_EXPTMOD_E;
if (ret == 0) {
if (mp_exptmod(tmp, &key->d, &key->n, tmp) != MP_OKAY)
ret = MP_EXPTMOD_E;
}
#endif
break;
}
}
#endif /* WOLFSSL_HAVE_SP_RSA */
#ifndef WOLFSSL_SP_MATH
#else
if (ret == 0) {
if (mp_exptmod(k, &key->e, &key->n, tmp) != MP_OKAY)
if (mp_exptmod_nct(k, &key->e, &key->n, tmp) != MP_OKAY)
ret = MP_EXPTMOD_E;
}
@ -671,7 +677,7 @@ int wc_CheckRsaKey(RsaKey* key)
if (mp_exptmod(tmp, &key->d, &key->n, tmp) != MP_OKAY)
ret = MP_EXPTMOD_E;
}
#endif /* !WOLFSSL_SP_MATH */
#endif /* WOLFSSL_HAVE_SP_RSA */
if (ret == 0) {
if (mp_cmp(k, tmp) != MP_EQ)
@ -2076,7 +2082,7 @@ done:
static int wc_RsaFunctionSync(const byte* in, word32 inLen, byte* out,
word32* outLen, int type, RsaKey* key, WC_RNG* rng)
{
#ifndef WOLFSSL_SP_MATH
#if !defined(WOLFSSL_SP_MATH)
#ifdef WOLFSSL_SMALL_STACK
mp_int* tmp;
#ifdef WC_RSA_BLINDING
@ -2183,7 +2189,7 @@ static int wc_RsaFunctionSync(const byte* in, word32 inLen, byte* out,
#endif
#endif /* WOLFSSL_HAVE_SP_RSA */
#ifdef WOLFSSL_SP_MATH
#if defined(WOLFSSL_SP_MATH)
(void)rng;
WOLFSSL_MSG("SP Key Size Error");
return WC_KEY_SIZE_E;
@ -2237,8 +2243,15 @@ static int wc_RsaFunctionSync(const byte* in, word32 inLen, byte* out,
ret = MP_INVMOD_E;
/* rnd = rnd^e */
#ifndef WOLFSSL_SP_MATH_ALL
if (ret == 0 && mp_exptmod(rnd, &key->e, &key->n, rnd) != MP_OKAY)
ret = MP_EXPTMOD_E;
#else
if (ret == 0 && mp_exptmod_nct(rnd, &key->e, &key->n,
rnd) != MP_OKAY) {
ret = MP_EXPTMOD_E;
}
#endif
/* tmp = tmp*rnd mod n */
if (ret == 0 && mp_mulmod(tmp, rnd, &key->n, tmp) != MP_OKAY)
@ -2292,8 +2305,14 @@ static int wc_RsaFunctionSync(const byte* in, word32 inLen, byte* out,
ret = MP_EXPTMOD_E;
/* tmp = (tmpa - tmpb) * qInv (mod p) */
#if defined(WOLFSSL_SP_MATH) || (defined(WOLFSSL_SP_MATH_ALL) && \
!defined(WOLFSSL_SP_INT_NEGATIVE))
if (ret == 0 && mp_submod(tmpa, tmpb, &key->p, tmp) != MP_OKAY)
ret = MP_SUB_E;
#else
if (ret == 0 && mp_sub(tmpa, tmpb, tmp) != MP_OKAY)
ret = MP_SUB_E;
#endif
if (ret == 0 && mp_mulmod(tmp, &key->u, &key->p,
tmp) != MP_OKAY)
@ -3751,8 +3770,11 @@ static int wc_CompareDiffPQ(mp_int* p, mp_int* q, int size)
if (ret == 0)
ret = mp_sub(p, q, &d);
#if !defined(WOLFSSL_SP_MATH) && (!defined(WOLFSSL_SP_MATH_ALL) || \
defined(WOLFSSL_SP_INT_NEGATIVE))
if (ret == 0)
ret = mp_abs(&d, &d);
#endif
/* compare */
if (ret == 0)

View File

@ -213,7 +213,8 @@ static int InitSha256(wc_Sha256* sha256)
/* Hardware Acceleration */
#if defined(HAVE_INTEL_AVX1) || defined(HAVE_INTEL_AVX2)
#if defined(USE_INTEL_SPEEDUP) && (defined(HAVE_INTEL_AVX1) || \
defined(HAVE_INTEL_AVX2))
/* in case intel instructions aren't available, plus we need the K[] global */
#define NEED_SOFT_SHA256
@ -981,7 +982,8 @@ static int InitSha256(wc_Sha256* sha256)
if (sha256->buffLen == WC_SHA256_BLOCK_SIZE) {
#if defined(LITTLE_ENDIAN_ORDER) && !defined(FREESCALE_MMCAU_SHA)
#if defined(HAVE_INTEL_AVX1) || defined(HAVE_INTEL_AVX2)
#if defined(USE_INTEL_SPEEDUP) && \
(defined(HAVE_INTEL_AVX1) || defined(HAVE_INTEL_AVX2))
if (!IS_INTEL_AVX1(intel_flags) && !IS_INTEL_AVX2(intel_flags))
#endif
{
@ -1013,7 +1015,8 @@ static int InitSha256(wc_Sha256* sha256)
/* process blocks */
#ifdef XTRANSFORM_LEN
#if defined(HAVE_INTEL_AVX1) || defined(HAVE_INTEL_AVX2)
#if defined(USE_INTEL_SPEEDUP) && \
(defined(HAVE_INTEL_AVX1) || defined(HAVE_INTEL_AVX2))
if (Transform_Sha256_Len_p != NULL)
#endif
{
@ -1028,11 +1031,13 @@ static int InitSha256(wc_Sha256* sha256)
len -= blocksLen;
}
}
#if defined(HAVE_INTEL_AVX1) || defined(HAVE_INTEL_AVX2)
#if defined(USE_INTEL_SPEEDUP) && \
(defined(HAVE_INTEL_AVX1) || defined(HAVE_INTEL_AVX2))
else
#endif
#endif /* XTRANSFORM_LEN */
#if !defined(XTRANSFORM_LEN) || defined(HAVE_INTEL_AVX1) || defined(HAVE_INTEL_AVX2)
#if !defined(XTRANSFORM_LEN) || (defined(USE_INTEL_SPEEDUP) && \
(defined(HAVE_INTEL_AVX1) || defined(HAVE_INTEL_AVX2)))
{
while (len >= WC_SHA256_BLOCK_SIZE) {
word32* local32 = sha256->buffer;
@ -1040,7 +1045,8 @@ static int InitSha256(wc_Sha256* sha256)
/* Intel transform function requires use of sha256->buffer */
/* Little Endian requires byte swap, so can't use data directly */
#if defined(WC_HASH_DATA_ALIGNMENT) && !defined(LITTLE_ENDIAN_ORDER) && \
!defined(HAVE_INTEL_AVX1) && !defined(HAVE_INTEL_AVX2)
!(defined(USE_INTEL_SPEEDUP) && \
(defined(HAVE_INTEL_AVX1) || defined(HAVE_INTEL_AVX2)))
if (((size_t)data % WC_HASH_DATA_ALIGNMENT) == 0) {
local32 = (word32*)data;
}
@ -1054,7 +1060,8 @@ static int InitSha256(wc_Sha256* sha256)
len -= WC_SHA256_BLOCK_SIZE;
#if defined(LITTLE_ENDIAN_ORDER) && !defined(FREESCALE_MMCAU_SHA)
#if defined(HAVE_INTEL_AVX1) || defined(HAVE_INTEL_AVX2)
#if defined(USE_INTEL_SPEEDUP) && \
(defined(HAVE_INTEL_AVX1) || defined(HAVE_INTEL_AVX2))
if (!IS_INTEL_AVX1(intel_flags) && !IS_INTEL_AVX2(intel_flags))
#endif
{
@ -1141,7 +1148,8 @@ static int InitSha256(wc_Sha256* sha256)
sha256->buffLen += WC_SHA256_BLOCK_SIZE - sha256->buffLen;
#if defined(LITTLE_ENDIAN_ORDER) && !defined(FREESCALE_MMCAU_SHA)
#if defined(HAVE_INTEL_AVX1) || defined(HAVE_INTEL_AVX2)
#if defined(USE_INTEL_SPEEDUP) && \
(defined(HAVE_INTEL_AVX1) || defined(HAVE_INTEL_AVX2))
if (!IS_INTEL_AVX1(intel_flags) && !IS_INTEL_AVX2(intel_flags))
#endif
{
@ -1178,7 +1186,8 @@ static int InitSha256(wc_Sha256* sha256)
/* store lengths */
#if defined(LITTLE_ENDIAN_ORDER) && !defined(FREESCALE_MMCAU_SHA)
#if defined(HAVE_INTEL_AVX1) || defined(HAVE_INTEL_AVX2)
#if defined(USE_INTEL_SPEEDUP) && \
(defined(HAVE_INTEL_AVX1) || defined(HAVE_INTEL_AVX2))
if (!IS_INTEL_AVX1(intel_flags) && !IS_INTEL_AVX2(intel_flags))
#endif
{
@ -1191,10 +1200,11 @@ static int InitSha256(wc_Sha256* sha256)
XMEMCPY(&local[WC_SHA256_PAD_SIZE + sizeof(word32)], &sha256->loLen,
sizeof(word32));
#if defined(FREESCALE_MMCAU_SHA) || defined(HAVE_INTEL_AVX1) || \
defined(HAVE_INTEL_AVX2)
#if defined(FREESCALE_MMCAU_SHA) || (defined(USE_INTEL_SPEEDUP) && \
(defined(HAVE_INTEL_AVX1) || defined(HAVE_INTEL_AVX2)))
/* Kinetis requires only these bytes reversed */
#if defined(HAVE_INTEL_AVX1) || defined(HAVE_INTEL_AVX2)
#if defined(USE_INTEL_SPEEDUP) && \
(defined(HAVE_INTEL_AVX1) || defined(HAVE_INTEL_AVX2))
if (IS_INTEL_AVX1(intel_flags) || IS_INTEL_AVX2(intel_flags))
#endif
{
@ -1374,7 +1384,8 @@ static int InitSha256(wc_Sha256* sha256)
sha224->loLen = 0;
sha224->hiLen = 0;
#if defined(HAVE_INTEL_AVX1)|| defined(HAVE_INTEL_AVX2)
#if defined(USE_INTEL_SPEEDUP) && \
(defined(HAVE_INTEL_AVX1) || defined(HAVE_INTEL_AVX2))
/* choose best Transform function under this runtime environment */
Sha256_SetTransform();
#endif

File diff suppressed because it is too large Load Diff

View File

@ -696,7 +696,7 @@ int wc_SrpComputeKey(Srp* srp, byte* clientPubKey, word32 clientPubKeySz,
if (!r) r = mp_read_unsigned_bin(&temp2, serverPubKey, serverPubKeySz);
if (!r) r = mp_iszero(&temp2) == MP_YES ? SRP_BAD_KEY_E : 0;
if (!r) r = mp_cmp(&temp2, &srp->N) != MP_LT ? SRP_BAD_KEY_E : 0;
if (!r) r = mp_sub(&temp2, &s, &temp1);
if (!r) r = mp_submod(&temp2, &s, &srp->N, &temp1);
/* temp2 = a + u * x */
if (!r) r = mp_mulmod(&u, &srp->auth, &srp->N, &s);

View File

@ -86,19 +86,19 @@ WOLFSSL_LOCAL int sp_ModExp_4096(mp_int* base, mp_int* exp, mp_int* mod,
#endif
#ifndef WOLFSSL_SP_MATH
#if !defined(WOLFSSL_SP_MATH) && !defined(WOLFSSL_SP_MATH_ALL)
/* math settings check */
word32 CheckRunTimeSettings(void)
{
return CTC_SETTINGS;
}
#endif
/* math settings size check */
word32 CheckRunTimeFastMath(void)
{
return FP_SIZE;
}
#endif
/* Functions */
@ -2790,7 +2790,7 @@ int fp_exptmod_ex(fp_int * G, fp_int * X, int digits, fp_int * P, fp_int * Y)
#endif
if (fp_iszero(G)) {
fp_set(G, 0);
fp_set(Y, 0);
return FP_OKAY;
}
@ -3557,14 +3557,15 @@ int fp_read_unsigned_bin(fp_int *a, const unsigned char *b, int c)
b += excess;
}
/* If we know the endianness of this architecture, and we're using
32-bit fp_digits, we can optimize this */
#if (defined(LITTLE_ENDIAN_ORDER) || defined(BIG_ENDIAN_ORDER)) && \
defined(FP_32BIT)
/* But not for both simultaneously */
/* Not both endian simultaneously */
#if defined(LITTLE_ENDIAN_ORDER) && defined(BIG_ENDIAN_ORDER)
#error Both LITTLE_ENDIAN_ORDER and BIG_ENDIAN_ORDER defined.
#endif
#if (defined(LITTLE_ENDIAN_ORDER) || defined(BIG_ENDIAN_ORDER))
#ifdef FP_32BIT
/* If we know the endianness of this architecture, and we're using
32-bit fp_digits, we can optimize this */
{
unsigned char *pd = (unsigned char *)a->dp;
@ -3575,10 +3576,10 @@ int fp_read_unsigned_bin(fp_int *a, const unsigned char *b, int c)
/* Use Duff's device to unroll the loop. */
int idx = (c - 1) & ~3;
switch (c % 4) {
case 0: do { pd[idx+0] = *b++; // fallthrough
case 3: pd[idx+1] = *b++; // fallthrough
case 2: pd[idx+2] = *b++; // fallthrough
case 1: pd[idx+3] = *b++; // fallthrough
case 0: do { pd[idx+0] = *b++; FALL_THROUGH;
case 3: pd[idx+1] = *b++; FALL_THROUGH;
case 2: pd[idx+2] = *b++; FALL_THROUGH;
case 1: pd[idx+3] = *b++;
idx -= 4;
} while ((c -= 4) > 0);
}
@ -3589,6 +3590,38 @@ int fp_read_unsigned_bin(fp_int *a, const unsigned char *b, int c)
}
#endif
}
#elif defined(FP_64BIT)
/* If we know the endianness of this architecture, and we're using
64-bit fp_digits, we can optimize this */
{
unsigned char *pd = (unsigned char *)a->dp;
a->used = (c + sizeof(fp_digit) - 1)/sizeof(fp_digit);
/* read the bytes in */
#ifdef BIG_ENDIAN_ORDER
{
/* Use Duff's device to unroll the loop. */
int idx = (c - 1) & ~7;
switch (c % 8) {
case 0: do { pd[idx+0] = *b++; FALL_THROUGH;
case 7: pd[idx+1] = *b++; FALL_THROUGH;
case 6: pd[idx+2] = *b++; FALL_THROUGH;
case 5: pd[idx+3] = *b++; FALL_THROUGH;
case 4: pd[idx+4] = *b++; FALL_THROUGH;
case 3: pd[idx+5] = *b++; FALL_THROUGH;
case 2: pd[idx+6] = *b++; FALL_THROUGH;
case 1: pd[idx+7] = *b++;
idx -= 8;
} while ((c -= 8) > 0);
}
}
#else
for (c -= 1; c >= 0; c -= 1) {
pd[c] = *b++;
}
#endif
}
#endif
#else
/* read the bytes in */
for (; c > 0; c--) {
@ -4721,21 +4754,21 @@ static int fp_prime_miller_rabin_ex(fp_int * a, fp_int * b, int *result,
#if (defined(WOLFSSL_HAVE_SP_RSA) && !defined(WOLFSSL_RSA_PUBLIC_ONLY)) || \
defined(WOLFSSL_HAVE_SP_DH)
#ifndef WOLFSSL_SP_NO_2048
if (fp_count_bits(a) == 1024)
if (fp_count_bits(a) == 1024 && fp_isodd(a))
sp_ModExp_1024(b, r, a, y);
else if (fp_count_bits(a) == 2048)
else if (fp_count_bits(a) == 2048 && fp_isodd(a))
sp_ModExp_2048(b, r, a, y);
else
#endif
#ifndef WOLFSSL_SP_NO_3072
if (fp_count_bits(a) == 1536)
if (fp_count_bits(a) == 1536 && fp_isodd(a))
sp_ModExp_1536(b, r, a, y);
else if (fp_count_bits(a) == 3072)
else if (fp_count_bits(a) == 3072 && fp_isodd(a))
sp_ModExp_3072(b, r, a, y);
else
#endif
#ifdef WOLFSSL_SP_4096
if (fp_count_bits(a) == 4096)
if (fp_count_bits(a) == 4096 && fp_isodd(a))
sp_ModExp_4096(b, r, a, y);
else
#endif
@ -5401,6 +5434,9 @@ static int fp_read_radix(fp_int *a, const char *str, int radix)
break;
}
}
if (y >= radix) {
return FP_VAL;
}
/* if the char was found in the map
* and is less than the given radix add it
@ -5520,7 +5556,12 @@ int mp_radix_size (mp_int *a, int radix, int *size)
}
if (fp_iszero(a) == MP_YES) {
*size = 2;
#ifndef WC_DISABLE_RADIX_ZERO_PAD
if (radix == 16)
*size = 3;
else
#endif
*size = 2;
return FP_OKAY;
}
@ -5591,6 +5632,10 @@ int mp_toradix (mp_int *a, char *str, int radix)
/* quick out if its zero */
if (fp_iszero(a) == FP_YES) {
#ifndef WC_DISABLE_RADIX_ZERO_PAD
if (radix == 16)
*str++ = '0';
#endif
*str++ = '0';
*str = '\0';
return FP_OKAY;

View File

@ -71,7 +71,7 @@
#endif
#if !defined(WOLFSSL_SP_MATH)
#if (!defined(WOLFSSL_SP_MATH) && !defined(WOLFSSL_SP_MATH_ALL))
int get_digit_count(mp_int* a)
{
if (a == NULL)
@ -156,7 +156,7 @@ int mp_rand(mp_int* a, int digits, WC_RNG* rng)
ret = mp_set_bit(a, digits * DIGIT_BIT - 1);
}
#else
#if defined(WOLFSSL_SP_MATH)
#if defined(WOLFSSL_SP_MATH) || defined(WOLFSSL_SP_MATH_ALL)
if ((ret == MP_OKAY) && (digits > SP_INT_DIGITS))
#else
if ((ret == MP_OKAY) && (digits > FP_SIZE))

File diff suppressed because it is too large Load Diff

View File

@ -40,7 +40,7 @@
typedef struct WOLFSSL_BIGNUM {
int neg; /* openssh deference */
void *internal; /* our big num */
#ifdef WOLFSSL_SP_MATH
#if defined(WOLFSSL_SP_MATH) || defined(WOLFSSL_SP_MATH_ALL)
sp_int fp;
#elif defined(USE_FAST_MATH) && !defined(HAVE_WOLF_BIGINT)
fp_int fp;

View File

@ -60,6 +60,7 @@
WOLFSSL_API void cpuid_select_flags(word32 flags);
WOLFSSL_API void cpuid_set_flag(word32 flag);
WOLFSSL_API void cpuid_clear_flag(word32 flag);
#endif
#ifdef __cplusplus

View File

@ -33,7 +33,7 @@
may not be faster on all
*/
#include <wolfssl/wolfcrypt/types.h> /* will set MP_xxBIT if not default */
#ifdef WOLFSSL_SP_MATH
#if defined(WOLFSSL_SP_MATH) || defined(WOLFSSL_SP_MATH_ALL)
#include <wolfssl/wolfcrypt/sp_int.h>
#elif defined(USE_FAST_MATH)
#include <wolfssl/wolfcrypt/tfm.h>
@ -161,7 +161,7 @@ extern "C" {
#define MP_OKAY 0 /* ok result */
#define MP_MEM -2 /* out of mem */
#define MP_VAL -3 /* invalid input */
#define MP_NOT_INF -4 /* point not at infinity */
#define MP_NOT_INF -4 /* point not at infinity */
#define MP_RANGE MP_NOT_INF
#define MP_YES 1 /* yes response */

View File

@ -2137,8 +2137,8 @@ extern void uITRON4_free(void *p) ;
#ifndef USE_WOLF_STRTOK
#define USE_WOLF_STRTOK
#endif
#ifndef WOLFSSL_SP_MOD_WORD_RP
#define WOLFSSL_SP_MOD_WORD_RP
#ifndef WOLFSSL_SP_DIV_WORD_HALF
#define WOLFSSL_SP_DIV_WORD_HALF
#endif
#ifndef WOLFSSL_OLD_PRIME_CHECK
#define WOLFSSL_OLD_PRIME_CHECK
@ -2316,7 +2316,8 @@ extern void uITRON4_free(void *p) ;
#if defined(WOLFCRYPT_ONLY) && defined(NO_AES) && !defined(WOLFSSL_SHA384) && \
!defined(WOLFSSL_SHA512) && defined(WC_NO_RNG) && \
defined(WOLFSSL_SP_MATH) && defined(WOLFSSL_RSA_PUBLIC_ONLY)
(defined(WOLFSSL_SP_MATH) || defined(WOLFSSL_SP_MATH_ALL)) && \
defined(WOLFSSL_RSA_PUBLIC_ONLY)
#undef WOLFSSL_NO_FORCE_ZERO
#define WOLFSSL_NO_FORCE_ZERO
#endif

File diff suppressed because it is too large Load Diff