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

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