LCOV - code coverage report
Current view: top level - home/mbr/git/openssl.git/apps - cms.c (source / functions) Hit Total Coverage
Test: lcov_coverage_final.info Lines: 485 798 60.8 %
Date: 2014-08-02 Functions: 5 8 62.5 %
Branches: 412 692 59.5 %

           Branch data     Line data    Source code
       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_OF(OPENSSL_STRING) *rr_to,
      75                 :            :                                                 int rr_allorfirst,
      76                 :            :                                         STACK_OF(OPENSSL_STRING) *rr_from);
      77                 :            : static int cms_set_pkey_param(EVP_PKEY_CTX *pctx,
      78                 :            :                         STACK_OF(OPENSSL_STRING) *param);
      79                 :            : 
      80                 :            : #define SMIME_OP        0x10
      81                 :            : #define SMIME_IP        0x20
      82                 :            : #define SMIME_SIGNERS   0x40
      83                 :            : #define SMIME_ENCRYPT           (1 | SMIME_OP)
      84                 :            : #define SMIME_DECRYPT           (2 | SMIME_IP)
      85                 :            : #define SMIME_SIGN              (3 | SMIME_OP | SMIME_SIGNERS)
      86                 :            : #define SMIME_VERIFY            (4 | SMIME_IP)
      87                 :            : #define SMIME_CMSOUT            (5 | SMIME_IP | SMIME_OP)
      88                 :            : #define SMIME_RESIGN            (6 | SMIME_IP | SMIME_OP | SMIME_SIGNERS)
      89                 :            : #define SMIME_DATAOUT           (7 | SMIME_IP)
      90                 :            : #define SMIME_DATA_CREATE       (8 | SMIME_OP)
      91                 :            : #define SMIME_DIGEST_VERIFY     (9 | SMIME_IP)
      92                 :            : #define SMIME_DIGEST_CREATE     (10 | SMIME_OP)
      93                 :            : #define SMIME_UNCOMPRESS        (11 | SMIME_IP)
      94                 :            : #define SMIME_COMPRESS          (12 | SMIME_OP)
      95                 :            : #define SMIME_ENCRYPTED_DECRYPT (13 | SMIME_IP)
      96                 :            : #define SMIME_ENCRYPTED_ENCRYPT (14 | SMIME_OP)
      97                 :            : #define SMIME_SIGN_RECEIPT      (15 | SMIME_IP | SMIME_OP)
      98                 :            : #define SMIME_VERIFY_RECEIPT    (16 | SMIME_IP)
      99                 :            : 
     100                 :            : int verify_err = 0;
     101                 :            : 
     102                 :            : typedef struct cms_key_param_st cms_key_param;
     103                 :            : 
     104                 :            : struct cms_key_param_st
     105                 :            :         {
     106                 :            :         int idx;
     107                 :            :         STACK_OF(OPENSSL_STRING)*param;
     108                 :            :         cms_key_param *next;
     109                 :            :         };
     110                 :            : 
     111                 :            : int MAIN(int, char **);
     112                 :            : 
     113                 :        102 : int MAIN(int argc, char **argv)
     114                 :            :         {
     115                 :        102 :         ENGINE *e = NULL;
     116                 :        102 :         int operation = 0;
     117                 :        102 :         int ret = 0;
     118                 :            :         char **args;
     119                 :        102 :         const char *inmode = "r", *outmode = "w";
     120                 :        102 :         char *infile = NULL, *outfile = NULL, *rctfile = NULL;
     121                 :        102 :         char *signerfile = NULL, *recipfile = NULL;
     122                 :        102 :         STACK_OF(OPENSSL_STRING) *sksigners = NULL, *skkeys = NULL;
     123                 :        102 :         char *certfile = NULL, *keyfile = NULL, *contfile=NULL;
     124                 :        102 :         char *certsoutfile = NULL;
     125                 :        102 :         const EVP_CIPHER *cipher = NULL, *wrap_cipher = NULL;
     126                 :        102 :         CMS_ContentInfo *cms = NULL, *rcms = NULL;
     127                 :        102 :         X509_STORE *store = NULL;
     128                 :        102 :         X509 *cert = NULL, *recip = NULL, *signer = NULL;
     129                 :        102 :         EVP_PKEY *key = NULL;
     130                 :        102 :         STACK_OF(X509) *encerts = NULL, *other = NULL;
     131                 :        102 :         BIO *in = NULL, *out = NULL, *indata = NULL, *rctin = NULL;
     132                 :        102 :         int badarg = 0;
     133                 :        102 :         int flags = CMS_DETACHED, noout = 0, print = 0;
     134                 :        102 :         int verify_retcode = 0;
     135                 :        102 :         int rr_print = 0, rr_allorfirst = -1;
     136                 :        102 :         STACK_OF(OPENSSL_STRING) *rr_to = NULL, *rr_from = NULL;
     137                 :        102 :         CMS_ReceiptRequest *rr = NULL;
     138                 :        102 :         char *to = NULL, *from = NULL, *subject = NULL;
     139                 :        102 :         char *CAfile = NULL, *CApath = NULL;
     140                 :        102 :         char *passargin = NULL, *passin = NULL;
     141                 :        102 :         char *inrand = NULL;
     142                 :        102 :         int need_rand = 0;
     143                 :        102 :         const EVP_MD *sign_md = NULL;
     144                 :        102 :         int informat = FORMAT_SMIME, outformat = FORMAT_SMIME;
     145                 :        102 :         int rctformat = FORMAT_SMIME, keyform = FORMAT_PEM;
     146                 :            : #ifndef OPENSSL_NO_ENGINE
     147                 :        102 :         char *engine=NULL;
     148                 :            : #endif
     149                 :        102 :         unsigned char *secret_key = NULL, *secret_keyid = NULL;
     150                 :        102 :         unsigned char *pwri_pass = NULL, *pwri_tmp = NULL;
     151                 :        102 :         size_t secret_keylen = 0, secret_keyidlen = 0;
     152                 :            : 
     153                 :        102 :         cms_key_param *key_first = NULL, *key_param = NULL;
     154                 :            : 
     155                 :        102 :         ASN1_OBJECT *econtent_type = NULL;
     156                 :            : 
     157                 :        102 :         X509_VERIFY_PARAM *vpm = NULL;
     158                 :            : 
     159                 :        102 :         args = argv + 1;
     160                 :        102 :         ret = 1;
     161                 :            : 
     162                 :        102 :         apps_startup();
     163                 :            : 
     164         [ -  + ]:        102 :         if (bio_err == NULL)
     165                 :            :                 {
     166         [ #  # ]:          0 :                 if ((bio_err = BIO_new(BIO_s_file())) != NULL)
     167                 :          0 :                         BIO_set_fp(bio_err, stderr, BIO_NOCLOSE|BIO_FP_TEXT);
     168                 :            :                 }
     169                 :            : 
     170         [ +  - ]:        102 :         if (!load_config(bio_err, NULL))
     171                 :            :                 goto end;
     172                 :            : 
     173 [ +  - ][ +  + ]:        686 :         while (!badarg && *args && *args[0] == '-')
                 [ +  + ]
     174                 :            :                 {
     175         [ +  + ]:        584 :                 if (!strcmp (*args, "-encrypt"))
     176                 :            :                         operation = SMIME_ENCRYPT;
     177         [ +  + ]:        567 :                 else if (!strcmp (*args, "-decrypt"))
     178                 :            :                         operation = SMIME_DECRYPT;
     179         [ +  + ]:        550 :                 else if (!strcmp (*args, "-sign"))
     180                 :            :                         operation = SMIME_SIGN;
     181         [ +  + ]:        524 :                 else if (!strcmp (*args, "-sign_receipt"))
     182                 :            :                         operation = SMIME_SIGN_RECEIPT;
     183         [ +  + ]:        523 :                 else if (!strcmp (*args, "-resign"))
     184                 :            :                         operation = SMIME_RESIGN;
     185         [ +  + ]:        521 :                 else if (!strcmp (*args, "-verify"))
     186                 :            :                         operation = SMIME_VERIFY;
     187         [ +  - ]:        493 :                 else if (!strcmp (*args, "-verify_retcode"))
     188                 :            :                         verify_retcode = 1;
     189         [ +  + ]:        493 :                 else if (!strcmp(*args,"-verify_receipt"))
     190                 :            :                         {
     191                 :          1 :                         operation = SMIME_VERIFY_RECEIPT;
     192         [ +  - ]:          1 :                         if (!args[1])
     193                 :            :                                 goto argerr;
     194                 :          1 :                         args++;
     195                 :          1 :                         rctfile = *args;
     196                 :            :                         }
     197         [ +  - ]:        492 :                 else if (!strcmp (*args, "-cmsout"))
     198                 :            :                         operation = SMIME_CMSOUT;
     199         [ +  + ]:        492 :                 else if (!strcmp (*args, "-data_out"))
     200                 :            :                         operation = SMIME_DATAOUT;
     201         [ +  + ]:        491 :                 else if (!strcmp (*args, "-data_create"))
     202                 :            :                         operation = SMIME_DATA_CREATE;
     203         [ +  - ]:        490 :                 else if (!strcmp (*args, "-digest_verify"))
     204                 :            :                         operation = SMIME_DIGEST_VERIFY;
     205         [ +  - ]:        490 :                 else if (!strcmp (*args, "-digest_create"))
     206                 :            :                         operation = SMIME_DIGEST_CREATE;
     207         [ +  - ]:        490 :                 else if (!strcmp (*args, "-compress"))
     208                 :            :                         operation = SMIME_COMPRESS;
     209         [ +  - ]:        490 :                 else if (!strcmp (*args, "-uncompress"))
     210                 :            :                         operation = SMIME_UNCOMPRESS;
     211         [ +  + ]:        490 :                 else if (!strcmp (*args, "-EncryptedData_decrypt"))
     212                 :            :                         operation = SMIME_ENCRYPTED_DECRYPT;
     213         [ +  + ]:        486 :                 else if (!strcmp (*args, "-EncryptedData_encrypt"))
     214                 :            :                         operation = SMIME_ENCRYPTED_ENCRYPT;
     215                 :            : #ifndef OPENSSL_NO_DES
     216         [ +  + ]:        482 :                 else if (!strcmp (*args, "-des3")) 
     217                 :          1 :                                 cipher = EVP_des_ede3_cbc();
     218         [ -  + ]:        481 :                 else if (!strcmp (*args, "-des")) 
     219                 :          0 :                                 cipher = EVP_des_cbc();
     220         [ -  + ]:        481 :                 else if (!strcmp (*args, "-des3-wrap")) 
     221                 :          0 :                                 wrap_cipher = EVP_des_ede3_wrap();
     222                 :            : #endif
     223                 :            : #ifndef OPENSSL_NO_SEED
     224         [ -  + ]:        481 :                 else if (!strcmp (*args, "-seed")) 
     225                 :          0 :                                 cipher = EVP_seed_cbc();
     226                 :            : #endif
     227                 :            : #ifndef OPENSSL_NO_RC2
     228         [ -  + ]:        481 :                 else if (!strcmp (*args, "-rc2-40")) 
     229                 :          0 :                                 cipher = EVP_rc2_40_cbc();
     230         [ -  + ]:        481 :                 else if (!strcmp (*args, "-rc2-128")) 
     231                 :          0 :                                 cipher = EVP_rc2_cbc();
     232         [ -  + ]:        481 :                 else if (!strcmp (*args, "-rc2-64")) 
     233                 :          0 :                                 cipher = EVP_rc2_64_cbc();
     234                 :            : #endif
     235                 :            : #ifndef OPENSSL_NO_AES
     236         [ +  + ]:        481 :                 else if (!strcmp(*args,"-aes128"))
     237                 :          6 :                                 cipher = EVP_aes_128_cbc();
     238         [ -  + ]:        475 :                 else if (!strcmp(*args,"-aes192"))
     239                 :          0 :                                 cipher = EVP_aes_192_cbc();
     240         [ +  + ]:        475 :                 else if (!strcmp(*args,"-aes256"))
     241                 :          2 :                                 cipher = EVP_aes_256_cbc();
     242         [ -  + ]:        473 :                 else if (!strcmp(*args,"-aes128-wrap"))
     243                 :          0 :                                 wrap_cipher = EVP_aes_128_wrap();
     244         [ -  + ]:        473 :                 else if (!strcmp(*args,"-aes192-wrap"))
     245                 :          0 :                                 wrap_cipher = EVP_aes_192_wrap();
     246         [ -  + ]:        473 :                 else if (!strcmp(*args,"-aes256-wrap"))
     247                 :          0 :                                 wrap_cipher = EVP_aes_256_wrap();
     248                 :            : #endif
     249                 :            : #ifndef OPENSSL_NO_CAMELLIA
     250         [ -  + ]:        473 :                 else if (!strcmp(*args,"-camellia128"))
     251                 :          0 :                                 cipher = EVP_camellia_128_cbc();
     252         [ -  + ]:        473 :                 else if (!strcmp(*args,"-camellia192"))
     253                 :          0 :                                 cipher = EVP_camellia_192_cbc();
     254         [ -  + ]:        473 :                 else if (!strcmp(*args,"-camellia256"))
     255                 :          0 :                                 cipher = EVP_camellia_256_cbc();
     256                 :            : #endif
     257         [ -  + ]:        473 :                 else if (!strcmp (*args, "-debug_decrypt")) 
     258                 :          0 :                                 flags |= CMS_DEBUG_DECRYPT;
     259         [ -  + ]:        473 :                 else if (!strcmp (*args, "-text")) 
     260                 :          0 :                                 flags |= CMS_TEXT;
     261         [ -  + ]:        473 :                 else if (!strcmp (*args, "-asciicrlf")) 
     262                 :          0 :                                 flags |= CMS_ASCIICRLF;
     263         [ -  + ]:        473 :                 else if (!strcmp (*args, "-nointern")) 
     264                 :          0 :                                 flags |= CMS_NOINTERN;
     265         [ +  - ]:        473 :                 else if (!strcmp (*args, "-noverify") 
     266         [ -  + ]:        473 :                         || !strcmp (*args, "-no_signer_cert_verify")) 
     267                 :          0 :                                 flags |= CMS_NO_SIGNER_CERT_VERIFY;
     268         [ -  + ]:        473 :                 else if (!strcmp (*args, "-nocerts")) 
     269                 :          0 :                                 flags |= CMS_NOCERTS;
     270         [ +  + ]:        473 :                 else if (!strcmp (*args, "-noattr")) 
     271                 :          3 :                                 flags |= CMS_NOATTR;
     272         [ +  + ]:        470 :                 else if (!strcmp (*args, "-nodetach")) 
     273                 :         21 :                                 flags &= ~CMS_DETACHED;
     274         [ -  + ]:        449 :                 else if (!strcmp (*args, "-nosmimecap"))
     275                 :          0 :                                 flags |= CMS_NOSMIMECAP;
     276         [ -  + ]:        449 :                 else if (!strcmp (*args, "-binary"))
     277                 :          0 :                                 flags |= CMS_BINARY;
     278         [ +  + ]:        449 :                 else if (!strcmp (*args, "-keyid"))
     279                 :          2 :                                 flags |= CMS_USE_KEYID;
     280         [ -  + ]:        447 :                 else if (!strcmp (*args, "-nosigs"))
     281                 :          0 :                                 flags |= CMS_NOSIGS;
     282         [ -  + ]:        447 :                 else if (!strcmp (*args, "-no_content_verify"))
     283                 :          0 :                                 flags |= CMS_NO_CONTENT_VERIFY;
     284         [ -  + ]:        447 :                 else if (!strcmp (*args, "-no_attr_verify"))
     285                 :          0 :                                 flags |= CMS_NO_ATTR_VERIFY;
     286         [ +  + ]:        447 :                 else if (!strcmp (*args, "-stream"))
     287                 :         36 :                                 flags |= CMS_STREAM;
     288         [ -  + ]:        411 :                 else if (!strcmp (*args, "-indef"))
     289                 :          0 :                                 flags |= CMS_STREAM;
     290         [ -  + ]:        411 :                 else if (!strcmp (*args, "-noindef"))
     291                 :          0 :                                 flags &= ~CMS_STREAM;
     292         [ -  + ]:        411 :                 else if (!strcmp (*args, "-nooldmime"))
     293                 :          0 :                                 flags |= CMS_NOOLDMIMETYPE;
     294         [ -  + ]:        411 :                 else if (!strcmp (*args, "-crlfeol"))
     295                 :          0 :                                 flags |= CMS_CRLFEOL;
     296         [ +  - ]:        411 :                 else if (!strcmp (*args, "-noout"))
     297                 :            :                                 noout = 1;
     298         [ +  - ]:        411 :                 else if (!strcmp (*args, "-receipt_request_print"))
     299                 :            :                                 rr_print = 1;
     300         [ +  + ]:        411 :                 else if (!strcmp (*args, "-receipt_request_all"))
     301                 :            :                                 rr_allorfirst = 0;
     302         [ +  - ]:        410 :                 else if (!strcmp (*args, "-receipt_request_first"))
     303                 :            :                                 rr_allorfirst = 1;
     304         [ -  + ]:        410 :                 else if (!strcmp(*args,"-receipt_request_from"))
     305                 :            :                         {
     306         [ #  # ]:          0 :                         if (!args[1])
     307                 :            :                                 goto argerr;
     308                 :          0 :                         args++;
     309         [ #  # ]:          0 :                         if (!rr_from)
     310                 :          0 :                                 rr_from = sk_OPENSSL_STRING_new_null();
     311                 :          0 :                         sk_OPENSSL_STRING_push(rr_from, *args);
     312                 :            :                         }
     313         [ +  + ]:        410 :                 else if (!strcmp(*args,"-receipt_request_to"))
     314                 :            :                         {
     315         [ +  - ]:          1 :                         if (!args[1])
     316                 :            :                                 goto argerr;
     317                 :          1 :                         args++;
     318         [ +  - ]:          1 :                         if (!rr_to)
     319                 :          1 :                                 rr_to = sk_OPENSSL_STRING_new_null();
     320                 :          1 :                         sk_OPENSSL_STRING_push(rr_to, *args);
     321                 :            :                         }
     322         [ +  - ]:        409 :                 else if (!strcmp (*args, "-print"))
     323                 :            :                                 {
     324                 :            :                                 noout = 1;
     325                 :            :                                 print = 1;
     326                 :            :                                 }
     327         [ +  + ]:        409 :                 else if (!strcmp(*args,"-secretkey"))
     328                 :            :                         {
     329                 :            :                         long ltmp;
     330         [ +  - ]:         12 :                         if (!args[1])
     331                 :            :                                 goto argerr;
     332                 :         12 :                         args++;
     333                 :         12 :                         secret_key = string_to_hex(*args, &ltmp);
     334         [ -  + ]:         12 :                         if (!secret_key)
     335                 :            :                                 {
     336                 :          0 :                                 BIO_printf(bio_err, "Invalid key %s\n", *args);
     337                 :          0 :                                 goto argerr;
     338                 :            :                                 }
     339                 :         12 :                         secret_keylen = (size_t)ltmp;
     340                 :            :                         }
     341         [ +  + ]:        397 :                 else if (!strcmp(*args,"-secretkeyid"))
     342                 :            :                         {
     343                 :            :                         long ltmp;
     344         [ +  - ]:          3 :                         if (!args[1])
     345                 :            :                                 goto argerr;
     346                 :          3 :                         args++;
     347                 :          3 :                         secret_keyid = string_to_hex(*args, &ltmp);
     348         [ -  + ]:          3 :                         if (!secret_keyid)
     349                 :            :                                 {
     350                 :          0 :                                 BIO_printf(bio_err, "Invalid id %s\n", *args);
     351                 :          0 :                                 goto argerr;
     352                 :            :                                 }
     353                 :          3 :                         secret_keyidlen = (size_t)ltmp;
     354                 :            :                         }
     355         [ -  + ]:        394 :                 else if (!strcmp(*args,"-pwri_password"))
     356                 :            :                         {
     357         [ #  # ]:          0 :                         if (!args[1])
     358                 :            :                                 goto argerr;
     359                 :          0 :                         args++;
     360                 :          0 :                         pwri_pass = (unsigned char *)*args;
     361                 :            :                         }
     362         [ -  + ]:        394 :                 else if (!strcmp(*args,"-econtent_type"))
     363                 :            :                         {
     364         [ #  # ]:          0 :                         if (!args[1])
     365                 :            :                                 goto argerr;
     366                 :          0 :                         args++;
     367                 :          0 :                         econtent_type = OBJ_txt2obj(*args, 0);
     368         [ #  # ]:          0 :                         if (!econtent_type)
     369                 :            :                                 {
     370                 :          0 :                                 BIO_printf(bio_err, "Invalid OID %s\n", *args);
     371                 :          0 :                                 goto argerr;
     372                 :            :                                 }
     373                 :            :                         }
     374         [ -  + ]:        394 :                 else if (!strcmp(*args,"-rand"))
     375                 :            :                         {
     376         [ #  # ]:          0 :                         if (!args[1])
     377                 :            :                                 goto argerr;
     378                 :          0 :                         args++;
     379                 :          0 :                         inrand = *args;
     380                 :          0 :                         need_rand = 1;
     381                 :            :                         }
     382                 :            : #ifndef OPENSSL_NO_ENGINE
     383         [ -  + ]:        394 :                 else if (!strcmp(*args,"-engine"))
     384                 :            :                         {
     385         [ #  # ]:          0 :                         if (!args[1])
     386                 :            :                                 goto argerr;
     387                 :          0 :                         engine = *++args;
     388                 :            :                         }
     389                 :            : #endif
     390         [ -  + ]:        394 :                 else if (!strcmp(*args,"-passin"))
     391                 :            :                         {
     392         [ #  # ]:          0 :                         if (!args[1])
     393                 :            :                                 goto argerr;
     394                 :          0 :                         passargin = *++args;
     395                 :            :                         }
     396         [ -  + ]:        394 :                 else if (!strcmp (*args, "-to"))
     397                 :            :                         {
     398         [ #  # ]:          0 :                         if (!args[1])
     399                 :            :                                 goto argerr;
     400                 :          0 :                         to = *++args;
     401                 :            :                         }
     402         [ -  + ]:        394 :                 else if (!strcmp (*args, "-from"))
     403                 :            :                         {
     404         [ #  # ]:          0 :                         if (!args[1])
     405                 :            :                                 goto argerr;
     406                 :          0 :                         from = *++args;
     407                 :            :                         }
     408         [ -  + ]:        394 :                 else if (!strcmp (*args, "-subject"))
     409                 :            :                         {
     410         [ #  # ]:          0 :                         if (!args[1])
     411                 :            :                                 goto argerr;
     412                 :          0 :                         subject = *++args;
     413                 :            :                         }
     414         [ +  + ]:        394 :                 else if (!strcmp (*args, "-signer"))
     415                 :            :                         {
     416         [ +  - ]:         59 :                         if (!args[1])
     417                 :            :                                 goto argerr;
     418                 :            :                         /* If previous -signer argument add signer to list */
     419                 :            : 
     420         [ +  + ]:         59 :                         if (signerfile)
     421                 :            :                                 {
     422         [ +  + ]:         30 :                                 if (!sksigners)
     423                 :         10 :                                         sksigners = sk_OPENSSL_STRING_new_null();
     424                 :         30 :                                 sk_OPENSSL_STRING_push(sksigners, signerfile);
     425         [ +  - ]:         30 :                                 if (!keyfile)
     426                 :         30 :                                         keyfile = signerfile;
     427         [ +  + ]:         30 :                                 if (!skkeys)
     428                 :         10 :                                         skkeys = sk_OPENSSL_STRING_new_null();
     429                 :         30 :                                 sk_OPENSSL_STRING_push(skkeys, keyfile);
     430                 :         30 :                                 keyfile = NULL;
     431                 :            :                                 }
     432                 :         59 :                         signerfile = *++args;
     433                 :            :                         }
     434         [ +  + ]:        335 :                 else if (!strcmp (*args, "-recip"))
     435                 :            :                         {
     436         [ +  - ]:         19 :                         if (!args[1])
     437                 :            :                                 goto argerr;
     438         [ +  + ]:         19 :                         if (operation == SMIME_ENCRYPT)
     439                 :            :                                 {
     440         [ +  - ]:          6 :                                 if (!encerts)
     441                 :          6 :                                         encerts = sk_X509_new_null();
     442                 :          6 :                                 cert = load_cert(bio_err,*++args,FORMAT_PEM,
     443                 :            :                                                 NULL, e,
     444                 :            :                                                 "recipient certificate file");
     445         [ +  - ]:          6 :                                 if (!cert)
     446                 :            :                                         goto end;
     447                 :          6 :                                 sk_X509_push(encerts, cert);
     448                 :          6 :                                 cert = NULL;
     449                 :            :                                 }
     450                 :            :                         else    
     451                 :         13 :                                 recipfile = *++args;
     452                 :            :                         }
     453         [ -  + ]:        316 :                 else if (!strcmp (*args, "-certsout"))
     454                 :            :                         {
     455         [ #  # ]:          0 :                         if (!args[1])
     456                 :            :                                 goto argerr;
     457                 :          0 :                         certsoutfile = *++args;
     458                 :            :                         }
     459         [ -  + ]:        316 :                 else if (!strcmp (*args, "-md"))
     460                 :            :                         {
     461         [ #  # ]:          0 :                         if (!args[1])
     462                 :            :                                 goto argerr;
     463                 :          0 :                         sign_md = EVP_get_digestbyname(*++args);
     464         [ #  # ]:          0 :                         if (sign_md == NULL)
     465                 :            :                                 {
     466                 :          0 :                                 BIO_printf(bio_err, "Unknown digest %s\n",
     467                 :            :                                                         *args);
     468                 :          0 :                                 goto argerr;
     469                 :            :                                 }
     470                 :            :                         }
     471         [ +  + ]:        316 :                 else if (!strcmp (*args, "-inkey"))
     472                 :            :                         {
     473         [ +  - ]:          2 :                         if (!args[1])   
     474                 :            :                                 goto argerr;
     475                 :            :                         /* If previous -inkey arument add signer to list */
     476         [ -  + ]:          2 :                         if (keyfile)
     477                 :            :                                 {
     478         [ #  # ]:          0 :                                 if (!signerfile)
     479                 :            :                                         {
     480                 :          0 :                                         BIO_puts(bio_err, "Illegal -inkey without -signer\n");
     481                 :          0 :                                         goto argerr;
     482                 :            :                                         }
     483         [ #  # ]:          0 :                                 if (!sksigners)
     484                 :          0 :                                         sksigners = sk_OPENSSL_STRING_new_null();
     485                 :          0 :                                 sk_OPENSSL_STRING_push(sksigners, signerfile);
     486                 :          0 :                                 signerfile = NULL;
     487         [ #  # ]:          0 :                                 if (!skkeys)
     488                 :          0 :                                         skkeys = sk_OPENSSL_STRING_new_null();
     489                 :          0 :                                 sk_OPENSSL_STRING_push(skkeys, keyfile);
     490                 :            :                                 }
     491                 :          2 :                         keyfile = *++args;
     492                 :            :                         }
     493         [ -  + ]:        314 :                 else if (!strcmp (*args, "-keyform"))
     494                 :            :                         {
     495         [ #  # ]:          0 :                         if (!args[1])
     496                 :            :                                 goto argerr;
     497                 :          0 :                         keyform = str2fmt(*++args);
     498                 :            :                         }
     499         [ +  + ]:        314 :                 else if (!strcmp (*args, "-keyopt"))
     500                 :            :                         {
     501                 :         10 :                         int keyidx = -1;
     502         [ +  - ]:         10 :                         if (!args[1])
     503                 :            :                                 goto argerr;
     504         [ +  + ]:         10 :                         if (operation == SMIME_ENCRYPT)
     505                 :            :                                 {
     506         [ +  - ]:          6 :                                 if (encerts)
     507                 :          6 :                                         keyidx += sk_X509_num(encerts);
     508                 :            :                                 }
     509                 :            :                         else
     510                 :            :                                 {
     511         [ +  - ]:          4 :                                 if (keyfile || signerfile)
     512                 :          4 :                                         keyidx++;
     513         [ -  + ]:          4 :                                 if (skkeys)
     514                 :          0 :                                         keyidx += sk_OPENSSL_STRING_num(skkeys);
     515                 :            :                                 }
     516         [ -  + ]:         10 :                         if (keyidx < 0)
     517                 :            :                                 {
     518                 :          0 :                                 BIO_printf(bio_err, "No key specified\n");
     519                 :          0 :                                 goto argerr;
     520                 :            :                                 }
     521 [ +  + ][ -  + ]:         10 :                         if (key_param == NULL || key_param->idx != keyidx)
     522                 :            :                                 {
     523                 :            :                                 cms_key_param *nparam;
     524                 :          7 :                                 nparam = OPENSSL_malloc(sizeof(cms_key_param));
     525                 :          7 :                                 nparam->idx = keyidx;
     526                 :          7 :                                 nparam->param = sk_OPENSSL_STRING_new_null();
     527                 :          7 :                                 nparam->next = NULL;
     528         [ -  + ]:          7 :                                 if (key_first == NULL)
     529                 :            :                                         key_first = nparam;
     530                 :            :                                 else
     531                 :          0 :                                         key_param->next = nparam;
     532                 :          7 :                                 key_param = nparam;
     533                 :            :                                 }
     534                 :         10 :                         sk_OPENSSL_STRING_push(key_param->param, *++args);
     535                 :            :                         }
     536         [ -  + ]:        304 :                 else if (!strcmp (*args, "-rctform"))
     537                 :            :                         {
     538         [ #  # ]:          0 :                         if (!args[1])
     539                 :            :                                 goto argerr;
     540                 :          0 :                         rctformat = str2fmt(*++args);
     541                 :            :                         }
     542         [ +  + ]:        304 :                 else if (!strcmp (*args, "-certfile"))
     543                 :            :                         {
     544         [ +  - ]:          2 :                         if (!args[1])
     545                 :            :                                 goto argerr;
     546                 :          2 :                         certfile = *++args;
     547                 :            :                         }
     548         [ +  + ]:        302 :                 else if (!strcmp (*args, "-CAfile"))
     549                 :            :                         {
     550         [ +  - ]:         29 :                         if (!args[1])
     551                 :            :                                 goto argerr;
     552                 :         29 :                         CAfile = *++args;
     553                 :            :                         }
     554         [ -  + ]:        273 :                 else if (!strcmp (*args, "-CApath"))
     555                 :            :                         {
     556         [ #  # ]:          0 :                         if (!args[1])
     557                 :            :                                 goto argerr;
     558                 :          0 :                         CApath = *++args;
     559                 :            :                         }
     560         [ +  + ]:        273 :                 else if (!strcmp (*args, "-in"))
     561                 :            :                         {
     562         [ +  - ]:        102 :                         if (!args[1])
     563                 :            :                                 goto argerr;
     564                 :        102 :                         infile = *++args;
     565                 :            :                         }
     566         [ +  + ]:        171 :                 else if (!strcmp (*args, "-inform"))
     567                 :            :                         {
     568         [ +  - ]:         32 :                         if (!args[1])
     569                 :            :                                 goto argerr;
     570                 :         32 :                         informat = str2fmt(*++args);
     571                 :            :                         }
     572         [ +  + ]:        139 :                 else if (!strcmp (*args, "-outform"))
     573                 :            :                         {
     574         [ +  - ]:         30 :                         if (!args[1])
     575                 :            :                                 goto argerr;
     576                 :         30 :                         outformat = str2fmt(*++args);
     577                 :            :                         }
     578         [ +  + ]:        109 :                 else if (!strcmp (*args, "-out"))
     579                 :            :                         {
     580         [ +  - ]:        101 :                         if (!args[1])
     581                 :            :                                 goto argerr;
     582                 :        101 :                         outfile = *++args;
     583                 :            :                         }
     584         [ +  + ]:          8 :                 else if (!strcmp (*args, "-content"))
     585                 :            :                         {
     586         [ +  - ]:          6 :                         if (!args[1])
     587                 :            :                                 goto argerr;
     588                 :          6 :                         contfile = *++args;
     589                 :            :                         }
     590         [ -  + ]:          2 :                 else if (args_verify(&args, NULL, &badarg, bio_err, &vpm))
     591                 :          0 :                         continue;
     592         [ -  + ]:          2 :                 else if ((cipher = EVP_get_cipherbyname(*args + 1)) == NULL)
     593                 :          0 :                         badarg = 1;
     594                 :        584 :                 args++;
     595                 :            :                 }
     596                 :            : 
     597 [ +  + ][ -  + ]:        102 :         if (((rr_allorfirst != -1) || rr_from) && !rr_to)
     598                 :            :                 {
     599                 :          0 :                 BIO_puts(bio_err, "No Signed Receipts Recipients\n");
     600                 :          0 :                 goto argerr;
     601                 :            :                 }
     602                 :            : 
     603 [ +  + ][ -  + ]:        102 :         if (!(operation & SMIME_SIGNERS)  && (rr_to || rr_from))
     604                 :            :                 {
     605                 :          0 :                 BIO_puts(bio_err, "Signed receipts only allowed with -sign\n");
     606                 :          0 :                 goto argerr;
     607                 :            :                 }
     608 [ +  + ][ -  + ]:        102 :         if (!(operation & SMIME_SIGNERS) && (skkeys || sksigners))
     609                 :            :                 {
     610                 :          0 :                 BIO_puts(bio_err, "Multiple signers or keys not allowed\n");
     611                 :          0 :                 goto argerr;
     612                 :            :                 }
     613                 :            : 
     614         [ +  + ]:        102 :         if (operation & SMIME_SIGNERS)
     615                 :            :                 {
     616         [ -  + ]:         28 :                 if (keyfile && !signerfile)
     617                 :            :                         {
     618                 :          0 :                         BIO_puts(bio_err, "Illegal -inkey without -signer\n");
     619                 :          0 :                         goto argerr;
     620                 :            :                         }
     621                 :            :                 /* Check to see if any final signer needs to be appended */
     622         [ +  - ]:         28 :                 if (signerfile)
     623                 :            :                         {
     624         [ +  + ]:         28 :                         if (!sksigners)
     625                 :         18 :                                 sksigners = sk_OPENSSL_STRING_new_null();
     626                 :         28 :                         sk_OPENSSL_STRING_push(sksigners, signerfile);
     627         [ +  + ]:         28 :                         if (!skkeys)
     628                 :         18 :                                 skkeys = sk_OPENSSL_STRING_new_null();
     629         [ +  - ]:         28 :                         if (!keyfile)
     630                 :         28 :                                 keyfile = signerfile;
     631                 :         28 :                         sk_OPENSSL_STRING_push(skkeys, keyfile);
     632                 :            :                         }
     633         [ -  + ]:         28 :                 if (!sksigners)
     634                 :            :                         {
     635                 :          0 :                         BIO_printf(bio_err, "No signer certificate specified\n");
     636                 :          0 :                         badarg = 1;
     637                 :            :                         }
     638                 :            :                 signerfile = NULL;
     639                 :            :                 keyfile = NULL;
     640                 :            :                 need_rand = 1;
     641                 :            :                 }
     642                 :            : 
     643         [ +  + ]:         74 :         else if (operation == SMIME_DECRYPT)
     644                 :            :                 {
     645 [ +  + ][ -  + ]:         17 :                 if (!recipfile && !keyfile && !secret_key && !pwri_pass)
     646                 :            :                         {
     647                 :          0 :                         BIO_printf(bio_err, "No recipient certificate or key specified\n");
     648                 :          0 :                         badarg = 1;
     649                 :            :                         }
     650                 :            :                 }
     651         [ +  + ]:         57 :         else if (operation == SMIME_ENCRYPT)
     652                 :            :                 {
     653 [ +  + ][ +  + ]:         17 :                 if (!*args && !secret_key && !pwri_pass && !encerts)
                 [ -  + ]
     654                 :            :                         {
     655                 :          0 :                         BIO_printf(bio_err, "No recipient(s) certificate(s) specified\n");
     656                 :          0 :                         badarg = 1;
     657                 :            :                         }
     658                 :            :                 need_rand = 1;
     659                 :            :                 }
     660         [ -  + ]:         40 :         else if (!operation)
     661                 :          0 :                 badarg = 1;
     662                 :            : 
     663         [ -  + ]:        102 :         if (badarg)
     664                 :            :                 {
     665                 :            :                 argerr:
     666                 :          0 :                 BIO_printf (bio_err, "Usage cms [options] cert.pem ...\n");
     667                 :          0 :                 BIO_printf (bio_err, "where options are\n");
     668                 :          0 :                 BIO_printf (bio_err, "-encrypt       encrypt message\n");
     669                 :          0 :                 BIO_printf (bio_err, "-decrypt       decrypt encrypted message\n");
     670                 :          0 :                 BIO_printf (bio_err, "-sign          sign message\n");
     671                 :          0 :                 BIO_printf (bio_err, "-verify        verify signed message\n");
     672                 :          0 :                 BIO_printf (bio_err, "-cmsout        output CMS structure\n");
     673                 :            : #ifndef OPENSSL_NO_DES
     674                 :          0 :                 BIO_printf (bio_err, "-des3          encrypt with triple DES\n");
     675                 :          0 :                 BIO_printf (bio_err, "-des           encrypt with DES\n");
     676                 :            : #endif
     677                 :            : #ifndef OPENSSL_NO_SEED
     678                 :          0 :                 BIO_printf (bio_err, "-seed          encrypt with SEED\n");
     679                 :            : #endif
     680                 :            : #ifndef OPENSSL_NO_RC2
     681                 :          0 :                 BIO_printf (bio_err, "-rc2-40        encrypt with RC2-40 (default)\n");
     682                 :          0 :                 BIO_printf (bio_err, "-rc2-64        encrypt with RC2-64\n");
     683                 :          0 :                 BIO_printf (bio_err, "-rc2-128       encrypt with RC2-128\n");
     684                 :            : #endif
     685                 :            : #ifndef OPENSSL_NO_AES
     686                 :          0 :                 BIO_printf (bio_err, "-aes128, -aes192, -aes256\n");
     687                 :          0 :                 BIO_printf (bio_err, "               encrypt PEM output with cbc aes\n");
     688                 :            : #endif
     689                 :            : #ifndef OPENSSL_NO_CAMELLIA
     690                 :          0 :                 BIO_printf (bio_err, "-camellia128, -camellia192, -camellia256\n");
     691                 :          0 :                 BIO_printf (bio_err, "               encrypt PEM output with cbc camellia\n");
     692                 :            : #endif
     693                 :          0 :                 BIO_printf (bio_err, "-nointern      don't search certificates in message for signer\n");
     694                 :          0 :                 BIO_printf (bio_err, "-nosigs        don't verify message signature\n");
     695                 :          0 :                 BIO_printf (bio_err, "-noverify      don't verify signers certificate\n");
     696                 :          0 :                 BIO_printf (bio_err, "-nocerts       don't include signers certificate when signing\n");
     697                 :          0 :                 BIO_printf (bio_err, "-nodetach      use opaque signing\n");
     698                 :          0 :                 BIO_printf (bio_err, "-noattr        don't include any signed attributes\n");
     699                 :          0 :                 BIO_printf (bio_err, "-binary        don't translate message to text\n");
     700                 :          0 :                 BIO_printf (bio_err, "-certfile file other certificates file\n");
     701                 :          0 :                 BIO_printf (bio_err, "-certsout file certificate output file\n");
     702                 :          0 :                 BIO_printf (bio_err, "-signer file   signer certificate file\n");
     703                 :          0 :                 BIO_printf (bio_err, "-recip  file   recipient certificate file for decryption\n");
     704                 :          0 :                 BIO_printf (bio_err, "-keyid         use subject key identifier\n");
     705                 :          0 :                 BIO_printf (bio_err, "-in file       input file\n");
     706                 :          0 :                 BIO_printf (bio_err, "-inform arg    input format SMIME (default), PEM or DER\n");
     707                 :          0 :                 BIO_printf (bio_err, "-inkey file    input private key (if not signer or recipient)\n");
     708                 :          0 :                 BIO_printf (bio_err, "-keyform arg   input private key format (PEM or ENGINE)\n");
     709                 :          0 :                 BIO_printf (bio_err, "-keyopt nm:v   set public key parameters\n");
     710                 :          0 :                 BIO_printf (bio_err, "-out file      output file\n");
     711                 :          0 :                 BIO_printf (bio_err, "-outform arg   output format SMIME (default), PEM or DER\n");
     712                 :          0 :                 BIO_printf (bio_err, "-content file  supply or override content for detached signature\n");
     713                 :          0 :                 BIO_printf (bio_err, "-to addr       to address\n");
     714                 :          0 :                 BIO_printf (bio_err, "-from ad       from address\n");
     715                 :          0 :                 BIO_printf (bio_err, "-subject s     subject\n");
     716                 :          0 :                 BIO_printf (bio_err, "-text          include or delete text MIME headers\n");
     717                 :          0 :                 BIO_printf (bio_err, "-CApath dir    trusted certificates directory\n");
     718                 :          0 :                 BIO_printf (bio_err, "-CAfile file   trusted certificates file\n");
     719                 :          0 :                 BIO_printf (bio_err, "-trusted_first use locally trusted certificates first when building trust chain\n");
     720                 :          0 :                 BIO_printf (bio_err, "-crl_check     check revocation status of signer's certificate using CRLs\n");
     721                 :          0 :                 BIO_printf (bio_err, "-crl_check_all check revocation status of signer's certificate chain using CRLs\n");
     722                 :            : #ifndef OPENSSL_NO_ENGINE
     723                 :          0 :                 BIO_printf (bio_err, "-engine e      use engine e, possibly a hardware device.\n");
     724                 :            : #endif
     725                 :          0 :                 BIO_printf (bio_err, "-passin arg    input file pass phrase source\n");
     726                 :          0 :                 BIO_printf(bio_err,  "-rand file%cfile%c...\n", LIST_SEPARATOR_CHAR, LIST_SEPARATOR_CHAR);
     727                 :          0 :                 BIO_printf(bio_err,  "               load the file (or the files in the directory) into\n");
     728                 :          0 :                 BIO_printf(bio_err,  "               the random number generator\n");
     729                 :          0 :                 BIO_printf (bio_err, "cert.pem       recipient certificate(s) for encryption\n");
     730                 :          0 :                 goto end;
     731                 :            :                 }
     732                 :            : 
     733                 :            : #ifndef OPENSSL_NO_ENGINE
     734                 :        102 :         e = setup_engine(bio_err, engine, 0);
     735                 :            : #endif
     736                 :            : 
     737         [ -  + ]:        102 :         if (!app_passwd(bio_err, passargin, NULL, &passin, NULL))
     738                 :            :                 {
     739                 :          0 :                 BIO_printf(bio_err, "Error getting password\n");
     740                 :          0 :                 goto end;
     741                 :            :                 }
     742                 :            : 
     743         [ +  + ]:        102 :         if (need_rand)
     744                 :            :                 {
     745                 :         45 :                 app_RAND_load_file(NULL, bio_err, (inrand != NULL));
     746         [ -  + ]:         45 :                 if (inrand != NULL)
     747                 :          0 :                         BIO_printf(bio_err,"%ld semi-random bytes loaded\n",
     748                 :            :                                 app_RAND_load_files(inrand));
     749                 :            :                 }
     750                 :            : 
     751                 :        102 :         ret = 2;
     752                 :            : 
     753         [ +  + ]:        102 :         if (!(operation & SMIME_SIGNERS))
     754                 :         74 :                 flags &= ~CMS_DETACHED;
     755                 :            : 
     756         [ +  + ]:        102 :         if (operation & SMIME_OP)
     757                 :            :                 {
     758         [ +  + ]:         52 :                 if (outformat == FORMAT_ASN1)
     759                 :         19 :                         outmode = "wb";
     760                 :            :                 }
     761                 :            :         else
     762                 :            :                 {
     763         [ -  + ]:         50 :                 if (flags & CMS_BINARY)
     764                 :          0 :                         outmode = "wb";
     765                 :            :                 }
     766                 :            : 
     767         [ +  + ]:        102 :         if (operation & SMIME_IP)
     768                 :            :                 {
     769         [ +  + ]:         54 :                 if (informat == FORMAT_ASN1)
     770                 :         21 :                         inmode = "rb";
     771                 :            :                 }
     772                 :            :         else
     773                 :            :                 {
     774         [ -  + ]:         48 :                 if (flags & CMS_BINARY)
     775                 :          0 :                         inmode = "rb";
     776                 :            :                 }
     777                 :            : 
     778         [ +  + ]:        102 :         if (operation == SMIME_ENCRYPT)
     779                 :            :                 {
     780         [ +  + ]:         17 :                 if (!cipher)
     781                 :            :                         {
     782                 :            : #ifndef OPENSSL_NO_DES                  
     783                 :         10 :                         cipher = EVP_des_ede3_cbc();
     784                 :            : #else
     785                 :            :                         BIO_printf(bio_err, "No cipher selected\n");
     786                 :            :                         goto end;
     787                 :            : #endif
     788                 :            :                         }
     789                 :            : 
     790         [ -  + ]:         17 :                 if (secret_key && !secret_keyid)
     791                 :            :                         {
     792                 :          0 :                         BIO_printf(bio_err, "No secret key id\n");
     793                 :          0 :                         goto end;
     794                 :            :                         }
     795                 :            : 
     796 [ +  + ][ +  - ]:         17 :                 if (*args && !encerts)
     797                 :         17 :                         encerts = sk_X509_new_null();
     798         [ +  + ]:         44 :                 while (*args)
     799                 :            :                         {
     800         [ +  - ]:         27 :                         if (!(cert = load_cert(bio_err,*args,FORMAT_PEM,
     801                 :            :                                 NULL, e, "recipient certificate file")))
     802                 :            :                                 goto end;
     803                 :         27 :                         sk_X509_push(encerts, cert);
     804                 :         27 :                         cert = NULL;
     805                 :         27 :                         args++;
     806                 :            :                         }
     807                 :            :                 }
     808                 :            : 
     809         [ +  + ]:        102 :         if (certfile)
     810                 :            :                 {
     811         [ -  + ]:          2 :                 if (!(other = load_certs(bio_err,certfile,FORMAT_PEM, NULL,
     812                 :            :                         e, "certificate file")))
     813                 :            :                         {
     814                 :          0 :                         ERR_print_errors(bio_err);
     815                 :          0 :                         goto end;
     816                 :            :                         }
     817                 :            :                 }
     818                 :            : 
     819         [ +  + ]:        102 :         if (recipfile && (operation == SMIME_DECRYPT))
     820                 :            :                 {
     821         [ -  + ]:         13 :                 if (!(recip = load_cert(bio_err,recipfile,FORMAT_PEM,NULL,
     822                 :            :                         e, "recipient certificate file")))
     823                 :            :                         {
     824                 :          0 :                         ERR_print_errors(bio_err);
     825                 :          0 :                         goto end;
     826                 :            :                         }
     827                 :            :                 }
     828                 :            : 
     829         [ +  + ]:        102 :         if (operation == SMIME_SIGN_RECEIPT)
     830                 :            :                 {
     831         [ -  + ]:          1 :                 if (!(signer = load_cert(bio_err,signerfile,FORMAT_PEM,NULL,
     832                 :            :                         e, "receipt signer certificate file")))
     833                 :            :                         {
     834                 :          0 :                         ERR_print_errors(bio_err);
     835                 :          0 :                         goto end;
     836                 :            :                         }
     837                 :            :                 }
     838                 :            : 
     839         [ +  + ]:        102 :         if (operation == SMIME_DECRYPT)
     840                 :            :                 {
     841         [ +  + ]:         17 :                 if (!keyfile)
     842                 :         15 :                         keyfile = recipfile;
     843                 :            :                 }
     844         [ +  + ]:         85 :         else if ((operation == SMIME_SIGN) || (operation == SMIME_SIGN_RECEIPT))
     845                 :            :                 {
     846         [ +  - ]:         27 :                 if (!keyfile)
     847                 :         27 :                         keyfile = signerfile;
     848                 :            :                 }
     849                 :            :         else keyfile = NULL;
     850                 :            : 
     851         [ +  + ]:        102 :         if (keyfile)
     852                 :            :                 {
     853                 :         16 :                 key = load_key(bio_err, keyfile, keyform, 0, passin, e,
     854                 :            :                                "signing key file");
     855         [ +  - ]:         16 :                 if (!key)
     856                 :            :                         goto end;
     857                 :            :                 }
     858                 :            : 
     859         [ +  - ]:        102 :         if (infile)
     860                 :            :                 {
     861         [ -  + ]:        102 :                 if (!(in = BIO_new_file(infile, inmode)))
     862                 :            :                         {
     863                 :          0 :                         BIO_printf (bio_err,
     864                 :            :                                  "Can't open input file %s\n", infile);
     865                 :          0 :                         goto end;
     866                 :            :                         }
     867                 :            :                 }
     868                 :            :         else
     869                 :          0 :                 in = BIO_new_fp(stdin, BIO_NOCLOSE);
     870                 :            : 
     871         [ +  + ]:        102 :         if (operation & SMIME_IP)
     872                 :            :                 {
     873         [ +  + ]:         54 :                 if (informat == FORMAT_SMIME) 
     874                 :         22 :                         cms = SMIME_read_CMS(in, &indata);
     875         [ +  + ]:         32 :                 else if (informat == FORMAT_PEM) 
     876                 :         11 :                         cms = PEM_read_bio_CMS(in, NULL, NULL, NULL);
     877         [ +  - ]:         21 :                 else if (informat == FORMAT_ASN1) 
     878                 :         21 :                         cms = d2i_CMS_bio(in, NULL);
     879                 :            :                 else
     880                 :            :                         {
     881                 :          0 :                         BIO_printf(bio_err, "Bad input format for CMS file\n");
     882                 :          0 :                         goto end;
     883                 :            :                         }
     884                 :            : 
     885         [ -  + ]:         54 :                 if (!cms)
     886                 :            :                         {
     887                 :          0 :                         BIO_printf(bio_err, "Error reading S/MIME message\n");
     888                 :          0 :                         goto end;
     889                 :            :                         }
     890         [ +  + ]:         54 :                 if (contfile)
     891                 :            :                         {
     892                 :          6 :                         BIO_free(indata);
     893         [ -  + ]:          6 :                         if (!(indata = BIO_new_file(contfile, "rb")))
     894                 :            :                                 {
     895                 :          0 :                                 BIO_printf(bio_err, "Can't read content file %s\n", contfile);
     896                 :          0 :                                 goto end;
     897                 :            :                                 }
     898                 :            :                         }
     899         [ -  + ]:         54 :                 if (certsoutfile)
     900                 :            :                         {
     901                 :            :                         STACK_OF(X509) *allcerts;
     902                 :          0 :                         allcerts = CMS_get1_certs(cms);
     903         [ #  # ]:          0 :                         if (!save_certs(certsoutfile, allcerts))
     904                 :            :                                 {
     905                 :          0 :                                 BIO_printf(bio_err,
     906                 :            :                                                 "Error writing certs to %s\n",
     907                 :            :                                                                 certsoutfile);
     908                 :          0 :                                 ret = 5;
     909                 :          0 :                                 goto end;
     910                 :            :                                 }
     911                 :          0 :                         sk_X509_pop_free(allcerts, X509_free);
     912                 :            :                         }
     913                 :            :                 }
     914                 :            : 
     915         [ +  + ]:        102 :         if (rctfile)
     916                 :            :                 {
     917         [ +  - ]:          1 :                 char *rctmode = (rctformat == FORMAT_ASN1) ? "rb" : "r";
     918         [ -  + ]:          1 :                 if (!(rctin = BIO_new_file(rctfile, rctmode)))
     919                 :            :                         {
     920                 :          0 :                         BIO_printf (bio_err,
     921                 :            :                                  "Can't open receipt file %s\n", rctfile);
     922                 :          0 :                         goto end;
     923                 :            :                         }
     924                 :            :                 
     925         [ +  - ]:          1 :                 if (rctformat == FORMAT_SMIME) 
     926                 :          1 :                         rcms = SMIME_read_CMS(rctin, NULL);
     927         [ #  # ]:          0 :                 else if (rctformat == FORMAT_PEM) 
     928                 :          0 :                         rcms = PEM_read_bio_CMS(rctin, NULL, NULL, NULL);
     929         [ #  # ]:          0 :                 else if (rctformat == FORMAT_ASN1) 
     930                 :          0 :                         rcms = d2i_CMS_bio(rctin, NULL);
     931                 :            :                 else
     932                 :            :                         {
     933                 :          0 :                         BIO_printf(bio_err, "Bad input format for receipt\n");
     934                 :          0 :                         goto end;
     935                 :            :                         }
     936                 :            : 
     937         [ -  + ]:          1 :                 if (!rcms)
     938                 :            :                         {
     939                 :          0 :                         BIO_printf(bio_err, "Error reading receipt\n");
     940                 :          0 :                         goto end;
     941                 :            :                         }
     942                 :            :                 }
     943                 :            : 
     944         [ +  + ]:        102 :         if (outfile)
     945                 :            :                 {
     946         [ -  + ]:        101 :                 if (!(out = BIO_new_file(outfile, outmode)))
     947                 :            :                         {
     948                 :          0 :                         BIO_printf (bio_err,
     949                 :            :                                  "Can't open output file %s\n", outfile);
     950                 :          0 :                         goto end;
     951                 :            :                         }
     952                 :            :                 }
     953                 :            :         else
     954                 :            :                 {
     955                 :          1 :                 out = BIO_new_fp(stdout, BIO_NOCLOSE);
     956                 :            : #ifdef OPENSSL_SYS_VMS
     957                 :            :                 {
     958                 :            :                     BIO *tmpbio = BIO_new(BIO_f_linebuffer());
     959                 :            :                     out = BIO_push(tmpbio, out);
     960                 :            :                 }
     961                 :            : #endif
     962                 :            :                 }
     963                 :            : 
     964         [ +  + ]:        102 :         if ((operation == SMIME_VERIFY) || (operation == SMIME_VERIFY_RECEIPT))
     965                 :            :                 {
     966         [ +  - ]:         29 :                 if (!(store = setup_verify(bio_err, CAfile, CApath)))
     967                 :            :                         goto end;
     968                 :         29 :                 X509_STORE_set_verify_cb(store, cms_cb);
     969         [ -  + ]:         29 :                 if (vpm)
     970                 :          0 :                         X509_STORE_set1_param(store, vpm);
     971                 :            :                 }
     972                 :            : 
     973                 :            : 
     974                 :        102 :         ret = 3;
     975                 :            : 
     976         [ +  + ]:        102 :         if (operation == SMIME_DATA_CREATE)
     977                 :            :                 {
     978                 :          1 :                 cms = CMS_data_create(in, flags);
     979                 :            :                 }
     980         [ -  + ]:        101 :         else if (operation == SMIME_DIGEST_CREATE)
     981                 :            :                 {
     982                 :          0 :                 cms = CMS_digest_create(in, sign_md, flags);
     983                 :            :                 }
     984         [ -  + ]:        101 :         else if (operation == SMIME_COMPRESS)
     985                 :            :                 {
     986                 :          0 :                 cms = CMS_compress(in, -1, flags);
     987                 :            :                 }
     988         [ +  + ]:        101 :         else if (operation == SMIME_ENCRYPT)
     989                 :            :                 {
     990                 :            :                 int i;
     991                 :         17 :                 flags |= CMS_PARTIAL;
     992                 :         17 :                 cms = CMS_encrypt(NULL, in, cipher, flags);
     993         [ +  - ]:         17 :                 if (!cms)
     994                 :            :                         goto end;
     995         [ +  + ]:         50 :                 for (i = 0; i < sk_X509_num(encerts); i++)
     996                 :            :                         {
     997                 :            :                         CMS_RecipientInfo *ri;
     998                 :            :                         cms_key_param *kparam;
     999                 :         33 :                         int tflags = flags;
    1000                 :         33 :                         X509 *x = sk_X509_value(encerts, i);
    1001         [ +  + ]:         33 :                         for(kparam = key_first; kparam; kparam = kparam->next)
    1002                 :            :                                 {
    1003         [ +  - ]:          4 :                                 if(kparam->idx == i)
    1004                 :            :                                         {
    1005                 :          4 :                                         tflags |= CMS_KEY_PARAM;
    1006                 :          4 :                                         break;
    1007                 :            :                                         }
    1008                 :            :                                 }
    1009                 :         33 :                         ri = CMS_add1_recipient_cert(cms, x, tflags);
    1010         [ +  - ]:         33 :                         if (!ri)
    1011                 :            :                                 goto end;
    1012         [ +  + ]:         33 :                         if (kparam)
    1013                 :            :                                 {
    1014                 :            :                                 EVP_PKEY_CTX *pctx;
    1015                 :          4 :                                 pctx = CMS_RecipientInfo_get0_pkey_ctx(ri);
    1016         [ +  - ]:          4 :                                 if (!cms_set_pkey_param(pctx, kparam->param))
    1017                 :            :                                         goto end;
    1018                 :            :                                 }
    1019         [ +  + ]:         33 :                         if (CMS_RecipientInfo_type(ri) == CMS_RECIPINFO_AGREE
    1020         [ -  + ]:          4 :                                 && wrap_cipher)
    1021                 :            :                                 {
    1022                 :            :                                 EVP_CIPHER_CTX *wctx;
    1023                 :          0 :                                 wctx = CMS_RecipientInfo_kari_get0_ctx(ri);
    1024                 :          0 :                                 EVP_EncryptInit_ex(wctx, wrap_cipher,
    1025                 :            :                                                         NULL, NULL, NULL);
    1026                 :            :                                 }
    1027                 :            :                         }
    1028                 :            : 
    1029         [ +  + ]:         17 :                 if (secret_key)
    1030                 :            :                         {
    1031         [ +  - ]:          2 :                         if (!CMS_add0_recipient_key(cms, NID_undef, 
    1032                 :            :                                                 secret_key, secret_keylen,
    1033                 :            :                                                 secret_keyid, secret_keyidlen,
    1034                 :            :                                                 NULL, NULL, NULL))
    1035                 :            :                                 goto end;
    1036                 :            :                         /* NULL these because call absorbs them */
    1037                 :            :                         secret_key = NULL;
    1038                 :            :                         secret_keyid = NULL;
    1039                 :            :                         }
    1040         [ -  + ]:         17 :                 if (pwri_pass)
    1041                 :            :                         {
    1042                 :          0 :                         pwri_tmp = (unsigned char *)BUF_strdup((char *)pwri_pass);
    1043         [ #  # ]:          0 :                         if (!pwri_tmp)
    1044                 :            :                                 goto end;
    1045         [ #  # ]:          0 :                         if (!CMS_add0_recipient_password(cms,
    1046                 :            :                                                 -1, NID_undef, NID_undef,
    1047                 :            :                                                  pwri_tmp, -1, NULL))
    1048                 :            :                                 goto end;
    1049                 :            :                         pwri_tmp = NULL;
    1050                 :            :                         }
    1051         [ -  + ]:         17 :                 if (!(flags & CMS_STREAM))
    1052                 :            :                         {
    1053         [ #  # ]:          0 :                         if (!CMS_final(cms, in, NULL, flags))
    1054                 :            :                                 goto end;
    1055                 :            :                         }
    1056                 :            :                 }
    1057         [ +  + ]:         84 :         else if (operation == SMIME_ENCRYPTED_ENCRYPT)
    1058                 :            :                 {
    1059                 :          4 :                 cms = CMS_EncryptedData_encrypt(in, cipher,
    1060                 :            :                                                 secret_key, secret_keylen,
    1061                 :            :                                                 flags);
    1062                 :            : 
    1063                 :            :                 }
    1064         [ +  + ]:         80 :         else if (operation == SMIME_SIGN_RECEIPT)
    1065                 :            :                 {
    1066                 :          1 :                 CMS_ContentInfo *srcms = NULL;
    1067                 :            :                 STACK_OF(CMS_SignerInfo) *sis;
    1068                 :            :                 CMS_SignerInfo *si;
    1069                 :          1 :                 sis = CMS_get0_SignerInfos(cms);
    1070         [ +  - ]:          1 :                 if (!sis)
    1071                 :            :                         goto end;
    1072                 :          1 :                 si = sk_CMS_SignerInfo_value(sis, 0);
    1073                 :          1 :                 srcms = CMS_sign_receipt(si, signer, key, other, flags);
    1074         [ +  - ]:          1 :                 if (!srcms)
    1075                 :            :                         goto end;
    1076                 :          1 :                 CMS_ContentInfo_free(cms);
    1077                 :          1 :                 cms = srcms;
    1078                 :            :                 }
    1079         [ +  + ]:         79 :         else if (operation & SMIME_SIGNERS)
    1080                 :            :                 {
    1081                 :            :                 int i;
    1082                 :            :                 /* If detached data content we enable streaming if
    1083                 :            :                  * S/MIME output format.
    1084                 :            :                  */
    1085         [ +  + ]:         28 :                 if (operation == SMIME_SIGN)
    1086                 :            :                         {
    1087                 :            :                                 
    1088         [ +  + ]:         26 :                         if (flags & CMS_DETACHED)
    1089                 :            :                                 {
    1090         [ +  + ]:          6 :                                 if (outformat == FORMAT_SMIME)
    1091                 :          2 :                                         flags |= CMS_STREAM;
    1092                 :            :                                 }
    1093                 :         26 :                         flags |= CMS_PARTIAL;
    1094                 :         26 :                         cms = CMS_sign(NULL, NULL, other, in, flags);
    1095         [ +  - ]:         26 :                         if (!cms)
    1096                 :            :                                 goto end;
    1097         [ -  + ]:         26 :                         if (econtent_type)
    1098                 :          0 :                                 CMS_set1_eContentType(cms, econtent_type);
    1099                 :            : 
    1100         [ +  + ]:         26 :                         if (rr_to)
    1101                 :            :                                 {
    1102                 :          1 :                                 rr = make_receipt_request(rr_to, rr_allorfirst,
    1103                 :            :                                                                 rr_from);
    1104         [ -  + ]:          1 :                                 if (!rr)
    1105                 :            :                                         {
    1106                 :          0 :                                         BIO_puts(bio_err,
    1107                 :            :                                 "Signed Receipt Request Creation Error\n");
    1108                 :          0 :                                         goto end;
    1109                 :            :                                         }
    1110                 :            :                                 }
    1111                 :            :                         }
    1112                 :            :                 else
    1113                 :          2 :                         flags |= CMS_REUSE_DIGEST;
    1114         [ +  + ]:         86 :                 for (i = 0; i < sk_OPENSSL_STRING_num(sksigners); i++)
    1115                 :            :                         {
    1116                 :            :                         CMS_SignerInfo *si;
    1117                 :            :                         cms_key_param *kparam;
    1118                 :         58 :                         int tflags = flags;
    1119                 :         58 :                         signerfile = sk_OPENSSL_STRING_value(sksigners, i);
    1120                 :         58 :                         keyfile = sk_OPENSSL_STRING_value(skkeys, i);
    1121                 :            : 
    1122                 :         58 :                         signer = load_cert(bio_err, signerfile,FORMAT_PEM, NULL,
    1123                 :            :                                         e, "signer certificate");
    1124         [ +  - ]:         58 :                         if (!signer)
    1125                 :            :                                 goto end;
    1126                 :         58 :                         key = load_key(bio_err, keyfile, keyform, 0, passin, e,
    1127                 :            :                                "signing key file");
    1128         [ +  - ]:         58 :                         if (!key)
    1129                 :            :                                 goto end;
    1130         [ +  + ]:         58 :                         for(kparam = key_first; kparam; kparam = kparam->next)
    1131                 :            :                                 {
    1132         [ +  - ]:          3 :                                 if(kparam->idx == i)
    1133                 :            :                                         {
    1134                 :          3 :                                         tflags |= CMS_KEY_PARAM;
    1135                 :          3 :                                         break;
    1136                 :            :                                         }
    1137                 :            :                                 }
    1138                 :         58 :                         si = CMS_add1_signer(cms, signer, key, sign_md, tflags);
    1139         [ +  - ]:         58 :                         if (!si)
    1140                 :            :                                 goto end;
    1141         [ +  + ]:         58 :                         if (kparam)
    1142                 :            :                                 {
    1143                 :            :                                 EVP_PKEY_CTX *pctx;
    1144                 :          3 :                                 pctx = CMS_SignerInfo_get0_pkey_ctx(si);
    1145         [ +  - ]:          3 :                                 if (!cms_set_pkey_param(pctx, kparam->param))
    1146                 :            :                                         goto end;
    1147                 :            :                                 }
    1148 [ +  + ][ +  - ]:         58 :                         if (rr && !CMS_add1_ReceiptRequest(si, rr))
    1149                 :            :                                 goto end;
    1150                 :         58 :                         X509_free(signer);
    1151                 :         58 :                         signer = NULL;
    1152                 :         58 :                         EVP_PKEY_free(key);
    1153                 :         58 :                         key = NULL;
    1154                 :            :                         }
    1155                 :            :                 /* If not streaming or resigning finalize structure */
    1156 [ +  + ][ +  + ]:         28 :                 if ((operation == SMIME_SIGN) && !(flags & CMS_STREAM))
    1157                 :            :                         {
    1158         [ +  - ]:         12 :                         if (!CMS_final(cms, in, NULL, flags))
    1159                 :            :                                 goto end;
    1160                 :            :                         }
    1161                 :            :                 }
    1162                 :            : 
    1163         [ -  + ]:        102 :         if (!cms)
    1164                 :            :                 {
    1165                 :          0 :                 BIO_printf(bio_err, "Error creating CMS structure\n");
    1166                 :          0 :                 goto end;
    1167                 :            :                 }
    1168                 :            : 
    1169                 :        102 :         ret = 4;
    1170         [ +  + ]:        102 :         if (operation == SMIME_DECRYPT)
    1171                 :            :                 {
    1172         [ -  + ]:         17 :                 if (flags & CMS_DEBUG_DECRYPT)
    1173                 :          0 :                         CMS_decrypt(cms, NULL, NULL, NULL, NULL, flags);
    1174                 :            : 
    1175         [ +  + ]:         17 :                 if (secret_key)
    1176                 :            :                         {
    1177         [ -  + ]:          2 :                         if (!CMS_decrypt_set1_key(cms,
    1178                 :            :                                                 secret_key, secret_keylen,
    1179                 :            :                                                 secret_keyid, secret_keyidlen))
    1180                 :            :                                 {
    1181                 :          0 :                                 BIO_puts(bio_err,
    1182                 :            :                                         "Error decrypting CMS using secret key\n");
    1183                 :          0 :                                 goto end;
    1184                 :            :                                 }
    1185                 :            :                         }
    1186                 :            : 
    1187         [ +  + ]:         17 :                 if (key)
    1188                 :            :                         {
    1189         [ -  + ]:         15 :                         if (!CMS_decrypt_set1_pkey(cms, key, recip))
    1190                 :            :                                 {
    1191                 :          0 :                                 BIO_puts(bio_err,
    1192                 :            :                                         "Error decrypting CMS using private key\n");
    1193                 :          0 :                                 goto end;
    1194                 :            :                                 }
    1195                 :            :                         }
    1196                 :            : 
    1197         [ -  + ]:         17 :                 if (pwri_pass)
    1198                 :            :                         {
    1199         [ #  # ]:          0 :                         if (!CMS_decrypt_set1_password(cms, pwri_pass, -1))
    1200                 :            :                                 {
    1201                 :          0 :                                 BIO_puts(bio_err,
    1202                 :            :                                         "Error decrypting CMS using password\n");
    1203                 :          0 :                                 goto end;
    1204                 :            :                                 }
    1205                 :            :                         }
    1206                 :            : 
    1207         [ -  + ]:         17 :                 if (!CMS_decrypt(cms, NULL, NULL, indata, out, flags))
    1208                 :            :                         {
    1209                 :          0 :                         BIO_printf(bio_err, "Error decrypting CMS structure\n");
    1210                 :          0 :                         goto end;
    1211                 :            :                         }
    1212                 :            :                 }
    1213         [ +  + ]:         85 :         else if (operation == SMIME_DATAOUT)
    1214                 :            :                 {
    1215         [ +  - ]:          1 :                 if (!CMS_data(cms, out, flags))
    1216                 :            :                         goto end;
    1217                 :            :                 }
    1218         [ -  + ]:         84 :         else if (operation == SMIME_UNCOMPRESS)
    1219                 :            :                 {
    1220         [ #  # ]:          0 :                 if (!CMS_uncompress(cms, indata, out, flags))
    1221                 :            :                         goto end;
    1222                 :            :                 }
    1223         [ -  + ]:         84 :         else if (operation == SMIME_DIGEST_VERIFY)
    1224                 :            :                 {
    1225         [ #  # ]:          0 :                 if (CMS_digest_verify(cms, indata, out, flags) > 0)
    1226                 :          0 :                         BIO_printf(bio_err, "Verification successful\n");
    1227                 :            :                 else
    1228                 :            :                         {
    1229                 :          0 :                         BIO_printf(bio_err, "Verification failure\n");
    1230                 :          0 :                         goto end;
    1231                 :            :                         }
    1232                 :            :                 }
    1233         [ +  + ]:         84 :         else if (operation == SMIME_ENCRYPTED_DECRYPT)
    1234                 :            :                 {
    1235         [ +  - ]:          4 :                 if (!CMS_EncryptedData_decrypt(cms, secret_key, secret_keylen,
    1236                 :            :                                                 indata, out, flags))
    1237                 :            :                         goto end;
    1238                 :            :                 }
    1239         [ +  + ]:         80 :         else if (operation == SMIME_VERIFY)
    1240                 :            :                 {
    1241         [ +  - ]:         28 :                 if (CMS_verify(cms, other, store, indata, out, flags) > 0)
    1242                 :         28 :                         BIO_printf(bio_err, "Verification successful\n");
    1243                 :            :                 else
    1244                 :            :                         {
    1245                 :          0 :                         BIO_printf(bio_err, "Verification failure\n");
    1246         [ #  # ]:          0 :                         if (verify_retcode)
    1247                 :          0 :                                 ret = verify_err + 32;
    1248                 :            :                         goto end;
    1249                 :            :                         }
    1250         [ -  + ]:         28 :                 if (signerfile)
    1251                 :            :                         {
    1252                 :            :                         STACK_OF(X509) *signers;
    1253                 :          0 :                         signers = CMS_get0_signers(cms);
    1254         [ #  # ]:          0 :                         if (!save_certs(signerfile, signers))
    1255                 :            :                                 {
    1256                 :          0 :                                 BIO_printf(bio_err,
    1257                 :            :                                                 "Error writing signers to %s\n",
    1258                 :            :                                                                 signerfile);
    1259                 :          0 :                                 ret = 5;
    1260                 :          0 :                                 goto end;
    1261                 :            :                                 }
    1262                 :          0 :                         sk_X509_free(signers);
    1263                 :            :                         }
    1264         [ -  + ]:         28 :                 if (rr_print)
    1265                 :          0 :                         receipt_request_print(bio_err, cms);
    1266                 :            :                                         
    1267                 :            :                 }
    1268         [ +  + ]:         52 :         else if (operation == SMIME_VERIFY_RECEIPT)
    1269                 :            :                 {
    1270         [ +  - ]:          1 :                 if (CMS_verify_receipt(rcms, cms, other, store, flags) > 0)
    1271                 :          1 :                         BIO_printf(bio_err, "Verification successful\n");
    1272                 :            :                 else
    1273                 :            :                         {
    1274                 :          0 :                         BIO_printf(bio_err, "Verification failure\n");
    1275                 :          0 :                         goto end;
    1276                 :            :                         }
    1277                 :            :                 }
    1278                 :            :         else
    1279                 :            :                 {
    1280         [ -  + ]:         51 :                 if (noout)
    1281                 :            :                         {
    1282         [ #  # ]:          0 :                         if (print)
    1283                 :          0 :                                 CMS_ContentInfo_print_ctx(out, cms, 0, NULL);
    1284                 :            :                         }
    1285         [ +  + ]:         51 :                 else if (outformat == FORMAT_SMIME)
    1286                 :            :                         {
    1287         [ -  + ]:         21 :                         if (to)
    1288                 :          0 :                                 BIO_printf(out, "To: %s\n", to);
    1289         [ -  + ]:         21 :                         if (from)
    1290                 :          0 :                                 BIO_printf(out, "From: %s\n", from);
    1291         [ -  + ]:         21 :                         if (subject)
    1292                 :          0 :                                 BIO_printf(out, "Subject: %s\n", subject);
    1293         [ -  + ]:         21 :                         if (operation == SMIME_RESIGN)
    1294                 :          0 :                                 ret = SMIME_write_CMS(out, cms, indata, flags);
    1295                 :            :                         else
    1296                 :         21 :                                 ret = SMIME_write_CMS(out, cms, in, flags);
    1297                 :            :                         }
    1298         [ +  + ]:         30 :                 else if (outformat == FORMAT_PEM) 
    1299                 :         11 :                         ret = PEM_write_bio_CMS_stream(out, cms, in, flags);
    1300         [ +  - ]:         19 :                 else if (outformat == FORMAT_ASN1) 
    1301                 :         19 :                         ret = i2d_CMS_bio_stream(out,cms, in, flags);
    1302                 :            :                 else
    1303                 :            :                         {
    1304                 :          0 :                         BIO_printf(bio_err, "Bad output format for CMS file\n");
    1305                 :          0 :                         goto end;
    1306                 :            :                         }
    1307         [ +  - ]:         56 :                 if (ret <= 0)
    1308                 :            :                         {
    1309                 :            :                         ret = 6;
    1310                 :            :                         goto end;
    1311                 :            :                         }
    1312                 :            :                 }
    1313                 :            :         ret = 0;
    1314                 :            : end:
    1315         [ -  + ]:        102 :         if (ret)
    1316                 :          0 :                 ERR_print_errors(bio_err);
    1317         [ +  + ]:        102 :         if (need_rand)
    1318                 :         45 :                 app_RAND_write_file(NULL, bio_err);
    1319                 :        102 :         sk_X509_pop_free(encerts, X509_free);
    1320                 :        102 :         sk_X509_pop_free(other, X509_free);
    1321         [ -  + ]:        102 :         if (vpm)
    1322                 :          0 :                 X509_VERIFY_PARAM_free(vpm);
    1323         [ +  + ]:        102 :         if (sksigners)
    1324                 :         28 :                 sk_OPENSSL_STRING_free(sksigners);
    1325         [ +  + ]:        102 :         if (skkeys)
    1326                 :         28 :                 sk_OPENSSL_STRING_free(skkeys);
    1327         [ +  + ]:        102 :         if (secret_key)
    1328                 :         10 :                 OPENSSL_free(secret_key);
    1329         [ +  + ]:        102 :         if (secret_keyid)
    1330                 :          1 :                 OPENSSL_free(secret_keyid);
    1331         [ -  + ]:        102 :         if (pwri_tmp)
    1332                 :          0 :                 OPENSSL_free(pwri_tmp);
    1333         [ -  + ]:        102 :         if (econtent_type)
    1334                 :          0 :                 ASN1_OBJECT_free(econtent_type);
    1335         [ +  + ]:        102 :         if (rr)
    1336                 :          1 :                 CMS_ReceiptRequest_free(rr);
    1337         [ +  + ]:        102 :         if (rr_to)
    1338                 :          1 :                 sk_OPENSSL_STRING_free(rr_to);
    1339         [ -  + ]:        102 :         if (rr_from)
    1340                 :          0 :                 sk_OPENSSL_STRING_free(rr_from);
    1341         [ +  + ]:        109 :         for(key_param = key_first; key_param;)
    1342                 :            :                 {
    1343                 :            :                 cms_key_param *tparam;
    1344                 :          7 :                 sk_OPENSSL_STRING_free(key_param->param);
    1345                 :          7 :                 tparam = key_param->next;
    1346                 :          7 :                 OPENSSL_free(key_param);
    1347                 :          7 :                 key_param = tparam;
    1348                 :            :                 }
    1349                 :        102 :         X509_STORE_free(store);
    1350                 :        102 :         X509_free(cert);
    1351                 :        102 :         X509_free(recip);
    1352                 :        102 :         X509_free(signer);
    1353                 :        102 :         EVP_PKEY_free(key);
    1354                 :        102 :         CMS_ContentInfo_free(cms);
    1355                 :        102 :         CMS_ContentInfo_free(rcms);
    1356                 :        102 :         BIO_free(rctin);
    1357                 :        102 :         BIO_free(in);
    1358                 :        102 :         BIO_free(indata);
    1359                 :        102 :         BIO_free_all(out);
    1360         [ -  + ]:        102 :         if (passin) OPENSSL_free(passin);
    1361                 :        102 :         return (ret);
    1362                 :            : }
    1363                 :            : 
    1364                 :          0 : static int save_certs(char *signerfile, STACK_OF(X509) *signers)
    1365                 :            :         {
    1366                 :            :         int i;
    1367                 :            :         BIO *tmp;
    1368         [ #  # ]:          0 :         if (!signerfile)
    1369                 :            :                 return 1;
    1370                 :          0 :         tmp = BIO_new_file(signerfile, "w");
    1371         [ #  # ]:          0 :         if (!tmp) return 0;
    1372         [ #  # ]:          0 :         for(i = 0; i < sk_X509_num(signers); i++)
    1373                 :          0 :                 PEM_write_bio_X509(tmp, sk_X509_value(signers, i));
    1374                 :          0 :         BIO_free(tmp);
    1375                 :          0 :         return 1;
    1376                 :            :         }
    1377                 :            :         
    1378                 :            : 
    1379                 :            : /* Minimal callback just to output policy info (if any) */
    1380                 :            : 
    1381                 :        122 : static int cms_cb(int ok, X509_STORE_CTX *ctx)
    1382                 :            :         {
    1383                 :            :         int error;
    1384                 :            : 
    1385                 :        122 :         error = X509_STORE_CTX_get_error(ctx);
    1386                 :            : 
    1387                 :        122 :         verify_err = error;
    1388                 :            : 
    1389         [ +  - ]:        122 :         if ((error != X509_V_ERR_NO_EXPLICIT_POLICY)
    1390         [ -  + ]:        122 :                 && ((error != X509_V_OK) || (ok != 2)))
    1391                 :            :                 return ok;
    1392                 :            : 
    1393                 :          0 :         policies_print(NULL, ctx);
    1394                 :            : 
    1395                 :          0 :         return ok;
    1396                 :            : 
    1397                 :            :         }
    1398                 :            : 
    1399                 :          0 : static void gnames_stack_print(BIO *out, STACK_OF(GENERAL_NAMES) *gns)
    1400                 :            :         {
    1401                 :            :         STACK_OF(GENERAL_NAME) *gens;
    1402                 :            :         GENERAL_NAME *gen;
    1403                 :            :         int i, j;
    1404         [ #  # ]:          0 :         for (i = 0; i < sk_GENERAL_NAMES_num(gns); i++)
    1405                 :            :                 {
    1406                 :          0 :                 gens = sk_GENERAL_NAMES_value(gns, i);
    1407         [ #  # ]:          0 :                 for (j = 0; j < sk_GENERAL_NAME_num(gens); j++)
    1408                 :            :                         {
    1409                 :          0 :                         gen = sk_GENERAL_NAME_value(gens, j);
    1410                 :          0 :                         BIO_puts(out, "    ");
    1411                 :          0 :                         GENERAL_NAME_print(out, gen);
    1412                 :          0 :                         BIO_puts(out, "\n");
    1413                 :            :                         }
    1414                 :            :                 }
    1415                 :          0 :         return;
    1416                 :            :         }
    1417                 :            : 
    1418                 :          0 : static void receipt_request_print(BIO *out, CMS_ContentInfo *cms)
    1419                 :            :         {
    1420                 :            :         STACK_OF(CMS_SignerInfo) *sis;
    1421                 :            :         CMS_SignerInfo *si;
    1422                 :            :         CMS_ReceiptRequest *rr;
    1423                 :            :         int allorfirst;
    1424                 :            :         STACK_OF(GENERAL_NAMES) *rto, *rlist;
    1425                 :            :         ASN1_STRING *scid;
    1426                 :            :         int i, rv;
    1427                 :          0 :         sis = CMS_get0_SignerInfos(cms);
    1428         [ #  # ]:          0 :         for (i = 0; i < sk_CMS_SignerInfo_num(sis); i++)
    1429                 :            :                 {
    1430                 :          0 :                 si = sk_CMS_SignerInfo_value(sis, i);
    1431                 :          0 :                 rv = CMS_get1_ReceiptRequest(si, &rr);
    1432                 :          0 :                 BIO_printf(bio_err, "Signer %d:\n", i + 1);
    1433         [ #  # ]:          0 :                 if (rv == 0)
    1434                 :          0 :                         BIO_puts(bio_err, "  No Receipt Request\n");
    1435         [ #  # ]:          0 :                 else if (rv < 0)
    1436                 :            :                         {
    1437                 :          0 :                         BIO_puts(bio_err, "  Receipt Request Parse Error\n");
    1438                 :          0 :                         ERR_print_errors(bio_err);
    1439                 :            :                         }
    1440                 :            :                 else
    1441                 :            :                         {
    1442                 :            :                         char *id;
    1443                 :            :                         int idlen;
    1444                 :          0 :                         CMS_ReceiptRequest_get0_values(rr, &scid, &allorfirst,
    1445                 :            :                                                         &rlist, &rto);
    1446                 :          0 :                         BIO_puts(out, "  Signed Content ID:\n");
    1447                 :          0 :                         idlen = ASN1_STRING_length(scid);
    1448                 :          0 :                         id = (char *)ASN1_STRING_data(scid);
    1449                 :          0 :                         BIO_dump_indent(out, id, idlen, 4);
    1450                 :          0 :                         BIO_puts(out, "  Receipts From");
    1451         [ #  # ]:          0 :                         if (rlist)
    1452                 :            :                                 {
    1453                 :          0 :                                 BIO_puts(out, " List:\n");
    1454                 :          0 :                                 gnames_stack_print(out, rlist);
    1455                 :            :                                 }
    1456         [ #  # ]:          0 :                         else if (allorfirst == 1)
    1457                 :          0 :                                 BIO_puts(out, ": First Tier\n");
    1458         [ #  # ]:          0 :                         else if (allorfirst == 0)
    1459                 :          0 :                                 BIO_puts(out, ": All\n");
    1460                 :            :                         else
    1461                 :          0 :                                 BIO_printf(out, " Unknown (%d)\n", allorfirst);
    1462                 :          0 :                         BIO_puts(out, "  Receipts To:\n");
    1463                 :          0 :                         gnames_stack_print(out, rto);
    1464                 :            :                         }
    1465         [ #  # ]:          0 :                 if (rr)
    1466                 :          0 :                         CMS_ReceiptRequest_free(rr);
    1467                 :            :                 }
    1468                 :          0 :         }
    1469                 :            : 
    1470                 :          1 : static STACK_OF(GENERAL_NAMES) *make_names_stack(STACK_OF(OPENSSL_STRING) *ns)
    1471                 :            :         {
    1472                 :            :         int i;
    1473                 :            :         STACK_OF(GENERAL_NAMES) *ret;
    1474                 :          1 :         GENERAL_NAMES *gens = NULL;
    1475                 :          1 :         GENERAL_NAME *gen = NULL;
    1476                 :          1 :         ret = sk_GENERAL_NAMES_new_null();
    1477         [ +  - ]:          1 :         if (!ret)
    1478                 :            :                 goto err;
    1479         [ +  + ]:          2 :         for (i = 0; i < sk_OPENSSL_STRING_num(ns); i++)
    1480                 :            :                 {
    1481                 :          1 :                 char *str = sk_OPENSSL_STRING_value(ns, i);
    1482                 :          1 :                 gen = a2i_GENERAL_NAME(NULL, NULL, NULL, GEN_EMAIL, str, 0);
    1483         [ +  - ]:          1 :                 if (!gen)
    1484                 :            :                         goto err;
    1485                 :          1 :                 gens = GENERAL_NAMES_new();
    1486         [ +  - ]:          1 :                 if (!gens)
    1487                 :            :                         goto err;
    1488         [ +  - ]:          1 :                 if (!sk_GENERAL_NAME_push(gens, gen))
    1489                 :            :                         goto err;
    1490                 :          1 :                 gen = NULL;
    1491         [ +  - ]:          1 :                 if (!sk_GENERAL_NAMES_push(ret, gens))
    1492                 :            :                         goto err;
    1493                 :          1 :                 gens = NULL;
    1494                 :            :                 }
    1495                 :            : 
    1496                 :            :         return ret;
    1497                 :            : 
    1498                 :            :         err:
    1499         [ #  # ]:          0 :         if (ret)
    1500                 :          0 :                 sk_GENERAL_NAMES_pop_free(ret, GENERAL_NAMES_free);
    1501         [ #  # ]:          0 :         if (gens)
    1502                 :          0 :                 GENERAL_NAMES_free(gens);
    1503         [ #  # ]:          0 :         if (gen)
    1504                 :          0 :                 GENERAL_NAME_free(gen);
    1505                 :            :         return NULL;
    1506                 :            :         }
    1507                 :            : 
    1508                 :            : 
    1509                 :          1 : static CMS_ReceiptRequest *make_receipt_request(STACK_OF(OPENSSL_STRING) *rr_to,
    1510                 :            :                                                 int rr_allorfirst,
    1511                 :            :                                                 STACK_OF(OPENSSL_STRING) *rr_from)
    1512                 :            :         {
    1513                 :            :         STACK_OF(GENERAL_NAMES) *rct_to, *rct_from;
    1514                 :            :         CMS_ReceiptRequest *rr;
    1515                 :          1 :         rct_to = make_names_stack(rr_to);
    1516         [ +  - ]:          1 :         if (!rct_to)
    1517                 :            :                 goto err;
    1518         [ -  + ]:          1 :         if (rr_from)
    1519                 :            :                 {
    1520                 :          0 :                 rct_from = make_names_stack(rr_from);
    1521         [ #  # ]:          0 :                 if (!rct_from)
    1522                 :            :                         goto err;
    1523                 :            :                 }
    1524                 :            :         else
    1525                 :            :                 rct_from = NULL;
    1526                 :          1 :         rr = CMS_ReceiptRequest_create0(NULL, -1, rr_allorfirst, rct_from,
    1527                 :            :                                                 rct_to);
    1528                 :          1 :         return rr;
    1529                 :            :         err:
    1530                 :            :         return NULL;
    1531                 :            :         }
    1532                 :            : 
    1533                 :          7 : static int cms_set_pkey_param(EVP_PKEY_CTX *pctx,
    1534                 :            :                         STACK_OF(OPENSSL_STRING) *param)
    1535                 :            :         {
    1536                 :            :         char *keyopt;
    1537                 :            :         int i;
    1538         [ +  - ]:          7 :         if (sk_OPENSSL_STRING_num(param) <= 0)
    1539                 :            :                 return 1;
    1540         [ +  + ]:         17 :         for (i = 0; i < sk_OPENSSL_STRING_num(param); i++)
    1541                 :            :                 {
    1542                 :         10 :                 keyopt = sk_OPENSSL_STRING_value(param, i);
    1543         [ -  + ]:         10 :                 if (pkey_ctrl_string(pctx, keyopt) <= 0)
    1544                 :            :                         {
    1545                 :          0 :                         BIO_printf(bio_err, "parameter error \"%s\"\n",
    1546                 :            :                                                 keyopt);
    1547                 :          0 :                         ERR_print_errors(bio_err);
    1548                 :          0 :                         return 0;
    1549                 :            :                         }
    1550                 :            :                 }
    1551                 :            :         return 1;
    1552                 :            :         }
    1553                 :            : 
    1554                 :            : #endif

Generated by: LCOV version 1.9