summaryrefslogtreecommitdiff
path: root/src/lib/libcrypto/asn1/asn1_par.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/lib/libcrypto/asn1/asn1_par.c')
-rw-r--r--src/lib/libcrypto/asn1/asn1_par.c198
1 files changed, 114 insertions, 84 deletions
diff --git a/src/lib/libcrypto/asn1/asn1_par.c b/src/lib/libcrypto/asn1/asn1_par.c
index 3906227d21..facfdd27fc 100644
--- a/src/lib/libcrypto/asn1/asn1_par.c
+++ b/src/lib/libcrypto/asn1/asn1_par.c
@@ -58,30 +58,21 @@
58 58
59#include <stdio.h> 59#include <stdio.h>
60#include "cryptlib.h" 60#include "cryptlib.h"
61#include "buffer.h" 61#include <openssl/buffer.h>
62#include "objects.h" 62#include <openssl/objects.h>
63#include "x509.h" 63#include <openssl/asn1.h>
64 64
65#ifndef NOPROTO
66static int asn1_print_info(BIO *bp, int tag, int xclass,int constructed, 65static int asn1_print_info(BIO *bp, int tag, int xclass,int constructed,
67 int indent); 66 int indent);
68static int asn1_parse2(BIO *bp, unsigned char **pp, long length, 67static int asn1_parse2(BIO *bp, unsigned char **pp, long length,
69 int offset, int depth, int indent); 68 int offset, int depth, int indent, int dump);
70#else 69static int asn1_print_info(BIO *bp, int tag, int xclass, int constructed,
71static int asn1_print_info(); 70 int indent)
72static int asn1_parse2();
73#endif
74
75static int asn1_print_info(bp, tag, xclass, constructed,indent)
76BIO *bp;
77int tag;
78int xclass;
79int constructed;
80int indent;
81 { 71 {
82 static char *fmt="%-18s"; 72 static const char fmt[]="%-18s";
83 static char *fmt2="%2d %-15s"; 73 static const char fmt2[]="%2d %-15s";
84 char *p,str[128],*p2=NULL; 74 char str[128];
75 const char *p,*p2=NULL;
85 76
86 if (constructed & V_ASN1_CONSTRUCTED) 77 if (constructed & V_ASN1_CONSTRUCTED)
87 p="cons: "; 78 p="cons: ";
@@ -102,53 +93,8 @@ int indent;
102 sprintf(str,"cont [ %d ]",tag); 93 sprintf(str,"cont [ %d ]",tag);
103 else if ((xclass & V_ASN1_APPLICATION) == V_ASN1_APPLICATION) 94 else if ((xclass & V_ASN1_APPLICATION) == V_ASN1_APPLICATION)
104 sprintf(str,"appl [ %d ]",tag); 95 sprintf(str,"appl [ %d ]",tag);
105 else if ((tag == V_ASN1_EOC) /* && (xclass == V_ASN1_UNIVERSAL) */) 96 else p = ASN1_tag2str(tag);
106 p="EOC";
107 else if (tag == V_ASN1_BOOLEAN)
108 p="BOOLEAN";
109 else if (tag == V_ASN1_INTEGER)
110 p="INTEGER";
111 else if (tag == V_ASN1_BIT_STRING)
112 p="BIT STRING";
113 else if (tag == V_ASN1_OCTET_STRING)
114 p="OCTET STRING";
115 else if (tag == V_ASN1_NULL)
116 p="NULL";
117 else if (tag == V_ASN1_OBJECT)
118 p="OBJECT";
119 else if (tag == V_ASN1_SEQUENCE)
120 p="SEQUENCE";
121 else if (tag == V_ASN1_SET)
122 p="SET";
123 else if (tag == V_ASN1_PRINTABLESTRING)
124 p="PRINTABLESTRING";
125 else if (tag == V_ASN1_T61STRING)
126 p="T61STRING";
127 else if (tag == V_ASN1_IA5STRING)
128 p="IA5STRING";
129 else if (tag == V_ASN1_UTCTIME)
130 p="UTCTIME";
131 97
132 /* extras */
133 else if (tag == V_ASN1_NUMERICSTRING)
134 p="NUMERICSTRING";
135 else if (tag == V_ASN1_VIDEOTEXSTRING)
136 p="VIDEOTEXSTRING";
137 else if (tag == V_ASN1_GENERALIZEDTIME)
138 p="GENERALIZEDTIME";
139 else if (tag == V_ASN1_GRAPHICSTRING)
140 p="GRAPHICSTRING";
141 else if (tag == V_ASN1_ISO64STRING)
142 p="ISO64STRING";
143 else if (tag == V_ASN1_GENERALSTRING)
144 p="GENERALSTRING";
145 else if (tag == V_ASN1_UNIVERSALSTRING)
146 p="UNIVERSALSTRING";
147 else if (tag == V_ASN1_BMPSTRING)
148 p="BMPSTRING";
149 else
150 p2="(unknown)";
151
152 if (p2 != NULL) 98 if (p2 != NULL)
153 { 99 {
154 if (BIO_printf(bp,fmt2,tag,p2) <= 0) goto err; 100 if (BIO_printf(bp,fmt2,tag,p2) <= 0) goto err;
@@ -162,22 +108,18 @@ err:
162 return(0); 108 return(0);
163 } 109 }
164 110
165int ASN1_parse(bp, pp, len, indent) 111int ASN1_parse(BIO *bp, unsigned char *pp, long len, int indent)
166BIO *bp; 112 {
167unsigned char *pp; 113 return(asn1_parse2(bp,&pp,len,0,0,indent,0));
168long len; 114 }
169int indent; 115
116int ASN1_parse_dump(BIO *bp, unsigned char *pp, long len, int indent, int dump)
170 { 117 {
171 return(asn1_parse2(bp,&pp,len,0,0,indent)); 118 return(asn1_parse2(bp,&pp,len,0,0,indent,dump));
172 } 119 }
173 120
174static int asn1_parse2(bp, pp, length, offset, depth, indent) 121static int asn1_parse2(BIO *bp, unsigned char **pp, long length, int offset,
175BIO *bp; 122 int depth, int indent, int dump)
176unsigned char **pp;
177long length;
178int offset;
179int depth;
180int indent;
181 { 123 {
182 unsigned char *p,*ep,*tot,*op,*opp; 124 unsigned char *p,*ep,*tot,*op,*opp;
183 long len; 125 long len;
@@ -186,7 +128,13 @@ int indent;
186 ASN1_OBJECT *o=NULL; 128 ASN1_OBJECT *o=NULL;
187 ASN1_OCTET_STRING *os=NULL; 129 ASN1_OCTET_STRING *os=NULL;
188 /* ASN1_BMPSTRING *bmp=NULL;*/ 130 /* ASN1_BMPSTRING *bmp=NULL;*/
131 int dump_indent;
189 132
133#if 0
134 dump_indent = indent;
135#else
136 dump_indent = 6; /* Because we know BIO_dump_indent() */
137#endif
190 p= *pp; 138 p= *pp;
191 tot=p+length; 139 tot=p+length;
192 op=p-1; 140 op=p-1;
@@ -241,7 +189,7 @@ int indent;
241 { 189 {
242 r=asn1_parse2(bp,&p,(long)(tot-p), 190 r=asn1_parse2(bp,&p,(long)(tot-p),
243 offset+(p - *pp),depth+1, 191 offset+(p - *pp),depth+1,
244 indent); 192 indent,dump);
245 if (r == 0) { ret=0; goto end; } 193 if (r == 0) { ret=0; goto end; }
246 if ((r == 2) || (p >= tot)) break; 194 if ((r == 2) || (p >= tot)) break;
247 } 195 }
@@ -251,7 +199,7 @@ int indent;
251 { 199 {
252 r=asn1_parse2(bp,&p,(long)len, 200 r=asn1_parse2(bp,&p,(long)len,
253 offset+(p - *pp),depth+1, 201 offset+(p - *pp),depth+1,
254 indent); 202 indent,dump);
255 if (r == 0) { ret=0; goto end; } 203 if (r == 0) { ret=0; goto end; }
256 } 204 }
257 } 205 }
@@ -266,7 +214,9 @@ int indent;
266 if ( (tag == V_ASN1_PRINTABLESTRING) || 214 if ( (tag == V_ASN1_PRINTABLESTRING) ||
267 (tag == V_ASN1_T61STRING) || 215 (tag == V_ASN1_T61STRING) ||
268 (tag == V_ASN1_IA5STRING) || 216 (tag == V_ASN1_IA5STRING) ||
269 (tag == V_ASN1_UTCTIME)) 217 (tag == V_ASN1_VISIBLESTRING) ||
218 (tag == V_ASN1_UTCTIME) ||
219 (tag == V_ASN1_GENERALIZEDTIME))
270 { 220 {
271 if (BIO_write(bp,":",1) <= 0) goto end; 221 if (BIO_write(bp,":",1) <= 0) goto end;
272 if ((len > 0) && 222 if ((len > 0) &&
@@ -334,7 +284,21 @@ int indent;
334 os->length) <= 0) 284 os->length) <= 0)
335 goto end; 285 goto end;
336 } 286 }
337 ASN1_OCTET_STRING_free(os); 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 }
301 M_ASN1_OCTET_STRING_free(os);
338 os=NULL; 302 os=NULL;
339 } 303 }
340 } 304 }
@@ -368,7 +332,52 @@ int indent;
368 if (BIO_write(bp,"BAD INTEGER",11) <= 0) 332 if (BIO_write(bp,"BAD INTEGER",11) <= 0)
369 goto end; 333 goto end;
370 } 334 }
371 ASN1_INTEGER_free(bs); 335 M_ASN1_INTEGER_free(bs);
336 }
337 else if (tag == V_ASN1_ENUMERATED)
338 {
339 ASN1_ENUMERATED *bs;
340 int i;
341
342 opp=op;
343 bs=d2i_ASN1_ENUMERATED(NULL,&opp,len+hl);
344 if (bs != NULL)
345 {
346 if (BIO_write(bp,":",1) <= 0) goto end;
347 if (bs->type == V_ASN1_NEG_ENUMERATED)
348 if (BIO_write(bp,"-",1) <= 0)
349 goto end;
350 for (i=0; i<bs->length; i++)
351 {
352 if (BIO_printf(bp,"%02X",
353 bs->data[i]) <= 0)
354 goto end;
355 }
356 if (bs->length == 0)
357 {
358 if (BIO_write(bp,"00",2) <= 0)
359 goto end;
360 }
361 }
362 else
363 {
364 if (BIO_write(bp,"BAD ENUMERATED",11) <= 0)
365 goto end;
366 }
367 M_ASN1_ENUMERATED_free(bs);
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;
372 } 381 }
373 382
374 if (!nl) 383 if (!nl)
@@ -387,7 +396,28 @@ int indent;
387 ret=1; 396 ret=1;
388end: 397end:
389 if (o != NULL) ASN1_OBJECT_free(o); 398 if (o != NULL) ASN1_OBJECT_free(o);
390 if (os != NULL) ASN1_OCTET_STRING_free(os); 399 if (os != NULL) M_ASN1_OCTET_STRING_free(os);
391 *pp=p; 400 *pp=p;
392 return(ret); 401 return(ret);
393 } 402 }
403
404const char *ASN1_tag2str(int tag)
405{
406 const static char *tag2str[] = {
407 "EOC", "BOOLEAN", "INTEGER", "BIT STRING", "OCTET STRING", /* 0-4 */
408 "NULL", "OBJECT", "OBJECT DESCRIPTOR", "EXTERNAL", "REAL", /* 5-9 */
409 "ENUMERATED", "<ASN1 11>", "UTF8STRING", "<ASN1 13>", /* 10-13 */
410 "<ASN1 14>", "<ASN1 15>", "SEQUENCE", "SET", /* 15-17 */
411 "NUMERICSTRING", "PRINTABLESTRING", "T61STRING", /* 18-20 */
412 "VIDEOTEXSTRING", "IA5STRING", "UTCTIME","GENERALIZEDTIME", /* 21-24 */
413 "GRAPHICSTRING", "VISIBLESTRING", "GENERALSTRING", /* 25-27 */
414 "UNIVERSALSTRING", "<ASN1 29>", "BMPSTRING" /* 28-30 */
415 };
416
417 if((tag == V_ASN1_NEG_INTEGER) || (tag == V_ASN1_NEG_ENUMERATED))
418 tag &= ~0x100;
419
420 if(tag < 0 || tag > 30) return "(unknown)";
421 return tag2str[tag];
422}
423