mirror of
https://github.com/wolfSSL/wolfssl.git
synced 2025-07-30 02:37:28 +02:00
SP int: sp_invmod_div check div result before proceeding
This commit is contained in:
@ -11430,8 +11430,8 @@ static int _sp_invmod_div(sp_int* a, sp_int* m, sp_int* x, sp_int* y, sp_int* b,
|
|||||||
sp_int* c, sp_int* inv)
|
sp_int* c, sp_int* inv)
|
||||||
{
|
{
|
||||||
int err = MP_OKAY;
|
int err = MP_OKAY;
|
||||||
sp_int* d;
|
sp_int* d = NULL;
|
||||||
sp_int* r;
|
sp_int* r = NULL;
|
||||||
sp_int* s;
|
sp_int* s;
|
||||||
#ifndef WOLFSSL_SP_INT_NEGATIVE
|
#ifndef WOLFSSL_SP_INT_NEGATIVE
|
||||||
int bneg = 0;
|
int bneg = 0;
|
||||||
@ -11456,23 +11456,25 @@ static int _sp_invmod_div(sp_int* a, sp_int* m, sp_int* x, sp_int* y, sp_int* b,
|
|||||||
while ((err == MP_OKAY) && (!sp_isone(x)) && (!sp_iszero(x))) {
|
while ((err == MP_OKAY) && (!sp_isone(x)) && (!sp_iszero(x))) {
|
||||||
/* 2.1. d = x / y, r = x mod y */
|
/* 2.1. d = x / y, r = x mod y */
|
||||||
err = sp_div(x, y, d, r);
|
err = sp_div(x, y, d, r);
|
||||||
/* 2.2. c -= d * b */
|
if (err == MP_OKAY) {
|
||||||
if (sp_isone(d)) {
|
/* 2.2. c -= d * b */
|
||||||
/* c -= 1 * b */
|
if (sp_isone(d)) {
|
||||||
sp_sub(c, b, c);
|
/* c -= 1 * b */
|
||||||
}
|
sp_sub(c, b, c);
|
||||||
else {
|
|
||||||
/* d *= b */
|
|
||||||
err = sp_mul(d, b, d);
|
|
||||||
/* c -= d */
|
|
||||||
if (err == MP_OKAY) {
|
|
||||||
sp_sub(c, d, c);
|
|
||||||
}
|
}
|
||||||
|
else {
|
||||||
|
/* d *= b */
|
||||||
|
err = sp_mul(d, b, d);
|
||||||
|
/* c -= d */
|
||||||
|
if (err == MP_OKAY) {
|
||||||
|
sp_sub(c, d, c);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
/* 2.3. x = y, y = r */
|
||||||
|
s = x; x = y; y = r; r = s;
|
||||||
|
/* 2.4. s = b, b = c, c = s */
|
||||||
|
s = b; b = c; c = s;
|
||||||
}
|
}
|
||||||
/* 2.3. x = y, y = r */
|
|
||||||
s = x; x = y; y = r; r = s;
|
|
||||||
/* 2.4. s = b, b = c, c = s */
|
|
||||||
s = b; b = c; c = s;
|
|
||||||
}
|
}
|
||||||
/* 3. If y != 0 then NO_INVERSE */
|
/* 3. If y != 0 then NO_INVERSE */
|
||||||
if ((err == MP_OKAY) && (!sp_iszero(y))) {
|
if ((err == MP_OKAY) && (!sp_iszero(y))) {
|
||||||
@ -11491,46 +11493,49 @@ static int _sp_invmod_div(sp_int* a, sp_int* m, sp_int* x, sp_int* y, sp_int* b,
|
|||||||
while ((err == MP_OKAY) && (!sp_isone(x)) && (!sp_iszero(x))) {
|
while ((err == MP_OKAY) && (!sp_isone(x)) && (!sp_iszero(x))) {
|
||||||
/* 2.1. d = x / y, r = x mod y */
|
/* 2.1. d = x / y, r = x mod y */
|
||||||
err = sp_div(x, y, d, r);
|
err = sp_div(x, y, d, r);
|
||||||
if (sp_isone(d)) {
|
if (err == MP_OKAY) {
|
||||||
/* c -= 1 * b */
|
if (sp_isone(d)) {
|
||||||
if ((bneg ^ cneg) == 1) {
|
/* c -= 1 * b */
|
||||||
/* c -= -b or -c -= b, therefore add. */
|
|
||||||
_sp_add_off(c, b, c, 0);
|
|
||||||
}
|
|
||||||
else if (_sp_cmp_abs(c, b) == MP_LT) {
|
|
||||||
/* |c| < |b| and same sign, reverse subtract and negate. */
|
|
||||||
_sp_sub_off(b, c, c, 0);
|
|
||||||
cneg = !cneg;
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
/* |c| >= |b| */
|
|
||||||
_sp_sub_off(c, b, c, 0);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
/* d *= b */
|
|
||||||
err = sp_mul(d, b, d);
|
|
||||||
/* c -= d */
|
|
||||||
if (err == MP_OKAY) {
|
|
||||||
if ((bneg ^ cneg) == 1) {
|
if ((bneg ^ cneg) == 1) {
|
||||||
/* c -= -d or -c -= d, therefore add. */
|
/* c -= -b or -c -= b, therefore add. */
|
||||||
_sp_add_off(c, d, c, 0);
|
_sp_add_off(c, b, c, 0);
|
||||||
}
|
}
|
||||||
else if (_sp_cmp_abs(c, d) == MP_LT) {
|
else if (_sp_cmp_abs(c, b) == MP_LT) {
|
||||||
/* |c| < |d| and same sign, reverse subtract and negate. */
|
/* |c| < |b| and same sign, reverse subtract and negate. */
|
||||||
_sp_sub_off(d, c, c, 0);
|
_sp_sub_off(b, c, c, 0);
|
||||||
cneg = !cneg;
|
cneg = !cneg;
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
_sp_sub_off(c, d, c, 0);
|
/* |c| >= |b| */
|
||||||
|
_sp_sub_off(c, b, c, 0);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
else {
|
||||||
|
/* d *= b */
|
||||||
|
err = sp_mul(d, b, d);
|
||||||
|
/* c -= d */
|
||||||
|
if (err == MP_OKAY) {
|
||||||
|
if ((bneg ^ cneg) == 1) {
|
||||||
|
/* c -= -d or -c -= d, therefore add. */
|
||||||
|
_sp_add_off(c, d, c, 0);
|
||||||
|
}
|
||||||
|
else if (_sp_cmp_abs(c, d) == MP_LT) {
|
||||||
|
/* |c| < |d| and same sign, reverse subtract and negate.
|
||||||
|
*/
|
||||||
|
_sp_sub_off(d, c, c, 0);
|
||||||
|
cneg = !cneg;
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
_sp_sub_off(c, d, c, 0);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
/* 2.3. x = y, y = r */
|
||||||
|
s = x; x = y; y = r; r = s;
|
||||||
|
/* 2.4. s = b, b = c, c = s */
|
||||||
|
s = b; b = c; c = s;
|
||||||
|
neg = bneg; bneg = cneg; cneg = neg;
|
||||||
}
|
}
|
||||||
/* 2.3. x = y, y = r */
|
|
||||||
s = x; x = y; y = r; r = s;
|
|
||||||
/* 2.4. s = b, b = c, c = s */
|
|
||||||
s = b; b = c; c = s;
|
|
||||||
neg = bneg; bneg = cneg; cneg = neg;
|
|
||||||
}
|
}
|
||||||
/* 3. If y != 0 then NO_INVERSE */
|
/* 3. If y != 0 then NO_INVERSE */
|
||||||
if ((err == MP_OKAY) && (!sp_iszero(y))) {
|
if ((err == MP_OKAY) && (!sp_iszero(y))) {
|
||||||
|
Reference in New Issue
Block a user