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