提交 7f7b8d68 编写于 作者: B Bodo Möller

BN_CTX-related fixes.

上级 bb7e632a
...@@ -4,6 +4,10 @@ ...@@ -4,6 +4,10 @@
Changes between 0.9.6 and 0.9.7 [xx XXX 2000] 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 *) Make DSO load along a path given through an environment variable
(SHLIB_PATH) with shl_load(). (SHLIB_PATH) with shl_load().
[Richard Levitte] [Richard Levitte]
......
...@@ -239,7 +239,7 @@ typedef struct bignum_st ...@@ -239,7 +239,7 @@ typedef struct bignum_st
} BIGNUM; } BIGNUM;
/* Used for temp variables */ /* Used for temp variables */
#define BN_CTX_NUM 12 #define BN_CTX_NUM 16
#define BN_CTX_NUM_POS 12 #define BN_CTX_NUM_POS 12
typedef struct bignum_ctx typedef struct bignum_ctx
{ {
......
...@@ -112,8 +112,14 @@ void BN_CTX_start(BN_CTX *ctx) ...@@ -112,8 +112,14 @@ void BN_CTX_start(BN_CTX *ctx)
ctx->depth++; ctx->depth++;
} }
BIGNUM *BN_CTX_get(BN_CTX *ctx) 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->depth > BN_CTX_NUM_POS || ctx->tos >= BN_CTX_NUM)
{ {
if (!ctx->too_many) if (!ctx->too_many)
......
...@@ -180,13 +180,13 @@ int BN_div(BIGNUM *dv, BIGNUM *rm, const BIGNUM *num, const BIGNUM *divisor, ...@@ -180,13 +180,13 @@ int BN_div(BIGNUM *dv, BIGNUM *rm, const BIGNUM *num, const BIGNUM *divisor,
BN_CTX_start(ctx); BN_CTX_start(ctx);
tmp=BN_CTX_get(ctx); tmp=BN_CTX_get(ctx);
tmp->neg=0;
snum=BN_CTX_get(ctx); snum=BN_CTX_get(ctx);
sdiv=BN_CTX_get(ctx); sdiv=BN_CTX_get(ctx);
if (dv == NULL) if (dv == NULL)
res=BN_CTX_get(ctx); res=BN_CTX_get(ctx);
else res=dv; else res=dv;
if (res == NULL) goto err; if (sdiv == NULL || res == NULL) goto err;
tmp->neg=0;
/* First we normalise the numbers */ /* First we normalise the numbers */
norm_shift=BN_BITS2-((BN_num_bits(divisor))%BN_BITS2); norm_shift=BN_BITS2-((BN_num_bits(divisor))%BN_BITS2);
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册