1656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project/* apps/enc.c */ 2656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project/* Copyright (C) 1995-1998 Eric Young (eay@cryptsoft.com) 3656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * All rights reserved. 4656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * 5656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * This package is an SSL implementation written 6656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * by Eric Young (eay@cryptsoft.com). 7656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * The implementation was written so as to conform with Netscapes SSL. 8656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * 9656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * This library is free for commercial and non-commercial use as long as 10656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * the following conditions are aheared to. The following conditions 11656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * apply to all code found in this distribution, be it the RC4, RSA, 12656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * lhash, DES, etc., code; not just the SSL code. The SSL documentation 13656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * included with this distribution is covered by the same copyright terms 14656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * except that the holder is Tim Hudson (tjh@cryptsoft.com). 15656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * 16656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * Copyright remains Eric Young's, and as such any Copyright notices in 17656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * the code are not to be removed. 18656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * If this package is used in a product, Eric Young should be given attribution 19656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * as the author of the parts of the library used. 20656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * This can be in the form of a textual message at program startup or 21656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * in documentation (online or textual) provided with the package. 22656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * 23656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * Redistribution and use in source and binary forms, with or without 24656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * modification, are permitted provided that the following conditions 25656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * are met: 26656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * 1. Redistributions of source code must retain the copyright 27656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * notice, this list of conditions and the following disclaimer. 28656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * 2. Redistributions in binary form must reproduce the above copyright 29656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * notice, this list of conditions and the following disclaimer in the 30656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * documentation and/or other materials provided with the distribution. 31656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * 3. All advertising materials mentioning features or use of this software 32656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * must display the following acknowledgement: 33656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * "This product includes cryptographic software written by 34656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * Eric Young (eay@cryptsoft.com)" 35656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * The word 'cryptographic' can be left out if the rouines from the library 36656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * being used are not cryptographic related :-). 37656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * 4. If you include any Windows specific code (or a derivative thereof) from 38656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * the apps directory (application code) you must include an acknowledgement: 39656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * "This product includes software written by Tim Hudson (tjh@cryptsoft.com)" 40656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * 41656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * THIS SOFTWARE IS PROVIDED BY ERIC YOUNG ``AS IS'' AND 42656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 43656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 44656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE 45656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 46656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 47656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 48656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 49656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 50656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 51656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * SUCH DAMAGE. 52656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * 53656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * The licence and distribution terms for any publically available version or 54656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * derivative of this code cannot be changed. i.e. this code cannot simply be 55656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * copied and put under another distribution licence 56656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * [including the GNU Public Licence.] 57656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project */ 58656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 59656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#include <stdio.h> 60656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#include <stdlib.h> 61656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#include <string.h> 62656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#include "apps.h" 63656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#include <openssl/bio.h> 64656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#include <openssl/err.h> 65656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#include <openssl/evp.h> 66656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#include <openssl/objects.h> 67656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#include <openssl/x509.h> 68656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#include <openssl/rand.h> 69656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#include <openssl/pem.h> 70c64f6fe2be99cb3fa8e491b5bede9a217de87a4cKenny Root#ifndef OPENSSL_NO_COMP 71221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom#include <openssl/comp.h> 72c64f6fe2be99cb3fa8e491b5bede9a217de87a4cKenny Root#endif 73656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#include <ctype.h> 74656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 75656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Projectint set_hex(char *in,unsigned char *out,int size); 76656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#undef SIZE 77656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#undef BSIZE 78656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#undef PROG 79656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 80656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#define SIZE (512) 81656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#define BSIZE (8*1024) 82656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#define PROG enc_main 83656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 84656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Projectstatic void show_ciphers(const OBJ_NAME *name,void *bio_) 85656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project { 86656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project BIO *bio=bio_; 87656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project static int n; 88656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 89656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project if(!islower((unsigned char)*name->name)) 90656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project return; 91656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 92656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project BIO_printf(bio,"-%-25s",name->name); 93656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project if(++n == 3) 94656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project { 95656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project BIO_printf(bio,"\n"); 96656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project n=0; 97656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project } 98656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project else 99656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project BIO_printf(bio," "); 100656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project } 101656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 102656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Projectint MAIN(int, char **); 103656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 104656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Projectint MAIN(int argc, char **argv) 105656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project { 106656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project static const char magic[]="Salted__"; 107656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project char mbuf[sizeof magic-1]; 108656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project char *strbuf=NULL; 109656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project unsigned char *buff=NULL,*bufsize=NULL; 110656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project int bsize=BSIZE,verbose=0; 111656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project int ret=1,inl; 112656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project int nopad = 0; 113656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project unsigned char key[EVP_MAX_KEY_LENGTH],iv[EVP_MAX_IV_LENGTH]; 114656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project unsigned char salt[PKCS5_SALT_LEN]; 115656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project char *str=NULL, *passarg = NULL, *pass = NULL; 116656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project char *hkey=NULL,*hiv=NULL,*hsalt = NULL; 117656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project char *md=NULL; 118656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project int enc=1,printkey=0,i,base64=0; 119221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom#ifdef ZLIB 120221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom int do_zlib=0; 121221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom BIO *bzl = NULL; 122221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom#endif 123656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project int debug=0,olb64=0,nosalt=0; 124656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project const EVP_CIPHER *cipher=NULL,*c; 125656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project EVP_CIPHER_CTX *ctx = NULL; 126656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project char *inf=NULL,*outf=NULL; 127656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project BIO *in=NULL,*out=NULL,*b64=NULL,*benc=NULL,*rbio=NULL,*wbio=NULL; 128656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#define PROG_NAME_SIZE 39 129656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project char pname[PROG_NAME_SIZE+1]; 130656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#ifndef OPENSSL_NO_ENGINE 131656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project char *engine = NULL; 132656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#endif 133656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project const EVP_MD *dgst=NULL; 134392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom int non_fips_allow = 0; 135656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 136656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project apps_startup(); 137656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 138656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project if (bio_err == NULL) 139656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project if ((bio_err=BIO_new(BIO_s_file())) != NULL) 140656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project BIO_set_fp(bio_err,stderr,BIO_NOCLOSE|BIO_FP_TEXT); 141656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 142656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project if (!load_config(bio_err, NULL)) 143656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project goto end; 144656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 145656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project /* first check the program name */ 146656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project program_name(argv[0],pname,sizeof pname); 147656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project if (strcmp(pname,"base64") == 0) 148656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project base64=1; 149221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom#ifdef ZLIB 150221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom if (strcmp(pname,"zlib") == 0) 151221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom do_zlib=1; 152221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom#endif 153656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 154656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project cipher=EVP_get_cipherbyname(pname); 155221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom#ifdef ZLIB 156221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom if (!do_zlib && !base64 && (cipher == NULL) 157221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom && (strcmp(pname,"enc") != 0)) 158221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom#else 159656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project if (!base64 && (cipher == NULL) && (strcmp(pname,"enc") != 0)) 160221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom#endif 161656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project { 162656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project BIO_printf(bio_err,"%s is an unknown cipher\n",pname); 163656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project goto bad; 164656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project } 165656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 166656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project argc--; 167656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project argv++; 168656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project while (argc >= 1) 169656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project { 170656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project if (strcmp(*argv,"-e") == 0) 171656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project enc=1; 172656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project else if (strcmp(*argv,"-in") == 0) 173656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project { 174656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project if (--argc < 1) goto bad; 175656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project inf= *(++argv); 176656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project } 177656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project else if (strcmp(*argv,"-out") == 0) 178656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project { 179656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project if (--argc < 1) goto bad; 180656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project outf= *(++argv); 181656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project } 182656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project else if (strcmp(*argv,"-pass") == 0) 183656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project { 184656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project if (--argc < 1) goto bad; 185656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project passarg= *(++argv); 186656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project } 187656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#ifndef OPENSSL_NO_ENGINE 188656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project else if (strcmp(*argv,"-engine") == 0) 189656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project { 190656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project if (--argc < 1) goto bad; 191656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project engine= *(++argv); 192656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project } 193656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#endif 194656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project else if (strcmp(*argv,"-d") == 0) 195656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project enc=0; 196656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project else if (strcmp(*argv,"-p") == 0) 197656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project printkey=1; 198656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project else if (strcmp(*argv,"-v") == 0) 199656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project verbose=1; 200656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project else if (strcmp(*argv,"-nopad") == 0) 201656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project nopad=1; 202656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project else if (strcmp(*argv,"-salt") == 0) 203656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project nosalt=0; 204656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project else if (strcmp(*argv,"-nosalt") == 0) 205656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project nosalt=1; 206656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project else if (strcmp(*argv,"-debug") == 0) 207656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project debug=1; 208656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project else if (strcmp(*argv,"-P") == 0) 209656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project printkey=2; 210656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project else if (strcmp(*argv,"-A") == 0) 211656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project olb64=1; 212656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project else if (strcmp(*argv,"-a") == 0) 213656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project base64=1; 214656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project else if (strcmp(*argv,"-base64") == 0) 215656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project base64=1; 216221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom#ifdef ZLIB 217221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom else if (strcmp(*argv,"-z") == 0) 218221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom do_zlib=1; 219221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom#endif 220656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project else if (strcmp(*argv,"-bufsize") == 0) 221656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project { 222656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project if (--argc < 1) goto bad; 223656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project bufsize=(unsigned char *)*(++argv); 224656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project } 225656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project else if (strcmp(*argv,"-k") == 0) 226656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project { 227656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project if (--argc < 1) goto bad; 228656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project str= *(++argv); 229656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project } 230656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project else if (strcmp(*argv,"-kfile") == 0) 231656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project { 232656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project static char buf[128]; 233656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project FILE *infile; 234656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project char *file; 235656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 236656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project if (--argc < 1) goto bad; 237656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project file= *(++argv); 238656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project infile=fopen(file,"r"); 239656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project if (infile == NULL) 240656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project { 241656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project BIO_printf(bio_err,"unable to read key from '%s'\n", 242656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project file); 243656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project goto bad; 244656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project } 245656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project buf[0]='\0'; 24698d58bb80c64b02a33662f0ea80351d4a1535267Brian Carlstrom if (!fgets(buf,sizeof buf,infile)) 24798d58bb80c64b02a33662f0ea80351d4a1535267Brian Carlstrom { 24898d58bb80c64b02a33662f0ea80351d4a1535267Brian Carlstrom BIO_printf(bio_err,"unable to read key from '%s'\n", 24998d58bb80c64b02a33662f0ea80351d4a1535267Brian Carlstrom file); 25098d58bb80c64b02a33662f0ea80351d4a1535267Brian Carlstrom goto bad; 25198d58bb80c64b02a33662f0ea80351d4a1535267Brian Carlstrom } 252656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project fclose(infile); 253656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project i=strlen(buf); 254656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project if ((i > 0) && 255656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project ((buf[i-1] == '\n') || (buf[i-1] == '\r'))) 256656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project buf[--i]='\0'; 257656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project if ((i > 0) && 258656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project ((buf[i-1] == '\n') || (buf[i-1] == '\r'))) 259656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project buf[--i]='\0'; 260656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project if (i < 1) 261656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project { 262656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project BIO_printf(bio_err,"zero length password\n"); 263656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project goto bad; 264656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project } 265656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project str=buf; 266656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project } 267656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project else if (strcmp(*argv,"-K") == 0) 268656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project { 269656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project if (--argc < 1) goto bad; 270656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project hkey= *(++argv); 271656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project } 272656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project else if (strcmp(*argv,"-S") == 0) 273656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project { 274656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project if (--argc < 1) goto bad; 275656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project hsalt= *(++argv); 276656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project } 277656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project else if (strcmp(*argv,"-iv") == 0) 278656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project { 279656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project if (--argc < 1) goto bad; 280656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project hiv= *(++argv); 281656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project } 282656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project else if (strcmp(*argv,"-md") == 0) 283656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project { 284656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project if (--argc < 1) goto bad; 285656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project md= *(++argv); 286656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project } 287392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom else if (strcmp(*argv,"-non-fips-allow") == 0) 288392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom non_fips_allow = 1; 289656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project else if ((argv[0][0] == '-') && 290656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project ((c=EVP_get_cipherbyname(&(argv[0][1]))) != NULL)) 291656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project { 292656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project cipher=c; 293656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project } 294656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project else if (strcmp(*argv,"-none") == 0) 295656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project cipher=NULL; 296656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project else 297656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project { 298656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project BIO_printf(bio_err,"unknown option '%s'\n",*argv); 299656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Projectbad: 300656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project BIO_printf(bio_err,"options are\n"); 301656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project BIO_printf(bio_err,"%-14s input file\n","-in <file>"); 302656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project BIO_printf(bio_err,"%-14s output file\n","-out <file>"); 303656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project BIO_printf(bio_err,"%-14s pass phrase source\n","-pass <arg>"); 304656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project BIO_printf(bio_err,"%-14s encrypt\n","-e"); 305656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project BIO_printf(bio_err,"%-14s decrypt\n","-d"); 306656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project BIO_printf(bio_err,"%-14s base64 encode/decode, depending on encryption flag\n","-a/-base64"); 307656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project BIO_printf(bio_err,"%-14s passphrase is the next argument\n","-k"); 308656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project BIO_printf(bio_err,"%-14s passphrase is the first line of the file argument\n","-kfile"); 309656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project BIO_printf(bio_err,"%-14s the next argument is the md to use to create a key\n","-md"); 310656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project BIO_printf(bio_err,"%-14s from a passphrase. One of md2, md5, sha or sha1\n",""); 311221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom BIO_printf(bio_err,"%-14s salt in hex is the next argument\n","-S"); 312656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project BIO_printf(bio_err,"%-14s key/iv in hex is the next argument\n","-K/-iv"); 313656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project BIO_printf(bio_err,"%-14s print the iv/key (then exit if -P)\n","-[pP]"); 314656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project BIO_printf(bio_err,"%-14s buffer size\n","-bufsize <n>"); 315221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom BIO_printf(bio_err,"%-14s disable standard block padding\n","-nopad"); 316656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#ifndef OPENSSL_NO_ENGINE 317656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project BIO_printf(bio_err,"%-14s use engine e, possibly a hardware device.\n","-engine e"); 318656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#endif 319656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 320656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project BIO_printf(bio_err,"Cipher Types\n"); 321656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project OBJ_NAME_do_all_sorted(OBJ_NAME_TYPE_CIPHER_METH, 322656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project show_ciphers, 323656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project bio_err); 324656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project BIO_printf(bio_err,"\n"); 325656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 326656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project goto end; 327656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project } 328656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project argc--; 329656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project argv++; 330656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project } 331656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 332656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#ifndef OPENSSL_NO_ENGINE 33343c12e3d4f9bbbbd4a8ba7b149686437514bc6b6Brian Carlstrom setup_engine(bio_err, engine, 0); 334656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#endif 335656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 33677c6be7176c48d2ce4d5979a84876d34204eedafKenny Root if (cipher && EVP_CIPHER_flags(cipher) & EVP_CIPH_FLAG_AEAD_CIPHER) 33777c6be7176c48d2ce4d5979a84876d34204eedafKenny Root { 33877c6be7176c48d2ce4d5979a84876d34204eedafKenny Root BIO_printf(bio_err, "AEAD ciphers not supported by the enc utility\n"); 33977c6be7176c48d2ce4d5979a84876d34204eedafKenny Root goto end; 34077c6be7176c48d2ce4d5979a84876d34204eedafKenny Root } 34177c6be7176c48d2ce4d5979a84876d34204eedafKenny Root 342c64f6fe2be99cb3fa8e491b5bede9a217de87a4cKenny Root if (cipher && (EVP_CIPHER_mode(cipher) == EVP_CIPH_XTS_MODE)) 343c64f6fe2be99cb3fa8e491b5bede9a217de87a4cKenny Root { 344c64f6fe2be99cb3fa8e491b5bede9a217de87a4cKenny Root BIO_printf(bio_err, "Ciphers in XTS mode are not supported by the enc utility\n"); 345c64f6fe2be99cb3fa8e491b5bede9a217de87a4cKenny Root goto end; 346c64f6fe2be99cb3fa8e491b5bede9a217de87a4cKenny Root } 347c64f6fe2be99cb3fa8e491b5bede9a217de87a4cKenny Root 348656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project if (md && (dgst=EVP_get_digestbyname(md)) == NULL) 349656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project { 350656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project BIO_printf(bio_err,"%s is an unsupported message digest type\n",md); 351656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project goto end; 352656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project } 353656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 354656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project if (dgst == NULL) 355656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project { 356221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom dgst = EVP_md5(); 357656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project } 358656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 359656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project if (bufsize != NULL) 360656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project { 361656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project unsigned long n; 362656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 363656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project for (n=0; *bufsize; bufsize++) 364656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project { 365656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project i= *bufsize; 366656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project if ((i <= '9') && (i >= '0')) 367656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project n=n*10+i-'0'; 368656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project else if (i == 'k') 369656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project { 370656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project n*=1024; 371656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project bufsize++; 372656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project break; 373656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project } 374656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project } 375656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project if (*bufsize != '\0') 376656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project { 377656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project BIO_printf(bio_err,"invalid 'bufsize' specified.\n"); 378656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project goto end; 379656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project } 380656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 381656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project /* It must be large enough for a base64 encoded line */ 382656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project if (base64 && n < 80) n=80; 383656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 384656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project bsize=(int)n; 385656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project if (verbose) BIO_printf(bio_err,"bufsize=%d\n",bsize); 386656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project } 387656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 388656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project strbuf=OPENSSL_malloc(SIZE); 389656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project buff=(unsigned char *)OPENSSL_malloc(EVP_ENCODE_LENGTH(bsize)); 390656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project if ((buff == NULL) || (strbuf == NULL)) 391656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project { 392656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project BIO_printf(bio_err,"OPENSSL_malloc failure %ld\n",(long)EVP_ENCODE_LENGTH(bsize)); 393656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project goto end; 394656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project } 395656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 396656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project in=BIO_new(BIO_s_file()); 397656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project out=BIO_new(BIO_s_file()); 398656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project if ((in == NULL) || (out == NULL)) 399656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project { 400656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project ERR_print_errors(bio_err); 401656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project goto end; 402656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project } 403656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project if (debug) 404656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project { 405656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project BIO_set_callback(in,BIO_debug_callback); 406656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project BIO_set_callback(out,BIO_debug_callback); 407656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project BIO_set_callback_arg(in,(char *)bio_err); 408656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project BIO_set_callback_arg(out,(char *)bio_err); 409656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project } 410656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 411656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project if (inf == NULL) 412656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project { 413ee7afb3c942c4eefef6ed06201eafaf8ec58e2e3Brian Carlstrom#ifndef OPENSSL_NO_SETVBUF_IONBF 414656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project if (bufsize != NULL) 415656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project setvbuf(stdin, (char *)NULL, _IONBF, 0); 416ee7afb3c942c4eefef6ed06201eafaf8ec58e2e3Brian Carlstrom#endif /* ndef OPENSSL_NO_SETVBUF_IONBF */ 417656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project BIO_set_fp(in,stdin,BIO_NOCLOSE); 418656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project } 419656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project else 420656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project { 421656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project if (BIO_read_filename(in,inf) <= 0) 422656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project { 423656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project perror(inf); 424656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project goto end; 425656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project } 426656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project } 427656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 428656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project if(!str && passarg) { 429656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project if(!app_passwd(bio_err, passarg, NULL, &pass, NULL)) { 430656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project BIO_printf(bio_err, "Error getting password\n"); 431656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project goto end; 432656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project } 433656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project str = pass; 434656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project } 435656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 436656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project if ((str == NULL) && (cipher != NULL) && (hkey == NULL)) 437656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project { 438656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project for (;;) 439656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project { 440656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project char buf[200]; 441656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 442656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project BIO_snprintf(buf,sizeof buf,"enter %s %s password:", 443656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project OBJ_nid2ln(EVP_CIPHER_nid(cipher)), 444656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project (enc)?"encryption":"decryption"); 445656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project strbuf[0]='\0'; 446656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project i=EVP_read_pw_string((char *)strbuf,SIZE,buf,enc); 447656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project if (i == 0) 448656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project { 449656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project if (strbuf[0] == '\0') 450656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project { 451656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project ret=1; 452656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project goto end; 453656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project } 454656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project str=strbuf; 455656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project break; 456656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project } 457656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project if (i < 0) 458656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project { 459656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project BIO_printf(bio_err,"bad password read\n"); 460656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project goto end; 461656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project } 462656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project } 463656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project } 464656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 465656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 466656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project if (outf == NULL) 467656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project { 468656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project BIO_set_fp(out,stdout,BIO_NOCLOSE); 469ee7afb3c942c4eefef6ed06201eafaf8ec58e2e3Brian Carlstrom#ifndef OPENSSL_NO_SETVBUF_IONBF 470656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project if (bufsize != NULL) 471656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project setvbuf(stdout, (char *)NULL, _IONBF, 0); 472ee7afb3c942c4eefef6ed06201eafaf8ec58e2e3Brian Carlstrom#endif /* ndef OPENSSL_NO_SETVBUF_IONBF */ 473656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#ifdef OPENSSL_SYS_VMS 474656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project { 475656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project BIO *tmpbio = BIO_new(BIO_f_linebuffer()); 476656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project out = BIO_push(tmpbio, out); 477656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project } 478656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#endif 479656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project } 480656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project else 481656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project { 482656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project if (BIO_write_filename(out,outf) <= 0) 483656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project { 484656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project perror(outf); 485656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project goto end; 486656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project } 487656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project } 488656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 489656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project rbio=in; 490656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project wbio=out; 491656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 492221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom#ifdef ZLIB 493221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom 494221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom if (do_zlib) 495221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom { 496221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom if ((bzl=BIO_new(BIO_f_zlib())) == NULL) 497221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom goto end; 498221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom if (enc) 499221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom wbio=BIO_push(bzl,wbio); 500221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom else 501221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom rbio=BIO_push(bzl,rbio); 502221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom } 503221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom#endif 504221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom 505656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project if (base64) 506656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project { 507656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project if ((b64=BIO_new(BIO_f_base64())) == NULL) 508656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project goto end; 509656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project if (debug) 510656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project { 511656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project BIO_set_callback(b64,BIO_debug_callback); 512656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project BIO_set_callback_arg(b64,(char *)bio_err); 513656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project } 514656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project if (olb64) 515656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project BIO_set_flags(b64,BIO_FLAGS_BASE64_NO_NL); 516656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project if (enc) 517656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project wbio=BIO_push(b64,wbio); 518656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project else 519656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project rbio=BIO_push(b64,rbio); 520656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project } 521656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 522656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project if (cipher != NULL) 523656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project { 524656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project /* Note that str is NULL if a key was passed on the command 525656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * line, so we get no salt in that case. Is this a bug? 526656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project */ 527656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project if (str != NULL) 528656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project { 529656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project /* Salt handling: if encrypting generate a salt and 530656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * write to output BIO. If decrypting read salt from 531656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * input BIO. 532656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project */ 533656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project unsigned char *sptr; 534656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project if(nosalt) sptr = NULL; 535656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project else { 536656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project if(enc) { 537656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project if(hsalt) { 538656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project if(!set_hex(hsalt,salt,sizeof salt)) { 539656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project BIO_printf(bio_err, 540656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project "invalid hex salt value\n"); 541656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project goto end; 542656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project } 543656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project } else if (RAND_pseudo_bytes(salt, sizeof salt) < 0) 544656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project goto end; 545656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project /* If -P option then don't bother writing */ 546656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project if((printkey != 2) 547656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project && (BIO_write(wbio,magic, 548656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project sizeof magic-1) != sizeof magic-1 549656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project || BIO_write(wbio, 550656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project (char *)salt, 551656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project sizeof salt) != sizeof salt)) { 552656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project BIO_printf(bio_err,"error writing output file\n"); 553656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project goto end; 554656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project } 555656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project } else if(BIO_read(rbio,mbuf,sizeof mbuf) != sizeof mbuf 556656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project || BIO_read(rbio, 557656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project (unsigned char *)salt, 558656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project sizeof salt) != sizeof salt) { 559656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project BIO_printf(bio_err,"error reading input file\n"); 560656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project goto end; 561656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project } else if(memcmp(mbuf,magic,sizeof magic-1)) { 562656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project BIO_printf(bio_err,"bad magic number\n"); 563656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project goto end; 564656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project } 565656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 566656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project sptr = salt; 567656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project } 568656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 569656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project EVP_BytesToKey(cipher,dgst,sptr, 570656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project (unsigned char *)str, 571656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project strlen(str),1,key,iv); 572656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project /* zero the complete buffer or the string 573656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * passed from the command line 574656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * bug picked up by 575656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * Larry J. Hughes Jr. <hughes@indiana.edu> */ 576656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project if (str == strbuf) 577656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project OPENSSL_cleanse(str,SIZE); 578656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project else 579656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project OPENSSL_cleanse(str,strlen(str)); 580656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project } 581656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project if ((hiv != NULL) && !set_hex(hiv,iv,sizeof iv)) 582656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project { 583656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project BIO_printf(bio_err,"invalid hex iv value\n"); 584656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project goto end; 585656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project } 586e45f106cb6b47af1f21efe76e933bdea2f5dd1caNagendra Modadugu if ((hiv == NULL) && (str == NULL) 587e45f106cb6b47af1f21efe76e933bdea2f5dd1caNagendra Modadugu && EVP_CIPHER_iv_length(cipher) != 0) 588656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project { 589656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project /* No IV was explicitly set and no IV was generated 590656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * during EVP_BytesToKey. Hence the IV is undefined, 591656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * making correct decryption impossible. */ 592656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project BIO_printf(bio_err, "iv undefined\n"); 593656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project goto end; 594656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project } 595656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project if ((hkey != NULL) && !set_hex(hkey,key,sizeof key)) 596656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project { 597656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project BIO_printf(bio_err,"invalid hex key value\n"); 598656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project goto end; 599656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project } 600656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 601656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project if ((benc=BIO_new(BIO_f_cipher())) == NULL) 602656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project goto end; 603656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 604656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project /* Since we may be changing parameters work on the encryption 605656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * context rather than calling BIO_set_cipher(). 606656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project */ 607656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 608656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project BIO_get_cipher_ctx(benc, &ctx); 609392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom 610392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom if (non_fips_allow) 611392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom EVP_CIPHER_CTX_set_flags(ctx, 612392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom EVP_CIPH_FLAG_NON_FIPS_ALLOW); 613392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom 614656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project if (!EVP_CipherInit_ex(ctx, cipher, NULL, NULL, NULL, enc)) 615656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project { 616656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project BIO_printf(bio_err, "Error setting cipher %s\n", 617656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project EVP_CIPHER_name(cipher)); 618656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project ERR_print_errors(bio_err); 619656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project goto end; 620656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project } 621656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 622656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project if (nopad) 623656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project EVP_CIPHER_CTX_set_padding(ctx, 0); 624656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 625656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project if (!EVP_CipherInit_ex(ctx, NULL, NULL, key, iv, enc)) 626656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project { 627656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project BIO_printf(bio_err, "Error setting cipher %s\n", 628656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project EVP_CIPHER_name(cipher)); 629656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project ERR_print_errors(bio_err); 630656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project goto end; 631656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project } 632656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 633656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project if (debug) 634656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project { 635656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project BIO_set_callback(benc,BIO_debug_callback); 636656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project BIO_set_callback_arg(benc,(char *)bio_err); 637656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project } 638656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 639656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project if (printkey) 640656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project { 641656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project if (!nosalt) 642656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project { 643656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project printf("salt="); 644656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project for (i=0; i<(int)sizeof(salt); i++) 645656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project printf("%02X",salt[i]); 646656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project printf("\n"); 647656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project } 648656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project if (cipher->key_len > 0) 649656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project { 650656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project printf("key="); 651656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project for (i=0; i<cipher->key_len; i++) 652656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project printf("%02X",key[i]); 653656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project printf("\n"); 654656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project } 655656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project if (cipher->iv_len > 0) 656656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project { 657656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project printf("iv ="); 658656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project for (i=0; i<cipher->iv_len; i++) 659656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project printf("%02X",iv[i]); 660656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project printf("\n"); 661656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project } 662656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project if (printkey == 2) 663656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project { 664656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project ret=0; 665656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project goto end; 666656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project } 667656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project } 668656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project } 669656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 670656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project /* Only encrypt/decrypt as we write the file */ 671656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project if (benc != NULL) 672656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project wbio=BIO_push(benc,wbio); 673656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 674656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project for (;;) 675656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project { 676656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project inl=BIO_read(rbio,(char *)buff,bsize); 677656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project if (inl <= 0) break; 678656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project if (BIO_write(wbio,(char *)buff,inl) != inl) 679656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project { 680656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project BIO_printf(bio_err,"error writing output file\n"); 681656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project goto end; 682656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project } 683656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project } 684656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project if (!BIO_flush(wbio)) 685656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project { 686656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project BIO_printf(bio_err,"bad decrypt\n"); 687656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project goto end; 688656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project } 689656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 690656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project ret=0; 691656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project if (verbose) 692656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project { 693656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project BIO_printf(bio_err,"bytes read :%8ld\n",BIO_number_read(in)); 694656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project BIO_printf(bio_err,"bytes written:%8ld\n",BIO_number_written(out)); 695656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project } 696656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Projectend: 697656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project ERR_print_errors(bio_err); 698656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project if (strbuf != NULL) OPENSSL_free(strbuf); 699656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project if (buff != NULL) OPENSSL_free(buff); 700656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project if (in != NULL) BIO_free(in); 701656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project if (out != NULL) BIO_free_all(out); 702656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project if (benc != NULL) BIO_free(benc); 703656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project if (b64 != NULL) BIO_free(b64); 704221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom#ifdef ZLIB 705221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom if (bzl != NULL) BIO_free(bzl); 706221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom#endif 707656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project if(pass) OPENSSL_free(pass); 708656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project apps_shutdown(); 709656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project OPENSSL_EXIT(ret); 710656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project } 711656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 712656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Projectint set_hex(char *in, unsigned char *out, int size) 713656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project { 714656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project int i,n; 715656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project unsigned char j; 716656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 717656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project n=strlen(in); 718656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project if (n > (size*2)) 719656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project { 720656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project BIO_printf(bio_err,"hex string is too long\n"); 721656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project return(0); 722656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project } 723656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project memset(out,0,size); 724656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project for (i=0; i<n; i++) 725656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project { 726656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project j=(unsigned char)*in; 727656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project *(in++)='\0'; 728656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project if (j == 0) break; 729656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project if ((j >= '0') && (j <= '9')) 730656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project j-='0'; 731656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project else if ((j >= 'A') && (j <= 'F')) 732656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project j=j-'A'+10; 733656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project else if ((j >= 'a') && (j <= 'f')) 734656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project j=j-'a'+10; 735656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project else 736656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project { 737656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project BIO_printf(bio_err,"non-hex digit\n"); 738656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project return(0); 739656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project } 740656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project if (i&1) 741656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project out[i/2]|=j; 742656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project else 743656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project out[i/2]=(j<<4); 744656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project } 745656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project return(1); 746656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project } 747