Update to ASN1 printing code.
authorDr. Stephen Henson <steve@openssl.org>
Sat, 3 Sep 2005 00:40:40 +0000 (00:40 +0000)
committerDr. Stephen Henson <steve@openssl.org>
Sat, 3 Sep 2005 00:40:40 +0000 (00:40 +0000)
apps/pkcs7.c
crypto/asn1/asn1.h
crypto/asn1/tasn_prn.c

index aa1852a9fafea871c27230f7100463e73e261e9f..86d31b99a71f6c52abfbe9f04ca023b00ca5c8b5 100644 (file)
@@ -241,7 +241,7 @@ bad:
                }
 
        if (p7_print)
-               PKCS7_print(out, p7, 0, NULL);
+               PKCS7_print_ctx(out, p7, 0, NULL);
 
        if (print_certs)
                {
index c8fb6fa01ce41c9ada7209c0e26a8e6bce340043..87b022be530b80976906467cc8d75f060c4484aa 100644 (file)
@@ -321,7 +321,7 @@ typedef struct ASN1_VALUE_st ASN1_VALUE;
        DECLARE_ASN1_PRINT_FUNCTION_fname(stname, stname)
 
 #define DECLARE_ASN1_PRINT_FUNCTION_fname(stname, fname) \
-       int fname##_print(BIO *out, stname *x, int indent, \
+       int fname##_print_ctx(BIO *out, stname *x, int indent, \
                                         const ASN1_PCTX *pctx);
 
 #define D2I_OF(type) type *(*)(type **,const unsigned char **,long)
index 1c0379564a22b5d16ea53328ade22f937c11ab8a..3cc98ea7d2258211470b809317ec78b117f11c20 100644 (file)
@@ -58,6 +58,7 @@
 
 
 #include <stddef.h>
+#include "cryptlib.h"
 #include <openssl/asn1.h>
 #include <openssl/asn1t.h>
 #include <openssl/objects.h>
@@ -66,8 +67,6 @@
 #include <openssl/x509v3.h>
 #include "asn1_locl.h"
 
-#include <string.h>
-
 /* Print routines.
  */
 
@@ -196,12 +195,25 @@ static int asn1_item_print_ctx(BIO *out, ASN1_VALUE **fld, int indent,
        const ASN1_TEMPLATE *tt;
        const ASN1_EXTERN_FUNCS *ef;
        ASN1_VALUE **tmpfld;
+       const ASN1_AUX *aux = it->funcs;
+       ASN1_aux_cb *asn1_cb;
+       ASN1_PRINT_ARG parg;
        int i;
+       if (aux && aux->asn1_cb)
+               {
+               parg.out = out;
+               parg.indent = indent;
+               parg.pctx = pctx;
+               asn1_cb = aux->asn1_cb;
+               }
+       else asn1_cb = 0;
+
        if(*fld == NULL)
                {
                if (pctx->flags & ASN1_PCTX_FLAGS_SHOW_ABSENT)
                        {
-                       if (!nohdr && !asn1_print_fsname(out, indent, fname, sname, pctx))
+                       if (!nohdr && !asn1_print_fsname(out, indent,
+                                                       fname, sname, pctx))
                                return 0;
                        if (BIO_puts(out, "<ABSENT>\n") <= 0)
                                return 0;
@@ -283,6 +295,15 @@ static int asn1_item_print_ctx(BIO *out, ASN1_VALUE **fld, int indent,
                                }
                        }
 
+               if (asn1_cb)
+                       {
+                       i = asn1_cb(ASN1_OP_PRINT_PRE, fld, it, &parg);
+                       if (i == 0)
+                               return 0;
+                       if (i == 2)
+                               return 1;
+                       }
+
                /* Print each field entry */
                for(i = 0, tt = it->templates; i < it->tcount; i++, tt++)
                        {
@@ -298,6 +319,13 @@ static int asn1_item_print_ctx(BIO *out, ASN1_VALUE **fld, int indent,
                        if (BIO_printf(out, "%*s}\n", indent, "") < 0)
                                return 0;
                        }
+
+               if (asn1_cb)
+                       {
+                       i = asn1_cb(ASN1_OP_PRINT_POST, fld, it, &parg);
+                       if (i == 0)
+                               return 0;
+                       }
                break;
 
                default: