diff options
author | Dr. Stephen Henson <steve@openssl.org> | 2000-12-30 02:40:26 +0000 |
---|---|---|
committer | Dr. Stephen Henson <steve@openssl.org> | 2000-12-30 02:40:26 +0000 |
commit | 4e1209ebf8603d7f51a37d1645dfc0c09bac8686 (patch) | |
tree | e4487e9a433aba1030433f98b95e46588bf22a9f /crypto/asn1/a_i2d_fp.c | |
parent | 78d3b819f04fcefa67294a840ea7fbf167418109 (diff) |
ASN1_ITEM versions of ASN1_d2i_{fp, bio} and replacement of
most of the old wrappers. A few of the old versions remain
because they are non standard and the corresponding ASN1
code has not been reimplemented yet.
Diffstat (limited to 'crypto/asn1/a_i2d_fp.c')
-rw-r--r-- | crypto/asn1/a_i2d_fp.c | 50 |
1 files changed, 50 insertions, 0 deletions
diff --git a/crypto/asn1/a_i2d_fp.c b/crypto/asn1/a_i2d_fp.c index 7b64a5704d..7de7b45e70 100644 --- a/crypto/asn1/a_i2d_fp.c +++ b/crypto/asn1/a_i2d_fp.c @@ -61,6 +61,8 @@ #include <openssl/buffer.h> #include <openssl/asn1.h> +#ifndef NO_OLD_ASN1 + #ifndef NO_FP_API int ASN1_i2d_fp(int (*i2d)(), FILE *out, unsigned char *x) { @@ -111,3 +113,51 @@ int ASN1_i2d_bio(int (*i2d)(), BIO *out, unsigned char *x) OPENSSL_free(b); return(ret); } + +#endif + +#ifndef NO_FP_API +int ASN1_item_i2d_fp(const ASN1_ITEM *it, FILE *out, void *x) + { + BIO *b; + int ret; + + if ((b=BIO_new(BIO_s_file())) == NULL) + { + ASN1err(ASN1_F_ASN1_I2D_FP,ERR_R_BUF_LIB); + return(0); + } + BIO_set_fp(b,out,BIO_NOCLOSE); + ret=ASN1_item_i2d_bio(it,b,x); + BIO_free(b); + return(ret); + } +#endif + +int ASN1_item_i2d_bio(const ASN1_ITEM *it, BIO *out, void *x) + { + unsigned char *b = NULL; + int i,j=0,n,ret=1; + + n = ASN1_item_i2d(x, &b, it); + if (b == NULL) + { + ASN1err(ASN1_F_ASN1_I2D_BIO,ERR_R_MALLOC_FAILURE); + return(0); + } + + for (;;) + { + i=BIO_write(out,&(b[j]),n); + if (i == n) break; + if (i <= 0) + { + ret=0; + break; + } + j+=i; + n-=i; + } + OPENSSL_free(b); + return(ret); + } |