From ec132cd3f4cc6242ca0f0aeeba706f839bb22f37 Mon Sep 17 00:00:00 2001 From: David Garske Date: Tue, 12 Jun 2018 15:23:50 -0700 Subject: [PATCH] Fix fsanitize issue for `mp_rand`. --- wolfcrypt/src/wolfmath.c | 43 ++++++++++++++++++++++++---------------- 1 file changed, 26 insertions(+), 17 deletions(-) diff --git a/wolfcrypt/src/wolfmath.c b/wolfcrypt/src/wolfmath.c index ececf0133..0c81427d4 100644 --- a/wolfcrypt/src/wolfmath.c +++ b/wolfcrypt/src/wolfmath.c @@ -99,44 +99,53 @@ int get_rand_digit(WC_RNG* rng, mp_digit* d) #ifdef WC_RSA_BLINDING int mp_rand(mp_int* a, int digits, WC_RNG* rng) { - int ret; - mp_digit d; + int ret = 0; + DECLARE_VAR(d, mp_digit, 1, rng->heap); - if (rng == NULL) - return MISSING_RNG_E; + if (rng == NULL) { + ret = MISSING_RNG_E; goto exit; + } - if (a == NULL) - return BAD_FUNC_ARG; + if (a == NULL + #ifdef WOLFSSL_ASYNC_CRYPT + || d == NULL + #endif + ) { + ret = BAD_FUNC_ARG; goto exit; + } mp_zero(a); if (digits <= 0) { - return MP_OKAY; + ret = MP_OKAY; goto exit; } /* first place a random non-zero digit */ do { - ret = get_rand_digit(rng, &d); + ret = get_rand_digit(rng, d); if (ret != 0) { - return ret; + goto exit; } - } while (d == 0); + } while (*d == 0); - if ((ret = mp_add_d(a, d, a)) != MP_OKAY) { - return ret; + if ((ret = mp_add_d(a, *d, a)) != MP_OKAY) { + goto exit; } while (--digits > 0) { if ((ret = mp_lshd(a, 1)) != MP_OKAY) { - return ret; + goto exit; } - if ((ret = get_rand_digit(rng, &d)) != 0) { - return ret; + if ((ret = get_rand_digit(rng, d)) != 0) { + goto exit; } - if ((ret = mp_add_d(a, d, a)) != MP_OKAY) { - return ret; + if ((ret = mp_add_d(a, *d, a)) != MP_OKAY) { + goto exit; } } +exit: + FREE_VAR(d, rng->heap); + return ret; } #endif /* WC_RSA_BLINDING */