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

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