diff options
Diffstat (limited to 'lib/libcrypto/asn1/asn1_par.c')
-rw-r--r-- | lib/libcrypto/asn1/asn1_par.c | 168 |
1 files changed, 84 insertions, 84 deletions
diff --git a/lib/libcrypto/asn1/asn1_par.c b/lib/libcrypto/asn1/asn1_par.c index e34c75a4184..d68d4a82984 100644 --- a/lib/libcrypto/asn1/asn1_par.c +++ b/lib/libcrypto/asn1/asn1_par.c @@ -68,7 +68,7 @@ static int asn1_parse2(BIO *bp, const unsigned char **pp, long length, int offset, int depth, int indent, int dump); static int asn1_print_info(BIO *bp, int tag, int xclass, int constructed, int indent) - { +{ static const char fmt[]="%-18s"; char str[128]; const char *p; @@ -97,21 +97,21 @@ static int asn1_print_info(BIO *bp, int tag, int xclass, int constructed, return(1); err: return(0); - } +} int ASN1_parse(BIO *bp, const unsigned char *pp, long len, int indent) - { +{ return(asn1_parse2(bp,&pp,len,0,0,indent,0)); - } +} int ASN1_parse_dump(BIO *bp, const unsigned char *pp, long len, int indent, int dump) - { +{ return(asn1_parse2(bp,&pp,len,0,0,indent,dump)); - } +} static int asn1_parse2(BIO *bp, const unsigned char **pp, long length, int offset, int depth, int indent, int dump) - { +{ const unsigned char *p,*ep,*tot,*op,*opp; long len; int tag,xclass,ret=0; @@ -130,19 +130,19 @@ static int asn1_parse2(BIO *bp, const unsigned char **pp, long length, int offse tot=p+length; op=p-1; while ((p < tot) && (op < p)) - { + { op=p; j=ASN1_get_object(&p,&len,&tag,&xclass,length); #ifdef LINT j=j; #endif if (j & 0x80) - { + { if (BIO_write(bp,"Error in encoding\n",18) <= 0) goto end; ret=0; goto end; - } + } hl=(p-op); length-=hl; /* if j == 0x21 it is a constructed indefinite length object */ @@ -150,57 +150,57 @@ static int asn1_parse2(BIO *bp, const unsigned char **pp, long length, int offse <= 0) goto end; if (j != (V_ASN1_CONSTRUCTED | 1)) - { + { if (BIO_printf(bp,"d=%-2d hl=%ld l=%4ld ", depth,(long)hl,len) <= 0) goto end; - } + } else - { + { if (BIO_printf(bp,"d=%-2d hl=%ld l=inf ", depth,(long)hl) <= 0) goto end; - } + } if (!asn1_print_info(bp,tag,xclass,j,(indent)?depth:0)) goto end; if (j & V_ASN1_CONSTRUCTED) - { + { ep=p+len; if (BIO_write(bp,"\n",1) <= 0) goto end; if (len > length) - { + { BIO_printf(bp, "length is greater than %ld\n",length); ret=0; goto end; - } + } if ((j == 0x21) && (len == 0)) - { + { for (;;) - { + { r=asn1_parse2(bp,&p,(long)(tot-p), offset+(p - *pp),depth+1, indent,dump); if (r == 0) { ret=0; goto end; } if ((r == 2) || (p >= tot)) break; - } } + } else while (p < ep) - { + { r=asn1_parse2(bp,&p,(long)len, offset+(p - *pp),depth+1, indent,dump); if (r == 0) { ret=0; goto end; } - } - } + } + } else if (xclass != 0) - { + { p+=len; if (BIO_write(bp,"\n",1) <= 0) goto end; - } + } else - { + { nl=0; if ( (tag == V_ASN1_PRINTABLESTRING) || (tag == V_ASN1_T61STRING) || @@ -210,97 +210,97 @@ static int asn1_parse2(BIO *bp, const unsigned char **pp, long length, int offse (tag == V_ASN1_UTF8STRING) || (tag == V_ASN1_UTCTIME) || (tag == V_ASN1_GENERALIZEDTIME)) - { + { if (BIO_write(bp,":",1) <= 0) goto end; if ((len > 0) && BIO_write(bp,(const char *)p,(int)len) != (int)len) goto end; - } + } else if (tag == V_ASN1_OBJECT) - { + { opp=op; if (d2i_ASN1_OBJECT(&o,&opp,len+hl) != NULL) - { + { if (BIO_write(bp,":",1) <= 0) goto end; i2a_ASN1_OBJECT(bp,o); - } + } else - { + { if (BIO_write(bp,":BAD OBJECT",11) <= 0) goto end; - } } + } else if (tag == V_ASN1_BOOLEAN) - { + { int ii; opp=op; ii=d2i_ASN1_BOOLEAN(NULL,&opp,len+hl); if (ii < 0) - { + { if (BIO_write(bp,"Bad boolean\n",12) <= 0) goto end; - } - BIO_printf(bp,":%d",ii); } + BIO_printf(bp,":%d",ii); + } else if (tag == V_ASN1_BMPSTRING) - { + { /* do the BMP thang */ - } + } else if (tag == V_ASN1_OCTET_STRING) - { + { int i,printable=1; opp=op; os=d2i_ASN1_OCTET_STRING(NULL,&opp,len+hl); if (os != NULL && os->length > 0) - { + { opp = os->data; /* testing whether the octet string is * printable */ for (i=0; i<os->length; i++) - { + { if (( (opp[i] < ' ') && (opp[i] != '\n') && (opp[i] != '\r') && (opp[i] != '\t')) || (opp[i] > '~')) - { + { printable=0; break; - } } + } if (printable) /* printable string */ - { + { if (BIO_write(bp,":",1) <= 0) goto end; if (BIO_write(bp,(const char *)opp, os->length) <= 0) goto end; - } + } else if (!dump) /* not printable => print octet string * as hex dump */ - { + { if (BIO_write(bp,"[HEX DUMP]:",11) <= 0) goto end; for (i=0; i<os->length; i++) - { + { if (BIO_printf(bp,"%02X" , opp[i]) <= 0) goto end; - } } + } else /* print the normal dump */ - { + { if (!nl) - { + { if (BIO_write(bp,"\n",1) <= 0) goto end; - } + } if (BIO_dump_indent(bp, (const char *)opp, ((dump == -1 || dump > @@ -308,112 +308,112 @@ static int asn1_parse2(BIO *bp, const unsigned char **pp, long length, int offse dump_indent) <= 0) goto end; nl=1; - } } + } if (os != NULL) - { + { M_ASN1_OCTET_STRING_free(os); os=NULL; - } } + } else if (tag == V_ASN1_INTEGER) - { + { ASN1_INTEGER *bs; int i; opp=op; bs=d2i_ASN1_INTEGER(NULL,&opp,len+hl); if (bs != NULL) - { + { if (BIO_write(bp,":",1) <= 0) goto end; if (bs->type == V_ASN1_NEG_INTEGER) if (BIO_write(bp,"-",1) <= 0) goto end; for (i=0; i<bs->length; i++) - { + { if (BIO_printf(bp,"%02X", bs->data[i]) <= 0) goto end; - } + } if (bs->length == 0) - { + { if (BIO_write(bp,"00",2) <= 0) goto end; - } } + } else - { + { if (BIO_write(bp,"BAD INTEGER",11) <= 0) goto end; - } - M_ASN1_INTEGER_free(bs); } + M_ASN1_INTEGER_free(bs); + } else if (tag == V_ASN1_ENUMERATED) - { + { ASN1_ENUMERATED *bs; int i; opp=op; bs=d2i_ASN1_ENUMERATED(NULL,&opp,len+hl); if (bs != NULL) - { + { if (BIO_write(bp,":",1) <= 0) goto end; if (bs->type == V_ASN1_NEG_ENUMERATED) if (BIO_write(bp,"-",1) <= 0) goto end; for (i=0; i<bs->length; i++) - { + { if (BIO_printf(bp,"%02X", bs->data[i]) <= 0) goto end; - } + } if (bs->length == 0) - { + { if (BIO_write(bp,"00",2) <= 0) goto end; - } } + } else - { + { if (BIO_write(bp,"BAD ENUMERATED",14) <= 0) goto end; - } - M_ASN1_ENUMERATED_free(bs); } + M_ASN1_ENUMERATED_free(bs); + } else if (len > 0 && dump) - { + { if (!nl) - { + { if (BIO_write(bp,"\n",1) <= 0) goto end; - } + } if (BIO_dump_indent(bp,(const char *)p, ((dump == -1 || dump > len)?len:dump), dump_indent) <= 0) goto end; nl=1; - } + } if (!nl) - { + { if (BIO_write(bp,"\n",1) <= 0) goto end; - } + } p+=len; if ((tag == V_ASN1_EOC) && (xclass == 0)) - { + { ret=2; /* End of sequence */ goto end; - } } - length-=len; } + length-=len; + } ret=1; end: if (o != NULL) ASN1_OBJECT_free(o); if (os != NULL) M_ASN1_OCTET_STRING_free(os); *pp=p; return(ret); - } +} const char *ASN1_tag2str(int tag) { @@ -426,7 +426,7 @@ const char *ASN1_tag2str(int tag) "VIDEOTEXSTRING", "IA5STRING", "UTCTIME","GENERALIZEDTIME", /* 21-24 */ "GRAPHICSTRING", "VISIBLESTRING", "GENERALSTRING", /* 25-27 */ "UNIVERSALSTRING", "<ASN1 29>", "BMPSTRING" /* 28-30 */ - }; +}; if((tag == V_ASN1_NEG_INTEGER) || (tag == V_ASN1_NEG_ENUMERATED)) tag &= ~0x100; |