From 6b5c1d940b5a653a24b91d3c52bca935399b713c Mon Sep 17 00:00:00 2001 From: Matt Caswell Date: Mon, 26 May 2014 17:16:43 +0100 Subject: [PATCH] Added -strictpem parameter to enable processing of PEM files with data prior to the BEGIN marker --- apps/asn1pars.c | 46 ++++++++++++++++++++++++++++++++++++++++-- doc/apps/asn1parse.pod | 10 ++++++++- 2 files changed, 53 insertions(+), 3 deletions(-) diff --git a/apps/asn1pars.c b/apps/asn1pars.c index 0d6607071f..dcdf628d40 100644 --- a/apps/asn1pars.c +++ b/apps/asn1pars.c @@ -80,6 +80,9 @@ #undef PROG #define PROG asn1parse_main +/* Minimum buffer size to be used */ +#define MIN_BUFFER 256 + int MAIN(int, char **); static int do_generate(BIO *bio, char *genstr, char *genconf, BUF_MEM *buf); @@ -90,7 +93,7 @@ int MAIN(int argc, char **argv) unsigned int length=0; long num,tmplen; BIO *in=NULL,*out=NULL,*b64=NULL, *derout = NULL; - int informat,indent=0, noout = 0, dump = 0; + int informat,indent=0, noout = 0, dump = 0, strictpem = 0; char *infile=NULL,*str=NULL,*prog,*oidfile=NULL, *derfile=NULL; char *genstr=NULL, *genconf=NULL; unsigned char *tmpbuf; @@ -181,6 +184,11 @@ int MAIN(int argc, char **argv) if (--argc < 1) goto bad; genconf= *(++argv); } + else if (strcmp(*argv,"-strictpem") == 0) + { + strictpem = 1; + informat = FORMAT_PEM; + } else { BIO_printf(bio_err,"unknown option %s\n",*argv); @@ -211,6 +219,8 @@ bad: BIO_printf(bio_err," ASN1 blob wrappings\n"); BIO_printf(bio_err," -genstr str string to generate ASN1 structure from\n"); BIO_printf(bio_err," -genconf file file to generate ASN1 structure from\n"); + BIO_printf(bio_err," -strictpem do not attempt base64 decode outside PEM markers (-inform \n"); + BIO_printf(bio_err," will be ignored)\n"); goto end; } @@ -262,7 +272,7 @@ bad: } if ((buf=BUF_MEM_new()) == NULL) goto end; - if (!BUF_MEM_grow(buf,BUFSIZ*8)) goto end; /* Pre-allocate :-) */ + if (!BUF_MEM_grow(buf,(BUFSIZ*8)data,MIN_BUFFER-1); + + if (i <= 0) + { + BIO_printf(bio_err, "Error: Cannot find start line\n"); + goto end; + } + + /* Strip trailing spaces etc */ + do + i--; + while ((i >= 0) && (buf->data[i] <= ' ')); + + buf->data[++i]='\0'; + + /* Check if we have a PEM BEGIN marker */ + if (strncmp(buf->data,"-----BEGIN ",11) == 0) + { + if (strncmp(&(buf->data[i-5]),"-----",5) != 0) + continue; + break; + } + } + } + + + if ((b64=BIO_new(BIO_f_base64())) == NULL) goto end; BIO_push(b64,in); diff --git a/doc/apps/asn1parse.pod b/doc/apps/asn1parse.pod index f7bb926211..577d997630 100644 --- a/doc/apps/asn1parse.pod +++ b/doc/apps/asn1parse.pod @@ -18,6 +18,7 @@ B B [B<-strparse offset>] [B<-genstr string>] [B<-genconf file>] +[B<-strictpem>] =head1 DESCRIPTION @@ -78,6 +79,13 @@ B. The encoded data is passed through the ASN1 parser and printed out as though it came from a file, the contents can thus be examined and written to a file using the B option. +=item B<-strictpem> + +If this option is used then B<-inform> will be ignored. Without this option any +data in a PEM format input file will be treated as base64 encoded and processed +whether it has the normal PEM BEGIN and END markers or not. This option will +ignore any data prior to the start of the BEGIN marker in a PEM file. + =back =head2 OUTPUT @@ -88,7 +96,7 @@ The output will typically contain lines like this: ..... - 229:d=3 hl=3 l= 141 prim: BIT STRING + 229:d=3 hl=3 l= 141 prim: BIT STRING 373:d=2 hl=3 l= 162 cons: cont [ 3 ] 376:d=3 hl=3 l= 159 cons: SEQUENCE 379:d=4 hl=2 l= 29 cons: SEQUENCE -- 2.34.1