diff options
Diffstat (limited to 'src/lib/libcrypto/asn1/asn1_par.c')
-rw-r--r-- | src/lib/libcrypto/asn1/asn1_par.c | 48 |
1 files changed, 43 insertions, 5 deletions
diff --git a/src/lib/libcrypto/asn1/asn1_par.c b/src/lib/libcrypto/asn1/asn1_par.c index d1e9816bad..facfdd27fc 100644 --- a/src/lib/libcrypto/asn1/asn1_par.c +++ b/src/lib/libcrypto/asn1/asn1_par.c | |||
@@ -65,7 +65,7 @@ | |||
65 | static int asn1_print_info(BIO *bp, int tag, int xclass,int constructed, | 65 | static int asn1_print_info(BIO *bp, int tag, int xclass,int constructed, |
66 | int indent); | 66 | int indent); |
67 | static int asn1_parse2(BIO *bp, unsigned char **pp, long length, | 67 | static int asn1_parse2(BIO *bp, unsigned char **pp, long length, |
68 | int offset, int depth, int indent); | 68 | int offset, int depth, int indent, int dump); |
69 | static int asn1_print_info(BIO *bp, int tag, int xclass, int constructed, | 69 | static int asn1_print_info(BIO *bp, int tag, int xclass, int constructed, |
70 | int indent) | 70 | int indent) |
71 | { | 71 | { |
@@ -110,11 +110,16 @@ err: | |||
110 | 110 | ||
111 | int ASN1_parse(BIO *bp, unsigned char *pp, long len, int indent) | 111 | int ASN1_parse(BIO *bp, unsigned char *pp, long len, int indent) |
112 | { | 112 | { |
113 | return(asn1_parse2(bp,&pp,len,0,0,indent)); | 113 | return(asn1_parse2(bp,&pp,len,0,0,indent,0)); |
114 | } | ||
115 | |||
116 | int ASN1_parse_dump(BIO *bp, unsigned char *pp, long len, int indent, int dump) | ||
117 | { | ||
118 | return(asn1_parse2(bp,&pp,len,0,0,indent,dump)); | ||
114 | } | 119 | } |
115 | 120 | ||
116 | static int asn1_parse2(BIO *bp, unsigned char **pp, long length, int offset, | 121 | static int asn1_parse2(BIO *bp, unsigned char **pp, long length, int offset, |
117 | int depth, int indent) | 122 | int depth, int indent, int dump) |
118 | { | 123 | { |
119 | unsigned char *p,*ep,*tot,*op,*opp; | 124 | unsigned char *p,*ep,*tot,*op,*opp; |
120 | long len; | 125 | long len; |
@@ -123,7 +128,13 @@ static int asn1_parse2(BIO *bp, unsigned char **pp, long length, int offset, | |||
123 | ASN1_OBJECT *o=NULL; | 128 | ASN1_OBJECT *o=NULL; |
124 | ASN1_OCTET_STRING *os=NULL; | 129 | ASN1_OCTET_STRING *os=NULL; |
125 | /* ASN1_BMPSTRING *bmp=NULL;*/ | 130 | /* ASN1_BMPSTRING *bmp=NULL;*/ |
131 | int dump_indent; | ||
126 | 132 | ||
133 | #if 0 | ||
134 | dump_indent = indent; | ||
135 | #else | ||
136 | dump_indent = 6; /* Because we know BIO_dump_indent() */ | ||
137 | #endif | ||
127 | p= *pp; | 138 | p= *pp; |
128 | tot=p+length; | 139 | tot=p+length; |
129 | op=p-1; | 140 | op=p-1; |
@@ -178,7 +189,7 @@ static int asn1_parse2(BIO *bp, unsigned char **pp, long length, int offset, | |||
178 | { | 189 | { |
179 | r=asn1_parse2(bp,&p,(long)(tot-p), | 190 | r=asn1_parse2(bp,&p,(long)(tot-p), |
180 | offset+(p - *pp),depth+1, | 191 | offset+(p - *pp),depth+1, |
181 | indent); | 192 | indent,dump); |
182 | if (r == 0) { ret=0; goto end; } | 193 | if (r == 0) { ret=0; goto end; } |
183 | if ((r == 2) || (p >= tot)) break; | 194 | if ((r == 2) || (p >= tot)) break; |
184 | } | 195 | } |
@@ -188,7 +199,7 @@ static int asn1_parse2(BIO *bp, unsigned char **pp, long length, int offset, | |||
188 | { | 199 | { |
189 | r=asn1_parse2(bp,&p,(long)len, | 200 | r=asn1_parse2(bp,&p,(long)len, |
190 | offset+(p - *pp),depth+1, | 201 | offset+(p - *pp),depth+1, |
191 | indent); | 202 | indent,dump); |
192 | if (r == 0) { ret=0; goto end; } | 203 | if (r == 0) { ret=0; goto end; } |
193 | } | 204 | } |
194 | } | 205 | } |
@@ -273,6 +284,20 @@ static int asn1_parse2(BIO *bp, unsigned char **pp, long length, int offset, | |||
273 | os->length) <= 0) | 284 | os->length) <= 0) |
274 | goto end; | 285 | goto end; |
275 | } | 286 | } |
287 | if (!printable && (os->length > 0) | ||
288 | && dump) | ||
289 | { | ||
290 | if (!nl) | ||
291 | { | ||
292 | if (BIO_write(bp,"\n",1) <= 0) | ||
293 | goto end; | ||
294 | } | ||
295 | if (BIO_dump_indent(bp,(char *)opp, | ||
296 | ((dump == -1 || dump > os->length)?os->length:dump), | ||
297 | dump_indent) <= 0) | ||
298 | goto end; | ||
299 | nl=1; | ||
300 | } | ||
276 | M_ASN1_OCTET_STRING_free(os); | 301 | M_ASN1_OCTET_STRING_free(os); |
277 | os=NULL; | 302 | os=NULL; |
278 | } | 303 | } |
@@ -341,6 +366,19 @@ static int asn1_parse2(BIO *bp, unsigned char **pp, long length, int offset, | |||
341 | } | 366 | } |
342 | M_ASN1_ENUMERATED_free(bs); | 367 | M_ASN1_ENUMERATED_free(bs); |
343 | } | 368 | } |
369 | else if (len > 0 && dump) | ||
370 | { | ||
371 | if (!nl) | ||
372 | { | ||
373 | if (BIO_write(bp,"\n",1) <= 0) | ||
374 | goto end; | ||
375 | } | ||
376 | if (BIO_dump_indent(bp,(char *)p, | ||
377 | ((dump == -1 || dump > len)?len:dump), | ||
378 | dump_indent) <= 0) | ||
379 | goto end; | ||
380 | nl=1; | ||
381 | } | ||
344 | 382 | ||
345 | if (!nl) | 383 | if (!nl) |
346 | { | 384 | { |