BN_CTX-related fixes.
authorBodo Möller <bodo@openssl.org>
Wed, 8 Nov 2000 10:05:34 +0000 (10:05 +0000)
committerBodo Möller <bodo@openssl.org>
Wed, 8 Nov 2000 10:05:34 +0000 (10:05 +0000)
CHANGES
crypto/bn/bn.h
crypto/bn/bn_ctx.c
crypto/bn/bn_div.c

diff --git a/CHANGES b/CHANGES
index 8e53374d03371ca06d30532e870ff90226824b5f..df8d4b19da6befc748212324ff60dcda17b3bbf4 100644 (file)
--- a/CHANGES
+++ b/CHANGES
@@ -4,6 +4,10 @@
 
  Changes between 0.9.6 and 0.9.7  [xx XXX 2000]
 
+  *) Increase BN_CTX_NUM (the number of BIGNUMs in a BN_CTX) to 16.
+     The previous value, 12, was not always sufficient for BN_mod_exp().
+     [Bodo Moeller]
+
   *) Make DSO load along a path given through an environment variable
      (SHLIB_PATH) with shl_load().
      [Richard Levitte]
index dad488fafb6a876957d3dffd30b11cbe5063c112..b6e8b7c9a450e8a5a0185c68b7aca6cc1ff5f507 100644 (file)
@@ -239,7 +239,7 @@ typedef struct bignum_st
        } BIGNUM;
 
 /* Used for temp variables */
-#define BN_CTX_NUM     12
+#define BN_CTX_NUM     16
 #define BN_CTX_NUM_POS 12
 typedef struct bignum_ctx
        {
index b1a8d7571e83a23389ea0c2c8d6c34d9df72b55a..28b334fbd56f55a5731e20bb590239ba2d8d0431 100644 (file)
@@ -112,8 +112,14 @@ void BN_CTX_start(BN_CTX *ctx)
        ctx->depth++;
        }
 
+
 BIGNUM *BN_CTX_get(BN_CTX *ctx)
        {
+       /* Note: If BN_CTX_get is ever changed to allocate BIGNUMs dynamically,
+        * make sure that if BN_CTX_get fails once it will return NULL again
+        * until BN_CTX_end is called.  (This is so that callers have to check
+        * only the last return value.)
+        */
        if (ctx->depth > BN_CTX_NUM_POS || ctx->tos >= BN_CTX_NUM)
                {
                if (!ctx->too_many)
index c3772c243be575d8c321bc4f22fe3bc215008d59..999bba756cbf58a997d668aacde7fa8b9c0c16c7 100644 (file)
@@ -180,13 +180,13 @@ int BN_div(BIGNUM *dv, BIGNUM *rm, const BIGNUM *num, const BIGNUM *divisor,
 
        BN_CTX_start(ctx);
        tmp=BN_CTX_get(ctx);
-       tmp->neg=0;
        snum=BN_CTX_get(ctx);
        sdiv=BN_CTX_get(ctx);
        if (dv == NULL)
                res=BN_CTX_get(ctx);
        else    res=dv;
-       if (res == NULL) goto err;
+       if (sdiv == NULL || res == NULL) goto err;
+       tmp->neg=0;
 
        /* First we normalise the numbers */
        norm_shift=BN_BITS2-((BN_num_bits(divisor))%BN_BITS2);