X-Git-Url: https://git.librecmc.org/?a=blobdiff_plain;f=apps%2Fasn1pars.c;h=1b272b29770a1c5dcaa8d72c10bdd8393133764d;hb=6d114240b921edc9c1135568392199a652acd0db;hp=3d382282e41c497a0fbedc06b9cbe96e941a5b5a;hpb=78414a6a897db42c9bcf06aa21c705811ab33921;p=oweals%2Fopenssl.git diff --git a/apps/asn1pars.c b/apps/asn1pars.c index 3d382282e4..1b272b2977 100644 --- a/apps/asn1pars.c +++ b/apps/asn1pars.c @@ -56,19 +56,18 @@ * [including the GNU Public Licence.] */ +/* A nice addition from Dr Stephen Henson to + * add the -strparse option which parses nested binary structures + */ + #include #include #include #include "apps.h" -#include "err.h" -#include "evp.h" -#include "x509.h" -#include "pem.h" - -#define FORMAT_UNDEF 0 -#define FORMAT_ASN1 1 -#define FORMAT_TEXT 2 -#define FORMAT_PEM 3 +#include +#include +#include +#include /* -inform arg - input format - default PEM (DER or PEM) * -in arg - input file - default stdin @@ -81,17 +80,18 @@ #undef PROG #define PROG asn1parse_main -int MAIN(argc, argv) -int argc; -char **argv; +int MAIN(int argc, char **argv) { - int i,badops=0,offset=0,ret=1; + int i,badops=0,offset=0,ret=1,j; unsigned int length=0; - long num; - BIO *in=NULL,*out=NULL,*b64=NULL; + long num,tmplen; + 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; + ASN1_TYPE *at=NULL; informat=FORMAT_PEM; @@ -104,6 +104,11 @@ char **argv; prog=argv[0]; argc--; argv++; + if ((osk=sk_new_null()) == NULL) + { + BIO_printf(bio_err,"Malloc failure\n"); + goto end; + } while (argc >= 1) { if (strcmp(*argv,"-inform") == 0) @@ -116,6 +121,11 @@ 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; @@ -136,6 +146,11 @@ char **argv; length= atoi(*(++argv)); if (length == 0) goto bad; } + else if (strcmp(*argv,"-strparse") == 0) + { + if (--argc < 1) goto bad; + sk_push(osk,*(++argv)); + } else { BIO_printf(bio_err,"unknown option %s\n",*argv); @@ -152,11 +167,15 @@ bad: BIO_printf(bio_err,"%s [options] data; + /* If any structs to parse go through in sequence */ + + if (sk_num(osk)) + { + tmpbuf=(unsigned char *)str; + tmplen=num; + for (i=0; ivalue.asn1_string->data; + tmplen=at->value.asn1_string->length; + } + str=(char *)tmpbuf; + num=tmplen; + } + if (length == 0) length=(unsigned int)num; + if(derout) { + if(BIO_write(derout, str + offset, length) != (int)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); @@ -226,12 +294,15 @@ 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); if (ret != 0) ERR_print_errors(bio_err); if (buf != NULL) BUF_MEM_free(buf); + if (at != NULL) ASN1_TYPE_free(at); + if (osk != NULL) sk_free(osk); OBJ_cleanup(); EXIT(ret); }