summaryrefslogtreecommitdiffstats
path: root/crypto/asn1/a_i2d_fp.c
diff options
context:
space:
mode:
authorDr. Stephen Henson <steve@openssl.org>2000-12-30 02:40:26 +0000
committerDr. Stephen Henson <steve@openssl.org>2000-12-30 02:40:26 +0000
commit4e1209ebf8603d7f51a37d1645dfc0c09bac8686 (patch)
treee4487e9a433aba1030433f98b95e46588bf22a9f /crypto/asn1/a_i2d_fp.c
parent78d3b819f04fcefa67294a840ea7fbf167418109 (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.c50
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);
+ }