s_client.c revision e45f106cb6b47af1f21efe76e933bdea2f5dd1ca
1656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project/* apps/s_client.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 * Copyright (c) 1998-2001 The OpenSSL Project. All rights reserved. 60656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * 61656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * Redistribution and use in source and binary forms, with or without 62656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * modification, are permitted provided that the following conditions 63656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * are met: 64656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * 65656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * 1. Redistributions of source code must retain the above copyright 66656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * notice, this list of conditions and the following disclaimer. 67656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * 68656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * 2. Redistributions in binary form must reproduce the above copyright 69656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * notice, this list of conditions and the following disclaimer in 70656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * the documentation and/or other materials provided with the 71656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * distribution. 72656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * 73656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * 3. All advertising materials mentioning features or use of this 74656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * software must display the following acknowledgment: 75656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * "This product includes software developed by the OpenSSL Project 76656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * for use in the OpenSSL Toolkit. (http://www.openssl.org/)" 77656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * 78656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * 4. The names "OpenSSL Toolkit" and "OpenSSL Project" must not be used to 79656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * endorse or promote products derived from this software without 80656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * prior written permission. For written permission, please contact 81656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * openssl-core@openssl.org. 82656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * 83656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * 5. Products derived from this software may not be called "OpenSSL" 84656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * nor may "OpenSSL" appear in their names without prior written 85656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * permission of the OpenSSL Project. 86656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * 87656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * 6. Redistributions of any form whatsoever must retain the following 88656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * acknowledgment: 89656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * "This product includes software developed by the OpenSSL Project 90656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * for use in the OpenSSL Toolkit (http://www.openssl.org/)" 91656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * 92656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * THIS SOFTWARE IS PROVIDED BY THE OpenSSL PROJECT ``AS IS'' AND ANY 93656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 94656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR 95656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE OpenSSL PROJECT OR 96656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 97656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT 98656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; 99656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 100656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, 101656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) 102656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED 103656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * OF THE POSSIBILITY OF SUCH DAMAGE. 104656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * ==================================================================== 105656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * 106656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * This product includes cryptographic software written by Eric Young 107656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * (eay@cryptsoft.com). This product includes software written by Tim 108656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * Hudson (tjh@cryptsoft.com). 109656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * 110656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project */ 111656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 112656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#include <assert.h> 113656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#include <stdio.h> 114656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#include <stdlib.h> 115656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#include <string.h> 116656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#include <openssl/e_os2.h> 117656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#ifdef OPENSSL_NO_STDIO 118656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#define APPS_WIN16 119656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#endif 120656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 121656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project/* With IPv6, it looks like Digital has mixed up the proper order of 122656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project recursive header file inclusion, resulting in the compiler complaining 123656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project that u_int isn't defined, but only if _POSIX_C_SOURCE is defined, which 124656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project is needed to have fileno() declared correctly... So let's define u_int */ 125656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#if defined(OPENSSL_SYS_VMS_DECC) && !defined(__U_INT) 126656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#define __U_INT 127656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Projecttypedef unsigned int u_int; 128656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#endif 129656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 130656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#define USE_SOCKETS 131656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#include "apps.h" 132656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#include <openssl/x509.h> 133656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#include <openssl/ssl.h> 134656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#include <openssl/err.h> 135656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#include <openssl/pem.h> 136656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#include <openssl/rand.h> 137656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#include <openssl/ocsp.h> 138656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#include "s_apps.h" 139656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#include "timeouts.h" 140656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 141656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#ifdef OPENSSL_SYS_WINCE 142656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project/* Windows CE incorrectly defines fileno as returning void*, so to avoid problems below... */ 143656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#ifdef fileno 144656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#undef fileno 145656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#endif 146656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#define fileno(a) (int)_fileno(a) 147656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#endif 148656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 149656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 150656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#if (defined(OPENSSL_SYS_VMS) && __VMS_VER < 70000000) 151656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project/* FIONBIO used as a switch to enable ioctl, and that isn't in VMS < 7.0 */ 152656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#undef FIONBIO 153656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#endif 154656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 155656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#undef PROG 156656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#define PROG s_client_main 157656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 158656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project/*#define SSL_HOST_NAME "www.netscape.com" */ 159656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project/*#define SSL_HOST_NAME "193.118.187.102" */ 160656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#define SSL_HOST_NAME "localhost" 161656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 162656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project/*#define TEST_CERT "client.pem" */ /* no default cert. */ 163656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 164656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#undef BUFSIZZ 165656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#define BUFSIZZ 1024*8 166656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 167656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Projectextern int verify_depth; 168656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Projectextern int verify_error; 169656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 170656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#ifdef FIONBIO 171656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Projectstatic int c_nbio=0; 172656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#endif 173656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Projectstatic int c_Pause=0; 174656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Projectstatic int c_debug=0; 175656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#ifndef OPENSSL_NO_TLSEXT 176656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Projectstatic int c_tlsextdebug=0; 177656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Projectstatic int c_status_req=0; 178656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#endif 179656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Projectstatic int c_msg=0; 180656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Projectstatic int c_showcerts=0; 181656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 182656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Projectstatic void sc_usage(void); 183656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Projectstatic void print_stuff(BIO *berr,SSL *con,int full); 184656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#ifndef OPENSSL_NO_TLSEXT 185656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Projectstatic int ocsp_resp_cb(SSL *s, void *arg); 186656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#endif 187656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Projectstatic BIO *bio_c_out=NULL; 188656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Projectstatic int c_quiet=0; 189656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Projectstatic int c_ign_eof=0; 190656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 191656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Projectstatic void sc_usage(void) 192656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project { 193656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project BIO_printf(bio_err,"usage: s_client args\n"); 194656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project BIO_printf(bio_err,"\n"); 195656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project BIO_printf(bio_err," -host host - use -connect instead\n"); 196656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project BIO_printf(bio_err," -port port - use -connect instead\n"); 197656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project BIO_printf(bio_err," -connect host:port - who to connect to (default is %s:%s)\n",SSL_HOST_NAME,PORT_STR); 198656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 199656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project BIO_printf(bio_err," -verify depth - turn on peer certificate verification\n"); 200656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project BIO_printf(bio_err," -cert arg - certificate file to use, PEM format assumed\n"); 201656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project BIO_printf(bio_err," -certform arg - certificate format (PEM or DER) PEM default\n"); 202656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project BIO_printf(bio_err," -key arg - Private key file to use, in cert file if\n"); 203656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project BIO_printf(bio_err," not specified but cert file is.\n"); 204656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project BIO_printf(bio_err," -keyform arg - key format (PEM or DER) PEM default\n"); 205656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project BIO_printf(bio_err," -pass arg - private key file pass phrase source\n"); 206656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project BIO_printf(bio_err," -CApath arg - PEM format directory of CA's\n"); 207656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project BIO_printf(bio_err," -CAfile arg - PEM format file of CA's\n"); 208656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project BIO_printf(bio_err," -reconnect - Drop and re-make the connection with the same Session-ID\n"); 209656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project BIO_printf(bio_err," -pause - sleep(1) after each read(2) and write(2) system call\n"); 210656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project BIO_printf(bio_err," -showcerts - show all certificates in the chain\n"); 211656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project BIO_printf(bio_err," -debug - extra output\n"); 212656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#ifdef WATT32 213656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project BIO_printf(bio_err," -wdebug - WATT-32 tcp debugging\n"); 214656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#endif 215656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project BIO_printf(bio_err," -msg - Show protocol messages\n"); 216656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project BIO_printf(bio_err," -nbio_test - more ssl protocol testing\n"); 217656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project BIO_printf(bio_err," -state - print the 'ssl' states\n"); 218656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#ifdef FIONBIO 219656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project BIO_printf(bio_err," -nbio - Run with non-blocking IO\n"); 220656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#endif 221656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project BIO_printf(bio_err," -crlf - convert LF from terminal into CRLF\n"); 222656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project BIO_printf(bio_err," -quiet - no s_client output\n"); 223656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project BIO_printf(bio_err," -ign_eof - ignore input eof (default when -quiet)\n"); 224e45f106cb6b47af1f21efe76e933bdea2f5dd1caNagendra Modadugu BIO_printf(bio_err," -no_ign_eof - don't ignore input eof\n"); 225656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project BIO_printf(bio_err," -ssl2 - just use SSLv2\n"); 226656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project BIO_printf(bio_err," -ssl3 - just use SSLv3\n"); 227656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project BIO_printf(bio_err," -tls1 - just use TLSv1\n"); 228656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project BIO_printf(bio_err," -dtls1 - just use DTLSv1\n"); 229656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project BIO_printf(bio_err," -mtu - set the MTU\n"); 230656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project BIO_printf(bio_err," -no_tls1/-no_ssl3/-no_ssl2 - turn off that protocol\n"); 231656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project BIO_printf(bio_err," -bugs - Switch on all SSL implementation bug workarounds\n"); 232656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project BIO_printf(bio_err," -serverpref - Use server's cipher preferences (only SSLv2)\n"); 233656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project BIO_printf(bio_err," -cipher - preferred cipher to use, use the 'openssl ciphers'\n"); 234656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project BIO_printf(bio_err," command to see what is available\n"); 235656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project BIO_printf(bio_err," -starttls prot - use the STARTTLS command before starting TLS\n"); 236656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project BIO_printf(bio_err," for those protocols that support it, where\n"); 237656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project BIO_printf(bio_err," 'prot' defines which one to assume. Currently,\n"); 238e45f106cb6b47af1f21efe76e933bdea2f5dd1caNagendra Modadugu BIO_printf(bio_err," only \"smtp\", \"pop3\", \"imap\", \"ftp\" and \"xmpp\"\n"); 239e45f106cb6b47af1f21efe76e933bdea2f5dd1caNagendra Modadugu BIO_printf(bio_err," are supported.\n"); 240656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#ifndef OPENSSL_NO_ENGINE 241656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project BIO_printf(bio_err," -engine id - Initialise and use the specified engine\n"); 242656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#endif 243656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project BIO_printf(bio_err," -rand file%cfile%c...\n", LIST_SEPARATOR_CHAR, LIST_SEPARATOR_CHAR); 244656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project BIO_printf(bio_err," -sess_out arg - file to write SSL session to\n"); 245656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project BIO_printf(bio_err," -sess_in arg - file to read SSL session from\n"); 246656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#ifndef OPENSSL_NO_TLSEXT 247656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project BIO_printf(bio_err," -servername host - Set TLS extension servername in ClientHello\n"); 248656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project BIO_printf(bio_err," -tlsextdebug - hex dump of all TLS extensions received\n"); 249656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project BIO_printf(bio_err," -status - request certificate status from server\n"); 250656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project BIO_printf(bio_err," -no_ticket - disable use of RFC4507bis session tickets\n"); 251656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#endif 252656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project } 253656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 254656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#ifndef OPENSSL_NO_TLSEXT 255656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 256656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project/* This is a context that we pass to callbacks */ 257656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Projecttypedef struct tlsextctx_st { 258656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project BIO * biodebug; 259656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project int ack; 260656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project} tlsextctx; 261656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 262656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 263656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Projectstatic int MS_CALLBACK ssl_servername_cb(SSL *s, int *ad, void *arg) 264656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project { 265656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project tlsextctx * p = (tlsextctx *) arg; 266656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project const char * hn= SSL_get_servername(s, TLSEXT_NAMETYPE_host_name); 267656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project if (SSL_get_servername_type(s) != -1) 268656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project p->ack = !SSL_session_reused(s) && hn != NULL; 269656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project else 270656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project BIO_printf(bio_err,"Can't use SSL_get_servername\n"); 271656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 272656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project return SSL_TLSEXT_ERR_OK; 273656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project } 274656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#endif 275656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Projectenum 276656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project{ 277656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project PROTO_OFF = 0, 278656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project PROTO_SMTP, 279656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project PROTO_POP3, 280656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project PROTO_IMAP, 281e45f106cb6b47af1f21efe76e933bdea2f5dd1caNagendra Modadugu PROTO_FTP, 282e45f106cb6b47af1f21efe76e933bdea2f5dd1caNagendra Modadugu PROTO_XMPP 283656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project}; 284656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 285656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Projectint MAIN(int, char **); 286656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 287656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Projectint MAIN(int argc, char **argv) 288656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project { 289656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project int off=0; 290656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project SSL *con=NULL,*con2=NULL; 291656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project X509_STORE *store = NULL; 292656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project int s,k,width,state=0; 293656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project char *cbuf=NULL,*sbuf=NULL,*mbuf=NULL; 294656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project int cbuf_len,cbuf_off; 295656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project int sbuf_len,sbuf_off; 296656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project fd_set readfds,writefds; 297656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project short port=PORT; 298656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project int full_log=1; 299656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project char *host=SSL_HOST_NAME; 300656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project char *cert_file=NULL,*key_file=NULL; 301656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project int cert_format = FORMAT_PEM, key_format = FORMAT_PEM; 302656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project char *passarg = NULL, *pass = NULL; 303656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project X509 *cert = NULL; 304656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project EVP_PKEY *key = NULL; 305656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project char *CApath=NULL,*CAfile=NULL,*cipher=NULL; 306656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project int reconnect=0,badop=0,verify=SSL_VERIFY_NONE,bugs=0; 307656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project int crlf=0; 308656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project int write_tty,read_tty,write_ssl,read_ssl,tty_on,ssl_pending; 309656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project SSL_CTX *ctx=NULL; 310656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project int ret=1,in_init=1,i,nbio_test=0; 311656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project int starttls_proto = PROTO_OFF; 312656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project int prexit = 0, vflags = 0; 313656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project SSL_METHOD *meth=NULL; 314656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#ifdef sock_type 315656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#undef sock_type 316656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#endif 317656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project int sock_type=SOCK_STREAM; 318656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project BIO *sbio; 319656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project char *inrand=NULL; 320656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project int mbuf_len=0; 321e45f106cb6b47af1f21efe76e933bdea2f5dd1caNagendra Modadugu#ifndef OPENSSL_NO_ENGINE 322656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project char *engine_id=NULL; 323e45f106cb6b47af1f21efe76e933bdea2f5dd1caNagendra Modadugu char *ssl_client_engine_id=NULL; 324e45f106cb6b47af1f21efe76e933bdea2f5dd1caNagendra Modadugu ENGINE *ssl_client_engine=NULL; 325e45f106cb6b47af1f21efe76e933bdea2f5dd1caNagendra Modadugu#endif 326656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project ENGINE *e=NULL; 327656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#if defined(OPENSSL_SYS_WINDOWS) || defined(OPENSSL_SYS_MSDOS) || defined(OPENSSL_SYS_NETWARE) 328656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project struct timeval tv; 329656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#endif 330656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 331656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#ifndef OPENSSL_NO_TLSEXT 332656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project char *servername = NULL; 333656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project tlsextctx tlsextcbp = 334656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project {NULL,0}; 335656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#endif 336656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project char *sess_in = NULL; 337656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project char *sess_out = NULL; 338656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project struct sockaddr peer; 339656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project int peerlen = sizeof(peer); 340656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project int enable_timeouts = 0 ; 341656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project long mtu = 0; 342e45f106cb6b47af1f21efe76e933bdea2f5dd1caNagendra Modadugu#ifndef OPENSSL_NO_JPAKE 343e45f106cb6b47af1f21efe76e933bdea2f5dd1caNagendra Modadugu char *jpake_secret = NULL; 344e45f106cb6b47af1f21efe76e933bdea2f5dd1caNagendra Modadugu#endif 345656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 346656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#if !defined(OPENSSL_NO_SSL2) && !defined(OPENSSL_NO_SSL3) 347656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project meth=SSLv23_client_method(); 348656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#elif !defined(OPENSSL_NO_SSL3) 349656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project meth=SSLv3_client_method(); 350656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#elif !defined(OPENSSL_NO_SSL2) 351656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project meth=SSLv2_client_method(); 352656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#endif 353656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 354656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project apps_startup(); 355656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project c_Pause=0; 356656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project c_quiet=0; 357656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project c_ign_eof=0; 358656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project c_debug=0; 359656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project c_msg=0; 360656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project c_showcerts=0; 361656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 362656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project if (bio_err == NULL) 363656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project bio_err=BIO_new_fp(stderr,BIO_NOCLOSE); 364656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 365656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project if (!load_config(bio_err, NULL)) 366656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project goto end; 367656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 368656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project if ( ((cbuf=OPENSSL_malloc(BUFSIZZ)) == NULL) || 369656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project ((sbuf=OPENSSL_malloc(BUFSIZZ)) == NULL) || 370656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project ((mbuf=OPENSSL_malloc(BUFSIZZ)) == NULL)) 371656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project { 372656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project BIO_printf(bio_err,"out of memory\n"); 373656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project goto end; 374656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project } 375656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 376656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project verify_depth=0; 377656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project verify_error=X509_V_OK; 378656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#ifdef FIONBIO 379656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project c_nbio=0; 380656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#endif 381656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 382656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project argc--; 383656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project argv++; 384656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project while (argc >= 1) 385656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project { 386656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project if (strcmp(*argv,"-host") == 0) 387656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project { 388656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project if (--argc < 1) goto bad; 389656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project host= *(++argv); 390656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project } 391656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project else if (strcmp(*argv,"-port") == 0) 392656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project { 393656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project if (--argc < 1) goto bad; 394656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project port=atoi(*(++argv)); 395656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project if (port == 0) goto bad; 396656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project } 397656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project else if (strcmp(*argv,"-connect") == 0) 398656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project { 399656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project if (--argc < 1) goto bad; 400656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project if (!extract_host_port(*(++argv),&host,NULL,&port)) 401656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project goto bad; 402656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project } 403656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project else if (strcmp(*argv,"-verify") == 0) 404656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project { 405656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project verify=SSL_VERIFY_PEER; 406656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project if (--argc < 1) goto bad; 407656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project verify_depth=atoi(*(++argv)); 408656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project BIO_printf(bio_err,"verify depth is %d\n",verify_depth); 409656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project } 410656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project else if (strcmp(*argv,"-cert") == 0) 411656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project { 412656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project if (--argc < 1) goto bad; 413656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project cert_file= *(++argv); 414656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project } 415656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project else if (strcmp(*argv,"-sess_out") == 0) 416656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project { 417656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project if (--argc < 1) goto bad; 418656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project sess_out = *(++argv); 419656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project } 420656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project else if (strcmp(*argv,"-sess_in") == 0) 421656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project { 422656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project if (--argc < 1) goto bad; 423656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project sess_in = *(++argv); 424656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project } 425656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project else if (strcmp(*argv,"-certform") == 0) 426656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project { 427656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project if (--argc < 1) goto bad; 428656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project cert_format = str2fmt(*(++argv)); 429656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project } 430656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project else if (strcmp(*argv,"-crl_check") == 0) 431656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project vflags |= X509_V_FLAG_CRL_CHECK; 432656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project else if (strcmp(*argv,"-crl_check_all") == 0) 433656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project vflags |= X509_V_FLAG_CRL_CHECK|X509_V_FLAG_CRL_CHECK_ALL; 434656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project else if (strcmp(*argv,"-prexit") == 0) 435656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project prexit=1; 436656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project else if (strcmp(*argv,"-crlf") == 0) 437656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project crlf=1; 438656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project else if (strcmp(*argv,"-quiet") == 0) 439656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project { 440656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project c_quiet=1; 441656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project c_ign_eof=1; 442656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project } 443656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project else if (strcmp(*argv,"-ign_eof") == 0) 444656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project c_ign_eof=1; 445e45f106cb6b47af1f21efe76e933bdea2f5dd1caNagendra Modadugu else if (strcmp(*argv,"-no_ign_eof") == 0) 446e45f106cb6b47af1f21efe76e933bdea2f5dd1caNagendra Modadugu c_ign_eof=0; 447656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project else if (strcmp(*argv,"-pause") == 0) 448656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project c_Pause=1; 449656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project else if (strcmp(*argv,"-debug") == 0) 450656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project c_debug=1; 451656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#ifndef OPENSSL_NO_TLSEXT 452656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project else if (strcmp(*argv,"-tlsextdebug") == 0) 453656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project c_tlsextdebug=1; 454656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project else if (strcmp(*argv,"-status") == 0) 455656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project c_status_req=1; 456656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#endif 457656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#ifdef WATT32 458656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project else if (strcmp(*argv,"-wdebug") == 0) 459656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project dbug_init(); 460656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#endif 461656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project else if (strcmp(*argv,"-msg") == 0) 462656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project c_msg=1; 463656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project else if (strcmp(*argv,"-showcerts") == 0) 464656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project c_showcerts=1; 465656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project else if (strcmp(*argv,"-nbio_test") == 0) 466656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project nbio_test=1; 467656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project else if (strcmp(*argv,"-state") == 0) 468656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project state=1; 469656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#ifndef OPENSSL_NO_SSL2 470656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project else if (strcmp(*argv,"-ssl2") == 0) 471656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project meth=SSLv2_client_method(); 472656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#endif 473656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#ifndef OPENSSL_NO_SSL3 474656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project else if (strcmp(*argv,"-ssl3") == 0) 475656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project meth=SSLv3_client_method(); 476656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#endif 477656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#ifndef OPENSSL_NO_TLS1 478656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project else if (strcmp(*argv,"-tls1") == 0) 479656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project meth=TLSv1_client_method(); 480656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#endif 481656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#ifndef OPENSSL_NO_DTLS1 482656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project else if (strcmp(*argv,"-dtls1") == 0) 483656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project { 484656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project meth=DTLSv1_client_method(); 485656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project sock_type=SOCK_DGRAM; 486656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project } 487656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project else if (strcmp(*argv,"-timeout") == 0) 488656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project enable_timeouts=1; 489656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project else if (strcmp(*argv,"-mtu") == 0) 490656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project { 491656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project if (--argc < 1) goto bad; 492656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project mtu = atol(*(++argv)); 493656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project } 494656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#endif 495656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project else if (strcmp(*argv,"-bugs") == 0) 496656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project bugs=1; 497656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project else if (strcmp(*argv,"-keyform") == 0) 498656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project { 499656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project if (--argc < 1) goto bad; 500656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project key_format = str2fmt(*(++argv)); 501656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project } 502656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project else if (strcmp(*argv,"-pass") == 0) 503656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project { 504656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project if (--argc < 1) goto bad; 505656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project passarg = *(++argv); 506656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project } 507656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project else if (strcmp(*argv,"-key") == 0) 508656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project { 509656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project if (--argc < 1) goto bad; 510656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project key_file= *(++argv); 511656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project } 512656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project else if (strcmp(*argv,"-reconnect") == 0) 513656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project { 514656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project reconnect=5; 515656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project } 516656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project else if (strcmp(*argv,"-CApath") == 0) 517656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project { 518656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project if (--argc < 1) goto bad; 519656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project CApath= *(++argv); 520656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project } 521656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project else if (strcmp(*argv,"-CAfile") == 0) 522656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project { 523656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project if (--argc < 1) goto bad; 524656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project CAfile= *(++argv); 525656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project } 526656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project else if (strcmp(*argv,"-no_tls1") == 0) 527656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project off|=SSL_OP_NO_TLSv1; 528656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project else if (strcmp(*argv,"-no_ssl3") == 0) 529656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project off|=SSL_OP_NO_SSLv3; 530656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project else if (strcmp(*argv,"-no_ssl2") == 0) 531656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project off|=SSL_OP_NO_SSLv2; 532656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#ifndef OPENSSL_NO_TLSEXT 533656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project else if (strcmp(*argv,"-no_ticket") == 0) 534656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project { off|=SSL_OP_NO_TICKET; } 535656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#endif 536656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project else if (strcmp(*argv,"-serverpref") == 0) 537656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project off|=SSL_OP_CIPHER_SERVER_PREFERENCE; 538656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project else if (strcmp(*argv,"-cipher") == 0) 539656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project { 540656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project if (--argc < 1) goto bad; 541656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project cipher= *(++argv); 542656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project } 543656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#ifdef FIONBIO 544656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project else if (strcmp(*argv,"-nbio") == 0) 545656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project { c_nbio=1; } 546656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#endif 547656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project else if (strcmp(*argv,"-starttls") == 0) 548656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project { 549656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project if (--argc < 1) goto bad; 550656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project ++argv; 551656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project if (strcmp(*argv,"smtp") == 0) 552656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project starttls_proto = PROTO_SMTP; 553656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project else if (strcmp(*argv,"pop3") == 0) 554656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project starttls_proto = PROTO_POP3; 555656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project else if (strcmp(*argv,"imap") == 0) 556656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project starttls_proto = PROTO_IMAP; 557656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project else if (strcmp(*argv,"ftp") == 0) 558656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project starttls_proto = PROTO_FTP; 559e45f106cb6b47af1f21efe76e933bdea2f5dd1caNagendra Modadugu else if (strcmp(*argv, "xmpp") == 0) 560e45f106cb6b47af1f21efe76e933bdea2f5dd1caNagendra Modadugu starttls_proto = PROTO_XMPP; 561656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project else 562656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project goto bad; 563656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project } 564656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#ifndef OPENSSL_NO_ENGINE 565656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project else if (strcmp(*argv,"-engine") == 0) 566656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project { 567656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project if (--argc < 1) goto bad; 568656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project engine_id = *(++argv); 569656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project } 570e45f106cb6b47af1f21efe76e933bdea2f5dd1caNagendra Modadugu else if (strcmp(*argv,"-ssl_client_engine") == 0) 571e45f106cb6b47af1f21efe76e933bdea2f5dd1caNagendra Modadugu { 572e45f106cb6b47af1f21efe76e933bdea2f5dd1caNagendra Modadugu if (--argc < 1) goto bad; 573e45f106cb6b47af1f21efe76e933bdea2f5dd1caNagendra Modadugu ssl_client_engine_id = *(++argv); 574e45f106cb6b47af1f21efe76e933bdea2f5dd1caNagendra Modadugu } 575656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#endif 576656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project else if (strcmp(*argv,"-rand") == 0) 577656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project { 578656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project if (--argc < 1) goto bad; 579656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project inrand= *(++argv); 580656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project } 581656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#ifndef OPENSSL_NO_TLSEXT 582656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project else if (strcmp(*argv,"-servername") == 0) 583656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project { 584656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project if (--argc < 1) goto bad; 585656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project servername= *(++argv); 586656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project /* meth=TLSv1_client_method(); */ 587656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project } 588656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#endif 589e45f106cb6b47af1f21efe76e933bdea2f5dd1caNagendra Modadugu#ifndef OPENSSL_NO_JPAKE 590e45f106cb6b47af1f21efe76e933bdea2f5dd1caNagendra Modadugu else if (strcmp(*argv,"-jpake") == 0) 591e45f106cb6b47af1f21efe76e933bdea2f5dd1caNagendra Modadugu { 592e45f106cb6b47af1f21efe76e933bdea2f5dd1caNagendra Modadugu if (--argc < 1) goto bad; 593e45f106cb6b47af1f21efe76e933bdea2f5dd1caNagendra Modadugu jpake_secret = *++argv; 594e45f106cb6b47af1f21efe76e933bdea2f5dd1caNagendra Modadugu } 595e45f106cb6b47af1f21efe76e933bdea2f5dd1caNagendra Modadugu#endif 596656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project else 597656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project { 598656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project BIO_printf(bio_err,"unknown option %s\n",*argv); 599656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project badop=1; 600656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project break; 601656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project } 602656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project argc--; 603656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project argv++; 604656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project } 605656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project if (badop) 606656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project { 607656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Projectbad: 608656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project sc_usage(); 609656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project goto end; 610656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project } 611656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 612656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project OpenSSL_add_ssl_algorithms(); 613656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project SSL_load_error_strings(); 614656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 615656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#ifndef OPENSSL_NO_ENGINE 616656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project e = setup_engine(bio_err, engine_id, 1); 617e45f106cb6b47af1f21efe76e933bdea2f5dd1caNagendra Modadugu if (ssl_client_engine_id) 618e45f106cb6b47af1f21efe76e933bdea2f5dd1caNagendra Modadugu { 619e45f106cb6b47af1f21efe76e933bdea2f5dd1caNagendra Modadugu ssl_client_engine = ENGINE_by_id(ssl_client_engine_id); 620e45f106cb6b47af1f21efe76e933bdea2f5dd1caNagendra Modadugu if (!ssl_client_engine) 621e45f106cb6b47af1f21efe76e933bdea2f5dd1caNagendra Modadugu { 622e45f106cb6b47af1f21efe76e933bdea2f5dd1caNagendra Modadugu BIO_printf(bio_err, 623e45f106cb6b47af1f21efe76e933bdea2f5dd1caNagendra Modadugu "Error getting client auth engine\n"); 624e45f106cb6b47af1f21efe76e933bdea2f5dd1caNagendra Modadugu goto end; 625e45f106cb6b47af1f21efe76e933bdea2f5dd1caNagendra Modadugu } 626e45f106cb6b47af1f21efe76e933bdea2f5dd1caNagendra Modadugu } 627656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#endif 628656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project if (!app_passwd(bio_err, passarg, NULL, &pass, NULL)) 629656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project { 630656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project BIO_printf(bio_err, "Error getting password\n"); 631656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project goto end; 632656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project } 633656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 634656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project if (key_file == NULL) 635656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project key_file = cert_file; 636656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 637656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 638656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project if (key_file) 639656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 640656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project { 641656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 642656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project key = load_key(bio_err, key_file, key_format, 0, pass, e, 643656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project "client certificate private key file"); 644656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project if (!key) 645656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project { 646656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project ERR_print_errors(bio_err); 647656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project goto end; 648656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project } 649656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 650656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project } 651656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 652656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project if (cert_file) 653656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 654656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project { 655656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project cert = load_cert(bio_err,cert_file,cert_format, 656656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project NULL, e, "client certificate file"); 657656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 658656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project if (!cert) 659656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project { 660656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project ERR_print_errors(bio_err); 661656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project goto end; 662656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project } 663656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project } 664656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 665656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project if (!app_RAND_load_file(NULL, bio_err, 1) && inrand == NULL 666656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project && !RAND_status()) 667656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project { 668656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project BIO_printf(bio_err,"warning, not much extra random data, consider using the -rand option\n"); 669656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project } 670656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project if (inrand != NULL) 671656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project BIO_printf(bio_err,"%ld semi-random bytes loaded\n", 672656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project app_RAND_load_files(inrand)); 673656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 674656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project if (bio_c_out == NULL) 675656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project { 676656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project if (c_quiet && !c_debug && !c_msg) 677656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project { 678656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project bio_c_out=BIO_new(BIO_s_null()); 679656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project } 680656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project else 681656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project { 682656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project if (bio_c_out == NULL) 683656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project bio_c_out=BIO_new_fp(stdout,BIO_NOCLOSE); 684656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project } 685656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project } 686656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 687656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project ctx=SSL_CTX_new(meth); 688656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project if (ctx == NULL) 689656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project { 690656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project ERR_print_errors(bio_err); 691656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project goto end; 692656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project } 693656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 694e45f106cb6b47af1f21efe76e933bdea2f5dd1caNagendra Modadugu#ifndef OPENSSL_NO_ENGINE 695e45f106cb6b47af1f21efe76e933bdea2f5dd1caNagendra Modadugu if (ssl_client_engine) 696e45f106cb6b47af1f21efe76e933bdea2f5dd1caNagendra Modadugu { 697e45f106cb6b47af1f21efe76e933bdea2f5dd1caNagendra Modadugu if (!SSL_CTX_set_client_cert_engine(ctx, ssl_client_engine)) 698e45f106cb6b47af1f21efe76e933bdea2f5dd1caNagendra Modadugu { 699e45f106cb6b47af1f21efe76e933bdea2f5dd1caNagendra Modadugu BIO_puts(bio_err, "Error setting client auth engine\n"); 700e45f106cb6b47af1f21efe76e933bdea2f5dd1caNagendra Modadugu ERR_print_errors(bio_err); 701e45f106cb6b47af1f21efe76e933bdea2f5dd1caNagendra Modadugu ENGINE_free(ssl_client_engine); 702e45f106cb6b47af1f21efe76e933bdea2f5dd1caNagendra Modadugu goto end; 703e45f106cb6b47af1f21efe76e933bdea2f5dd1caNagendra Modadugu } 704e45f106cb6b47af1f21efe76e933bdea2f5dd1caNagendra Modadugu ENGINE_free(ssl_client_engine); 705e45f106cb6b47af1f21efe76e933bdea2f5dd1caNagendra Modadugu } 706e45f106cb6b47af1f21efe76e933bdea2f5dd1caNagendra Modadugu#endif 707e45f106cb6b47af1f21efe76e933bdea2f5dd1caNagendra Modadugu 708656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project if (bugs) 709656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project SSL_CTX_set_options(ctx,SSL_OP_ALL|off); 710656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project else 711656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project SSL_CTX_set_options(ctx,off); 712656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project /* DTLS: partial reads end up discarding unread UDP bytes :-( 713656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * Setting read ahead solves this problem. 714656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project */ 715656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project if (sock_type == SOCK_DGRAM) SSL_CTX_set_read_ahead(ctx, 1); 716656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 717656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project if (state) SSL_CTX_set_info_callback(ctx,apps_ssl_info_callback); 718656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project if (cipher != NULL) 719656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project if(!SSL_CTX_set_cipher_list(ctx,cipher)) { 720656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project BIO_printf(bio_err,"error setting cipher list\n"); 721656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project ERR_print_errors(bio_err); 722656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project goto end; 723656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project } 724656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#if 0 725656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project else 726656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project SSL_CTX_set_cipher_list(ctx,getenv("SSL_CIPHER")); 727656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#endif 728656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 729656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project SSL_CTX_set_verify(ctx,verify,verify_callback); 730656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project if (!set_cert_key_stuff(ctx,cert,key)) 731656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project goto end; 732656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 733656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project if ((!SSL_CTX_load_verify_locations(ctx,CAfile,CApath)) || 734656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project (!SSL_CTX_set_default_verify_paths(ctx))) 735656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project { 736656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project /* BIO_printf(bio_err,"error setting default verify locations\n"); */ 737656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project ERR_print_errors(bio_err); 738656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project /* goto end; */ 739656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project } 740656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 741656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project store = SSL_CTX_get_cert_store(ctx); 742656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project X509_STORE_set_flags(store, vflags); 743656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#ifndef OPENSSL_NO_TLSEXT 744656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project if (servername != NULL) 745656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project { 746656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project tlsextcbp.biodebug = bio_err; 747656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project SSL_CTX_set_tlsext_servername_callback(ctx, ssl_servername_cb); 748656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project SSL_CTX_set_tlsext_servername_arg(ctx, &tlsextcbp); 749656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project } 750656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#endif 751656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 752656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project con=SSL_new(ctx); 753656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project if (sess_in) 754656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project { 755656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project SSL_SESSION *sess; 756656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project BIO *stmp = BIO_new_file(sess_in, "r"); 757656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project if (!stmp) 758656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project { 759656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project BIO_printf(bio_err, "Can't open session file %s\n", 760656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project sess_in); 761656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project ERR_print_errors(bio_err); 762656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project goto end; 763656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project } 764656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project sess = PEM_read_bio_SSL_SESSION(stmp, NULL, 0, NULL); 765656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project BIO_free(stmp); 766656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project if (!sess) 767656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project { 768656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project BIO_printf(bio_err, "Can't open session file %s\n", 769656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project sess_in); 770656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project ERR_print_errors(bio_err); 771656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project goto end; 772656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project } 773656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project SSL_set_session(con, sess); 774656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project SSL_SESSION_free(sess); 775656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project } 776656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#ifndef OPENSSL_NO_TLSEXT 777656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project if (servername != NULL) 778656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project { 779656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project if (!SSL_set_tlsext_host_name(con,servername)) 780656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project { 781656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project BIO_printf(bio_err,"Unable to set TLS servername extension.\n"); 782656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project ERR_print_errors(bio_err); 783656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project goto end; 784656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project } 785656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project } 786656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#endif 787656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 788656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#ifndef OPENSSL_NO_KRB5 789656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project if (con && (con->kssl_ctx = kssl_ctx_new()) != NULL) 790656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project { 791656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project kssl_ctx_setstring(con->kssl_ctx, KSSL_SERVER, host); 792656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project } 793656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#endif /* OPENSSL_NO_KRB5 */ 794656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project/* SSL_set_cipher_list(con,"RC4-MD5"); */ 795656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 796656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Projectre_start: 797656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 798656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project if (init_client(&s,host,port,sock_type) == 0) 799656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project { 800656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project BIO_printf(bio_err,"connect:errno=%d\n",get_last_socket_error()); 801656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project SHUTDOWN(s); 802656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project goto end; 803656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project } 804656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project BIO_printf(bio_c_out,"CONNECTED(%08X)\n",s); 805656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 806656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#ifdef FIONBIO 807656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project if (c_nbio) 808656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project { 809656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project unsigned long l=1; 810656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project BIO_printf(bio_c_out,"turning on non blocking io\n"); 811656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project if (BIO_socket_ioctl(s,FIONBIO,&l) < 0) 812656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project { 813656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project ERR_print_errors(bio_err); 814656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project goto end; 815656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project } 816656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project } 817656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#endif 818656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project if (c_Pause & 0x01) con->debug=1; 819656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 820656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project if ( SSL_version(con) == DTLS1_VERSION) 821656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project { 822656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project struct timeval timeout; 823656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 824656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project sbio=BIO_new_dgram(s,BIO_NOCLOSE); 825656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project if (getsockname(s, &peer, (void *)&peerlen) < 0) 826656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project { 827656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project BIO_printf(bio_err, "getsockname:errno=%d\n", 828656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project get_last_socket_error()); 829656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project SHUTDOWN(s); 830656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project goto end; 831656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project } 832656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 833656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project (void)BIO_ctrl_set_connected(sbio, 1, &peer); 834656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 835656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project if ( enable_timeouts) 836656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project { 837656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project timeout.tv_sec = 0; 838656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project timeout.tv_usec = DGRAM_RCV_TIMEOUT; 839656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project BIO_ctrl(sbio, BIO_CTRL_DGRAM_SET_RECV_TIMEOUT, 0, &timeout); 840656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 841656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project timeout.tv_sec = 0; 842656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project timeout.tv_usec = DGRAM_SND_TIMEOUT; 843656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project BIO_ctrl(sbio, BIO_CTRL_DGRAM_SET_SEND_TIMEOUT, 0, &timeout); 844656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project } 845656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 846656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project if ( mtu > 0) 847656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project { 848656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project SSL_set_options(con, SSL_OP_NO_QUERY_MTU); 849656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project SSL_set_mtu(con, mtu); 850656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project } 851656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project else 852656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project /* want to do MTU discovery */ 853656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project BIO_ctrl(sbio, BIO_CTRL_DGRAM_MTU_DISCOVER, 0, NULL); 854656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project } 855656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project else 856656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project sbio=BIO_new_socket(s,BIO_NOCLOSE); 857656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 858656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project if (nbio_test) 859656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project { 860656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project BIO *test; 861656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 862656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project test=BIO_new(BIO_f_nbio_test()); 863656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project sbio=BIO_push(test,sbio); 864656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project } 865656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 866656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project if (c_debug) 867656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project { 868656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project con->debug=1; 869656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project BIO_set_callback(sbio,bio_dump_callback); 870656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project BIO_set_callback_arg(sbio,(char *)bio_c_out); 871656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project } 872656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project if (c_msg) 873656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project { 874656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project SSL_set_msg_callback(con, msg_cb); 875656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project SSL_set_msg_callback_arg(con, bio_c_out); 876656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project } 877656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#ifndef OPENSSL_NO_TLSEXT 878656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project if (c_tlsextdebug) 879656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project { 880656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project SSL_set_tlsext_debug_callback(con, tlsext_cb); 881656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project SSL_set_tlsext_debug_arg(con, bio_c_out); 882656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project } 883656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project if (c_status_req) 884656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project { 885656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project SSL_set_tlsext_status_type(con, TLSEXT_STATUSTYPE_ocsp); 886656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project SSL_CTX_set_tlsext_status_cb(ctx, ocsp_resp_cb); 887656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project SSL_CTX_set_tlsext_status_arg(ctx, bio_c_out); 888656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#if 0 889656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project{ 890656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source ProjectSTACK_OF(OCSP_RESPID) *ids = sk_OCSP_RESPID_new_null(); 891656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source ProjectOCSP_RESPID *id = OCSP_RESPID_new(); 892656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Projectid->value.byKey = ASN1_OCTET_STRING_new(); 893656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Projectid->type = V_OCSP_RESPID_KEY; 894656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source ProjectASN1_STRING_set(id->value.byKey, "Hello World", -1); 895656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Projectsk_OCSP_RESPID_push(ids, id); 896656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source ProjectSSL_set_tlsext_status_ids(con, ids); 897656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project} 898656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#endif 899656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project } 900656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#endif 901e45f106cb6b47af1f21efe76e933bdea2f5dd1caNagendra Modadugu#ifndef OPENSSL_NO_JPAKE 902e45f106cb6b47af1f21efe76e933bdea2f5dd1caNagendra Modadugu if (jpake_secret) 903e45f106cb6b47af1f21efe76e933bdea2f5dd1caNagendra Modadugu jpake_client_auth(bio_c_out, sbio, jpake_secret); 904e45f106cb6b47af1f21efe76e933bdea2f5dd1caNagendra Modadugu#endif 905656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 906656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project SSL_set_bio(con,sbio,sbio); 907656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project SSL_set_connect_state(con); 908656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 909656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project /* ok, lets connect */ 910656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project width=SSL_get_fd(con)+1; 911656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 912656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project read_tty=1; 913656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project write_tty=0; 914656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project tty_on=0; 915656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project read_ssl=1; 916656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project write_ssl=1; 917656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 918656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project cbuf_len=0; 919656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project cbuf_off=0; 920656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project sbuf_len=0; 921656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project sbuf_off=0; 922656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 923656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project /* This is an ugly hack that does a lot of assumptions */ 924656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project /* We do have to handle multi-line responses which may come 925656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project in a single packet or not. We therefore have to use 926656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project BIO_gets() which does need a buffering BIO. So during 927656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project the initial chitchat we do push a buffering BIO into the 928656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project chain that is removed again later on to not disturb the 929656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project rest of the s_client operation. */ 930656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project if (starttls_proto == PROTO_SMTP) 931656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project { 932656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project int foundit=0; 933656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project BIO *fbio = BIO_new(BIO_f_buffer()); 934656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project BIO_push(fbio, sbio); 935656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project /* wait for multi-line response to end from SMTP */ 936656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project do 937656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project { 938656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project mbuf_len = BIO_gets(fbio,mbuf,BUFSIZZ); 939656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project } 940656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project while (mbuf_len>3 && mbuf[3]=='-'); 941656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project /* STARTTLS command requires EHLO... */ 942656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project BIO_printf(fbio,"EHLO openssl.client.net\r\n"); 943656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project (void)BIO_flush(fbio); 944656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project /* wait for multi-line response to end EHLO SMTP response */ 945656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project do 946656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project { 947656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project mbuf_len = BIO_gets(fbio,mbuf,BUFSIZZ); 948656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project if (strstr(mbuf,"STARTTLS")) 949656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project foundit=1; 950656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project } 951656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project while (mbuf_len>3 && mbuf[3]=='-'); 952656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project (void)BIO_flush(fbio); 953656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project BIO_pop(fbio); 954656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project BIO_free(fbio); 955656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project if (!foundit) 956656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project BIO_printf(bio_err, 957656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project "didn't found starttls in server response," 958656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project " try anyway...\n"); 959656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project BIO_printf(sbio,"STARTTLS\r\n"); 960656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project BIO_read(sbio,sbuf,BUFSIZZ); 961656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project } 962656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project else if (starttls_proto == PROTO_POP3) 963656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project { 964656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project BIO_read(sbio,mbuf,BUFSIZZ); 965656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project BIO_printf(sbio,"STLS\r\n"); 966656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project BIO_read(sbio,sbuf,BUFSIZZ); 967656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project } 968656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project else if (starttls_proto == PROTO_IMAP) 969656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project { 970656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project int foundit=0; 971656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project BIO *fbio = BIO_new(BIO_f_buffer()); 972656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project BIO_push(fbio, sbio); 973656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project BIO_gets(fbio,mbuf,BUFSIZZ); 974656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project /* STARTTLS command requires CAPABILITY... */ 975656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project BIO_printf(fbio,". CAPABILITY\r\n"); 976656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project (void)BIO_flush(fbio); 977656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project /* wait for multi-line CAPABILITY response */ 978656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project do 979656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project { 980656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project mbuf_len = BIO_gets(fbio,mbuf,BUFSIZZ); 981656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project if (strstr(mbuf,"STARTTLS")) 982656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project foundit=1; 983656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project } 984656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project while (mbuf_len>3 && mbuf[0]!='.'); 985656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project (void)BIO_flush(fbio); 986656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project BIO_pop(fbio); 987656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project BIO_free(fbio); 988656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project if (!foundit) 989656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project BIO_printf(bio_err, 990656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project "didn't found STARTTLS in server response," 991656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project " try anyway...\n"); 992656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project BIO_printf(sbio,". STARTTLS\r\n"); 993656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project BIO_read(sbio,sbuf,BUFSIZZ); 994656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project } 995656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project else if (starttls_proto == PROTO_FTP) 996656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project { 997656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project BIO *fbio = BIO_new(BIO_f_buffer()); 998656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project BIO_push(fbio, sbio); 999656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project /* wait for multi-line response to end from FTP */ 1000656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project do 1001656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project { 1002656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project mbuf_len = BIO_gets(fbio,mbuf,BUFSIZZ); 1003656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project } 1004656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project while (mbuf_len>3 && mbuf[3]=='-'); 1005656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project (void)BIO_flush(fbio); 1006656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project BIO_pop(fbio); 1007656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project BIO_free(fbio); 1008656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project BIO_printf(sbio,"AUTH TLS\r\n"); 1009656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project BIO_read(sbio,sbuf,BUFSIZZ); 1010656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project } 1011e45f106cb6b47af1f21efe76e933bdea2f5dd1caNagendra Modadugu if (starttls_proto == PROTO_XMPP) 1012e45f106cb6b47af1f21efe76e933bdea2f5dd1caNagendra Modadugu { 1013e45f106cb6b47af1f21efe76e933bdea2f5dd1caNagendra Modadugu int seen = 0; 1014e45f106cb6b47af1f21efe76e933bdea2f5dd1caNagendra Modadugu BIO_printf(sbio,"<stream:stream " 1015e45f106cb6b47af1f21efe76e933bdea2f5dd1caNagendra Modadugu "xmlns:stream='http://etherx.jabber.org/streams' " 1016e45f106cb6b47af1f21efe76e933bdea2f5dd1caNagendra Modadugu "xmlns='jabber:client' to='%s' version='1.0'>", host); 1017e45f106cb6b47af1f21efe76e933bdea2f5dd1caNagendra Modadugu seen = BIO_read(sbio,mbuf,BUFSIZZ); 1018e45f106cb6b47af1f21efe76e933bdea2f5dd1caNagendra Modadugu mbuf[seen] = 0; 1019e45f106cb6b47af1f21efe76e933bdea2f5dd1caNagendra Modadugu while (!strstr(mbuf, "<starttls xmlns='urn:ietf:params:xml:ns:xmpp-tls'")) 1020e45f106cb6b47af1f21efe76e933bdea2f5dd1caNagendra Modadugu { 1021e45f106cb6b47af1f21efe76e933bdea2f5dd1caNagendra Modadugu if (strstr(mbuf, "/stream:features>")) 1022e45f106cb6b47af1f21efe76e933bdea2f5dd1caNagendra Modadugu goto shut; 1023e45f106cb6b47af1f21efe76e933bdea2f5dd1caNagendra Modadugu seen = BIO_read(sbio,mbuf,BUFSIZZ); 1024e45f106cb6b47af1f21efe76e933bdea2f5dd1caNagendra Modadugu mbuf[seen] = 0; 1025e45f106cb6b47af1f21efe76e933bdea2f5dd1caNagendra Modadugu } 1026e45f106cb6b47af1f21efe76e933bdea2f5dd1caNagendra Modadugu BIO_printf(sbio, "<starttls xmlns='urn:ietf:params:xml:ns:xmpp-tls'/>"); 1027e45f106cb6b47af1f21efe76e933bdea2f5dd1caNagendra Modadugu seen = BIO_read(sbio,sbuf,BUFSIZZ); 1028e45f106cb6b47af1f21efe76e933bdea2f5dd1caNagendra Modadugu sbuf[seen] = 0; 1029e45f106cb6b47af1f21efe76e933bdea2f5dd1caNagendra Modadugu if (!strstr(sbuf, "<proceed")) 1030e45f106cb6b47af1f21efe76e933bdea2f5dd1caNagendra Modadugu goto shut; 1031e45f106cb6b47af1f21efe76e933bdea2f5dd1caNagendra Modadugu mbuf[0] = 0; 1032e45f106cb6b47af1f21efe76e933bdea2f5dd1caNagendra Modadugu } 1033656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 1034656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project for (;;) 1035656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project { 1036656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project FD_ZERO(&readfds); 1037656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project FD_ZERO(&writefds); 1038656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 1039656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project if (SSL_in_init(con) && !SSL_total_renegotiations(con)) 1040656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project { 1041656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project in_init=1; 1042656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project tty_on=0; 1043656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project } 1044656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project else 1045656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project { 1046656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project tty_on=1; 1047656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project if (in_init) 1048656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project { 1049656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project in_init=0; 1050656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project if (sess_out) 1051656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project { 1052656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project BIO *stmp = BIO_new_file(sess_out, "w"); 1053656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project if (stmp) 1054656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project { 1055656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project PEM_write_bio_SSL_SESSION(stmp, SSL_get_session(con)); 1056656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project BIO_free(stmp); 1057656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project } 1058656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project else 1059656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project BIO_printf(bio_err, "Error writing session file %s\n", sess_out); 1060656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project } 1061656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project print_stuff(bio_c_out,con,full_log); 1062656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project if (full_log > 0) full_log--; 1063656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 1064656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project if (starttls_proto) 1065656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project { 1066656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project BIO_printf(bio_err,"%s",mbuf); 1067656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project /* We don't need to know any more */ 1068656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project starttls_proto = PROTO_OFF; 1069656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project } 1070656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 1071656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project if (reconnect) 1072656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project { 1073656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project reconnect--; 1074656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project BIO_printf(bio_c_out,"drop connection and then reconnect\n"); 1075656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project SSL_shutdown(con); 1076656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project SSL_set_connect_state(con); 1077656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project SHUTDOWN(SSL_get_fd(con)); 1078656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project goto re_start; 1079656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project } 1080656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project } 1081656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project } 1082656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 1083656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project ssl_pending = read_ssl && SSL_pending(con); 1084656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 1085656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project if (!ssl_pending) 1086656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project { 1087656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#if !defined(OPENSSL_SYS_WINDOWS) && !defined(OPENSSL_SYS_MSDOS) && !defined(OPENSSL_SYS_NETWARE) 1088656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project if (tty_on) 1089656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project { 1090656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project if (read_tty) FD_SET(fileno(stdin),&readfds); 1091656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project if (write_tty) FD_SET(fileno(stdout),&writefds); 1092656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project } 1093656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project if (read_ssl) 1094656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project FD_SET(SSL_get_fd(con),&readfds); 1095656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project if (write_ssl) 1096656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project FD_SET(SSL_get_fd(con),&writefds); 1097656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#else 1098656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project if(!tty_on || !write_tty) { 1099656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project if (read_ssl) 1100656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project FD_SET(SSL_get_fd(con),&readfds); 1101656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project if (write_ssl) 1102656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project FD_SET(SSL_get_fd(con),&writefds); 1103656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project } 1104656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#endif 1105656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project/* printf("mode tty(%d %d%d) ssl(%d%d)\n", 1106656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project tty_on,read_tty,write_tty,read_ssl,write_ssl);*/ 1107656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 1108656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project /* Note: under VMS with SOCKETSHR the second parameter 1109656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * is currently of type (int *) whereas under other 1110656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * systems it is (void *) if you don't have a cast it 1111656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * will choke the compiler: if you do have a cast then 1112656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * you can either go for (int *) or (void *). 1113656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project */ 1114656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#if defined(OPENSSL_SYS_WINDOWS) || defined(OPENSSL_SYS_MSDOS) 1115656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project /* Under Windows/DOS we make the assumption that we can 1116656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * always write to the tty: therefore if we need to 1117656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * write to the tty we just fall through. Otherwise 1118656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * we timeout the select every second and see if there 1119656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * are any keypresses. Note: this is a hack, in a proper 1120656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * Windows application we wouldn't do this. 1121656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project */ 1122656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project i=0; 1123656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project if(!write_tty) { 1124656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project if(read_tty) { 1125656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project tv.tv_sec = 1; 1126656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project tv.tv_usec = 0; 1127656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project i=select(width,(void *)&readfds,(void *)&writefds, 1128656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project NULL,&tv); 1129656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#if defined(OPENSSL_SYS_WINCE) || defined(OPENSSL_SYS_MSDOS) 1130656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project if(!i && (!_kbhit() || !read_tty) ) continue; 1131656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#else 1132656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project if(!i && (!((_kbhit()) || (WAIT_OBJECT_0 == WaitForSingleObject(GetStdHandle(STD_INPUT_HANDLE), 0))) || !read_tty) ) continue; 1133656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#endif 1134656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project } else i=select(width,(void *)&readfds,(void *)&writefds, 1135656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project NULL,NULL); 1136656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project } 1137656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#elif defined(OPENSSL_SYS_NETWARE) 1138656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project if(!write_tty) { 1139656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project if(read_tty) { 1140656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project tv.tv_sec = 1; 1141656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project tv.tv_usec = 0; 1142656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project i=select(width,(void *)&readfds,(void *)&writefds, 1143656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project NULL,&tv); 1144656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project } else i=select(width,(void *)&readfds,(void *)&writefds, 1145656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project NULL,NULL); 1146656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project } 1147656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#else 1148656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project i=select(width,(void *)&readfds,(void *)&writefds, 1149656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project NULL,NULL); 1150656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#endif 1151656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project if ( i < 0) 1152656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project { 1153656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project BIO_printf(bio_err,"bad select %d\n", 1154656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project get_last_socket_error()); 1155656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project goto shut; 1156656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project /* goto end; */ 1157656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project } 1158656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project } 1159656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 1160656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project if (!ssl_pending && FD_ISSET(SSL_get_fd(con),&writefds)) 1161656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project { 1162656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project k=SSL_write(con,&(cbuf[cbuf_off]), 1163656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project (unsigned int)cbuf_len); 1164656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project switch (SSL_get_error(con,k)) 1165656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project { 1166656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project case SSL_ERROR_NONE: 1167656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project cbuf_off+=k; 1168656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project cbuf_len-=k; 1169656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project if (k <= 0) goto end; 1170656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project /* we have done a write(con,NULL,0); */ 1171656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project if (cbuf_len <= 0) 1172656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project { 1173656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project read_tty=1; 1174656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project write_ssl=0; 1175656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project } 1176656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project else /* if (cbuf_len > 0) */ 1177656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project { 1178656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project read_tty=0; 1179656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project write_ssl=1; 1180656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project } 1181656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project break; 1182656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project case SSL_ERROR_WANT_WRITE: 1183656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project BIO_printf(bio_c_out,"write W BLOCK\n"); 1184656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project write_ssl=1; 1185656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project read_tty=0; 1186656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project break; 1187656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project case SSL_ERROR_WANT_READ: 1188656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project BIO_printf(bio_c_out,"write R BLOCK\n"); 1189656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project write_tty=0; 1190656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project read_ssl=1; 1191656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project write_ssl=0; 1192656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project break; 1193656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project case SSL_ERROR_WANT_X509_LOOKUP: 1194656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project BIO_printf(bio_c_out,"write X BLOCK\n"); 1195656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project break; 1196656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project case SSL_ERROR_ZERO_RETURN: 1197656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project if (cbuf_len != 0) 1198656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project { 1199656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project BIO_printf(bio_c_out,"shutdown\n"); 1200656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project goto shut; 1201656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project } 1202656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project else 1203656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project { 1204656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project read_tty=1; 1205656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project write_ssl=0; 1206656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project break; 1207656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project } 1208656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 1209656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project case SSL_ERROR_SYSCALL: 1210656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project if ((k != 0) || (cbuf_len != 0)) 1211656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project { 1212656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project BIO_printf(bio_err,"write:errno=%d\n", 1213656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project get_last_socket_error()); 1214656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project goto shut; 1215656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project } 1216656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project else 1217656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project { 1218656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project read_tty=1; 1219656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project write_ssl=0; 1220656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project } 1221656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project break; 1222656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project case SSL_ERROR_SSL: 1223656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project ERR_print_errors(bio_err); 1224656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project goto shut; 1225656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project } 1226656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project } 1227656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#if defined(OPENSSL_SYS_WINDOWS) || defined(OPENSSL_SYS_MSDOS) || defined(OPENSSL_SYS_NETWARE) 1228656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project /* Assume Windows/DOS can always write */ 1229656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project else if (!ssl_pending && write_tty) 1230656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#else 1231656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project else if (!ssl_pending && FD_ISSET(fileno(stdout),&writefds)) 1232656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#endif 1233656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project { 1234656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#ifdef CHARSET_EBCDIC 1235656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project ascii2ebcdic(&(sbuf[sbuf_off]),&(sbuf[sbuf_off]),sbuf_len); 1236656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#endif 1237656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project i=write(fileno(stdout),&(sbuf[sbuf_off]),sbuf_len); 1238656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 1239656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project if (i <= 0) 1240656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project { 1241656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project BIO_printf(bio_c_out,"DONE\n"); 1242656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project goto shut; 1243656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project /* goto end; */ 1244656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project } 1245656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 1246656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project sbuf_len-=i;; 1247656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project sbuf_off+=i; 1248656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project if (sbuf_len <= 0) 1249656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project { 1250656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project read_ssl=1; 1251656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project write_tty=0; 1252656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project } 1253656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project } 1254656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project else if (ssl_pending || FD_ISSET(SSL_get_fd(con),&readfds)) 1255656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project { 1256656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#ifdef RENEG 1257656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project{ static int iiii; if (++iiii == 52) { SSL_renegotiate(con); iiii=0; } } 1258656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#endif 1259656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#if 1 1260656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project k=SSL_read(con,sbuf,1024 /* BUFSIZZ */ ); 1261656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#else 1262656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project/* Demo for pending and peek :-) */ 1263656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project k=SSL_read(con,sbuf,16); 1264656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project{ char zbuf[10240]; 1265656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Projectprintf("read=%d pending=%d peek=%d\n",k,SSL_pending(con),SSL_peek(con,zbuf,10240)); 1266656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project} 1267656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#endif 1268656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 1269656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project switch (SSL_get_error(con,k)) 1270656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project { 1271656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project case SSL_ERROR_NONE: 1272656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project if (k <= 0) 1273656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project goto end; 1274656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project sbuf_off=0; 1275656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project sbuf_len=k; 1276656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 1277656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project read_ssl=0; 1278656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project write_tty=1; 1279656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project break; 1280656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project case SSL_ERROR_WANT_WRITE: 1281656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project BIO_printf(bio_c_out,"read W BLOCK\n"); 1282656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project write_ssl=1; 1283656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project read_tty=0; 1284656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project break; 1285656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project case SSL_ERROR_WANT_READ: 1286656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project BIO_printf(bio_c_out,"read R BLOCK\n"); 1287656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project write_tty=0; 1288656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project read_ssl=1; 1289656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project if ((read_tty == 0) && (write_ssl == 0)) 1290656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project write_ssl=1; 1291656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project break; 1292656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project case SSL_ERROR_WANT_X509_LOOKUP: 1293656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project BIO_printf(bio_c_out,"read X BLOCK\n"); 1294656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project break; 1295656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project case SSL_ERROR_SYSCALL: 1296656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project BIO_printf(bio_err,"read:errno=%d\n",get_last_socket_error()); 1297656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project goto shut; 1298656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project case SSL_ERROR_ZERO_RETURN: 1299656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project BIO_printf(bio_c_out,"closed\n"); 1300656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project goto shut; 1301656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project case SSL_ERROR_SSL: 1302656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project ERR_print_errors(bio_err); 1303656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project goto shut; 1304656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project /* break; */ 1305656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project } 1306656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project } 1307656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 1308656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#if defined(OPENSSL_SYS_WINDOWS) || defined(OPENSSL_SYS_MSDOS) 1309656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#if defined(OPENSSL_SYS_WINCE) || defined(OPENSSL_SYS_MSDOS) 1310656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project else if (_kbhit()) 1311656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#else 1312656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project else if ((_kbhit()) || (WAIT_OBJECT_0 == WaitForSingleObject(GetStdHandle(STD_INPUT_HANDLE), 0))) 1313656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#endif 1314656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#elif defined (OPENSSL_SYS_NETWARE) 1315656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project else if (_kbhit()) 1316656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#else 1317656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project else if (FD_ISSET(fileno(stdin),&readfds)) 1318656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#endif 1319656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project { 1320656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project if (crlf) 1321656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project { 1322656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project int j, lf_num; 1323656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 1324656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project i=read(fileno(stdin),cbuf,BUFSIZZ/2); 1325656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project lf_num = 0; 1326656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project /* both loops are skipped when i <= 0 */ 1327656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project for (j = 0; j < i; j++) 1328656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project if (cbuf[j] == '\n') 1329656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project lf_num++; 1330656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project for (j = i-1; j >= 0; j--) 1331656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project { 1332656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project cbuf[j+lf_num] = cbuf[j]; 1333656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project if (cbuf[j] == '\n') 1334656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project { 1335656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project lf_num--; 1336656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project i++; 1337656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project cbuf[j+lf_num] = '\r'; 1338656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project } 1339656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project } 1340656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project assert(lf_num == 0); 1341656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project } 1342656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project else 1343656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project i=read(fileno(stdin),cbuf,BUFSIZZ); 1344656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 1345656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project if ((!c_ign_eof) && ((i <= 0) || (cbuf[0] == 'Q'))) 1346656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project { 1347656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project BIO_printf(bio_err,"DONE\n"); 1348656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project goto shut; 1349656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project } 1350656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 1351656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project if ((!c_ign_eof) && (cbuf[0] == 'R')) 1352656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project { 1353656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project BIO_printf(bio_err,"RENEGOTIATING\n"); 1354656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project SSL_renegotiate(con); 1355656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project cbuf_len=0; 1356656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project } 1357656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project else 1358656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project { 1359656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project cbuf_len=i; 1360656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project cbuf_off=0; 1361656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#ifdef CHARSET_EBCDIC 1362656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project ebcdic2ascii(cbuf, cbuf, i); 1363656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#endif 1364656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project } 1365656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 1366656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project write_ssl=1; 1367656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project read_tty=0; 1368656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project } 1369656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project } 1370656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Projectshut: 1371656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project SSL_shutdown(con); 1372656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project SHUTDOWN(SSL_get_fd(con)); 1373656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project ret=0; 1374656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Projectend: 1375656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project if(prexit) print_stuff(bio_c_out,con,1); 1376656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project if (con != NULL) SSL_free(con); 1377656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project if (con2 != NULL) SSL_free(con2); 1378656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project if (ctx != NULL) SSL_CTX_free(ctx); 1379656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project if (cert) 1380656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project X509_free(cert); 1381656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project if (key) 1382656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project EVP_PKEY_free(key); 1383656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project if (pass) 1384656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project OPENSSL_free(pass); 1385656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project if (cbuf != NULL) { OPENSSL_cleanse(cbuf,BUFSIZZ); OPENSSL_free(cbuf); } 1386656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project if (sbuf != NULL) { OPENSSL_cleanse(sbuf,BUFSIZZ); OPENSSL_free(sbuf); } 1387656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project if (mbuf != NULL) { OPENSSL_cleanse(mbuf,BUFSIZZ); OPENSSL_free(mbuf); } 1388656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project if (bio_c_out != NULL) 1389656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project { 1390656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project BIO_free(bio_c_out); 1391656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project bio_c_out=NULL; 1392656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project } 1393656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project apps_shutdown(); 1394656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project OPENSSL_EXIT(ret); 1395656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project } 1396656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 1397656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 1398656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Projectstatic void print_stuff(BIO *bio, SSL *s, int full) 1399656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project { 1400656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project X509 *peer=NULL; 1401656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project char *p; 1402656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project static const char *space=" "; 1403656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project char buf[BUFSIZ]; 1404656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project STACK_OF(X509) *sk; 1405656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project STACK_OF(X509_NAME) *sk2; 1406656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project SSL_CIPHER *c; 1407656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project X509_NAME *xn; 1408656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project int j,i; 1409656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#ifndef OPENSSL_NO_COMP 1410656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project const COMP_METHOD *comp, *expansion; 1411656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#endif 1412656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 1413656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project if (full) 1414656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project { 1415656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project int got_a_chain = 0; 1416656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 1417656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project sk=SSL_get_peer_cert_chain(s); 1418656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project if (sk != NULL) 1419656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project { 1420656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project got_a_chain = 1; /* we don't have it for SSL2 (yet) */ 1421656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 1422656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project BIO_printf(bio,"---\nCertificate chain\n"); 1423656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project for (i=0; i<sk_X509_num(sk); i++) 1424656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project { 1425656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project X509_NAME_oneline(X509_get_subject_name( 1426656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project sk_X509_value(sk,i)),buf,sizeof buf); 1427656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project BIO_printf(bio,"%2d s:%s\n",i,buf); 1428656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project X509_NAME_oneline(X509_get_issuer_name( 1429656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project sk_X509_value(sk,i)),buf,sizeof buf); 1430656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project BIO_printf(bio," i:%s\n",buf); 1431656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project if (c_showcerts) 1432656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project PEM_write_bio_X509(bio,sk_X509_value(sk,i)); 1433656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project } 1434656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project } 1435656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 1436656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project BIO_printf(bio,"---\n"); 1437656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project peer=SSL_get_peer_certificate(s); 1438656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project if (peer != NULL) 1439656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project { 1440656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project BIO_printf(bio,"Server certificate\n"); 1441656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project if (!(c_showcerts && got_a_chain)) /* Redundant if we showed the whole chain */ 1442656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project PEM_write_bio_X509(bio,peer); 1443656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project X509_NAME_oneline(X509_get_subject_name(peer), 1444656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project buf,sizeof buf); 1445656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project BIO_printf(bio,"subject=%s\n",buf); 1446656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project X509_NAME_oneline(X509_get_issuer_name(peer), 1447656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project buf,sizeof buf); 1448656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project BIO_printf(bio,"issuer=%s\n",buf); 1449656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project } 1450656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project else 1451656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project BIO_printf(bio,"no peer certificate available\n"); 1452656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 1453656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project sk2=SSL_get_client_CA_list(s); 1454656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project if ((sk2 != NULL) && (sk_X509_NAME_num(sk2) > 0)) 1455656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project { 1456656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project BIO_printf(bio,"---\nAcceptable client certificate CA names\n"); 1457656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project for (i=0; i<sk_X509_NAME_num(sk2); i++) 1458656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project { 1459656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project xn=sk_X509_NAME_value(sk2,i); 1460656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project X509_NAME_oneline(xn,buf,sizeof(buf)); 1461656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project BIO_write(bio,buf,strlen(buf)); 1462656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project BIO_write(bio,"\n",1); 1463656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project } 1464656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project } 1465656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project else 1466656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project { 1467656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project BIO_printf(bio,"---\nNo client certificate CA names sent\n"); 1468656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project } 1469656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project p=SSL_get_shared_ciphers(s,buf,sizeof buf); 1470656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project if (p != NULL) 1471656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project { 1472656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project /* This works only for SSL 2. In later protocol 1473656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * versions, the client does not know what other 1474656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * ciphers (in addition to the one to be used 1475656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * in the current connection) the server supports. */ 1476656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 1477656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project BIO_printf(bio,"---\nCiphers common between both SSL endpoints:\n"); 1478656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project j=i=0; 1479656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project while (*p) 1480656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project { 1481656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project if (*p == ':') 1482656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project { 1483656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project BIO_write(bio,space,15-j%25); 1484656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project i++; 1485656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project j=0; 1486656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project BIO_write(bio,((i%3)?" ":"\n"),1); 1487656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project } 1488656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project else 1489656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project { 1490656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project BIO_write(bio,p,1); 1491656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project j++; 1492656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project } 1493656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project p++; 1494656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project } 1495656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project BIO_write(bio,"\n",1); 1496656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project } 1497656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 1498656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project BIO_printf(bio,"---\nSSL handshake has read %ld bytes and written %ld bytes\n", 1499656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project BIO_number_read(SSL_get_rbio(s)), 1500656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project BIO_number_written(SSL_get_wbio(s))); 1501656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project } 1502656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project BIO_printf(bio,((s->hit)?"---\nReused, ":"---\nNew, ")); 1503656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project c=SSL_get_current_cipher(s); 1504656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project BIO_printf(bio,"%s, Cipher is %s\n", 1505656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project SSL_CIPHER_get_version(c), 1506656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project SSL_CIPHER_get_name(c)); 1507656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project if (peer != NULL) { 1508656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project EVP_PKEY *pktmp; 1509656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project pktmp = X509_get_pubkey(peer); 1510656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project BIO_printf(bio,"Server public key is %d bit\n", 1511656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project EVP_PKEY_bits(pktmp)); 1512656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project EVP_PKEY_free(pktmp); 1513656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project } 1514656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#ifndef OPENSSL_NO_COMP 1515656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project comp=SSL_get_current_compression(s); 1516656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project expansion=SSL_get_current_expansion(s); 1517656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project BIO_printf(bio,"Compression: %s\n", 1518656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project comp ? SSL_COMP_get_name(comp) : "NONE"); 1519656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project BIO_printf(bio,"Expansion: %s\n", 1520656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project expansion ? SSL_COMP_get_name(expansion) : "NONE"); 1521656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#endif 1522656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project SSL_SESSION_print(bio,SSL_get_session(s)); 1523656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project BIO_printf(bio,"---\n"); 1524656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project if (peer != NULL) 1525656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project X509_free(peer); 1526656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project /* flush, or debugging output gets mixed with http response */ 1527656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project (void)BIO_flush(bio); 1528656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project } 1529656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 1530656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#ifndef OPENSSL_NO_TLSEXT 1531656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 1532656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Projectstatic int ocsp_resp_cb(SSL *s, void *arg) 1533656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project { 1534656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project const unsigned char *p; 1535656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project int len; 1536656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project OCSP_RESPONSE *rsp; 1537656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project len = SSL_get_tlsext_status_ocsp_resp(s, &p); 1538656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project BIO_puts(arg, "OCSP response: "); 1539656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project if (!p) 1540656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project { 1541656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project BIO_puts(arg, "no response sent\n"); 1542656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project return 1; 1543656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project } 1544656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project rsp = d2i_OCSP_RESPONSE(NULL, &p, len); 1545656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project if (!rsp) 1546656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project { 1547656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project BIO_puts(arg, "response parse error\n"); 1548656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project BIO_dump_indent(arg, (char *)p, len, 4); 1549656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project return 0; 1550656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project } 1551656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project BIO_puts(arg, "\n======================================\n"); 1552656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project OCSP_RESPONSE_print(arg, rsp, 0); 1553656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project BIO_puts(arg, "======================================\n"); 1554656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project OCSP_RESPONSE_free(rsp); 1555656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project return 1; 1556656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project } 1557656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#endif /* ndef OPENSSL_NO_TLSEXT */ 1558