Fix for SP ASM arm and no DH
Fix mod exp in ARM asm to work for different size exponents. In ASM code, mont_norm is not used in RSA so protect from no DH.
This commit is contained in:
@@ -2804,6 +2804,10 @@ static int sp_2048_mod_exp_16(sp_digit* r, sp_digit* a, sp_digit* e,
|
||||
|
||||
sp_2048_mont_mul_16(r, r, t[y], m, mp);
|
||||
}
|
||||
y = e[0] & ((1 << c) - 1);
|
||||
for (; c > 0; c--)
|
||||
sp_2048_mont_sqr_16(r, r, m, mp);
|
||||
sp_2048_mont_mul_16(r, r, t[y], m, mp);
|
||||
|
||||
XMEMSET(&r[16], 0, sizeof(sp_digit) * 16);
|
||||
sp_2048_mont_reduce_16(r, m, mp);
|
||||
@@ -2944,11 +2948,9 @@ static int sp_2048_mod_exp_16(sp_digit* r, sp_digit* a, sp_digit* e,
|
||||
|
||||
sp_2048_mont_mul_16(r, r, t[y], m, mp);
|
||||
}
|
||||
y = e[0] & 0xf;
|
||||
sp_2048_mont_sqr_16(r, r, m, mp);
|
||||
sp_2048_mont_sqr_16(r, r, m, mp);
|
||||
sp_2048_mont_sqr_16(r, r, m, mp);
|
||||
sp_2048_mont_sqr_16(r, r, m, mp);
|
||||
y = e[0] & ((1 << c) - 1);
|
||||
for (; c > 0; c--)
|
||||
sp_2048_mont_sqr_16(r, r, m, mp);
|
||||
sp_2048_mont_mul_16(r, r, t[y], m, mp);
|
||||
|
||||
XMEMSET(&r[16], 0, sizeof(sp_digit) * 16);
|
||||
@@ -2969,6 +2971,7 @@ static int sp_2048_mod_exp_16(sp_digit* r, sp_digit* a, sp_digit* e,
|
||||
|
||||
#endif /* !SP_RSA_PRIVATE_EXP_D && WOLFSSL_HAVE_SP_RSA */
|
||||
|
||||
#ifdef WOLFSSL_HAVE_SP_DH
|
||||
/* r = 2^n mod m where n is the number of bits to reduce by.
|
||||
* Given m must be 2048 bits, just need to subtract.
|
||||
*
|
||||
@@ -2983,6 +2986,7 @@ static void sp_2048_mont_norm_32(sp_digit* r, sp_digit* m)
|
||||
sp_2048_sub_in_place_32(r, m);
|
||||
}
|
||||
|
||||
#endif /* WOLFSSL_HAVE_SP_DH */
|
||||
/* Conditionally subtract b from a using the mask m.
|
||||
* m is -1 to subtract and 0 when not copying.
|
||||
*
|
||||
@@ -4496,6 +4500,10 @@ static int sp_2048_mod_exp_32(sp_digit* r, sp_digit* a, sp_digit* e,
|
||||
|
||||
sp_2048_mont_mul_32(r, r, t[y], m, mp);
|
||||
}
|
||||
y = e[0] & ((1 << c) - 1);
|
||||
for (; c > 0; c--)
|
||||
sp_2048_mont_sqr_32(r, r, m, mp);
|
||||
sp_2048_mont_mul_32(r, r, t[y], m, mp);
|
||||
|
||||
XMEMSET(&r[32], 0, sizeof(sp_digit) * 32);
|
||||
sp_2048_mont_reduce_32(r, m, mp);
|
||||
@@ -4636,10 +4644,9 @@ static int sp_2048_mod_exp_32(sp_digit* r, sp_digit* a, sp_digit* e,
|
||||
|
||||
sp_2048_mont_mul_32(r, r, t[y], m, mp);
|
||||
}
|
||||
y = e[0] & 0x7;
|
||||
sp_2048_mont_sqr_32(r, r, m, mp);
|
||||
sp_2048_mont_sqr_32(r, r, m, mp);
|
||||
sp_2048_mont_sqr_32(r, r, m, mp);
|
||||
y = e[0] & ((1 << c) - 1);
|
||||
for (; c > 0; c--)
|
||||
sp_2048_mont_sqr_32(r, r, m, mp);
|
||||
sp_2048_mont_mul_32(r, r, t[y], m, mp);
|
||||
|
||||
XMEMSET(&r[32], 0, sizeof(sp_digit) * 32);
|
||||
@@ -9276,6 +9283,10 @@ static int sp_3072_mod_exp_24(sp_digit* r, sp_digit* a, sp_digit* e,
|
||||
|
||||
sp_3072_mont_mul_24(r, r, t[y], m, mp);
|
||||
}
|
||||
y = e[0] & ((1 << c) - 1);
|
||||
for (; c > 0; c--)
|
||||
sp_3072_mont_sqr_24(r, r, m, mp);
|
||||
sp_3072_mont_mul_24(r, r, t[y], m, mp);
|
||||
|
||||
XMEMSET(&r[24], 0, sizeof(sp_digit) * 24);
|
||||
sp_3072_mont_reduce_24(r, m, mp);
|
||||
@@ -9416,8 +9427,9 @@ static int sp_3072_mod_exp_24(sp_digit* r, sp_digit* a, sp_digit* e,
|
||||
|
||||
sp_3072_mont_mul_24(r, r, t[y], m, mp);
|
||||
}
|
||||
y = e[0] & 0x1;
|
||||
sp_3072_mont_sqr_24(r, r, m, mp);
|
||||
y = e[0] & ((1 << c) - 1);
|
||||
for (; c > 0; c--)
|
||||
sp_3072_mont_sqr_24(r, r, m, mp);
|
||||
sp_3072_mont_mul_24(r, r, t[y], m, mp);
|
||||
|
||||
XMEMSET(&r[24], 0, sizeof(sp_digit) * 24);
|
||||
@@ -9438,6 +9450,7 @@ static int sp_3072_mod_exp_24(sp_digit* r, sp_digit* a, sp_digit* e,
|
||||
|
||||
#endif /* !SP_RSA_PRIVATE_EXP_D && WOLFSSL_HAVE_SP_RSA */
|
||||
|
||||
#ifdef WOLFSSL_HAVE_SP_DH
|
||||
/* r = 2^n mod m where n is the number of bits to reduce by.
|
||||
* Given m must be 3072 bits, just need to subtract.
|
||||
*
|
||||
@@ -9452,6 +9465,7 @@ static void sp_3072_mont_norm_48(sp_digit* r, sp_digit* m)
|
||||
sp_3072_sub_in_place_48(r, m);
|
||||
}
|
||||
|
||||
#endif /* WOLFSSL_HAVE_SP_DH */
|
||||
/* Conditionally subtract b from a using the mask m.
|
||||
* m is -1 to subtract and 0 when not copying.
|
||||
*
|
||||
@@ -11477,6 +11491,10 @@ static int sp_3072_mod_exp_48(sp_digit* r, sp_digit* a, sp_digit* e,
|
||||
|
||||
sp_3072_mont_mul_48(r, r, t[y], m, mp);
|
||||
}
|
||||
y = e[0] & ((1 << c) - 1);
|
||||
for (; c > 0; c--)
|
||||
sp_3072_mont_sqr_48(r, r, m, mp);
|
||||
sp_3072_mont_mul_48(r, r, t[y], m, mp);
|
||||
|
||||
XMEMSET(&r[48], 0, sizeof(sp_digit) * 48);
|
||||
sp_3072_mont_reduce_48(r, m, mp);
|
||||
@@ -11617,9 +11635,9 @@ static int sp_3072_mod_exp_48(sp_digit* r, sp_digit* a, sp_digit* e,
|
||||
|
||||
sp_3072_mont_mul_48(r, r, t[y], m, mp);
|
||||
}
|
||||
y = e[0] & 0x3;
|
||||
sp_3072_mont_sqr_48(r, r, m, mp);
|
||||
sp_3072_mont_sqr_48(r, r, m, mp);
|
||||
y = e[0] & ((1 << c) - 1);
|
||||
for (; c > 0; c--)
|
||||
sp_3072_mont_sqr_48(r, r, m, mp);
|
||||
sp_3072_mont_mul_48(r, r, t[y], m, mp);
|
||||
|
||||
XMEMSET(&r[48], 0, sizeof(sp_digit) * 48);
|
||||
@@ -28915,7 +28933,7 @@ int sp_ecc_sign_256(const byte* hash, word32 hashLen, WC_RNG* rng, mp_int* priv,
|
||||
mp_int* rm, mp_int* sm, void* heap)
|
||||
{
|
||||
#if defined(WOLFSSL_SP_SMALL) || defined(WOLFSSL_SMALL_STACK)
|
||||
sp_digit* d;
|
||||
sp_digit* d = NULL;
|
||||
#else
|
||||
sp_digit ed[2*4];
|
||||
sp_digit xd[2*4];
|
||||
|
||||
Reference in New Issue
Block a user