PR: 2742
[openssl.git] / crypto / asn1 / a_i2d_fp.c
index aee29a779000c444ea3996da7c298647bc6b49ba..a3ad76d35687bdef74bee7f538645ac2f29b74ab 100644 (file)
 #include <stdio.h>
 #include "cryptlib.h"
 #include <openssl/buffer.h>
-#include <openssl/asn1_mac.h>
+#include <openssl/asn1.h>
 
-#ifndef NO_FP_API
-int ASN1_i2d_fp(int (*i2d)(), FILE *out, unsigned char *x)
+#ifndef NO_OLD_ASN1
+
+#ifndef OPENSSL_NO_FP_API
+int ASN1_i2d_fp(i2d_of_void *i2d, FILE *out, void *x)
         {
         BIO *b;
         int ret;
@@ -79,7 +81,7 @@ int ASN1_i2d_fp(int (*i2d)(), FILE *out, unsigned char *x)
         }
 #endif
 
-int ASN1_i2d_bio(int (*i2d)(), BIO *out, unsigned char *x)
+int ASN1_i2d_bio(i2d_of_void *i2d, BIO *out, unsigned char *x)
        {
        char *b;
        unsigned char *p;
@@ -111,3 +113,51 @@ int ASN1_i2d_bio(int (*i2d)(), BIO *out, unsigned char *x)
        OPENSSL_free(b);
        return(ret);
        }
+
+#endif
+
+#ifndef OPENSSL_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_ITEM_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_ITEM_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);
+       }