Add new -out option to asn1parse to allow the parsed data to be output.
authorDr. Stephen Henson <steve@openssl.org>
Wed, 12 May 1999 01:56:27 +0000 (01:56 +0000)
committerDr. Stephen Henson <steve@openssl.org>
Wed, 12 May 1999 01:56:27 +0000 (01:56 +0000)
Fixed -strparse option: it didn't work if used more than once (this was due
to the d2i_ASN1_TYPE call parsing a freed buffer). On Win32 the file wincrypt.h
#define's X509_NAME and PKCS7_SIGNER_INFO causing clashes so these are #undef'ed

CHANGES
apps/asn1pars.c
e_os.h

diff --git a/CHANGES b/CHANGES
index 66db4d6f174419a72c9a6194bb7b69b5863fa03c..df6dbeb0b73015eddb21c2d9a813133a8d96bb88 100644 (file)
--- a/CHANGES
+++ b/CHANGES
@@ -5,6 +5,11 @@
 
  Changes between 0.9.2b and 0.9.3
 
+  *) New option -out to asn1parse to allow the parsed structure to be
+     output to a file. This is most useful when combined with the -strparse
+     option to examine the output of things like OCTET STRINGS.
+     [Steve Henson]
+
   *) Make SSL library a little more fool-proof by not requiring any longer
      that SSL_set_{accept,connect}_state be called before
      SSL_{accept,connect} may be used (SSL_set_..._state is omitted
index a5e4bfcf5e8a54e26f664bd921304853f792223d..c7e9cf43d8695c630ca75d20b02bde1e5f539b52 100644 (file)
@@ -85,9 +85,9 @@ int MAIN(int argc, char **argv)
        int i,badops=0,offset=0,ret=1,j;
        unsigned int length=0;
        long num,tmplen;
-       BIO *in=NULL,*out=NULL,*b64=NULL;
+       BIO *in=NULL,*out=NULL,*b64=NULL, *derout = NULL;
        int informat,indent=0;
-       char *infile=NULL,*str=NULL,*prog,*oidfile=NULL;
+       char *infile=NULL,*str=NULL,*prog,*oidfile=NULL, *derfile=NULL;
        unsigned char *tmpbuf;
        BUF_MEM *buf=NULL;
        STACK *osk=NULL;
@@ -121,6 +121,11 @@ int MAIN(int argc, char **argv)
                        if (--argc < 1) goto bad;
                        infile= *(++argv);
                        }
+               else if (strcmp(*argv,"-out") == 0)
+                       {
+                       if (--argc < 1) goto bad;
+                       derfile= *(++argv);
+                       }
                else if (strcmp(*argv,"-i") == 0)
                        {
                        indent=1;
@@ -170,6 +175,7 @@ bad:
                BIO_printf(bio_err," -strparse offset\n");
                BIO_printf(bio_err,"               a series of these can be used to 'dig' into multiple\n");
                BIO_printf(bio_err,"               ASN1 blob wrappings\n");
+               BIO_printf(bio_err," -out filename output DER encoding to file\n");
                goto end;
                }
 
@@ -206,6 +212,14 @@ bad:
                        }
                }
 
+       if (derfile) {
+               if(!(derout = BIO_new_file(derfile, "wb"))) {
+                       BIO_printf(bio_err,"problems opening %s\n",derfile);
+                       ERR_print_errors(bio_err);
+                       goto end;
+               }
+       }
+
        if ((buf=BUF_MEM_new()) == NULL) goto end;
        if (!BUF_MEM_grow(buf,BUFSIZ*8)) goto end; /* Pre-allocate :-) */
 
@@ -239,6 +253,7 @@ bad:
                tmplen=num;
                for (i=0; i<sk_num(osk); i++)
                        {
+                       ASN1_TYPE *atmp;
                        j=atoi(sk_value(osk,i));
                        if (j == 0)
                                {
@@ -247,7 +262,10 @@ bad:
                                }
                        tmpbuf+=j;
                        tmplen-=j;
-                       if (d2i_ASN1_TYPE(&at,&tmpbuf,tmplen) == NULL)
+                       atmp = at;
+                       at = d2i_ASN1_TYPE(NULL,&tmpbuf,tmplen);
+                       ASN1_TYPE_free(atmp);
+                       if(!at)
                                {
                                BIO_printf(bio_err,"Error parsing structure\n");
                                ERR_print_errors(bio_err);
@@ -262,6 +280,13 @@ bad:
                }
 
        if (length == 0) length=(unsigned int)num;
+       if(derout) {
+               if(BIO_write(derout, str + offset, length) != length) {
+                       BIO_printf(bio_err, "Error writing output\n");
+                       ERR_print_errors(bio_err);
+                       goto end;
+               }
+       }
        if (!ASN1_parse(out,(unsigned char *)&(str[offset]),length,indent))
                {
                ERR_print_errors(bio_err);
@@ -269,6 +294,7 @@ bad:
                }
        ret=0;
 end:
+       BIO_free(derout);
        if (in != NULL) BIO_free(in);
        if (out != NULL) BIO_free(out);
        if (b64 != NULL) BIO_free(b64);
diff --git a/e_os.h b/e_os.h
index cff94e3e2df0bc9d8b414d0afa24b2cadd1b61ee..9f525cb8e1d3e731de0c7310654c7ba309a24cec 100644 (file)
--- a/e_os.h
+++ b/e_os.h
@@ -98,6 +98,9 @@ extern "C" {
 #ifdef WIN32
 #define get_last_sys_error()   GetLastError()
 #define clear_sys_error()      SetLastError(0)
+/* These are defined in wincrypt.h and can cause problems */
+#undef X509_NAME
+#undef PKCS7_SIGNER_INFO
 #if !defined(WINNT)
 #define WIN_CONSOLE_BUG
 #endif