source: trunk/third/openssl/apps/asn1pars.c @ 18442

Revision 18442, 9.3 KB checked in by zacheiss, 21 years ago (diff)
This commit was generated by cvs2svn to compensate for changes in r18441, which included commits to RCS files with non-trunk default branches.
Line 
1/* apps/asn1pars.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/* A nice addition from Dr Stephen Henson <shenson@bigfoot.com> to
60 * add the -strparse option which parses nested binary structures
61 */
62
63#include <stdio.h>
64#include <stdlib.h>
65#include <string.h>
66#include "apps.h"
67#include <openssl/err.h>
68#include <openssl/evp.h>
69#include <openssl/x509.h>
70#include <openssl/pem.h>
71
72/* -inform arg  - input format - default PEM (DER or PEM)
73 * -in arg      - input file - default stdin
74 * -i           - indent the details by depth
75 * -offset      - where in the file to start
76 * -length      - how many bytes to use
77 * -oid file    - extra oid description file
78 */
79
80#undef PROG
81#define PROG    asn1parse_main
82
83int MAIN(int, char **);
84
85int MAIN(int argc, char **argv)
86        {
87        int i,badops=0,offset=0,ret=1,j;
88        unsigned int length=0;
89        long num,tmplen;
90        BIO *in=NULL,*out=NULL,*b64=NULL, *derout = NULL;
91        int informat,indent=0, noout = 0, dump = 0;
92        char *infile=NULL,*str=NULL,*prog,*oidfile=NULL, *derfile=NULL;
93        unsigned char *tmpbuf;
94        BUF_MEM *buf=NULL;
95        STACK *osk=NULL;
96        ASN1_TYPE *at=NULL;
97
98        informat=FORMAT_PEM;
99
100        apps_startup();
101
102        if (bio_err == NULL)
103                if ((bio_err=BIO_new(BIO_s_file())) != NULL)
104                        BIO_set_fp(bio_err,stderr,BIO_NOCLOSE|BIO_FP_TEXT);
105
106        if (!load_config(bio_err, NULL))
107                goto end;
108
109        prog=argv[0];
110        argc--;
111        argv++;
112        if ((osk=sk_new_null()) == NULL)
113                {
114                BIO_printf(bio_err,"Memory allocation failure\n");
115                goto end;
116                }
117        while (argc >= 1)
118                {
119                if      (strcmp(*argv,"-inform") == 0)
120                        {
121                        if (--argc < 1) goto bad;
122                        informat=str2fmt(*(++argv));
123                        }
124                else if (strcmp(*argv,"-in") == 0)
125                        {
126                        if (--argc < 1) goto bad;
127                        infile= *(++argv);
128                        }
129                else if (strcmp(*argv,"-out") == 0)
130                        {
131                        if (--argc < 1) goto bad;
132                        derfile= *(++argv);
133                        }
134                else if (strcmp(*argv,"-i") == 0)
135                        {
136                        indent=1;
137                        }
138                else if (strcmp(*argv,"-noout") == 0) noout = 1;
139                else if (strcmp(*argv,"-oid") == 0)
140                        {
141                        if (--argc < 1) goto bad;
142                        oidfile= *(++argv);
143                        }
144                else if (strcmp(*argv,"-offset") == 0)
145                        {
146                        if (--argc < 1) goto bad;
147                        offset= atoi(*(++argv));
148                        }
149                else if (strcmp(*argv,"-length") == 0)
150                        {
151                        if (--argc < 1) goto bad;
152                        length= atoi(*(++argv));
153                        if (length == 0) goto bad;
154                        }
155                else if (strcmp(*argv,"-dump") == 0)
156                        {
157                        dump= -1;
158                        }
159                else if (strcmp(*argv,"-dlimit") == 0)
160                        {
161                        if (--argc < 1) goto bad;
162                        dump= atoi(*(++argv));
163                        if (dump <= 0) goto bad;
164                        }
165                else if (strcmp(*argv,"-strparse") == 0)
166                        {
167                        if (--argc < 1) goto bad;
168                        sk_push(osk,*(++argv));
169                        }
170                else
171                        {
172                        BIO_printf(bio_err,"unknown option %s\n",*argv);
173                        badops=1;
174                        break;
175                        }
176                argc--;
177                argv++;
178                }
179
180        if (badops)
181                {
182bad:
183                BIO_printf(bio_err,"%s [options] <infile\n",prog);
184                BIO_printf(bio_err,"where options are\n");
185                BIO_printf(bio_err," -inform arg   input format - one of DER TXT PEM\n");
186                BIO_printf(bio_err," -in arg       input file\n");
187                BIO_printf(bio_err," -out arg      output file (output format is always DER\n");
188                BIO_printf(bio_err," -noout arg    don't produce any output\n");
189                BIO_printf(bio_err," -offset arg   offset into file\n");
190                BIO_printf(bio_err," -length arg   length of section in file\n");
191                BIO_printf(bio_err," -i            indent entries\n");
192                BIO_printf(bio_err," -dump         dump unknown data in hex form\n");
193                BIO_printf(bio_err," -dlimit arg   dump the first arg bytes of unknown data in hex form\n");
194                BIO_printf(bio_err," -oid file     file of extra oid definitions\n");
195                BIO_printf(bio_err," -strparse offset\n");
196                BIO_printf(bio_err,"               a series of these can be used to 'dig' into multiple\n");
197                BIO_printf(bio_err,"               ASN1 blob wrappings\n");
198                goto end;
199                }
200
201        ERR_load_crypto_strings();
202
203        in=BIO_new(BIO_s_file());
204        out=BIO_new(BIO_s_file());
205        if ((in == NULL) || (out == NULL))
206                {
207                ERR_print_errors(bio_err);
208                goto end;
209                }
210        BIO_set_fp(out,stdout,BIO_NOCLOSE|BIO_FP_TEXT);
211#ifdef OPENSSL_SYS_VMS
212        {
213        BIO *tmpbio = BIO_new(BIO_f_linebuffer());
214        out = BIO_push(tmpbio, out);
215        }
216#endif
217
218        if (oidfile != NULL)
219                {
220                if (BIO_read_filename(in,oidfile) <= 0)
221                        {
222                        BIO_printf(bio_err,"problems opening %s\n",oidfile);
223                        ERR_print_errors(bio_err);
224                        goto end;
225                        }
226                OBJ_create_objects(in);
227                }
228
229        if (infile == NULL)
230                BIO_set_fp(in,stdin,BIO_NOCLOSE);
231        else
232                {
233                if (BIO_read_filename(in,infile) <= 0)
234                        {
235                        perror(infile);
236                        goto end;
237                        }
238                }
239
240        if (derfile) {
241                if(!(derout = BIO_new_file(derfile, "wb"))) {
242                        BIO_printf(bio_err,"problems opening %s\n",derfile);
243                        ERR_print_errors(bio_err);
244                        goto end;
245                }
246        }
247
248        if ((buf=BUF_MEM_new()) == NULL) goto end;
249        if (!BUF_MEM_grow(buf,BUFSIZ*8)) goto end; /* Pre-allocate :-) */
250
251        if (informat == FORMAT_PEM)
252                {
253                BIO *tmp;
254
255                if ((b64=BIO_new(BIO_f_base64())) == NULL)
256                        goto end;
257                BIO_push(b64,in);
258                tmp=in;
259                in=b64;
260                b64=tmp;
261                }
262
263        num=0;
264        for (;;)
265                {
266                if (!BUF_MEM_grow(buf,(int)num+BUFSIZ)) goto end;
267                i=BIO_read(in,&(buf->data[num]),BUFSIZ);
268                if (i <= 0) break;
269                num+=i;
270                }
271        str=buf->data;
272
273        /* If any structs to parse go through in sequence */
274
275        if (sk_num(osk))
276                {
277                tmpbuf=(unsigned char *)str;
278                tmplen=num;
279                for (i=0; i<sk_num(osk); i++)
280                        {
281                        ASN1_TYPE *atmp;
282                        j=atoi(sk_value(osk,i));
283                        if (j == 0)
284                                {
285                                BIO_printf(bio_err,"'%s' is an invalid number\n",sk_value(osk,i));
286                                continue;
287                                }
288                        tmpbuf+=j;
289                        tmplen-=j;
290                        atmp = at;
291                        at = d2i_ASN1_TYPE(NULL,&tmpbuf,tmplen);
292                        ASN1_TYPE_free(atmp);
293                        if(!at)
294                                {
295                                BIO_printf(bio_err,"Error parsing structure\n");
296                                ERR_print_errors(bio_err);
297                                goto end;
298                                }
299                        /* hmm... this is a little evil but it works */
300                        tmpbuf=at->value.asn1_string->data;
301                        tmplen=at->value.asn1_string->length;
302                        }
303                str=(char *)tmpbuf;
304                num=tmplen;
305                }
306
307        if (length == 0) length=(unsigned int)num;
308        if(derout) {
309                if(BIO_write(derout, str + offset, length) != (int)length) {
310                        BIO_printf(bio_err, "Error writing output\n");
311                        ERR_print_errors(bio_err);
312                        goto end;
313                }
314        }
315        if (!noout &&
316            !ASN1_parse_dump(out,(unsigned char *)&(str[offset]),length,
317                    indent,dump))
318                {
319                ERR_print_errors(bio_err);
320                goto end;
321                }
322        ret=0;
323end:
324        BIO_free(derout);
325        if (in != NULL) BIO_free(in);
326        if (out != NULL) BIO_free_all(out);
327        if (b64 != NULL) BIO_free(b64);
328        if (ret != 0)
329                ERR_print_errors(bio_err);
330        if (buf != NULL) BUF_MEM_free(buf);
331        if (at != NULL) ASN1_TYPE_free(at);
332        if (osk != NULL) sk_free(osk);
333        OBJ_cleanup();
334        apps_shutdown();
335        OPENSSL_EXIT(ret);
336        }
337
Note: See TracBrowser for help on using the repository browser.