source: trunk/third/openssl/apps/pkcs7.c @ 19843

Revision 19843, 8.2 KB checked in by zacheiss, 21 years ago (diff)
This commit was generated by cvs2svn to compensate for changes in r19842, which included commits to RCS files with non-trunk default branches.
Line 
1/* apps/pkcs7.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 <stdlib.h>
61#include <string.h>
62#include <time.h>
63#include "apps.h"
64#include <openssl/err.h>
65#include <openssl/objects.h>
66#include <openssl/evp.h>
67#include <openssl/x509.h>
68#include <openssl/pkcs7.h>
69#include <openssl/pem.h>
70
71#undef PROG
72#define PROG    pkcs7_main
73
74/* -inform arg  - input format - default PEM (DER or PEM)
75 * -outform arg - output format - default PEM
76 * -in arg      - input file - default stdin
77 * -out arg     - output file - default stdout
78 * -print_certs
79 */
80
81int MAIN(int, char **);
82
83int MAIN(int argc, char **argv)
84        {
85#ifndef OPENSSL_NO_ENGINE
86        ENGINE *e = NULL;
87#endif
88        PKCS7 *p7=NULL;
89        int i,badops=0;
90        BIO *in=NULL,*out=NULL;
91        int informat,outformat;
92        char *infile,*outfile,*prog;
93        int print_certs=0,text=0,noout=0;
94        int ret=1;
95#ifndef OPENSSL_NO_ENGINE
96        char *engine=NULL;
97#endif
98
99        apps_startup();
100
101        if (bio_err == NULL)
102                if ((bio_err=BIO_new(BIO_s_file())) != NULL)
103                        BIO_set_fp(bio_err,stderr,BIO_NOCLOSE|BIO_FP_TEXT);
104
105        infile=NULL;
106        outfile=NULL;
107        informat=FORMAT_PEM;
108        outformat=FORMAT_PEM;
109
110        prog=argv[0];
111        argc--;
112        argv++;
113        while (argc >= 1)
114                {
115                if      (strcmp(*argv,"-inform") == 0)
116                        {
117                        if (--argc < 1) goto bad;
118                        informat=str2fmt(*(++argv));
119                        }
120                else if (strcmp(*argv,"-outform") == 0)
121                        {
122                        if (--argc < 1) goto bad;
123                        outformat=str2fmt(*(++argv));
124                        }
125                else if (strcmp(*argv,"-in") == 0)
126                        {
127                        if (--argc < 1) goto bad;
128                        infile= *(++argv);
129                        }
130                else if (strcmp(*argv,"-out") == 0)
131                        {
132                        if (--argc < 1) goto bad;
133                        outfile= *(++argv);
134                        }
135                else if (strcmp(*argv,"-noout") == 0)
136                        noout=1;
137                else if (strcmp(*argv,"-text") == 0)
138                        text=1;
139                else if (strcmp(*argv,"-print_certs") == 0)
140                        print_certs=1;
141#ifndef OPENSSL_NO_ENGINE
142                else if (strcmp(*argv,"-engine") == 0)
143                        {
144                        if (--argc < 1) goto bad;
145                        engine= *(++argv);
146                        }
147#endif
148                else
149                        {
150                        BIO_printf(bio_err,"unknown option %s\n",*argv);
151                        badops=1;
152                        break;
153                        }
154                argc--;
155                argv++;
156                }
157
158        if (badops)
159                {
160bad:
161                BIO_printf(bio_err,"%s [options] <infile >outfile\n",prog);
162                BIO_printf(bio_err,"where options are\n");
163                BIO_printf(bio_err," -inform arg   input format - DER or PEM\n");
164                BIO_printf(bio_err," -outform arg  output format - DER or PEM\n");
165                BIO_printf(bio_err," -in arg       input file\n");
166                BIO_printf(bio_err," -out arg      output file\n");
167                BIO_printf(bio_err," -print_certs  print any certs or crl in the input\n");
168                BIO_printf(bio_err," -text         print full details of certificates\n");
169                BIO_printf(bio_err," -noout        don't output encoded data\n");
170#ifndef OPENSSL_NO_ENGINE
171                BIO_printf(bio_err," -engine e     use engine e, possibly a hardware device.\n");
172#endif
173                ret = 1;
174                goto end;
175                }
176
177        ERR_load_crypto_strings();
178
179#ifndef OPENSSL_NO_ENGINE
180        e = setup_engine(bio_err, engine, 0);
181#endif
182
183        in=BIO_new(BIO_s_file());
184        out=BIO_new(BIO_s_file());
185        if ((in == NULL) || (out == NULL))
186                {
187                ERR_print_errors(bio_err);
188                goto end;
189                }
190
191        if (infile == NULL)
192                BIO_set_fp(in,stdin,BIO_NOCLOSE);
193        else
194                {
195                if (BIO_read_filename(in,infile) <= 0)
196                if (in == NULL)
197                        {
198                        perror(infile);
199                        goto end;
200                        }
201                }
202
203        if      (informat == FORMAT_ASN1)
204                p7=d2i_PKCS7_bio(in,NULL);
205        else if (informat == FORMAT_PEM)
206                p7=PEM_read_bio_PKCS7(in,NULL,NULL,NULL);
207        else
208                {
209                BIO_printf(bio_err,"bad input format specified for pkcs7 object\n");
210                goto end;
211                }
212        if (p7 == NULL)
213                {
214                BIO_printf(bio_err,"unable to load PKCS7 object\n");
215                ERR_print_errors(bio_err);
216                goto end;
217                }
218
219        if (outfile == NULL)
220                {
221                BIO_set_fp(out,stdout,BIO_NOCLOSE);
222#ifdef OPENSSL_SYS_VMS
223                {
224                BIO *tmpbio = BIO_new(BIO_f_linebuffer());
225                out = BIO_push(tmpbio, out);
226                }
227#endif
228                }
229        else
230                {
231                if (BIO_write_filename(out,outfile) <= 0)
232                        {
233                        perror(outfile);
234                        goto end;
235                        }
236                }
237
238        if (print_certs)
239                {
240                STACK_OF(X509) *certs=NULL;
241                STACK_OF(X509_CRL) *crls=NULL;
242
243                i=OBJ_obj2nid(p7->type);
244                switch (i)
245                        {
246                case NID_pkcs7_signed:
247                        certs=p7->d.sign->cert;
248                        crls=p7->d.sign->crl;
249                        break;
250                case NID_pkcs7_signedAndEnveloped:
251                        certs=p7->d.signed_and_enveloped->cert;
252                        crls=p7->d.signed_and_enveloped->crl;
253                        break;
254                default:
255                        break;
256                        }
257
258                if (certs != NULL)
259                        {
260                        X509 *x;
261
262                        for (i=0; i<sk_X509_num(certs); i++)
263                                {
264                                x=sk_X509_value(certs,i);
265                                if(text) X509_print(out, x);
266                                else dump_cert_text(out, x);
267
268                                if(!noout) PEM_write_bio_X509(out,x);
269                                BIO_puts(out,"\n");
270                                }
271                        }
272                if (crls != NULL)
273                        {
274                        X509_CRL *crl;
275
276                        for (i=0; i<sk_X509_CRL_num(crls); i++)
277                                {
278                                crl=sk_X509_CRL_value(crls,i);
279
280                                X509_CRL_print(out, crl);
281
282                                if(!noout)PEM_write_bio_X509_CRL(out,crl);
283                                BIO_puts(out,"\n");
284                                }
285                        }
286
287                ret=0;
288                goto end;
289                }
290
291        if(!noout) {
292                if      (outformat == FORMAT_ASN1)
293                        i=i2d_PKCS7_bio(out,p7);
294                else if (outformat == FORMAT_PEM)
295                        i=PEM_write_bio_PKCS7(out,p7);
296                else    {
297                        BIO_printf(bio_err,"bad output format specified for outfile\n");
298                        goto end;
299                        }
300
301                if (!i)
302                        {
303                        BIO_printf(bio_err,"unable to write pkcs7 object\n");
304                        ERR_print_errors(bio_err);
305                        goto end;
306                        }
307        }
308        ret=0;
309end:
310        if (p7 != NULL) PKCS7_free(p7);
311        if (in != NULL) BIO_free(in);
312        if (out != NULL) BIO_free_all(out);
313        apps_shutdown();
314        OPENSSL_EXIT(ret);
315        }
Note: See TracBrowser for help on using the repository browser.