diff options
Diffstat (limited to 'src/lib/libcrypto/asn1/asn1_par.c')
-rw-r--r-- | src/lib/libcrypto/asn1/asn1_par.c | 58 |
1 files changed, 41 insertions, 17 deletions
diff --git a/src/lib/libcrypto/asn1/asn1_par.c b/src/lib/libcrypto/asn1/asn1_par.c index 676d434f03..501b62a4b1 100644 --- a/src/lib/libcrypto/asn1/asn1_par.c +++ b/src/lib/libcrypto/asn1/asn1_par.c | |||
@@ -64,7 +64,7 @@ | |||
64 | 64 | ||
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, const unsigned char **pp, long length, |
68 | int offset, int depth, int indent, int dump); | 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) |
@@ -88,7 +88,10 @@ static int asn1_print_info(BIO *bp, int tag, int xclass, int constructed, | |||
88 | BIO_snprintf(str,sizeof str,"cont [ %d ]",tag); | 88 | BIO_snprintf(str,sizeof str,"cont [ %d ]",tag); |
89 | else if ((xclass & V_ASN1_APPLICATION) == V_ASN1_APPLICATION) | 89 | else if ((xclass & V_ASN1_APPLICATION) == V_ASN1_APPLICATION) |
90 | BIO_snprintf(str,sizeof str,"appl [ %d ]",tag); | 90 | BIO_snprintf(str,sizeof str,"appl [ %d ]",tag); |
91 | else p = ASN1_tag2str(tag); | 91 | else if (tag > 30) |
92 | BIO_snprintf(str,sizeof str,"<ASN1 %d>",tag); | ||
93 | else | ||
94 | p = ASN1_tag2str(tag); | ||
92 | 95 | ||
93 | if (p2 != NULL) | 96 | if (p2 != NULL) |
94 | { | 97 | { |
@@ -103,20 +106,20 @@ err: | |||
103 | return(0); | 106 | return(0); |
104 | } | 107 | } |
105 | 108 | ||
106 | int ASN1_parse(BIO *bp, unsigned char *pp, long len, int indent) | 109 | int ASN1_parse(BIO *bp, const unsigned char *pp, long len, int indent) |
107 | { | 110 | { |
108 | return(asn1_parse2(bp,&pp,len,0,0,indent,0)); | 111 | return(asn1_parse2(bp,&pp,len,0,0,indent,0)); |
109 | } | 112 | } |
110 | 113 | ||
111 | int ASN1_parse_dump(BIO *bp, unsigned char *pp, long len, int indent, int dump) | 114 | int ASN1_parse_dump(BIO *bp, const unsigned char *pp, long len, int indent, int dump) |
112 | { | 115 | { |
113 | return(asn1_parse2(bp,&pp,len,0,0,indent,dump)); | 116 | return(asn1_parse2(bp,&pp,len,0,0,indent,dump)); |
114 | } | 117 | } |
115 | 118 | ||
116 | static int asn1_parse2(BIO *bp, unsigned char **pp, long length, int offset, | 119 | static int asn1_parse2(BIO *bp, const unsigned char **pp, long length, int offset, |
117 | int depth, int indent, int dump) | 120 | int depth, int indent, int dump) |
118 | { | 121 | { |
119 | unsigned char *p,*ep,*tot,*op,*opp; | 122 | const unsigned char *p,*ep,*tot,*op,*opp; |
120 | long len; | 123 | long len; |
121 | int tag,xclass,ret=0; | 124 | int tag,xclass,ret=0; |
122 | int nl,hl,j,r; | 125 | int nl,hl,j,r; |
@@ -215,7 +218,7 @@ static int asn1_parse2(BIO *bp, unsigned char **pp, long length, int offset, | |||
215 | { | 218 | { |
216 | if (BIO_write(bp,":",1) <= 0) goto end; | 219 | if (BIO_write(bp,":",1) <= 0) goto end; |
217 | if ((len > 0) && | 220 | if ((len > 0) && |
218 | BIO_write(bp,(char *)p,(int)len) | 221 | BIO_write(bp,(const char *)p,(int)len) |
219 | != (int)len) | 222 | != (int)len) |
220 | goto end; | 223 | goto end; |
221 | } | 224 | } |
@@ -256,9 +259,11 @@ static int asn1_parse2(BIO *bp, unsigned char **pp, long length, int offset, | |||
256 | 259 | ||
257 | opp=op; | 260 | opp=op; |
258 | os=d2i_ASN1_OCTET_STRING(NULL,&opp,len+hl); | 261 | os=d2i_ASN1_OCTET_STRING(NULL,&opp,len+hl); |
259 | if (os != NULL) | 262 | if (os != NULL && os->length > 0) |
260 | { | 263 | { |
261 | opp=os->data; | 264 | opp = os->data; |
265 | /* testing whether the octet string is | ||
266 | * printable */ | ||
262 | for (i=0; i<os->length; i++) | 267 | for (i=0; i<os->length; i++) |
263 | { | 268 | { |
264 | if (( (opp[i] < ' ') && | 269 | if (( (opp[i] < ' ') && |
@@ -271,28 +276,47 @@ static int asn1_parse2(BIO *bp, unsigned char **pp, long length, int offset, | |||
271 | break; | 276 | break; |
272 | } | 277 | } |
273 | } | 278 | } |
274 | if (printable && (os->length > 0)) | 279 | if (printable) |
280 | /* printable string */ | ||
275 | { | 281 | { |
276 | if (BIO_write(bp,":",1) <= 0) | 282 | if (BIO_write(bp,":",1) <= 0) |
277 | goto end; | 283 | goto end; |
278 | if (BIO_write(bp,(char *)opp, | 284 | if (BIO_write(bp,(const char *)opp, |
279 | os->length) <= 0) | 285 | os->length) <= 0) |
280 | goto end; | 286 | goto end; |
281 | } | 287 | } |
282 | if (!printable && (os->length > 0) | 288 | else if (!dump) |
283 | && dump) | 289 | /* not printable => print octet string |
290 | * as hex dump */ | ||
291 | { | ||
292 | if (BIO_write(bp,"[HEX DUMP]:",11) <= 0) | ||
293 | goto end; | ||
294 | for (i=0; i<os->length; i++) | ||
295 | { | ||
296 | if (BIO_printf(bp,"%02X" | ||
297 | , opp[i]) <= 0) | ||
298 | goto end; | ||
299 | } | ||
300 | } | ||
301 | else | ||
302 | /* print the normal dump */ | ||
284 | { | 303 | { |
285 | if (!nl) | 304 | if (!nl) |
286 | { | 305 | { |
287 | if (BIO_write(bp,"\n",1) <= 0) | 306 | if (BIO_write(bp,"\n",1) <= 0) |
288 | goto end; | 307 | goto end; |
289 | } | 308 | } |
290 | if (BIO_dump_indent(bp,(char *)opp, | 309 | if (BIO_dump_indent(bp, |
291 | ((dump == -1 || dump > os->length)?os->length:dump), | 310 | (const char *)opp, |
311 | ((dump == -1 || dump > | ||
312 | os->length)?os->length:dump), | ||
292 | dump_indent) <= 0) | 313 | dump_indent) <= 0) |
293 | goto end; | 314 | goto end; |
294 | nl=1; | 315 | nl=1; |
295 | } | 316 | } |
317 | } | ||
318 | if (os != NULL) | ||
319 | { | ||
296 | M_ASN1_OCTET_STRING_free(os); | 320 | M_ASN1_OCTET_STRING_free(os); |
297 | os=NULL; | 321 | os=NULL; |
298 | } | 322 | } |
@@ -368,7 +392,7 @@ static int asn1_parse2(BIO *bp, unsigned char **pp, long length, int offset, | |||
368 | if (BIO_write(bp,"\n",1) <= 0) | 392 | if (BIO_write(bp,"\n",1) <= 0) |
369 | goto end; | 393 | goto end; |
370 | } | 394 | } |
371 | if (BIO_dump_indent(bp,(char *)p, | 395 | if (BIO_dump_indent(bp,(const char *)p, |
372 | ((dump == -1 || dump > len)?len:dump), | 396 | ((dump == -1 || dump > len)?len:dump), |
373 | dump_indent) <= 0) | 397 | dump_indent) <= 0) |
374 | goto end; | 398 | goto end; |
@@ -398,7 +422,7 @@ end: | |||
398 | 422 | ||
399 | const char *ASN1_tag2str(int tag) | 423 | const char *ASN1_tag2str(int tag) |
400 | { | 424 | { |
401 | const static char *tag2str[] = { | 425 | static const char *tag2str[] = { |
402 | "EOC", "BOOLEAN", "INTEGER", "BIT STRING", "OCTET STRING", /* 0-4 */ | 426 | "EOC", "BOOLEAN", "INTEGER", "BIT STRING", "OCTET STRING", /* 0-4 */ |
403 | "NULL", "OBJECT", "OBJECT DESCRIPTOR", "EXTERNAL", "REAL", /* 5-9 */ | 427 | "NULL", "OBJECT", "OBJECT DESCRIPTOR", "EXTERNAL", "REAL", /* 5-9 */ |
404 | "ENUMERATED", "<ASN1 11>", "UTF8STRING", "<ASN1 13>", /* 10-13 */ | 428 | "ENUMERATED", "<ASN1 11>", "UTF8STRING", "<ASN1 13>", /* 10-13 */ |