cms.c revision 221304ee937bc0910948a8be1320cb8cc4eb6d36
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; 139656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project size_t secret_keylen = 0, secret_keyidlen = 0; 140656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 141656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project ASN1_OBJECT *econtent_type = NULL; 142656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 143656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project X509_VERIFY_PARAM *vpm = NULL; 144656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 145656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project args = argv + 1; 146656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project ret = 1; 147656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 148656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project apps_startup(); 149656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 150656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project if (bio_err == NULL) 151656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project { 152656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project if ((bio_err = BIO_new(BIO_s_file())) != NULL) 153656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project BIO_set_fp(bio_err, stderr, BIO_NOCLOSE|BIO_FP_TEXT); 154656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project } 155656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 156656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project if (!load_config(bio_err, NULL)) 157656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project goto end; 158656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 159656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project while (!badarg && *args && *args[0] == '-') 160656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project { 161656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project if (!strcmp (*args, "-encrypt")) 162656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project operation = SMIME_ENCRYPT; 163656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project else if (!strcmp (*args, "-decrypt")) 164656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project operation = SMIME_DECRYPT; 165656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project else if (!strcmp (*args, "-sign")) 166656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project operation = SMIME_SIGN; 167656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project else if (!strcmp (*args, "-sign_receipt")) 168656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project operation = SMIME_SIGN_RECEIPT; 169656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project else if (!strcmp (*args, "-resign")) 170656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project operation = SMIME_RESIGN; 171656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project else if (!strcmp (*args, "-verify")) 172656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project operation = SMIME_VERIFY; 173221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom else if (!strcmp (*args, "-verify_retcode")) 174221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom verify_retcode = 1; 175656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project else if (!strcmp(*args,"-verify_receipt")) 176656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project { 177656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project operation = SMIME_VERIFY_RECEIPT; 178656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project if (!args[1]) 179656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project goto argerr; 180656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project args++; 181656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project rctfile = *args; 182656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project } 183656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project else if (!strcmp (*args, "-cmsout")) 184656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project operation = SMIME_CMSOUT; 185656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project else if (!strcmp (*args, "-data_out")) 186656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project operation = SMIME_DATAOUT; 187656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project else if (!strcmp (*args, "-data_create")) 188656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project operation = SMIME_DATA_CREATE; 189656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project else if (!strcmp (*args, "-digest_verify")) 190656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project operation = SMIME_DIGEST_VERIFY; 191656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project else if (!strcmp (*args, "-digest_create")) 192656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project operation = SMIME_DIGEST_CREATE; 193656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project else if (!strcmp (*args, "-compress")) 194656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project operation = SMIME_COMPRESS; 195656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project else if (!strcmp (*args, "-uncompress")) 196656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project operation = SMIME_UNCOMPRESS; 197656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project else if (!strcmp (*args, "-EncryptedData_decrypt")) 198656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project operation = SMIME_ENCRYPTED_DECRYPT; 199656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project else if (!strcmp (*args, "-EncryptedData_encrypt")) 200656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project operation = SMIME_ENCRYPTED_ENCRYPT; 201656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#ifndef OPENSSL_NO_DES 202656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project else if (!strcmp (*args, "-des3")) 203656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project cipher = EVP_des_ede3_cbc(); 204656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project else if (!strcmp (*args, "-des")) 205656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project cipher = EVP_des_cbc(); 206656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#endif 207656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#ifndef OPENSSL_NO_SEED 208656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project else if (!strcmp (*args, "-seed")) 209656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project cipher = EVP_seed_cbc(); 210656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#endif 211656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#ifndef OPENSSL_NO_RC2 212656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project else if (!strcmp (*args, "-rc2-40")) 213656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project cipher = EVP_rc2_40_cbc(); 214656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project else if (!strcmp (*args, "-rc2-128")) 215656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project cipher = EVP_rc2_cbc(); 216656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project else if (!strcmp (*args, "-rc2-64")) 217656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project cipher = EVP_rc2_64_cbc(); 218656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#endif 219656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#ifndef OPENSSL_NO_AES 220656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project else if (!strcmp(*args,"-aes128")) 221656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project cipher = EVP_aes_128_cbc(); 222656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project else if (!strcmp(*args,"-aes192")) 223656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project cipher = EVP_aes_192_cbc(); 224656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project else if (!strcmp(*args,"-aes256")) 225656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project cipher = EVP_aes_256_cbc(); 226656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#endif 227656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#ifndef OPENSSL_NO_CAMELLIA 228656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project else if (!strcmp(*args,"-camellia128")) 229656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project cipher = EVP_camellia_128_cbc(); 230656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project else if (!strcmp(*args,"-camellia192")) 231656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project cipher = EVP_camellia_192_cbc(); 232656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project else if (!strcmp(*args,"-camellia256")) 233656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project cipher = EVP_camellia_256_cbc(); 234656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#endif 235656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project else if (!strcmp (*args, "-text")) 236656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project flags |= CMS_TEXT; 237656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project else if (!strcmp (*args, "-nointern")) 238656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project flags |= CMS_NOINTERN; 239656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project else if (!strcmp (*args, "-noverify") 240656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project || !strcmp (*args, "-no_signer_cert_verify")) 241656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project flags |= CMS_NO_SIGNER_CERT_VERIFY; 242656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project else if (!strcmp (*args, "-nocerts")) 243656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project flags |= CMS_NOCERTS; 244656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project else if (!strcmp (*args, "-noattr")) 245656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project flags |= CMS_NOATTR; 246656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project else if (!strcmp (*args, "-nodetach")) 247656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project flags &= ~CMS_DETACHED; 248656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project else if (!strcmp (*args, "-nosmimecap")) 249656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project flags |= CMS_NOSMIMECAP; 250656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project else if (!strcmp (*args, "-binary")) 251656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project flags |= CMS_BINARY; 252656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project else if (!strcmp (*args, "-keyid")) 253656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project flags |= CMS_USE_KEYID; 254656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project else if (!strcmp (*args, "-nosigs")) 255656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project flags |= CMS_NOSIGS; 256656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project else if (!strcmp (*args, "-no_content_verify")) 257656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project flags |= CMS_NO_CONTENT_VERIFY; 258656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project else if (!strcmp (*args, "-no_attr_verify")) 259656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project flags |= CMS_NO_ATTR_VERIFY; 260656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project else if (!strcmp (*args, "-stream")) 261221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom flags |= CMS_STREAM; 262656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project else if (!strcmp (*args, "-indef")) 263221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom flags |= CMS_STREAM; 264656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project else if (!strcmp (*args, "-noindef")) 265656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project flags &= ~CMS_STREAM; 266656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project else if (!strcmp (*args, "-nooldmime")) 267656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project flags |= CMS_NOOLDMIMETYPE; 268656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project else if (!strcmp (*args, "-crlfeol")) 269656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project flags |= CMS_CRLFEOL; 270221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom else if (!strcmp (*args, "-noout")) 271221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom noout = 1; 272656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project else if (!strcmp (*args, "-receipt_request_print")) 273656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project rr_print = 1; 274656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project else if (!strcmp (*args, "-receipt_request_all")) 275656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project rr_allorfirst = 0; 276656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project else if (!strcmp (*args, "-receipt_request_first")) 277656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project rr_allorfirst = 1; 278656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project else if (!strcmp(*args,"-receipt_request_from")) 279656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project { 280656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project if (!args[1]) 281656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project goto argerr; 282656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project args++; 283656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project if (!rr_from) 284221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom rr_from = sk_OPENSSL_STRING_new_null(); 285221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom sk_OPENSSL_STRING_push(rr_from, *args); 286656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project } 287656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project else if (!strcmp(*args,"-receipt_request_to")) 288656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project { 289656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project if (!args[1]) 290656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project goto argerr; 291656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project args++; 292656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project if (!rr_to) 293221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom rr_to = sk_OPENSSL_STRING_new_null(); 294221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom sk_OPENSSL_STRING_push(rr_to, *args); 295656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project } 296221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom else if (!strcmp (*args, "-print")) 297221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom { 298221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom noout = 1; 299221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom print = 1; 300221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom } 301656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project else if (!strcmp(*args,"-secretkey")) 302656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project { 303656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project long ltmp; 304656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project if (!args[1]) 305656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project goto argerr; 306656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project args++; 307656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project secret_key = string_to_hex(*args, <mp); 308656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project if (!secret_key) 309656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project { 310656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project BIO_printf(bio_err, "Invalid key %s\n", *args); 311656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project goto argerr; 312656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project } 313656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project secret_keylen = (size_t)ltmp; 314656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project } 315656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project else if (!strcmp(*args,"-secretkeyid")) 316656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project { 317656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project long ltmp; 318656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project if (!args[1]) 319656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project goto argerr; 320656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project args++; 321656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project secret_keyid = string_to_hex(*args, <mp); 322656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project if (!secret_keyid) 323656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project { 324656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project BIO_printf(bio_err, "Invalid id %s\n", *args); 325656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project goto argerr; 326656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project } 327656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project secret_keyidlen = (size_t)ltmp; 328656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project } 329656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project else if (!strcmp(*args,"-econtent_type")) 330656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project { 331656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project if (!args[1]) 332656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project goto argerr; 333656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project args++; 334656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project econtent_type = OBJ_txt2obj(*args, 0); 335656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project if (!econtent_type) 336656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project { 337656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project BIO_printf(bio_err, "Invalid OID %s\n", *args); 338656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project goto argerr; 339656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project } 340656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project } 341656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project else if (!strcmp(*args,"-rand")) 342656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project { 343656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project if (!args[1]) 344656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project goto argerr; 345656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project args++; 346656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project inrand = *args; 347656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project need_rand = 1; 348656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project } 349656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#ifndef OPENSSL_NO_ENGINE 350656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project else if (!strcmp(*args,"-engine")) 351656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project { 352656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project if (!args[1]) 353656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project goto argerr; 354656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project engine = *++args; 355656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project } 356656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#endif 357656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project else if (!strcmp(*args,"-passin")) 358656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project { 359656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project if (!args[1]) 360656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project goto argerr; 361656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project passargin = *++args; 362656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project } 363656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project else if (!strcmp (*args, "-to")) 364656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project { 365656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project if (!args[1]) 366656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project goto argerr; 367656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project to = *++args; 368656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project } 369656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project else if (!strcmp (*args, "-from")) 370656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project { 371656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project if (!args[1]) 372656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project goto argerr; 373656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project from = *++args; 374656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project } 375656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project else if (!strcmp (*args, "-subject")) 376656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project { 377656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project if (!args[1]) 378656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project goto argerr; 379656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project subject = *++args; 380656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project } 381656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project else if (!strcmp (*args, "-signer")) 382656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project { 383656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project if (!args[1]) 384656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project goto argerr; 385656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project /* If previous -signer argument add signer to list */ 386656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 387656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project if (signerfile) 388656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project { 389656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project if (!sksigners) 390221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom sksigners = sk_OPENSSL_STRING_new_null(); 391221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom sk_OPENSSL_STRING_push(sksigners, signerfile); 392656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project if (!keyfile) 393656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project keyfile = signerfile; 394656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project if (!skkeys) 395221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom skkeys = sk_OPENSSL_STRING_new_null(); 396221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom sk_OPENSSL_STRING_push(skkeys, keyfile); 397656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project keyfile = NULL; 398656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project } 399656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project signerfile = *++args; 400656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project } 401656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project else if (!strcmp (*args, "-recip")) 402656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project { 403656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project if (!args[1]) 404656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project goto argerr; 405656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project recipfile = *++args; 406656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project } 407656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project else if (!strcmp (*args, "-certsout")) 408656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project { 409656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project if (!args[1]) 410656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project goto argerr; 411656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project certsoutfile = *++args; 412656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project } 413656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project else if (!strcmp (*args, "-md")) 414656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project { 415656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project if (!args[1]) 416656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project goto argerr; 417656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project sign_md = EVP_get_digestbyname(*++args); 418656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project if (sign_md == NULL) 419656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project { 420656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project BIO_printf(bio_err, "Unknown digest %s\n", 421656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project *args); 422656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project goto argerr; 423656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project } 424656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project } 425656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project else if (!strcmp (*args, "-inkey")) 426656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project { 427656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project if (!args[1]) 428656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project goto argerr; 429656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project /* If previous -inkey arument add signer to list */ 430656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project if (keyfile) 431656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project { 432656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project if (!signerfile) 433656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project { 434656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project BIO_puts(bio_err, "Illegal -inkey without -signer\n"); 435656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project goto argerr; 436656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project } 437656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project if (!sksigners) 438221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom sksigners = sk_OPENSSL_STRING_new_null(); 439221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom sk_OPENSSL_STRING_push(sksigners, signerfile); 440656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project signerfile = NULL; 441656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project if (!skkeys) 442221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom skkeys = sk_OPENSSL_STRING_new_null(); 443221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom sk_OPENSSL_STRING_push(skkeys, keyfile); 444656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project } 445656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project keyfile = *++args; 446656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project } 447656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project else if (!strcmp (*args, "-keyform")) 448656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project { 449656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project if (!args[1]) 450656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project goto argerr; 451656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project keyform = str2fmt(*++args); 452656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project } 453656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project else if (!strcmp (*args, "-rctform")) 454656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project { 455656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project if (!args[1]) 456656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project goto argerr; 457656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project rctformat = str2fmt(*++args); 458656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project } 459656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project else if (!strcmp (*args, "-certfile")) 460656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project { 461656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project if (!args[1]) 462656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project goto argerr; 463656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project certfile = *++args; 464656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project } 465656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project else if (!strcmp (*args, "-CAfile")) 466656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project { 467656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project if (!args[1]) 468656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project goto argerr; 469656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project CAfile = *++args; 470656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project } 471656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project else if (!strcmp (*args, "-CApath")) 472656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project { 473656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project if (!args[1]) 474656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project goto argerr; 475656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project CApath = *++args; 476656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project } 477656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project else if (!strcmp (*args, "-in")) 478656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project { 479656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project if (!args[1]) 480656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project goto argerr; 481656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project infile = *++args; 482656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project } 483656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project else if (!strcmp (*args, "-inform")) 484656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project { 485656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project if (!args[1]) 486656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project goto argerr; 487656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project informat = str2fmt(*++args); 488656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project } 489656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project else if (!strcmp (*args, "-outform")) 490656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project { 491656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project if (!args[1]) 492656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project goto argerr; 493656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project outformat = str2fmt(*++args); 494656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project } 495656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project else if (!strcmp (*args, "-out")) 496656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project { 497656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project if (!args[1]) 498656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project goto argerr; 499656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project outfile = *++args; 500656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project } 501656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project else if (!strcmp (*args, "-content")) 502656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project { 503656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project if (!args[1]) 504656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project goto argerr; 505656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project contfile = *++args; 506656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project } 507656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project else if (args_verify(&args, NULL, &badarg, bio_err, &vpm)) 508656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project continue; 509656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project else if ((cipher = EVP_get_cipherbyname(*args + 1)) == NULL) 510656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project badarg = 1; 511656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project args++; 512656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project } 513656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 514656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project if (((rr_allorfirst != -1) || rr_from) && !rr_to) 515656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project { 516656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project BIO_puts(bio_err, "No Signed Receipts Recipients\n"); 517656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project goto argerr; 518656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project } 519656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 520656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project if (!(operation & SMIME_SIGNERS) && (rr_to || rr_from)) 521656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project { 522656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project BIO_puts(bio_err, "Signed receipts only allowed with -sign\n"); 523656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project goto argerr; 524656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project } 525656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project if (!(operation & SMIME_SIGNERS) && (skkeys || sksigners)) 526656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project { 527656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project BIO_puts(bio_err, "Multiple signers or keys not allowed\n"); 528656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project goto argerr; 529656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project } 530656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 531656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project if (operation & SMIME_SIGNERS) 532656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project { 533656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project if (keyfile && !signerfile) 534656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project { 535656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project BIO_puts(bio_err, "Illegal -inkey without -signer\n"); 536656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project goto argerr; 537656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project } 538656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project /* Check to see if any final signer needs to be appended */ 539656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project if (signerfile) 540656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project { 541656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project if (!sksigners) 542221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom sksigners = sk_OPENSSL_STRING_new_null(); 543221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom sk_OPENSSL_STRING_push(sksigners, signerfile); 544656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project if (!skkeys) 545221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom skkeys = sk_OPENSSL_STRING_new_null(); 546656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project if (!keyfile) 547656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project keyfile = signerfile; 548221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom sk_OPENSSL_STRING_push(skkeys, keyfile); 549656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project } 550656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project if (!sksigners) 551656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project { 552656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project BIO_printf(bio_err, "No signer certificate specified\n"); 553656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project badarg = 1; 554656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project } 555656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project signerfile = NULL; 556656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project keyfile = NULL; 557656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project need_rand = 1; 558656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project } 559656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 560656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project else if (operation == SMIME_DECRYPT) 561656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project { 562656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project if (!recipfile && !keyfile && !secret_key) 563656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project { 564656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project BIO_printf(bio_err, "No recipient certificate or key specified\n"); 565656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project badarg = 1; 566656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project } 567656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project } 568656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project else if (operation == SMIME_ENCRYPT) 569656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project { 570656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project if (!*args && !secret_key) 571656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project { 572656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project BIO_printf(bio_err, "No recipient(s) certificate(s) specified\n"); 573656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project badarg = 1; 574656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project } 575656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project need_rand = 1; 576656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project } 577656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project else if (!operation) 578656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project badarg = 1; 579656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 580656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project if (badarg) 581656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project { 582656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project argerr: 583656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project BIO_printf (bio_err, "Usage cms [options] cert.pem ...\n"); 584656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project BIO_printf (bio_err, "where options are\n"); 585656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project BIO_printf (bio_err, "-encrypt encrypt message\n"); 586656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project BIO_printf (bio_err, "-decrypt decrypt encrypted message\n"); 587656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project BIO_printf (bio_err, "-sign sign message\n"); 588656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project BIO_printf (bio_err, "-verify verify signed message\n"); 589656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project BIO_printf (bio_err, "-cmsout output CMS structure\n"); 590656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#ifndef OPENSSL_NO_DES 591656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project BIO_printf (bio_err, "-des3 encrypt with triple DES\n"); 592656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project BIO_printf (bio_err, "-des encrypt with DES\n"); 593656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#endif 594656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#ifndef OPENSSL_NO_SEED 595656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project BIO_printf (bio_err, "-seed encrypt with SEED\n"); 596656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#endif 597656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#ifndef OPENSSL_NO_RC2 598656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project BIO_printf (bio_err, "-rc2-40 encrypt with RC2-40 (default)\n"); 599656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project BIO_printf (bio_err, "-rc2-64 encrypt with RC2-64\n"); 600656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project BIO_printf (bio_err, "-rc2-128 encrypt with RC2-128\n"); 601656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#endif 602656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#ifndef OPENSSL_NO_AES 603656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project BIO_printf (bio_err, "-aes128, -aes192, -aes256\n"); 604656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project BIO_printf (bio_err, " encrypt PEM output with cbc aes\n"); 605656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#endif 606656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#ifndef OPENSSL_NO_CAMELLIA 607656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project BIO_printf (bio_err, "-camellia128, -camellia192, -camellia256\n"); 608656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project BIO_printf (bio_err, " encrypt PEM output with cbc camellia\n"); 609656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#endif 610656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project BIO_printf (bio_err, "-nointern don't search certificates in message for signer\n"); 611656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project BIO_printf (bio_err, "-nosigs don't verify message signature\n"); 612656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project BIO_printf (bio_err, "-noverify don't verify signers certificate\n"); 613656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project BIO_printf (bio_err, "-nocerts don't include signers certificate when signing\n"); 614656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project BIO_printf (bio_err, "-nodetach use opaque signing\n"); 615656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project BIO_printf (bio_err, "-noattr don't include any signed attributes\n"); 616656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project BIO_printf (bio_err, "-binary don't translate message to text\n"); 617656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project BIO_printf (bio_err, "-certfile file other certificates file\n"); 618656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project BIO_printf (bio_err, "-certsout file certificate output file\n"); 619656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project BIO_printf (bio_err, "-signer file signer certificate file\n"); 620656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project BIO_printf (bio_err, "-recip file recipient certificate file for decryption\n"); 621656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project BIO_printf (bio_err, "-skeyid use subject key identifier\n"); 622656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project BIO_printf (bio_err, "-in file input file\n"); 623656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project BIO_printf (bio_err, "-inform arg input format SMIME (default), PEM or DER\n"); 624656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project BIO_printf (bio_err, "-inkey file input private key (if not signer or recipient)\n"); 625656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project BIO_printf (bio_err, "-keyform arg input private key format (PEM or ENGINE)\n"); 626656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project BIO_printf (bio_err, "-out file output file\n"); 627656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project BIO_printf (bio_err, "-outform arg output format SMIME (default), PEM or DER\n"); 628656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project BIO_printf (bio_err, "-content file supply or override content for detached signature\n"); 629656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project BIO_printf (bio_err, "-to addr to address\n"); 630656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project BIO_printf (bio_err, "-from ad from address\n"); 631656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project BIO_printf (bio_err, "-subject s subject\n"); 632656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project BIO_printf (bio_err, "-text include or delete text MIME headers\n"); 633656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project BIO_printf (bio_err, "-CApath dir trusted certificates directory\n"); 634656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project BIO_printf (bio_err, "-CAfile file trusted certificates file\n"); 635656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project BIO_printf (bio_err, "-crl_check check revocation status of signer's certificate using CRLs\n"); 636656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project BIO_printf (bio_err, "-crl_check_all check revocation status of signer's certificate chain using CRLs\n"); 637656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#ifndef OPENSSL_NO_ENGINE 638656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project BIO_printf (bio_err, "-engine e use engine e, possibly a hardware device.\n"); 639656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#endif 640656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project BIO_printf (bio_err, "-passin arg input file pass phrase source\n"); 641656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project BIO_printf(bio_err, "-rand file%cfile%c...\n", LIST_SEPARATOR_CHAR, LIST_SEPARATOR_CHAR); 642656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project BIO_printf(bio_err, " load the file (or the files in the directory) into\n"); 643656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project BIO_printf(bio_err, " the random number generator\n"); 644656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project BIO_printf (bio_err, "cert.pem recipient certificate(s) for encryption\n"); 645656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project goto end; 646656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project } 647656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 648656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#ifndef OPENSSL_NO_ENGINE 649656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project e = setup_engine(bio_err, engine, 0); 650656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#endif 651656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 652656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project if (!app_passwd(bio_err, passargin, NULL, &passin, NULL)) 653656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project { 654656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project BIO_printf(bio_err, "Error getting password\n"); 655656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project goto end; 656656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project } 657656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 658656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project if (need_rand) 659656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project { 660656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project app_RAND_load_file(NULL, bio_err, (inrand != NULL)); 661656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project if (inrand != NULL) 662656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project BIO_printf(bio_err,"%ld semi-random bytes loaded\n", 663656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project app_RAND_load_files(inrand)); 664656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project } 665656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 666656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project ret = 2; 667656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 668656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project if (!(operation & SMIME_SIGNERS)) 669656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project flags &= ~CMS_DETACHED; 670656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 671656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project if (operation & SMIME_OP) 672656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project { 673656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project if (outformat == FORMAT_ASN1) 674656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project outmode = "wb"; 675656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project } 676656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project else 677656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project { 678656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project if (flags & CMS_BINARY) 679656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project outmode = "wb"; 680656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project } 681656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 682656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project if (operation & SMIME_IP) 683656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project { 684656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project if (informat == FORMAT_ASN1) 685656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project inmode = "rb"; 686656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project } 687656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project else 688656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project { 689656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project if (flags & CMS_BINARY) 690656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project inmode = "rb"; 691656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project } 692656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 693656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project if (operation == SMIME_ENCRYPT) 694656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project { 695656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project if (!cipher) 696656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project { 697656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#ifndef OPENSSL_NO_DES 698656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project cipher = EVP_des_ede3_cbc(); 699656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#else 700656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project BIO_printf(bio_err, "No cipher selected\n"); 701656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project goto end; 702656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#endif 703656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project } 704656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 705656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project if (secret_key && !secret_keyid) 706656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project { 707221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom BIO_printf(bio_err, "No secret key id\n"); 708656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project goto end; 709656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project } 710656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 711656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project if (*args) 712656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project encerts = sk_X509_new_null(); 713656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project while (*args) 714656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project { 715656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project if (!(cert = load_cert(bio_err,*args,FORMAT_PEM, 716656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project NULL, e, "recipient certificate file"))) 717656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project goto end; 718656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project sk_X509_push(encerts, cert); 719656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project cert = NULL; 720656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project args++; 721656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project } 722656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project } 723656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 724656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project if (certfile) 725656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project { 726656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project if (!(other = load_certs(bio_err,certfile,FORMAT_PEM, NULL, 727656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project e, "certificate file"))) 728656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project { 729656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project ERR_print_errors(bio_err); 730656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project goto end; 731656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project } 732656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project } 733656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 734656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project if (recipfile && (operation == SMIME_DECRYPT)) 735656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project { 736656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project if (!(recip = load_cert(bio_err,recipfile,FORMAT_PEM,NULL, 737656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project e, "recipient certificate file"))) 738656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project { 739656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project ERR_print_errors(bio_err); 740656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project goto end; 741656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project } 742656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project } 743656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 744656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project if (operation == SMIME_SIGN_RECEIPT) 745656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project { 746656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project if (!(signer = load_cert(bio_err,signerfile,FORMAT_PEM,NULL, 747656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project e, "receipt signer certificate file"))) 748656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project { 749656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project ERR_print_errors(bio_err); 750656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project goto end; 751656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project } 752656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project } 753656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 754656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project if (operation == SMIME_DECRYPT) 755656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project { 756656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project if (!keyfile) 757656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project keyfile = recipfile; 758656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project } 759656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project else if ((operation == SMIME_SIGN) || (operation == SMIME_SIGN_RECEIPT)) 760656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project { 761656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project if (!keyfile) 762656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project keyfile = signerfile; 763656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project } 764656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project else keyfile = NULL; 765656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 766656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project if (keyfile) 767656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project { 768656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project key = load_key(bio_err, keyfile, keyform, 0, passin, e, 769656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project "signing key file"); 770656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project if (!key) 771656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project goto end; 772656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project } 773656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 774656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project if (infile) 775656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project { 776656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project if (!(in = BIO_new_file(infile, inmode))) 777656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project { 778656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project BIO_printf (bio_err, 779656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project "Can't open input file %s\n", infile); 780656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project goto end; 781656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project } 782656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project } 783656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project else 784656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project in = BIO_new_fp(stdin, BIO_NOCLOSE); 785656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 786656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project if (operation & SMIME_IP) 787656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project { 788656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project if (informat == FORMAT_SMIME) 789656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project cms = SMIME_read_CMS(in, &indata); 790656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project else if (informat == FORMAT_PEM) 791656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project cms = PEM_read_bio_CMS(in, NULL, NULL, NULL); 792656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project else if (informat == FORMAT_ASN1) 793656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project cms = d2i_CMS_bio(in, NULL); 794656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project else 795656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project { 796656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project BIO_printf(bio_err, "Bad input format for CMS file\n"); 797656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project goto end; 798656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project } 799656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 800656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project if (!cms) 801656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project { 802656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project BIO_printf(bio_err, "Error reading S/MIME message\n"); 803656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project goto end; 804656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project } 805656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project if (contfile) 806656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project { 807656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project BIO_free(indata); 808656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project if (!(indata = BIO_new_file(contfile, "rb"))) 809656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project { 810656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project BIO_printf(bio_err, "Can't read content file %s\n", contfile); 811656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project goto end; 812656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project } 813656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project } 814656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project if (certsoutfile) 815656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project { 816656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project STACK_OF(X509) *allcerts; 817656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project allcerts = CMS_get1_certs(cms); 818656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project if (!save_certs(certsoutfile, allcerts)) 819656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project { 820656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project BIO_printf(bio_err, 821656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project "Error writing certs to %s\n", 822656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project certsoutfile); 823656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project ret = 5; 824656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project goto end; 825656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project } 826656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project sk_X509_pop_free(allcerts, X509_free); 827656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project } 828656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project } 829656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 830656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project if (rctfile) 831656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project { 832656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project char *rctmode = (rctformat == FORMAT_ASN1) ? "rb" : "r"; 833656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project if (!(rctin = BIO_new_file(rctfile, rctmode))) 834656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project { 835656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project BIO_printf (bio_err, 836656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project "Can't open receipt file %s\n", rctfile); 837656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project goto end; 838656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project } 839656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 840656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project if (rctformat == FORMAT_SMIME) 841656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project rcms = SMIME_read_CMS(rctin, NULL); 842656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project else if (rctformat == FORMAT_PEM) 843656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project rcms = PEM_read_bio_CMS(rctin, NULL, NULL, NULL); 844656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project else if (rctformat == FORMAT_ASN1) 845656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project rcms = d2i_CMS_bio(rctin, NULL); 846656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project else 847656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project { 848656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project BIO_printf(bio_err, "Bad input format for receipt\n"); 849656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project goto end; 850656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project } 851656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 852656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project if (!rcms) 853656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project { 854656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project BIO_printf(bio_err, "Error reading receipt\n"); 855656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project goto end; 856656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project } 857656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project } 858656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 859656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project if (outfile) 860656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project { 861656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project if (!(out = BIO_new_file(outfile, outmode))) 862656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project { 863656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project BIO_printf (bio_err, 864656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project "Can't open output file %s\n", outfile); 865656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project goto end; 866656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project } 867656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project } 868656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project else 869656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project { 870656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project out = BIO_new_fp(stdout, BIO_NOCLOSE); 871656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#ifdef OPENSSL_SYS_VMS 872656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project { 873656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project BIO *tmpbio = BIO_new(BIO_f_linebuffer()); 874656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project out = BIO_push(tmpbio, out); 875656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project } 876656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#endif 877656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project } 878656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 879656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project if ((operation == SMIME_VERIFY) || (operation == SMIME_VERIFY_RECEIPT)) 880656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project { 881656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project if (!(store = setup_verify(bio_err, CAfile, CApath))) 882656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project goto end; 883221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom X509_STORE_set_verify_cb(store, cms_cb); 884656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project if (vpm) 885656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project X509_STORE_set1_param(store, vpm); 886656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project } 887656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 888656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 889656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project ret = 3; 890656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 891656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project if (operation == SMIME_DATA_CREATE) 892656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project { 893656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project cms = CMS_data_create(in, flags); 894656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project } 895656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project else if (operation == SMIME_DIGEST_CREATE) 896656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project { 897656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project cms = CMS_digest_create(in, sign_md, flags); 898656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project } 899656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project else if (operation == SMIME_COMPRESS) 900656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project { 901656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project cms = CMS_compress(in, -1, flags); 902656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project } 903656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project else if (operation == SMIME_ENCRYPT) 904656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project { 905656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project flags |= CMS_PARTIAL; 906656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project cms = CMS_encrypt(encerts, in, cipher, flags); 907656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project if (!cms) 908656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project goto end; 909656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project if (secret_key) 910656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project { 911656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project if (!CMS_add0_recipient_key(cms, NID_undef, 912656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project secret_key, secret_keylen, 913656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project secret_keyid, secret_keyidlen, 914656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project NULL, NULL, NULL)) 915656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project goto end; 916656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project /* NULL these because call absorbs them */ 917656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project secret_key = NULL; 918656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project secret_keyid = NULL; 919656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project } 920656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project if (!(flags & CMS_STREAM)) 921656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project { 922656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project if (!CMS_final(cms, in, NULL, flags)) 923656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project goto end; 924656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project } 925656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project } 926656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project else if (operation == SMIME_ENCRYPTED_ENCRYPT) 927656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project { 928656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project cms = CMS_EncryptedData_encrypt(in, cipher, 929656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project secret_key, secret_keylen, 930656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project flags); 931656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 932656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project } 933656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project else if (operation == SMIME_SIGN_RECEIPT) 934656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project { 935656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project CMS_ContentInfo *srcms = NULL; 936656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project STACK_OF(CMS_SignerInfo) *sis; 937656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project CMS_SignerInfo *si; 938656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project sis = CMS_get0_SignerInfos(cms); 939656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project if (!sis) 940656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project goto end; 941656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project si = sk_CMS_SignerInfo_value(sis, 0); 942656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project srcms = CMS_sign_receipt(si, signer, key, other, flags); 943656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project if (!srcms) 944656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project goto end; 945656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project CMS_ContentInfo_free(cms); 946656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project cms = srcms; 947656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project } 948656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project else if (operation & SMIME_SIGNERS) 949656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project { 950656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project int i; 951656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project /* If detached data content we enable streaming if 952656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * S/MIME output format. 953656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project */ 954656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project if (operation == SMIME_SIGN) 955656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project { 956656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 957656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project if (flags & CMS_DETACHED) 958656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project { 959656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project if (outformat == FORMAT_SMIME) 960656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project flags |= CMS_STREAM; 961656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project } 962656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project flags |= CMS_PARTIAL; 963656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project cms = CMS_sign(NULL, NULL, other, in, flags); 964656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project if (!cms) 965656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project goto end; 966656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project if (econtent_type) 967656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project CMS_set1_eContentType(cms, econtent_type); 968656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 969656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project if (rr_to) 970656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project { 971656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project rr = make_receipt_request(rr_to, rr_allorfirst, 972656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project rr_from); 973656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project if (!rr) 974656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project { 975656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project BIO_puts(bio_err, 976656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project "Signed Receipt Request Creation Error\n"); 977656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project goto end; 978656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project } 979656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project } 980656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project } 981656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project else 982656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project flags |= CMS_REUSE_DIGEST; 983221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom for (i = 0; i < sk_OPENSSL_STRING_num(sksigners); i++) 984656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project { 985656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project CMS_SignerInfo *si; 986221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom signerfile = sk_OPENSSL_STRING_value(sksigners, i); 987221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom keyfile = sk_OPENSSL_STRING_value(skkeys, i); 988656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project signer = load_cert(bio_err, signerfile,FORMAT_PEM, NULL, 989656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project e, "signer certificate"); 990656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project if (!signer) 991656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project goto end; 992656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project key = load_key(bio_err, keyfile, keyform, 0, passin, e, 993656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project "signing key file"); 994656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project if (!key) 995656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project goto end; 996656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project si = CMS_add1_signer(cms, signer, key, sign_md, flags); 997656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project if (!si) 998656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project goto end; 999656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project if (rr && !CMS_add1_ReceiptRequest(si, rr)) 1000656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project goto end; 1001656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project X509_free(signer); 1002656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project signer = NULL; 1003656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project EVP_PKEY_free(key); 1004656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project key = NULL; 1005656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project } 1006656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project /* If not streaming or resigning finalize structure */ 1007656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project if ((operation == SMIME_SIGN) && !(flags & CMS_STREAM)) 1008656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project { 1009656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project if (!CMS_final(cms, in, NULL, flags)) 1010656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project goto end; 1011656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project } 1012656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project } 1013656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 1014656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project if (!cms) 1015656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project { 1016656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project BIO_printf(bio_err, "Error creating CMS structure\n"); 1017656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project goto end; 1018656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project } 1019656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 1020656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project ret = 4; 1021656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project if (operation == SMIME_DECRYPT) 1022656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project { 1023656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 1024656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project if (secret_key) 1025656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project { 1026656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project if (!CMS_decrypt_set1_key(cms, 1027656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project secret_key, secret_keylen, 1028656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project secret_keyid, secret_keyidlen)) 1029656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project { 1030656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project BIO_puts(bio_err, 1031656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project "Error decrypting CMS using secret key\n"); 1032656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project goto end; 1033656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project } 1034656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project } 1035656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 1036656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project if (key) 1037656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project { 1038656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project if (!CMS_decrypt_set1_pkey(cms, key, recip)) 1039656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project { 1040656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project BIO_puts(bio_err, 1041656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project "Error decrypting CMS using private key\n"); 1042656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project goto end; 1043656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project } 1044656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project } 1045656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 1046656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project if (!CMS_decrypt(cms, NULL, NULL, indata, out, flags)) 1047656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project { 1048656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project BIO_printf(bio_err, "Error decrypting CMS structure\n"); 1049656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project goto end; 1050656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project } 1051656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project } 1052656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project else if (operation == SMIME_DATAOUT) 1053656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project { 1054656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project if (!CMS_data(cms, out, flags)) 1055656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project goto end; 1056656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project } 1057656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project else if (operation == SMIME_UNCOMPRESS) 1058656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project { 1059656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project if (!CMS_uncompress(cms, indata, out, flags)) 1060656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project goto end; 1061656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project } 1062656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project else if (operation == SMIME_DIGEST_VERIFY) 1063656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project { 1064656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project if (CMS_digest_verify(cms, indata, out, flags) > 0) 1065656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project BIO_printf(bio_err, "Verification successful\n"); 1066656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project else 1067656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project { 1068656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project BIO_printf(bio_err, "Verification failure\n"); 1069656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project goto end; 1070656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project } 1071656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project } 1072656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project else if (operation == SMIME_ENCRYPTED_DECRYPT) 1073656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project { 1074656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project if (!CMS_EncryptedData_decrypt(cms, secret_key, secret_keylen, 1075656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project indata, out, flags)) 1076656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project goto end; 1077656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project } 1078656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project else if (operation == SMIME_VERIFY) 1079656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project { 1080656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project if (CMS_verify(cms, other, store, indata, out, flags) > 0) 1081656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project BIO_printf(bio_err, "Verification successful\n"); 1082656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project else 1083656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project { 1084656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project BIO_printf(bio_err, "Verification failure\n"); 1085221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom if (verify_retcode) 1086221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom ret = verify_err + 32; 1087656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project goto end; 1088656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project } 1089656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project if (signerfile) 1090656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project { 1091656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project STACK_OF(X509) *signers; 1092656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project signers = CMS_get0_signers(cms); 1093656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project if (!save_certs(signerfile, signers)) 1094656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project { 1095656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project BIO_printf(bio_err, 1096656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project "Error writing signers to %s\n", 1097656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project signerfile); 1098656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project ret = 5; 1099656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project goto end; 1100656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project } 1101656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project sk_X509_free(signers); 1102656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project } 1103656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project if (rr_print) 1104656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project receipt_request_print(bio_err, cms); 1105656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 1106656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project } 1107656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project else if (operation == SMIME_VERIFY_RECEIPT) 1108656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project { 1109656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project if (CMS_verify_receipt(rcms, cms, other, store, 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"); 1114656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project goto end; 1115656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project } 1116656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project } 1117656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project else 1118656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project { 1119221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom if (noout) 1120221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom { 1121221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom if (print) 1122221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom CMS_ContentInfo_print_ctx(out, cms, 0, NULL); 1123221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom } 1124221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom else if (outformat == FORMAT_SMIME) 1125656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project { 1126656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project if (to) 1127656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project BIO_printf(out, "To: %s\n", to); 1128656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project if (from) 1129656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project BIO_printf(out, "From: %s\n", from); 1130656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project if (subject) 1131656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project BIO_printf(out, "Subject: %s\n", subject); 1132656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project if (operation == SMIME_RESIGN) 1133656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project ret = SMIME_write_CMS(out, cms, indata, flags); 1134656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project else 1135656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project ret = SMIME_write_CMS(out, cms, in, flags); 1136656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project } 1137656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project else if (outformat == FORMAT_PEM) 1138221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom ret = PEM_write_bio_CMS_stream(out, cms, in, flags); 1139656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project else if (outformat == FORMAT_ASN1) 1140221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom ret = i2d_CMS_bio_stream(out,cms, in, flags); 1141656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project else 1142656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project { 1143656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project BIO_printf(bio_err, "Bad output format for CMS file\n"); 1144656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project goto end; 1145656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project } 1146656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project if (ret <= 0) 1147656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project { 1148656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project ret = 6; 1149656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project goto end; 1150656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project } 1151656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project } 1152656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project ret = 0; 1153656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Projectend: 1154656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project if (ret) 1155656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project ERR_print_errors(bio_err); 1156656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project if (need_rand) 1157656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project app_RAND_write_file(NULL, bio_err); 1158656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project sk_X509_pop_free(encerts, X509_free); 1159656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project sk_X509_pop_free(other, X509_free); 1160656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project if (vpm) 1161656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project X509_VERIFY_PARAM_free(vpm); 1162656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project if (sksigners) 1163221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom sk_OPENSSL_STRING_free(sksigners); 1164656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project if (skkeys) 1165221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom sk_OPENSSL_STRING_free(skkeys); 1166656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project if (secret_key) 1167656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project OPENSSL_free(secret_key); 1168656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project if (secret_keyid) 1169656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project OPENSSL_free(secret_keyid); 1170656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project if (econtent_type) 1171656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project ASN1_OBJECT_free(econtent_type); 1172656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project if (rr) 1173656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project CMS_ReceiptRequest_free(rr); 1174656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project if (rr_to) 1175221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom sk_OPENSSL_STRING_free(rr_to); 1176656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project if (rr_from) 1177221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom sk_OPENSSL_STRING_free(rr_from); 1178656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project X509_STORE_free(store); 1179656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project X509_free(cert); 1180656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project X509_free(recip); 1181656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project X509_free(signer); 1182656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project EVP_PKEY_free(key); 1183656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project CMS_ContentInfo_free(cms); 1184656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project CMS_ContentInfo_free(rcms); 1185656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project BIO_free(rctin); 1186656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project BIO_free(in); 1187656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project BIO_free(indata); 1188656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project BIO_free_all(out); 1189656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project if (passin) OPENSSL_free(passin); 1190656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project return (ret); 1191656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project} 1192656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 1193656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Projectstatic int save_certs(char *signerfile, STACK_OF(X509) *signers) 1194656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project { 1195656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project int i; 1196656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project BIO *tmp; 1197656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project if (!signerfile) 1198656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project return 1; 1199656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project tmp = BIO_new_file(signerfile, "w"); 1200656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project if (!tmp) return 0; 1201656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project for(i = 0; i < sk_X509_num(signers); i++) 1202656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project PEM_write_bio_X509(tmp, sk_X509_value(signers, i)); 1203656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project BIO_free(tmp); 1204656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project return 1; 1205656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project } 1206656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 1207656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 1208656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project/* Minimal callback just to output policy info (if any) */ 1209656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 1210656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Projectstatic int cms_cb(int ok, X509_STORE_CTX *ctx) 1211656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project { 1212656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project int error; 1213656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 1214656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project error = X509_STORE_CTX_get_error(ctx); 1215656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 1216221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom verify_err = error; 1217221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom 1218656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project if ((error != X509_V_ERR_NO_EXPLICIT_POLICY) 1219656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project && ((error != X509_V_OK) || (ok != 2))) 1220656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project return ok; 1221656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 1222656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project policies_print(NULL, ctx); 1223656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 1224656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project return ok; 1225656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 1226656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project } 1227656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 1228656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Projectstatic void gnames_stack_print(BIO *out, STACK_OF(GENERAL_NAMES) *gns) 1229656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project { 1230656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project STACK_OF(GENERAL_NAME) *gens; 1231656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project GENERAL_NAME *gen; 1232656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project int i, j; 1233656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project for (i = 0; i < sk_GENERAL_NAMES_num(gns); i++) 1234656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project { 1235656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project gens = sk_GENERAL_NAMES_value(gns, i); 1236656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project for (j = 0; j < sk_GENERAL_NAME_num(gens); j++) 1237656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project { 1238656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project gen = sk_GENERAL_NAME_value(gens, j); 1239656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project BIO_puts(out, " "); 1240656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project GENERAL_NAME_print(out, gen); 1241656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project BIO_puts(out, "\n"); 1242656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project } 1243656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project } 1244656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project return; 1245656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project } 1246656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 1247656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Projectstatic void receipt_request_print(BIO *out, CMS_ContentInfo *cms) 1248656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project { 1249656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project STACK_OF(CMS_SignerInfo) *sis; 1250656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project CMS_SignerInfo *si; 1251656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project CMS_ReceiptRequest *rr; 1252656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project int allorfirst; 1253656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project STACK_OF(GENERAL_NAMES) *rto, *rlist; 1254656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project ASN1_STRING *scid; 1255656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project int i, rv; 1256656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project sis = CMS_get0_SignerInfos(cms); 1257656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project for (i = 0; i < sk_CMS_SignerInfo_num(sis); i++) 1258656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project { 1259656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project si = sk_CMS_SignerInfo_value(sis, i); 1260656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project rv = CMS_get1_ReceiptRequest(si, &rr); 1261656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project BIO_printf(bio_err, "Signer %d:\n", i + 1); 1262656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project if (rv == 0) 1263656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project BIO_puts(bio_err, " No Receipt Request\n"); 1264656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project else if (rv < 0) 1265656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project { 1266656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project BIO_puts(bio_err, " Receipt Request Parse Error\n"); 1267656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project ERR_print_errors(bio_err); 1268656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project } 1269656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project else 1270656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project { 1271656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project char *id; 1272656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project int idlen; 1273656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project CMS_ReceiptRequest_get0_values(rr, &scid, &allorfirst, 1274656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project &rlist, &rto); 1275656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project BIO_puts(out, " Signed Content ID:\n"); 1276656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project idlen = ASN1_STRING_length(scid); 1277656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project id = (char *)ASN1_STRING_data(scid); 1278656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project BIO_dump_indent(out, id, idlen, 4); 1279656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project BIO_puts(out, " Receipts From"); 1280656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project if (rlist) 1281656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project { 1282656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project BIO_puts(out, " List:\n"); 1283656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project gnames_stack_print(out, rlist); 1284656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project } 1285656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project else if (allorfirst == 1) 1286656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project BIO_puts(out, ": First Tier\n"); 1287656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project else if (allorfirst == 0) 1288656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project BIO_puts(out, ": All\n"); 1289656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project else 1290656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project BIO_printf(out, " Unknown (%d)\n", allorfirst); 1291656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project BIO_puts(out, " Receipts To:\n"); 1292656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project gnames_stack_print(out, rto); 1293656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project } 1294656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project if (rr) 1295656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project CMS_ReceiptRequest_free(rr); 1296656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project } 1297656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project } 1298656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 1299221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstromstatic STACK_OF(GENERAL_NAMES) *make_names_stack(STACK_OF(OPENSSL_STRING) *ns) 1300656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project { 1301656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project int i; 1302656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project STACK_OF(GENERAL_NAMES) *ret; 1303656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project GENERAL_NAMES *gens = NULL; 1304656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project GENERAL_NAME *gen = NULL; 1305656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project ret = sk_GENERAL_NAMES_new_null(); 1306656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project if (!ret) 1307656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project goto err; 1308221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom for (i = 0; i < sk_OPENSSL_STRING_num(ns); i++) 1309656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project { 1310221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom char *str = sk_OPENSSL_STRING_value(ns, i); 1311221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom gen = a2i_GENERAL_NAME(NULL, NULL, NULL, GEN_EMAIL, str, 0); 1312656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project if (!gen) 1313656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project goto err; 1314656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project gens = GENERAL_NAMES_new(); 1315656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project if (!gens) 1316656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project goto err; 1317656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project if (!sk_GENERAL_NAME_push(gens, gen)) 1318656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project goto err; 1319656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project gen = NULL; 1320656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project if (!sk_GENERAL_NAMES_push(ret, gens)) 1321656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project goto err; 1322656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project gens = NULL; 1323656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project } 1324656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 1325656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project return ret; 1326656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 1327656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project err: 1328656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project if (ret) 1329656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project sk_GENERAL_NAMES_pop_free(ret, GENERAL_NAMES_free); 1330656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project if (gens) 1331656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project GENERAL_NAMES_free(gens); 1332656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project if (gen) 1333656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project GENERAL_NAME_free(gen); 1334656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project return NULL; 1335656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project } 1336656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 1337656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 1338221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstromstatic CMS_ReceiptRequest *make_receipt_request(STACK_OF(OPENSSL_STRING) *rr_to, 1339221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom int rr_allorfirst, 1340221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom STACK_OF(OPENSSL_STRING) *rr_from) 1341656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project { 1342656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project STACK_OF(GENERAL_NAMES) *rct_to, *rct_from; 1343656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project CMS_ReceiptRequest *rr; 1344656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project rct_to = make_names_stack(rr_to); 1345656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project if (!rct_to) 1346656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project goto err; 1347656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project if (rr_from) 1348656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project { 1349656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project rct_from = make_names_stack(rr_from); 1350656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project if (!rct_from) 1351656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project goto err; 1352656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project } 1353656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project else 1354656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project rct_from = NULL; 1355656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project rr = CMS_ReceiptRequest_create0(NULL, -1, rr_allorfirst, rct_from, 1356656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project rct_to); 1357656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project return rr; 1358656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project err: 1359656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project return NULL; 1360656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project } 1361656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 1362656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#endif 1363