ec/ecp_nistz256.c: harmonize with latest indent script.
[oweals/openssl.git] / crypto / bn / bn_print.c
index 092322d2ff8b0e51bfbcb63e855bf8407b494550..89320738b317f66d11b5cce920895de5f1b8b275 100644 (file)
@@ -62,7 +62,7 @@
 #include <openssl/buffer.h>
 #include "bn_lcl.h"
 
-static const char *Hex="0123456789ABCDEF";
+static const char Hex[]="0123456789ABCDEF";
 
 /* Must 'OPENSSL_free' the returned data */
 char *BN_bn2hex(const BIGNUM *a)
@@ -102,14 +102,20 @@ 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 +128,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 +135,9 @@ char *BN_bn2dec(const BIGNUM *a)
                }
        else
                {
+               if (BN_is_negative(t))
+                       *p++ = '-';
+
                i=0;
                while (!BN_is_zero(t))
                        {
@@ -149,9 +157,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);
        }
 
@@ -280,8 +295,29 @@ err:
        return(0);
        }
 
+int BN_asc2bn(BIGNUM **bn, const char *a)
+       {
+       const char *p = a;
+       if (*p == '-')
+               p++;
+
+       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
+#ifndef OPENSSL_NO_STDIO
 int BN_print_fp(FILE *fp, const BIGNUM *a)
        {
        BIO *b;
@@ -322,3 +358,22 @@ 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
+               }
+       return(data);
+       }