diff options
Diffstat (limited to 'src/lib/libcrypto/bn/bn_div.c')
-rw-r--r-- | src/lib/libcrypto/bn/bn_div.c | 15 |
1 files changed, 13 insertions, 2 deletions
diff --git a/src/lib/libcrypto/bn/bn_div.c b/src/lib/libcrypto/bn/bn_div.c index 8655eb118e..1e8e57626b 100644 --- a/src/lib/libcrypto/bn/bn_div.c +++ b/src/lib/libcrypto/bn/bn_div.c | |||
@@ -187,6 +187,17 @@ int BN_div(BIGNUM *dv, BIGNUM *rm, const BIGNUM *num, const BIGNUM *divisor, | |||
187 | BN_ULONG d0,d1; | 187 | BN_ULONG d0,d1; |
188 | int num_n,div_n; | 188 | int num_n,div_n; |
189 | 189 | ||
190 | /* Invalid zero-padding would have particularly bad consequences | ||
191 | * in the case of 'num', so don't just rely on bn_check_top() for this one | ||
192 | * (bn_check_top() works only for BN_DEBUG builds) */ | ||
193 | if (num->top > 0 && num->d[num->top - 1] == 0) | ||
194 | { | ||
195 | BNerr(BN_F_BN_DIV,BN_R_NOT_INITIALIZED); | ||
196 | return 0; | ||
197 | } | ||
198 | |||
199 | bn_check_top(num); | ||
200 | |||
190 | if ((BN_get_flags(num, BN_FLG_CONSTTIME) != 0) || (BN_get_flags(divisor, BN_FLG_CONSTTIME) != 0)) | 201 | if ((BN_get_flags(num, BN_FLG_CONSTTIME) != 0) || (BN_get_flags(divisor, BN_FLG_CONSTTIME) != 0)) |
191 | { | 202 | { |
192 | return BN_div_no_branch(dv, rm, num, divisor, ctx); | 203 | return BN_div_no_branch(dv, rm, num, divisor, ctx); |
@@ -194,7 +205,7 @@ int BN_div(BIGNUM *dv, BIGNUM *rm, const BIGNUM *num, const BIGNUM *divisor, | |||
194 | 205 | ||
195 | bn_check_top(dv); | 206 | bn_check_top(dv); |
196 | bn_check_top(rm); | 207 | bn_check_top(rm); |
197 | bn_check_top(num); | 208 | /* bn_check_top(num); */ /* 'num' has been checked already */ |
198 | bn_check_top(divisor); | 209 | bn_check_top(divisor); |
199 | 210 | ||
200 | if (BN_is_zero(divisor)) | 211 | if (BN_is_zero(divisor)) |
@@ -419,7 +430,7 @@ static int BN_div_no_branch(BIGNUM *dv, BIGNUM *rm, const BIGNUM *num, | |||
419 | 430 | ||
420 | bn_check_top(dv); | 431 | bn_check_top(dv); |
421 | bn_check_top(rm); | 432 | bn_check_top(rm); |
422 | bn_check_top(num); | 433 | /* bn_check_top(num); */ /* 'num' has been checked in BN_div() */ |
423 | bn_check_top(divisor); | 434 | bn_check_top(divisor); |
424 | 435 | ||
425 | if (BN_is_zero(divisor)) | 436 | if (BN_is_zero(divisor)) |