summaryrefslogtreecommitdiffstats
path: root/crypto/bn/bn_word.c
diff options
context:
space:
mode:
Diffstat (limited to 'crypto/bn/bn_word.c')
-rw-r--r--crypto/bn/bn_word.c9
1 files changed, 8 insertions, 1 deletions
diff --git a/crypto/bn/bn_word.c b/crypto/bn/bn_word.c
index 7aa2a33d2d..1bcb37e292 100644
--- a/crypto/bn/bn_word.c
+++ b/crypto/bn/bn_word.c
@@ -87,7 +87,7 @@ BN_ULONG BN_mod_word(const BIGNUM *a, BN_ULONG w)
BN_ULONG BN_div_word(BIGNUM *a, BN_ULONG w)
{
BN_ULONG ret = 0;
- int i;
+ int i, j;
bn_check_top(a);
w &= BN_MASK2;
@@ -98,6 +98,12 @@ BN_ULONG BN_div_word(BIGNUM *a, BN_ULONG w)
if (a->top == 0)
return 0;
+ /* normalize input (so bn_div_words doesn't complain) */
+ j = BN_BITS2 - BN_num_bits_word(w);
+ w <<= j;
+ if (!BN_lshift(a, a, j))
+ return 0;
+
for (i=a->top-1; i>=0; i--)
{
BN_ULONG l,d;
@@ -109,6 +115,7 @@ BN_ULONG BN_div_word(BIGNUM *a, BN_ULONG w)
}
if ((a->top > 0) && (a->d[a->top-1] == 0))
a->top--;
+ ret >>= j;
bn_check_top(a);
return(ret);
}