mirror of
https://github.com/wolfSSL/wolfssl.git
synced 2025-08-01 03:34:39 +02:00
DH base 2 impl - better error handling
This commit is contained in:
@@ -2251,14 +2251,18 @@ int mp_exptmod_base_2(mp_int * X, mp_int * P, mp_int * Y)
|
|||||||
|
|
||||||
/* now setup montgomery */
|
/* now setup montgomery */
|
||||||
if ((err = mp_montgomery_setup(P, &mp)) != MP_OKAY) {
|
if ((err = mp_montgomery_setup(P, &mp)) != MP_OKAY) {
|
||||||
return err;
|
goto LBL_M;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* setup result */
|
/* setup result */
|
||||||
mp_init(res);
|
if ((err = mp_init(res)) != MP_OKAY) {
|
||||||
|
goto LBL_M;
|
||||||
|
}
|
||||||
|
|
||||||
/* now we need R mod m */
|
/* now we need R mod m */
|
||||||
mp_montgomery_calc_normalization(res, P);
|
if ((err = mp_montgomery_calc_normalization(res, P)) != MP_OKAY) {
|
||||||
|
goto LBL_RES;
|
||||||
|
}
|
||||||
|
|
||||||
/* Get the top bits left over after taking WINSIZE bits starting at the
|
/* Get the top bits left over after taking WINSIZE bits starting at the
|
||||||
* least-significant.
|
* least-significant.
|
||||||
@@ -2270,8 +2274,14 @@ int mp_exptmod_base_2(mp_int * X, mp_int * P, mp_int * Y)
|
|||||||
buf = X->dp[digidx--];
|
buf = X->dp[digidx--];
|
||||||
bitbuf = (int)(buf >> bitcnt);
|
bitbuf = (int)(buf >> bitcnt);
|
||||||
/* Multiply montgomery representation of 1 by 2 ^ top */
|
/* Multiply montgomery representation of 1 by 2 ^ top */
|
||||||
mp_mul_2d(res, bitbuf, res);
|
err = mp_mul_2d(res, bitbuf, res);
|
||||||
mp_mod(res, P, res);
|
if (err != MP_OKAY) {
|
||||||
|
goto LBL_RES;
|
||||||
|
}
|
||||||
|
err = mp_mod(res, P, res);
|
||||||
|
if (err != MP_OKAY) {
|
||||||
|
goto LBL_RES;
|
||||||
|
}
|
||||||
/* Move out bits used */
|
/* Move out bits used */
|
||||||
buf <<= bitcpy;
|
buf <<= bitcpy;
|
||||||
bitcnt++;
|
bitcnt++;
|
||||||
@@ -2309,28 +2319,22 @@ int mp_exptmod_base_2(mp_int * X, mp_int * P, mp_int * Y)
|
|||||||
for (x = 0; x < WINSIZE; x++) {
|
for (x = 0; x < WINSIZE; x++) {
|
||||||
err = mp_sqr(res, res);
|
err = mp_sqr(res, res);
|
||||||
if (err != MP_OKAY) {
|
if (err != MP_OKAY) {
|
||||||
#ifdef WOLFSSL_SMALL_STACK
|
goto LBL_RES;
|
||||||
XFREE(res, NULL, DYNAMIC_TYPE_TMP_BUFFER);
|
|
||||||
#endif
|
|
||||||
return err;
|
|
||||||
}
|
}
|
||||||
err = (*redux)(res, P, mp);
|
err = (*redux)(res, P, mp);
|
||||||
if (err != MP_OKAY) {
|
if (err != MP_OKAY) {
|
||||||
#ifdef WOLFSSL_SMALL_STACK
|
goto LBL_RES;
|
||||||
XFREE(res, NULL, DYNAMIC_TYPE_TMP_BUFFER);
|
|
||||||
#endif
|
|
||||||
return err;
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/* then multiply by 2^bitbuf */
|
/* then multiply by 2^bitbuf */
|
||||||
mp_mul_2d(res, bitbuf, res);
|
err = mp_mul_2d(res, bitbuf, res);
|
||||||
|
if (err != MP_OKAY) {
|
||||||
|
goto LBL_RES;
|
||||||
|
}
|
||||||
err = mp_mod(res, P, res);
|
err = mp_mod(res, P, res);
|
||||||
if (err != MP_OKAY) {
|
if (err != MP_OKAY) {
|
||||||
#ifdef WOLFSSL_SMALL_STACK
|
goto LBL_RES;
|
||||||
XFREE(res, NULL, DYNAMIC_TYPE_TMP_BUFFER);
|
|
||||||
#endif
|
|
||||||
return err;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/* empty window and reset */
|
/* empty window and reset */
|
||||||
@@ -2346,10 +2350,15 @@ int mp_exptmod_base_2(mp_int * X, mp_int * P, mp_int * Y)
|
|||||||
* of R.
|
* of R.
|
||||||
*/
|
*/
|
||||||
err = (*redux)(res, P, mp);
|
err = (*redux)(res, P, mp);
|
||||||
|
if (err != MP_OKAY) {
|
||||||
|
goto LBL_RES;
|
||||||
|
}
|
||||||
|
|
||||||
/* swap res with Y */
|
/* swap res with Y */
|
||||||
mp_copy(res, Y);
|
mp_copy(res, Y);
|
||||||
|
|
||||||
|
LBL_RES:mp_clear (res);
|
||||||
|
LBL_M:
|
||||||
#ifdef WOLFSSL_SMALL_STACK
|
#ifdef WOLFSSL_SMALL_STACK
|
||||||
XFREE(res, NULL, DYNAMIC_TYPE_TMP_BUFFER);
|
XFREE(res, NULL, DYNAMIC_TYPE_TMP_BUFFER);
|
||||||
#endif
|
#endif
|
||||||
|
@@ -1895,6 +1895,9 @@ static int _fp_exptmod_base_2(fp_int * X, int digits, fp_int * P,
|
|||||||
|
|
||||||
/* now setup montgomery */
|
/* now setup montgomery */
|
||||||
if ((err = fp_montgomery_setup(P, &mp)) != FP_OKAY) {
|
if ((err = fp_montgomery_setup(P, &mp)) != FP_OKAY) {
|
||||||
|
#ifdef WOLFSSL_SMALL_STACK
|
||||||
|
XFREE(res, NULL, DYNAMIC_TYPE_TMP_BUFFER);
|
||||||
|
#endif
|
||||||
return err;
|
return err;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Reference in New Issue
Block a user