From cf9056cfda3976fc53a630f9965b68569d656e27 Mon Sep 17 00:00:00 2001 From: Geoff Thorpe Date: Thu, 17 Jun 2004 20:03:56 +0000 Subject: [PATCH] BN_div_word() was breaking when called from BN_bn2dec() (actually, this is the only function that uses it) because it would trip up an assertion in bn_div_words() when first invoked. This also adds BN_div_word() testing to bntest. Submitted by: Nils Larsch Reviewed by: Geoff Thorpe --- crypto/bn/bn_word.c | 9 ++++++- crypto/bn/bntest.c | 61 +++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 69 insertions(+), 1 deletion(-) 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); } diff --git a/crypto/bn/bntest.c b/crypto/bn/bntest.c index 0d37dcff4d..d4cb92f847 100644 --- a/crypto/bn/bntest.c +++ b/crypto/bn/bntest.c @@ -98,6 +98,7 @@ int test_lshift(BIO *bp,BN_CTX *ctx,BIGNUM *a_); int test_rshift1(BIO *bp); int test_rshift(BIO *bp,BN_CTX *ctx); int test_div(BIO *bp,BN_CTX *ctx); +int test_div_word(BIO *bp); int test_div_recp(BIO *bp,BN_CTX *ctx); int test_mul(BIO *bp); int test_sqr(BIO *bp,BN_CTX *ctx); @@ -221,6 +222,10 @@ int main(int argc, char *argv[]) if (!test_div(out,ctx)) goto err; BIO_flush(out); + message(out,"BN_div_word"); + if (!test_div_word(out)) goto err; + BIO_flush(out); + message(out,"BN_div_recp"); if (!test_div_recp(out,ctx)) goto err; BIO_flush(out); @@ -463,6 +468,62 @@ int test_div(BIO *bp, BN_CTX *ctx) return(1); } +int test_div_word(BIO *bp) + { + BIGNUM a,b; + BN_ULONG r,s; + int i; + + BN_init(&a); + BN_init(&b); + + for (i=0; i