1656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project/* apps/cms.c */ 2656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project/* Written by Dr Stephen N Henson (steve@openssl.org) for the OpenSSL 3656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * project. 4656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project */ 5656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project/* ==================================================================== 6656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * Copyright (c) 2008 The OpenSSL Project. All rights reserved. 7656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * 8656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * Redistribution and use in source and binary forms, with or without 9656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * modification, are permitted provided that the following conditions 10656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * are met: 11656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * 12656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * 1. Redistributions of source code must retain the above copyright 13656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * notice, this list of conditions and the following disclaimer. 14656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * 15656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * 2. Redistributions in binary form must reproduce the above copyright 16656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * notice, this list of conditions and the following disclaimer in 17656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * the documentation and/or other materials provided with the 18656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * distribution. 19656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * 20656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * 3. All advertising materials mentioning features or use of this 21656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * software must display the following acknowledgment: 22656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * "This product includes software developed by the OpenSSL Project 23656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * for use in the OpenSSL Toolkit. (http://www.OpenSSL.org/)" 24656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * 25656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * 4. The names "OpenSSL Toolkit" and "OpenSSL Project" must not be used to 26656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * endorse or promote products derived from this software without 27656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * prior written permission. For written permission, please contact 28656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * licensing@OpenSSL.org. 29656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * 30656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * 5. Products derived from this software may not be called "OpenSSL" 31656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * nor may "OpenSSL" appear in their names without prior written 32656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * permission of the OpenSSL Project. 33656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * 34656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * 6. Redistributions of any form whatsoever must retain the following 35656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * acknowledgment: 36656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * "This product includes software developed by the OpenSSL Project 37656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * for use in the OpenSSL Toolkit (http://www.OpenSSL.org/)" 38656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * 39656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * THIS SOFTWARE IS PROVIDED BY THE OpenSSL PROJECT ``AS IS'' AND ANY 40656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 41656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR 42656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE OpenSSL PROJECT OR 43656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 44656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT 45656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; 46656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 47656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, 48656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) 49656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED 50656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * OF THE POSSIBILITY OF SUCH DAMAGE. 51656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * ==================================================================== 52656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project */ 53656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 54656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project/* CMS utility function */ 55656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 56656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#include <stdio.h> 57656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#include <string.h> 58656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#include "apps.h" 59656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 60656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#ifndef OPENSSL_NO_CMS 61656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 62656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#include <openssl/crypto.h> 63656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#include <openssl/pem.h> 64656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#include <openssl/err.h> 65656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#include <openssl/x509_vfy.h> 66656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#include <openssl/x509v3.h> 67656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#include <openssl/cms.h> 68656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 69656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#undef PROG 70656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#define PROG cms_main 71656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Projectstatic int save_certs(char *signerfile, STACK_OF(X509) *signers); 72656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Projectstatic int cms_cb(int ok, X509_STORE_CTX *ctx); 73656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Projectstatic void receipt_request_print(BIO *out, CMS_ContentInfo *cms); 74221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstromstatic CMS_ReceiptRequest *make_receipt_request(STACK_OF(OPENSSL_STRING) *rr_to, 75221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom int rr_allorfirst, 76221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom STACK_OF(OPENSSL_STRING) *rr_from); 77656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 78656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#define SMIME_OP 0x10 79656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#define SMIME_IP 0x20 80656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#define SMIME_SIGNERS 0x40 81656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#define SMIME_ENCRYPT (1 | SMIME_OP) 82656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#define SMIME_DECRYPT (2 | SMIME_IP) 83656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#define SMIME_SIGN (3 | SMIME_OP | SMIME_SIGNERS) 84656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#define SMIME_VERIFY (4 | SMIME_IP) 85656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#define SMIME_CMSOUT (5 | SMIME_IP | SMIME_OP) 86656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#define SMIME_RESIGN (6 | SMIME_IP | SMIME_OP | SMIME_SIGNERS) 87656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#define SMIME_DATAOUT (7 | SMIME_IP) 88656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#define SMIME_DATA_CREATE (8 | SMIME_OP) 89656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#define SMIME_DIGEST_VERIFY (9 | SMIME_IP) 90656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#define SMIME_DIGEST_CREATE (10 | SMIME_OP) 91656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#define SMIME_UNCOMPRESS (11 | SMIME_IP) 92656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#define SMIME_COMPRESS (12 | SMIME_OP) 93656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#define SMIME_ENCRYPTED_DECRYPT (13 | SMIME_IP) 94656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#define SMIME_ENCRYPTED_ENCRYPT (14 | SMIME_OP) 95656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#define SMIME_SIGN_RECEIPT (15 | SMIME_IP | SMIME_OP) 96656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#define SMIME_VERIFY_RECEIPT (16 | SMIME_IP) 97656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 98221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstromint verify_err = 0; 99221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom 100656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Projectint MAIN(int, char **); 101656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 102656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Projectint MAIN(int argc, char **argv) 103656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project { 104656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project ENGINE *e = NULL; 105656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project int operation = 0; 106656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project int ret = 0; 107656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project char **args; 108656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project const char *inmode = "r", *outmode = "w"; 109656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project char *infile = NULL, *outfile = NULL, *rctfile = NULL; 110656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project char *signerfile = NULL, *recipfile = NULL; 111221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom STACK_OF(OPENSSL_STRING) *sksigners = NULL, *skkeys = NULL; 112656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project char *certfile = NULL, *keyfile = NULL, *contfile=NULL; 113656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project char *certsoutfile = NULL; 114656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project const EVP_CIPHER *cipher = NULL; 115656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project CMS_ContentInfo *cms = NULL, *rcms = NULL; 116656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project X509_STORE *store = NULL; 117656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project X509 *cert = NULL, *recip = NULL, *signer = NULL; 118656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project EVP_PKEY *key = NULL; 119656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project STACK_OF(X509) *encerts = NULL, *other = NULL; 120656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project BIO *in = NULL, *out = NULL, *indata = NULL, *rctin = NULL; 121656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project int badarg = 0; 122221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom int flags = CMS_DETACHED, noout = 0, print = 0; 123221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom int verify_retcode = 0; 124656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project int rr_print = 0, rr_allorfirst = -1; 125221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom STACK_OF(OPENSSL_STRING) *rr_to = NULL, *rr_from = NULL; 126656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project CMS_ReceiptRequest *rr = NULL; 127656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project char *to = NULL, *from = NULL, *subject = NULL; 128656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project char *CAfile = NULL, *CApath = NULL; 129656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project char *passargin = NULL, *passin = NULL; 130656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project char *inrand = NULL; 131656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project int need_rand = 0; 132656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project const EVP_MD *sign_md = NULL; 133656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project int informat = FORMAT_SMIME, outformat = FORMAT_SMIME; 134656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project int rctformat = FORMAT_SMIME, keyform = FORMAT_PEM; 135656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#ifndef OPENSSL_NO_ENGINE 136656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project char *engine=NULL; 137656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#endif 138656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project unsigned char *secret_key = NULL, *secret_keyid = NULL; 139392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom unsigned char *pwri_pass = NULL, *pwri_tmp = NULL; 140656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project size_t secret_keylen = 0, secret_keyidlen = 0; 141656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 142656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project ASN1_OBJECT *econtent_type = NULL; 143656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 144656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project X509_VERIFY_PARAM *vpm = NULL; 145656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 146656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project args = argv + 1; 147656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project ret = 1; 148656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 149656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project apps_startup(); 150656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 151656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project if (bio_err == NULL) 152656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project { 153656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project if ((bio_err = BIO_new(BIO_s_file())) != NULL) 154656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project BIO_set_fp(bio_err, stderr, BIO_NOCLOSE|BIO_FP_TEXT); 155656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project } 156656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 157656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project if (!load_config(bio_err, NULL)) 158656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project goto end; 159656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 160656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project while (!badarg && *args && *args[0] == '-') 161656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project { 162656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project if (!strcmp (*args, "-encrypt")) 163656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project operation = SMIME_ENCRYPT; 164656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project else if (!strcmp (*args, "-decrypt")) 165656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project operation = SMIME_DECRYPT; 166656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project else if (!strcmp (*args, "-sign")) 167656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project operation = SMIME_SIGN; 168656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project else if (!strcmp (*args, "-sign_receipt")) 169656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project operation = SMIME_SIGN_RECEIPT; 170656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project else if (!strcmp (*args, "-resign")) 171656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project operation = SMIME_RESIGN; 172656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project else if (!strcmp (*args, "-verify")) 173656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project operation = SMIME_VERIFY; 174221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom else if (!strcmp (*args, "-verify_retcode")) 175221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom verify_retcode = 1; 176656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project else if (!strcmp(*args,"-verify_receipt")) 177656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project { 178656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project operation = SMIME_VERIFY_RECEIPT; 179656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project if (!args[1]) 180656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project goto argerr; 181656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project args++; 182656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project rctfile = *args; 183656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project } 184656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project else if (!strcmp (*args, "-cmsout")) 185656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project operation = SMIME_CMSOUT; 186656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project else if (!strcmp (*args, "-data_out")) 187656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project operation = SMIME_DATAOUT; 188656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project else if (!strcmp (*args, "-data_create")) 189656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project operation = SMIME_DATA_CREATE; 190656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project else if (!strcmp (*args, "-digest_verify")) 191656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project operation = SMIME_DIGEST_VERIFY; 192656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project else if (!strcmp (*args, "-digest_create")) 193656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project operation = SMIME_DIGEST_CREATE; 194656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project else if (!strcmp (*args, "-compress")) 195656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project operation = SMIME_COMPRESS; 196656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project else if (!strcmp (*args, "-uncompress")) 197656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project operation = SMIME_UNCOMPRESS; 198656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project else if (!strcmp (*args, "-EncryptedData_decrypt")) 199656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project operation = SMIME_ENCRYPTED_DECRYPT; 200656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project else if (!strcmp (*args, "-EncryptedData_encrypt")) 201656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project operation = SMIME_ENCRYPTED_ENCRYPT; 202656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#ifndef OPENSSL_NO_DES 203656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project else if (!strcmp (*args, "-des3")) 204656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project cipher = EVP_des_ede3_cbc(); 205656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project else if (!strcmp (*args, "-des")) 206656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project cipher = EVP_des_cbc(); 207656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#endif 208656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#ifndef OPENSSL_NO_SEED 209656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project else if (!strcmp (*args, "-seed")) 210656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project cipher = EVP_seed_cbc(); 211656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#endif 212656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#ifndef OPENSSL_NO_RC2 213656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project else if (!strcmp (*args, "-rc2-40")) 214656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project cipher = EVP_rc2_40_cbc(); 215656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project else if (!strcmp (*args, "-rc2-128")) 216656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project cipher = EVP_rc2_cbc(); 217656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project else if (!strcmp (*args, "-rc2-64")) 218656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project cipher = EVP_rc2_64_cbc(); 219656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#endif 220656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#ifndef OPENSSL_NO_AES 221656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project else if (!strcmp(*args,"-aes128")) 222656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project cipher = EVP_aes_128_cbc(); 223656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project else if (!strcmp(*args,"-aes192")) 224656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project cipher = EVP_aes_192_cbc(); 225656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project else if (!strcmp(*args,"-aes256")) 226656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project cipher = EVP_aes_256_cbc(); 227656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#endif 228656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#ifndef OPENSSL_NO_CAMELLIA 229656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project else if (!strcmp(*args,"-camellia128")) 230656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project cipher = EVP_camellia_128_cbc(); 231656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project else if (!strcmp(*args,"-camellia192")) 232656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project cipher = EVP_camellia_192_cbc(); 233656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project else if (!strcmp(*args,"-camellia256")) 234656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project cipher = EVP_camellia_256_cbc(); 235656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#endif 236656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project else if (!strcmp (*args, "-text")) 237656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project flags |= CMS_TEXT; 238656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project else if (!strcmp (*args, "-nointern")) 239656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project flags |= CMS_NOINTERN; 240656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project else if (!strcmp (*args, "-noverify") 241656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project || !strcmp (*args, "-no_signer_cert_verify")) 242656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project flags |= CMS_NO_SIGNER_CERT_VERIFY; 243656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project else if (!strcmp (*args, "-nocerts")) 244656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project flags |= CMS_NOCERTS; 245656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project else if (!strcmp (*args, "-noattr")) 246656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project flags |= CMS_NOATTR; 247656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project else if (!strcmp (*args, "-nodetach")) 248656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project flags &= ~CMS_DETACHED; 249656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project else if (!strcmp (*args, "-nosmimecap")) 250656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project flags |= CMS_NOSMIMECAP; 251656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project else if (!strcmp (*args, "-binary")) 252656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project flags |= CMS_BINARY; 253656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project else if (!strcmp (*args, "-keyid")) 254656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project flags |= CMS_USE_KEYID; 255656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project else if (!strcmp (*args, "-nosigs")) 256656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project flags |= CMS_NOSIGS; 257656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project else if (!strcmp (*args, "-no_content_verify")) 258656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project flags |= CMS_NO_CONTENT_VERIFY; 259656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project else if (!strcmp (*args, "-no_attr_verify")) 260656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project flags |= CMS_NO_ATTR_VERIFY; 261656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project else if (!strcmp (*args, "-stream")) 262221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom flags |= CMS_STREAM; 263656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project else if (!strcmp (*args, "-indef")) 264221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom flags |= CMS_STREAM; 265656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project else if (!strcmp (*args, "-noindef")) 266656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project flags &= ~CMS_STREAM; 267656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project else if (!strcmp (*args, "-nooldmime")) 268656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project flags |= CMS_NOOLDMIMETYPE; 269656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project else if (!strcmp (*args, "-crlfeol")) 270656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project flags |= CMS_CRLFEOL; 271221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom else if (!strcmp (*args, "-noout")) 272221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom noout = 1; 273656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project else if (!strcmp (*args, "-receipt_request_print")) 274656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project rr_print = 1; 275656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project else if (!strcmp (*args, "-receipt_request_all")) 276656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project rr_allorfirst = 0; 277656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project else if (!strcmp (*args, "-receipt_request_first")) 278656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project rr_allorfirst = 1; 279656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project else if (!strcmp(*args,"-receipt_request_from")) 280656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project { 281656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project if (!args[1]) 282656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project goto argerr; 283656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project args++; 284656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project if (!rr_from) 285221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom rr_from = sk_OPENSSL_STRING_new_null(); 286221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom sk_OPENSSL_STRING_push(rr_from, *args); 287656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project } 288656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project else if (!strcmp(*args,"-receipt_request_to")) 289656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project { 290656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project if (!args[1]) 291656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project goto argerr; 292656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project args++; 293656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project if (!rr_to) 294221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom rr_to = sk_OPENSSL_STRING_new_null(); 295221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom sk_OPENSSL_STRING_push(rr_to, *args); 296656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project } 297221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom else if (!strcmp (*args, "-print")) 298221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom { 299221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom noout = 1; 300221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom print = 1; 301221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom } 302656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project else if (!strcmp(*args,"-secretkey")) 303656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project { 304656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project long ltmp; 305656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project if (!args[1]) 306656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project goto argerr; 307656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project args++; 308656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project secret_key = string_to_hex(*args, <mp); 309656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project if (!secret_key) 310656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project { 311656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project BIO_printf(bio_err, "Invalid key %s\n", *args); 312656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project goto argerr; 313656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project } 314656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project secret_keylen = (size_t)ltmp; 315656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project } 316656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project else if (!strcmp(*args,"-secretkeyid")) 317656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project { 318656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project long ltmp; 319656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project if (!args[1]) 320656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project goto argerr; 321656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project args++; 322656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project secret_keyid = string_to_hex(*args, <mp); 323656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project if (!secret_keyid) 324656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project { 325656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project BIO_printf(bio_err, "Invalid id %s\n", *args); 326656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project goto argerr; 327656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project } 328656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project secret_keyidlen = (size_t)ltmp; 329656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project } 330392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom else if (!strcmp(*args,"-pwri_password")) 331392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom { 332392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom if (!args[1]) 333392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom goto argerr; 334392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom args++; 335392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom pwri_pass = (unsigned char *)*args; 336392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom } 337656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project else if (!strcmp(*args,"-econtent_type")) 338656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project { 339656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project if (!args[1]) 340656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project goto argerr; 341656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project args++; 342656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project econtent_type = OBJ_txt2obj(*args, 0); 343656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project if (!econtent_type) 344656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project { 345656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project BIO_printf(bio_err, "Invalid OID %s\n", *args); 346656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project goto argerr; 347656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project } 348656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project } 349656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project else if (!strcmp(*args,"-rand")) 350656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project { 351656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project if (!args[1]) 352656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project goto argerr; 353656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project args++; 354656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project inrand = *args; 355656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project need_rand = 1; 356656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project } 357656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#ifndef OPENSSL_NO_ENGINE 358656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project else if (!strcmp(*args,"-engine")) 359656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project { 360656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project if (!args[1]) 361656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project goto argerr; 362656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project engine = *++args; 363656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project } 364656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#endif 365656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project else if (!strcmp(*args,"-passin")) 366656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project { 367656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project if (!args[1]) 368656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project goto argerr; 369656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project passargin = *++args; 370656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project } 371656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project else if (!strcmp (*args, "-to")) 372656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project { 373656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project if (!args[1]) 374656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project goto argerr; 375656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project to = *++args; 376656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project } 377656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project else if (!strcmp (*args, "-from")) 378656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project { 379656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project if (!args[1]) 380656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project goto argerr; 381656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project from = *++args; 382656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project } 383656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project else if (!strcmp (*args, "-subject")) 384656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project { 385656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project if (!args[1]) 386656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project goto argerr; 387656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project subject = *++args; 388656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project } 389656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project else if (!strcmp (*args, "-signer")) 390656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project { 391656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project if (!args[1]) 392656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project goto argerr; 393656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project /* If previous -signer argument add signer to list */ 394656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 395656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project if (signerfile) 396656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project { 397656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project if (!sksigners) 398221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom sksigners = sk_OPENSSL_STRING_new_null(); 399221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom sk_OPENSSL_STRING_push(sksigners, signerfile); 400656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project if (!keyfile) 401656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project keyfile = signerfile; 402656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project if (!skkeys) 403221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom skkeys = sk_OPENSSL_STRING_new_null(); 404221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom sk_OPENSSL_STRING_push(skkeys, keyfile); 405656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project keyfile = NULL; 406656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project } 407656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project signerfile = *++args; 408656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project } 409656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project else if (!strcmp (*args, "-recip")) 410656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project { 411656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project if (!args[1]) 412656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project goto argerr; 413656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project recipfile = *++args; 414656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project } 415656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project else if (!strcmp (*args, "-certsout")) 416656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project { 417656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project if (!args[1]) 418656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project goto argerr; 419656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project certsoutfile = *++args; 420656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project } 421656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project else if (!strcmp (*args, "-md")) 422656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project { 423656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project if (!args[1]) 424656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project goto argerr; 425656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project sign_md = EVP_get_digestbyname(*++args); 426656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project if (sign_md == NULL) 427656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project { 428656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project BIO_printf(bio_err, "Unknown digest %s\n", 429656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project *args); 430656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project goto argerr; 431656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project } 432656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project } 433656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project else if (!strcmp (*args, "-inkey")) 434656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project { 435656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project if (!args[1]) 436656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project goto argerr; 437656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project /* If previous -inkey arument add signer to list */ 438656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project if (keyfile) 439656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project { 440656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project if (!signerfile) 441656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project { 442656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project BIO_puts(bio_err, "Illegal -inkey without -signer\n"); 443656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project goto argerr; 444656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project } 445656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project if (!sksigners) 446221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom sksigners = sk_OPENSSL_STRING_new_null(); 447221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom sk_OPENSSL_STRING_push(sksigners, signerfile); 448656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project signerfile = NULL; 449656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project if (!skkeys) 450221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom skkeys = sk_OPENSSL_STRING_new_null(); 451221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom sk_OPENSSL_STRING_push(skkeys, keyfile); 452656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project } 453656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project keyfile = *++args; 454656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project } 455656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project else if (!strcmp (*args, "-keyform")) 456656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project { 457656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project if (!args[1]) 458656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project goto argerr; 459656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project keyform = str2fmt(*++args); 460656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project } 461656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project else if (!strcmp (*args, "-rctform")) 462656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project { 463656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project if (!args[1]) 464656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project goto argerr; 465656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project rctformat = str2fmt(*++args); 466656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project } 467656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project else if (!strcmp (*args, "-certfile")) 468656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project { 469656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project if (!args[1]) 470656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project goto argerr; 471656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project certfile = *++args; 472656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project } 473656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project else if (!strcmp (*args, "-CAfile")) 474656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project { 475656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project if (!args[1]) 476656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project goto argerr; 477656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project CAfile = *++args; 478656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project } 479656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project else if (!strcmp (*args, "-CApath")) 480656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project { 481656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project if (!args[1]) 482656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project goto argerr; 483656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project CApath = *++args; 484656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project } 485656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project else if (!strcmp (*args, "-in")) 486656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project { 487656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project if (!args[1]) 488656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project goto argerr; 489656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project infile = *++args; 490656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project } 491656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project else if (!strcmp (*args, "-inform")) 492656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project { 493656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project if (!args[1]) 494656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project goto argerr; 495656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project informat = str2fmt(*++args); 496656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project } 497656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project else if (!strcmp (*args, "-outform")) 498656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project { 499656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project if (!args[1]) 500656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project goto argerr; 501656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project outformat = str2fmt(*++args); 502656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project } 503656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project else if (!strcmp (*args, "-out")) 504656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project { 505656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project if (!args[1]) 506656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project goto argerr; 507656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project outfile = *++args; 508656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project } 509656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project else if (!strcmp (*args, "-content")) 510656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project { 511656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project if (!args[1]) 512656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project goto argerr; 513656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project contfile = *++args; 514656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project } 515656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project else if (args_verify(&args, NULL, &badarg, bio_err, &vpm)) 516656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project continue; 517656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project else if ((cipher = EVP_get_cipherbyname(*args + 1)) == NULL) 518656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project badarg = 1; 519656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project args++; 520656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project } 521656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 522656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project if (((rr_allorfirst != -1) || rr_from) && !rr_to) 523656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project { 524656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project BIO_puts(bio_err, "No Signed Receipts Recipients\n"); 525656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project goto argerr; 526656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project } 527656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 528656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project if (!(operation & SMIME_SIGNERS) && (rr_to || rr_from)) 529656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project { 530656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project BIO_puts(bio_err, "Signed receipts only allowed with -sign\n"); 531656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project goto argerr; 532656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project } 533656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project if (!(operation & SMIME_SIGNERS) && (skkeys || sksigners)) 534656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project { 535656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project BIO_puts(bio_err, "Multiple signers or keys not allowed\n"); 536656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project goto argerr; 537656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project } 538656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 539656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project if (operation & SMIME_SIGNERS) 540656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project { 541656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project if (keyfile && !signerfile) 542656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project { 543656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project BIO_puts(bio_err, "Illegal -inkey without -signer\n"); 544656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project goto argerr; 545656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project } 546656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project /* Check to see if any final signer needs to be appended */ 547656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project if (signerfile) 548656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project { 549656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project if (!sksigners) 550221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom sksigners = sk_OPENSSL_STRING_new_null(); 551221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom sk_OPENSSL_STRING_push(sksigners, signerfile); 552656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project if (!skkeys) 553221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom skkeys = sk_OPENSSL_STRING_new_null(); 554656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project if (!keyfile) 555656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project keyfile = signerfile; 556221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom sk_OPENSSL_STRING_push(skkeys, keyfile); 557656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project } 558656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project if (!sksigners) 559656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project { 560656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project BIO_printf(bio_err, "No signer certificate specified\n"); 561656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project badarg = 1; 562656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project } 563656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project signerfile = NULL; 564656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project keyfile = NULL; 565656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project need_rand = 1; 566656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project } 567656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 568656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project else if (operation == SMIME_DECRYPT) 569656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project { 570392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom if (!recipfile && !keyfile && !secret_key && !pwri_pass) 571656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project { 572656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project BIO_printf(bio_err, "No recipient certificate or key specified\n"); 573656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project badarg = 1; 574656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project } 575656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project } 576656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project else if (operation == SMIME_ENCRYPT) 577656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project { 578392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom if (!*args && !secret_key && !pwri_pass) 579656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project { 580656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project BIO_printf(bio_err, "No recipient(s) certificate(s) specified\n"); 581656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project badarg = 1; 582656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project } 583656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project need_rand = 1; 584656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project } 585656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project else if (!operation) 586656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project badarg = 1; 587656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 588656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project if (badarg) 589656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project { 590656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project argerr: 591656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project BIO_printf (bio_err, "Usage cms [options] cert.pem ...\n"); 592656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project BIO_printf (bio_err, "where options are\n"); 593656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project BIO_printf (bio_err, "-encrypt encrypt message\n"); 594656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project BIO_printf (bio_err, "-decrypt decrypt encrypted message\n"); 595656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project BIO_printf (bio_err, "-sign sign message\n"); 596656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project BIO_printf (bio_err, "-verify verify signed message\n"); 597656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project BIO_printf (bio_err, "-cmsout output CMS structure\n"); 598656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#ifndef OPENSSL_NO_DES 599656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project BIO_printf (bio_err, "-des3 encrypt with triple DES\n"); 600656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project BIO_printf (bio_err, "-des encrypt with DES\n"); 601656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#endif 602656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#ifndef OPENSSL_NO_SEED 603656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project BIO_printf (bio_err, "-seed encrypt with SEED\n"); 604656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#endif 605656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#ifndef OPENSSL_NO_RC2 606656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project BIO_printf (bio_err, "-rc2-40 encrypt with RC2-40 (default)\n"); 607656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project BIO_printf (bio_err, "-rc2-64 encrypt with RC2-64\n"); 608656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project BIO_printf (bio_err, "-rc2-128 encrypt with RC2-128\n"); 609656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#endif 610656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#ifndef OPENSSL_NO_AES 611656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project BIO_printf (bio_err, "-aes128, -aes192, -aes256\n"); 612656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project BIO_printf (bio_err, " encrypt PEM output with cbc aes\n"); 613656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#endif 614656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#ifndef OPENSSL_NO_CAMELLIA 615656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project BIO_printf (bio_err, "-camellia128, -camellia192, -camellia256\n"); 616656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project BIO_printf (bio_err, " encrypt PEM output with cbc camellia\n"); 617656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#endif 618656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project BIO_printf (bio_err, "-nointern don't search certificates in message for signer\n"); 619656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project BIO_printf (bio_err, "-nosigs don't verify message signature\n"); 620656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project BIO_printf (bio_err, "-noverify don't verify signers certificate\n"); 621656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project BIO_printf (bio_err, "-nocerts don't include signers certificate when signing\n"); 622656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project BIO_printf (bio_err, "-nodetach use opaque signing\n"); 623656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project BIO_printf (bio_err, "-noattr don't include any signed attributes\n"); 624656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project BIO_printf (bio_err, "-binary don't translate message to text\n"); 625656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project BIO_printf (bio_err, "-certfile file other certificates file\n"); 626656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project BIO_printf (bio_err, "-certsout file certificate output file\n"); 627656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project BIO_printf (bio_err, "-signer file signer certificate file\n"); 628656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project BIO_printf (bio_err, "-recip file recipient certificate file for decryption\n"); 6297d3d122363e2a85d516db314892f3d6112cb1377Brian Carlstrom BIO_printf (bio_err, "-keyid use subject key identifier\n"); 630656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project BIO_printf (bio_err, "-in file input file\n"); 631656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project BIO_printf (bio_err, "-inform arg input format SMIME (default), PEM or DER\n"); 632656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project BIO_printf (bio_err, "-inkey file input private key (if not signer or recipient)\n"); 633656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project BIO_printf (bio_err, "-keyform arg input private key format (PEM or ENGINE)\n"); 634656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project BIO_printf (bio_err, "-out file output file\n"); 635656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project BIO_printf (bio_err, "-outform arg output format SMIME (default), PEM or DER\n"); 636656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project BIO_printf (bio_err, "-content file supply or override content for detached signature\n"); 637656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project BIO_printf (bio_err, "-to addr to address\n"); 638656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project BIO_printf (bio_err, "-from ad from address\n"); 639656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project BIO_printf (bio_err, "-subject s subject\n"); 640656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project BIO_printf (bio_err, "-text include or delete text MIME headers\n"); 641656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project BIO_printf (bio_err, "-CApath dir trusted certificates directory\n"); 642656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project BIO_printf (bio_err, "-CAfile file trusted certificates file\n"); 643656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project BIO_printf (bio_err, "-crl_check check revocation status of signer's certificate using CRLs\n"); 644656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project BIO_printf (bio_err, "-crl_check_all check revocation status of signer's certificate chain using CRLs\n"); 645656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#ifndef OPENSSL_NO_ENGINE 646656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project BIO_printf (bio_err, "-engine e use engine e, possibly a hardware device.\n"); 647656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#endif 648656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project BIO_printf (bio_err, "-passin arg input file pass phrase source\n"); 649656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project BIO_printf(bio_err, "-rand file%cfile%c...\n", LIST_SEPARATOR_CHAR, LIST_SEPARATOR_CHAR); 650656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project BIO_printf(bio_err, " load the file (or the files in the directory) into\n"); 651656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project BIO_printf(bio_err, " the random number generator\n"); 652656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project BIO_printf (bio_err, "cert.pem recipient certificate(s) for encryption\n"); 653656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project goto end; 654656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project } 655656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 656656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#ifndef OPENSSL_NO_ENGINE 657656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project e = setup_engine(bio_err, engine, 0); 658656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#endif 659656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 660656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project if (!app_passwd(bio_err, passargin, NULL, &passin, NULL)) 661656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project { 662656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project BIO_printf(bio_err, "Error getting password\n"); 663656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project goto end; 664656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project } 665656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 666656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project if (need_rand) 667656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project { 668656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project app_RAND_load_file(NULL, bio_err, (inrand != NULL)); 669656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project if (inrand != NULL) 670656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project BIO_printf(bio_err,"%ld semi-random bytes loaded\n", 671656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project app_RAND_load_files(inrand)); 672656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project } 673656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 674656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project ret = 2; 675656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 676656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project if (!(operation & SMIME_SIGNERS)) 677656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project flags &= ~CMS_DETACHED; 678656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 679656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project if (operation & SMIME_OP) 680656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project { 681656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project if (outformat == FORMAT_ASN1) 682656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project outmode = "wb"; 683656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project } 684656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project else 685656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project { 686656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project if (flags & CMS_BINARY) 687656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project outmode = "wb"; 688656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project } 689656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 690656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project if (operation & SMIME_IP) 691656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project { 692656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project if (informat == FORMAT_ASN1) 693656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project inmode = "rb"; 694656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project } 695656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project else 696656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project { 697656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project if (flags & CMS_BINARY) 698656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project inmode = "rb"; 699656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project } 700656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 701656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project if (operation == SMIME_ENCRYPT) 702656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project { 703656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project if (!cipher) 704656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project { 705656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#ifndef OPENSSL_NO_DES 706656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project cipher = EVP_des_ede3_cbc(); 707656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#else 708656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project BIO_printf(bio_err, "No cipher selected\n"); 709656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project goto end; 710656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#endif 711656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project } 712656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 713656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project if (secret_key && !secret_keyid) 714656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project { 715221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom BIO_printf(bio_err, "No secret key id\n"); 716656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project goto end; 717656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project } 718656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 719656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project if (*args) 720656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project encerts = sk_X509_new_null(); 721656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project while (*args) 722656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project { 723656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project if (!(cert = load_cert(bio_err,*args,FORMAT_PEM, 724656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project NULL, e, "recipient certificate file"))) 725656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project goto end; 726656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project sk_X509_push(encerts, cert); 727656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project cert = NULL; 728656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project args++; 729656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project } 730656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project } 731656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 732656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project if (certfile) 733656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project { 734656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project if (!(other = load_certs(bio_err,certfile,FORMAT_PEM, NULL, 735656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project e, "certificate file"))) 736656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project { 737656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project ERR_print_errors(bio_err); 738656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project goto end; 739656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project } 740656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project } 741656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 742656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project if (recipfile && (operation == SMIME_DECRYPT)) 743656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project { 744656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project if (!(recip = load_cert(bio_err,recipfile,FORMAT_PEM,NULL, 745656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project e, "recipient certificate file"))) 746656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project { 747656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project ERR_print_errors(bio_err); 748656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project goto end; 749656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project } 750656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project } 751656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 752656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project if (operation == SMIME_SIGN_RECEIPT) 753656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project { 754656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project if (!(signer = load_cert(bio_err,signerfile,FORMAT_PEM,NULL, 755656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project e, "receipt signer certificate file"))) 756656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project { 757656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project ERR_print_errors(bio_err); 758656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project goto end; 759656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project } 760656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project } 761656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 762656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project if (operation == SMIME_DECRYPT) 763656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project { 764656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project if (!keyfile) 765656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project keyfile = recipfile; 766656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project } 767656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project else if ((operation == SMIME_SIGN) || (operation == SMIME_SIGN_RECEIPT)) 768656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project { 769656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project if (!keyfile) 770656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project keyfile = signerfile; 771656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project } 772656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project else keyfile = NULL; 773656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 774656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project if (keyfile) 775656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project { 776656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project key = load_key(bio_err, keyfile, keyform, 0, passin, e, 777656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project "signing key file"); 778656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project if (!key) 779656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project goto end; 780656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project } 781656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 782656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project if (infile) 783656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project { 784656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project if (!(in = BIO_new_file(infile, inmode))) 785656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project { 786656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project BIO_printf (bio_err, 787656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project "Can't open input file %s\n", infile); 788656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project goto end; 789656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project } 790656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project } 791656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project else 792656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project in = BIO_new_fp(stdin, BIO_NOCLOSE); 793656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 794656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project if (operation & SMIME_IP) 795656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project { 796656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project if (informat == FORMAT_SMIME) 797656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project cms = SMIME_read_CMS(in, &indata); 798656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project else if (informat == FORMAT_PEM) 799656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project cms = PEM_read_bio_CMS(in, NULL, NULL, NULL); 800656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project else if (informat == FORMAT_ASN1) 801656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project cms = d2i_CMS_bio(in, NULL); 802656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project else 803656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project { 804656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project BIO_printf(bio_err, "Bad input format for CMS file\n"); 805656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project goto end; 806656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project } 807656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 808656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project if (!cms) 809656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project { 810656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project BIO_printf(bio_err, "Error reading S/MIME message\n"); 811656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project goto end; 812656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project } 813656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project if (contfile) 814656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project { 815656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project BIO_free(indata); 816656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project if (!(indata = BIO_new_file(contfile, "rb"))) 817656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project { 818656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project BIO_printf(bio_err, "Can't read content file %s\n", contfile); 819656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project goto end; 820656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project } 821656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project } 822656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project if (certsoutfile) 823656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project { 824656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project STACK_OF(X509) *allcerts; 825656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project allcerts = CMS_get1_certs(cms); 826656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project if (!save_certs(certsoutfile, allcerts)) 827656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project { 828656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project BIO_printf(bio_err, 829656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project "Error writing certs to %s\n", 830656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project certsoutfile); 831656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project ret = 5; 832656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project goto end; 833656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project } 834656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project sk_X509_pop_free(allcerts, X509_free); 835656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project } 836656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project } 837656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 838656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project if (rctfile) 839656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project { 840656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project char *rctmode = (rctformat == FORMAT_ASN1) ? "rb" : "r"; 841656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project if (!(rctin = BIO_new_file(rctfile, rctmode))) 842656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project { 843656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project BIO_printf (bio_err, 844656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project "Can't open receipt file %s\n", rctfile); 845656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project goto end; 846656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project } 847656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 848656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project if (rctformat == FORMAT_SMIME) 849656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project rcms = SMIME_read_CMS(rctin, NULL); 850656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project else if (rctformat == FORMAT_PEM) 851656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project rcms = PEM_read_bio_CMS(rctin, NULL, NULL, NULL); 852656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project else if (rctformat == FORMAT_ASN1) 853656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project rcms = d2i_CMS_bio(rctin, NULL); 854656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project else 855656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project { 856656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project BIO_printf(bio_err, "Bad input format for receipt\n"); 857656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project goto end; 858656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project } 859656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 860656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project if (!rcms) 861656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project { 862656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project BIO_printf(bio_err, "Error reading receipt\n"); 863656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project goto end; 864656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project } 865656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project } 866656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 867656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project if (outfile) 868656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project { 869656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project if (!(out = BIO_new_file(outfile, outmode))) 870656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project { 871656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project BIO_printf (bio_err, 872656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project "Can't open output file %s\n", outfile); 873656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project goto end; 874656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project } 875656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project } 876656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project else 877656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project { 878656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project out = BIO_new_fp(stdout, BIO_NOCLOSE); 879656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#ifdef OPENSSL_SYS_VMS 880656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project { 881656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project BIO *tmpbio = BIO_new(BIO_f_linebuffer()); 882656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project out = BIO_push(tmpbio, out); 883656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project } 884656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#endif 885656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project } 886656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 887656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project if ((operation == SMIME_VERIFY) || (operation == SMIME_VERIFY_RECEIPT)) 888656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project { 889656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project if (!(store = setup_verify(bio_err, CAfile, CApath))) 890656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project goto end; 891221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom X509_STORE_set_verify_cb(store, cms_cb); 892656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project if (vpm) 893656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project X509_STORE_set1_param(store, vpm); 894656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project } 895656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 896656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 897656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project ret = 3; 898656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 899656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project if (operation == SMIME_DATA_CREATE) 900656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project { 901656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project cms = CMS_data_create(in, flags); 902656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project } 903656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project else if (operation == SMIME_DIGEST_CREATE) 904656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project { 905656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project cms = CMS_digest_create(in, sign_md, flags); 906656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project } 907656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project else if (operation == SMIME_COMPRESS) 908656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project { 909656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project cms = CMS_compress(in, -1, flags); 910656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project } 911656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project else if (operation == SMIME_ENCRYPT) 912656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project { 913656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project flags |= CMS_PARTIAL; 914656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project cms = CMS_encrypt(encerts, in, cipher, flags); 915656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project if (!cms) 916656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project goto end; 917656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project if (secret_key) 918656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project { 919656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project if (!CMS_add0_recipient_key(cms, NID_undef, 920656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project secret_key, secret_keylen, 921656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project secret_keyid, secret_keyidlen, 922656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project NULL, NULL, NULL)) 923656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project goto end; 924656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project /* NULL these because call absorbs them */ 925656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project secret_key = NULL; 926656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project secret_keyid = NULL; 927656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project } 928392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom if (pwri_pass) 929392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom { 930392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom pwri_tmp = (unsigned char *)BUF_strdup((char *)pwri_pass); 931392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom if (!pwri_tmp) 932392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom goto end; 933392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom if (!CMS_add0_recipient_password(cms, 934392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom -1, NID_undef, NID_undef, 935392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom pwri_tmp, -1, NULL)) 936392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom goto end; 937392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom pwri_tmp = NULL; 938392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom } 939656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project if (!(flags & CMS_STREAM)) 940656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project { 941656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project if (!CMS_final(cms, in, NULL, flags)) 942656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project goto end; 943656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project } 944656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project } 945656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project else if (operation == SMIME_ENCRYPTED_ENCRYPT) 946656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project { 947656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project cms = CMS_EncryptedData_encrypt(in, cipher, 948656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project secret_key, secret_keylen, 949656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project flags); 950656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 951656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project } 952656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project else if (operation == SMIME_SIGN_RECEIPT) 953656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project { 954656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project CMS_ContentInfo *srcms = NULL; 955656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project STACK_OF(CMS_SignerInfo) *sis; 956656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project CMS_SignerInfo *si; 957656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project sis = CMS_get0_SignerInfos(cms); 958656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project if (!sis) 959656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project goto end; 960656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project si = sk_CMS_SignerInfo_value(sis, 0); 961656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project srcms = CMS_sign_receipt(si, signer, key, other, flags); 962656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project if (!srcms) 963656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project goto end; 964656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project CMS_ContentInfo_free(cms); 965656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project cms = srcms; 966656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project } 967656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project else if (operation & SMIME_SIGNERS) 968656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project { 969656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project int i; 970656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project /* If detached data content we enable streaming if 971656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * S/MIME output format. 972656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project */ 973656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project if (operation == SMIME_SIGN) 974656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project { 975656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 976656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project if (flags & CMS_DETACHED) 977656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project { 978656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project if (outformat == FORMAT_SMIME) 979656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project flags |= CMS_STREAM; 980656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project } 981656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project flags |= CMS_PARTIAL; 982656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project cms = CMS_sign(NULL, NULL, other, in, flags); 983656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project if (!cms) 984656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project goto end; 985656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project if (econtent_type) 986656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project CMS_set1_eContentType(cms, econtent_type); 987656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 988656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project if (rr_to) 989656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project { 990656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project rr = make_receipt_request(rr_to, rr_allorfirst, 991656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project rr_from); 992656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project if (!rr) 993656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project { 994656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project BIO_puts(bio_err, 995656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project "Signed Receipt Request Creation Error\n"); 996656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project goto end; 997656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project } 998656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project } 999656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project } 1000656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project else 1001656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project flags |= CMS_REUSE_DIGEST; 1002221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom for (i = 0; i < sk_OPENSSL_STRING_num(sksigners); i++) 1003656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project { 1004656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project CMS_SignerInfo *si; 1005221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom signerfile = sk_OPENSSL_STRING_value(sksigners, i); 1006221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom keyfile = sk_OPENSSL_STRING_value(skkeys, i); 1007656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project signer = load_cert(bio_err, signerfile,FORMAT_PEM, NULL, 1008656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project e, "signer certificate"); 1009656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project if (!signer) 1010656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project goto end; 1011656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project key = load_key(bio_err, keyfile, keyform, 0, passin, e, 1012656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project "signing key file"); 1013656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project if (!key) 1014656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project goto end; 1015656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project si = CMS_add1_signer(cms, signer, key, sign_md, flags); 1016656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project if (!si) 1017656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project goto end; 1018656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project if (rr && !CMS_add1_ReceiptRequest(si, rr)) 1019656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project goto end; 1020656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project X509_free(signer); 1021656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project signer = NULL; 1022656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project EVP_PKEY_free(key); 1023656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project key = NULL; 1024656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project } 1025656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project /* If not streaming or resigning finalize structure */ 1026656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project if ((operation == SMIME_SIGN) && !(flags & CMS_STREAM)) 1027656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project { 1028656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project if (!CMS_final(cms, in, NULL, flags)) 1029656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project goto end; 1030656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project } 1031656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project } 1032656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 1033656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project if (!cms) 1034656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project { 1035656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project BIO_printf(bio_err, "Error creating CMS structure\n"); 1036656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project goto end; 1037656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project } 1038656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 1039656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project ret = 4; 1040656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project if (operation == SMIME_DECRYPT) 1041656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project { 1042656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 1043656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project if (secret_key) 1044656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project { 1045656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project if (!CMS_decrypt_set1_key(cms, 1046656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project secret_key, secret_keylen, 1047656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project secret_keyid, secret_keyidlen)) 1048656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project { 1049656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project BIO_puts(bio_err, 1050656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project "Error decrypting CMS using secret key\n"); 1051656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project goto end; 1052656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project } 1053656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project } 1054656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 1055656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project if (key) 1056656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project { 1057656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project if (!CMS_decrypt_set1_pkey(cms, key, recip)) 1058656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project { 1059656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project BIO_puts(bio_err, 1060656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project "Error decrypting CMS using private key\n"); 1061656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project goto end; 1062656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project } 1063656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project } 1064656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 1065392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom if (pwri_pass) 1066392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom { 1067392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom if (!CMS_decrypt_set1_password(cms, pwri_pass, -1)) 1068392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom { 1069392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom BIO_puts(bio_err, 1070392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom "Error decrypting CMS using password\n"); 1071392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom goto end; 1072392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom } 1073392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom } 1074392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom 1075656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project if (!CMS_decrypt(cms, NULL, NULL, indata, out, flags)) 1076656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project { 1077656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project BIO_printf(bio_err, "Error decrypting CMS structure\n"); 1078656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project goto end; 1079656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project } 1080656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project } 1081656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project else if (operation == SMIME_DATAOUT) 1082656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project { 1083656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project if (!CMS_data(cms, out, flags)) 1084656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project goto end; 1085656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project } 1086656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project else if (operation == SMIME_UNCOMPRESS) 1087656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project { 1088656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project if (!CMS_uncompress(cms, indata, out, flags)) 1089656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project goto end; 1090656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project } 1091656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project else if (operation == SMIME_DIGEST_VERIFY) 1092656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project { 1093656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project if (CMS_digest_verify(cms, indata, out, flags) > 0) 1094656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project BIO_printf(bio_err, "Verification successful\n"); 1095656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project else 1096656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project { 1097656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project BIO_printf(bio_err, "Verification failure\n"); 1098656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project goto end; 1099656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project } 1100656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project } 1101656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project else if (operation == SMIME_ENCRYPTED_DECRYPT) 1102656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project { 1103656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project if (!CMS_EncryptedData_decrypt(cms, secret_key, secret_keylen, 1104656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project indata, out, flags)) 1105656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project goto end; 1106656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project } 1107656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project else if (operation == SMIME_VERIFY) 1108656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project { 1109656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project if (CMS_verify(cms, other, store, indata, out, flags) > 0) 1110656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project BIO_printf(bio_err, "Verification successful\n"); 1111656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project else 1112656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project { 1113656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project BIO_printf(bio_err, "Verification failure\n"); 1114221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom if (verify_retcode) 1115221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom ret = verify_err + 32; 1116656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project goto end; 1117656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project } 1118656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project if (signerfile) 1119656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project { 1120656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project STACK_OF(X509) *signers; 1121656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project signers = CMS_get0_signers(cms); 1122656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project if (!save_certs(signerfile, signers)) 1123656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project { 1124656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project BIO_printf(bio_err, 1125656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project "Error writing signers to %s\n", 1126656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project signerfile); 1127656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project ret = 5; 1128656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project goto end; 1129656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project } 1130656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project sk_X509_free(signers); 1131656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project } 1132656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project if (rr_print) 1133656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project receipt_request_print(bio_err, cms); 1134656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 1135656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project } 1136656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project else if (operation == SMIME_VERIFY_RECEIPT) 1137656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project { 1138656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project if (CMS_verify_receipt(rcms, cms, other, store, flags) > 0) 1139656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project BIO_printf(bio_err, "Verification successful\n"); 1140656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project else 1141656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project { 1142656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project BIO_printf(bio_err, "Verification failure\n"); 1143656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project goto end; 1144656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project } 1145656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project } 1146656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project else 1147656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project { 1148221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom if (noout) 1149221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom { 1150221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom if (print) 1151221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom CMS_ContentInfo_print_ctx(out, cms, 0, NULL); 1152221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom } 1153221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom else if (outformat == FORMAT_SMIME) 1154656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project { 1155656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project if (to) 1156656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project BIO_printf(out, "To: %s\n", to); 1157656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project if (from) 1158656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project BIO_printf(out, "From: %s\n", from); 1159656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project if (subject) 1160656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project BIO_printf(out, "Subject: %s\n", subject); 1161656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project if (operation == SMIME_RESIGN) 1162656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project ret = SMIME_write_CMS(out, cms, indata, flags); 1163656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project else 1164656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project ret = SMIME_write_CMS(out, cms, in, flags); 1165656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project } 1166656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project else if (outformat == FORMAT_PEM) 1167221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom ret = PEM_write_bio_CMS_stream(out, cms, in, flags); 1168656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project else if (outformat == FORMAT_ASN1) 1169221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom ret = i2d_CMS_bio_stream(out,cms, in, flags); 1170656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project else 1171656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project { 1172656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project BIO_printf(bio_err, "Bad output format for CMS file\n"); 1173656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project goto end; 1174656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project } 1175656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project if (ret <= 0) 1176656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project { 1177656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project ret = 6; 1178656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project goto end; 1179656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project } 1180656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project } 1181656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project ret = 0; 1182656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Projectend: 1183656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project if (ret) 1184656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project ERR_print_errors(bio_err); 1185656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project if (need_rand) 1186656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project app_RAND_write_file(NULL, bio_err); 1187656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project sk_X509_pop_free(encerts, X509_free); 1188656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project sk_X509_pop_free(other, X509_free); 1189656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project if (vpm) 1190656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project X509_VERIFY_PARAM_free(vpm); 1191656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project if (sksigners) 1192221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom sk_OPENSSL_STRING_free(sksigners); 1193656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project if (skkeys) 1194221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom sk_OPENSSL_STRING_free(skkeys); 1195656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project if (secret_key) 1196656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project OPENSSL_free(secret_key); 1197656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project if (secret_keyid) 1198656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project OPENSSL_free(secret_keyid); 1199392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom if (pwri_tmp) 1200392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom OPENSSL_free(pwri_tmp); 1201656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project if (econtent_type) 1202656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project ASN1_OBJECT_free(econtent_type); 1203656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project if (rr) 1204656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project CMS_ReceiptRequest_free(rr); 1205656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project if (rr_to) 1206221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom sk_OPENSSL_STRING_free(rr_to); 1207656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project if (rr_from) 1208221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom sk_OPENSSL_STRING_free(rr_from); 1209656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project X509_STORE_free(store); 1210656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project X509_free(cert); 1211656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project X509_free(recip); 1212656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project X509_free(signer); 1213656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project EVP_PKEY_free(key); 1214656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project CMS_ContentInfo_free(cms); 1215656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project CMS_ContentInfo_free(rcms); 1216656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project BIO_free(rctin); 1217656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project BIO_free(in); 1218656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project BIO_free(indata); 1219656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project BIO_free_all(out); 1220656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project if (passin) OPENSSL_free(passin); 1221656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project return (ret); 1222656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project} 1223656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 1224656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Projectstatic int save_certs(char *signerfile, STACK_OF(X509) *signers) 1225656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project { 1226656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project int i; 1227656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project BIO *tmp; 1228656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project if (!signerfile) 1229656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project return 1; 1230656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project tmp = BIO_new_file(signerfile, "w"); 1231656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project if (!tmp) return 0; 1232656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project for(i = 0; i < sk_X509_num(signers); i++) 1233656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project PEM_write_bio_X509(tmp, sk_X509_value(signers, i)); 1234656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project BIO_free(tmp); 1235656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project return 1; 1236656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project } 1237656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 1238656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 1239656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project/* Minimal callback just to output policy info (if any) */ 1240656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 1241656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Projectstatic int cms_cb(int ok, X509_STORE_CTX *ctx) 1242656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project { 1243656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project int error; 1244656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 1245656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project error = X509_STORE_CTX_get_error(ctx); 1246656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 1247221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom verify_err = error; 1248221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom 1249656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project if ((error != X509_V_ERR_NO_EXPLICIT_POLICY) 1250656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project && ((error != X509_V_OK) || (ok != 2))) 1251656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project return ok; 1252656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 1253656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project policies_print(NULL, ctx); 1254656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 1255656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project return ok; 1256656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 1257656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project } 1258656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 1259656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Projectstatic void gnames_stack_print(BIO *out, STACK_OF(GENERAL_NAMES) *gns) 1260656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project { 1261656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project STACK_OF(GENERAL_NAME) *gens; 1262656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project GENERAL_NAME *gen; 1263656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project int i, j; 1264656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project for (i = 0; i < sk_GENERAL_NAMES_num(gns); i++) 1265656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project { 1266656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project gens = sk_GENERAL_NAMES_value(gns, i); 1267656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project for (j = 0; j < sk_GENERAL_NAME_num(gens); j++) 1268656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project { 1269656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project gen = sk_GENERAL_NAME_value(gens, j); 1270656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project BIO_puts(out, " "); 1271656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project GENERAL_NAME_print(out, gen); 1272656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project BIO_puts(out, "\n"); 1273656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project } 1274656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project } 1275656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project return; 1276656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project } 1277656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 1278656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Projectstatic void receipt_request_print(BIO *out, CMS_ContentInfo *cms) 1279656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project { 1280656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project STACK_OF(CMS_SignerInfo) *sis; 1281656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project CMS_SignerInfo *si; 1282656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project CMS_ReceiptRequest *rr; 1283656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project int allorfirst; 1284656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project STACK_OF(GENERAL_NAMES) *rto, *rlist; 1285656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project ASN1_STRING *scid; 1286656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project int i, rv; 1287656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project sis = CMS_get0_SignerInfos(cms); 1288656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project for (i = 0; i < sk_CMS_SignerInfo_num(sis); i++) 1289656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project { 1290656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project si = sk_CMS_SignerInfo_value(sis, i); 1291656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project rv = CMS_get1_ReceiptRequest(si, &rr); 1292656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project BIO_printf(bio_err, "Signer %d:\n", i + 1); 1293656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project if (rv == 0) 1294656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project BIO_puts(bio_err, " No Receipt Request\n"); 1295656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project else if (rv < 0) 1296656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project { 1297656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project BIO_puts(bio_err, " Receipt Request Parse Error\n"); 1298656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project ERR_print_errors(bio_err); 1299656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project } 1300656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project else 1301656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project { 1302656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project char *id; 1303656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project int idlen; 1304656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project CMS_ReceiptRequest_get0_values(rr, &scid, &allorfirst, 1305656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project &rlist, &rto); 1306656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project BIO_puts(out, " Signed Content ID:\n"); 1307656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project idlen = ASN1_STRING_length(scid); 1308656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project id = (char *)ASN1_STRING_data(scid); 1309656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project BIO_dump_indent(out, id, idlen, 4); 1310656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project BIO_puts(out, " Receipts From"); 1311656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project if (rlist) 1312656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project { 1313656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project BIO_puts(out, " List:\n"); 1314656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project gnames_stack_print(out, rlist); 1315656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project } 1316656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project else if (allorfirst == 1) 1317656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project BIO_puts(out, ": First Tier\n"); 1318656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project else if (allorfirst == 0) 1319656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project BIO_puts(out, ": All\n"); 1320656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project else 1321656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project BIO_printf(out, " Unknown (%d)\n", allorfirst); 1322656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project BIO_puts(out, " Receipts To:\n"); 1323656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project gnames_stack_print(out, rto); 1324656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project } 1325656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project if (rr) 1326656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project CMS_ReceiptRequest_free(rr); 1327656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project } 1328656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project } 1329656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 1330221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstromstatic STACK_OF(GENERAL_NAMES) *make_names_stack(STACK_OF(OPENSSL_STRING) *ns) 1331656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project { 1332656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project int i; 1333656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project STACK_OF(GENERAL_NAMES) *ret; 1334656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project GENERAL_NAMES *gens = NULL; 1335656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project GENERAL_NAME *gen = NULL; 1336656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project ret = sk_GENERAL_NAMES_new_null(); 1337656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project if (!ret) 1338656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project goto err; 1339221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom for (i = 0; i < sk_OPENSSL_STRING_num(ns); i++) 1340656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project { 1341221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom char *str = sk_OPENSSL_STRING_value(ns, i); 1342221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom gen = a2i_GENERAL_NAME(NULL, NULL, NULL, GEN_EMAIL, str, 0); 1343656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project if (!gen) 1344656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project goto err; 1345656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project gens = GENERAL_NAMES_new(); 1346656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project if (!gens) 1347656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project goto err; 1348656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project if (!sk_GENERAL_NAME_push(gens, gen)) 1349656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project goto err; 1350656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project gen = NULL; 1351656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project if (!sk_GENERAL_NAMES_push(ret, gens)) 1352656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project goto err; 1353656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project gens = NULL; 1354656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project } 1355656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 1356656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project return ret; 1357656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 1358656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project err: 1359656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project if (ret) 1360656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project sk_GENERAL_NAMES_pop_free(ret, GENERAL_NAMES_free); 1361656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project if (gens) 1362656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project GENERAL_NAMES_free(gens); 1363656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project if (gen) 1364656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project GENERAL_NAME_free(gen); 1365656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project return NULL; 1366656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project } 1367656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 1368656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 1369221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstromstatic CMS_ReceiptRequest *make_receipt_request(STACK_OF(OPENSSL_STRING) *rr_to, 1370221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom int rr_allorfirst, 1371221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom STACK_OF(OPENSSL_STRING) *rr_from) 1372656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project { 1373656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project STACK_OF(GENERAL_NAMES) *rct_to, *rct_from; 1374656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project CMS_ReceiptRequest *rr; 1375656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project rct_to = make_names_stack(rr_to); 1376656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project if (!rct_to) 1377656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project goto err; 1378656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project if (rr_from) 1379656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project { 1380656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project rct_from = make_names_stack(rr_from); 1381656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project if (!rct_from) 1382656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project goto err; 1383656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project } 1384656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project else 1385656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project rct_from = NULL; 1386656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project rr = CMS_ReceiptRequest_create0(NULL, -1, rr_allorfirst, rct_from, 1387656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project rct_to); 1388656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project return rr; 1389656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project err: 1390656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project return NULL; 1391656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project } 1392656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 1393656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#endif 1394