New -set_serial options to 'req' and 'x509'.
[openssl.git] / crypto / asn1 / a_i2d_fp.c
index aee29a779000c444ea3996da7c298647bc6b49ba..7de7b45e706d4dc11584112d129f4f26c9d6676a 100644 (file)
@@ -59,7 +59,9 @@
 #include <stdio.h>
 #include "cryptlib.h"
 #include <openssl/buffer.h>
-#include <openssl/asn1_mac.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);
+       }