projects
/
oweals
/
openssl.git
/ blobdiff
commit
grep
author
committer
pickaxe
?
search:
re
summary
|
shortlog
|
log
|
commit
|
commitdiff
|
tree
raw
|
inline
| side by side
RT2210: Add missing EVP_cleanup to example
[oweals/openssl.git]
/
crypto
/
bn
/
bn_print.c
diff --git
a/crypto/bn/bn_print.c
b/crypto/bn/bn_print.c
index 80de7ea5000f7db2c5965b4cfb59fc2c7ed6d689..1743b6a7e212f19bcc94f0816c71493b1270961f 100644
(file)
--- a/
crypto/bn/bn_print.c
+++ b/
crypto/bn/bn_print.c
@@
-62,16
+62,16
@@
#include <openssl/buffer.h>
#include "bn_lcl.h"
#include <openssl/buffer.h>
#include "bn_lcl.h"
-static const char
*Hex
="0123456789ABCDEF";
+static const char
Hex[]
="0123456789ABCDEF";
-/* Must '
F
ree' the returned data */
+/* Must '
OPENSSL_f
ree' the returned data */
char *BN_bn2hex(const BIGNUM *a)
{
int i,j,v,z=0;
char *buf;
char *p;
char *BN_bn2hex(const BIGNUM *a)
{
int i,j,v,z=0;
char *buf;
char *p;
- buf=(char *)
M
alloc(a->top*BN_BYTES*2+2);
+ buf=(char *)
OPENSSL_m
alloc(a->top*BN_BYTES*2+2);
if (buf == NULL)
{
BNerr(BN_F_BN_BN2HEX,ERR_R_MALLOC_FAILURE);
if (buf == NULL)
{
BNerr(BN_F_BN_BN2HEX,ERR_R_MALLOC_FAILURE);
@@
-79,7
+79,7
@@
char *BN_bn2hex(const BIGNUM *a)
}
p=buf;
if (a->neg) *(p++)='-';
}
p=buf;
if (a->neg) *(p++)='-';
- if (
a->top == 0
) *(p++)='0';
+ if (
BN_is_zero(a)
) *(p++)='0';
for (i=a->top-1; i >=0; i--)
{
for (j=BN_BITS2-8; j >= 0; j-=8)
for (i=a->top-1; i >=0; i--)
{
for (j=BN_BITS2-8; j >= 0; j-=8)
@@
-99,19
+99,24
@@
err:
return(buf);
}
return(buf);
}
-/* Must '
F
ree' the returned data */
+/* Must '
OPENSSL_f
ree' 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 *p;
BIGNUM *t=NULL;
BN_ULONG *bn_data=NULL,*lp;
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;
i=BN_num_bits(a)*3;
- num=(i/10+i/1000+
3
)+1;
- bn_data=(BN_ULONG *)
M
alloc((num/BN_DEC_NUM+1)*sizeof(BN_ULONG));
- buf=(char *)
M
alloc(num+3);
+ num=(i/10+i/1000+
1
)+1;
+ bn_data=(BN_ULONG *)
OPENSSL_m
alloc((num/BN_DEC_NUM+1)*sizeof(BN_ULONG));
+ buf=(char *)
OPENSSL_m
alloc(num+3);
if ((buf == NULL) || (bn_data == NULL))
{
BNerr(BN_F_BN_BN2DEC,ERR_R_MALLOC_FAILURE);
if ((buf == NULL) || (bn_data == NULL))
{
BNerr(BN_F_BN_BN2DEC,ERR_R_MALLOC_FAILURE);
@@
-119,16
+124,19
@@
char *BN_bn2dec(const BIGNUM *a)
}
if ((t=BN_dup(a)) == NULL) goto err;
}
if ((t=BN_dup(a)) == NULL) goto err;
+#define BUF_REMAIN (num+3 - (size_t)(p - buf))
p=buf;
lp=bn_data;
p=buf;
lp=bn_data;
- if (t->neg) *(p++)='-';
- if (t->top == 0)
+ if (BN_is_zero(t))
{
*(p++)='0';
*(p++)='\0';
}
else
{
{
*(p++)='0';
*(p++)='\0';
}
else
{
+ if (BN_is_negative(t))
+ *p++ = '-';
+
i=0;
while (!BN_is_zero(t))
{
i=0;
while (!BN_is_zero(t))
{
@@
-139,18
+147,25
@@
char *BN_bn2dec(const BIGNUM *a)
/* We now have a series of blocks, BN_DEC_NUM chars
* in length, where the last one needs truncation.
* The blocks need to be reversed in order. */
/* We now have a series of blocks, BN_DEC_NUM chars
* in length, where the last one needs truncation.
* The blocks need to be reversed in order. */
-
sprintf(p
,BN_DEC_FMT1,*lp);
+
BIO_snprintf(p,BUF_REMAIN
,BN_DEC_FMT1,*lp);
while (*p) p++;
while (lp != bn_data)
{
lp--;
while (*p) p++;
while (lp != bn_data)
{
lp--;
-
sprintf(p
,BN_DEC_FMT2,*lp);
+
BIO_snprintf(p,BUF_REMAIN
,BN_DEC_FMT2,*lp);
while (*p) p++;
}
}
while (*p) p++;
}
}
+ ok = 1;
err:
err:
- if (bn_data != NULL)
F
ree(bn_data);
+ if (bn_data != NULL)
OPENSSL_f
ree(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);
}
@@
-210,10
+225,11
@@
int BN_hex2bn(BIGNUM **bn, const char *a)
j-=(BN_BYTES*2);
}
ret->top=h;
j-=(BN_BYTES*2);
}
ret->top=h;
- bn_
fix
_top(ret);
+ bn_
correct
_top(ret);
ret->neg=neg;
*bn=ret;
ret->neg=neg;
*bn=ret;
+ bn_check_top(ret);
return(num);
err:
if (*bn == NULL) BN_free(ret);
return(num);
err:
if (*bn == NULL) BN_free(ret);
@@
-269,17
+285,38
@@
int BN_dec2bn(BIGNUM **bn, const char *a)
}
ret->neg=neg;
}
ret->neg=neg;
- bn_
fix
_top(ret);
+ bn_
correct
_top(ret);
*bn=ret;
*bn=ret;
+ bn_check_top(ret);
return(num);
err:
if (*bn == NULL) BN_free(ret);
return(0);
}
return(num);
err:
if (*bn == NULL) BN_free(ret);
return(0);
}
-#ifndef NO_BIO
+int BN_asc2bn(BIGNUM **bn, const char *a)
+ {
+ const char *p = a;
+ if (*p == '-')
+ p++;
-#ifndef NO_FP_API
+ if (p[0] == '0' && (p[1] == 'X' || p[1] == 'x'))
+ {
+ if (!BN_hex2bn(bn, p + 2))
+ return 0;
+ }
+ else
+ {
+ if (!BN_dec2bn(bn, p))
+ return 0;
+ }
+ if (*a == '-')
+ (*bn)->neg = 1;
+ return 1;
+ }
+
+#ifndef OPENSSL_NO_BIO
+#ifndef OPENSSL_NO_FP_API
int BN_print_fp(FILE *fp, const BIGNUM *a)
{
BIO *b;
int BN_print_fp(FILE *fp, const BIGNUM *a)
{
BIO *b;
@@
-300,7
+337,7
@@
int BN_print(BIO *bp, const BIGNUM *a)
int ret=0;
if ((a->neg) && (BIO_write(bp,"-",1) != 1)) goto end;
int ret=0;
if ((a->neg) && (BIO_write(bp,"-",1) != 1)) goto end;
- if (
(a->top == 0
) && (BIO_write(bp,"0",1) != 1)) goto end;
+ if (
BN_is_zero(a
) && (BIO_write(bp,"0",1) != 1)) goto end;
for (i=a->top-1; i >=0; i--)
{
for (j=BN_BITS2-4; j >= 0; j-=4)
for (i=a->top-1; i >=0; i--)
{
for (j=BN_BITS2-4; j >= 0; j-=4)
@@
-319,5
+356,23
@@
int BN_print(BIO *bp, const BIGNUM *a)
end:
return(ret);
}
end:
return(ret);
}
+#endif
+
+char *BN_options(void)
+ {
+ static int init=0;
+ static char data[16];
+ if (!init)
+ {
+ init++;
+#ifdef BN_LLONG
+ BIO_snprintf(data,sizeof data,"bn(%d,%d)",
+ (int)sizeof(BN_ULLONG)*8,(int)sizeof(BN_ULONG)*8);
+#else
+ BIO_snprintf(data,sizeof data,"bn(%d,%d)",
+ (int)sizeof(BN_ULONG)*8,(int)sizeof(BN_ULONG)*8);
#endif
#endif
+ }
+ return(data);
+ }