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