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
This commit is contained in:
parent
6ef2ff62fc
commit
f79110c633
@ -70,10 +70,7 @@
|
|||||||
*
|
*
|
||||||
* 1. Check a bunch of "(words+1)" type hacks in various bignum functions and
|
* 1. Check a bunch of "(words+1)" type hacks in various bignum functions and
|
||||||
* check they can be safely removed.
|
* 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()
|
* - 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
|
* 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
|
* appropriate 'block' size that will be honoured by bn_expand_internal() to
|
||||||
|
@ -102,14 +102,19 @@ err:
|
|||||||
/* Must 'OPENSSL_free' the returned data */
|
/* Must 'OPENSSL_free' the returned data */
|
||||||
char *BN_bn2dec(const BIGNUM *a)
|
char *BN_bn2dec(const BIGNUM *a)
|
||||||
{
|
{
|
||||||
int i=0,num;
|
int i=0,num, ok = 0;
|
||||||
char *buf=NULL;
|
char *buf=NULL;
|
||||||
char *p;
|
char *p;
|
||||||
BIGNUM *t=NULL;
|
BIGNUM *t=NULL;
|
||||||
BN_ULONG *bn_data=NULL,*lp;
|
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;
|
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));
|
bn_data=(BN_ULONG *)OPENSSL_malloc((num/BN_DEC_NUM+1)*sizeof(BN_ULONG));
|
||||||
buf=(char *)OPENSSL_malloc(num+3);
|
buf=(char *)OPENSSL_malloc(num+3);
|
||||||
if ((buf == NULL) || (bn_data == NULL))
|
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))
|
#define BUF_REMAIN (num+3 - (size_t)(p - buf))
|
||||||
p=buf;
|
p=buf;
|
||||||
lp=bn_data;
|
lp=bn_data;
|
||||||
if (t->neg) *(p++)='-';
|
|
||||||
if (BN_is_zero(t))
|
if (BN_is_zero(t))
|
||||||
{
|
{
|
||||||
*(p++)='0';
|
*(p++)='0';
|
||||||
@ -130,6 +134,9 @@ char *BN_bn2dec(const BIGNUM *a)
|
|||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
|
if (BN_get_sign(t))
|
||||||
|
*p++ = '-';
|
||||||
|
|
||||||
i=0;
|
i=0;
|
||||||
while (!BN_is_zero(t))
|
while (!BN_is_zero(t))
|
||||||
{
|
{
|
||||||
@ -149,9 +156,16 @@ char *BN_bn2dec(const BIGNUM *a)
|
|||||||
while (*p) p++;
|
while (*p) p++;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
ok = 1;
|
||||||
err:
|
err:
|
||||||
if (bn_data != NULL) OPENSSL_free(bn_data);
|
if (bn_data != NULL) OPENSSL_free(bn_data);
|
||||||
if (t != NULL) BN_free(t);
|
if (t != NULL) BN_free(t);
|
||||||
|
if (!ok && buf)
|
||||||
|
{
|
||||||
|
OPENSSL_free(buf);
|
||||||
|
buf = NULL;
|
||||||
|
}
|
||||||
|
|
||||||
return(buf);
|
return(buf);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user