mirror of https://github.com/wolfSSL/wolfssl.git
Merge pull request #4187 from SparkiDev/sp_math_mod_red_fix
SP math: montgomery reduction edge casepull/4210/head
commit
6458a8cedd
|
@ -11896,10 +11896,12 @@ static int _sp_mont_red(sp_int* a, sp_int* m, sp_int_digit mp)
|
||||||
else if (m->used == 4) {
|
else if (m->used == 4) {
|
||||||
sp_int_digit l;
|
sp_int_digit l;
|
||||||
sp_int_digit h;
|
sp_int_digit h;
|
||||||
|
sp_int_digit o2;
|
||||||
|
|
||||||
l = 0;
|
l = 0;
|
||||||
h = 0;
|
h = 0;
|
||||||
o = 0;
|
o = 0;
|
||||||
|
o2 = 0;
|
||||||
for (i = 0; i < 4; i++) {
|
for (i = 0; i < 4; i++) {
|
||||||
mu = mp * a->dp[i];
|
mu = mp * a->dp[i];
|
||||||
if ((i == 3) && (mask != 0)) {
|
if ((i == 3) && (mask != 0)) {
|
||||||
|
@ -11919,15 +11921,17 @@ static int _sp_mont_red(sp_int* a, sp_int* m, sp_int_digit mp)
|
||||||
SP_ASM_MUL_ADD_NO(l, h, mu, m->dp[2]);
|
SP_ASM_MUL_ADD_NO(l, h, mu, m->dp[2]);
|
||||||
a->dp[i + 2] = l;
|
a->dp[i + 2] = l;
|
||||||
l = h;
|
l = h;
|
||||||
h = 0;
|
h = o2;
|
||||||
|
o2 = 0;
|
||||||
SP_ASM_ADDC_REG(l, h, o);
|
SP_ASM_ADDC_REG(l, h, o);
|
||||||
SP_ASM_ADDC(l, h, a->dp[i + 3]);
|
SP_ASM_ADDC(l, h, a->dp[i + 3]);
|
||||||
SP_ASM_MUL_ADD_NO(l, h, mu, m->dp[3]);
|
SP_ASM_MUL_ADD(l, h, o2, mu, m->dp[3]);
|
||||||
a->dp[i + 3] = l;
|
a->dp[i + 3] = l;
|
||||||
o = h;
|
o = h;
|
||||||
l = h;
|
l = h;
|
||||||
h = 0;
|
h = 0;
|
||||||
}
|
}
|
||||||
|
h = o2;
|
||||||
SP_ASM_ADDC(l, h, a->dp[7]);
|
SP_ASM_ADDC(l, h, a->dp[7]);
|
||||||
a->dp[7] = l;
|
a->dp[7] = l;
|
||||||
a->dp[8] = h;
|
a->dp[8] = h;
|
||||||
|
@ -11936,10 +11940,12 @@ static int _sp_mont_red(sp_int* a, sp_int* m, sp_int_digit mp)
|
||||||
else if (m->used == 6) {
|
else if (m->used == 6) {
|
||||||
sp_int_digit l;
|
sp_int_digit l;
|
||||||
sp_int_digit h;
|
sp_int_digit h;
|
||||||
|
sp_int_digit o2;
|
||||||
|
|
||||||
l = 0;
|
l = 0;
|
||||||
h = 0;
|
h = 0;
|
||||||
o = 0;
|
o = 0;
|
||||||
|
o2 = 0;
|
||||||
for (i = 0; i < 6; i++) {
|
for (i = 0; i < 6; i++) {
|
||||||
mu = mp * a->dp[i];
|
mu = mp * a->dp[i];
|
||||||
if ((i == 5) && (mask != 0)) {
|
if ((i == 5) && (mask != 0)) {
|
||||||
|
@ -11969,15 +11975,17 @@ static int _sp_mont_red(sp_int* a, sp_int* m, sp_int_digit mp)
|
||||||
SP_ASM_MUL_ADD_NO(l, h, mu, m->dp[4]);
|
SP_ASM_MUL_ADD_NO(l, h, mu, m->dp[4]);
|
||||||
a->dp[i + 4] = l;
|
a->dp[i + 4] = l;
|
||||||
l = h;
|
l = h;
|
||||||
h = 0;
|
h = o2;
|
||||||
|
o2 = 0;
|
||||||
SP_ASM_ADDC_REG(l, h, o);
|
SP_ASM_ADDC_REG(l, h, o);
|
||||||
SP_ASM_ADDC(l, h, a->dp[i + 5]);
|
SP_ASM_ADDC(l, h, a->dp[i + 5]);
|
||||||
SP_ASM_MUL_ADD_NO(l, h, mu, m->dp[5]);
|
SP_ASM_MUL_ADD(l, h, o2, mu, m->dp[5]);
|
||||||
a->dp[i + 5] = l;
|
a->dp[i + 5] = l;
|
||||||
o = h;
|
o = h;
|
||||||
l = h;
|
l = h;
|
||||||
h = 0;
|
h = 0;
|
||||||
}
|
}
|
||||||
|
h = o2;
|
||||||
SP_ASM_ADDC(l, h, a->dp[11]);
|
SP_ASM_ADDC(l, h, a->dp[11]);
|
||||||
a->dp[11] = l;
|
a->dp[11] = l;
|
||||||
a->dp[12] = h;
|
a->dp[12] = h;
|
||||||
|
|
|
@ -35851,6 +35851,7 @@ static int mp_test_mont(mp_int* a, mp_int* m, mp_int* n, mp_int* r, WC_RNG* rng)
|
||||||
0x01, 0x9f, 0x13, 0xbd,
|
0x01, 0x9f, 0x13, 0xbd,
|
||||||
0x1f, 0x13d, 0x45, 0x615
|
0x1f, 0x13d, 0x45, 0x615
|
||||||
};
|
};
|
||||||
|
int bits[] = { 256, 384, 2048, 3072 };
|
||||||
int i;
|
int i;
|
||||||
int j;
|
int j;
|
||||||
|
|
||||||
|
@ -35908,6 +35909,31 @@ static int mp_test_mont(mp_int* a, mp_int* m, mp_int* n, mp_int* r, WC_RNG* rng)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* Force carries. */
|
||||||
|
for (i = 0; i < (int)(sizeof(bits) / sizeof(*bits)); i++) {
|
||||||
|
/* a = 2^(bits*2) - 1 */
|
||||||
|
mp_zero(a);
|
||||||
|
mp_set_bit(a, bits[i] * 2);
|
||||||
|
mp_sub_d(a, 1, a);
|
||||||
|
/* m = 2^(bits) - 1 */
|
||||||
|
mp_zero(m);
|
||||||
|
mp_set_bit(m, bits[i]);
|
||||||
|
mp_sub_d(m, 1, m);
|
||||||
|
mp = 1;
|
||||||
|
/* result = r = 2^(bits) - 1 */
|
||||||
|
mp_zero(r);
|
||||||
|
mp_set_bit(r, bits[i]);
|
||||||
|
mp_sub_d(r, 1, r);
|
||||||
|
|
||||||
|
ret = mp_montgomery_reduce(a, m, mp);
|
||||||
|
if (ret != MP_OKAY)
|
||||||
|
return -13240;
|
||||||
|
|
||||||
|
/* Result is m or 0 if reduced to range of modulus. */
|
||||||
|
if (mp_cmp(a, r) != MP_EQ && mp_iszero(a) != MP_YES)
|
||||||
|
return -13241;
|
||||||
|
}
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
Loading…
Reference in New Issue