More changes coming out of the bignum auditing. BN_CTX_get() should ideally
[openssl.git] / crypto / bn / bn_ctx.c
index 34cc75c..9366ce6 100644 (file)
@@ -121,8 +121,11 @@ void BN_CTX_free(BN_CTX *ctx)
        if (ctx == NULL) return;
        assert(ctx->depth == 0);
 
-       for (i=0; i < BN_CTX_NUM; i++)
-               BN_clear_free(&(ctx->bn[i]));
+       for (i=0; i < BN_CTX_NUM; i++) {
+               bn_check_top(&(ctx->bn[i]));
+               if (ctx->bn[i].d)
+                       BN_clear_free(&(ctx->bn[i]));
+       }
        if (ctx->flags & BN_FLG_MALLOCED)
                OPENSSL_free(ctx);
        }
@@ -152,6 +155,8 @@ BIGNUM *BN_CTX_get(BN_CTX *ctx)
                        }
                return NULL;
                }
+       /* always return a 'zeroed' bignum */
+       ctx->bn[ctx->tos].top = 0;
        return (&(ctx->bn[ctx->tos++]));
        }
 
@@ -168,5 +173,10 @@ void BN_CTX_end(BN_CTX *ctx)
        ctx->too_many = 0;
        ctx->depth--;
        if (ctx->depth < BN_CTX_NUM_POS)
+#ifndef BN_DEBUG
                ctx->tos = ctx->pos[ctx->depth];
+#else
+               while(ctx->tos > ctx->pos[ctx->depth])
+                       bn_check_top(&ctx->bn[--(ctx->tos)]);
+#endif
        }