diff options
author | Dr. Stephen Henson <steve@openssl.org> | 1999-05-12 01:56:27 +0000 |
---|---|---|
committer | Dr. Stephen Henson <steve@openssl.org> | 1999-05-12 01:56:27 +0000 |
commit | f5eac85edcb6e8b24593282c9e140daeeb758cac (patch) | |
tree | fdbb7fb2eb0a5286c15fad0d6b31c9ec5768f416 | |
parent | d53ff9abf3dc1b164f1ca3a2378a5515d4f74e8e (diff) |
Add new -out option to asn1parse to allow the parsed data to be output.
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
-rw-r--r-- | CHANGES | 5 | ||||
-rw-r--r-- | apps/asn1pars.c | 32 | ||||
-rw-r--r-- | e_os.h | 3 |
3 files changed, 37 insertions, 3 deletions
@@ -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 diff --git a/apps/asn1pars.c b/apps/asn1pars.c index a5e4bfcf5e..c7e9cf43d8 100644 --- a/apps/asn1pars.c +++ b/apps/asn1pars.c @@ -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); @@ -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 |