Import OpenSSL 0.9.8h.
[dragonfly.git] / crypto / openssl-0.9 / apps / cms.c
1 /* apps/cms.c */
2 /* Written by Dr Stephen N Henson (steve@openssl.org) for the OpenSSL
3  * project.
4  */
5 /* ====================================================================
6  * Copyright (c) 2008 The OpenSSL Project.  All rights reserved.
7  *
8  * Redistribution and use in source and binary forms, with or without
9  * modification, are permitted provided that the following conditions
10  * are met:
11  *
12  * 1. Redistributions of source code must retain the above copyright
13  *    notice, this list of conditions and the following disclaimer. 
14  *
15  * 2. Redistributions in binary form must reproduce the above copyright
16  *    notice, this list of conditions and the following disclaimer in
17  *    the documentation and/or other materials provided with the
18  *    distribution.
19  *
20  * 3. All advertising materials mentioning features or use of this
21  *    software must display the following acknowledgment:
22  *    "This product includes software developed by the OpenSSL Project
23  *    for use in the OpenSSL Toolkit. (http://www.OpenSSL.org/)"
24  *
25  * 4. The names "OpenSSL Toolkit" and "OpenSSL Project" must not be used to
26  *    endorse or promote products derived from this software without
27  *    prior written permission. For written permission, please contact
28  *    licensing@OpenSSL.org.
29  *
30  * 5. Products derived from this software may not be called "OpenSSL"
31  *    nor may "OpenSSL" appear in their names without prior written
32  *    permission of the OpenSSL Project.
33  *
34  * 6. Redistributions of any form whatsoever must retain the following
35  *    acknowledgment:
36  *    "This product includes software developed by the OpenSSL Project
37  *    for use in the OpenSSL Toolkit (http://www.OpenSSL.org/)"
38  *
39  * THIS SOFTWARE IS PROVIDED BY THE OpenSSL PROJECT ``AS IS'' AND ANY
40  * EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
41  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
42  * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE OpenSSL PROJECT OR
43  * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
44  * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
45  * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
46  * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
47  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
48  * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
49  * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED
50  * OF THE POSSIBILITY OF SUCH DAMAGE.
51  * ====================================================================
52  */
53
54 /* CMS utility function */
55
56 #include <stdio.h>
57 #include <string.h>
58 #include "apps.h"
59
60 #ifndef OPENSSL_NO_CMS
61
62 #include <openssl/crypto.h>
63 #include <openssl/pem.h>
64 #include <openssl/err.h>
65 #include <openssl/x509_vfy.h>
66 #include <openssl/x509v3.h>
67 #include <openssl/cms.h>
68
69 #undef PROG
70 #define PROG cms_main
71 static int save_certs(char *signerfile, STACK_OF(X509) *signers);
72 static int cms_cb(int ok, X509_STORE_CTX *ctx);
73 static void receipt_request_print(BIO *out, CMS_ContentInfo *cms);
74 static CMS_ReceiptRequest *make_receipt_request(STACK *rr_to, int rr_allorfirst,
75                                                                 STACK *rr_from);
76
77 #define SMIME_OP        0x10
78 #define SMIME_IP        0x20
79 #define SMIME_SIGNERS   0x40
80 #define SMIME_ENCRYPT           (1 | SMIME_OP)
81 #define SMIME_DECRYPT           (2 | SMIME_IP)
82 #define SMIME_SIGN              (3 | SMIME_OP | SMIME_SIGNERS)
83 #define SMIME_VERIFY            (4 | SMIME_IP)
84 #define SMIME_CMSOUT            (5 | SMIME_IP | SMIME_OP)
85 #define SMIME_RESIGN            (6 | SMIME_IP | SMIME_OP | SMIME_SIGNERS)
86 #define SMIME_DATAOUT           (7 | SMIME_IP)
87 #define SMIME_DATA_CREATE       (8 | SMIME_OP)
88 #define SMIME_DIGEST_VERIFY     (9 | SMIME_IP)
89 #define SMIME_DIGEST_CREATE     (10 | SMIME_OP)
90 #define SMIME_UNCOMPRESS        (11 | SMIME_IP)
91 #define SMIME_COMPRESS          (12 | SMIME_OP)
92 #define SMIME_ENCRYPTED_DECRYPT (13 | SMIME_IP)
93 #define SMIME_ENCRYPTED_ENCRYPT (14 | SMIME_OP)
94 #define SMIME_SIGN_RECEIPT      (15 | SMIME_IP | SMIME_OP)
95 #define SMIME_VERIFY_RECEIPT    (16 | SMIME_IP)
96
97 int MAIN(int, char **);
98
99 int MAIN(int argc, char **argv)
100         {
101         ENGINE *e = NULL;
102         int operation = 0;
103         int ret = 0;
104         char **args;
105         const char *inmode = "r", *outmode = "w";
106         char *infile = NULL, *outfile = NULL, *rctfile = NULL;
107         char *signerfile = NULL, *recipfile = NULL;
108         STACK *sksigners = NULL, *skkeys = NULL;
109         char *certfile = NULL, *keyfile = NULL, *contfile=NULL;
110         char *certsoutfile = NULL;
111         const EVP_CIPHER *cipher = NULL;
112         CMS_ContentInfo *cms = NULL, *rcms = NULL;
113         X509_STORE *store = NULL;
114         X509 *cert = NULL, *recip = NULL, *signer = NULL;
115         EVP_PKEY *key = NULL;
116         STACK_OF(X509) *encerts = NULL, *other = NULL;
117         BIO *in = NULL, *out = NULL, *indata = NULL, *rctin = NULL;
118         int badarg = 0;
119         int flags = CMS_DETACHED;
120         int rr_print = 0, rr_allorfirst = -1;
121         STACK *rr_to = NULL, *rr_from = NULL;
122         CMS_ReceiptRequest *rr = NULL;
123         char *to = NULL, *from = NULL, *subject = NULL;
124         char *CAfile = NULL, *CApath = NULL;
125         char *passargin = NULL, *passin = NULL;
126         char *inrand = NULL;
127         int need_rand = 0;
128         const EVP_MD *sign_md = NULL;
129         int informat = FORMAT_SMIME, outformat = FORMAT_SMIME;
130         int rctformat = FORMAT_SMIME, keyform = FORMAT_PEM;
131 #ifndef OPENSSL_NO_ENGINE
132         char *engine=NULL;
133 #endif
134         unsigned char *secret_key = NULL, *secret_keyid = NULL;
135         size_t secret_keylen = 0, secret_keyidlen = 0;
136
137         ASN1_OBJECT *econtent_type = NULL;
138
139         X509_VERIFY_PARAM *vpm = NULL;
140
141         args = argv + 1;
142         ret = 1;
143
144         apps_startup();
145
146         if (bio_err == NULL)
147                 {
148                 if ((bio_err = BIO_new(BIO_s_file())) != NULL)
149                         BIO_set_fp(bio_err, stderr, BIO_NOCLOSE|BIO_FP_TEXT);
150                 }
151
152         if (!load_config(bio_err, NULL))
153                 goto end;
154
155         while (!badarg && *args && *args[0] == '-')
156                 {
157                 if (!strcmp (*args, "-encrypt"))
158                         operation = SMIME_ENCRYPT;
159                 else if (!strcmp (*args, "-decrypt"))
160                         operation = SMIME_DECRYPT;
161                 else if (!strcmp (*args, "-sign"))
162                         operation = SMIME_SIGN;
163                 else if (!strcmp (*args, "-sign_receipt"))
164                         operation = SMIME_SIGN_RECEIPT;
165                 else if (!strcmp (*args, "-resign"))
166                         operation = SMIME_RESIGN;
167                 else if (!strcmp (*args, "-verify"))
168                         operation = SMIME_VERIFY;
169                 else if (!strcmp(*args,"-verify_receipt"))
170                         {
171                         operation = SMIME_VERIFY_RECEIPT;
172                         if (!args[1])
173                                 goto argerr;
174                         args++;
175                         rctfile = *args;
176                         }
177                 else if (!strcmp (*args, "-cmsout"))
178                         operation = SMIME_CMSOUT;
179                 else if (!strcmp (*args, "-data_out"))
180                         operation = SMIME_DATAOUT;
181                 else if (!strcmp (*args, "-data_create"))
182                         operation = SMIME_DATA_CREATE;
183                 else if (!strcmp (*args, "-digest_verify"))
184                         operation = SMIME_DIGEST_VERIFY;
185                 else if (!strcmp (*args, "-digest_create"))
186                         operation = SMIME_DIGEST_CREATE;
187                 else if (!strcmp (*args, "-compress"))
188                         operation = SMIME_COMPRESS;
189                 else if (!strcmp (*args, "-uncompress"))
190                         operation = SMIME_UNCOMPRESS;
191                 else if (!strcmp (*args, "-EncryptedData_decrypt"))
192                         operation = SMIME_ENCRYPTED_DECRYPT;
193                 else if (!strcmp (*args, "-EncryptedData_encrypt"))
194                         operation = SMIME_ENCRYPTED_ENCRYPT;
195 #ifndef OPENSSL_NO_DES
196                 else if (!strcmp (*args, "-des3")) 
197                                 cipher = EVP_des_ede3_cbc();
198                 else if (!strcmp (*args, "-des")) 
199                                 cipher = EVP_des_cbc();
200 #endif
201 #ifndef OPENSSL_NO_SEED
202                 else if (!strcmp (*args, "-seed")) 
203                                 cipher = EVP_seed_cbc();
204 #endif
205 #ifndef OPENSSL_NO_RC2
206                 else if (!strcmp (*args, "-rc2-40")) 
207                                 cipher = EVP_rc2_40_cbc();
208                 else if (!strcmp (*args, "-rc2-128")) 
209                                 cipher = EVP_rc2_cbc();
210                 else if (!strcmp (*args, "-rc2-64")) 
211                                 cipher = EVP_rc2_64_cbc();
212 #endif
213 #ifndef OPENSSL_NO_AES
214                 else if (!strcmp(*args,"-aes128"))
215                                 cipher = EVP_aes_128_cbc();
216                 else if (!strcmp(*args,"-aes192"))
217                                 cipher = EVP_aes_192_cbc();
218                 else if (!strcmp(*args,"-aes256"))
219                                 cipher = EVP_aes_256_cbc();
220 #endif
221 #ifndef OPENSSL_NO_CAMELLIA
222                 else if (!strcmp(*args,"-camellia128"))
223                                 cipher = EVP_camellia_128_cbc();
224                 else if (!strcmp(*args,"-camellia192"))
225                                 cipher = EVP_camellia_192_cbc();
226                 else if (!strcmp(*args,"-camellia256"))
227                                 cipher = EVP_camellia_256_cbc();
228 #endif
229                 else if (!strcmp (*args, "-text")) 
230                                 flags |= CMS_TEXT;
231                 else if (!strcmp (*args, "-nointern")) 
232                                 flags |= CMS_NOINTERN;
233                 else if (!strcmp (*args, "-noverify") 
234                         || !strcmp (*args, "-no_signer_cert_verify")) 
235                                 flags |= CMS_NO_SIGNER_CERT_VERIFY;
236                 else if (!strcmp (*args, "-nocerts")) 
237                                 flags |= CMS_NOCERTS;
238                 else if (!strcmp (*args, "-noattr")) 
239                                 flags |= CMS_NOATTR;
240                 else if (!strcmp (*args, "-nodetach")) 
241                                 flags &= ~CMS_DETACHED;
242                 else if (!strcmp (*args, "-nosmimecap"))
243                                 flags |= CMS_NOSMIMECAP;
244                 else if (!strcmp (*args, "-binary"))
245                                 flags |= CMS_BINARY;
246                 else if (!strcmp (*args, "-keyid"))
247                                 flags |= CMS_USE_KEYID;
248                 else if (!strcmp (*args, "-nosigs"))
249                                 flags |= CMS_NOSIGS;
250                 else if (!strcmp (*args, "-no_content_verify"))
251                                 flags |= CMS_NO_CONTENT_VERIFY;
252                 else if (!strcmp (*args, "-no_attr_verify"))
253                                 flags |= CMS_NO_ATTR_VERIFY;
254                 else if (!strcmp (*args, "-stream"))
255                                 {
256                                 args++;
257                                 continue;
258                                 }
259                 else if (!strcmp (*args, "-indef"))
260                                 {
261                                 args++;
262                                 continue;
263                                 }
264                 else if (!strcmp (*args, "-noindef"))
265                                 flags &= ~CMS_STREAM;
266                 else if (!strcmp (*args, "-nooldmime"))
267                                 flags |= CMS_NOOLDMIMETYPE;
268                 else if (!strcmp (*args, "-crlfeol"))
269                                 flags |= CMS_CRLFEOL;
270                 else if (!strcmp (*args, "-receipt_request_print"))
271                                 rr_print = 1;
272                 else if (!strcmp (*args, "-receipt_request_all"))
273                                 rr_allorfirst = 0;
274                 else if (!strcmp (*args, "-receipt_request_first"))
275                                 rr_allorfirst = 1;
276                 else if (!strcmp(*args,"-receipt_request_from"))
277                         {
278                         if (!args[1])
279                                 goto argerr;
280                         args++;
281                         if (!rr_from)
282                                 rr_from = sk_new_null();
283                         sk_push(rr_from, *args);
284                         }
285                 else if (!strcmp(*args,"-receipt_request_to"))
286                         {
287                         if (!args[1])
288                                 goto argerr;
289                         args++;
290                         if (!rr_to)
291                                 rr_to = sk_new_null();
292                         sk_push(rr_to, *args);
293                         }
294                 else if (!strcmp(*args,"-secretkey"))
295                         {
296                         long ltmp;
297                         if (!args[1])
298                                 goto argerr;
299                         args++;
300                         secret_key = string_to_hex(*args, &ltmp);
301                         if (!secret_key)
302                                 {
303                                 BIO_printf(bio_err, "Invalid key %s\n", *args);
304                                 goto argerr;
305                                 }
306                         secret_keylen = (size_t)ltmp;
307                         }
308                 else if (!strcmp(*args,"-secretkeyid"))
309                         {
310                         long ltmp;
311                         if (!args[1])
312                                 goto argerr;
313                         args++;
314                         secret_keyid = string_to_hex(*args, &ltmp);
315                         if (!secret_keyid)
316                                 {
317                                 BIO_printf(bio_err, "Invalid id %s\n", *args);
318                                 goto argerr;
319                                 }
320                         secret_keyidlen = (size_t)ltmp;
321                         }
322                 else if (!strcmp(*args,"-econtent_type"))
323                         {
324                         if (!args[1])
325                                 goto argerr;
326                         args++;
327                         econtent_type = OBJ_txt2obj(*args, 0);
328                         if (!econtent_type)
329                                 {
330                                 BIO_printf(bio_err, "Invalid OID %s\n", *args);
331                                 goto argerr;
332                                 }
333                         }
334                 else if (!strcmp(*args,"-rand"))
335                         {
336                         if (!args[1])
337                                 goto argerr;
338                         args++;
339                         inrand = *args;
340                         need_rand = 1;
341                         }
342 #ifndef OPENSSL_NO_ENGINE
343                 else if (!strcmp(*args,"-engine"))
344                         {
345                         if (!args[1])
346                                 goto argerr;
347                         engine = *++args;
348                         }
349 #endif
350                 else if (!strcmp(*args,"-passin"))
351                         {
352                         if (!args[1])
353                                 goto argerr;
354                         passargin = *++args;
355                         }
356                 else if (!strcmp (*args, "-to"))
357                         {
358                         if (!args[1])
359                                 goto argerr;
360                         to = *++args;
361                         }
362                 else if (!strcmp (*args, "-from"))
363                         {
364                         if (!args[1])
365                                 goto argerr;
366                         from = *++args;
367                         }
368                 else if (!strcmp (*args, "-subject"))
369                         {
370                         if (!args[1])
371                                 goto argerr;
372                         subject = *++args;
373                         }
374                 else if (!strcmp (*args, "-signer"))
375                         {
376                         if (!args[1])
377                                 goto argerr;
378                         /* If previous -signer argument add signer to list */
379
380                         if (signerfile)
381                                 {
382                                 if (!sksigners)
383                                         sksigners = sk_new_null();
384                                 sk_push(sksigners, signerfile);
385                                 if (!keyfile)
386                                         keyfile = signerfile;
387                                 if (!skkeys)
388                                         skkeys = sk_new_null();
389                                 sk_push(skkeys, keyfile);
390                                 keyfile = NULL;
391                                 }
392                         signerfile = *++args;
393                         }
394                 else if (!strcmp (*args, "-recip"))
395                         {
396                         if (!args[1])
397                                 goto argerr;
398                         recipfile = *++args;
399                         }
400                 else if (!strcmp (*args, "-certsout"))
401                         {
402                         if (!args[1])
403                                 goto argerr;
404                         certsoutfile = *++args;
405                         }
406                 else if (!strcmp (*args, "-md"))
407                         {
408                         if (!args[1])
409                                 goto argerr;
410                         sign_md = EVP_get_digestbyname(*++args);
411                         if (sign_md == NULL)
412                                 {
413                                 BIO_printf(bio_err, "Unknown digest %s\n",
414                                                         *args);
415                                 goto argerr;
416                                 }
417                         }
418                 else if (!strcmp (*args, "-inkey"))
419                         {
420                         if (!args[1])   
421                                 goto argerr;
422                         /* If previous -inkey arument add signer to list */
423                         if (keyfile)
424                                 {
425                                 if (!signerfile)
426                                         {
427                                         BIO_puts(bio_err, "Illegal -inkey without -signer\n");
428                                         goto argerr;
429                                         }
430                                 if (!sksigners)
431                                         sksigners = sk_new_null();
432                                 sk_push(sksigners, signerfile);
433                                 signerfile = NULL;
434                                 if (!skkeys)
435                                         skkeys = sk_new_null();
436                                 sk_push(skkeys, keyfile);
437                                 }
438                         keyfile = *++args;
439                         }
440                 else if (!strcmp (*args, "-keyform"))
441                         {
442                         if (!args[1])
443                                 goto argerr;
444                         keyform = str2fmt(*++args);
445                         }
446                 else if (!strcmp (*args, "-rctform"))
447                         {
448                         if (!args[1])
449                                 goto argerr;
450                         rctformat = str2fmt(*++args);
451                         }
452                 else if (!strcmp (*args, "-certfile"))
453                         {
454                         if (!args[1])
455                                 goto argerr;
456                         certfile = *++args;
457                         }
458                 else if (!strcmp (*args, "-CAfile"))
459                         {
460                         if (!args[1])
461                                 goto argerr;
462                         CAfile = *++args;
463                         }
464                 else if (!strcmp (*args, "-CApath"))
465                         {
466                         if (!args[1])
467                                 goto argerr;
468                         CApath = *++args;
469                         }
470                 else if (!strcmp (*args, "-in"))
471                         {
472                         if (!args[1])
473                                 goto argerr;
474                         infile = *++args;
475                         }
476                 else if (!strcmp (*args, "-inform"))
477                         {
478                         if (!args[1])
479                                 goto argerr;
480                         informat = str2fmt(*++args);
481                         }
482                 else if (!strcmp (*args, "-outform"))
483                         {
484                         if (!args[1])
485                                 goto argerr;
486                         outformat = str2fmt(*++args);
487                         }
488                 else if (!strcmp (*args, "-out"))
489                         {
490                         if (!args[1])
491                                 goto argerr;
492                         outfile = *++args;
493                         }
494                 else if (!strcmp (*args, "-content"))
495                         {
496                         if (!args[1])
497                                 goto argerr;
498                         contfile = *++args;
499                         }
500                 else if (args_verify(&args, NULL, &badarg, bio_err, &vpm))
501                         continue;
502                 else if ((cipher = EVP_get_cipherbyname(*args + 1)) == NULL)
503                         badarg = 1;
504                 args++;
505                 }
506
507         if (((rr_allorfirst != -1) || rr_from) && !rr_to)
508                 {
509                 BIO_puts(bio_err, "No Signed Receipts Recipients\n");
510                 goto argerr;
511                 }
512
513         if (!(operation & SMIME_SIGNERS)  && (rr_to || rr_from))
514                 {
515                 BIO_puts(bio_err, "Signed receipts only allowed with -sign\n");
516                 goto argerr;
517                 }
518         if (!(operation & SMIME_SIGNERS) && (skkeys || sksigners))
519                 {
520                 BIO_puts(bio_err, "Multiple signers or keys not allowed\n");
521                 goto argerr;
522                 }
523
524         if (operation & SMIME_SIGNERS)
525                 {
526                 if (keyfile && !signerfile)
527                         {
528                         BIO_puts(bio_err, "Illegal -inkey without -signer\n");
529                         goto argerr;
530                         }
531                 /* Check to see if any final signer needs to be appended */
532                 if (signerfile)
533                         {
534                         if (!sksigners)
535                                 sksigners = sk_new_null();
536                         sk_push(sksigners, signerfile);
537                         if (!skkeys)
538                                 skkeys = sk_new_null();
539                         if (!keyfile)
540                                 keyfile = signerfile;
541                         sk_push(skkeys, keyfile);
542                         }
543                 if (!sksigners)
544                         {
545                         BIO_printf(bio_err, "No signer certificate specified\n");
546                         badarg = 1;
547                         }
548                 signerfile = NULL;
549                 keyfile = NULL;
550                 need_rand = 1;
551                 }
552
553         else if (operation == SMIME_DECRYPT)
554                 {
555                 if (!recipfile && !keyfile && !secret_key)
556                         {
557                         BIO_printf(bio_err, "No recipient certificate or key specified\n");
558                         badarg = 1;
559                         }
560                 }
561         else if (operation == SMIME_ENCRYPT)
562                 {
563                 if (!*args && !secret_key)
564                         {
565                         BIO_printf(bio_err, "No recipient(s) certificate(s) specified\n");
566                         badarg = 1;
567                         }
568                 need_rand = 1;
569                 }
570         else if (!operation)
571                 badarg = 1;
572
573         if (badarg)
574                 {
575                 argerr:
576                 BIO_printf (bio_err, "Usage cms [options] cert.pem ...\n");
577                 BIO_printf (bio_err, "where options are\n");
578                 BIO_printf (bio_err, "-encrypt       encrypt message\n");
579                 BIO_printf (bio_err, "-decrypt       decrypt encrypted message\n");
580                 BIO_printf (bio_err, "-sign          sign message\n");
581                 BIO_printf (bio_err, "-verify        verify signed message\n");
582                 BIO_printf (bio_err, "-cmsout        output CMS structure\n");
583 #ifndef OPENSSL_NO_DES
584                 BIO_printf (bio_err, "-des3          encrypt with triple DES\n");
585                 BIO_printf (bio_err, "-des           encrypt with DES\n");
586 #endif
587 #ifndef OPENSSL_NO_SEED
588                 BIO_printf (bio_err, "-seed          encrypt with SEED\n");
589 #endif
590 #ifndef OPENSSL_NO_RC2
591                 BIO_printf (bio_err, "-rc2-40        encrypt with RC2-40 (default)\n");
592                 BIO_printf (bio_err, "-rc2-64        encrypt with RC2-64\n");
593                 BIO_printf (bio_err, "-rc2-128       encrypt with RC2-128\n");
594 #endif
595 #ifndef OPENSSL_NO_AES
596                 BIO_printf (bio_err, "-aes128, -aes192, -aes256\n");
597                 BIO_printf (bio_err, "               encrypt PEM output with cbc aes\n");
598 #endif
599 #ifndef OPENSSL_NO_CAMELLIA
600                 BIO_printf (bio_err, "-camellia128, -camellia192, -camellia256\n");
601                 BIO_printf (bio_err, "               encrypt PEM output with cbc camellia\n");
602 #endif
603                 BIO_printf (bio_err, "-nointern      don't search certificates in message for signer\n");
604                 BIO_printf (bio_err, "-nosigs        don't verify message signature\n");
605                 BIO_printf (bio_err, "-noverify      don't verify signers certificate\n");
606                 BIO_printf (bio_err, "-nocerts       don't include signers certificate when signing\n");
607                 BIO_printf (bio_err, "-nodetach      use opaque signing\n");
608                 BIO_printf (bio_err, "-noattr        don't include any signed attributes\n");
609                 BIO_printf (bio_err, "-binary        don't translate message to text\n");
610                 BIO_printf (bio_err, "-certfile file other certificates file\n");
611                 BIO_printf (bio_err, "-certsout file certificate output file\n");
612                 BIO_printf (bio_err, "-signer file   signer certificate file\n");
613                 BIO_printf (bio_err, "-recip  file   recipient certificate file for decryption\n");
614                 BIO_printf (bio_err, "-skeyid        use subject key identifier\n");
615                 BIO_printf (bio_err, "-in file       input file\n");
616                 BIO_printf (bio_err, "-inform arg    input format SMIME (default), PEM or DER\n");
617                 BIO_printf (bio_err, "-inkey file    input private key (if not signer or recipient)\n");
618                 BIO_printf (bio_err, "-keyform arg   input private key format (PEM or ENGINE)\n");
619                 BIO_printf (bio_err, "-out file      output file\n");
620                 BIO_printf (bio_err, "-outform arg   output format SMIME (default), PEM or DER\n");
621                 BIO_printf (bio_err, "-content file  supply or override content for detached signature\n");
622                 BIO_printf (bio_err, "-to addr       to address\n");
623                 BIO_printf (bio_err, "-from ad       from address\n");
624                 BIO_printf (bio_err, "-subject s     subject\n");
625                 BIO_printf (bio_err, "-text          include or delete text MIME headers\n");
626                 BIO_printf (bio_err, "-CApath dir    trusted certificates directory\n");
627                 BIO_printf (bio_err, "-CAfile file   trusted certificates file\n");
628                 BIO_printf (bio_err, "-crl_check     check revocation status of signer's certificate using CRLs\n");
629                 BIO_printf (bio_err, "-crl_check_all check revocation status of signer's certificate chain using CRLs\n");
630 #ifndef OPENSSL_NO_ENGINE
631                 BIO_printf (bio_err, "-engine e      use engine e, possibly a hardware device.\n");
632 #endif
633                 BIO_printf (bio_err, "-passin arg    input file pass phrase source\n");
634                 BIO_printf(bio_err,  "-rand file%cfile%c...\n", LIST_SEPARATOR_CHAR, LIST_SEPARATOR_CHAR);
635                 BIO_printf(bio_err,  "               load the file (or the files in the directory) into\n");
636                 BIO_printf(bio_err,  "               the random number generator\n");
637                 BIO_printf (bio_err, "cert.pem       recipient certificate(s) for encryption\n");
638                 goto end;
639                 }
640
641 #ifndef OPENSSL_NO_ENGINE
642         e = setup_engine(bio_err, engine, 0);
643 #endif
644
645         if (!app_passwd(bio_err, passargin, NULL, &passin, NULL))
646                 {
647                 BIO_printf(bio_err, "Error getting password\n");
648                 goto end;
649                 }
650
651         if (need_rand)
652                 {
653                 app_RAND_load_file(NULL, bio_err, (inrand != NULL));
654                 if (inrand != NULL)
655                         BIO_printf(bio_err,"%ld semi-random bytes loaded\n",
656                                 app_RAND_load_files(inrand));
657                 }
658
659         ret = 2;
660
661         if (!(operation & SMIME_SIGNERS))
662                 flags &= ~CMS_DETACHED;
663
664         if (operation & SMIME_OP)
665                 {
666                 if (outformat == FORMAT_ASN1)
667                         outmode = "wb";
668                 }
669         else
670                 {
671                 if (flags & CMS_BINARY)
672                         outmode = "wb";
673                 }
674
675         if (operation & SMIME_IP)
676                 {
677                 if (informat == FORMAT_ASN1)
678                         inmode = "rb";
679                 }
680         else
681                 {
682                 if (flags & CMS_BINARY)
683                         inmode = "rb";
684                 }
685
686         if (operation == SMIME_ENCRYPT)
687                 {
688                 if (!cipher)
689                         {
690 #ifndef OPENSSL_NO_DES                  
691                         cipher = EVP_des_ede3_cbc();
692 #else
693                         BIO_printf(bio_err, "No cipher selected\n");
694                         goto end;
695 #endif
696                         }
697
698                 if (secret_key && !secret_keyid)
699                         {
700                         BIO_printf(bio_err, "No sectre key id\n");
701                         goto end;
702                         }
703
704                 if (*args)
705                         encerts = sk_X509_new_null();
706                 while (*args)
707                         {
708                         if (!(cert = load_cert(bio_err,*args,FORMAT_PEM,
709                                 NULL, e, "recipient certificate file")))
710                                 goto end;
711                         sk_X509_push(encerts, cert);
712                         cert = NULL;
713                         args++;
714                         }
715                 }
716
717         if (certfile)
718                 {
719                 if (!(other = load_certs(bio_err,certfile,FORMAT_PEM, NULL,
720                         e, "certificate file")))
721                         {
722                         ERR_print_errors(bio_err);
723                         goto end;
724                         }
725                 }
726
727         if (recipfile && (operation == SMIME_DECRYPT))
728                 {
729                 if (!(recip = load_cert(bio_err,recipfile,FORMAT_PEM,NULL,
730                         e, "recipient certificate file")))
731                         {
732                         ERR_print_errors(bio_err);
733                         goto end;
734                         }
735                 }
736
737         if (operation == SMIME_SIGN_RECEIPT)
738                 {
739                 if (!(signer = load_cert(bio_err,signerfile,FORMAT_PEM,NULL,
740                         e, "receipt signer certificate file")))
741                         {
742                         ERR_print_errors(bio_err);
743                         goto end;
744                         }
745                 }
746
747         if (operation == SMIME_DECRYPT)
748                 {
749                 if (!keyfile)
750                         keyfile = recipfile;
751                 }
752         else if ((operation == SMIME_SIGN) || (operation == SMIME_SIGN_RECEIPT))
753                 {
754                 if (!keyfile)
755                         keyfile = signerfile;
756                 }
757         else keyfile = NULL;
758
759         if (keyfile)
760                 {
761                 key = load_key(bio_err, keyfile, keyform, 0, passin, e,
762                                "signing key file");
763                 if (!key)
764                         goto end;
765                 }
766
767         if (infile)
768                 {
769                 if (!(in = BIO_new_file(infile, inmode)))
770                         {
771                         BIO_printf (bio_err,
772                                  "Can't open input file %s\n", infile);
773                         goto end;
774                         }
775                 }
776         else
777                 in = BIO_new_fp(stdin, BIO_NOCLOSE);
778
779         if (operation & SMIME_IP)
780                 {
781                 if (informat == FORMAT_SMIME) 
782                         cms = SMIME_read_CMS(in, &indata);
783                 else if (informat == FORMAT_PEM) 
784                         cms = PEM_read_bio_CMS(in, NULL, NULL, NULL);
785                 else if (informat == FORMAT_ASN1) 
786                         cms = d2i_CMS_bio(in, NULL);
787                 else
788                         {
789                         BIO_printf(bio_err, "Bad input format for CMS file\n");
790                         goto end;
791                         }
792
793                 if (!cms)
794                         {
795                         BIO_printf(bio_err, "Error reading S/MIME message\n");
796                         goto end;
797                         }
798                 if (contfile)
799                         {
800                         BIO_free(indata);
801                         if (!(indata = BIO_new_file(contfile, "rb")))
802                                 {
803                                 BIO_printf(bio_err, "Can't read content file %s\n", contfile);
804                                 goto end;
805                                 }
806                         }
807                 if (certsoutfile)
808                         {
809                         STACK_OF(X509) *allcerts;
810                         allcerts = CMS_get1_certs(cms);
811                         if (!save_certs(certsoutfile, allcerts))
812                                 {
813                                 BIO_printf(bio_err,
814                                                 "Error writing certs to %s\n",
815                                                                 certsoutfile);
816                                 ret = 5;
817                                 goto end;
818                                 }
819                         sk_X509_pop_free(allcerts, X509_free);
820                         }
821                 }
822
823         if (rctfile)
824                 {
825                 char *rctmode = (rctformat == FORMAT_ASN1) ? "rb" : "r";
826                 if (!(rctin = BIO_new_file(rctfile, rctmode)))
827                         {
828                         BIO_printf (bio_err,
829                                  "Can't open receipt file %s\n", rctfile);
830                         goto end;
831                         }
832                 
833                 if (rctformat == FORMAT_SMIME) 
834                         rcms = SMIME_read_CMS(rctin, NULL);
835                 else if (rctformat == FORMAT_PEM) 
836                         rcms = PEM_read_bio_CMS(rctin, NULL, NULL, NULL);
837                 else if (rctformat == FORMAT_ASN1) 
838                         rcms = d2i_CMS_bio(rctin, NULL);
839                 else
840                         {
841                         BIO_printf(bio_err, "Bad input format for receipt\n");
842                         goto end;
843                         }
844
845                 if (!rcms)
846                         {
847                         BIO_printf(bio_err, "Error reading receipt\n");
848                         goto end;
849                         }
850                 }
851
852         if (outfile)
853                 {
854                 if (!(out = BIO_new_file(outfile, outmode)))
855                         {
856                         BIO_printf (bio_err,
857                                  "Can't open output file %s\n", outfile);
858                         goto end;
859                         }
860                 }
861         else
862                 {
863                 out = BIO_new_fp(stdout, BIO_NOCLOSE);
864 #ifdef OPENSSL_SYS_VMS
865                 {
866                     BIO *tmpbio = BIO_new(BIO_f_linebuffer());
867                     out = BIO_push(tmpbio, out);
868                 }
869 #endif
870                 }
871
872         if ((operation == SMIME_VERIFY) || (operation == SMIME_VERIFY_RECEIPT))
873                 {
874                 if (!(store = setup_verify(bio_err, CAfile, CApath)))
875                         goto end;
876                 X509_STORE_set_verify_cb_func(store, cms_cb);
877                 if (vpm)
878                         X509_STORE_set1_param(store, vpm);
879                 }
880
881
882         ret = 3;
883
884         if (operation == SMIME_DATA_CREATE)
885                 {
886                 cms = CMS_data_create(in, flags);
887                 }
888         else if (operation == SMIME_DIGEST_CREATE)
889                 {
890                 cms = CMS_digest_create(in, sign_md, flags);
891                 }
892         else if (operation == SMIME_COMPRESS)
893                 {
894                 cms = CMS_compress(in, -1, flags);
895                 }
896         else if (operation == SMIME_ENCRYPT)
897                 {
898                 flags |= CMS_PARTIAL;
899                 cms = CMS_encrypt(encerts, in, cipher, flags);
900                 if (!cms)
901                         goto end;
902                 if (secret_key)
903                         {
904                         if (!CMS_add0_recipient_key(cms, NID_undef, 
905                                                 secret_key, secret_keylen,
906                                                 secret_keyid, secret_keyidlen,
907                                                 NULL, NULL, NULL))
908                                 goto end;
909                         /* NULL these because call absorbs them */
910                         secret_key = NULL;
911                         secret_keyid = NULL;
912                         }
913                 if (!(flags & CMS_STREAM))
914                         {
915                         if (!CMS_final(cms, in, NULL, flags))
916                                 goto end;
917                         }
918                 }
919         else if (operation == SMIME_ENCRYPTED_ENCRYPT)
920                 {
921                 cms = CMS_EncryptedData_encrypt(in, cipher,
922                                                 secret_key, secret_keylen,
923                                                 flags);
924
925                 }
926         else if (operation == SMIME_SIGN_RECEIPT)
927                 {
928                 CMS_ContentInfo *srcms = NULL;
929                 STACK_OF(CMS_SignerInfo) *sis;
930                 CMS_SignerInfo *si;
931                 sis = CMS_get0_SignerInfos(cms);
932                 if (!sis)
933                         goto end;
934                 si = sk_CMS_SignerInfo_value(sis, 0);
935                 srcms = CMS_sign_receipt(si, signer, key, other, flags);
936                 if (!srcms)
937                         goto end;
938                 CMS_ContentInfo_free(cms);
939                 cms = srcms;
940                 }
941         else if (operation & SMIME_SIGNERS)
942                 {
943                 int i;
944                 /* If detached data content we enable streaming if
945                  * S/MIME output format.
946                  */
947                 if (operation == SMIME_SIGN)
948                         {
949                                 
950                         if (flags & CMS_DETACHED)
951                                 {
952                                 if (outformat == FORMAT_SMIME)
953                                         flags |= CMS_STREAM;
954                                 }
955                         flags |= CMS_PARTIAL;
956                         cms = CMS_sign(NULL, NULL, other, in, flags);
957                         if (!cms)
958                                 goto end;
959                         if (econtent_type)
960                                 CMS_set1_eContentType(cms, econtent_type);
961
962                         if (rr_to)
963                                 {
964                                 rr = make_receipt_request(rr_to, rr_allorfirst,
965                                                                 rr_from);
966                                 if (!rr)
967                                         {
968                                         BIO_puts(bio_err,
969                                 "Signed Receipt Request Creation Error\n");
970                                         goto end;
971                                         }
972                                 }
973                         }
974                 else
975                         flags |= CMS_REUSE_DIGEST;
976                 for (i = 0; i < sk_num(sksigners); i++)
977                         {
978                         CMS_SignerInfo *si;
979                         signerfile = sk_value(sksigners, i);
980                         keyfile = sk_value(skkeys, i);
981                         signer = load_cert(bio_err, signerfile,FORMAT_PEM, NULL,
982                                         e, "signer certificate");
983                         if (!signer)
984                                 goto end;
985                         key = load_key(bio_err, keyfile, keyform, 0, passin, e,
986                                "signing key file");
987                         if (!key)
988                                 goto end;
989                         si = CMS_add1_signer(cms, signer, key, sign_md, flags);
990                         if (!si)
991                                 goto end;
992                         if (rr && !CMS_add1_ReceiptRequest(si, rr))
993                                 goto end;
994                         X509_free(signer);
995                         signer = NULL;
996                         EVP_PKEY_free(key);
997                         key = NULL;
998                         }
999                 /* If not streaming or resigning finalize structure */
1000                 if ((operation == SMIME_SIGN) && !(flags & CMS_STREAM))
1001                         {
1002                         if (!CMS_final(cms, in, NULL, flags))
1003                                 goto end;
1004                         }
1005                 }
1006
1007         if (!cms)
1008                 {
1009                 BIO_printf(bio_err, "Error creating CMS structure\n");
1010                 goto end;
1011                 }
1012
1013         ret = 4;
1014         if (operation == SMIME_DECRYPT)
1015                 {
1016
1017                 if (secret_key)
1018                         {
1019                         if (!CMS_decrypt_set1_key(cms,
1020                                                 secret_key, secret_keylen,
1021                                                 secret_keyid, secret_keyidlen))
1022                                 {
1023                                 BIO_puts(bio_err,
1024                                         "Error decrypting CMS using secret key\n");
1025                                 goto end;
1026                                 }
1027                         }
1028
1029                 if (key)
1030                         {
1031                         if (!CMS_decrypt_set1_pkey(cms, key, recip))
1032                                 {
1033                                 BIO_puts(bio_err,
1034                                         "Error decrypting CMS using private key\n");
1035                                 goto end;
1036                                 }
1037                         }
1038
1039                 if (!CMS_decrypt(cms, NULL, NULL, indata, out, flags))
1040                         {
1041                         BIO_printf(bio_err, "Error decrypting CMS structure\n");
1042                         goto end;
1043                         }
1044                 }
1045         else if (operation == SMIME_DATAOUT)
1046                 {
1047                 if (!CMS_data(cms, out, flags))
1048                         goto end;
1049                 }
1050         else if (operation == SMIME_UNCOMPRESS)
1051                 {
1052                 if (!CMS_uncompress(cms, indata, out, flags))
1053                         goto end;
1054                 }
1055         else if (operation == SMIME_DIGEST_VERIFY)
1056                 {
1057                 if (CMS_digest_verify(cms, indata, out, flags) > 0)
1058                         BIO_printf(bio_err, "Verification successful\n");
1059                 else
1060                         {
1061                         BIO_printf(bio_err, "Verification failure\n");
1062                         goto end;
1063                         }
1064                 }
1065         else if (operation == SMIME_ENCRYPTED_DECRYPT)
1066                 {
1067                 if (!CMS_EncryptedData_decrypt(cms, secret_key, secret_keylen,
1068                                                 indata, out, flags))
1069                         goto end;
1070                 }
1071         else if (operation == SMIME_VERIFY)
1072                 {
1073                 if (CMS_verify(cms, other, store, indata, out, flags) > 0)
1074                         BIO_printf(bio_err, "Verification successful\n");
1075                 else
1076                         {
1077                         BIO_printf(bio_err, "Verification failure\n");
1078                         goto end;
1079                         }
1080                 if (signerfile)
1081                         {
1082                         STACK_OF(X509) *signers;
1083                         signers = CMS_get0_signers(cms);
1084                         if (!save_certs(signerfile, signers))
1085                                 {
1086                                 BIO_printf(bio_err,
1087                                                 "Error writing signers to %s\n",
1088                                                                 signerfile);
1089                                 ret = 5;
1090                                 goto end;
1091                                 }
1092                         sk_X509_free(signers);
1093                         }
1094                 if (rr_print)
1095                         receipt_request_print(bio_err, cms);
1096                                         
1097                 }
1098         else if (operation == SMIME_VERIFY_RECEIPT)
1099                 {
1100                 if (CMS_verify_receipt(rcms, cms, other, store, flags) > 0)
1101                         BIO_printf(bio_err, "Verification successful\n");
1102                 else
1103                         {
1104                         BIO_printf(bio_err, "Verification failure\n");
1105                         goto end;
1106                         }
1107                 }
1108         else
1109                 {
1110                 if (outformat == FORMAT_SMIME)
1111                         {
1112                         if (to)
1113                                 BIO_printf(out, "To: %s\n", to);
1114                         if (from)
1115                                 BIO_printf(out, "From: %s\n", from);
1116                         if (subject)
1117                                 BIO_printf(out, "Subject: %s\n", subject);
1118                         if (operation == SMIME_RESIGN)
1119                                 ret = SMIME_write_CMS(out, cms, indata, flags);
1120                         else
1121                                 ret = SMIME_write_CMS(out, cms, in, flags);
1122                         }
1123                 else if (outformat == FORMAT_PEM) 
1124                         ret = PEM_write_bio_CMS(out, cms);
1125                 else if (outformat == FORMAT_ASN1) 
1126                         ret = i2d_CMS_bio(out,cms);
1127                 else
1128                         {
1129                         BIO_printf(bio_err, "Bad output format for CMS file\n");
1130                         goto end;
1131                         }
1132                 if (ret <= 0)
1133                         {
1134                         ret = 6;
1135                         goto end;
1136                         }
1137                 }
1138         ret = 0;
1139 end:
1140         if (ret)
1141                 ERR_print_errors(bio_err);
1142         if (need_rand)
1143                 app_RAND_write_file(NULL, bio_err);
1144         sk_X509_pop_free(encerts, X509_free);
1145         sk_X509_pop_free(other, X509_free);
1146         if (vpm)
1147                 X509_VERIFY_PARAM_free(vpm);
1148         if (sksigners)
1149                 sk_free(sksigners);
1150         if (skkeys)
1151                 sk_free(skkeys);
1152         if (secret_key)
1153                 OPENSSL_free(secret_key);
1154         if (secret_keyid)
1155                 OPENSSL_free(secret_keyid);
1156         if (econtent_type)
1157                 ASN1_OBJECT_free(econtent_type);
1158         if (rr)
1159                 CMS_ReceiptRequest_free(rr);
1160         if (rr_to)
1161                 sk_free(rr_to);
1162         if (rr_from)
1163                 sk_free(rr_from);
1164         X509_STORE_free(store);
1165         X509_free(cert);
1166         X509_free(recip);
1167         X509_free(signer);
1168         EVP_PKEY_free(key);
1169         CMS_ContentInfo_free(cms);
1170         CMS_ContentInfo_free(rcms);
1171         BIO_free(rctin);
1172         BIO_free(in);
1173         BIO_free(indata);
1174         BIO_free_all(out);
1175         if (passin) OPENSSL_free(passin);
1176         return (ret);
1177 }
1178
1179 static int save_certs(char *signerfile, STACK_OF(X509) *signers)
1180         {
1181         int i;
1182         BIO *tmp;
1183         if (!signerfile)
1184                 return 1;
1185         tmp = BIO_new_file(signerfile, "w");
1186         if (!tmp) return 0;
1187         for(i = 0; i < sk_X509_num(signers); i++)
1188                 PEM_write_bio_X509(tmp, sk_X509_value(signers, i));
1189         BIO_free(tmp);
1190         return 1;
1191         }
1192         
1193
1194 /* Minimal callback just to output policy info (if any) */
1195
1196 static int cms_cb(int ok, X509_STORE_CTX *ctx)
1197         {
1198         int error;
1199
1200         error = X509_STORE_CTX_get_error(ctx);
1201
1202         if ((error != X509_V_ERR_NO_EXPLICIT_POLICY)
1203                 && ((error != X509_V_OK) || (ok != 2)))
1204                 return ok;
1205
1206         policies_print(NULL, ctx);
1207
1208         return ok;
1209
1210         }
1211
1212 static void gnames_stack_print(BIO *out, STACK_OF(GENERAL_NAMES) *gns)
1213         {
1214         STACK_OF(GENERAL_NAME) *gens;
1215         GENERAL_NAME *gen;
1216         int i, j;
1217         for (i = 0; i < sk_GENERAL_NAMES_num(gns); i++)
1218                 {
1219                 gens = sk_GENERAL_NAMES_value(gns, i);
1220                 for (j = 0; j < sk_GENERAL_NAME_num(gens); j++)
1221                         {
1222                         gen = sk_GENERAL_NAME_value(gens, j);
1223                         BIO_puts(out, "    ");
1224                         GENERAL_NAME_print(out, gen);
1225                         BIO_puts(out, "\n");
1226                         }
1227                 }
1228         return;
1229         }
1230
1231 static void receipt_request_print(BIO *out, CMS_ContentInfo *cms)
1232         {
1233         STACK_OF(CMS_SignerInfo) *sis;
1234         CMS_SignerInfo *si;
1235         CMS_ReceiptRequest *rr;
1236         int allorfirst;
1237         STACK_OF(GENERAL_NAMES) *rto, *rlist;
1238         ASN1_STRING *scid;
1239         int i, rv;
1240         sis = CMS_get0_SignerInfos(cms);
1241         for (i = 0; i < sk_CMS_SignerInfo_num(sis); i++)
1242                 {
1243                 si = sk_CMS_SignerInfo_value(sis, i);
1244                 rv = CMS_get1_ReceiptRequest(si, &rr);
1245                 BIO_printf(bio_err, "Signer %d:\n", i + 1);
1246                 if (rv == 0)
1247                         BIO_puts(bio_err, "  No Receipt Request\n");
1248                 else if (rv < 0)
1249                         {
1250                         BIO_puts(bio_err, "  Receipt Request Parse Error\n");
1251                         ERR_print_errors(bio_err);
1252                         }
1253                 else
1254                         {
1255                         char *id;
1256                         int idlen;
1257                         CMS_ReceiptRequest_get0_values(rr, &scid, &allorfirst,
1258                                                         &rlist, &rto);
1259                         BIO_puts(out, "  Signed Content ID:\n");
1260                         idlen = ASN1_STRING_length(scid);
1261                         id = (char *)ASN1_STRING_data(scid);
1262                         BIO_dump_indent(out, id, idlen, 4);
1263                         BIO_puts(out, "  Receipts From");
1264                         if (rlist)
1265                                 {
1266                                 BIO_puts(out, " List:\n");
1267                                 gnames_stack_print(out, rlist);
1268                                 }
1269                         else if (allorfirst == 1)
1270                                 BIO_puts(out, ": First Tier\n");
1271                         else if (allorfirst == 0)
1272                                 BIO_puts(out, ": All\n");
1273                         else
1274                                 BIO_printf(out, " Unknown (%d)\n", allorfirst);
1275                         BIO_puts(out, "  Receipts To:\n");
1276                         gnames_stack_print(out, rto);
1277                         }
1278                 if (rr)
1279                         CMS_ReceiptRequest_free(rr);
1280                 }
1281         }
1282
1283 static STACK_OF(GENERAL_NAMES) *make_names_stack(STACK *ns)
1284         {
1285         int i;
1286         STACK_OF(GENERAL_NAMES) *ret;
1287         GENERAL_NAMES *gens = NULL;
1288         GENERAL_NAME *gen = NULL;
1289         ret = sk_GENERAL_NAMES_new_null();
1290         if (!ret)
1291                 goto err;
1292         for (i = 0; i < sk_num(ns); i++)
1293                 {
1294                 CONF_VALUE cnf;
1295                 cnf.name = "email";
1296                 cnf.value = sk_value(ns, i);
1297                 gen = v2i_GENERAL_NAME(NULL, NULL, &cnf);
1298                 if (!gen)
1299                         goto err;
1300                 gens = GENERAL_NAMES_new();
1301                 if (!gens)
1302                         goto err;
1303                 if (!sk_GENERAL_NAME_push(gens, gen))
1304                         goto err;
1305                 gen = NULL;
1306                 if (!sk_GENERAL_NAMES_push(ret, gens))
1307                         goto err;
1308                 gens = NULL;
1309                 }
1310
1311         return ret;
1312
1313         err:
1314         if (ret)
1315                 sk_GENERAL_NAMES_pop_free(ret, GENERAL_NAMES_free);
1316         if (gens)
1317                 GENERAL_NAMES_free(gens);
1318         if (gen)
1319                 GENERAL_NAME_free(gen);
1320         return NULL;
1321         }
1322
1323
1324 static CMS_ReceiptRequest *make_receipt_request(STACK *rr_to, int rr_allorfirst,
1325                                                                 STACK *rr_from)
1326         {
1327         STACK_OF(GENERAL_NAMES) *rct_to, *rct_from;
1328         CMS_ReceiptRequest *rr;
1329         rct_to = make_names_stack(rr_to);
1330         if (!rct_to)
1331                 goto err;
1332         if (rr_from)
1333                 {
1334                 rct_from = make_names_stack(rr_from);
1335                 if (!rct_from)
1336                         goto err;
1337                 }
1338         else
1339                 rct_from = NULL;
1340         rr = CMS_ReceiptRequest_create0(NULL, -1, rr_allorfirst, rct_from,
1341                                                 rct_to);
1342         return rr;
1343         err:
1344         return NULL;
1345         }
1346
1347 #endif