s_client.c revision 98d58bb80c64b02a33662f0ea80351d4a1535267
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");
22998d58bb80c64b02a33662f0ea80351d4a1535267Brian Carlstrom	BIO_printf(bio_err," -mtu          - set the link layer 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");
2511fada29eaaa2a758ba3f68ee9ede8b6715673146Nagendra Modadugu	BIO_printf(bio_err," -cutthrough       - enable 1-RTT full-handshake for strong ciphers\n");
252656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#endif
25398d58bb80c64b02a33662f0ea80351d4a1535267Brian Carlstrom	BIO_printf(bio_err," -legacy_renegotiation - enable use of legacy renegotiation (dangerous)\n");
254656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	}
255656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
256656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#ifndef OPENSSL_NO_TLSEXT
257656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
258656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project/* This is a context that we pass to callbacks */
259656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Projecttypedef struct tlsextctx_st {
260656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project   BIO * biodebug;
261656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project   int ack;
262656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project} tlsextctx;
263656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
264656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
265656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Projectstatic int MS_CALLBACK ssl_servername_cb(SSL *s, int *ad, void *arg)
266656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	{
267656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	tlsextctx * p = (tlsextctx *) arg;
268656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	const char * hn= SSL_get_servername(s, TLSEXT_NAMETYPE_host_name);
269656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	if (SSL_get_servername_type(s) != -1)
270656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 	        p->ack = !SSL_session_reused(s) && hn != NULL;
271656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	else
272656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		BIO_printf(bio_err,"Can't use SSL_get_servername\n");
273656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
274656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	return SSL_TLSEXT_ERR_OK;
275656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	}
276656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#endif
277656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Projectenum
278656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project{
279656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	PROTO_OFF	= 0,
280656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	PROTO_SMTP,
281656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	PROTO_POP3,
282656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	PROTO_IMAP,
283e45f106cb6b47af1f21efe76e933bdea2f5dd1caNagendra Modadugu	PROTO_FTP,
284e45f106cb6b47af1f21efe76e933bdea2f5dd1caNagendra Modadugu	PROTO_XMPP
285656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project};
286656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
287656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Projectint MAIN(int, char **);
288656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
289656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Projectint MAIN(int argc, char **argv)
290656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	{
29198d58bb80c64b02a33662f0ea80351d4a1535267Brian Carlstrom	int off=0, clr = 0;
292656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	SSL *con=NULL,*con2=NULL;
293656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	X509_STORE *store = NULL;
294656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	int s,k,width,state=0;
295656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	char *cbuf=NULL,*sbuf=NULL,*mbuf=NULL;
296656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	int cbuf_len,cbuf_off;
297656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	int sbuf_len,sbuf_off;
298656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	fd_set readfds,writefds;
299656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	short port=PORT;
300656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	int full_log=1;
301656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	char *host=SSL_HOST_NAME;
302656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	char *cert_file=NULL,*key_file=NULL;
303656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	int cert_format = FORMAT_PEM, key_format = FORMAT_PEM;
304656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	char *passarg = NULL, *pass = NULL;
305656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	X509 *cert = NULL;
306656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	EVP_PKEY *key = NULL;
307656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	char *CApath=NULL,*CAfile=NULL,*cipher=NULL;
308656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	int reconnect=0,badop=0,verify=SSL_VERIFY_NONE,bugs=0;
3091fada29eaaa2a758ba3f68ee9ede8b6715673146Nagendra Modadugu	int cutthrough=0;
310656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	int crlf=0;
311656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	int write_tty,read_tty,write_ssl,read_ssl,tty_on,ssl_pending;
312656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	SSL_CTX *ctx=NULL;
313656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	int ret=1,in_init=1,i,nbio_test=0;
314656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	int starttls_proto = PROTO_OFF;
315656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	int prexit = 0, vflags = 0;
316656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	SSL_METHOD *meth=NULL;
317656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#ifdef sock_type
318656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#undef sock_type
319656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#endif
320656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	int sock_type=SOCK_STREAM;
321656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	BIO *sbio;
322656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	char *inrand=NULL;
323656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	int mbuf_len=0;
32498d58bb80c64b02a33662f0ea80351d4a1535267Brian Carlstrom	struct timeval timeout, *timeoutp;
325e45f106cb6b47af1f21efe76e933bdea2f5dd1caNagendra Modadugu#ifndef OPENSSL_NO_ENGINE
326656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	char *engine_id=NULL;
327e45f106cb6b47af1f21efe76e933bdea2f5dd1caNagendra Modadugu	char *ssl_client_engine_id=NULL;
328e45f106cb6b47af1f21efe76e933bdea2f5dd1caNagendra Modadugu	ENGINE *ssl_client_engine=NULL;
329e45f106cb6b47af1f21efe76e933bdea2f5dd1caNagendra Modadugu#endif
330656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	ENGINE *e=NULL;
331656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#if defined(OPENSSL_SYS_WINDOWS) || defined(OPENSSL_SYS_MSDOS) || defined(OPENSSL_SYS_NETWARE)
332656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	struct timeval tv;
333656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#endif
334656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
335656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#ifndef OPENSSL_NO_TLSEXT
336656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	char *servername = NULL;
337656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project        tlsextctx tlsextcbp =
338656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project        {NULL,0};
339656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#endif
340656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	char *sess_in = NULL;
341656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	char *sess_out = NULL;
342656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	struct sockaddr peer;
343656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	int peerlen = sizeof(peer);
344656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	int enable_timeouts = 0 ;
34598d58bb80c64b02a33662f0ea80351d4a1535267Brian Carlstrom	long socket_mtu = 0;
346e45f106cb6b47af1f21efe76e933bdea2f5dd1caNagendra Modadugu#ifndef OPENSSL_NO_JPAKE
347e45f106cb6b47af1f21efe76e933bdea2f5dd1caNagendra Modadugu	char *jpake_secret = NULL;
348e45f106cb6b47af1f21efe76e933bdea2f5dd1caNagendra Modadugu#endif
349656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
350656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#if !defined(OPENSSL_NO_SSL2) && !defined(OPENSSL_NO_SSL3)
351656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	meth=SSLv23_client_method();
352656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#elif !defined(OPENSSL_NO_SSL3)
353656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	meth=SSLv3_client_method();
354656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#elif !defined(OPENSSL_NO_SSL2)
355656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	meth=SSLv2_client_method();
356656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#endif
357656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
358656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	apps_startup();
359656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	c_Pause=0;
360656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	c_quiet=0;
361656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	c_ign_eof=0;
362656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	c_debug=0;
363656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	c_msg=0;
364656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	c_showcerts=0;
365656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
366656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	if (bio_err == NULL)
367656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		bio_err=BIO_new_fp(stderr,BIO_NOCLOSE);
368656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
369656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	if (!load_config(bio_err, NULL))
370656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		goto end;
371656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
372656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	if (	((cbuf=OPENSSL_malloc(BUFSIZZ)) == NULL) ||
373656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		((sbuf=OPENSSL_malloc(BUFSIZZ)) == NULL) ||
374656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		((mbuf=OPENSSL_malloc(BUFSIZZ)) == NULL))
375656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		{
376656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		BIO_printf(bio_err,"out of memory\n");
377656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		goto end;
378656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		}
379656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
380656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	verify_depth=0;
381656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	verify_error=X509_V_OK;
382656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#ifdef FIONBIO
383656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	c_nbio=0;
384656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#endif
385656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
386656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	argc--;
387656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	argv++;
388656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	while (argc >= 1)
389656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		{
390656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		if	(strcmp(*argv,"-host") == 0)
391656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			{
392656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			if (--argc < 1) goto bad;
393656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			host= *(++argv);
394656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			}
395656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		else if	(strcmp(*argv,"-port") == 0)
396656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			{
397656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			if (--argc < 1) goto bad;
398656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			port=atoi(*(++argv));
399656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			if (port == 0) goto bad;
400656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			}
401656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		else if (strcmp(*argv,"-connect") == 0)
402656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			{
403656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			if (--argc < 1) goto bad;
404656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			if (!extract_host_port(*(++argv),&host,NULL,&port))
405656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project				goto bad;
406656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			}
407656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		else if	(strcmp(*argv,"-verify") == 0)
408656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			{
409656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			verify=SSL_VERIFY_PEER;
410656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			if (--argc < 1) goto bad;
411656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			verify_depth=atoi(*(++argv));
412656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			BIO_printf(bio_err,"verify depth is %d\n",verify_depth);
413656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			}
414656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		else if	(strcmp(*argv,"-cert") == 0)
415656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			{
416656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			if (--argc < 1) goto bad;
417656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			cert_file= *(++argv);
418656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			}
419656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		else if	(strcmp(*argv,"-sess_out") == 0)
420656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			{
421656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			if (--argc < 1) goto bad;
422656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			sess_out = *(++argv);
423656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			}
424656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		else if	(strcmp(*argv,"-sess_in") == 0)
425656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			{
426656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			if (--argc < 1) goto bad;
427656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			sess_in = *(++argv);
428656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			}
429656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		else if	(strcmp(*argv,"-certform") == 0)
430656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			{
431656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			if (--argc < 1) goto bad;
432656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			cert_format = str2fmt(*(++argv));
433656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			}
434656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		else if	(strcmp(*argv,"-crl_check") == 0)
435656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			vflags |= X509_V_FLAG_CRL_CHECK;
436656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		else if	(strcmp(*argv,"-crl_check_all") == 0)
437656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			vflags |= X509_V_FLAG_CRL_CHECK|X509_V_FLAG_CRL_CHECK_ALL;
438656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		else if	(strcmp(*argv,"-prexit") == 0)
439656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			prexit=1;
440656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		else if	(strcmp(*argv,"-crlf") == 0)
441656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			crlf=1;
442656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		else if	(strcmp(*argv,"-quiet") == 0)
443656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			{
444656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			c_quiet=1;
445656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			c_ign_eof=1;
446656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			}
447656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		else if	(strcmp(*argv,"-ign_eof") == 0)
448656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			c_ign_eof=1;
449e45f106cb6b47af1f21efe76e933bdea2f5dd1caNagendra Modadugu		else if	(strcmp(*argv,"-no_ign_eof") == 0)
450e45f106cb6b47af1f21efe76e933bdea2f5dd1caNagendra Modadugu			c_ign_eof=0;
451656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		else if	(strcmp(*argv,"-pause") == 0)
452656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			c_Pause=1;
453656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		else if	(strcmp(*argv,"-debug") == 0)
454656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			c_debug=1;
455656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#ifndef OPENSSL_NO_TLSEXT
456656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		else if	(strcmp(*argv,"-tlsextdebug") == 0)
457656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			c_tlsextdebug=1;
458656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		else if	(strcmp(*argv,"-status") == 0)
459656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			c_status_req=1;
460656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#endif
461656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#ifdef WATT32
462656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		else if (strcmp(*argv,"-wdebug") == 0)
463656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			dbug_init();
464656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#endif
465656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		else if	(strcmp(*argv,"-msg") == 0)
466656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			c_msg=1;
467656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		else if	(strcmp(*argv,"-showcerts") == 0)
468656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			c_showcerts=1;
469656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		else if	(strcmp(*argv,"-nbio_test") == 0)
470656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			nbio_test=1;
471656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		else if	(strcmp(*argv,"-state") == 0)
472656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			state=1;
473656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#ifndef OPENSSL_NO_SSL2
474656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		else if	(strcmp(*argv,"-ssl2") == 0)
475656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			meth=SSLv2_client_method();
476656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#endif
477656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#ifndef OPENSSL_NO_SSL3
478656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		else if	(strcmp(*argv,"-ssl3") == 0)
479656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			meth=SSLv3_client_method();
480656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#endif
481656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#ifndef OPENSSL_NO_TLS1
482656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		else if	(strcmp(*argv,"-tls1") == 0)
483656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			meth=TLSv1_client_method();
484656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#endif
485656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#ifndef OPENSSL_NO_DTLS1
486656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		else if	(strcmp(*argv,"-dtls1") == 0)
487656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			{
488656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			meth=DTLSv1_client_method();
489656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			sock_type=SOCK_DGRAM;
490656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			}
491656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		else if (strcmp(*argv,"-timeout") == 0)
492656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			enable_timeouts=1;
493656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		else if (strcmp(*argv,"-mtu") == 0)
494656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			{
495656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			if (--argc < 1) goto bad;
49698d58bb80c64b02a33662f0ea80351d4a1535267Brian Carlstrom			socket_mtu = atol(*(++argv));
497656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			}
498656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#endif
499656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		else if (strcmp(*argv,"-bugs") == 0)
500656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			bugs=1;
501656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		else if	(strcmp(*argv,"-keyform") == 0)
502656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			{
503656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			if (--argc < 1) goto bad;
504656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			key_format = str2fmt(*(++argv));
505656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			}
506656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		else if	(strcmp(*argv,"-pass") == 0)
507656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			{
508656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			if (--argc < 1) goto bad;
509656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			passarg = *(++argv);
510656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			}
511656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		else if	(strcmp(*argv,"-key") == 0)
512656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			{
513656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			if (--argc < 1) goto bad;
514656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			key_file= *(++argv);
515656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			}
516656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		else if	(strcmp(*argv,"-reconnect") == 0)
517656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			{
518656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			reconnect=5;
519656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			}
520656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		else if	(strcmp(*argv,"-CApath") == 0)
521656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			{
522656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			if (--argc < 1) goto bad;
523656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			CApath= *(++argv);
524656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			}
525656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		else if	(strcmp(*argv,"-CAfile") == 0)
526656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			{
527656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			if (--argc < 1) goto bad;
528656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			CAfile= *(++argv);
529656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			}
530656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		else if (strcmp(*argv,"-no_tls1") == 0)
531656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			off|=SSL_OP_NO_TLSv1;
532656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		else if (strcmp(*argv,"-no_ssl3") == 0)
533656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			off|=SSL_OP_NO_SSLv3;
534656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		else if (strcmp(*argv,"-no_ssl2") == 0)
535656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			off|=SSL_OP_NO_SSLv2;
536656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#ifndef OPENSSL_NO_TLSEXT
537656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		else if	(strcmp(*argv,"-no_ticket") == 0)
538656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			{ off|=SSL_OP_NO_TICKET; }
539656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#endif
5401fada29eaaa2a758ba3f68ee9ede8b6715673146Nagendra Modadugu		else if (strcmp(*argv,"-cutthrough") == 0)
5411fada29eaaa2a758ba3f68ee9ede8b6715673146Nagendra Modadugu			cutthrough=1;
542656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		else if (strcmp(*argv,"-serverpref") == 0)
543656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			off|=SSL_OP_CIPHER_SERVER_PREFERENCE;
54498d58bb80c64b02a33662f0ea80351d4a1535267Brian Carlstrom		else if (strcmp(*argv,"-legacy_renegotiation") == 0)
54598d58bb80c64b02a33662f0ea80351d4a1535267Brian Carlstrom			off|=SSL_OP_ALLOW_UNSAFE_LEGACY_RENEGOTIATION;
54698d58bb80c64b02a33662f0ea80351d4a1535267Brian Carlstrom		else if	(strcmp(*argv,"-legacy_server_connect") == 0)
54798d58bb80c64b02a33662f0ea80351d4a1535267Brian Carlstrom			{ off|=SSL_OP_LEGACY_SERVER_CONNECT; }
54898d58bb80c64b02a33662f0ea80351d4a1535267Brian Carlstrom		else if	(strcmp(*argv,"-no_legacy_server_connect") == 0)
54998d58bb80c64b02a33662f0ea80351d4a1535267Brian Carlstrom			{ clr|=SSL_OP_LEGACY_SERVER_CONNECT; }
550656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		else if	(strcmp(*argv,"-cipher") == 0)
551656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			{
552656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			if (--argc < 1) goto bad;
553656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			cipher= *(++argv);
554656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			}
555656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#ifdef FIONBIO
556656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		else if (strcmp(*argv,"-nbio") == 0)
557656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			{ c_nbio=1; }
558656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#endif
559656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		else if	(strcmp(*argv,"-starttls") == 0)
560656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			{
561656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			if (--argc < 1) goto bad;
562656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			++argv;
563656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			if (strcmp(*argv,"smtp") == 0)
564656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project				starttls_proto = PROTO_SMTP;
565656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			else if (strcmp(*argv,"pop3") == 0)
566656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project				starttls_proto = PROTO_POP3;
567656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			else if (strcmp(*argv,"imap") == 0)
568656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project				starttls_proto = PROTO_IMAP;
569656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			else if (strcmp(*argv,"ftp") == 0)
570656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project				starttls_proto = PROTO_FTP;
571e45f106cb6b47af1f21efe76e933bdea2f5dd1caNagendra Modadugu			else if (strcmp(*argv, "xmpp") == 0)
572e45f106cb6b47af1f21efe76e933bdea2f5dd1caNagendra Modadugu				starttls_proto = PROTO_XMPP;
573656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			else
574656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project				goto bad;
575656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			}
576656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#ifndef OPENSSL_NO_ENGINE
577656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		else if	(strcmp(*argv,"-engine") == 0)
578656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			{
579656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			if (--argc < 1) goto bad;
580656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			engine_id = *(++argv);
581656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			}
582e45f106cb6b47af1f21efe76e933bdea2f5dd1caNagendra Modadugu		else if	(strcmp(*argv,"-ssl_client_engine") == 0)
583e45f106cb6b47af1f21efe76e933bdea2f5dd1caNagendra Modadugu			{
584e45f106cb6b47af1f21efe76e933bdea2f5dd1caNagendra Modadugu			if (--argc < 1) goto bad;
585e45f106cb6b47af1f21efe76e933bdea2f5dd1caNagendra Modadugu			ssl_client_engine_id = *(++argv);
586e45f106cb6b47af1f21efe76e933bdea2f5dd1caNagendra Modadugu			}
587656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#endif
588656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		else if (strcmp(*argv,"-rand") == 0)
589656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			{
590656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			if (--argc < 1) goto bad;
591656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			inrand= *(++argv);
592656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			}
593656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#ifndef OPENSSL_NO_TLSEXT
594656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		else if (strcmp(*argv,"-servername") == 0)
595656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			{
596656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			if (--argc < 1) goto bad;
597656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			servername= *(++argv);
598656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			/* meth=TLSv1_client_method(); */
599656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			}
600656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#endif
601e45f106cb6b47af1f21efe76e933bdea2f5dd1caNagendra Modadugu#ifndef OPENSSL_NO_JPAKE
602e45f106cb6b47af1f21efe76e933bdea2f5dd1caNagendra Modadugu		else if (strcmp(*argv,"-jpake") == 0)
603e45f106cb6b47af1f21efe76e933bdea2f5dd1caNagendra Modadugu			{
604e45f106cb6b47af1f21efe76e933bdea2f5dd1caNagendra Modadugu			if (--argc < 1) goto bad;
605e45f106cb6b47af1f21efe76e933bdea2f5dd1caNagendra Modadugu			jpake_secret = *++argv;
606e45f106cb6b47af1f21efe76e933bdea2f5dd1caNagendra Modadugu			}
607e45f106cb6b47af1f21efe76e933bdea2f5dd1caNagendra Modadugu#endif
608656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		else
609656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			{
610656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			BIO_printf(bio_err,"unknown option %s\n",*argv);
611656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			badop=1;
612656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			break;
613656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			}
614656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		argc--;
615656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		argv++;
616656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		}
617656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	if (badop)
618656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		{
619656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Projectbad:
620656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		sc_usage();
621656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		goto end;
622656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		}
623656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
624656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	OpenSSL_add_ssl_algorithms();
625656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	SSL_load_error_strings();
626656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
627656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#ifndef OPENSSL_NO_ENGINE
628656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project        e = setup_engine(bio_err, engine_id, 1);
629e45f106cb6b47af1f21efe76e933bdea2f5dd1caNagendra Modadugu	if (ssl_client_engine_id)
630e45f106cb6b47af1f21efe76e933bdea2f5dd1caNagendra Modadugu		{
631e45f106cb6b47af1f21efe76e933bdea2f5dd1caNagendra Modadugu		ssl_client_engine = ENGINE_by_id(ssl_client_engine_id);
632e45f106cb6b47af1f21efe76e933bdea2f5dd1caNagendra Modadugu		if (!ssl_client_engine)
633e45f106cb6b47af1f21efe76e933bdea2f5dd1caNagendra Modadugu			{
634e45f106cb6b47af1f21efe76e933bdea2f5dd1caNagendra Modadugu			BIO_printf(bio_err,
635e45f106cb6b47af1f21efe76e933bdea2f5dd1caNagendra Modadugu					"Error getting client auth engine\n");
636e45f106cb6b47af1f21efe76e933bdea2f5dd1caNagendra Modadugu			goto end;
637e45f106cb6b47af1f21efe76e933bdea2f5dd1caNagendra Modadugu			}
638e45f106cb6b47af1f21efe76e933bdea2f5dd1caNagendra Modadugu		}
639656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#endif
640656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	if (!app_passwd(bio_err, passarg, NULL, &pass, NULL))
641656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		{
642656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		BIO_printf(bio_err, "Error getting password\n");
643656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		goto end;
644656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		}
645656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
646656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	if (key_file == NULL)
647656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		key_file = cert_file;
648656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
649656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
650656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	if (key_file)
651656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
652656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		{
653656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
654656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		key = load_key(bio_err, key_file, key_format, 0, pass, e,
655656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			       "client certificate private key file");
656656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		if (!key)
657656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			{
658656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			ERR_print_errors(bio_err);
659656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			goto end;
660656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			}
661656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
662656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		}
663656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
664656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	if (cert_file)
665656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
666656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		{
667656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		cert = load_cert(bio_err,cert_file,cert_format,
668656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project				NULL, e, "client certificate file");
669656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
670656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		if (!cert)
671656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			{
672656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			ERR_print_errors(bio_err);
673656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			goto end;
674656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			}
675656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		}
676656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
677656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	if (!app_RAND_load_file(NULL, bio_err, 1) && inrand == NULL
678656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		&& !RAND_status())
679656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		{
680656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		BIO_printf(bio_err,"warning, not much extra random data, consider using the -rand option\n");
681656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		}
682656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	if (inrand != NULL)
683656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		BIO_printf(bio_err,"%ld semi-random bytes loaded\n",
684656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			app_RAND_load_files(inrand));
685656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
686656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	if (bio_c_out == NULL)
687656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		{
688656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		if (c_quiet && !c_debug && !c_msg)
689656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			{
690656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			bio_c_out=BIO_new(BIO_s_null());
691656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			}
692656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		else
693656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			{
694656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			if (bio_c_out == NULL)
695656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project				bio_c_out=BIO_new_fp(stdout,BIO_NOCLOSE);
696656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			}
697656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		}
698656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
699656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	ctx=SSL_CTX_new(meth);
700656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	if (ctx == NULL)
701656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		{
702656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		ERR_print_errors(bio_err);
703656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		goto end;
704656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		}
705656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
706e45f106cb6b47af1f21efe76e933bdea2f5dd1caNagendra Modadugu#ifndef OPENSSL_NO_ENGINE
707e45f106cb6b47af1f21efe76e933bdea2f5dd1caNagendra Modadugu	if (ssl_client_engine)
708e45f106cb6b47af1f21efe76e933bdea2f5dd1caNagendra Modadugu		{
709e45f106cb6b47af1f21efe76e933bdea2f5dd1caNagendra Modadugu		if (!SSL_CTX_set_client_cert_engine(ctx, ssl_client_engine))
710e45f106cb6b47af1f21efe76e933bdea2f5dd1caNagendra Modadugu			{
711e45f106cb6b47af1f21efe76e933bdea2f5dd1caNagendra Modadugu			BIO_puts(bio_err, "Error setting client auth engine\n");
712e45f106cb6b47af1f21efe76e933bdea2f5dd1caNagendra Modadugu			ERR_print_errors(bio_err);
713e45f106cb6b47af1f21efe76e933bdea2f5dd1caNagendra Modadugu			ENGINE_free(ssl_client_engine);
714e45f106cb6b47af1f21efe76e933bdea2f5dd1caNagendra Modadugu			goto end;
715e45f106cb6b47af1f21efe76e933bdea2f5dd1caNagendra Modadugu			}
716e45f106cb6b47af1f21efe76e933bdea2f5dd1caNagendra Modadugu		ENGINE_free(ssl_client_engine);
717e45f106cb6b47af1f21efe76e933bdea2f5dd1caNagendra Modadugu		}
718e45f106cb6b47af1f21efe76e933bdea2f5dd1caNagendra Modadugu#endif
719e45f106cb6b47af1f21efe76e933bdea2f5dd1caNagendra Modadugu
720656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	if (bugs)
721656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		SSL_CTX_set_options(ctx,SSL_OP_ALL|off);
722656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	else
723656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		SSL_CTX_set_options(ctx,off);
72498d58bb80c64b02a33662f0ea80351d4a1535267Brian Carlstrom
72598d58bb80c64b02a33662f0ea80351d4a1535267Brian Carlstrom	if (clr)
72698d58bb80c64b02a33662f0ea80351d4a1535267Brian Carlstrom		SSL_CTX_clear_options(ctx, clr);
727656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	/* DTLS: partial reads end up discarding unread UDP bytes :-(
728656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	 * Setting read ahead solves this problem.
729656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	 */
730656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	if (sock_type == SOCK_DGRAM) SSL_CTX_set_read_ahead(ctx, 1);
731656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
7321fada29eaaa2a758ba3f68ee9ede8b6715673146Nagendra Modadugu	/* Enable handshake cutthrough for client connections using
7331fada29eaaa2a758ba3f68ee9ede8b6715673146Nagendra Modadugu	 * strong ciphers. */
7341fada29eaaa2a758ba3f68ee9ede8b6715673146Nagendra Modadugu	if (cutthrough)
7351fada29eaaa2a758ba3f68ee9ede8b6715673146Nagendra Modadugu		{
7361fada29eaaa2a758ba3f68ee9ede8b6715673146Nagendra Modadugu		int ssl_mode = SSL_CTX_get_mode(ctx);
7371fada29eaaa2a758ba3f68ee9ede8b6715673146Nagendra Modadugu		ssl_mode |= SSL_MODE_HANDSHAKE_CUTTHROUGH;
7381fada29eaaa2a758ba3f68ee9ede8b6715673146Nagendra Modadugu		SSL_CTX_set_mode(ctx, ssl_mode);
7391fada29eaaa2a758ba3f68ee9ede8b6715673146Nagendra Modadugu		}
7401fada29eaaa2a758ba3f68ee9ede8b6715673146Nagendra Modadugu
741656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	if (state) SSL_CTX_set_info_callback(ctx,apps_ssl_info_callback);
742656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	if (cipher != NULL)
743656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		if(!SSL_CTX_set_cipher_list(ctx,cipher)) {
744656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		BIO_printf(bio_err,"error setting cipher list\n");
745656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		ERR_print_errors(bio_err);
746656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		goto end;
747656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	}
748656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#if 0
749656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	else
750656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		SSL_CTX_set_cipher_list(ctx,getenv("SSL_CIPHER"));
751656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#endif
752656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
753656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	SSL_CTX_set_verify(ctx,verify,verify_callback);
754656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	if (!set_cert_key_stuff(ctx,cert,key))
755656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		goto end;
756656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
757656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	if ((!SSL_CTX_load_verify_locations(ctx,CAfile,CApath)) ||
758656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		(!SSL_CTX_set_default_verify_paths(ctx)))
759656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		{
760656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		/* BIO_printf(bio_err,"error setting default verify locations\n"); */
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
765656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	store = SSL_CTX_get_cert_store(ctx);
766656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	X509_STORE_set_flags(store, vflags);
767656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#ifndef OPENSSL_NO_TLSEXT
768656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	if (servername != NULL)
769656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		{
770656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		tlsextcbp.biodebug = bio_err;
771656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		SSL_CTX_set_tlsext_servername_callback(ctx, ssl_servername_cb);
772656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		SSL_CTX_set_tlsext_servername_arg(ctx, &tlsextcbp);
773656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		}
774656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#endif
775656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
776656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	con=SSL_new(ctx);
777656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	if (sess_in)
778656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		{
779656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		SSL_SESSION *sess;
780656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		BIO *stmp = BIO_new_file(sess_in, "r");
781656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		if (!stmp)
782656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			{
783656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			BIO_printf(bio_err, "Can't open session file %s\n",
784656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project						sess_in);
785656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			ERR_print_errors(bio_err);
786656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			goto end;
787656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			}
788656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		sess = PEM_read_bio_SSL_SESSION(stmp, NULL, 0, NULL);
789656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		BIO_free(stmp);
790656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		if (!sess)
791656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			{
792656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			BIO_printf(bio_err, "Can't open session file %s\n",
793656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project						sess_in);
794656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			ERR_print_errors(bio_err);
795656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			goto end;
796656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			}
797656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		SSL_set_session(con, sess);
798656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		SSL_SESSION_free(sess);
799656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		}
800656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#ifndef OPENSSL_NO_TLSEXT
801656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	if (servername != NULL)
802656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		{
803656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		if (!SSL_set_tlsext_host_name(con,servername))
804656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			{
805656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			BIO_printf(bio_err,"Unable to set TLS servername extension.\n");
806656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			ERR_print_errors(bio_err);
807656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			goto end;
808656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			}
809656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		}
810656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#endif
811656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
812656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#ifndef OPENSSL_NO_KRB5
813656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	if (con  &&  (con->kssl_ctx = kssl_ctx_new()) != NULL)
814656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project                {
815656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project                kssl_ctx_setstring(con->kssl_ctx, KSSL_SERVER, host);
816656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		}
817656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#endif	/* OPENSSL_NO_KRB5  */
818656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project/*	SSL_set_cipher_list(con,"RC4-MD5"); */
819656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
820656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Projectre_start:
821656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
822656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	if (init_client(&s,host,port,sock_type) == 0)
823656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		{
824656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		BIO_printf(bio_err,"connect:errno=%d\n",get_last_socket_error());
825656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		SHUTDOWN(s);
826656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		goto end;
827656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		}
828656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	BIO_printf(bio_c_out,"CONNECTED(%08X)\n",s);
829656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
830656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#ifdef FIONBIO
831656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	if (c_nbio)
832656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		{
833656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		unsigned long l=1;
834656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		BIO_printf(bio_c_out,"turning on non blocking io\n");
835656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		if (BIO_socket_ioctl(s,FIONBIO,&l) < 0)
836656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			{
837656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			ERR_print_errors(bio_err);
838656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			goto end;
839656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			}
840656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		}
841656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#endif
842656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	if (c_Pause & 0x01) con->debug=1;
843656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
844656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	if ( SSL_version(con) == DTLS1_VERSION)
845656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		{
846656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
847656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		sbio=BIO_new_dgram(s,BIO_NOCLOSE);
848656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		if (getsockname(s, &peer, (void *)&peerlen) < 0)
849656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			{
850656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			BIO_printf(bio_err, "getsockname:errno=%d\n",
851656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project				get_last_socket_error());
852656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			SHUTDOWN(s);
853656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			goto end;
854656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			}
855656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
856656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		(void)BIO_ctrl_set_connected(sbio, 1, &peer);
857656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
858656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		if ( enable_timeouts)
859656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			{
860656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			timeout.tv_sec = 0;
861656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			timeout.tv_usec = DGRAM_RCV_TIMEOUT;
862656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			BIO_ctrl(sbio, BIO_CTRL_DGRAM_SET_RECV_TIMEOUT, 0, &timeout);
863656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
864656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			timeout.tv_sec = 0;
865656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			timeout.tv_usec = DGRAM_SND_TIMEOUT;
866656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			BIO_ctrl(sbio, BIO_CTRL_DGRAM_SET_SEND_TIMEOUT, 0, &timeout);
867656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			}
868656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
86998d58bb80c64b02a33662f0ea80351d4a1535267Brian Carlstrom		if (socket_mtu > 28)
870656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			{
871656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			SSL_set_options(con, SSL_OP_NO_QUERY_MTU);
87298d58bb80c64b02a33662f0ea80351d4a1535267Brian Carlstrom			SSL_set_mtu(con, socket_mtu - 28);
873656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			}
874656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		else
875656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			/* want to do MTU discovery */
876656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			BIO_ctrl(sbio, BIO_CTRL_DGRAM_MTU_DISCOVER, 0, NULL);
877656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		}
878656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	else
879656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		sbio=BIO_new_socket(s,BIO_NOCLOSE);
880656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
881656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	if (nbio_test)
882656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		{
883656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		BIO *test;
884656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
885656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		test=BIO_new(BIO_f_nbio_test());
886656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		sbio=BIO_push(test,sbio);
887656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		}
888656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
889656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	if (c_debug)
890656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		{
891656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		con->debug=1;
892656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		BIO_set_callback(sbio,bio_dump_callback);
893656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		BIO_set_callback_arg(sbio,(char *)bio_c_out);
894656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		}
895656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	if (c_msg)
896656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		{
897656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		SSL_set_msg_callback(con, msg_cb);
898656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		SSL_set_msg_callback_arg(con, bio_c_out);
899656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		}
900656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#ifndef OPENSSL_NO_TLSEXT
901656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	if (c_tlsextdebug)
902656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		{
903656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		SSL_set_tlsext_debug_callback(con, tlsext_cb);
904656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		SSL_set_tlsext_debug_arg(con, bio_c_out);
905656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		}
906656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	if (c_status_req)
907656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		{
908656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		SSL_set_tlsext_status_type(con, TLSEXT_STATUSTYPE_ocsp);
909656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		SSL_CTX_set_tlsext_status_cb(ctx, ocsp_resp_cb);
910656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		SSL_CTX_set_tlsext_status_arg(ctx, bio_c_out);
911656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#if 0
912656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project{
913656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source ProjectSTACK_OF(OCSP_RESPID) *ids = sk_OCSP_RESPID_new_null();
914656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source ProjectOCSP_RESPID *id = OCSP_RESPID_new();
915656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Projectid->value.byKey = ASN1_OCTET_STRING_new();
916656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Projectid->type = V_OCSP_RESPID_KEY;
917656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source ProjectASN1_STRING_set(id->value.byKey, "Hello World", -1);
918656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Projectsk_OCSP_RESPID_push(ids, id);
919656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source ProjectSSL_set_tlsext_status_ids(con, ids);
920656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project}
921656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#endif
922656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		}
923656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#endif
924e45f106cb6b47af1f21efe76e933bdea2f5dd1caNagendra Modadugu#ifndef OPENSSL_NO_JPAKE
925e45f106cb6b47af1f21efe76e933bdea2f5dd1caNagendra Modadugu	if (jpake_secret)
926e45f106cb6b47af1f21efe76e933bdea2f5dd1caNagendra Modadugu		jpake_client_auth(bio_c_out, sbio, jpake_secret);
927e45f106cb6b47af1f21efe76e933bdea2f5dd1caNagendra Modadugu#endif
928656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
929656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	SSL_set_bio(con,sbio,sbio);
930656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	SSL_set_connect_state(con);
931656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
932656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	/* ok, lets connect */
933656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	width=SSL_get_fd(con)+1;
934656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
935656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	read_tty=1;
936656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	write_tty=0;
937656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	tty_on=0;
938656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	read_ssl=1;
939656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	write_ssl=1;
940656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
941656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	cbuf_len=0;
942656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	cbuf_off=0;
943656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	sbuf_len=0;
944656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	sbuf_off=0;
945656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
946656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	/* This is an ugly hack that does a lot of assumptions */
947656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	/* We do have to handle multi-line responses which may come
948656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 	   in a single packet or not. We therefore have to use
949656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	   BIO_gets() which does need a buffering BIO. So during
950656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	   the initial chitchat we do push a buffering BIO into the
951656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	   chain that is removed again later on to not disturb the
952656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	   rest of the s_client operation. */
953656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	if (starttls_proto == PROTO_SMTP)
954656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		{
955656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		int foundit=0;
956656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		BIO *fbio = BIO_new(BIO_f_buffer());
957656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		BIO_push(fbio, sbio);
958656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		/* wait for multi-line response to end from SMTP */
959656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		do
960656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			{
961656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			mbuf_len = BIO_gets(fbio,mbuf,BUFSIZZ);
962656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			}
963656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		while (mbuf_len>3 && mbuf[3]=='-');
964656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		/* STARTTLS command requires EHLO... */
965656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		BIO_printf(fbio,"EHLO openssl.client.net\r\n");
966656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		(void)BIO_flush(fbio);
967656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		/* wait for multi-line response to end EHLO SMTP response */
968656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		do
969656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			{
970656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			mbuf_len = BIO_gets(fbio,mbuf,BUFSIZZ);
971656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			if (strstr(mbuf,"STARTTLS"))
972656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project				foundit=1;
973656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			}
974656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		while (mbuf_len>3 && mbuf[3]=='-');
975656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		(void)BIO_flush(fbio);
976656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		BIO_pop(fbio);
977656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		BIO_free(fbio);
978656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		if (!foundit)
979656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			BIO_printf(bio_err,
980656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project				   "didn't found starttls in server response,"
981656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project				   " try anyway...\n");
982656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		BIO_printf(sbio,"STARTTLS\r\n");
983656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		BIO_read(sbio,sbuf,BUFSIZZ);
984656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		}
985656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	else if (starttls_proto == PROTO_POP3)
986656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		{
987656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		BIO_read(sbio,mbuf,BUFSIZZ);
988656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		BIO_printf(sbio,"STLS\r\n");
989656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		BIO_read(sbio,sbuf,BUFSIZZ);
990656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		}
991656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	else if (starttls_proto == PROTO_IMAP)
992656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		{
993656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		int foundit=0;
994656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		BIO *fbio = BIO_new(BIO_f_buffer());
995656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		BIO_push(fbio, sbio);
996656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		BIO_gets(fbio,mbuf,BUFSIZZ);
997656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		/* STARTTLS command requires CAPABILITY... */
998656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		BIO_printf(fbio,". CAPABILITY\r\n");
999656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		(void)BIO_flush(fbio);
1000656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		/* wait for multi-line CAPABILITY response */
1001656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		do
1002656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			{
1003656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			mbuf_len = BIO_gets(fbio,mbuf,BUFSIZZ);
1004656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			if (strstr(mbuf,"STARTTLS"))
1005656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project				foundit=1;
1006656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			}
1007656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		while (mbuf_len>3 && mbuf[0]!='.');
1008656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		(void)BIO_flush(fbio);
1009656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		BIO_pop(fbio);
1010656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		BIO_free(fbio);
1011656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		if (!foundit)
1012656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			BIO_printf(bio_err,
1013656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project				   "didn't found STARTTLS in server response,"
1014656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project				   " try anyway...\n");
1015656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		BIO_printf(sbio,". STARTTLS\r\n");
1016656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		BIO_read(sbio,sbuf,BUFSIZZ);
1017656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		}
1018656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	else if (starttls_proto == PROTO_FTP)
1019656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		{
1020656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		BIO *fbio = BIO_new(BIO_f_buffer());
1021656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		BIO_push(fbio, sbio);
1022656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		/* wait for multi-line response to end from FTP */
1023656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		do
1024656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			{
1025656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			mbuf_len = BIO_gets(fbio,mbuf,BUFSIZZ);
1026656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			}
1027656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		while (mbuf_len>3 && mbuf[3]=='-');
1028656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		(void)BIO_flush(fbio);
1029656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		BIO_pop(fbio);
1030656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		BIO_free(fbio);
1031656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		BIO_printf(sbio,"AUTH TLS\r\n");
1032656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		BIO_read(sbio,sbuf,BUFSIZZ);
1033656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		}
1034e45f106cb6b47af1f21efe76e933bdea2f5dd1caNagendra Modadugu	if (starttls_proto == PROTO_XMPP)
1035e45f106cb6b47af1f21efe76e933bdea2f5dd1caNagendra Modadugu		{
1036e45f106cb6b47af1f21efe76e933bdea2f5dd1caNagendra Modadugu		int seen = 0;
1037e45f106cb6b47af1f21efe76e933bdea2f5dd1caNagendra Modadugu		BIO_printf(sbio,"<stream:stream "
1038e45f106cb6b47af1f21efe76e933bdea2f5dd1caNagendra Modadugu		    "xmlns:stream='http://etherx.jabber.org/streams' "
1039e45f106cb6b47af1f21efe76e933bdea2f5dd1caNagendra Modadugu		    "xmlns='jabber:client' to='%s' version='1.0'>", host);
1040e45f106cb6b47af1f21efe76e933bdea2f5dd1caNagendra Modadugu		seen = BIO_read(sbio,mbuf,BUFSIZZ);
1041e45f106cb6b47af1f21efe76e933bdea2f5dd1caNagendra Modadugu		mbuf[seen] = 0;
1042e45f106cb6b47af1f21efe76e933bdea2f5dd1caNagendra Modadugu		while (!strstr(mbuf, "<starttls xmlns='urn:ietf:params:xml:ns:xmpp-tls'"))
1043e45f106cb6b47af1f21efe76e933bdea2f5dd1caNagendra Modadugu			{
1044e45f106cb6b47af1f21efe76e933bdea2f5dd1caNagendra Modadugu			if (strstr(mbuf, "/stream:features>"))
1045e45f106cb6b47af1f21efe76e933bdea2f5dd1caNagendra Modadugu				goto shut;
1046e45f106cb6b47af1f21efe76e933bdea2f5dd1caNagendra Modadugu			seen = BIO_read(sbio,mbuf,BUFSIZZ);
1047e45f106cb6b47af1f21efe76e933bdea2f5dd1caNagendra Modadugu			mbuf[seen] = 0;
1048e45f106cb6b47af1f21efe76e933bdea2f5dd1caNagendra Modadugu			}
1049e45f106cb6b47af1f21efe76e933bdea2f5dd1caNagendra Modadugu		BIO_printf(sbio, "<starttls xmlns='urn:ietf:params:xml:ns:xmpp-tls'/>");
1050e45f106cb6b47af1f21efe76e933bdea2f5dd1caNagendra Modadugu		seen = BIO_read(sbio,sbuf,BUFSIZZ);
1051e45f106cb6b47af1f21efe76e933bdea2f5dd1caNagendra Modadugu		sbuf[seen] = 0;
1052e45f106cb6b47af1f21efe76e933bdea2f5dd1caNagendra Modadugu		if (!strstr(sbuf, "<proceed"))
1053e45f106cb6b47af1f21efe76e933bdea2f5dd1caNagendra Modadugu			goto shut;
1054e45f106cb6b47af1f21efe76e933bdea2f5dd1caNagendra Modadugu		mbuf[0] = 0;
1055e45f106cb6b47af1f21efe76e933bdea2f5dd1caNagendra Modadugu		}
1056656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
1057656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	for (;;)
1058656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		{
1059656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		FD_ZERO(&readfds);
1060656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		FD_ZERO(&writefds);
1061656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
106298d58bb80c64b02a33662f0ea80351d4a1535267Brian Carlstrom		if ((SSL_version(con) == DTLS1_VERSION) &&
106398d58bb80c64b02a33662f0ea80351d4a1535267Brian Carlstrom			DTLSv1_get_timeout(con, &timeout))
106498d58bb80c64b02a33662f0ea80351d4a1535267Brian Carlstrom			timeoutp = &timeout;
106598d58bb80c64b02a33662f0ea80351d4a1535267Brian Carlstrom		else
106698d58bb80c64b02a33662f0ea80351d4a1535267Brian Carlstrom			timeoutp = NULL;
106798d58bb80c64b02a33662f0ea80351d4a1535267Brian Carlstrom
1068656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		if (SSL_in_init(con) && !SSL_total_renegotiations(con))
1069656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			{
1070656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			in_init=1;
1071656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			tty_on=0;
1072656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			}
1073656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		else
1074656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			{
1075656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			tty_on=1;
1076656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			if (in_init)
1077656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project				{
1078656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project				in_init=0;
1079656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project				if (sess_out)
1080656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project					{
1081656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project					BIO *stmp = BIO_new_file(sess_out, "w");
1082656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project					if (stmp)
1083656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project						{
1084656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project						PEM_write_bio_SSL_SESSION(stmp, SSL_get_session(con));
1085656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project						BIO_free(stmp);
1086656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project						}
1087656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project					else
1088656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project						BIO_printf(bio_err, "Error writing session file %s\n", sess_out);
1089656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project					}
1090656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project				print_stuff(bio_c_out,con,full_log);
1091656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project				if (full_log > 0) full_log--;
1092656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
1093656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project				if (starttls_proto)
1094656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project					{
1095656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project					BIO_printf(bio_err,"%s",mbuf);
1096656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project					/* We don't need to know any more */
1097656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project					starttls_proto = PROTO_OFF;
1098656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project					}
1099656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
1100656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project				if (reconnect)
1101656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project					{
1102656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project					reconnect--;
1103656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project					BIO_printf(bio_c_out,"drop connection and then reconnect\n");
1104656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project					SSL_shutdown(con);
1105656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project					SSL_set_connect_state(con);
1106656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project					SHUTDOWN(SSL_get_fd(con));
1107656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project					goto re_start;
1108656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project					}
1109656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project				}
1110656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			}
1111656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
1112656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		ssl_pending = read_ssl && SSL_pending(con);
1113656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
1114656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		if (!ssl_pending)
1115656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			{
1116656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#if !defined(OPENSSL_SYS_WINDOWS) && !defined(OPENSSL_SYS_MSDOS) && !defined(OPENSSL_SYS_NETWARE)
1117656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			if (tty_on)
1118656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project				{
1119656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project				if (read_tty)  FD_SET(fileno(stdin),&readfds);
1120656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project				if (write_tty) FD_SET(fileno(stdout),&writefds);
1121656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project				}
1122656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			if (read_ssl)
1123656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project				FD_SET(SSL_get_fd(con),&readfds);
1124656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			if (write_ssl)
1125656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project				FD_SET(SSL_get_fd(con),&writefds);
1126656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#else
1127656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			if(!tty_on || !write_tty) {
1128656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project				if (read_ssl)
1129656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project					FD_SET(SSL_get_fd(con),&readfds);
1130656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project				if (write_ssl)
1131656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project					FD_SET(SSL_get_fd(con),&writefds);
1132656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			}
1133656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#endif
1134656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project/*			printf("mode tty(%d %d%d) ssl(%d%d)\n",
1135656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project				tty_on,read_tty,write_tty,read_ssl,write_ssl);*/
1136656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
1137656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			/* Note: under VMS with SOCKETSHR the second parameter
1138656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			 * is currently of type (int *) whereas under other
1139656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			 * systems it is (void *) if you don't have a cast it
1140656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			 * will choke the compiler: if you do have a cast then
1141656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			 * you can either go for (int *) or (void *).
1142656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			 */
1143656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#if defined(OPENSSL_SYS_WINDOWS) || defined(OPENSSL_SYS_MSDOS)
1144656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project                        /* Under Windows/DOS we make the assumption that we can
1145656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			 * always write to the tty: therefore if we need to
1146656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			 * write to the tty we just fall through. Otherwise
1147656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			 * we timeout the select every second and see if there
1148656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			 * are any keypresses. Note: this is a hack, in a proper
1149656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			 * Windows application we wouldn't do this.
1150656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			 */
1151656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			i=0;
1152656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			if(!write_tty) {
1153656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project				if(read_tty) {
1154656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project					tv.tv_sec = 1;
1155656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project					tv.tv_usec = 0;
1156656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project					i=select(width,(void *)&readfds,(void *)&writefds,
1157656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project						 NULL,&tv);
1158656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#if defined(OPENSSL_SYS_WINCE) || defined(OPENSSL_SYS_MSDOS)
1159656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project					if(!i && (!_kbhit() || !read_tty) ) continue;
1160656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#else
1161656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project					if(!i && (!((_kbhit()) || (WAIT_OBJECT_0 == WaitForSingleObject(GetStdHandle(STD_INPUT_HANDLE), 0))) || !read_tty) ) continue;
1162656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#endif
1163656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project				} else 	i=select(width,(void *)&readfds,(void *)&writefds,
116498d58bb80c64b02a33662f0ea80351d4a1535267Brian Carlstrom					 NULL,timeoutp);
1165656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			}
1166656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#elif defined(OPENSSL_SYS_NETWARE)
1167656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			if(!write_tty) {
1168656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project				if(read_tty) {
1169656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project					tv.tv_sec = 1;
1170656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project					tv.tv_usec = 0;
1171656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project					i=select(width,(void *)&readfds,(void *)&writefds,
1172656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project						NULL,&tv);
1173656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project				} else 	i=select(width,(void *)&readfds,(void *)&writefds,
117498d58bb80c64b02a33662f0ea80351d4a1535267Brian Carlstrom					NULL,timeoutp);
1175656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			}
1176656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#else
1177656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			i=select(width,(void *)&readfds,(void *)&writefds,
117898d58bb80c64b02a33662f0ea80351d4a1535267Brian Carlstrom				 NULL,timeoutp);
1179656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#endif
1180656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			if ( i < 0)
1181656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project				{
1182656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project				BIO_printf(bio_err,"bad select %d\n",
1183656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project				get_last_socket_error());
1184656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project				goto shut;
1185656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project				/* goto end; */
1186656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project				}
1187656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			}
1188656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
118998d58bb80c64b02a33662f0ea80351d4a1535267Brian Carlstrom		if ((SSL_version(con) == DTLS1_VERSION) && DTLSv1_handle_timeout(con) > 0)
119098d58bb80c64b02a33662f0ea80351d4a1535267Brian Carlstrom			{
119198d58bb80c64b02a33662f0ea80351d4a1535267Brian Carlstrom			BIO_printf(bio_err,"TIMEOUT occured\n");
119298d58bb80c64b02a33662f0ea80351d4a1535267Brian Carlstrom			}
119398d58bb80c64b02a33662f0ea80351d4a1535267Brian Carlstrom
1194656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		if (!ssl_pending && FD_ISSET(SSL_get_fd(con),&writefds))
1195656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			{
1196656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			k=SSL_write(con,&(cbuf[cbuf_off]),
1197656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project				(unsigned int)cbuf_len);
1198656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			switch (SSL_get_error(con,k))
1199656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project				{
1200656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			case SSL_ERROR_NONE:
1201656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project				cbuf_off+=k;
1202656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project				cbuf_len-=k;
1203656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project				if (k <= 0) goto end;
1204656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project				/* we have done a  write(con,NULL,0); */
1205656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project				if (cbuf_len <= 0)
1206656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project					{
1207656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project					read_tty=1;
1208656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project					write_ssl=0;
1209656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project					}
1210656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project				else /* if (cbuf_len > 0) */
1211656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project					{
1212656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project					read_tty=0;
1213656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project					write_ssl=1;
1214656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project					}
1215656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project				break;
1216656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			case SSL_ERROR_WANT_WRITE:
1217656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project				BIO_printf(bio_c_out,"write W BLOCK\n");
1218656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project				write_ssl=1;
1219656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project				read_tty=0;
1220656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project				break;
1221656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			case SSL_ERROR_WANT_READ:
1222656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project				BIO_printf(bio_c_out,"write R BLOCK\n");
1223656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project				write_tty=0;
1224656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project				read_ssl=1;
1225656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project				write_ssl=0;
1226656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project				break;
1227656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			case SSL_ERROR_WANT_X509_LOOKUP:
1228656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project				BIO_printf(bio_c_out,"write X BLOCK\n");
1229656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project				break;
1230656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			case SSL_ERROR_ZERO_RETURN:
1231656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project				if (cbuf_len != 0)
1232656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project					{
1233656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project					BIO_printf(bio_c_out,"shutdown\n");
1234656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project					goto shut;
1235656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project					}
1236656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project				else
1237656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project					{
1238656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project					read_tty=1;
1239656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project					write_ssl=0;
1240656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project					break;
1241656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project					}
1242656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
1243656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			case SSL_ERROR_SYSCALL:
1244656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project				if ((k != 0) || (cbuf_len != 0))
1245656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project					{
1246656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project					BIO_printf(bio_err,"write:errno=%d\n",
1247656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project						get_last_socket_error());
1248656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project					goto shut;
1249656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project					}
1250656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project				else
1251656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project					{
1252656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project					read_tty=1;
1253656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project					write_ssl=0;
1254656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project					}
1255656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project				break;
1256656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			case SSL_ERROR_SSL:
1257656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project				ERR_print_errors(bio_err);
1258656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project				goto shut;
1259656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project				}
1260656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			}
1261656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#if defined(OPENSSL_SYS_WINDOWS) || defined(OPENSSL_SYS_MSDOS) || defined(OPENSSL_SYS_NETWARE)
1262656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		/* Assume Windows/DOS can always write */
1263656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		else if (!ssl_pending && write_tty)
1264656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#else
1265656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		else if (!ssl_pending && FD_ISSET(fileno(stdout),&writefds))
1266656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#endif
1267656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			{
1268656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#ifdef CHARSET_EBCDIC
1269656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			ascii2ebcdic(&(sbuf[sbuf_off]),&(sbuf[sbuf_off]),sbuf_len);
1270656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#endif
1271656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			i=write(fileno(stdout),&(sbuf[sbuf_off]),sbuf_len);
1272656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
1273656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			if (i <= 0)
1274656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project				{
1275656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project				BIO_printf(bio_c_out,"DONE\n");
1276656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project				goto shut;
1277656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project				/* goto end; */
1278656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project				}
1279656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
1280656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			sbuf_len-=i;;
1281656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			sbuf_off+=i;
1282656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			if (sbuf_len <= 0)
1283656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project				{
1284656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project				read_ssl=1;
1285656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project				write_tty=0;
1286656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project				}
1287656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			}
1288656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		else if (ssl_pending || FD_ISSET(SSL_get_fd(con),&readfds))
1289656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			{
1290656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#ifdef RENEG
1291656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project{ static int iiii; if (++iiii == 52) { SSL_renegotiate(con); iiii=0; } }
1292656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#endif
1293656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#if 1
1294656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			k=SSL_read(con,sbuf,1024 /* BUFSIZZ */ );
1295656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#else
1296656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project/* Demo for pending and peek :-) */
1297656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			k=SSL_read(con,sbuf,16);
1298656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project{ char zbuf[10240];
1299656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Projectprintf("read=%d pending=%d peek=%d\n",k,SSL_pending(con),SSL_peek(con,zbuf,10240));
1300656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project}
1301656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#endif
1302656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
1303656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			switch (SSL_get_error(con,k))
1304656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project				{
1305656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			case SSL_ERROR_NONE:
1306656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project				if (k <= 0)
1307656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project					goto end;
1308656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project				sbuf_off=0;
1309656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project				sbuf_len=k;
1310656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
1311656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project				read_ssl=0;
1312656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project				write_tty=1;
1313656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project				break;
1314656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			case SSL_ERROR_WANT_WRITE:
1315656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project				BIO_printf(bio_c_out,"read W BLOCK\n");
1316656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project				write_ssl=1;
1317656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project				read_tty=0;
1318656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project				break;
1319656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			case SSL_ERROR_WANT_READ:
1320656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project				BIO_printf(bio_c_out,"read R BLOCK\n");
1321656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project				write_tty=0;
1322656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project				read_ssl=1;
1323656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project				if ((read_tty == 0) && (write_ssl == 0))
1324656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project					write_ssl=1;
1325656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project				break;
1326656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			case SSL_ERROR_WANT_X509_LOOKUP:
1327656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project				BIO_printf(bio_c_out,"read X BLOCK\n");
1328656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project				break;
1329656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			case SSL_ERROR_SYSCALL:
1330656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project				BIO_printf(bio_err,"read:errno=%d\n",get_last_socket_error());
1331656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project				goto shut;
1332656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			case SSL_ERROR_ZERO_RETURN:
1333656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project				BIO_printf(bio_c_out,"closed\n");
1334656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project				goto shut;
1335656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			case SSL_ERROR_SSL:
1336656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project				ERR_print_errors(bio_err);
1337656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project				goto shut;
1338656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project				/* break; */
1339656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project				}
1340656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			}
1341656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
1342656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#if defined(OPENSSL_SYS_WINDOWS) || defined(OPENSSL_SYS_MSDOS)
1343656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#if defined(OPENSSL_SYS_WINCE) || defined(OPENSSL_SYS_MSDOS)
1344656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		else if (_kbhit())
1345656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#else
1346656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		else if ((_kbhit()) || (WAIT_OBJECT_0 == WaitForSingleObject(GetStdHandle(STD_INPUT_HANDLE), 0)))
1347656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#endif
1348656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#elif defined (OPENSSL_SYS_NETWARE)
1349656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project        else if (_kbhit())
1350656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#else
1351656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		else if (FD_ISSET(fileno(stdin),&readfds))
1352656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#endif
1353656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			{
1354656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			if (crlf)
1355656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project				{
1356656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project				int j, lf_num;
1357656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
1358656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project				i=read(fileno(stdin),cbuf,BUFSIZZ/2);
1359656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project				lf_num = 0;
1360656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project				/* both loops are skipped when i <= 0 */
1361656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project				for (j = 0; j < i; j++)
1362656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project					if (cbuf[j] == '\n')
1363656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project						lf_num++;
1364656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project				for (j = i-1; j >= 0; j--)
1365656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project					{
1366656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project					cbuf[j+lf_num] = cbuf[j];
1367656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project					if (cbuf[j] == '\n')
1368656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project						{
1369656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project						lf_num--;
1370656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project						i++;
1371656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project						cbuf[j+lf_num] = '\r';
1372656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project						}
1373656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project					}
1374656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project				assert(lf_num == 0);
1375656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project				}
1376656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			else
1377656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project				i=read(fileno(stdin),cbuf,BUFSIZZ);
1378656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
1379656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			if ((!c_ign_eof) && ((i <= 0) || (cbuf[0] == 'Q')))
1380656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project				{
1381656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project				BIO_printf(bio_err,"DONE\n");
1382656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project				goto shut;
1383656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project				}
1384656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
1385656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			if ((!c_ign_eof) && (cbuf[0] == 'R'))
1386656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project				{
1387656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project				BIO_printf(bio_err,"RENEGOTIATING\n");
1388656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project				SSL_renegotiate(con);
1389656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project				cbuf_len=0;
1390656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project				}
1391656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			else
1392656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project				{
1393656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project				cbuf_len=i;
1394656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project				cbuf_off=0;
1395656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#ifdef CHARSET_EBCDIC
1396656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project				ebcdic2ascii(cbuf, cbuf, i);
1397656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#endif
1398656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project				}
1399656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
1400656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			write_ssl=1;
1401656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			read_tty=0;
1402656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			}
1403656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		}
1404656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Projectshut:
1405656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	SSL_shutdown(con);
1406656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	SHUTDOWN(SSL_get_fd(con));
1407656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	ret=0;
1408656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Projectend:
1409656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	if(prexit) print_stuff(bio_c_out,con,1);
1410656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	if (con != NULL) SSL_free(con);
1411656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	if (con2 != NULL) SSL_free(con2);
1412656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	if (ctx != NULL) SSL_CTX_free(ctx);
1413656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	if (cert)
1414656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		X509_free(cert);
1415656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	if (key)
1416656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		EVP_PKEY_free(key);
1417656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	if (pass)
1418656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		OPENSSL_free(pass);
1419656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	if (cbuf != NULL) { OPENSSL_cleanse(cbuf,BUFSIZZ); OPENSSL_free(cbuf); }
1420656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	if (sbuf != NULL) { OPENSSL_cleanse(sbuf,BUFSIZZ); OPENSSL_free(sbuf); }
1421656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	if (mbuf != NULL) { OPENSSL_cleanse(mbuf,BUFSIZZ); OPENSSL_free(mbuf); }
1422656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	if (bio_c_out != NULL)
1423656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		{
1424656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		BIO_free(bio_c_out);
1425656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		bio_c_out=NULL;
1426656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		}
1427656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	apps_shutdown();
1428656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	OPENSSL_EXIT(ret);
1429656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	}
1430656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
1431656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
1432656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Projectstatic void print_stuff(BIO *bio, SSL *s, int full)
1433656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	{
1434656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	X509 *peer=NULL;
1435656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	char *p;
1436656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	static const char *space="                ";
1437656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	char buf[BUFSIZ];
1438656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	STACK_OF(X509) *sk;
1439656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	STACK_OF(X509_NAME) *sk2;
1440656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	SSL_CIPHER *c;
1441656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	X509_NAME *xn;
1442656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	int j,i;
1443656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#ifndef OPENSSL_NO_COMP
1444656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	const COMP_METHOD *comp, *expansion;
1445656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#endif
1446656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
1447656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	if (full)
1448656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		{
1449656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		int got_a_chain = 0;
1450656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
1451656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		sk=SSL_get_peer_cert_chain(s);
1452656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		if (sk != NULL)
1453656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			{
1454656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			got_a_chain = 1; /* we don't have it for SSL2 (yet) */
1455656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
1456656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			BIO_printf(bio,"---\nCertificate chain\n");
1457656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			for (i=0; i<sk_X509_num(sk); i++)
1458656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project				{
1459656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project				X509_NAME_oneline(X509_get_subject_name(
1460656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project					sk_X509_value(sk,i)),buf,sizeof buf);
1461656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project				BIO_printf(bio,"%2d s:%s\n",i,buf);
1462656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project				X509_NAME_oneline(X509_get_issuer_name(
1463656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project					sk_X509_value(sk,i)),buf,sizeof buf);
1464656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project				BIO_printf(bio,"   i:%s\n",buf);
1465656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project				if (c_showcerts)
1466656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project					PEM_write_bio_X509(bio,sk_X509_value(sk,i));
1467656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project				}
1468656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			}
1469656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
1470656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		BIO_printf(bio,"---\n");
1471656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		peer=SSL_get_peer_certificate(s);
1472656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		if (peer != NULL)
1473656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			{
1474656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			BIO_printf(bio,"Server certificate\n");
1475656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			if (!(c_showcerts && got_a_chain)) /* Redundant if we showed the whole chain */
1476656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project				PEM_write_bio_X509(bio,peer);
1477656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			X509_NAME_oneline(X509_get_subject_name(peer),
1478656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project				buf,sizeof buf);
1479656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			BIO_printf(bio,"subject=%s\n",buf);
1480656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			X509_NAME_oneline(X509_get_issuer_name(peer),
1481656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project				buf,sizeof buf);
1482656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			BIO_printf(bio,"issuer=%s\n",buf);
1483656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			}
1484656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		else
1485656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			BIO_printf(bio,"no peer certificate available\n");
1486656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
1487656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		sk2=SSL_get_client_CA_list(s);
1488656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		if ((sk2 != NULL) && (sk_X509_NAME_num(sk2) > 0))
1489656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			{
1490656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			BIO_printf(bio,"---\nAcceptable client certificate CA names\n");
1491656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			for (i=0; i<sk_X509_NAME_num(sk2); i++)
1492656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project				{
1493656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project				xn=sk_X509_NAME_value(sk2,i);
1494656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project				X509_NAME_oneline(xn,buf,sizeof(buf));
1495656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project				BIO_write(bio,buf,strlen(buf));
1496656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project				BIO_write(bio,"\n",1);
1497656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project				}
1498656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			}
1499656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		else
1500656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			{
1501656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			BIO_printf(bio,"---\nNo client certificate CA names sent\n");
1502656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			}
1503656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		p=SSL_get_shared_ciphers(s,buf,sizeof buf);
1504656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		if (p != NULL)
1505656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			{
1506656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			/* This works only for SSL 2.  In later protocol
1507656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			 * versions, the client does not know what other
1508656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			 * ciphers (in addition to the one to be used
1509656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			 * in the current connection) the server supports. */
1510656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
1511656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			BIO_printf(bio,"---\nCiphers common between both SSL endpoints:\n");
1512656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			j=i=0;
1513656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			while (*p)
1514656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project				{
1515656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project				if (*p == ':')
1516656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project					{
1517656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project					BIO_write(bio,space,15-j%25);
1518656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project					i++;
1519656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project					j=0;
1520656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project					BIO_write(bio,((i%3)?" ":"\n"),1);
1521656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project					}
1522656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project				else
1523656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project					{
1524656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project					BIO_write(bio,p,1);
1525656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project					j++;
1526656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project					}
1527656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project				p++;
1528656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project				}
1529656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			BIO_write(bio,"\n",1);
1530656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			}
1531656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
1532656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		BIO_printf(bio,"---\nSSL handshake has read %ld bytes and written %ld bytes\n",
1533656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			BIO_number_read(SSL_get_rbio(s)),
1534656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			BIO_number_written(SSL_get_wbio(s)));
1535656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		}
1536656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	BIO_printf(bio,((s->hit)?"---\nReused, ":"---\nNew, "));
1537656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	c=SSL_get_current_cipher(s);
1538656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	BIO_printf(bio,"%s, Cipher is %s\n",
1539656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		SSL_CIPHER_get_version(c),
1540656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		SSL_CIPHER_get_name(c));
1541656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	if (peer != NULL) {
1542656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		EVP_PKEY *pktmp;
1543656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		pktmp = X509_get_pubkey(peer);
1544656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		BIO_printf(bio,"Server public key is %d bit\n",
1545656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project							 EVP_PKEY_bits(pktmp));
1546656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		EVP_PKEY_free(pktmp);
1547656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	}
154898d58bb80c64b02a33662f0ea80351d4a1535267Brian Carlstrom	BIO_printf(bio, "Secure Renegotiation IS%s supported\n",
154998d58bb80c64b02a33662f0ea80351d4a1535267Brian Carlstrom			SSL_get_secure_renegotiation_support(s) ? "" : " NOT");
1550656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#ifndef OPENSSL_NO_COMP
1551656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	comp=SSL_get_current_compression(s);
1552656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	expansion=SSL_get_current_expansion(s);
1553656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	BIO_printf(bio,"Compression: %s\n",
1554656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		comp ? SSL_COMP_get_name(comp) : "NONE");
1555656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	BIO_printf(bio,"Expansion: %s\n",
1556656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		expansion ? SSL_COMP_get_name(expansion) : "NONE");
1557656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#endif
1558656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	SSL_SESSION_print(bio,SSL_get_session(s));
1559656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	BIO_printf(bio,"---\n");
1560656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	if (peer != NULL)
1561656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		X509_free(peer);
1562656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	/* flush, or debugging output gets mixed with http response */
1563656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	(void)BIO_flush(bio);
1564656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	}
1565656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
1566656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#ifndef OPENSSL_NO_TLSEXT
1567656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
1568656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Projectstatic int ocsp_resp_cb(SSL *s, void *arg)
1569656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	{
1570656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	const unsigned char *p;
1571656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	int len;
1572656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	OCSP_RESPONSE *rsp;
1573656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	len = SSL_get_tlsext_status_ocsp_resp(s, &p);
1574656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	BIO_puts(arg, "OCSP response: ");
1575656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	if (!p)
1576656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		{
1577656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		BIO_puts(arg, "no response sent\n");
1578656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		return 1;
1579656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		}
1580656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	rsp = d2i_OCSP_RESPONSE(NULL, &p, len);
1581656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	if (!rsp)
1582656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		{
1583656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		BIO_puts(arg, "response parse error\n");
1584656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		BIO_dump_indent(arg, (char *)p, len, 4);
1585656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		return 0;
1586656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		}
1587656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	BIO_puts(arg, "\n======================================\n");
1588656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	OCSP_RESPONSE_print(arg, rsp, 0);
1589656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	BIO_puts(arg, "======================================\n");
1590656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	OCSP_RESPONSE_free(rsp);
1591656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	return 1;
1592656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	}
1593656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#endif  /* ndef OPENSSL_NO_TLSEXT */
1594