New functions CONF_load_bio() and CONF_load_fp() to load a configuration
authorDr. Stephen Henson <steve@openssl.org>
Sun, 20 Jun 1999 17:36:11 +0000 (17:36 +0000)
committerDr. Stephen Henson <steve@openssl.org>
Sun, 20 Jun 1999 17:36:11 +0000 (17:36 +0000)
file from a bio or fp. Added some more constification to the BN library.

CHANGES
crypto/bn/bn.h
crypto/bn/bn_lib.c
crypto/bn/bn_mpi.c
crypto/bn/bn_print.c
crypto/conf/Makefile.ssl
crypto/conf/conf.c
crypto/conf/conf.h
crypto/conf/conf_err.c
util/libeay.num

diff --git a/CHANGES b/CHANGES
index 0902e03..e5571b1 100644 (file)
--- a/CHANGES
+++ b/CHANGES
@@ -4,6 +4,11 @@
 
  Changes between 0.9.3a and 0.9.4
 
+  *) New functions CONF_load_bio() and CONF_load_fp() to allow a config
+     file to be loaded from a BIO or FILE pointer. The BIO version will
+     for example allow memory BIOs to contain config info.
+     [Steve Henson]
+
   *) New function "CRYPTO_num_locks" that returns CRYPTO_NUM_LOCKS.
      Whoever hopes to achieve shared-library compatibility across versions
      must use this, not the compile-time macro.
index ce5a474..80421a2 100644 (file)
@@ -323,9 +323,9 @@ void        BN_init(BIGNUM *);
 void   BN_clear_free(BIGNUM *a);
 BIGNUM *BN_copy(BIGNUM *a, const BIGNUM *b);
 BIGNUM *BN_bin2bn(const unsigned char *s,int len,BIGNUM *ret);
-int    BN_bn2bin(BIGNUM *a, unsigned char *to);
+int    BN_bn2bin(const BIGNUM *a, unsigned char *to);
 BIGNUM *BN_mpi2bn(unsigned char *s,int len,BIGNUM *ret);
-int    BN_bn2mpi(BIGNUM *a, unsigned char *to);
+int    BN_bn2mpi(const BIGNUM *a, unsigned char *to);
 int    BN_sub(BIGNUM *r, const BIGNUM *a, const BIGNUM *b);
 int    BN_usub(BIGNUM *r, const BIGNUM *a, const BIGNUM *b);
 int    BN_uadd(BIGNUM *r, const BIGNUM *a, const BIGNUM *b);
@@ -375,10 +375,10 @@ BIGNUM *BN_dup(const BIGNUM *a);
 int    BN_ucmp(const BIGNUM *a, const BIGNUM *b);
 int    BN_set_bit(BIGNUM *a, int n);
 int    BN_clear_bit(BIGNUM *a, int n);
-char * BN_bn2hex(BIGNUM *a);
-char * BN_bn2dec(BIGNUM *a);
-int    BN_hex2bn(BIGNUM **a,char *str);
-int    BN_dec2bn(BIGNUM **a,char *str);
+char * BN_bn2hex(const BIGNUM *a);
+char * BN_bn2dec(const BIGNUM *a);
+int    BN_hex2bn(BIGNUM **a, const char *str);
+int    BN_dec2bn(BIGNUM **a, const char *str);
 int    BN_gcd(BIGNUM *r,BIGNUM *in_a,BIGNUM *in_b,BN_CTX *ctx);
 BIGNUM *BN_mod_inverse(BIGNUM *ret,BIGNUM *a, const BIGNUM *n,BN_CTX *ctx);
 BIGNUM *BN_generate_prime(BIGNUM *ret,int bits,int strong,BIGNUM *add,
index ee194c5..9c2c9d3 100644 (file)
@@ -629,7 +629,7 @@ BIGNUM *BN_bin2bn(const unsigned char *s, int len, BIGNUM *ret)
        }
 
 /* ignore negative */
-int BN_bn2bin(BIGNUM *a, unsigned char *to)
+int BN_bn2bin(const BIGNUM *a, unsigned char *to)
        {
        int n,i;
        BN_ULONG l;
index 5d786d7..80e1dca 100644 (file)
@@ -60,7 +60,7 @@
 #include "cryptlib.h"
 #include "bn_lcl.h"
 
-int BN_bn2mpi(BIGNUM *a, unsigned char *d)
+int BN_bn2mpi(const BIGNUM *a, unsigned char *d)
        {
        int bits;
        int num=0;
index 91418a2..2f5ab26 100644 (file)
@@ -65,7 +65,7 @@
 static const char *Hex="0123456789ABCDEF";
 
 /* Must 'Free' the returned data */
-char *BN_bn2hex(BIGNUM *a)
+char *BN_bn2hex(const BIGNUM *a)
        {
        int i,j,v,z=0;
        char *buf;
@@ -100,7 +100,7 @@ err:
        }
 
 /* Must 'Free' the returned data */
-char *BN_bn2dec(BIGNUM *a)
+char *BN_bn2dec(const BIGNUM *a)
        {
        int i=0,num;
        char *buf=NULL;
@@ -154,7 +154,7 @@ err:
        return(buf);
        }
 
-int BN_hex2bn(BIGNUM **bn, char *a)
+int BN_hex2bn(BIGNUM **bn, const char *a)
        {
        BIGNUM *ret=NULL;
        BN_ULONG l=0;
@@ -220,7 +220,7 @@ err:
        return(0);
        }
 
-int BN_dec2bn(BIGNUM **bn, char *a)
+int BN_dec2bn(BIGNUM **bn, const char *a)
        {
        BIGNUM *ret=NULL;
        BN_ULONG l=0;
index c686b34..ab2e148 100644 (file)
@@ -85,5 +85,7 @@ conf.o: ../../include/openssl/e_os.h ../../include/openssl/e_os2.h
 conf.o: ../../include/openssl/err.h ../../include/openssl/lhash.h
 conf.o: ../../include/openssl/opensslconf.h ../../include/openssl/opensslv.h
 conf.o: ../../include/openssl/stack.h ../cryptlib.h conf_lcl.h
-conf_err.o: ../../include/openssl/conf.h ../../include/openssl/err.h
-conf_err.o: ../../include/openssl/lhash.h ../../include/openssl/stack.h
+conf_err.o: ../../include/openssl/bio.h ../../include/openssl/conf.h
+conf_err.o: ../../include/openssl/crypto.h ../../include/openssl/err.h
+conf_err.o: ../../include/openssl/lhash.h ../../include/openssl/opensslv.h
+conf_err.o: ../../include/openssl/stack.h
index a55ecbb..3a055fa 100644 (file)
@@ -82,10 +82,48 @@ static CONF_VALUE *get_section(LHASH *conf,char *section);
 
 const char *CONF_version="CONF" OPENSSL_VERSION_PTEXT;
 
-LHASH *CONF_load(LHASH *h, char *file, long *line)
+
+LHASH *CONF_load(LHASH *h, const char *file, long *line)
        {
-       LHASH *ret=NULL;
+       LHASH *ltmp;
        FILE *in=NULL;
+
+#ifdef VMS
+       in=fopen(file,"r");
+#else
+       in=fopen(file,"rb");
+#endif
+       if (in == NULL)
+               {
+               SYSerr(SYS_F_FOPEN,get_last_sys_error());
+               ERR_set_error_data(BUF_strdup(file),
+                       ERR_TXT_MALLOCED|ERR_TXT_STRING);
+               CONFerr(CONF_F_CONF_LOAD,ERR_R_SYS_LIB);
+               return NULL;
+               }
+
+       ltmp = CONF_load_fp(h, in, line);
+       fclose(in);
+
+       return ltmp;
+}
+
+LHASH *CONF_load_fp(LHASH *h, FILE *in, long *line)
+{
+       BIO *btmp;
+       LHASH *ltmp;
+       if(!(btmp = BIO_new_fp(in, BIO_NOCLOSE))) {
+               CONFerr(CONF_F_CONF_LOAD_FP,ERR_R_BUF_LIB);
+               return NULL;
+       }
+       ltmp = CONF_load_bio(h, btmp, line);
+       BIO_free(btmp);
+       return ltmp;
+}
+
+LHASH *CONF_load_bio(LHASH *h, BIO *in, long *line)
+       {
+       LHASH *ret=NULL;
 #define BUFSIZE        512
        char btmp[16];
        int bufnum=0,i,ii;
@@ -101,28 +139,14 @@ LHASH *CONF_load(LHASH *h, char *file, long *line)
 
        if ((buff=BUF_MEM_new()) == NULL)
                {
-               CONFerr(CONF_F_CONF_LOAD,ERR_R_BUF_LIB);
-               goto err;
-               }
-
-#ifdef VMS
-       in=fopen(file,"r");
-#else
-       in=fopen(file,"rb");
-#endif
-       if (in == NULL)
-               {
-               SYSerr(SYS_F_FOPEN,get_last_sys_error());
-               ERR_set_error_data(BUF_strdup(file),
-                       ERR_TXT_MALLOCED|ERR_TXT_STRING);
-               CONFerr(CONF_F_CONF_LOAD,ERR_R_SYS_LIB);
+               CONFerr(CONF_F_CONF_LOAD_BIO,ERR_R_BUF_LIB);
                goto err;
                }
 
        section=(char *)Malloc(10);
        if (section == NULL)
                {
-               CONFerr(CONF_F_CONF_LOAD,ERR_R_MALLOC_FAILURE);
+               CONFerr(CONF_F_CONF_LOAD_BIO,ERR_R_MALLOC_FAILURE);
                goto err;
                }
        strcpy(section,"default");
@@ -131,7 +155,7 @@ LHASH *CONF_load(LHASH *h, char *file, long *line)
                {
                if ((ret=lh_new(hash,cmp)) == NULL)
                        {
-                       CONFerr(CONF_F_CONF_LOAD,ERR_R_MALLOC_FAILURE);
+                       CONFerr(CONF_F_CONF_LOAD_BIO,ERR_R_MALLOC_FAILURE);
                        goto err;
                        }
                }
@@ -141,7 +165,8 @@ LHASH *CONF_load(LHASH *h, char *file, long *line)
        sv=new_section(ret,section);
        if (sv == NULL)
                {
-               CONFerr(CONF_F_CONF_LOAD,CONF_R_UNABLE_TO_CREATE_NEW_SECTION);
+               CONFerr(CONF_F_CONF_LOAD_BIO,
+                                       CONF_R_UNABLE_TO_CREATE_NEW_SECTION);
                goto err;
                }
        section_sk=(STACK *)sv->value;
@@ -152,12 +177,12 @@ LHASH *CONF_load(LHASH *h, char *file, long *line)
                again=0;
                if (!BUF_MEM_grow(buff,bufnum+BUFSIZE))
                        {
-                       CONFerr(CONF_F_CONF_LOAD,ERR_R_BUF_LIB);
+                       CONFerr(CONF_F_CONF_LOAD_BIO,ERR_R_BUF_LIB);
                        goto err;
                        }
                p= &(buff->data[bufnum]);
                *p='\0';
-               fgets(p,BUFSIZE-1,in);
+               BIO_gets(in, p, BUFSIZE-1);
                p[BUFSIZE-1]='\0';
                ii=i=strlen(p);
                if (i == 0) break;
@@ -222,7 +247,8 @@ again:
                                        ss=p;
                                        goto again;
                                        }
-                               CONFerr(CONF_F_CONF_LOAD,CONF_R_MISSING_CLOSE_SQUARE_BRACKET);
+                               CONFerr(CONF_F_CONF_LOAD_BIO,
+                                       CONF_R_MISSING_CLOSE_SQUARE_BRACKET);
                                goto err;
                                }
                        *end='\0';
@@ -231,7 +257,8 @@ again:
                                sv=new_section(ret,section);
                        if (sv == NULL)
                                {
-                               CONFerr(CONF_F_CONF_LOAD,CONF_R_UNABLE_TO_CREATE_NEW_SECTION);
+                               CONFerr(CONF_F_CONF_LOAD_BIO,
+                                       CONF_R_UNABLE_TO_CREATE_NEW_SECTION);
                                goto err;
                                }
                        section_sk=(STACK *)sv->value;
@@ -253,7 +280,8 @@ again:
                        p=eat_ws(end);
                        if (*p != '=')
                                {
-                               CONFerr(CONF_F_CONF_LOAD,CONF_R_MISSING_EQUAL_SIGN);
+                               CONFerr(CONF_F_CONF_LOAD_BIO,
+                                               CONF_R_MISSING_EQUAL_SIGN);
                                goto err;
                                }
                        *end='\0';
@@ -269,7 +297,8 @@ again:
 
                        if ((v=(CONF_VALUE *)Malloc(sizeof(CONF_VALUE))) == NULL)
                                {
-                               CONFerr(CONF_F_CONF_LOAD,ERR_R_MALLOC_FAILURE);
+                               CONFerr(CONF_F_CONF_LOAD_BIO,
+                                                       ERR_R_MALLOC_FAILURE);
                                goto err;
                                }
                        if (psection == NULL) psection=section;
@@ -277,7 +306,8 @@ again:
                        v->value=NULL;
                        if (v->name == NULL)
                                {
-                               CONFerr(CONF_F_CONF_LOAD,ERR_R_MALLOC_FAILURE);
+                               CONFerr(CONF_F_CONF_LOAD_BIO,
+                                                       ERR_R_MALLOC_FAILURE);
                                goto err;
                                }
                        strcpy(v->name,pname);
@@ -290,7 +320,8 @@ again:
                                        tv=new_section(ret,psection);
                                if (tv == NULL)
                                        {
-                                       CONFerr(CONF_F_CONF_LOAD,CONF_R_UNABLE_TO_CREATE_NEW_SECTION);
+                                       CONFerr(CONF_F_CONF_LOAD_BIO,
+                                               CONF_R_UNABLE_TO_CREATE_NEW_SECTION);
                                        goto err;
                                        }
                                ts=(STACK *)tv->value;
@@ -303,7 +334,8 @@ again:
                        v->section=tv->section; 
                        if (!sk_push(ts,(char *)v))
                                {
-                               CONFerr(CONF_F_CONF_LOAD,ERR_R_MALLOC_FAILURE);
+                               CONFerr(CONF_F_CONF_LOAD_BIO,
+                                                       ERR_R_MALLOC_FAILURE);
                                goto err;
                                }
                        vv=(CONF_VALUE *)lh_insert(ret,(char *)v);
@@ -319,7 +351,6 @@ again:
                }
        if (buff != NULL) BUF_MEM_free(buff);
        if (section != NULL) Free(section);
-       if (in != NULL) fclose(in);
        return(ret);
 err:
        if (buff != NULL) BUF_MEM_free(buff);
@@ -327,7 +358,6 @@ err:
        if (line != NULL) *line=eline;
        sprintf(btmp,"%ld",eline);
        ERR_add_error_data(2,"line ",btmp);
-       if (in != NULL) fclose(in);
        if ((h != ret) && (ret != NULL)) CONF_free(ret);
        if (v != NULL)
                {
@@ -337,7 +367,7 @@ err:
                }
        return(NULL);
        }
-               
+
 char *CONF_get_string(LHASH *conf, char *section, char *name)
        {
        CONF_VALUE *v,vv;
index 2401518..feb65f2 100644 (file)
@@ -63,8 +63,9 @@
 extern "C" {
 #endif
 
-#include <openssl/stack.h>
+#include <openssl/bio.h>
 #include <openssl/lhash.h>
+#include <openssl/stack.h>
 
 typedef struct
        {
@@ -74,7 +75,9 @@ typedef struct
        } CONF_VALUE;
 
 
-LHASH *CONF_load(LHASH *conf,char *file,long *eline);
+LHASH *CONF_load(LHASH *conf,const char *file,long *eline);
+LHASH *CONF_load_fp(LHASH *conf, FILE *fp,long *eline);
+LHASH *CONF_load_bio(LHASH *conf, BIO *bp,long *eline);
 STACK *CONF_get_section(LHASH *conf,char *section);
 char *CONF_get_string(LHASH *conf,char *group,char *name);
 long CONF_get_number(LHASH *conf,char *group,char *name);
@@ -90,6 +93,8 @@ void ERR_load_CONF_strings(void );
 
 /* Function codes. */
 #define CONF_F_CONF_LOAD                                100
+#define CONF_F_CONF_LOAD_BIO                            102
+#define CONF_F_CONF_LOAD_FP                             103
 #define CONF_F_STR_COPY                                         101
 
 /* Reason codes. */
index 340e429..eb4b3cf 100644 (file)
@@ -66,6 +66,8 @@
 static ERR_STRING_DATA CONF_str_functs[]=
        {
 {ERR_PACK(0,CONF_F_CONF_LOAD,0),       "CONF_load"},
+{ERR_PACK(0,CONF_F_CONF_LOAD_BIO,0),   "CONF_load_bio"},
+{ERR_PACK(0,CONF_F_CONF_LOAD_FP,0),    "CONF_load_fp"},
 {ERR_PACK(0,CONF_F_STR_COPY,0),        "STR_COPY"},
 {0,NULL}
        };
index 56bff65..3236c3a 100755 (executable)
@@ -1777,3 +1777,5 @@ BIO_ctrl_wpending                       1801
 BIO_new_bio_pair                        1802
 BIO_ctrl_get_write_guarantee            1803
 CRYPTO_num_locks                        1804
+CONF_load_bio                           1805
+CONF_load_fp                            1806