1656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project/* smime.c */ 2e45f106cb6b47af1f21efe76e933bdea2f5dd1caNagendra Modadugu/* 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) 1999-2004 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 * This product includes cryptographic software written by Eric Young 54656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * (eay@cryptsoft.com). This product includes software written by Tim 55656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * Hudson (tjh@cryptsoft.com). 56656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * 57656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project */ 58656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 59656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project/* S/MIME utility function */ 60656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 61656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#include <stdio.h> 62656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#include <string.h> 63656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#include "apps.h" 64656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#include <openssl/crypto.h> 65656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#include <openssl/pem.h> 66656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#include <openssl/err.h> 67656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#include <openssl/x509_vfy.h> 68656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#include <openssl/x509v3.h> 69656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 70656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#undef PROG 71656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#define PROG smime_main 72656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Projectstatic int save_certs(char *signerfile, STACK_OF(X509) *signers); 73656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Projectstatic int smime_cb(int ok, X509_STORE_CTX *ctx); 74656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 75656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#define SMIME_OP 0x10 76221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom#define SMIME_IP 0x20 77221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom#define SMIME_SIGNERS 0x40 78656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#define SMIME_ENCRYPT (1 | SMIME_OP) 79221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom#define SMIME_DECRYPT (2 | SMIME_IP) 80221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom#define SMIME_SIGN (3 | SMIME_OP | SMIME_SIGNERS) 81221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom#define SMIME_VERIFY (4 | SMIME_IP) 82221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom#define SMIME_PK7OUT (5 | SMIME_IP | SMIME_OP) 83221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom#define SMIME_RESIGN (6 | SMIME_IP | SMIME_OP | SMIME_SIGNERS) 84656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 85656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Projectint MAIN(int, char **); 86656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 87656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Projectint MAIN(int argc, char **argv) 88656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project { 89656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project ENGINE *e = NULL; 90656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project int operation = 0; 91656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project int ret = 0; 92656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project char **args; 93656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project const char *inmode = "r", *outmode = "w"; 94656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project char *infile = NULL, *outfile = NULL; 95656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project char *signerfile = NULL, *recipfile = NULL; 96221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom STACK_OF(OPENSSL_STRING) *sksigners = NULL, *skkeys = NULL; 97656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project char *certfile = NULL, *keyfile = NULL, *contfile=NULL; 98656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project const EVP_CIPHER *cipher = NULL; 99656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project PKCS7 *p7 = NULL; 100656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project X509_STORE *store = NULL; 101656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project X509 *cert = NULL, *recip = NULL, *signer = NULL; 102656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project EVP_PKEY *key = NULL; 103656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project STACK_OF(X509) *encerts = NULL, *other = NULL; 104656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project BIO *in = NULL, *out = NULL, *indata = NULL; 105656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project int badarg = 0; 106656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project int flags = PKCS7_DETACHED; 107656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project char *to = NULL, *from = NULL, *subject = NULL; 108656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project char *CAfile = NULL, *CApath = NULL; 109656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project char *passargin = NULL, *passin = NULL; 110656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project char *inrand = NULL; 111656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project int need_rand = 0; 112221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom int indef = 0; 113221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom const EVP_MD *sign_md = NULL; 114656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project int informat = FORMAT_SMIME, outformat = FORMAT_SMIME; 115656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project int keyform = FORMAT_PEM; 116656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#ifndef OPENSSL_NO_ENGINE 117656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project char *engine=NULL; 118656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#endif 119656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 120656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project X509_VERIFY_PARAM *vpm = NULL; 121656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 122656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project args = argv + 1; 123656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project ret = 1; 124656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 125656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project apps_startup(); 126656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 127656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project if (bio_err == NULL) 128656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project { 129656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project if ((bio_err = BIO_new(BIO_s_file())) != NULL) 130656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project BIO_set_fp(bio_err, stderr, BIO_NOCLOSE|BIO_FP_TEXT); 131656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project } 132656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 133656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project if (!load_config(bio_err, NULL)) 134656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project goto end; 135656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 136656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project while (!badarg && *args && *args[0] == '-') 137656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project { 138656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project if (!strcmp (*args, "-encrypt")) 139656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project operation = SMIME_ENCRYPT; 140656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project else if (!strcmp (*args, "-decrypt")) 141656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project operation = SMIME_DECRYPT; 142656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project else if (!strcmp (*args, "-sign")) 143656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project operation = SMIME_SIGN; 144221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom else if (!strcmp (*args, "-resign")) 145221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom operation = SMIME_RESIGN; 146656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project else if (!strcmp (*args, "-verify")) 147656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project operation = SMIME_VERIFY; 148656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project else if (!strcmp (*args, "-pk7out")) 149656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project operation = SMIME_PK7OUT; 150656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#ifndef OPENSSL_NO_DES 151656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project else if (!strcmp (*args, "-des3")) 152656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project cipher = EVP_des_ede3_cbc(); 153656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project else if (!strcmp (*args, "-des")) 154656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project cipher = EVP_des_cbc(); 155656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#endif 156656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#ifndef OPENSSL_NO_SEED 157656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project else if (!strcmp (*args, "-seed")) 158656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project cipher = EVP_seed_cbc(); 159656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#endif 160656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#ifndef OPENSSL_NO_RC2 161656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project else if (!strcmp (*args, "-rc2-40")) 162656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project cipher = EVP_rc2_40_cbc(); 163656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project else if (!strcmp (*args, "-rc2-128")) 164656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project cipher = EVP_rc2_cbc(); 165656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project else if (!strcmp (*args, "-rc2-64")) 166656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project cipher = EVP_rc2_64_cbc(); 167656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#endif 168656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#ifndef OPENSSL_NO_AES 169656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project else if (!strcmp(*args,"-aes128")) 170656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project cipher = EVP_aes_128_cbc(); 171656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project else if (!strcmp(*args,"-aes192")) 172656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project cipher = EVP_aes_192_cbc(); 173656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project else if (!strcmp(*args,"-aes256")) 174656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project cipher = EVP_aes_256_cbc(); 175656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#endif 176656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#ifndef OPENSSL_NO_CAMELLIA 177656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project else if (!strcmp(*args,"-camellia128")) 178656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project cipher = EVP_camellia_128_cbc(); 179656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project else if (!strcmp(*args,"-camellia192")) 180656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project cipher = EVP_camellia_192_cbc(); 181656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project else if (!strcmp(*args,"-camellia256")) 182656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project cipher = EVP_camellia_256_cbc(); 183656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#endif 184656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project else if (!strcmp (*args, "-text")) 185656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project flags |= PKCS7_TEXT; 186656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project else if (!strcmp (*args, "-nointern")) 187656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project flags |= PKCS7_NOINTERN; 188656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project else if (!strcmp (*args, "-noverify")) 189656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project flags |= PKCS7_NOVERIFY; 190656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project else if (!strcmp (*args, "-nochain")) 191656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project flags |= PKCS7_NOCHAIN; 192656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project else if (!strcmp (*args, "-nocerts")) 193656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project flags |= PKCS7_NOCERTS; 194656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project else if (!strcmp (*args, "-noattr")) 195656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project flags |= PKCS7_NOATTR; 196656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project else if (!strcmp (*args, "-nodetach")) 197656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project flags &= ~PKCS7_DETACHED; 198656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project else if (!strcmp (*args, "-nosmimecap")) 199656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project flags |= PKCS7_NOSMIMECAP; 200656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project else if (!strcmp (*args, "-binary")) 201656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project flags |= PKCS7_BINARY; 202656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project else if (!strcmp (*args, "-nosigs")) 203656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project flags |= PKCS7_NOSIGS; 204221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom else if (!strcmp (*args, "-stream")) 205221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom indef = 1; 206221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom else if (!strcmp (*args, "-indef")) 207221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom indef = 1; 208221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom else if (!strcmp (*args, "-noindef")) 209221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom indef = 0; 210656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project else if (!strcmp (*args, "-nooldmime")) 211656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project flags |= PKCS7_NOOLDMIMETYPE; 212656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project else if (!strcmp (*args, "-crlfeol")) 213656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project flags |= PKCS7_CRLFEOL; 214656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project else if (!strcmp(*args,"-rand")) 215656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project { 216221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom if (!args[1]) 217221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom goto argerr; 218221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom args++; 219221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom inrand = *args; 220656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project need_rand = 1; 221656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project } 222656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#ifndef OPENSSL_NO_ENGINE 223656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project else if (!strcmp(*args,"-engine")) 224656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project { 225221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom if (!args[1]) 226221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom goto argerr; 227221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom engine = *++args; 228656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project } 229656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#endif 230656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project else if (!strcmp(*args,"-passin")) 231656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project { 232221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom if (!args[1]) 233221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom goto argerr; 234221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom passargin = *++args; 235656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project } 236656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project else if (!strcmp (*args, "-to")) 237656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project { 238221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom if (!args[1]) 239221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom goto argerr; 240221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom to = *++args; 241656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project } 242656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project else if (!strcmp (*args, "-from")) 243656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project { 244221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom if (!args[1]) 245221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom goto argerr; 246221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom from = *++args; 247656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project } 248656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project else if (!strcmp (*args, "-subject")) 249656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project { 250221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom if (!args[1]) 251221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom goto argerr; 252221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom subject = *++args; 253656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project } 254656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project else if (!strcmp (*args, "-signer")) 255656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project { 256221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom if (!args[1]) 257221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom goto argerr; 258221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom /* If previous -signer argument add signer to list */ 259221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom 260221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom if (signerfile) 261656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project { 262221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom if (!sksigners) 263221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom sksigners = sk_OPENSSL_STRING_new_null(); 264221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom sk_OPENSSL_STRING_push(sksigners, signerfile); 265221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom if (!keyfile) 266221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom keyfile = signerfile; 267221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom if (!skkeys) 268221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom skkeys = sk_OPENSSL_STRING_new_null(); 269221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom sk_OPENSSL_STRING_push(skkeys, keyfile); 270221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom keyfile = NULL; 271656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project } 272221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom signerfile = *++args; 273656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project } 274656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project else if (!strcmp (*args, "-recip")) 275656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project { 276221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom if (!args[1]) 277221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom goto argerr; 278221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom recipfile = *++args; 279221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom } 280221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom else if (!strcmp (*args, "-md")) 281221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom { 282221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom if (!args[1]) 283221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom goto argerr; 284221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom sign_md = EVP_get_digestbyname(*++args); 285221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom if (sign_md == NULL) 286656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project { 287221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom BIO_printf(bio_err, "Unknown digest %s\n", 288221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom *args); 289221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom goto argerr; 290656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project } 291656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project } 292656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project else if (!strcmp (*args, "-inkey")) 293656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project { 294221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom if (!args[1]) 295221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom goto argerr; 296221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom /* If previous -inkey arument add signer to list */ 297221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom if (keyfile) 298656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project { 299221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom if (!signerfile) 300221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom { 301221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom BIO_puts(bio_err, "Illegal -inkey without -signer\n"); 302221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom goto argerr; 303221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom } 304221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom if (!sksigners) 305221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom sksigners = sk_OPENSSL_STRING_new_null(); 306221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom sk_OPENSSL_STRING_push(sksigners, signerfile); 307221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom signerfile = NULL; 308221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom if (!skkeys) 309221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom skkeys = sk_OPENSSL_STRING_new_null(); 310221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom sk_OPENSSL_STRING_push(skkeys, keyfile); 311656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project } 312221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom keyfile = *++args; 313221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom } 314656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project else if (!strcmp (*args, "-keyform")) 315656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project { 316221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom if (!args[1]) 317221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom goto argerr; 318221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom keyform = str2fmt(*++args); 319656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project } 320656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project else if (!strcmp (*args, "-certfile")) 321656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project { 322221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom if (!args[1]) 323221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom goto argerr; 324221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom certfile = *++args; 325656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project } 326656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project else if (!strcmp (*args, "-CAfile")) 327656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project { 328221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom if (!args[1]) 329221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom goto argerr; 330221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom CAfile = *++args; 331656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project } 332656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project else if (!strcmp (*args, "-CApath")) 333656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project { 334221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom if (!args[1]) 335221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom goto argerr; 336221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom CApath = *++args; 337656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project } 338656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project else if (!strcmp (*args, "-in")) 339656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project { 340221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom if (!args[1]) 341221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom goto argerr; 342221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom infile = *++args; 343656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project } 344656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project else if (!strcmp (*args, "-inform")) 345656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project { 346221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom if (!args[1]) 347221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom goto argerr; 348221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom informat = str2fmt(*++args); 349656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project } 350656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project else if (!strcmp (*args, "-outform")) 351656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project { 352221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom if (!args[1]) 353221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom goto argerr; 354221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom outformat = str2fmt(*++args); 355656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project } 356656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project else if (!strcmp (*args, "-out")) 357656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project { 358221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom if (!args[1]) 359221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom goto argerr; 360221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom outfile = *++args; 361656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project } 362656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project else if (!strcmp (*args, "-content")) 363656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project { 364221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom if (!args[1]) 365221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom goto argerr; 366221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom contfile = *++args; 367656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project } 368656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project else if (args_verify(&args, NULL, &badarg, bio_err, &vpm)) 369656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project continue; 370221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom else if ((cipher = EVP_get_cipherbyname(*args + 1)) == NULL) 371656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project badarg = 1; 372656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project args++; 373656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project } 374656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 375221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom if (!(operation & SMIME_SIGNERS) && (skkeys || sksigners)) 376221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom { 377221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom BIO_puts(bio_err, "Multiple signers or keys not allowed\n"); 378221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom goto argerr; 379221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom } 380656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 381221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom if (operation & SMIME_SIGNERS) 382656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project { 383221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom /* Check to see if any final signer needs to be appended */ 384221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom if (keyfile && !signerfile) 385221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom { 386221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom BIO_puts(bio_err, "Illegal -inkey without -signer\n"); 387221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom goto argerr; 388221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom } 389221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom if (signerfile) 390221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom { 391221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom if (!sksigners) 392221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom sksigners = sk_OPENSSL_STRING_new_null(); 393221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom sk_OPENSSL_STRING_push(sksigners, signerfile); 394221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom if (!skkeys) 395221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom skkeys = sk_OPENSSL_STRING_new_null(); 396221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom if (!keyfile) 397221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom keyfile = signerfile; 398221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom sk_OPENSSL_STRING_push(skkeys, keyfile); 399221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom } 400221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom if (!sksigners) 401656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project { 402656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project BIO_printf(bio_err, "No signer certificate specified\n"); 403656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project badarg = 1; 404656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project } 405221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom signerfile = NULL; 406221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom keyfile = NULL; 407656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project need_rand = 1; 408656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project } 409656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project else if (operation == SMIME_DECRYPT) 410656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project { 411656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project if (!recipfile && !keyfile) 412656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project { 413656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project BIO_printf(bio_err, "No recipient certificate or key specified\n"); 414656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project badarg = 1; 415656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project } 416656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project } 417656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project else if (operation == SMIME_ENCRYPT) 418656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project { 419656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project if (!*args) 420656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project { 421656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project BIO_printf(bio_err, "No recipient(s) certificate(s) specified\n"); 422656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project badarg = 1; 423656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project } 424656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project need_rand = 1; 425656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project } 426656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project else if (!operation) 427656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project badarg = 1; 428656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 429656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project if (badarg) 430656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project { 431221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom argerr: 432656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project BIO_printf (bio_err, "Usage smime [options] cert.pem ...\n"); 433656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project BIO_printf (bio_err, "where options are\n"); 434656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project BIO_printf (bio_err, "-encrypt encrypt message\n"); 435656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project BIO_printf (bio_err, "-decrypt decrypt encrypted message\n"); 436656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project BIO_printf (bio_err, "-sign sign message\n"); 437656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project BIO_printf (bio_err, "-verify verify signed message\n"); 438656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project BIO_printf (bio_err, "-pk7out output PKCS#7 structure\n"); 439656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#ifndef OPENSSL_NO_DES 440656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project BIO_printf (bio_err, "-des3 encrypt with triple DES\n"); 441656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project BIO_printf (bio_err, "-des encrypt with DES\n"); 442656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#endif 443656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#ifndef OPENSSL_NO_SEED 444656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project BIO_printf (bio_err, "-seed encrypt with SEED\n"); 445656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#endif 446656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#ifndef OPENSSL_NO_RC2 447656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project BIO_printf (bio_err, "-rc2-40 encrypt with RC2-40 (default)\n"); 448656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project BIO_printf (bio_err, "-rc2-64 encrypt with RC2-64\n"); 449656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project BIO_printf (bio_err, "-rc2-128 encrypt with RC2-128\n"); 450656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#endif 451656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#ifndef OPENSSL_NO_AES 452656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project BIO_printf (bio_err, "-aes128, -aes192, -aes256\n"); 453656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project BIO_printf (bio_err, " encrypt PEM output with cbc aes\n"); 454656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#endif 455656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#ifndef OPENSSL_NO_CAMELLIA 456656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project BIO_printf (bio_err, "-camellia128, -camellia192, -camellia256\n"); 457656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project BIO_printf (bio_err, " encrypt PEM output with cbc camellia\n"); 458656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#endif 459656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project BIO_printf (bio_err, "-nointern don't search certificates in message for signer\n"); 460656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project BIO_printf (bio_err, "-nosigs don't verify message signature\n"); 461656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project BIO_printf (bio_err, "-noverify don't verify signers certificate\n"); 462656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project BIO_printf (bio_err, "-nocerts don't include signers certificate when signing\n"); 463656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project BIO_printf (bio_err, "-nodetach use opaque signing\n"); 464656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project BIO_printf (bio_err, "-noattr don't include any signed attributes\n"); 465656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project BIO_printf (bio_err, "-binary don't translate message to text\n"); 466656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project BIO_printf (bio_err, "-certfile file other certificates file\n"); 467656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project BIO_printf (bio_err, "-signer file signer certificate file\n"); 468656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project BIO_printf (bio_err, "-recip file recipient certificate file for decryption\n"); 469656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project BIO_printf (bio_err, "-in file input file\n"); 470656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project BIO_printf (bio_err, "-inform arg input format SMIME (default), PEM or DER\n"); 471656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project BIO_printf (bio_err, "-inkey file input private key (if not signer or recipient)\n"); 472656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project BIO_printf (bio_err, "-keyform arg input private key format (PEM or ENGINE)\n"); 473656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project BIO_printf (bio_err, "-out file output file\n"); 474656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project BIO_printf (bio_err, "-outform arg output format SMIME (default), PEM or DER\n"); 475656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project BIO_printf (bio_err, "-content file supply or override content for detached signature\n"); 476656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project BIO_printf (bio_err, "-to addr to address\n"); 477656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project BIO_printf (bio_err, "-from ad from address\n"); 478656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project BIO_printf (bio_err, "-subject s subject\n"); 479656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project BIO_printf (bio_err, "-text include or delete text MIME headers\n"); 480656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project BIO_printf (bio_err, "-CApath dir trusted certificates directory\n"); 481656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project BIO_printf (bio_err, "-CAfile file trusted certificates file\n"); 482656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project BIO_printf (bio_err, "-crl_check check revocation status of signer's certificate using CRLs\n"); 483656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project BIO_printf (bio_err, "-crl_check_all check revocation status of signer's certificate chain using CRLs\n"); 484656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#ifndef OPENSSL_NO_ENGINE 485656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project BIO_printf (bio_err, "-engine e use engine e, possibly a hardware device.\n"); 486656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#endif 487656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project BIO_printf (bio_err, "-passin arg input file pass phrase source\n"); 488656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project BIO_printf(bio_err, "-rand file%cfile%c...\n", LIST_SEPARATOR_CHAR, LIST_SEPARATOR_CHAR); 489656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project BIO_printf(bio_err, " load the file (or the files in the directory) into\n"); 490656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project BIO_printf(bio_err, " the random number generator\n"); 491656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project BIO_printf (bio_err, "cert.pem recipient certificate(s) for encryption\n"); 492656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project goto end; 493656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project } 494656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 495656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#ifndef OPENSSL_NO_ENGINE 496656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project e = setup_engine(bio_err, engine, 0); 497656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#endif 498656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 499656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project if (!app_passwd(bio_err, passargin, NULL, &passin, NULL)) 500656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project { 501656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project BIO_printf(bio_err, "Error getting password\n"); 502656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project goto end; 503656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project } 504656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 505656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project if (need_rand) 506656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project { 507656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project app_RAND_load_file(NULL, bio_err, (inrand != NULL)); 508656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project if (inrand != NULL) 509656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project BIO_printf(bio_err,"%ld semi-random bytes loaded\n", 510656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project app_RAND_load_files(inrand)); 511656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project } 512656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 513656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project ret = 2; 514656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 515221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom if (!(operation & SMIME_SIGNERS)) 516656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project flags &= ~PKCS7_DETACHED; 517656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 518656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project if (operation & SMIME_OP) 519656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project { 520656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project if (outformat == FORMAT_ASN1) 521656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project outmode = "wb"; 522656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project } 523656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project else 524656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project { 525656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project if (flags & PKCS7_BINARY) 526656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project outmode = "wb"; 527221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom } 528221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom 529221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom if (operation & SMIME_IP) 530221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom { 531656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project if (informat == FORMAT_ASN1) 532656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project inmode = "rb"; 533656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project } 534221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom else 535221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom { 536221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom if (flags & PKCS7_BINARY) 537221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom inmode = "rb"; 538221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom } 539656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 540656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project if (operation == SMIME_ENCRYPT) 541656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project { 542656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project if (!cipher) 543656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project { 544656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#ifndef OPENSSL_NO_RC2 545656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project cipher = EVP_rc2_40_cbc(); 546656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#else 547656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project BIO_printf(bio_err, "No cipher selected\n"); 548656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project goto end; 549656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#endif 550656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project } 551656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project encerts = sk_X509_new_null(); 552656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project while (*args) 553656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project { 554656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project if (!(cert = load_cert(bio_err,*args,FORMAT_PEM, 555656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project NULL, e, "recipient certificate file"))) 556656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project { 557656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#if 0 /* An appropriate message is already printed */ 558656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project BIO_printf(bio_err, "Can't read recipient certificate file %s\n", *args); 559656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#endif 560656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project goto end; 561656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project } 562656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project sk_X509_push(encerts, cert); 563656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project cert = NULL; 564656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project args++; 565656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project } 566656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project } 567656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 568656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project if (certfile) 569656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project { 570656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project if (!(other = load_certs(bio_err,certfile,FORMAT_PEM, NULL, 571656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project e, "certificate file"))) 572656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project { 573656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project ERR_print_errors(bio_err); 574656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project goto end; 575656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project } 576656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project } 577656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 578656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project if (recipfile && (operation == SMIME_DECRYPT)) 579656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project { 580656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project if (!(recip = load_cert(bio_err,recipfile,FORMAT_PEM,NULL, 581656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project e, "recipient certificate file"))) 582656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project { 583656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project ERR_print_errors(bio_err); 584656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project goto end; 585656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project } 586656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project } 587656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 588656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project if (operation == SMIME_DECRYPT) 589656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project { 590656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project if (!keyfile) 591656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project keyfile = recipfile; 592656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project } 593656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project else if (operation == SMIME_SIGN) 594656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project { 595656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project if (!keyfile) 596656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project keyfile = signerfile; 597656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project } 598656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project else keyfile = NULL; 599656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 600656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project if (keyfile) 601656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project { 602656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project key = load_key(bio_err, keyfile, keyform, 0, passin, e, 603656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project "signing key file"); 604656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project if (!key) 605656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project goto end; 606656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project } 607656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 608656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project if (infile) 609656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project { 610656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project if (!(in = BIO_new_file(infile, inmode))) 611656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project { 612656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project BIO_printf (bio_err, 613656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project "Can't open input file %s\n", infile); 614656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project goto end; 615656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project } 616656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project } 617656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project else 618656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project in = BIO_new_fp(stdin, BIO_NOCLOSE); 619656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 620221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom if (operation & SMIME_IP) 621221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom { 622221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom if (informat == FORMAT_SMIME) 623221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom p7 = SMIME_read_PKCS7(in, &indata); 624221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom else if (informat == FORMAT_PEM) 625221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom p7 = PEM_read_bio_PKCS7(in, NULL, NULL, NULL); 626221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom else if (informat == FORMAT_ASN1) 627221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom p7 = d2i_PKCS7_bio(in, NULL); 628221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom else 629221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom { 630221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom BIO_printf(bio_err, "Bad input format for PKCS#7 file\n"); 631221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom goto end; 632221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom } 633221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom 634221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom if (!p7) 635221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom { 636221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom BIO_printf(bio_err, "Error reading S/MIME message\n"); 637221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom goto end; 638221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom } 639221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom if (contfile) 640221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom { 641221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom BIO_free(indata); 642221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom if (!(indata = BIO_new_file(contfile, "rb"))) 643221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom { 644221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom BIO_printf(bio_err, "Can't read content file %s\n", contfile); 645221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom goto end; 646221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom } 647221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom } 648221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom } 649221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom 650656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project if (outfile) 651656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project { 652656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project if (!(out = BIO_new_file(outfile, outmode))) 653656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project { 654656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project BIO_printf (bio_err, 655656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project "Can't open output file %s\n", outfile); 656656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project goto end; 657656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project } 658656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project } 659656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project else 660656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project { 661656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project out = BIO_new_fp(stdout, BIO_NOCLOSE); 662656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#ifdef OPENSSL_SYS_VMS 663656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project { 664656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project BIO *tmpbio = BIO_new(BIO_f_linebuffer()); 665656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project out = BIO_push(tmpbio, out); 666656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project } 667656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#endif 668656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project } 669656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 670656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project if (operation == SMIME_VERIFY) 671656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project { 672656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project if (!(store = setup_verify(bio_err, CAfile, CApath))) 673656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project goto end; 674221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom X509_STORE_set_verify_cb(store, smime_cb); 675656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project if (vpm) 676656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project X509_STORE_set1_param(store, vpm); 677656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project } 678656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 679656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 680656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project ret = 3; 681656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 682656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project if (operation == SMIME_ENCRYPT) 683656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project { 684221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom if (indef) 685656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project flags |= PKCS7_STREAM; 686221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom p7 = PKCS7_encrypt(encerts, in, cipher, flags); 687656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project } 688221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom else if (operation & SMIME_SIGNERS) 689656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project { 690221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom int i; 691221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom /* If detached data content we only enable streaming if 692221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom * S/MIME output format. 693221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom */ 694221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom if (operation == SMIME_SIGN) 695656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project { 696221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom if (flags & PKCS7_DETACHED) 697221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom { 698221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom if (outformat == FORMAT_SMIME) 699221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom flags |= PKCS7_STREAM; 700221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom } 701221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom else if (indef) 702221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom flags |= PKCS7_STREAM; 703221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom flags |= PKCS7_PARTIAL; 704221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom p7 = PKCS7_sign(NULL, NULL, other, in, flags); 705221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom if (!p7) 706221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom goto end; 707656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project } 708221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom else 709221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom flags |= PKCS7_REUSE_DIGEST; 710221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom for (i = 0; i < sk_OPENSSL_STRING_num(sksigners); i++) 711221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom { 712221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom signerfile = sk_OPENSSL_STRING_value(sksigners, i); 713221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom keyfile = sk_OPENSSL_STRING_value(skkeys, i); 714221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom signer = load_cert(bio_err, signerfile,FORMAT_PEM, NULL, 715221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom e, "signer certificate"); 716221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom if (!signer) 717221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom goto end; 718221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom key = load_key(bio_err, keyfile, keyform, 0, passin, e, 719221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom "signing key file"); 720221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom if (!key) 721221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom goto end; 722221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom if (!PKCS7_sign_add_signer(p7, signer, key, 723221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom sign_md, flags)) 724221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom goto end; 725221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom X509_free(signer); 726221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom signer = NULL; 727221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom EVP_PKEY_free(key); 728221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom key = NULL; 729656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project } 730221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom /* If not streaming or resigning finalize structure */ 731221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom if ((operation == SMIME_SIGN) && !(flags & PKCS7_STREAM)) 732656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project { 733221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom if (!PKCS7_final(p7, in, flags)) 734656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project goto end; 735656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project } 736656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project } 737656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 738656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project if (!p7) 739656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project { 740656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project BIO_printf(bio_err, "Error creating PKCS#7 structure\n"); 741656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project goto end; 742656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project } 743656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 744656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project ret = 4; 745656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project if (operation == SMIME_DECRYPT) 746656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project { 747656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project if (!PKCS7_decrypt(p7, key, recip, out, flags)) 748656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project { 749656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project BIO_printf(bio_err, "Error decrypting PKCS#7 structure\n"); 750656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project goto end; 751656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project } 752656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project } 753656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project else if (operation == SMIME_VERIFY) 754656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project { 755656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project STACK_OF(X509) *signers; 756656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project if (PKCS7_verify(p7, other, store, indata, out, flags)) 757656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project BIO_printf(bio_err, "Verification successful\n"); 758656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project else 759656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project { 760656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project BIO_printf(bio_err, "Verification failure\n"); 761656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project goto end; 762656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project } 763656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project signers = PKCS7_get0_signers(p7, other, flags); 764656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project if (!save_certs(signerfile, signers)) 765656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project { 766656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project BIO_printf(bio_err, "Error writing signers to %s\n", 767656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project signerfile); 768656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project ret = 5; 769656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project goto end; 770656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project } 771656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project sk_X509_free(signers); 772656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project } 773656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project else if (operation == SMIME_PK7OUT) 774656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project PEM_write_bio_PKCS7(out, p7); 775656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project else 776656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project { 777656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project if (to) 778656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project BIO_printf(out, "To: %s\n", to); 779656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project if (from) 780656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project BIO_printf(out, "From: %s\n", from); 781656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project if (subject) 782656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project BIO_printf(out, "Subject: %s\n", subject); 783656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project if (outformat == FORMAT_SMIME) 784221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom { 785221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom if (operation == SMIME_RESIGN) 786221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom SMIME_write_PKCS7(out, p7, indata, flags); 787221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom else 788221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom SMIME_write_PKCS7(out, p7, in, flags); 789221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom } 790656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project else if (outformat == FORMAT_PEM) 791221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom PEM_write_bio_PKCS7_stream(out, p7, in, flags); 792656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project else if (outformat == FORMAT_ASN1) 793221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom i2d_PKCS7_bio_stream(out,p7, in, flags); 794656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project else 795656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project { 796656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project BIO_printf(bio_err, "Bad output format for PKCS#7 file\n"); 797656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project goto end; 798656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project } 799656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project } 800656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project ret = 0; 801656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Projectend: 802656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project if (need_rand) 803656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project app_RAND_write_file(NULL, bio_err); 804656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project if (ret) ERR_print_errors(bio_err); 805656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project sk_X509_pop_free(encerts, X509_free); 806656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project sk_X509_pop_free(other, X509_free); 807656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project if (vpm) 808656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project X509_VERIFY_PARAM_free(vpm); 809221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom if (sksigners) 810221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom sk_OPENSSL_STRING_free(sksigners); 811221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom if (skkeys) 812221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom sk_OPENSSL_STRING_free(skkeys); 813656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project X509_STORE_free(store); 814656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project X509_free(cert); 815656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project X509_free(recip); 816656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project X509_free(signer); 817656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project EVP_PKEY_free(key); 818656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project PKCS7_free(p7); 819656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project BIO_free(in); 820656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project BIO_free(indata); 821656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project BIO_free_all(out); 822656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project if (passin) OPENSSL_free(passin); 823656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project return (ret); 824656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project} 825656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 826656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Projectstatic int save_certs(char *signerfile, STACK_OF(X509) *signers) 827656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project { 828656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project int i; 829656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project BIO *tmp; 830656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project if (!signerfile) 831656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project return 1; 832656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project tmp = BIO_new_file(signerfile, "w"); 833656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project if (!tmp) return 0; 834656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project for(i = 0; i < sk_X509_num(signers); i++) 835656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project PEM_write_bio_X509(tmp, sk_X509_value(signers, i)); 836656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project BIO_free(tmp); 837656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project return 1; 838656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project } 839656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 840656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 841656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project/* Minimal callback just to output policy info (if any) */ 842656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 843656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Projectstatic int smime_cb(int ok, X509_STORE_CTX *ctx) 844656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project { 845656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project int error; 846656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 847656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project error = X509_STORE_CTX_get_error(ctx); 848656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 849656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project if ((error != X509_V_ERR_NO_EXPLICIT_POLICY) 850656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project && ((error != X509_V_OK) || (ok != 2))) 851656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project return ok; 852656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 853656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project policies_print(NULL, ctx); 854656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 855656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project return ok; 856656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 857656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project } 858