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.c411
1 files changed, 0 insertions, 411 deletions
diff --git a/src/lib/libcrypto/asn1/asn1_par.c b/src/lib/libcrypto/asn1/asn1_par.c
deleted file mode 100644
index 86886606ef..0000000000
--- a/src/lib/libcrypto/asn1/asn1_par.c
+++ /dev/null
@@ -1,411 +0,0 @@
1/* crypto/asn1/asn1_par.c */
2/* Copyright (C) 1995-1998 Eric Young (eay@cryptsoft.com)
3 * All rights reserved.
4 *
5 * This package is an SSL implementation written
6 * by Eric Young (eay@cryptsoft.com).
7 * The implementation was written so as to conform with Netscapes SSL.
8 *
9 * This library is free for commercial and non-commercial use as long as
10 * the following conditions are aheared to. The following conditions
11 * apply to all code found in this distribution, be it the RC4, RSA,
12 * lhash, DES, etc., code; not just the SSL code. The SSL documentation
13 * included with this distribution is covered by the same copyright terms
14 * except that the holder is Tim Hudson (tjh@cryptsoft.com).
15 *
16 * Copyright remains Eric Young's, and as such any Copyright notices in
17 * the code are not to be removed.
18 * If this package is used in a product, Eric Young should be given attribution
19 * as the author of the parts of the library used.
20 * This can be in the form of a textual message at program startup or
21 * in documentation (online or textual) provided with the package.
22 *
23 * Redistribution and use in source and binary forms, with or without
24 * modification, are permitted provided that the following conditions
25 * are met:
26 * 1. Redistributions of source code must retain the copyright
27 * notice, this list of conditions and the following disclaimer.
28 * 2. Redistributions in binary form must reproduce the above copyright
29 * notice, this list of conditions and the following disclaimer in the
30 * documentation and/or other materials provided with the distribution.
31 * 3. All advertising materials mentioning features or use of this software
32 * must display the following acknowledgement:
33 * "This product includes cryptographic software written by
34 * Eric Young (eay@cryptsoft.com)"
35 * The word 'cryptographic' can be left out if the rouines from the library
36 * being used are not cryptographic related :-).
37 * 4. If you include any Windows specific code (or a derivative thereof) from
38 * the apps directory (application code) you must include an acknowledgement:
39 * "This product includes software written by Tim Hudson (tjh@cryptsoft.com)"
40 *
41 * THIS SOFTWARE IS PROVIDED BY ERIC YOUNG ``AS IS'' AND
42 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
43 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
44 * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
45 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
46 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
47 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
48 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
49 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
50 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
51 * SUCH DAMAGE.
52 *
53 * The licence and distribution terms for any publically available version or
54 * derivative of this code cannot be changed. i.e. this code cannot simply be
55 * copied and put under another distribution licence
56 * [including the GNU Public Licence.]
57 */
58
59#include <stdio.h>
60#include "cryptlib.h"
61#include <openssl/buffer.h>
62#include <openssl/objects.h>
63#include <openssl/asn1.h>
64
65static int asn1_print_info(BIO *bp, int tag, int xclass,int constructed,
66 int indent);
67static int asn1_parse2(BIO *bp, unsigned char **pp, long length,
68 int offset, int depth, int indent);
69static int asn1_print_info(BIO *bp, int tag, int xclass, int constructed,
70 int indent)
71 {
72 static const char fmt[]="%-18s";
73 static const char fmt2[]="%2d %-15s";
74 char str[128];
75 const char *p,*p2=NULL;
76
77 if (constructed & V_ASN1_CONSTRUCTED)
78 p="cons: ";
79 else
80 p="prim: ";
81 if (BIO_write(bp,p,6) < 6) goto err;
82 if (indent)
83 {
84 if (indent > 128) indent=128;
85 memset(str,' ',indent);
86 if (BIO_write(bp,str,indent) < indent) goto err;
87 }
88
89 p=str;
90 if ((xclass & V_ASN1_PRIVATE) == V_ASN1_PRIVATE)
91 sprintf(str,"priv [ %d ] ",tag);
92 else if ((xclass & V_ASN1_CONTEXT_SPECIFIC) == V_ASN1_CONTEXT_SPECIFIC)
93 sprintf(str,"cont [ %d ]",tag);
94 else if ((xclass & V_ASN1_APPLICATION) == V_ASN1_APPLICATION)
95 sprintf(str,"appl [ %d ]",tag);
96 else if ((tag == V_ASN1_EOC) /* && (xclass == V_ASN1_UNIVERSAL) */)
97 p="EOC";
98 else if (tag == V_ASN1_BOOLEAN)
99 p="BOOLEAN";
100 else if (tag == V_ASN1_INTEGER)
101 p="INTEGER";
102 else if (tag == V_ASN1_ENUMERATED)
103 p="ENUMERATED";
104 else if (tag == V_ASN1_BIT_STRING)
105 p="BIT STRING";
106 else if (tag == V_ASN1_OCTET_STRING)
107 p="OCTET STRING";
108 else if (tag == V_ASN1_NULL)
109 p="NULL";
110 else if (tag == V_ASN1_OBJECT)
111 p="OBJECT";
112 else if (tag == V_ASN1_SEQUENCE)
113 p="SEQUENCE";
114 else if (tag == V_ASN1_SET)
115 p="SET";
116 else if (tag == V_ASN1_PRINTABLESTRING)
117 p="PRINTABLESTRING";
118 else if (tag == V_ASN1_T61STRING)
119 p="T61STRING";
120 else if (tag == V_ASN1_IA5STRING)
121 p="IA5STRING";
122 else if (tag == V_ASN1_UTCTIME)
123 p="UTCTIME";
124
125 /* extras */
126 else if (tag == V_ASN1_NUMERICSTRING)
127 p="NUMERICSTRING";
128 else if (tag == V_ASN1_VIDEOTEXSTRING)
129 p="VIDEOTEXSTRING";
130 else if (tag == V_ASN1_GENERALIZEDTIME)
131 p="GENERALIZEDTIME";
132 else if (tag == V_ASN1_GRAPHICSTRING)
133 p="GRAPHICSTRING";
134 else if (tag == V_ASN1_VISIBLESTRING)
135 p="VISIBLESTRING";
136 else if (tag == V_ASN1_GENERALSTRING)
137 p="GENERALSTRING";
138 else if (tag == V_ASN1_UNIVERSALSTRING)
139 p="UNIVERSALSTRING";
140 else if (tag == V_ASN1_BMPSTRING)
141 p="BMPSTRING";
142 else
143 p2="(unknown)";
144
145 if (p2 != NULL)
146 {
147 if (BIO_printf(bp,fmt2,tag,p2) <= 0) goto err;
148 }
149 else
150 {
151 if (BIO_printf(bp,fmt,p) <= 0) goto err;
152 }
153 return(1);
154err:
155 return(0);
156 }
157
158int ASN1_parse(BIO *bp, unsigned char *pp, long len, int indent)
159 {
160 return(asn1_parse2(bp,&pp,len,0,0,indent));
161 }
162
163static int asn1_parse2(BIO *bp, unsigned char **pp, long length, int offset,
164 int depth, int indent)
165 {
166 unsigned char *p,*ep,*tot,*op,*opp;
167 long len;
168 int tag,xclass,ret=0;
169 int nl,hl,j,r;
170 ASN1_OBJECT *o=NULL;
171 ASN1_OCTET_STRING *os=NULL;
172 /* ASN1_BMPSTRING *bmp=NULL;*/
173
174 p= *pp;
175 tot=p+length;
176 op=p-1;
177 while ((p < tot) && (op < p))
178 {
179 op=p;
180 j=ASN1_get_object(&p,&len,&tag,&xclass,length);
181#ifdef LINT
182 j=j;
183#endif
184 if (j & 0x80)
185 {
186 if (BIO_write(bp,"Error in encoding\n",18) <= 0)
187 goto end;
188 ret=0;
189 goto end;
190 }
191 hl=(p-op);
192 length-=hl;
193 /* if j == 0x21 it is a constructed indefinite length object */
194 if (BIO_printf(bp,"%5ld:",(long)offset+(long)(op- *pp))
195 <= 0) goto end;
196
197 if (j != (V_ASN1_CONSTRUCTED | 1))
198 {
199 if (BIO_printf(bp,"d=%-2d hl=%ld l=%4ld ",
200 depth,(long)hl,len) <= 0)
201 goto end;
202 }
203 else
204 {
205 if (BIO_printf(bp,"d=%-2d hl=%ld l=inf ",
206 depth,(long)hl) <= 0)
207 goto end;
208 }
209 if (!asn1_print_info(bp,tag,xclass,j,(indent)?depth:0))
210 goto end;
211 if (j & V_ASN1_CONSTRUCTED)
212 {
213 ep=p+len;
214 if (BIO_write(bp,"\n",1) <= 0) goto end;
215 if (len > length)
216 {
217 BIO_printf(bp,
218 "length is greater than %ld\n",length);
219 ret=0;
220 goto end;
221 }
222 if ((j == 0x21) && (len == 0))
223 {
224 for (;;)
225 {
226 r=asn1_parse2(bp,&p,(long)(tot-p),
227 offset+(p - *pp),depth+1,
228 indent);
229 if (r == 0) { ret=0; goto end; }
230 if ((r == 2) || (p >= tot)) break;
231 }
232 }
233 else
234 while (p < ep)
235 {
236 r=asn1_parse2(bp,&p,(long)len,
237 offset+(p - *pp),depth+1,
238 indent);
239 if (r == 0) { ret=0; goto end; }
240 }
241 }
242 else if (xclass != 0)
243 {
244 p+=len;
245 if (BIO_write(bp,"\n",1) <= 0) goto end;
246 }
247 else
248 {
249 nl=0;
250 if ( (tag == V_ASN1_PRINTABLESTRING) ||
251 (tag == V_ASN1_T61STRING) ||
252 (tag == V_ASN1_IA5STRING) ||
253 (tag == V_ASN1_VISIBLESTRING) ||
254 (tag == V_ASN1_UTCTIME) ||
255 (tag == V_ASN1_GENERALIZEDTIME))
256 {
257 if (BIO_write(bp,":",1) <= 0) goto end;
258 if ((len > 0) &&
259 BIO_write(bp,(char *)p,(int)len)
260 != (int)len)
261 goto end;
262 }
263 else if (tag == V_ASN1_OBJECT)
264 {
265 opp=op;
266 if (d2i_ASN1_OBJECT(&o,&opp,len+hl) != NULL)
267 {
268 if (BIO_write(bp,":",1) <= 0) goto end;
269 i2a_ASN1_OBJECT(bp,o);
270 }
271 else
272 {
273 if (BIO_write(bp,":BAD OBJECT",11) <= 0)
274 goto end;
275 }
276 }
277 else if (tag == V_ASN1_BOOLEAN)
278 {
279 int ii;
280
281 opp=op;
282 ii=d2i_ASN1_BOOLEAN(NULL,&opp,len+hl);
283 if (ii < 0)
284 {
285 if (BIO_write(bp,"Bad boolean\n",12))
286 goto end;
287 }
288 BIO_printf(bp,":%d",ii);
289 }
290 else if (tag == V_ASN1_BMPSTRING)
291 {
292 /* do the BMP thang */
293 }
294 else if (tag == V_ASN1_OCTET_STRING)
295 {
296 int i,printable=1;
297
298 opp=op;
299 os=d2i_ASN1_OCTET_STRING(NULL,&opp,len+hl);
300 if (os != NULL)
301 {
302 opp=os->data;
303 for (i=0; i<os->length; i++)
304 {
305 if (( (opp[i] < ' ') &&
306 (opp[i] != '\n') &&
307 (opp[i] != '\r') &&
308 (opp[i] != '\t')) ||
309 (opp[i] > '~'))
310 {
311 printable=0;
312 break;
313 }
314 }
315 if (printable && (os->length > 0))
316 {
317 if (BIO_write(bp,":",1) <= 0)
318 goto end;
319 if (BIO_write(bp,(char *)opp,
320 os->length) <= 0)
321 goto end;
322 }
323 ASN1_OCTET_STRING_free(os);
324 os=NULL;
325 }
326 }
327 else if (tag == V_ASN1_INTEGER)
328 {
329 ASN1_INTEGER *bs;
330 int i;
331
332 opp=op;
333 bs=d2i_ASN1_INTEGER(NULL,&opp,len+hl);
334 if (bs != NULL)
335 {
336 if (BIO_write(bp,":",1) <= 0) goto end;
337 if (bs->type == V_ASN1_NEG_INTEGER)
338 if (BIO_write(bp,"-",1) <= 0)
339 goto end;
340 for (i=0; i<bs->length; i++)
341 {
342 if (BIO_printf(bp,"%02X",
343 bs->data[i]) <= 0)
344 goto end;
345 }
346 if (bs->length == 0)
347 {
348 if (BIO_write(bp,"00",2) <= 0)
349 goto end;
350 }
351 }
352 else
353 {
354 if (BIO_write(bp,"BAD INTEGER",11) <= 0)
355 goto end;
356 }
357 ASN1_INTEGER_free(bs);
358 }
359 else if (tag == V_ASN1_ENUMERATED)
360 {
361 ASN1_ENUMERATED *bs;
362 int i;
363
364 opp=op;
365 bs=d2i_ASN1_ENUMERATED(NULL,&opp,len+hl);
366 if (bs != NULL)
367 {
368 if (BIO_write(bp,":",1) <= 0) goto end;
369 if (bs->type == V_ASN1_NEG_ENUMERATED)
370 if (BIO_write(bp,"-",1) <= 0)
371 goto end;
372 for (i=0; i<bs->length; i++)
373 {
374 if (BIO_printf(bp,"%02X",
375 bs->data[i]) <= 0)
376 goto end;
377 }
378 if (bs->length == 0)
379 {
380 if (BIO_write(bp,"00",2) <= 0)
381 goto end;
382 }
383 }
384 else
385 {
386 if (BIO_write(bp,"BAD ENUMERATED",11) <= 0)
387 goto end;
388 }
389 ASN1_ENUMERATED_free(bs);
390 }
391
392 if (!nl)
393 {
394 if (BIO_write(bp,"\n",1) <= 0) goto end;
395 }
396 p+=len;
397 if ((tag == V_ASN1_EOC) && (xclass == 0))
398 {
399 ret=2; /* End of sequence */
400 goto end;
401 }
402 }
403 length-=len;
404 }
405 ret=1;
406end:
407 if (o != NULL) ASN1_OBJECT_free(o);
408 if (os != NULL) ASN1_OCTET_STRING_free(os);
409 *pp=p;
410 return(ret);
411 }