From 3d9243f1b614640f3dcbba0d7de89f363581e8e0 Mon Sep 17 00:00:00 2001 From: Matt Caswell Date: Mon, 26 May 2014 23:22:08 +0100 Subject: [PATCH] Changed -strictpem to use PEM_read_bio --- apps/asn1pars.c | 93 +++++++++++++++++------------------------- doc/apps/asn1parse.pod | 7 ++-- 2 files changed, 42 insertions(+), 58 deletions(-) diff --git a/apps/asn1pars.c b/apps/asn1pars.c index dcdf628d40..42f37d7819 100644 --- a/apps/asn1pars.c +++ b/apps/asn1pars.c @@ -80,8 +80,6 @@ #undef PROG #define PROG asn1parse_main -/* Minimum buffer size to be used */ -#define MIN_BUFFER 256 int MAIN(int, char **); @@ -94,7 +92,7 @@ int MAIN(int argc, char **argv) long num,tmplen; BIO *in=NULL,*out=NULL,*b64=NULL, *derout = NULL; int informat,indent=0, noout = 0, dump = 0, strictpem = 0; - char *infile=NULL,*str=NULL,*prog,*oidfile=NULL, *derfile=NULL; + char *infile=NULL,*str=NULL,*prog,*oidfile=NULL, *derfile=NULL, *name=NULL, *header=NULL; char *genstr=NULL, *genconf=NULL; unsigned char *tmpbuf; const unsigned char *ctmpbuf; @@ -271,76 +269,58 @@ bad: } } - if ((buf=BUF_MEM_new()) == NULL) goto end; - 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; - } - } + ERR_print_errors(bio_err); + goto end; } + } + else + { + if (informat == FORMAT_PEM) + { + BIO *tmp; + + if ((b64=BIO_new(BIO_f_base64())) == NULL) + goto end; + BIO_push(b64,in); + tmp=in; + in=b64; + b64=tmp; + } - if ((b64=BIO_new(BIO_f_base64())) == NULL) - goto end; - BIO_push(b64,in); - tmp=in; - in=b64; - b64=tmp; + num=0; + for (;;) + { + if (!BUF_MEM_grow(buf,(int)num+BUFSIZ)) goto end; + i=BIO_read(in,&(buf->data[num]),BUFSIZ); + if (i <= 0) break; + num+=i; + } } + str=buf->data; - num=0; - for (;;) - { - if (!BUF_MEM_grow(buf,(int)num+BUFSIZ)) goto end; - i=BIO_read(in,&(buf->data[num]),BUFSIZ); - if (i <= 0) break; - num+=i; - } } - str=buf->data; /* If any structs to parse go through in sequence */ @@ -419,6 +399,9 @@ end: if (ret != 0) ERR_print_errors(bio_err); if (buf != NULL) BUF_MEM_free(buf); + if (name != NULL) OPENSSL_free(name); + if (header != NULL) OPENSSL_free(header); + if (strictpem && str != NULL) OPENSSL_free(str); if (at != NULL) ASN1_TYPE_free(at); if (osk != NULL) sk_OPENSSL_STRING_free(osk); OBJ_cleanup(); diff --git a/doc/apps/asn1parse.pod b/doc/apps/asn1parse.pod index 577d997630..5acea8cfc5 100644 --- a/doc/apps/asn1parse.pod +++ b/doc/apps/asn1parse.pod @@ -82,9 +82,10 @@ 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. +data in a PEM format input file will be treated as being 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, or after an +END marker in a PEM file. =back -- 2.25.1