summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorGeoff Thorpe <geoff@openssl.org>2004-09-19 04:43:46 +0000
committerGeoff Thorpe <geoff@openssl.org>2004-09-19 04:43:46 +0000
commitf79110c63383de7241c01e80f0dfc07d33395e77 (patch)
tree8609a49a5d402aebd5ccb35c0119d9df3f6cf9e5
parent6ef2ff62fca2d317bf98cf7dda85bf1ab493749c (diff)
Two TODO comments taken care of. Nils pointed out that one of them had already
been done, and took care of the other one (which hadn't). Submitted by: Nils Larsch Reviewed by: Geoff Thorpe
-rw-r--r--crypto/bn/bn_ctx.c3
-rw-r--r--crypto/bn/bn_print.c20
2 files changed, 17 insertions, 6 deletions
diff --git a/crypto/bn/bn_ctx.c b/crypto/bn/bn_ctx.c
index 12d8a8cbf8..5bd742a97c 100644
--- a/crypto/bn/bn_ctx.c
+++ b/crypto/bn/bn_ctx.c
@@ -70,10 +70,7 @@
*
* 1. Check a bunch of "(words+1)" type hacks in various bignum functions and
* check they can be safely removed.
- * - BN_bin2bn() looks pretty nasty with the miscellaneous +1 and +2 adjustments.
- * Needs a full rubber-gloving, me thinks.
* - Check +1 and other ugliness in BN_from_montgomery()
- * - Aspects of BN_bn2dec() also look a bit arbitrary
*
* 2. Consider allowing a BN_new_ex() that, at least, lets you specify an
* appropriate 'block' size that will be honoured by bn_expand_internal() to
diff --git a/crypto/bn/bn_print.c b/crypto/bn/bn_print.c
index 092322d2ff..5fb8473f37 100644
--- a/crypto/bn/bn_print.c
+++ b/crypto/bn/bn_print.c
@@ -102,14 +102,19 @@ err:
/* Must 'OPENSSL_free' the returned data */
char *BN_bn2dec(const BIGNUM *a)
{
- int i=0,num;
+ int i=0,num, ok = 0;
char *buf=NULL;
char *p;
BIGNUM *t=NULL;
BN_ULONG *bn_data=NULL,*lp;
+ /* get an upper bound for the length of the decimal integer
+ * num <= (BN_num_bits(a) + 1) * log(2)
+ * <= 3 * BN_num_bits(a) * 0.1001 + log(2) + 1 (rounding error)
+ * <= BN_num_bits(a)/10 + BN_num_bits/1000 + 1 + 1
+ */
i=BN_num_bits(a)*3;
- num=(i/10+i/1000+3)+1;
+ num=(i/10+i/1000+1)+1;
bn_data=(BN_ULONG *)OPENSSL_malloc((num/BN_DEC_NUM+1)*sizeof(BN_ULONG));
buf=(char *)OPENSSL_malloc(num+3);
if ((buf == NULL) || (bn_data == NULL))
@@ -122,7 +127,6 @@ char *BN_bn2dec(const BIGNUM *a)
#define BUF_REMAIN (num+3 - (size_t)(p - buf))
p=buf;
lp=bn_data;
- if (t->neg) *(p++)='-';
if (BN_is_zero(t))
{
*(p++)='0';
@@ -130,6 +134,9 @@ char *BN_bn2dec(const BIGNUM *a)
}
else
{
+ if (BN_get_sign(t))
+ *p++ = '-';
+
i=0;
while (!BN_is_zero(t))
{
@@ -149,9 +156,16 @@ char *BN_bn2dec(const BIGNUM *a)
while (*p) p++;
}
}
+ ok = 1;
err:
if (bn_data != NULL) OPENSSL_free(bn_data);
if (t != NULL) BN_free(t);
+ if (!ok && buf)
+ {
+ OPENSSL_free(buf);
+ buf = NULL;
+ }
+
return(buf);
}