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/* ====================================================================
59674ff29eb647c577ba1ef822c373ead69dc386cfBrian Carlstrom * Copyright (c) 1998-2006 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 */
111674ff29eb647c577ba1ef822c373ead69dc386cfBrian Carlstrom/* ====================================================================
112674ff29eb647c577ba1ef822c373ead69dc386cfBrian Carlstrom * Copyright 2005 Nokia. All rights reserved.
113674ff29eb647c577ba1ef822c373ead69dc386cfBrian Carlstrom *
114674ff29eb647c577ba1ef822c373ead69dc386cfBrian Carlstrom * The portions of the attached software ("Contribution") is developed by
115674ff29eb647c577ba1ef822c373ead69dc386cfBrian Carlstrom * Nokia Corporation and is licensed pursuant to the OpenSSL open source
116674ff29eb647c577ba1ef822c373ead69dc386cfBrian Carlstrom * license.
117674ff29eb647c577ba1ef822c373ead69dc386cfBrian Carlstrom *
118674ff29eb647c577ba1ef822c373ead69dc386cfBrian Carlstrom * The Contribution, originally written by Mika Kousa and Pasi Eronen of
119674ff29eb647c577ba1ef822c373ead69dc386cfBrian Carlstrom * Nokia Corporation, consists of the "PSK" (Pre-Shared Key) ciphersuites
120674ff29eb647c577ba1ef822c373ead69dc386cfBrian Carlstrom * support (see RFC 4279) to OpenSSL.
121674ff29eb647c577ba1ef822c373ead69dc386cfBrian Carlstrom *
122674ff29eb647c577ba1ef822c373ead69dc386cfBrian Carlstrom * No patent licenses or other rights except those expressly stated in
123674ff29eb647c577ba1ef822c373ead69dc386cfBrian Carlstrom * the OpenSSL open source license shall be deemed granted or received
124674ff29eb647c577ba1ef822c373ead69dc386cfBrian Carlstrom * expressly, by implication, estoppel, or otherwise.
125674ff29eb647c577ba1ef822c373ead69dc386cfBrian Carlstrom *
126674ff29eb647c577ba1ef822c373ead69dc386cfBrian Carlstrom * No assurances are provided by Nokia that the Contribution does not
127674ff29eb647c577ba1ef822c373ead69dc386cfBrian Carlstrom * infringe the patent or other intellectual property rights of any third
128674ff29eb647c577ba1ef822c373ead69dc386cfBrian Carlstrom * party or that the license provides you with all the necessary rights
129674ff29eb647c577ba1ef822c373ead69dc386cfBrian Carlstrom * to make use of the Contribution.
130674ff29eb647c577ba1ef822c373ead69dc386cfBrian Carlstrom *
131674ff29eb647c577ba1ef822c373ead69dc386cfBrian Carlstrom * THE SOFTWARE IS PROVIDED "AS IS" WITHOUT WARRANTY OF ANY KIND. IN
132674ff29eb647c577ba1ef822c373ead69dc386cfBrian Carlstrom * ADDITION TO THE DISCLAIMERS INCLUDED IN THE LICENSE, NOKIA
133674ff29eb647c577ba1ef822c373ead69dc386cfBrian Carlstrom * SPECIFICALLY DISCLAIMS ANY LIABILITY FOR CLAIMS BROUGHT BY YOU OR ANY
134674ff29eb647c577ba1ef822c373ead69dc386cfBrian Carlstrom * OTHER ENTITY BASED ON INFRINGEMENT OF INTELLECTUAL PROPERTY RIGHTS OR
135674ff29eb647c577ba1ef822c373ead69dc386cfBrian Carlstrom * OTHERWISE.
136674ff29eb647c577ba1ef822c373ead69dc386cfBrian Carlstrom */
137656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
138656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#include <assert.h>
139674ff29eb647c577ba1ef822c373ead69dc386cfBrian Carlstrom#include <ctype.h>
140656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#include <stdio.h>
141656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#include <stdlib.h>
142656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#include <string.h>
143656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#include <openssl/e_os2.h>
144656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#ifdef OPENSSL_NO_STDIO
145656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#define APPS_WIN16
146656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#endif
147656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
148656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project/* With IPv6, it looks like Digital has mixed up the proper order of
149656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project   recursive header file inclusion, resulting in the compiler complaining
150656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project   that u_int isn't defined, but only if _POSIX_C_SOURCE is defined, which
151656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project   is needed to have fileno() declared correctly...  So let's define u_int */
152656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#if defined(OPENSSL_SYS_VMS_DECC) && !defined(__U_INT)
153656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#define __U_INT
154656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Projecttypedef unsigned int u_int;
155656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#endif
156656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
157656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#define USE_SOCKETS
158656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#include "apps.h"
159656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#include <openssl/x509.h>
160656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#include <openssl/ssl.h>
161656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#include <openssl/err.h>
162656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#include <openssl/pem.h>
163656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#include <openssl/rand.h>
164656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#include <openssl/ocsp.h>
165674ff29eb647c577ba1ef822c373ead69dc386cfBrian Carlstrom#include <openssl/bn.h>
166656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#include "s_apps.h"
167656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#include "timeouts.h"
168656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
169656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#if (defined(OPENSSL_SYS_VMS) && __VMS_VER < 70000000)
170656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project/* FIONBIO used as a switch to enable ioctl, and that isn't in VMS < 7.0 */
171656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#undef FIONBIO
172656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#endif
173656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
174674ff29eb647c577ba1ef822c373ead69dc386cfBrian Carlstrom#if defined(OPENSSL_SYS_BEOS_R5)
175674ff29eb647c577ba1ef822c373ead69dc386cfBrian Carlstrom#include <fcntl.h>
176674ff29eb647c577ba1ef822c373ead69dc386cfBrian Carlstrom#endif
177674ff29eb647c577ba1ef822c373ead69dc386cfBrian Carlstrom
178656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#undef PROG
179656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#define PROG	s_client_main
180656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
181656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project/*#define SSL_HOST_NAME	"www.netscape.com" */
182656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project/*#define SSL_HOST_NAME	"193.118.187.102" */
183656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#define SSL_HOST_NAME	"localhost"
184656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
185656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project/*#define TEST_CERT "client.pem" */ /* no default cert. */
186656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
187656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#undef BUFSIZZ
188656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#define BUFSIZZ 1024*8
189656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
190656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Projectextern int verify_depth;
191656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Projectextern int verify_error;
192674ff29eb647c577ba1ef822c373ead69dc386cfBrian Carlstromextern int verify_return_error;
193656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
194656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#ifdef FIONBIO
195656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Projectstatic int c_nbio=0;
196656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#endif
197656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Projectstatic int c_Pause=0;
198656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Projectstatic int c_debug=0;
199656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#ifndef OPENSSL_NO_TLSEXT
200656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Projectstatic int c_tlsextdebug=0;
201656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Projectstatic int c_status_req=0;
202656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#endif
203656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Projectstatic int c_msg=0;
204656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Projectstatic int c_showcerts=0;
205656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
206656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Projectstatic void sc_usage(void);
207656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Projectstatic void print_stuff(BIO *berr,SSL *con,int full);
208656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#ifndef OPENSSL_NO_TLSEXT
209656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Projectstatic int ocsp_resp_cb(SSL *s, void *arg);
210656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#endif
211656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Projectstatic BIO *bio_c_out=NULL;
212656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Projectstatic int c_quiet=0;
213656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Projectstatic int c_ign_eof=0;
214656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
215674ff29eb647c577ba1ef822c373ead69dc386cfBrian Carlstrom#ifndef OPENSSL_NO_PSK
216674ff29eb647c577ba1ef822c373ead69dc386cfBrian Carlstrom/* Default PSK identity and key */
217674ff29eb647c577ba1ef822c373ead69dc386cfBrian Carlstromstatic char *psk_identity="Client_identity";
218674ff29eb647c577ba1ef822c373ead69dc386cfBrian Carlstrom/*char *psk_key=NULL;  by default PSK is not used */
219674ff29eb647c577ba1ef822c373ead69dc386cfBrian Carlstrom
220674ff29eb647c577ba1ef822c373ead69dc386cfBrian Carlstromstatic unsigned int psk_client_cb(SSL *ssl, const char *hint, char *identity,
221674ff29eb647c577ba1ef822c373ead69dc386cfBrian Carlstrom	unsigned int max_identity_len, unsigned char *psk,
222674ff29eb647c577ba1ef822c373ead69dc386cfBrian Carlstrom	unsigned int max_psk_len)
223674ff29eb647c577ba1ef822c373ead69dc386cfBrian Carlstrom	{
224674ff29eb647c577ba1ef822c373ead69dc386cfBrian Carlstrom	unsigned int psk_len = 0;
225674ff29eb647c577ba1ef822c373ead69dc386cfBrian Carlstrom	int ret;
226674ff29eb647c577ba1ef822c373ead69dc386cfBrian Carlstrom        BIGNUM *bn=NULL;
227674ff29eb647c577ba1ef822c373ead69dc386cfBrian Carlstrom
228674ff29eb647c577ba1ef822c373ead69dc386cfBrian Carlstrom	if (c_debug)
229674ff29eb647c577ba1ef822c373ead69dc386cfBrian Carlstrom		BIO_printf(bio_c_out, "psk_client_cb\n");
230674ff29eb647c577ba1ef822c373ead69dc386cfBrian Carlstrom	if (!hint)
231674ff29eb647c577ba1ef822c373ead69dc386cfBrian Carlstrom                {
232674ff29eb647c577ba1ef822c373ead69dc386cfBrian Carlstrom                /* no ServerKeyExchange message*/
233674ff29eb647c577ba1ef822c373ead69dc386cfBrian Carlstrom		if (c_debug)
234674ff29eb647c577ba1ef822c373ead69dc386cfBrian Carlstrom			BIO_printf(bio_c_out,"NULL received PSK identity hint, continuing anyway\n");
235674ff29eb647c577ba1ef822c373ead69dc386cfBrian Carlstrom                }
236674ff29eb647c577ba1ef822c373ead69dc386cfBrian Carlstrom        else if (c_debug)
237674ff29eb647c577ba1ef822c373ead69dc386cfBrian Carlstrom		BIO_printf(bio_c_out, "Received PSK identity hint '%s'\n", hint);
238674ff29eb647c577ba1ef822c373ead69dc386cfBrian Carlstrom
239674ff29eb647c577ba1ef822c373ead69dc386cfBrian Carlstrom	/* lookup PSK identity and PSK key based on the given identity hint here */
240674ff29eb647c577ba1ef822c373ead69dc386cfBrian Carlstrom	ret = BIO_snprintf(identity, max_identity_len, "%s", psk_identity);
241674ff29eb647c577ba1ef822c373ead69dc386cfBrian Carlstrom	if (ret < 0 || (unsigned int)ret > max_identity_len)
242674ff29eb647c577ba1ef822c373ead69dc386cfBrian Carlstrom		goto out_err;
243674ff29eb647c577ba1ef822c373ead69dc386cfBrian Carlstrom	if (c_debug)
244674ff29eb647c577ba1ef822c373ead69dc386cfBrian Carlstrom		BIO_printf(bio_c_out, "created identity '%s' len=%d\n", identity, ret);
245674ff29eb647c577ba1ef822c373ead69dc386cfBrian Carlstrom        ret=BN_hex2bn(&bn, psk_key);
246674ff29eb647c577ba1ef822c373ead69dc386cfBrian Carlstrom        if (!ret)
247674ff29eb647c577ba1ef822c373ead69dc386cfBrian Carlstrom                {
248674ff29eb647c577ba1ef822c373ead69dc386cfBrian Carlstrom                BIO_printf(bio_err,"Could not convert PSK key '%s' to BIGNUM\n", psk_key);
249674ff29eb647c577ba1ef822c373ead69dc386cfBrian Carlstrom                if (bn)
250674ff29eb647c577ba1ef822c373ead69dc386cfBrian Carlstrom                        BN_free(bn);
251674ff29eb647c577ba1ef822c373ead69dc386cfBrian Carlstrom                return 0;
252674ff29eb647c577ba1ef822c373ead69dc386cfBrian Carlstrom                }
253674ff29eb647c577ba1ef822c373ead69dc386cfBrian Carlstrom
254674ff29eb647c577ba1ef822c373ead69dc386cfBrian Carlstrom        if ((unsigned int)BN_num_bytes(bn) > max_psk_len)
255674ff29eb647c577ba1ef822c373ead69dc386cfBrian Carlstrom                {
256674ff29eb647c577ba1ef822c373ead69dc386cfBrian Carlstrom                BIO_printf(bio_err,"psk buffer of callback is too small (%d) for key (%d)\n",
257674ff29eb647c577ba1ef822c373ead69dc386cfBrian Carlstrom                        max_psk_len, BN_num_bytes(bn));
258674ff29eb647c577ba1ef822c373ead69dc386cfBrian Carlstrom                BN_free(bn);
259674ff29eb647c577ba1ef822c373ead69dc386cfBrian Carlstrom                return 0;
260674ff29eb647c577ba1ef822c373ead69dc386cfBrian Carlstrom                }
261674ff29eb647c577ba1ef822c373ead69dc386cfBrian Carlstrom
262674ff29eb647c577ba1ef822c373ead69dc386cfBrian Carlstrom        psk_len=BN_bn2bin(bn, psk);
263674ff29eb647c577ba1ef822c373ead69dc386cfBrian Carlstrom        BN_free(bn);
264674ff29eb647c577ba1ef822c373ead69dc386cfBrian Carlstrom        if (psk_len == 0)
265674ff29eb647c577ba1ef822c373ead69dc386cfBrian Carlstrom                goto out_err;
266674ff29eb647c577ba1ef822c373ead69dc386cfBrian Carlstrom
267674ff29eb647c577ba1ef822c373ead69dc386cfBrian Carlstrom	if (c_debug)
268674ff29eb647c577ba1ef822c373ead69dc386cfBrian Carlstrom		BIO_printf(bio_c_out, "created PSK len=%d\n", psk_len);
269674ff29eb647c577ba1ef822c373ead69dc386cfBrian Carlstrom
270674ff29eb647c577ba1ef822c373ead69dc386cfBrian Carlstrom        return psk_len;
271674ff29eb647c577ba1ef822c373ead69dc386cfBrian Carlstrom out_err:
272674ff29eb647c577ba1ef822c373ead69dc386cfBrian Carlstrom	if (c_debug)
273674ff29eb647c577ba1ef822c373ead69dc386cfBrian Carlstrom		BIO_printf(bio_err, "Error in PSK client callback\n");
274674ff29eb647c577ba1ef822c373ead69dc386cfBrian Carlstrom        return 0;
275674ff29eb647c577ba1ef822c373ead69dc386cfBrian Carlstrom	}
276674ff29eb647c577ba1ef822c373ead69dc386cfBrian Carlstrom#endif
277674ff29eb647c577ba1ef822c373ead69dc386cfBrian Carlstrom
278656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Projectstatic void sc_usage(void)
279656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	{
280656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	BIO_printf(bio_err,"usage: s_client args\n");
281656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	BIO_printf(bio_err,"\n");
282656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	BIO_printf(bio_err," -host host     - use -connect instead\n");
283656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	BIO_printf(bio_err," -port port     - use -connect instead\n");
284656d9c7f52f88b3a3daccafa7655dec086c4756eThe 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);
285656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
286674ff29eb647c577ba1ef822c373ead69dc386cfBrian Carlstrom	BIO_printf(bio_err," -verify arg   - turn on peer certificate verification\n");
287656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	BIO_printf(bio_err," -cert arg     - certificate file to use, PEM format assumed\n");
288656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	BIO_printf(bio_err," -certform arg - certificate format (PEM or DER) PEM default\n");
289656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	BIO_printf(bio_err," -key arg      - Private key file to use, in cert file if\n");
290656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	BIO_printf(bio_err,"                 not specified but cert file is.\n");
291656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	BIO_printf(bio_err," -keyform arg  - key format (PEM or DER) PEM default\n");
292656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	BIO_printf(bio_err," -pass arg     - private key file pass phrase source\n");
293656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	BIO_printf(bio_err," -CApath arg   - PEM format directory of CA's\n");
294656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	BIO_printf(bio_err," -CAfile arg   - PEM format file of CA's\n");
295656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	BIO_printf(bio_err," -reconnect    - Drop and re-make the connection with the same Session-ID\n");
296656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	BIO_printf(bio_err," -pause        - sleep(1) after each read(2) and write(2) system call\n");
297656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	BIO_printf(bio_err," -showcerts    - show all certificates in the chain\n");
298656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	BIO_printf(bio_err," -debug        - extra output\n");
299656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#ifdef WATT32
300656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	BIO_printf(bio_err," -wdebug       - WATT-32 tcp debugging\n");
301656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#endif
302656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	BIO_printf(bio_err," -msg          - Show protocol messages\n");
303656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	BIO_printf(bio_err," -nbio_test    - more ssl protocol testing\n");
304656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	BIO_printf(bio_err," -state        - print the 'ssl' states\n");
305656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#ifdef FIONBIO
306656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	BIO_printf(bio_err," -nbio         - Run with non-blocking IO\n");
307656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#endif
308656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	BIO_printf(bio_err," -crlf         - convert LF from terminal into CRLF\n");
309656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	BIO_printf(bio_err," -quiet        - no s_client output\n");
310656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	BIO_printf(bio_err," -ign_eof      - ignore input eof (default when -quiet)\n");
311e45f106cb6b47af1f21efe76e933bdea2f5dd1caNagendra Modadugu	BIO_printf(bio_err," -no_ign_eof   - don't ignore input eof\n");
312674ff29eb647c577ba1ef822c373ead69dc386cfBrian Carlstrom#ifndef OPENSSL_NO_PSK
313674ff29eb647c577ba1ef822c373ead69dc386cfBrian Carlstrom	BIO_printf(bio_err," -psk_identity arg - PSK identity\n");
314674ff29eb647c577ba1ef822c373ead69dc386cfBrian Carlstrom	BIO_printf(bio_err," -psk arg      - PSK in hex (without 0x)\n");
315674ff29eb647c577ba1ef822c373ead69dc386cfBrian Carlstrom# ifndef OPENSSL_NO_JPAKE
316674ff29eb647c577ba1ef822c373ead69dc386cfBrian Carlstrom	BIO_printf(bio_err," -jpake arg    - JPAKE secret to use\n");
317674ff29eb647c577ba1ef822c373ead69dc386cfBrian Carlstrom# endif
318674ff29eb647c577ba1ef822c373ead69dc386cfBrian Carlstrom#endif
319656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	BIO_printf(bio_err," -ssl2         - just use SSLv2\n");
320656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	BIO_printf(bio_err," -ssl3         - just use SSLv3\n");
321656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	BIO_printf(bio_err," -tls1         - just use TLSv1\n");
322656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	BIO_printf(bio_err," -dtls1        - just use DTLSv1\n");
32398d58bb80c64b02a33662f0ea80351d4a1535267Brian Carlstrom	BIO_printf(bio_err," -mtu          - set the link layer MTU\n");
324656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	BIO_printf(bio_err," -no_tls1/-no_ssl3/-no_ssl2 - turn off that protocol\n");
325656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	BIO_printf(bio_err," -bugs         - Switch on all SSL implementation bug workarounds\n");
326656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	BIO_printf(bio_err," -serverpref   - Use server's cipher preferences (only SSLv2)\n");
327656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	BIO_printf(bio_err," -cipher       - preferred cipher to use, use the 'openssl ciphers'\n");
328656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	BIO_printf(bio_err,"                 command to see what is available\n");
329656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	BIO_printf(bio_err," -starttls prot - use the STARTTLS command before starting TLS\n");
330656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	BIO_printf(bio_err,"                 for those protocols that support it, where\n");
331656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	BIO_printf(bio_err,"                 'prot' defines which one to assume.  Currently,\n");
332e45f106cb6b47af1f21efe76e933bdea2f5dd1caNagendra Modadugu	BIO_printf(bio_err,"                 only \"smtp\", \"pop3\", \"imap\", \"ftp\" and \"xmpp\"\n");
333e45f106cb6b47af1f21efe76e933bdea2f5dd1caNagendra Modadugu	BIO_printf(bio_err,"                 are supported.\n");
334656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#ifndef OPENSSL_NO_ENGINE
335656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	BIO_printf(bio_err," -engine id    - Initialise and use the specified engine\n");
336656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#endif
337656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	BIO_printf(bio_err," -rand file%cfile%c...\n", LIST_SEPARATOR_CHAR, LIST_SEPARATOR_CHAR);
338656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	BIO_printf(bio_err," -sess_out arg - file to write SSL session to\n");
339656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	BIO_printf(bio_err," -sess_in arg  - file to read SSL session from\n");
340656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#ifndef OPENSSL_NO_TLSEXT
341656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	BIO_printf(bio_err," -servername host  - Set TLS extension servername in ClientHello\n");
342656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	BIO_printf(bio_err," -tlsextdebug      - hex dump of all TLS extensions received\n");
343656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	BIO_printf(bio_err," -status           - request certificate status from server\n");
344656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	BIO_printf(bio_err," -no_ticket        - disable use of RFC4507bis session tickets\n");
345bf9ac266e34f910ace31880ea92b8deaf6212aa6Kristian Monsen# ifndef OPENSSL_NO_NEXTPROTONEG
346bf9ac266e34f910ace31880ea92b8deaf6212aa6Kristian Monsen	BIO_printf(bio_err," -nextprotoneg arg - enable NPN extension, considering named protocols supported (comma-separated list)\n");
347bf9ac266e34f910ace31880ea92b8deaf6212aa6Kristian Monsen# endif
348248a4c78a25b81a72352125142f3fc04493f428bHuahui Wu	BIO_printf(bio_err," -cutthrough       - enable 1-RTT full-handshake for strong ciphers\n");
349656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#endif
35098d58bb80c64b02a33662f0ea80351d4a1535267Brian Carlstrom	BIO_printf(bio_err," -legacy_renegotiation - enable use of legacy renegotiation (dangerous)\n");
351656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	}
352656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
353656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#ifndef OPENSSL_NO_TLSEXT
354656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
355656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project/* This is a context that we pass to callbacks */
356656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Projecttypedef struct tlsextctx_st {
357656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project   BIO * biodebug;
358656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project   int ack;
359656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project} tlsextctx;
360656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
361656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
362656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Projectstatic int MS_CALLBACK ssl_servername_cb(SSL *s, int *ad, void *arg)
363656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	{
364656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	tlsextctx * p = (tlsextctx *) arg;
365656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	const char * hn= SSL_get_servername(s, TLSEXT_NAMETYPE_host_name);
366656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	if (SSL_get_servername_type(s) != -1)
367656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 	        p->ack = !SSL_session_reused(s) && hn != NULL;
368656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	else
369656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		BIO_printf(bio_err,"Can't use SSL_get_servername\n");
370656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
371656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	return SSL_TLSEXT_ERR_OK;
372656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	}
373bf9ac266e34f910ace31880ea92b8deaf6212aa6Kristian Monsen
374bf9ac266e34f910ace31880ea92b8deaf6212aa6Kristian Monsen# ifndef OPENSSL_NO_NEXTPROTONEG
375bf9ac266e34f910ace31880ea92b8deaf6212aa6Kristian Monsen/* This the context that we pass to next_proto_cb */
376bf9ac266e34f910ace31880ea92b8deaf6212aa6Kristian Monsentypedef struct tlsextnextprotoctx_st {
377bf9ac266e34f910ace31880ea92b8deaf6212aa6Kristian Monsen	unsigned char *data;
378bf9ac266e34f910ace31880ea92b8deaf6212aa6Kristian Monsen	unsigned short len;
379bf9ac266e34f910ace31880ea92b8deaf6212aa6Kristian Monsen	int status;
380bf9ac266e34f910ace31880ea92b8deaf6212aa6Kristian Monsen} tlsextnextprotoctx;
381bf9ac266e34f910ace31880ea92b8deaf6212aa6Kristian Monsen
382bf9ac266e34f910ace31880ea92b8deaf6212aa6Kristian Monsenstatic tlsextnextprotoctx next_proto;
383bf9ac266e34f910ace31880ea92b8deaf6212aa6Kristian Monsen
384bf9ac266e34f910ace31880ea92b8deaf6212aa6Kristian Monsenstatic int next_proto_cb(SSL *s, unsigned char **out, unsigned char *outlen, const unsigned char *in, unsigned int inlen, void *arg)
385bf9ac266e34f910ace31880ea92b8deaf6212aa6Kristian Monsen	{
386bf9ac266e34f910ace31880ea92b8deaf6212aa6Kristian Monsen	tlsextnextprotoctx *ctx = arg;
387bf9ac266e34f910ace31880ea92b8deaf6212aa6Kristian Monsen
388bf9ac266e34f910ace31880ea92b8deaf6212aa6Kristian Monsen	if (!c_quiet)
389bf9ac266e34f910ace31880ea92b8deaf6212aa6Kristian Monsen		{
390bf9ac266e34f910ace31880ea92b8deaf6212aa6Kristian Monsen		/* We can assume that |in| is syntactically valid. */
391bf9ac266e34f910ace31880ea92b8deaf6212aa6Kristian Monsen		unsigned i;
392bf9ac266e34f910ace31880ea92b8deaf6212aa6Kristian Monsen		BIO_printf(bio_c_out, "Protocols advertised by server: ");
393bf9ac266e34f910ace31880ea92b8deaf6212aa6Kristian Monsen		for (i = 0; i < inlen; )
394bf9ac266e34f910ace31880ea92b8deaf6212aa6Kristian Monsen			{
395bf9ac266e34f910ace31880ea92b8deaf6212aa6Kristian Monsen			if (i)
396bf9ac266e34f910ace31880ea92b8deaf6212aa6Kristian Monsen				BIO_write(bio_c_out, ", ", 2);
397bf9ac266e34f910ace31880ea92b8deaf6212aa6Kristian Monsen			BIO_write(bio_c_out, &in[i + 1], in[i]);
398bf9ac266e34f910ace31880ea92b8deaf6212aa6Kristian Monsen			i += in[i] + 1;
399bf9ac266e34f910ace31880ea92b8deaf6212aa6Kristian Monsen			}
400bf9ac266e34f910ace31880ea92b8deaf6212aa6Kristian Monsen		BIO_write(bio_c_out, "\n", 1);
401bf9ac266e34f910ace31880ea92b8deaf6212aa6Kristian Monsen		}
402bf9ac266e34f910ace31880ea92b8deaf6212aa6Kristian Monsen
403bf9ac266e34f910ace31880ea92b8deaf6212aa6Kristian Monsen	ctx->status = SSL_select_next_proto(out, outlen, in, inlen, ctx->data, ctx->len);
404bf9ac266e34f910ace31880ea92b8deaf6212aa6Kristian Monsen	return SSL_TLSEXT_ERR_OK;
405bf9ac266e34f910ace31880ea92b8deaf6212aa6Kristian Monsen	}
406bf9ac266e34f910ace31880ea92b8deaf6212aa6Kristian Monsen# endif  /* ndef OPENSSL_NO_NEXTPROTONEG */
407656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#endif
408674ff29eb647c577ba1ef822c373ead69dc386cfBrian Carlstrom
409656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Projectenum
410656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project{
411656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	PROTO_OFF	= 0,
412656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	PROTO_SMTP,
413656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	PROTO_POP3,
414656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	PROTO_IMAP,
415e45f106cb6b47af1f21efe76e933bdea2f5dd1caNagendra Modadugu	PROTO_FTP,
416e45f106cb6b47af1f21efe76e933bdea2f5dd1caNagendra Modadugu	PROTO_XMPP
417656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project};
418656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
419656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Projectint MAIN(int, char **);
420656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
421656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Projectint MAIN(int argc, char **argv)
422656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	{
423674ff29eb647c577ba1ef822c373ead69dc386cfBrian Carlstrom	unsigned int off=0, clr=0;
424674ff29eb647c577ba1ef822c373ead69dc386cfBrian Carlstrom	SSL *con=NULL;
425656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	int s,k,width,state=0;
426656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	char *cbuf=NULL,*sbuf=NULL,*mbuf=NULL;
427656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	int cbuf_len,cbuf_off;
428656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	int sbuf_len,sbuf_off;
429656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	fd_set readfds,writefds;
430656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	short port=PORT;
431656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	int full_log=1;
432656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	char *host=SSL_HOST_NAME;
433656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	char *cert_file=NULL,*key_file=NULL;
434656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	int cert_format = FORMAT_PEM, key_format = FORMAT_PEM;
435656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	char *passarg = NULL, *pass = NULL;
436656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	X509 *cert = NULL;
437656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	EVP_PKEY *key = NULL;
438656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	char *CApath=NULL,*CAfile=NULL,*cipher=NULL;
439656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	int reconnect=0,badop=0,verify=SSL_VERIFY_NONE,bugs=0;
440248a4c78a25b81a72352125142f3fc04493f428bHuahui Wu	int cutthrough=0;
441656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	int crlf=0;
442656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	int write_tty,read_tty,write_ssl,read_ssl,tty_on,ssl_pending;
443656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	SSL_CTX *ctx=NULL;
444656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	int ret=1,in_init=1,i,nbio_test=0;
445656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	int starttls_proto = PROTO_OFF;
446674ff29eb647c577ba1ef822c373ead69dc386cfBrian Carlstrom	int prexit = 0;
447674ff29eb647c577ba1ef822c373ead69dc386cfBrian Carlstrom	X509_VERIFY_PARAM *vpm = NULL;
448674ff29eb647c577ba1ef822c373ead69dc386cfBrian Carlstrom	int badarg = 0;
449674ff29eb647c577ba1ef822c373ead69dc386cfBrian Carlstrom	const SSL_METHOD *meth=NULL;
450674ff29eb647c577ba1ef822c373ead69dc386cfBrian Carlstrom	int socket_type=SOCK_STREAM;
451656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	BIO *sbio;
452656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	char *inrand=NULL;
453656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	int mbuf_len=0;
45498d58bb80c64b02a33662f0ea80351d4a1535267Brian Carlstrom	struct timeval timeout, *timeoutp;
455e45f106cb6b47af1f21efe76e933bdea2f5dd1caNagendra Modadugu#ifndef OPENSSL_NO_ENGINE
456656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	char *engine_id=NULL;
457e45f106cb6b47af1f21efe76e933bdea2f5dd1caNagendra Modadugu	char *ssl_client_engine_id=NULL;
458e45f106cb6b47af1f21efe76e933bdea2f5dd1caNagendra Modadugu	ENGINE *ssl_client_engine=NULL;
459e45f106cb6b47af1f21efe76e933bdea2f5dd1caNagendra Modadugu#endif
460656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	ENGINE *e=NULL;
461674ff29eb647c577ba1ef822c373ead69dc386cfBrian Carlstrom#if defined(OPENSSL_SYS_WINDOWS) || defined(OPENSSL_SYS_MSDOS) || defined(OPENSSL_SYS_NETWARE) || defined(OPENSSL_SYS_BEOS_R5)
462656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	struct timeval tv;
463674ff29eb647c577ba1ef822c373ead69dc386cfBrian Carlstrom#if defined(OPENSSL_SYS_BEOS_R5)
464674ff29eb647c577ba1ef822c373ead69dc386cfBrian Carlstrom	int stdin_set = 0;
465674ff29eb647c577ba1ef822c373ead69dc386cfBrian Carlstrom#endif
466656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#endif
467656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#ifndef OPENSSL_NO_TLSEXT
468656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	char *servername = NULL;
469656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project        tlsextctx tlsextcbp =
470656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project        {NULL,0};
471bf9ac266e34f910ace31880ea92b8deaf6212aa6Kristian Monsen# ifndef OPENSSL_NO_NEXTPROTONEG
472bf9ac266e34f910ace31880ea92b8deaf6212aa6Kristian Monsen	const char *next_proto_neg_in = NULL;
473bf9ac266e34f910ace31880ea92b8deaf6212aa6Kristian Monsen# endif
474656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#endif
475656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	char *sess_in = NULL;
476656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	char *sess_out = NULL;
477656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	struct sockaddr peer;
478656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	int peerlen = sizeof(peer);
479656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	int enable_timeouts = 0 ;
48098d58bb80c64b02a33662f0ea80351d4a1535267Brian Carlstrom	long socket_mtu = 0;
481e45f106cb6b47af1f21efe76e933bdea2f5dd1caNagendra Modadugu#ifndef OPENSSL_NO_JPAKE
482e45f106cb6b47af1f21efe76e933bdea2f5dd1caNagendra Modadugu	char *jpake_secret = NULL;
483e45f106cb6b47af1f21efe76e933bdea2f5dd1caNagendra Modadugu#endif
484656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
485656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#if !defined(OPENSSL_NO_SSL2) && !defined(OPENSSL_NO_SSL3)
486656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	meth=SSLv23_client_method();
487656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#elif !defined(OPENSSL_NO_SSL3)
488656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	meth=SSLv3_client_method();
489656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#elif !defined(OPENSSL_NO_SSL2)
490656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	meth=SSLv2_client_method();
491656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#endif
492656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
493656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	apps_startup();
494656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	c_Pause=0;
495656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	c_quiet=0;
496656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	c_ign_eof=0;
497656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	c_debug=0;
498656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	c_msg=0;
499656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	c_showcerts=0;
500656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
501656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	if (bio_err == NULL)
502656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		bio_err=BIO_new_fp(stderr,BIO_NOCLOSE);
503656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
504656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	if (!load_config(bio_err, NULL))
505656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		goto end;
506656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
507656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	if (	((cbuf=OPENSSL_malloc(BUFSIZZ)) == NULL) ||
508656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		((sbuf=OPENSSL_malloc(BUFSIZZ)) == NULL) ||
509656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		((mbuf=OPENSSL_malloc(BUFSIZZ)) == NULL))
510656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		{
511656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		BIO_printf(bio_err,"out of memory\n");
512656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		goto end;
513656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		}
514656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
515656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	verify_depth=0;
516656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	verify_error=X509_V_OK;
517656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#ifdef FIONBIO
518656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	c_nbio=0;
519656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#endif
520656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
521656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	argc--;
522656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	argv++;
523656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	while (argc >= 1)
524656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		{
525656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		if	(strcmp(*argv,"-host") == 0)
526656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			{
527656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			if (--argc < 1) goto bad;
528656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			host= *(++argv);
529656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			}
530656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		else if	(strcmp(*argv,"-port") == 0)
531656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			{
532656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			if (--argc < 1) goto bad;
533656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			port=atoi(*(++argv));
534656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			if (port == 0) goto bad;
535656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			}
536656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		else if (strcmp(*argv,"-connect") == 0)
537656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			{
538656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			if (--argc < 1) goto bad;
539656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			if (!extract_host_port(*(++argv),&host,NULL,&port))
540656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project				goto bad;
541656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			}
542656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		else if	(strcmp(*argv,"-verify") == 0)
543656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			{
544656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			verify=SSL_VERIFY_PEER;
545656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			if (--argc < 1) goto bad;
546656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			verify_depth=atoi(*(++argv));
547656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			BIO_printf(bio_err,"verify depth is %d\n",verify_depth);
548656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			}
549656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		else if	(strcmp(*argv,"-cert") == 0)
550656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			{
551656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			if (--argc < 1) goto bad;
552656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			cert_file= *(++argv);
553656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			}
554656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		else if	(strcmp(*argv,"-sess_out") == 0)
555656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			{
556656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			if (--argc < 1) goto bad;
557656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			sess_out = *(++argv);
558656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			}
559656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		else if	(strcmp(*argv,"-sess_in") == 0)
560656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			{
561656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			if (--argc < 1) goto bad;
562656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			sess_in = *(++argv);
563656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			}
564656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		else if	(strcmp(*argv,"-certform") == 0)
565656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			{
566656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			if (--argc < 1) goto bad;
567656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			cert_format = str2fmt(*(++argv));
568656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			}
569674ff29eb647c577ba1ef822c373ead69dc386cfBrian Carlstrom		else if (args_verify(&argv, &argc, &badarg, bio_err, &vpm))
570674ff29eb647c577ba1ef822c373ead69dc386cfBrian Carlstrom			{
571674ff29eb647c577ba1ef822c373ead69dc386cfBrian Carlstrom			if (badarg)
572674ff29eb647c577ba1ef822c373ead69dc386cfBrian Carlstrom				goto bad;
573674ff29eb647c577ba1ef822c373ead69dc386cfBrian Carlstrom			continue;
574674ff29eb647c577ba1ef822c373ead69dc386cfBrian Carlstrom			}
575674ff29eb647c577ba1ef822c373ead69dc386cfBrian Carlstrom		else if (strcmp(*argv,"-verify_return_error") == 0)
576674ff29eb647c577ba1ef822c373ead69dc386cfBrian Carlstrom			verify_return_error = 1;
577656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		else if	(strcmp(*argv,"-prexit") == 0)
578656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			prexit=1;
579656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		else if	(strcmp(*argv,"-crlf") == 0)
580656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			crlf=1;
581656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		else if	(strcmp(*argv,"-quiet") == 0)
582656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			{
583656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			c_quiet=1;
584656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			c_ign_eof=1;
585656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			}
586656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		else if	(strcmp(*argv,"-ign_eof") == 0)
587656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			c_ign_eof=1;
588e45f106cb6b47af1f21efe76e933bdea2f5dd1caNagendra Modadugu		else if	(strcmp(*argv,"-no_ign_eof") == 0)
589e45f106cb6b47af1f21efe76e933bdea2f5dd1caNagendra Modadugu			c_ign_eof=0;
590656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		else if	(strcmp(*argv,"-pause") == 0)
591656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			c_Pause=1;
592656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		else if	(strcmp(*argv,"-debug") == 0)
593656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			c_debug=1;
594656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#ifndef OPENSSL_NO_TLSEXT
595656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		else if	(strcmp(*argv,"-tlsextdebug") == 0)
596656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			c_tlsextdebug=1;
597656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		else if	(strcmp(*argv,"-status") == 0)
598656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			c_status_req=1;
599656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#endif
600656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#ifdef WATT32
601656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		else if (strcmp(*argv,"-wdebug") == 0)
602656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			dbug_init();
603656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#endif
604656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		else if	(strcmp(*argv,"-msg") == 0)
605656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			c_msg=1;
606656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		else if	(strcmp(*argv,"-showcerts") == 0)
607656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			c_showcerts=1;
608656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		else if	(strcmp(*argv,"-nbio_test") == 0)
609656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			nbio_test=1;
610656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		else if	(strcmp(*argv,"-state") == 0)
611656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			state=1;
612674ff29eb647c577ba1ef822c373ead69dc386cfBrian Carlstrom#ifndef OPENSSL_NO_PSK
613674ff29eb647c577ba1ef822c373ead69dc386cfBrian Carlstrom                else if (strcmp(*argv,"-psk_identity") == 0)
614674ff29eb647c577ba1ef822c373ead69dc386cfBrian Carlstrom			{
615674ff29eb647c577ba1ef822c373ead69dc386cfBrian Carlstrom			if (--argc < 1) goto bad;
616674ff29eb647c577ba1ef822c373ead69dc386cfBrian Carlstrom			psk_identity=*(++argv);
617674ff29eb647c577ba1ef822c373ead69dc386cfBrian Carlstrom			}
618674ff29eb647c577ba1ef822c373ead69dc386cfBrian Carlstrom                else if (strcmp(*argv,"-psk") == 0)
619674ff29eb647c577ba1ef822c373ead69dc386cfBrian Carlstrom			{
620674ff29eb647c577ba1ef822c373ead69dc386cfBrian Carlstrom                        size_t j;
621674ff29eb647c577ba1ef822c373ead69dc386cfBrian Carlstrom
622674ff29eb647c577ba1ef822c373ead69dc386cfBrian Carlstrom			if (--argc < 1) goto bad;
623674ff29eb647c577ba1ef822c373ead69dc386cfBrian Carlstrom			psk_key=*(++argv);
624674ff29eb647c577ba1ef822c373ead69dc386cfBrian Carlstrom			for (j = 0; j < strlen(psk_key); j++)
625674ff29eb647c577ba1ef822c373ead69dc386cfBrian Carlstrom                                {
626674ff29eb647c577ba1ef822c373ead69dc386cfBrian Carlstrom                                if (isxdigit((int)psk_key[j]))
627674ff29eb647c577ba1ef822c373ead69dc386cfBrian Carlstrom                                        continue;
628674ff29eb647c577ba1ef822c373ead69dc386cfBrian Carlstrom                                BIO_printf(bio_err,"Not a hex number '%s'\n",*argv);
629674ff29eb647c577ba1ef822c373ead69dc386cfBrian Carlstrom                                goto bad;
630674ff29eb647c577ba1ef822c373ead69dc386cfBrian Carlstrom                                }
631674ff29eb647c577ba1ef822c373ead69dc386cfBrian Carlstrom			}
632674ff29eb647c577ba1ef822c373ead69dc386cfBrian Carlstrom#endif
633656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#ifndef OPENSSL_NO_SSL2
634656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		else if	(strcmp(*argv,"-ssl2") == 0)
635656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			meth=SSLv2_client_method();
636656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#endif
637656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#ifndef OPENSSL_NO_SSL3
638656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		else if	(strcmp(*argv,"-ssl3") == 0)
639656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			meth=SSLv3_client_method();
640656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#endif
641656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#ifndef OPENSSL_NO_TLS1
642656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		else if	(strcmp(*argv,"-tls1") == 0)
643656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			meth=TLSv1_client_method();
644656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#endif
645656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#ifndef OPENSSL_NO_DTLS1
646656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		else if	(strcmp(*argv,"-dtls1") == 0)
647656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			{
648656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			meth=DTLSv1_client_method();
649674ff29eb647c577ba1ef822c373ead69dc386cfBrian Carlstrom			socket_type=SOCK_DGRAM;
650656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			}
651656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		else if (strcmp(*argv,"-timeout") == 0)
652656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			enable_timeouts=1;
653656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		else if (strcmp(*argv,"-mtu") == 0)
654656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			{
655656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			if (--argc < 1) goto bad;
65698d58bb80c64b02a33662f0ea80351d4a1535267Brian Carlstrom			socket_mtu = atol(*(++argv));
657656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			}
658656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#endif
659656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		else if (strcmp(*argv,"-bugs") == 0)
660656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			bugs=1;
661656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		else if	(strcmp(*argv,"-keyform") == 0)
662656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			{
663656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			if (--argc < 1) goto bad;
664656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			key_format = str2fmt(*(++argv));
665656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			}
666656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		else if	(strcmp(*argv,"-pass") == 0)
667656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			{
668656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			if (--argc < 1) goto bad;
669656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			passarg = *(++argv);
670656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			}
671656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		else if	(strcmp(*argv,"-key") == 0)
672656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			{
673656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			if (--argc < 1) goto bad;
674656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			key_file= *(++argv);
675656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			}
676656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		else if	(strcmp(*argv,"-reconnect") == 0)
677656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			{
678656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			reconnect=5;
679656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			}
680656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		else if	(strcmp(*argv,"-CApath") == 0)
681656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			{
682656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			if (--argc < 1) goto bad;
683656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			CApath= *(++argv);
684656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			}
685656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		else if	(strcmp(*argv,"-CAfile") == 0)
686656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			{
687656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			if (--argc < 1) goto bad;
688656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			CAfile= *(++argv);
689656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			}
690656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		else if (strcmp(*argv,"-no_tls1") == 0)
691656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			off|=SSL_OP_NO_TLSv1;
692656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		else if (strcmp(*argv,"-no_ssl3") == 0)
693656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			off|=SSL_OP_NO_SSLv3;
694656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		else if (strcmp(*argv,"-no_ssl2") == 0)
695656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			off|=SSL_OP_NO_SSLv2;
696674ff29eb647c577ba1ef822c373ead69dc386cfBrian Carlstrom		else if	(strcmp(*argv,"-no_comp") == 0)
697674ff29eb647c577ba1ef822c373ead69dc386cfBrian Carlstrom			{ off|=SSL_OP_NO_COMPRESSION; }
698656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#ifndef OPENSSL_NO_TLSEXT
699656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		else if	(strcmp(*argv,"-no_ticket") == 0)
700656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			{ off|=SSL_OP_NO_TICKET; }
701bf9ac266e34f910ace31880ea92b8deaf6212aa6Kristian Monsen# ifndef OPENSSL_NO_NEXTPROTONEG
702bf9ac266e34f910ace31880ea92b8deaf6212aa6Kristian Monsen		else if (strcmp(*argv,"-nextprotoneg") == 0)
703bf9ac266e34f910ace31880ea92b8deaf6212aa6Kristian Monsen			{
704bf9ac266e34f910ace31880ea92b8deaf6212aa6Kristian Monsen			if (--argc < 1) goto bad;
705bf9ac266e34f910ace31880ea92b8deaf6212aa6Kristian Monsen			next_proto_neg_in = *(++argv);
706bf9ac266e34f910ace31880ea92b8deaf6212aa6Kristian Monsen			}
707bf9ac266e34f910ace31880ea92b8deaf6212aa6Kristian Monsen# endif
708656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#endif
709248a4c78a25b81a72352125142f3fc04493f428bHuahui Wu		else if (strcmp(*argv,"-cutthrough") == 0)
710248a4c78a25b81a72352125142f3fc04493f428bHuahui Wu			cutthrough=1;
711656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		else if (strcmp(*argv,"-serverpref") == 0)
712656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			off|=SSL_OP_CIPHER_SERVER_PREFERENCE;
71398d58bb80c64b02a33662f0ea80351d4a1535267Brian Carlstrom		else if (strcmp(*argv,"-legacy_renegotiation") == 0)
71498d58bb80c64b02a33662f0ea80351d4a1535267Brian Carlstrom			off|=SSL_OP_ALLOW_UNSAFE_LEGACY_RENEGOTIATION;
71598d58bb80c64b02a33662f0ea80351d4a1535267Brian Carlstrom		else if	(strcmp(*argv,"-legacy_server_connect") == 0)
71698d58bb80c64b02a33662f0ea80351d4a1535267Brian Carlstrom			{ off|=SSL_OP_LEGACY_SERVER_CONNECT; }
71798d58bb80c64b02a33662f0ea80351d4a1535267Brian Carlstrom		else if	(strcmp(*argv,"-no_legacy_server_connect") == 0)
71898d58bb80c64b02a33662f0ea80351d4a1535267Brian Carlstrom			{ clr|=SSL_OP_LEGACY_SERVER_CONNECT; }
719656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		else if	(strcmp(*argv,"-cipher") == 0)
720656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			{
721656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			if (--argc < 1) goto bad;
722656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			cipher= *(++argv);
723656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			}
724656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#ifdef FIONBIO
725656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		else if (strcmp(*argv,"-nbio") == 0)
726656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			{ c_nbio=1; }
727656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#endif
728656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		else if	(strcmp(*argv,"-starttls") == 0)
729656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			{
730656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			if (--argc < 1) goto bad;
731656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			++argv;
732656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			if (strcmp(*argv,"smtp") == 0)
733656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project				starttls_proto = PROTO_SMTP;
734656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			else if (strcmp(*argv,"pop3") == 0)
735656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project				starttls_proto = PROTO_POP3;
736656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			else if (strcmp(*argv,"imap") == 0)
737656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project				starttls_proto = PROTO_IMAP;
738656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			else if (strcmp(*argv,"ftp") == 0)
739656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project				starttls_proto = PROTO_FTP;
740e45f106cb6b47af1f21efe76e933bdea2f5dd1caNagendra Modadugu			else if (strcmp(*argv, "xmpp") == 0)
741e45f106cb6b47af1f21efe76e933bdea2f5dd1caNagendra Modadugu				starttls_proto = PROTO_XMPP;
742656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			else
743656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project				goto bad;
744656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			}
745656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#ifndef OPENSSL_NO_ENGINE
746656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		else if	(strcmp(*argv,"-engine") == 0)
747656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			{
748656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			if (--argc < 1) goto bad;
749656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			engine_id = *(++argv);
750656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			}
751e45f106cb6b47af1f21efe76e933bdea2f5dd1caNagendra Modadugu		else if	(strcmp(*argv,"-ssl_client_engine") == 0)
752e45f106cb6b47af1f21efe76e933bdea2f5dd1caNagendra Modadugu			{
753e45f106cb6b47af1f21efe76e933bdea2f5dd1caNagendra Modadugu			if (--argc < 1) goto bad;
754e45f106cb6b47af1f21efe76e933bdea2f5dd1caNagendra Modadugu			ssl_client_engine_id = *(++argv);
755e45f106cb6b47af1f21efe76e933bdea2f5dd1caNagendra Modadugu			}
756656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#endif
757656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		else if (strcmp(*argv,"-rand") == 0)
758656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			{
759656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			if (--argc < 1) goto bad;
760656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			inrand= *(++argv);
761656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			}
762656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#ifndef OPENSSL_NO_TLSEXT
763656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		else if (strcmp(*argv,"-servername") == 0)
764656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			{
765656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			if (--argc < 1) goto bad;
766656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			servername= *(++argv);
767656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			/* meth=TLSv1_client_method(); */
768656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			}
769656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#endif
770e45f106cb6b47af1f21efe76e933bdea2f5dd1caNagendra Modadugu#ifndef OPENSSL_NO_JPAKE
771e45f106cb6b47af1f21efe76e933bdea2f5dd1caNagendra Modadugu		else if (strcmp(*argv,"-jpake") == 0)
772e45f106cb6b47af1f21efe76e933bdea2f5dd1caNagendra Modadugu			{
773e45f106cb6b47af1f21efe76e933bdea2f5dd1caNagendra Modadugu			if (--argc < 1) goto bad;
774e45f106cb6b47af1f21efe76e933bdea2f5dd1caNagendra Modadugu			jpake_secret = *++argv;
775e45f106cb6b47af1f21efe76e933bdea2f5dd1caNagendra Modadugu			}
776e45f106cb6b47af1f21efe76e933bdea2f5dd1caNagendra Modadugu#endif
777656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		else
778656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			{
779656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			BIO_printf(bio_err,"unknown option %s\n",*argv);
780656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			badop=1;
781656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			break;
782656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			}
783656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		argc--;
784656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		argv++;
785656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		}
786656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	if (badop)
787656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		{
788656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Projectbad:
789656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		sc_usage();
790656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		goto end;
791656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		}
792656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
793674ff29eb647c577ba1ef822c373ead69dc386cfBrian Carlstrom#if !defined(OPENSSL_NO_JPAKE) && !defined(OPENSSL_NO_PSK)
794674ff29eb647c577ba1ef822c373ead69dc386cfBrian Carlstrom	if (jpake_secret)
795674ff29eb647c577ba1ef822c373ead69dc386cfBrian Carlstrom		{
796674ff29eb647c577ba1ef822c373ead69dc386cfBrian Carlstrom		if (psk_key)
797674ff29eb647c577ba1ef822c373ead69dc386cfBrian Carlstrom			{
798674ff29eb647c577ba1ef822c373ead69dc386cfBrian Carlstrom			BIO_printf(bio_err,
799674ff29eb647c577ba1ef822c373ead69dc386cfBrian Carlstrom				   "Can't use JPAKE and PSK together\n");
800674ff29eb647c577ba1ef822c373ead69dc386cfBrian Carlstrom			goto end;
801674ff29eb647c577ba1ef822c373ead69dc386cfBrian Carlstrom			}
802674ff29eb647c577ba1ef822c373ead69dc386cfBrian Carlstrom		psk_identity = "JPAKE";
803674ff29eb647c577ba1ef822c373ead69dc386cfBrian Carlstrom		}
804674ff29eb647c577ba1ef822c373ead69dc386cfBrian Carlstrom
805674ff29eb647c577ba1ef822c373ead69dc386cfBrian Carlstrom	if (cipher)
806674ff29eb647c577ba1ef822c373ead69dc386cfBrian Carlstrom		{
807674ff29eb647c577ba1ef822c373ead69dc386cfBrian Carlstrom		BIO_printf(bio_err, "JPAKE sets cipher to PSK\n");
808674ff29eb647c577ba1ef822c373ead69dc386cfBrian Carlstrom		goto end;
809674ff29eb647c577ba1ef822c373ead69dc386cfBrian Carlstrom		}
810674ff29eb647c577ba1ef822c373ead69dc386cfBrian Carlstrom	cipher = "PSK";
811674ff29eb647c577ba1ef822c373ead69dc386cfBrian Carlstrom#endif
812674ff29eb647c577ba1ef822c373ead69dc386cfBrian Carlstrom
813656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	OpenSSL_add_ssl_algorithms();
814656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	SSL_load_error_strings();
815656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
816bf9ac266e34f910ace31880ea92b8deaf6212aa6Kristian Monsen#if !defined(OPENSSL_NO_TLSEXT) && !defined(OPENSSL_NO_NEXTPROTONEG)
817bf9ac266e34f910ace31880ea92b8deaf6212aa6Kristian Monsen	next_proto.status = -1;
818bf9ac266e34f910ace31880ea92b8deaf6212aa6Kristian Monsen	if (next_proto_neg_in)
819bf9ac266e34f910ace31880ea92b8deaf6212aa6Kristian Monsen		{
820bf9ac266e34f910ace31880ea92b8deaf6212aa6Kristian Monsen		next_proto.data = next_protos_parse(&next_proto.len, next_proto_neg_in);
821bf9ac266e34f910ace31880ea92b8deaf6212aa6Kristian Monsen		if (next_proto.data == NULL)
822bf9ac266e34f910ace31880ea92b8deaf6212aa6Kristian Monsen			{
823bf9ac266e34f910ace31880ea92b8deaf6212aa6Kristian Monsen			BIO_printf(bio_err, "Error parsing -nextprotoneg argument\n");
824bf9ac266e34f910ace31880ea92b8deaf6212aa6Kristian Monsen			goto end;
825bf9ac266e34f910ace31880ea92b8deaf6212aa6Kristian Monsen			}
826bf9ac266e34f910ace31880ea92b8deaf6212aa6Kristian Monsen		}
827bf9ac266e34f910ace31880ea92b8deaf6212aa6Kristian Monsen	else
828bf9ac266e34f910ace31880ea92b8deaf6212aa6Kristian Monsen		next_proto.data = NULL;
829bf9ac266e34f910ace31880ea92b8deaf6212aa6Kristian Monsen#endif
830bf9ac266e34f910ace31880ea92b8deaf6212aa6Kristian Monsen
831656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#ifndef OPENSSL_NO_ENGINE
832656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project        e = setup_engine(bio_err, engine_id, 1);
833e45f106cb6b47af1f21efe76e933bdea2f5dd1caNagendra Modadugu	if (ssl_client_engine_id)
834e45f106cb6b47af1f21efe76e933bdea2f5dd1caNagendra Modadugu		{
835e45f106cb6b47af1f21efe76e933bdea2f5dd1caNagendra Modadugu		ssl_client_engine = ENGINE_by_id(ssl_client_engine_id);
836e45f106cb6b47af1f21efe76e933bdea2f5dd1caNagendra Modadugu		if (!ssl_client_engine)
837e45f106cb6b47af1f21efe76e933bdea2f5dd1caNagendra Modadugu			{
838e45f106cb6b47af1f21efe76e933bdea2f5dd1caNagendra Modadugu			BIO_printf(bio_err,
839e45f106cb6b47af1f21efe76e933bdea2f5dd1caNagendra Modadugu					"Error getting client auth engine\n");
840e45f106cb6b47af1f21efe76e933bdea2f5dd1caNagendra Modadugu			goto end;
841e45f106cb6b47af1f21efe76e933bdea2f5dd1caNagendra Modadugu			}
842e45f106cb6b47af1f21efe76e933bdea2f5dd1caNagendra Modadugu		}
843674ff29eb647c577ba1ef822c373ead69dc386cfBrian Carlstrom
844656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#endif
845656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	if (!app_passwd(bio_err, passarg, NULL, &pass, NULL))
846656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		{
847656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		BIO_printf(bio_err, "Error getting password\n");
848656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		goto end;
849656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		}
850656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
851656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	if (key_file == NULL)
852656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		key_file = cert_file;
853656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
854656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
855656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	if (key_file)
856656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
857656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		{
858656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
859656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		key = load_key(bio_err, key_file, key_format, 0, pass, e,
860656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			       "client certificate private key file");
861656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		if (!key)
862656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			{
863656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			ERR_print_errors(bio_err);
864656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			goto end;
865656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			}
866656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
867656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		}
868656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
869656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	if (cert_file)
870656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
871656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		{
872656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		cert = load_cert(bio_err,cert_file,cert_format,
873656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project				NULL, e, "client certificate file");
874656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
875656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		if (!cert)
876656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			{
877656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			ERR_print_errors(bio_err);
878656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			goto end;
879656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			}
880656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		}
881656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
882656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	if (!app_RAND_load_file(NULL, bio_err, 1) && inrand == NULL
883656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		&& !RAND_status())
884656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		{
885656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		BIO_printf(bio_err,"warning, not much extra random data, consider using the -rand option\n");
886656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		}
887656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	if (inrand != NULL)
888656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		BIO_printf(bio_err,"%ld semi-random bytes loaded\n",
889656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			app_RAND_load_files(inrand));
890656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
891656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	if (bio_c_out == NULL)
892656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		{
893656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		if (c_quiet && !c_debug && !c_msg)
894656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			{
895656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			bio_c_out=BIO_new(BIO_s_null());
896656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			}
897656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		else
898656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			{
899656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			if (bio_c_out == NULL)
900656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project				bio_c_out=BIO_new_fp(stdout,BIO_NOCLOSE);
901656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			}
902656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		}
903656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
904656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	ctx=SSL_CTX_new(meth);
905656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	if (ctx == NULL)
906656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		{
907656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		ERR_print_errors(bio_err);
908656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		goto end;
909656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		}
910656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
911674ff29eb647c577ba1ef822c373ead69dc386cfBrian Carlstrom	if (vpm)
912674ff29eb647c577ba1ef822c373ead69dc386cfBrian Carlstrom		SSL_CTX_set1_param(ctx, vpm);
913674ff29eb647c577ba1ef822c373ead69dc386cfBrian Carlstrom
914e45f106cb6b47af1f21efe76e933bdea2f5dd1caNagendra Modadugu#ifndef OPENSSL_NO_ENGINE
915e45f106cb6b47af1f21efe76e933bdea2f5dd1caNagendra Modadugu	if (ssl_client_engine)
916e45f106cb6b47af1f21efe76e933bdea2f5dd1caNagendra Modadugu		{
917e45f106cb6b47af1f21efe76e933bdea2f5dd1caNagendra Modadugu		if (!SSL_CTX_set_client_cert_engine(ctx, ssl_client_engine))
918e45f106cb6b47af1f21efe76e933bdea2f5dd1caNagendra Modadugu			{
919e45f106cb6b47af1f21efe76e933bdea2f5dd1caNagendra Modadugu			BIO_puts(bio_err, "Error setting client auth engine\n");
920e45f106cb6b47af1f21efe76e933bdea2f5dd1caNagendra Modadugu			ERR_print_errors(bio_err);
921e45f106cb6b47af1f21efe76e933bdea2f5dd1caNagendra Modadugu			ENGINE_free(ssl_client_engine);
922e45f106cb6b47af1f21efe76e933bdea2f5dd1caNagendra Modadugu			goto end;
923e45f106cb6b47af1f21efe76e933bdea2f5dd1caNagendra Modadugu			}
924e45f106cb6b47af1f21efe76e933bdea2f5dd1caNagendra Modadugu		ENGINE_free(ssl_client_engine);
925e45f106cb6b47af1f21efe76e933bdea2f5dd1caNagendra Modadugu		}
926e45f106cb6b47af1f21efe76e933bdea2f5dd1caNagendra Modadugu#endif
927e45f106cb6b47af1f21efe76e933bdea2f5dd1caNagendra Modadugu
928674ff29eb647c577ba1ef822c373ead69dc386cfBrian Carlstrom#ifndef OPENSSL_NO_PSK
929674ff29eb647c577ba1ef822c373ead69dc386cfBrian Carlstrom#ifdef OPENSSL_NO_JPAKE
930674ff29eb647c577ba1ef822c373ead69dc386cfBrian Carlstrom	if (psk_key != NULL)
931674ff29eb647c577ba1ef822c373ead69dc386cfBrian Carlstrom#else
932674ff29eb647c577ba1ef822c373ead69dc386cfBrian Carlstrom	if (psk_key != NULL || jpake_secret)
933674ff29eb647c577ba1ef822c373ead69dc386cfBrian Carlstrom#endif
934674ff29eb647c577ba1ef822c373ead69dc386cfBrian Carlstrom		{
935674ff29eb647c577ba1ef822c373ead69dc386cfBrian Carlstrom		if (c_debug)
936674ff29eb647c577ba1ef822c373ead69dc386cfBrian Carlstrom			BIO_printf(bio_c_out, "PSK key given or JPAKE in use, setting client callback\n");
937674ff29eb647c577ba1ef822c373ead69dc386cfBrian Carlstrom		SSL_CTX_set_psk_client_callback(ctx, psk_client_cb);
938674ff29eb647c577ba1ef822c373ead69dc386cfBrian Carlstrom		}
939674ff29eb647c577ba1ef822c373ead69dc386cfBrian Carlstrom#endif
940656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	if (bugs)
941656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		SSL_CTX_set_options(ctx,SSL_OP_ALL|off);
942656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	else
943656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		SSL_CTX_set_options(ctx,off);
94498d58bb80c64b02a33662f0ea80351d4a1535267Brian Carlstrom
94598d58bb80c64b02a33662f0ea80351d4a1535267Brian Carlstrom	if (clr)
94698d58bb80c64b02a33662f0ea80351d4a1535267Brian Carlstrom		SSL_CTX_clear_options(ctx, clr);
947656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	/* DTLS: partial reads end up discarding unread UDP bytes :-(
948656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	 * Setting read ahead solves this problem.
949656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	 */
950674ff29eb647c577ba1ef822c373ead69dc386cfBrian Carlstrom	if (socket_type == SOCK_DGRAM) SSL_CTX_set_read_ahead(ctx, 1);
951656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
952248a4c78a25b81a72352125142f3fc04493f428bHuahui Wu	/* Enable handshake cutthrough for client connections using
953248a4c78a25b81a72352125142f3fc04493f428bHuahui Wu	 * strong ciphers. */
954248a4c78a25b81a72352125142f3fc04493f428bHuahui Wu	if (cutthrough)
955248a4c78a25b81a72352125142f3fc04493f428bHuahui Wu		{
956248a4c78a25b81a72352125142f3fc04493f428bHuahui Wu		int ssl_mode = SSL_CTX_get_mode(ctx);
957248a4c78a25b81a72352125142f3fc04493f428bHuahui Wu		ssl_mode |= SSL_MODE_HANDSHAKE_CUTTHROUGH;
958248a4c78a25b81a72352125142f3fc04493f428bHuahui Wu		SSL_CTX_set_mode(ctx, ssl_mode);
959248a4c78a25b81a72352125142f3fc04493f428bHuahui Wu		}
960248a4c78a25b81a72352125142f3fc04493f428bHuahui Wu
961bf9ac266e34f910ace31880ea92b8deaf6212aa6Kristian Monsen#if !defined(OPENSSL_NO_TLSEXT) && !defined(OPENSSL_NO_NEXTPROTONEG)
962bf9ac266e34f910ace31880ea92b8deaf6212aa6Kristian Monsen	if (next_proto.data)
963bf9ac266e34f910ace31880ea92b8deaf6212aa6Kristian Monsen		SSL_CTX_set_next_proto_select_cb(ctx, next_proto_cb, &next_proto);
964bf9ac266e34f910ace31880ea92b8deaf6212aa6Kristian Monsen#endif
965bf9ac266e34f910ace31880ea92b8deaf6212aa6Kristian Monsen
966656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	if (state) SSL_CTX_set_info_callback(ctx,apps_ssl_info_callback);
967656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	if (cipher != NULL)
968656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		if(!SSL_CTX_set_cipher_list(ctx,cipher)) {
969656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		BIO_printf(bio_err,"error setting cipher list\n");
970656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		ERR_print_errors(bio_err);
971656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		goto end;
972656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	}
973656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#if 0
974656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	else
975656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		SSL_CTX_set_cipher_list(ctx,getenv("SSL_CIPHER"));
976656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#endif
977656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
978656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	SSL_CTX_set_verify(ctx,verify,verify_callback);
979656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	if (!set_cert_key_stuff(ctx,cert,key))
980656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		goto end;
981656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
982656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	if ((!SSL_CTX_load_verify_locations(ctx,CAfile,CApath)) ||
983656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		(!SSL_CTX_set_default_verify_paths(ctx)))
984656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		{
985656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		/* BIO_printf(bio_err,"error setting default verify locations\n"); */
986656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		ERR_print_errors(bio_err);
987656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		/* goto end; */
988656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		}
989656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
990656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#ifndef OPENSSL_NO_TLSEXT
991656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	if (servername != NULL)
992656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		{
993656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		tlsextcbp.biodebug = bio_err;
994656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		SSL_CTX_set_tlsext_servername_callback(ctx, ssl_servername_cb);
995656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		SSL_CTX_set_tlsext_servername_arg(ctx, &tlsextcbp);
996656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		}
997656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#endif
998656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
999656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	con=SSL_new(ctx);
1000656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	if (sess_in)
1001656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		{
1002656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		SSL_SESSION *sess;
1003656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		BIO *stmp = BIO_new_file(sess_in, "r");
1004656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		if (!stmp)
1005656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			{
1006656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			BIO_printf(bio_err, "Can't open session file %s\n",
1007656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project						sess_in);
1008656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			ERR_print_errors(bio_err);
1009656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			goto end;
1010656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			}
1011656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		sess = PEM_read_bio_SSL_SESSION(stmp, NULL, 0, NULL);
1012656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		BIO_free(stmp);
1013656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		if (!sess)
1014656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			{
1015656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			BIO_printf(bio_err, "Can't open session file %s\n",
1016656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project						sess_in);
1017656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			ERR_print_errors(bio_err);
1018656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			goto end;
1019656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			}
1020656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		SSL_set_session(con, sess);
1021656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		SSL_SESSION_free(sess);
1022656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		}
1023656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#ifndef OPENSSL_NO_TLSEXT
1024656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	if (servername != NULL)
1025656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		{
1026656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		if (!SSL_set_tlsext_host_name(con,servername))
1027656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			{
1028656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			BIO_printf(bio_err,"Unable to set TLS servername extension.\n");
1029656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			ERR_print_errors(bio_err);
1030656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			goto end;
1031656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			}
1032656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		}
1033656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#endif
1034656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#ifndef OPENSSL_NO_KRB5
1035656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	if (con  &&  (con->kssl_ctx = kssl_ctx_new()) != NULL)
1036656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project                {
1037656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project                kssl_ctx_setstring(con->kssl_ctx, KSSL_SERVER, host);
1038656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		}
1039656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#endif	/* OPENSSL_NO_KRB5  */
1040656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project/*	SSL_set_cipher_list(con,"RC4-MD5"); */
1041674ff29eb647c577ba1ef822c373ead69dc386cfBrian Carlstrom#if 0
1042674ff29eb647c577ba1ef822c373ead69dc386cfBrian Carlstrom#ifdef TLSEXT_TYPE_opaque_prf_input
1043674ff29eb647c577ba1ef822c373ead69dc386cfBrian Carlstrom	SSL_set_tlsext_opaque_prf_input(con, "Test client", 11);
1044674ff29eb647c577ba1ef822c373ead69dc386cfBrian Carlstrom#endif
1045674ff29eb647c577ba1ef822c373ead69dc386cfBrian Carlstrom#endif
1046656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
1047656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Projectre_start:
1048656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
1049674ff29eb647c577ba1ef822c373ead69dc386cfBrian Carlstrom	if (init_client(&s,host,port,socket_type) == 0)
1050656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		{
1051656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		BIO_printf(bio_err,"connect:errno=%d\n",get_last_socket_error());
1052656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		SHUTDOWN(s);
1053656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		goto end;
1054656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		}
1055656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	BIO_printf(bio_c_out,"CONNECTED(%08X)\n",s);
1056656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
1057656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#ifdef FIONBIO
1058656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	if (c_nbio)
1059656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		{
1060656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		unsigned long l=1;
1061656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		BIO_printf(bio_c_out,"turning on non blocking io\n");
1062656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		if (BIO_socket_ioctl(s,FIONBIO,&l) < 0)
1063656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			{
1064656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			ERR_print_errors(bio_err);
1065656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			goto end;
1066656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			}
1067656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		}
1068656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#endif
1069656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	if (c_Pause & 0x01) con->debug=1;
1070656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
1071656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	if ( SSL_version(con) == DTLS1_VERSION)
1072656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		{
1073656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
1074656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		sbio=BIO_new_dgram(s,BIO_NOCLOSE);
1075656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		if (getsockname(s, &peer, (void *)&peerlen) < 0)
1076656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			{
1077656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			BIO_printf(bio_err, "getsockname:errno=%d\n",
1078656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project				get_last_socket_error());
1079656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			SHUTDOWN(s);
1080656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			goto end;
1081656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			}
1082656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
1083656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		(void)BIO_ctrl_set_connected(sbio, 1, &peer);
1084656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
1085674ff29eb647c577ba1ef822c373ead69dc386cfBrian Carlstrom		if (enable_timeouts)
1086656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			{
1087656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			timeout.tv_sec = 0;
1088656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			timeout.tv_usec = DGRAM_RCV_TIMEOUT;
1089656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			BIO_ctrl(sbio, BIO_CTRL_DGRAM_SET_RECV_TIMEOUT, 0, &timeout);
1090656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
1091656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			timeout.tv_sec = 0;
1092656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			timeout.tv_usec = DGRAM_SND_TIMEOUT;
1093656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			BIO_ctrl(sbio, BIO_CTRL_DGRAM_SET_SEND_TIMEOUT, 0, &timeout);
1094656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			}
1095656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
109698d58bb80c64b02a33662f0ea80351d4a1535267Brian Carlstrom		if (socket_mtu > 28)
1097656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			{
1098656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			SSL_set_options(con, SSL_OP_NO_QUERY_MTU);
109998d58bb80c64b02a33662f0ea80351d4a1535267Brian Carlstrom			SSL_set_mtu(con, socket_mtu - 28);
1100656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			}
1101656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		else
1102656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			/* want to do MTU discovery */
1103656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			BIO_ctrl(sbio, BIO_CTRL_DGRAM_MTU_DISCOVER, 0, NULL);
1104656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		}
1105656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	else
1106656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		sbio=BIO_new_socket(s,BIO_NOCLOSE);
1107656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
1108656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	if (nbio_test)
1109656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		{
1110656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		BIO *test;
1111656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
1112656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		test=BIO_new(BIO_f_nbio_test());
1113656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		sbio=BIO_push(test,sbio);
1114656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		}
1115656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
1116656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	if (c_debug)
1117656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		{
1118656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		con->debug=1;
1119656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		BIO_set_callback(sbio,bio_dump_callback);
1120656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		BIO_set_callback_arg(sbio,(char *)bio_c_out);
1121656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		}
1122656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	if (c_msg)
1123656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		{
1124656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		SSL_set_msg_callback(con, msg_cb);
1125656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		SSL_set_msg_callback_arg(con, bio_c_out);
1126656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		}
1127656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#ifndef OPENSSL_NO_TLSEXT
1128656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	if (c_tlsextdebug)
1129656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		{
1130656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		SSL_set_tlsext_debug_callback(con, tlsext_cb);
1131656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		SSL_set_tlsext_debug_arg(con, bio_c_out);
1132656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		}
1133656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	if (c_status_req)
1134656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		{
1135656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		SSL_set_tlsext_status_type(con, TLSEXT_STATUSTYPE_ocsp);
1136656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		SSL_CTX_set_tlsext_status_cb(ctx, ocsp_resp_cb);
1137656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		SSL_CTX_set_tlsext_status_arg(ctx, bio_c_out);
1138656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#if 0
1139656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project{
1140656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source ProjectSTACK_OF(OCSP_RESPID) *ids = sk_OCSP_RESPID_new_null();
1141656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source ProjectOCSP_RESPID *id = OCSP_RESPID_new();
1142656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Projectid->value.byKey = ASN1_OCTET_STRING_new();
1143656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Projectid->type = V_OCSP_RESPID_KEY;
1144656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source ProjectASN1_STRING_set(id->value.byKey, "Hello World", -1);
1145656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Projectsk_OCSP_RESPID_push(ids, id);
1146656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source ProjectSSL_set_tlsext_status_ids(con, ids);
1147656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project}
1148656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#endif
1149656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		}
1150656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#endif
1151e45f106cb6b47af1f21efe76e933bdea2f5dd1caNagendra Modadugu#ifndef OPENSSL_NO_JPAKE
1152e45f106cb6b47af1f21efe76e933bdea2f5dd1caNagendra Modadugu	if (jpake_secret)
1153e45f106cb6b47af1f21efe76e933bdea2f5dd1caNagendra Modadugu		jpake_client_auth(bio_c_out, sbio, jpake_secret);
1154e45f106cb6b47af1f21efe76e933bdea2f5dd1caNagendra Modadugu#endif
1155656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
1156656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	SSL_set_bio(con,sbio,sbio);
1157656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	SSL_set_connect_state(con);
1158656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
1159656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	/* ok, lets connect */
1160656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	width=SSL_get_fd(con)+1;
1161656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
1162656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	read_tty=1;
1163656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	write_tty=0;
1164656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	tty_on=0;
1165656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	read_ssl=1;
1166656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	write_ssl=1;
1167656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
1168656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	cbuf_len=0;
1169656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	cbuf_off=0;
1170656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	sbuf_len=0;
1171656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	sbuf_off=0;
1172656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
1173656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	/* This is an ugly hack that does a lot of assumptions */
1174656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	/* We do have to handle multi-line responses which may come
1175656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 	   in a single packet or not. We therefore have to use
1176656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	   BIO_gets() which does need a buffering BIO. So during
1177656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	   the initial chitchat we do push a buffering BIO into the
1178656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	   chain that is removed again later on to not disturb the
1179656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	   rest of the s_client operation. */
1180656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	if (starttls_proto == PROTO_SMTP)
1181656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		{
1182656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		int foundit=0;
1183656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		BIO *fbio = BIO_new(BIO_f_buffer());
1184656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		BIO_push(fbio, sbio);
1185656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		/* wait for multi-line response to end from SMTP */
1186656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		do
1187656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			{
1188656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			mbuf_len = BIO_gets(fbio,mbuf,BUFSIZZ);
1189656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			}
1190656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		while (mbuf_len>3 && mbuf[3]=='-');
1191656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		/* STARTTLS command requires EHLO... */
1192656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		BIO_printf(fbio,"EHLO openssl.client.net\r\n");
1193656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		(void)BIO_flush(fbio);
1194656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		/* wait for multi-line response to end EHLO SMTP response */
1195656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		do
1196656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			{
1197656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			mbuf_len = BIO_gets(fbio,mbuf,BUFSIZZ);
1198656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			if (strstr(mbuf,"STARTTLS"))
1199656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project				foundit=1;
1200656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			}
1201656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		while (mbuf_len>3 && mbuf[3]=='-');
1202656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		(void)BIO_flush(fbio);
1203656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		BIO_pop(fbio);
1204656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		BIO_free(fbio);
1205656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		if (!foundit)
1206656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			BIO_printf(bio_err,
1207656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project				   "didn't found starttls in server response,"
1208656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project				   " try anyway...\n");
1209656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		BIO_printf(sbio,"STARTTLS\r\n");
1210656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		BIO_read(sbio,sbuf,BUFSIZZ);
1211656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		}
1212656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	else if (starttls_proto == PROTO_POP3)
1213656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		{
1214656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		BIO_read(sbio,mbuf,BUFSIZZ);
1215656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		BIO_printf(sbio,"STLS\r\n");
1216656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		BIO_read(sbio,sbuf,BUFSIZZ);
1217656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		}
1218656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	else if (starttls_proto == PROTO_IMAP)
1219656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		{
1220656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		int foundit=0;
1221656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		BIO *fbio = BIO_new(BIO_f_buffer());
1222656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		BIO_push(fbio, sbio);
1223656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		BIO_gets(fbio,mbuf,BUFSIZZ);
1224656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		/* STARTTLS command requires CAPABILITY... */
1225656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		BIO_printf(fbio,". CAPABILITY\r\n");
1226656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		(void)BIO_flush(fbio);
1227656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		/* wait for multi-line CAPABILITY response */
1228656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		do
1229656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			{
1230656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			mbuf_len = BIO_gets(fbio,mbuf,BUFSIZZ);
1231656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			if (strstr(mbuf,"STARTTLS"))
1232656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project				foundit=1;
1233656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			}
1234656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		while (mbuf_len>3 && mbuf[0]!='.');
1235656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		(void)BIO_flush(fbio);
1236656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		BIO_pop(fbio);
1237656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		BIO_free(fbio);
1238656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		if (!foundit)
1239656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			BIO_printf(bio_err,
1240656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project				   "didn't found STARTTLS in server response,"
1241656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project				   " try anyway...\n");
1242656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		BIO_printf(sbio,". STARTTLS\r\n");
1243656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		BIO_read(sbio,sbuf,BUFSIZZ);
1244656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		}
1245656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	else if (starttls_proto == PROTO_FTP)
1246656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		{
1247656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		BIO *fbio = BIO_new(BIO_f_buffer());
1248656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		BIO_push(fbio, sbio);
1249656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		/* wait for multi-line response to end from FTP */
1250656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		do
1251656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			{
1252656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			mbuf_len = BIO_gets(fbio,mbuf,BUFSIZZ);
1253656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			}
1254656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		while (mbuf_len>3 && mbuf[3]=='-');
1255656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		(void)BIO_flush(fbio);
1256656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		BIO_pop(fbio);
1257656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		BIO_free(fbio);
1258656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		BIO_printf(sbio,"AUTH TLS\r\n");
1259656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		BIO_read(sbio,sbuf,BUFSIZZ);
1260656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		}
1261e45f106cb6b47af1f21efe76e933bdea2f5dd1caNagendra Modadugu	if (starttls_proto == PROTO_XMPP)
1262e45f106cb6b47af1f21efe76e933bdea2f5dd1caNagendra Modadugu		{
1263e45f106cb6b47af1f21efe76e933bdea2f5dd1caNagendra Modadugu		int seen = 0;
1264e45f106cb6b47af1f21efe76e933bdea2f5dd1caNagendra Modadugu		BIO_printf(sbio,"<stream:stream "
1265e45f106cb6b47af1f21efe76e933bdea2f5dd1caNagendra Modadugu		    "xmlns:stream='http://etherx.jabber.org/streams' "
1266e45f106cb6b47af1f21efe76e933bdea2f5dd1caNagendra Modadugu		    "xmlns='jabber:client' to='%s' version='1.0'>", host);
1267e45f106cb6b47af1f21efe76e933bdea2f5dd1caNagendra Modadugu		seen = BIO_read(sbio,mbuf,BUFSIZZ);
1268e45f106cb6b47af1f21efe76e933bdea2f5dd1caNagendra Modadugu		mbuf[seen] = 0;
1269e45f106cb6b47af1f21efe76e933bdea2f5dd1caNagendra Modadugu		while (!strstr(mbuf, "<starttls xmlns='urn:ietf:params:xml:ns:xmpp-tls'"))
1270e45f106cb6b47af1f21efe76e933bdea2f5dd1caNagendra Modadugu			{
1271e45f106cb6b47af1f21efe76e933bdea2f5dd1caNagendra Modadugu			if (strstr(mbuf, "/stream:features>"))
1272e45f106cb6b47af1f21efe76e933bdea2f5dd1caNagendra Modadugu				goto shut;
1273e45f106cb6b47af1f21efe76e933bdea2f5dd1caNagendra Modadugu			seen = BIO_read(sbio,mbuf,BUFSIZZ);
1274e45f106cb6b47af1f21efe76e933bdea2f5dd1caNagendra Modadugu			mbuf[seen] = 0;
1275e45f106cb6b47af1f21efe76e933bdea2f5dd1caNagendra Modadugu			}
1276e45f106cb6b47af1f21efe76e933bdea2f5dd1caNagendra Modadugu		BIO_printf(sbio, "<starttls xmlns='urn:ietf:params:xml:ns:xmpp-tls'/>");
1277e45f106cb6b47af1f21efe76e933bdea2f5dd1caNagendra Modadugu		seen = BIO_read(sbio,sbuf,BUFSIZZ);
1278e45f106cb6b47af1f21efe76e933bdea2f5dd1caNagendra Modadugu		sbuf[seen] = 0;
1279e45f106cb6b47af1f21efe76e933bdea2f5dd1caNagendra Modadugu		if (!strstr(sbuf, "<proceed"))
1280e45f106cb6b47af1f21efe76e933bdea2f5dd1caNagendra Modadugu			goto shut;
1281e45f106cb6b47af1f21efe76e933bdea2f5dd1caNagendra Modadugu		mbuf[0] = 0;
1282e45f106cb6b47af1f21efe76e933bdea2f5dd1caNagendra Modadugu		}
1283656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
1284656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	for (;;)
1285656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		{
1286656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		FD_ZERO(&readfds);
1287656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		FD_ZERO(&writefds);
1288656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
128998d58bb80c64b02a33662f0ea80351d4a1535267Brian Carlstrom		if ((SSL_version(con) == DTLS1_VERSION) &&
129098d58bb80c64b02a33662f0ea80351d4a1535267Brian Carlstrom			DTLSv1_get_timeout(con, &timeout))
129198d58bb80c64b02a33662f0ea80351d4a1535267Brian Carlstrom			timeoutp = &timeout;
129298d58bb80c64b02a33662f0ea80351d4a1535267Brian Carlstrom		else
129398d58bb80c64b02a33662f0ea80351d4a1535267Brian Carlstrom			timeoutp = NULL;
129498d58bb80c64b02a33662f0ea80351d4a1535267Brian Carlstrom
1295656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		if (SSL_in_init(con) && !SSL_total_renegotiations(con))
1296656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			{
1297656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			in_init=1;
1298656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			tty_on=0;
1299656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			}
1300656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		else
1301656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			{
1302656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			tty_on=1;
1303656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			if (in_init)
1304656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project				{
1305656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project				in_init=0;
1306674ff29eb647c577ba1ef822c373ead69dc386cfBrian Carlstrom#if 0 /* This test doesn't really work as intended (needs to be fixed) */
1307674ff29eb647c577ba1ef822c373ead69dc386cfBrian Carlstrom#ifndef OPENSSL_NO_TLSEXT
1308674ff29eb647c577ba1ef822c373ead69dc386cfBrian Carlstrom				if (servername != NULL && !SSL_session_reused(con))
1309674ff29eb647c577ba1ef822c373ead69dc386cfBrian Carlstrom					{
1310674ff29eb647c577ba1ef822c373ead69dc386cfBrian Carlstrom					BIO_printf(bio_c_out,"Server did %sacknowledge servername extension.\n",tlsextcbp.ack?"":"not ");
1311674ff29eb647c577ba1ef822c373ead69dc386cfBrian Carlstrom					}
1312674ff29eb647c577ba1ef822c373ead69dc386cfBrian Carlstrom#endif
1313674ff29eb647c577ba1ef822c373ead69dc386cfBrian Carlstrom#endif
1314656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project				if (sess_out)
1315656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project					{
1316656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project					BIO *stmp = BIO_new_file(sess_out, "w");
1317656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project					if (stmp)
1318656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project						{
1319656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project						PEM_write_bio_SSL_SESSION(stmp, SSL_get_session(con));
1320656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project						BIO_free(stmp);
1321656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project						}
1322656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project					else
1323656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project						BIO_printf(bio_err, "Error writing session file %s\n", sess_out);
1324656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project					}
1325656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project				print_stuff(bio_c_out,con,full_log);
1326656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project				if (full_log > 0) full_log--;
1327656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
1328656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project				if (starttls_proto)
1329656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project					{
1330656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project					BIO_printf(bio_err,"%s",mbuf);
1331656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project					/* We don't need to know any more */
1332656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project					starttls_proto = PROTO_OFF;
1333656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project					}
1334656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
1335656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project				if (reconnect)
1336656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project					{
1337656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project					reconnect--;
1338656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project					BIO_printf(bio_c_out,"drop connection and then reconnect\n");
1339656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project					SSL_shutdown(con);
1340656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project					SSL_set_connect_state(con);
1341656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project					SHUTDOWN(SSL_get_fd(con));
1342656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project					goto re_start;
1343656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project					}
1344656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project				}
1345656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			}
1346656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
1347656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		ssl_pending = read_ssl && SSL_pending(con);
1348656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
1349656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		if (!ssl_pending)
1350656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			{
1351674ff29eb647c577ba1ef822c373ead69dc386cfBrian Carlstrom#if !defined(OPENSSL_SYS_WINDOWS) && !defined(OPENSSL_SYS_MSDOS) && !defined(OPENSSL_SYS_NETWARE) && !defined (OPENSSL_SYS_BEOS_R5)
1352656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			if (tty_on)
1353656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project				{
1354674ff29eb647c577ba1ef822c373ead69dc386cfBrian Carlstrom				if (read_tty)  openssl_fdset(fileno(stdin),&readfds);
1355674ff29eb647c577ba1ef822c373ead69dc386cfBrian Carlstrom				if (write_tty) openssl_fdset(fileno(stdout),&writefds);
1356656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project				}
1357656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			if (read_ssl)
1358674ff29eb647c577ba1ef822c373ead69dc386cfBrian Carlstrom				openssl_fdset(SSL_get_fd(con),&readfds);
1359656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			if (write_ssl)
1360674ff29eb647c577ba1ef822c373ead69dc386cfBrian Carlstrom				openssl_fdset(SSL_get_fd(con),&writefds);
1361656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#else
1362656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			if(!tty_on || !write_tty) {
1363656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project				if (read_ssl)
1364674ff29eb647c577ba1ef822c373ead69dc386cfBrian Carlstrom					openssl_fdset(SSL_get_fd(con),&readfds);
1365656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project				if (write_ssl)
1366674ff29eb647c577ba1ef822c373ead69dc386cfBrian Carlstrom					openssl_fdset(SSL_get_fd(con),&writefds);
1367656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			}
1368656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#endif
1369656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project/*			printf("mode tty(%d %d%d) ssl(%d%d)\n",
1370656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project				tty_on,read_tty,write_tty,read_ssl,write_ssl);*/
1371656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
1372656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			/* Note: under VMS with SOCKETSHR the second parameter
1373656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			 * is currently of type (int *) whereas under other
1374656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			 * systems it is (void *) if you don't have a cast it
1375656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			 * will choke the compiler: if you do have a cast then
1376656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			 * you can either go for (int *) or (void *).
1377656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			 */
1378656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#if defined(OPENSSL_SYS_WINDOWS) || defined(OPENSSL_SYS_MSDOS)
1379656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project                        /* Under Windows/DOS we make the assumption that we can
1380656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			 * always write to the tty: therefore if we need to
1381656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			 * write to the tty we just fall through. Otherwise
1382656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			 * we timeout the select every second and see if there
1383656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			 * are any keypresses. Note: this is a hack, in a proper
1384656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			 * Windows application we wouldn't do this.
1385656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			 */
1386656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			i=0;
1387656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			if(!write_tty) {
1388656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project				if(read_tty) {
1389656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project					tv.tv_sec = 1;
1390656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project					tv.tv_usec = 0;
1391656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project					i=select(width,(void *)&readfds,(void *)&writefds,
1392656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project						 NULL,&tv);
1393656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#if defined(OPENSSL_SYS_WINCE) || defined(OPENSSL_SYS_MSDOS)
1394656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project					if(!i && (!_kbhit() || !read_tty) ) continue;
1395656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#else
1396656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project					if(!i && (!((_kbhit()) || (WAIT_OBJECT_0 == WaitForSingleObject(GetStdHandle(STD_INPUT_HANDLE), 0))) || !read_tty) ) continue;
1397656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#endif
1398656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project				} else 	i=select(width,(void *)&readfds,(void *)&writefds,
139998d58bb80c64b02a33662f0ea80351d4a1535267Brian Carlstrom					 NULL,timeoutp);
1400656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			}
1401656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#elif defined(OPENSSL_SYS_NETWARE)
1402656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			if(!write_tty) {
1403656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project				if(read_tty) {
1404656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project					tv.tv_sec = 1;
1405656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project					tv.tv_usec = 0;
1406656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project					i=select(width,(void *)&readfds,(void *)&writefds,
1407656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project						NULL,&tv);
1408656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project				} else 	i=select(width,(void *)&readfds,(void *)&writefds,
140998d58bb80c64b02a33662f0ea80351d4a1535267Brian Carlstrom					NULL,timeoutp);
1410656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			}
1411674ff29eb647c577ba1ef822c373ead69dc386cfBrian Carlstrom#elif defined(OPENSSL_SYS_BEOS_R5)
1412674ff29eb647c577ba1ef822c373ead69dc386cfBrian Carlstrom			/* Under BeOS-R5 the situation is similar to DOS */
1413674ff29eb647c577ba1ef822c373ead69dc386cfBrian Carlstrom			i=0;
1414674ff29eb647c577ba1ef822c373ead69dc386cfBrian Carlstrom			stdin_set = 0;
1415674ff29eb647c577ba1ef822c373ead69dc386cfBrian Carlstrom			(void)fcntl(fileno(stdin), F_SETFL, O_NONBLOCK);
1416674ff29eb647c577ba1ef822c373ead69dc386cfBrian Carlstrom			if(!write_tty) {
1417674ff29eb647c577ba1ef822c373ead69dc386cfBrian Carlstrom				if(read_tty) {
1418674ff29eb647c577ba1ef822c373ead69dc386cfBrian Carlstrom					tv.tv_sec = 1;
1419674ff29eb647c577ba1ef822c373ead69dc386cfBrian Carlstrom					tv.tv_usec = 0;
1420674ff29eb647c577ba1ef822c373ead69dc386cfBrian Carlstrom					i=select(width,(void *)&readfds,(void *)&writefds,
1421674ff29eb647c577ba1ef822c373ead69dc386cfBrian Carlstrom						 NULL,&tv);
1422674ff29eb647c577ba1ef822c373ead69dc386cfBrian Carlstrom					if (read(fileno(stdin), sbuf, 0) >= 0)
1423674ff29eb647c577ba1ef822c373ead69dc386cfBrian Carlstrom						stdin_set = 1;
1424674ff29eb647c577ba1ef822c373ead69dc386cfBrian Carlstrom					if (!i && (stdin_set != 1 || !read_tty))
1425674ff29eb647c577ba1ef822c373ead69dc386cfBrian Carlstrom						continue;
1426674ff29eb647c577ba1ef822c373ead69dc386cfBrian Carlstrom				} else 	i=select(width,(void *)&readfds,(void *)&writefds,
1427674ff29eb647c577ba1ef822c373ead69dc386cfBrian Carlstrom					 NULL,timeoutp);
1428674ff29eb647c577ba1ef822c373ead69dc386cfBrian Carlstrom			}
1429674ff29eb647c577ba1ef822c373ead69dc386cfBrian Carlstrom			(void)fcntl(fileno(stdin), F_SETFL, 0);
1430656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#else
1431656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			i=select(width,(void *)&readfds,(void *)&writefds,
143298d58bb80c64b02a33662f0ea80351d4a1535267Brian Carlstrom				 NULL,timeoutp);
1433656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#endif
1434656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			if ( i < 0)
1435656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project				{
1436656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project				BIO_printf(bio_err,"bad select %d\n",
1437656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project				get_last_socket_error());
1438656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project				goto shut;
1439656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project				/* goto end; */
1440656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project				}
1441656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			}
1442656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
144398d58bb80c64b02a33662f0ea80351d4a1535267Brian Carlstrom		if ((SSL_version(con) == DTLS1_VERSION) && DTLSv1_handle_timeout(con) > 0)
144498d58bb80c64b02a33662f0ea80351d4a1535267Brian Carlstrom			{
144598d58bb80c64b02a33662f0ea80351d4a1535267Brian Carlstrom			BIO_printf(bio_err,"TIMEOUT occured\n");
144698d58bb80c64b02a33662f0ea80351d4a1535267Brian Carlstrom			}
144798d58bb80c64b02a33662f0ea80351d4a1535267Brian Carlstrom
1448656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		if (!ssl_pending && FD_ISSET(SSL_get_fd(con),&writefds))
1449656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			{
1450656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			k=SSL_write(con,&(cbuf[cbuf_off]),
1451656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project				(unsigned int)cbuf_len);
1452656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			switch (SSL_get_error(con,k))
1453656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project				{
1454656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			case SSL_ERROR_NONE:
1455656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project				cbuf_off+=k;
1456656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project				cbuf_len-=k;
1457656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project				if (k <= 0) goto end;
1458656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project				/* we have done a  write(con,NULL,0); */
1459656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project				if (cbuf_len <= 0)
1460656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project					{
1461656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project					read_tty=1;
1462656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project					write_ssl=0;
1463656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project					}
1464656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project				else /* if (cbuf_len > 0) */
1465656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project					{
1466656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project					read_tty=0;
1467656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project					write_ssl=1;
1468656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project					}
1469656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project				break;
1470656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			case SSL_ERROR_WANT_WRITE:
1471656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project				BIO_printf(bio_c_out,"write W BLOCK\n");
1472656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project				write_ssl=1;
1473656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project				read_tty=0;
1474656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project				break;
1475656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			case SSL_ERROR_WANT_READ:
1476656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project				BIO_printf(bio_c_out,"write R BLOCK\n");
1477656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project				write_tty=0;
1478656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project				read_ssl=1;
1479656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project				write_ssl=0;
1480656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project				break;
1481656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			case SSL_ERROR_WANT_X509_LOOKUP:
1482656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project				BIO_printf(bio_c_out,"write X BLOCK\n");
1483656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project				break;
1484656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			case SSL_ERROR_ZERO_RETURN:
1485656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project				if (cbuf_len != 0)
1486656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project					{
1487656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project					BIO_printf(bio_c_out,"shutdown\n");
1488674ff29eb647c577ba1ef822c373ead69dc386cfBrian Carlstrom					ret = 0;
1489656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project					goto shut;
1490656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project					}
1491656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project				else
1492656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project					{
1493656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project					read_tty=1;
1494656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project					write_ssl=0;
1495656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project					break;
1496656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project					}
1497656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
1498656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			case SSL_ERROR_SYSCALL:
1499656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project				if ((k != 0) || (cbuf_len != 0))
1500656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project					{
1501656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project					BIO_printf(bio_err,"write:errno=%d\n",
1502656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project						get_last_socket_error());
1503656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project					goto shut;
1504656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project					}
1505656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project				else
1506656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project					{
1507656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project					read_tty=1;
1508656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project					write_ssl=0;
1509656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project					}
1510656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project				break;
1511656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			case SSL_ERROR_SSL:
1512656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project				ERR_print_errors(bio_err);
1513656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project				goto shut;
1514656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project				}
1515656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			}
1516674ff29eb647c577ba1ef822c373ead69dc386cfBrian Carlstrom#if defined(OPENSSL_SYS_WINDOWS) || defined(OPENSSL_SYS_MSDOS) || defined(OPENSSL_SYS_NETWARE) || defined(OPENSSL_SYS_BEOS_R5)
1517674ff29eb647c577ba1ef822c373ead69dc386cfBrian Carlstrom		/* Assume Windows/DOS/BeOS can always write */
1518656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		else if (!ssl_pending && write_tty)
1519656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#else
1520656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		else if (!ssl_pending && FD_ISSET(fileno(stdout),&writefds))
1521656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#endif
1522656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			{
1523656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#ifdef CHARSET_EBCDIC
1524656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			ascii2ebcdic(&(sbuf[sbuf_off]),&(sbuf[sbuf_off]),sbuf_len);
1525656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#endif
1526674ff29eb647c577ba1ef822c373ead69dc386cfBrian Carlstrom			i=raw_write_stdout(&(sbuf[sbuf_off]),sbuf_len);
1527656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
1528656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			if (i <= 0)
1529656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project				{
1530656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project				BIO_printf(bio_c_out,"DONE\n");
1531674ff29eb647c577ba1ef822c373ead69dc386cfBrian Carlstrom				ret = 0;
1532656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project				goto shut;
1533656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project				/* goto end; */
1534656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project				}
1535656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
1536656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			sbuf_len-=i;;
1537656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			sbuf_off+=i;
1538656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			if (sbuf_len <= 0)
1539656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project				{
1540656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project				read_ssl=1;
1541656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project				write_tty=0;
1542656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project				}
1543656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			}
1544656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		else if (ssl_pending || FD_ISSET(SSL_get_fd(con),&readfds))
1545656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			{
1546656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#ifdef RENEG
1547656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project{ static int iiii; if (++iiii == 52) { SSL_renegotiate(con); iiii=0; } }
1548656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#endif
1549656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#if 1
1550656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			k=SSL_read(con,sbuf,1024 /* BUFSIZZ */ );
1551656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#else
1552656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project/* Demo for pending and peek :-) */
1553656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			k=SSL_read(con,sbuf,16);
1554656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project{ char zbuf[10240];
1555656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Projectprintf("read=%d pending=%d peek=%d\n",k,SSL_pending(con),SSL_peek(con,zbuf,10240));
1556656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project}
1557656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#endif
1558656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
1559656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			switch (SSL_get_error(con,k))
1560656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project				{
1561656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			case SSL_ERROR_NONE:
1562656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project				if (k <= 0)
1563656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project					goto end;
1564656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project				sbuf_off=0;
1565656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project				sbuf_len=k;
1566656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
1567656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project				read_ssl=0;
1568656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project				write_tty=1;
1569656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project				break;
1570656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			case SSL_ERROR_WANT_WRITE:
1571656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project				BIO_printf(bio_c_out,"read W BLOCK\n");
1572656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project				write_ssl=1;
1573656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project				read_tty=0;
1574656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project				break;
1575656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			case SSL_ERROR_WANT_READ:
1576656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project				BIO_printf(bio_c_out,"read R BLOCK\n");
1577656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project				write_tty=0;
1578656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project				read_ssl=1;
1579656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project				if ((read_tty == 0) && (write_ssl == 0))
1580656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project					write_ssl=1;
1581656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project				break;
1582656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			case SSL_ERROR_WANT_X509_LOOKUP:
1583656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project				BIO_printf(bio_c_out,"read X BLOCK\n");
1584656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project				break;
1585656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			case SSL_ERROR_SYSCALL:
1586674ff29eb647c577ba1ef822c373ead69dc386cfBrian Carlstrom				ret=get_last_socket_error();
1587674ff29eb647c577ba1ef822c373ead69dc386cfBrian Carlstrom				BIO_printf(bio_err,"read:errno=%d\n",ret);
1588656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project				goto shut;
1589656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			case SSL_ERROR_ZERO_RETURN:
1590656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project				BIO_printf(bio_c_out,"closed\n");
1591674ff29eb647c577ba1ef822c373ead69dc386cfBrian Carlstrom				ret=0;
1592656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project				goto shut;
1593656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			case SSL_ERROR_SSL:
1594656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project				ERR_print_errors(bio_err);
1595656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project				goto shut;
1596656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project				/* break; */
1597656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project				}
1598656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			}
1599656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
1600656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#if defined(OPENSSL_SYS_WINDOWS) || defined(OPENSSL_SYS_MSDOS)
1601656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#if defined(OPENSSL_SYS_WINCE) || defined(OPENSSL_SYS_MSDOS)
1602656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		else if (_kbhit())
1603656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#else
1604656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		else if ((_kbhit()) || (WAIT_OBJECT_0 == WaitForSingleObject(GetStdHandle(STD_INPUT_HANDLE), 0)))
1605656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#endif
1606656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#elif defined (OPENSSL_SYS_NETWARE)
1607674ff29eb647c577ba1ef822c373ead69dc386cfBrian Carlstrom		else if (_kbhit())
1608674ff29eb647c577ba1ef822c373ead69dc386cfBrian Carlstrom#elif defined(OPENSSL_SYS_BEOS_R5)
1609674ff29eb647c577ba1ef822c373ead69dc386cfBrian Carlstrom		else if (stdin_set)
1610656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#else
1611656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		else if (FD_ISSET(fileno(stdin),&readfds))
1612656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#endif
1613656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			{
1614656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			if (crlf)
1615656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project				{
1616656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project				int j, lf_num;
1617656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
1618674ff29eb647c577ba1ef822c373ead69dc386cfBrian Carlstrom				i=raw_read_stdin(cbuf,BUFSIZZ/2);
1619656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project				lf_num = 0;
1620656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project				/* both loops are skipped when i <= 0 */
1621656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project				for (j = 0; j < i; j++)
1622656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project					if (cbuf[j] == '\n')
1623656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project						lf_num++;
1624656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project				for (j = i-1; j >= 0; j--)
1625656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project					{
1626656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project					cbuf[j+lf_num] = cbuf[j];
1627656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project					if (cbuf[j] == '\n')
1628656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project						{
1629656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project						lf_num--;
1630656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project						i++;
1631656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project						cbuf[j+lf_num] = '\r';
1632656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project						}
1633656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project					}
1634656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project				assert(lf_num == 0);
1635656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project				}
1636656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			else
1637674ff29eb647c577ba1ef822c373ead69dc386cfBrian Carlstrom				i=raw_read_stdin(cbuf,BUFSIZZ);
1638656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
1639656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			if ((!c_ign_eof) && ((i <= 0) || (cbuf[0] == 'Q')))
1640656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project				{
1641656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project				BIO_printf(bio_err,"DONE\n");
1642674ff29eb647c577ba1ef822c373ead69dc386cfBrian Carlstrom				ret=0;
1643656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project				goto shut;
1644656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project				}
1645656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
1646656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			if ((!c_ign_eof) && (cbuf[0] == 'R'))
1647656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project				{
1648656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project				BIO_printf(bio_err,"RENEGOTIATING\n");
1649656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project				SSL_renegotiate(con);
1650656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project				cbuf_len=0;
1651656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project				}
1652656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			else
1653656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project				{
1654656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project				cbuf_len=i;
1655656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project				cbuf_off=0;
1656656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#ifdef CHARSET_EBCDIC
1657656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project				ebcdic2ascii(cbuf, cbuf, i);
1658656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#endif
1659656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project				}
1660656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
1661656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			write_ssl=1;
1662656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			read_tty=0;
1663656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			}
1664656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		}
1665674ff29eb647c577ba1ef822c373ead69dc386cfBrian Carlstrom
1666674ff29eb647c577ba1ef822c373ead69dc386cfBrian Carlstrom	ret=0;
1667656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Projectshut:
1668674ff29eb647c577ba1ef822c373ead69dc386cfBrian Carlstrom	if (in_init)
1669674ff29eb647c577ba1ef822c373ead69dc386cfBrian Carlstrom		print_stuff(bio_c_out,con,full_log);
1670656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	SSL_shutdown(con);
1671656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	SHUTDOWN(SSL_get_fd(con));
1672656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Projectend:
1673674ff29eb647c577ba1ef822c373ead69dc386cfBrian Carlstrom	if (con != NULL)
1674674ff29eb647c577ba1ef822c373ead69dc386cfBrian Carlstrom		{
1675674ff29eb647c577ba1ef822c373ead69dc386cfBrian Carlstrom		if (prexit != 0)
1676674ff29eb647c577ba1ef822c373ead69dc386cfBrian Carlstrom			print_stuff(bio_c_out,con,1);
1677674ff29eb647c577ba1ef822c373ead69dc386cfBrian Carlstrom		SSL_free(con);
1678674ff29eb647c577ba1ef822c373ead69dc386cfBrian Carlstrom		}
1679656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	if (ctx != NULL) SSL_CTX_free(ctx);
1680656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	if (cert)
1681656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		X509_free(cert);
1682656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	if (key)
1683656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		EVP_PKEY_free(key);
1684656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	if (pass)
1685656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		OPENSSL_free(pass);
1686656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	if (cbuf != NULL) { OPENSSL_cleanse(cbuf,BUFSIZZ); OPENSSL_free(cbuf); }
1687656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	if (sbuf != NULL) { OPENSSL_cleanse(sbuf,BUFSIZZ); OPENSSL_free(sbuf); }
1688656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	if (mbuf != NULL) { OPENSSL_cleanse(mbuf,BUFSIZZ); OPENSSL_free(mbuf); }
1689656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	if (bio_c_out != NULL)
1690656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		{
1691656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		BIO_free(bio_c_out);
1692656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		bio_c_out=NULL;
1693656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		}
1694656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	apps_shutdown();
1695656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	OPENSSL_EXIT(ret);
1696656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	}
1697656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
1698656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
1699656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Projectstatic void print_stuff(BIO *bio, SSL *s, int full)
1700656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	{
1701656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	X509 *peer=NULL;
1702656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	char *p;
1703656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	static const char *space="                ";
1704656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	char buf[BUFSIZ];
1705656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	STACK_OF(X509) *sk;
1706656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	STACK_OF(X509_NAME) *sk2;
1707674ff29eb647c577ba1ef822c373ead69dc386cfBrian Carlstrom	const SSL_CIPHER *c;
1708656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	X509_NAME *xn;
1709656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	int j,i;
1710656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#ifndef OPENSSL_NO_COMP
1711656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	const COMP_METHOD *comp, *expansion;
1712656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#endif
1713656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
1714656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	if (full)
1715656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		{
1716656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		int got_a_chain = 0;
1717656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
1718656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		sk=SSL_get_peer_cert_chain(s);
1719656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		if (sk != NULL)
1720656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			{
1721656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			got_a_chain = 1; /* we don't have it for SSL2 (yet) */
1722656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
1723656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			BIO_printf(bio,"---\nCertificate chain\n");
1724656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			for (i=0; i<sk_X509_num(sk); i++)
1725656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project				{
1726656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project				X509_NAME_oneline(X509_get_subject_name(
1727656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project					sk_X509_value(sk,i)),buf,sizeof buf);
1728656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project				BIO_printf(bio,"%2d s:%s\n",i,buf);
1729656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project				X509_NAME_oneline(X509_get_issuer_name(
1730656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project					sk_X509_value(sk,i)),buf,sizeof buf);
1731656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project				BIO_printf(bio,"   i:%s\n",buf);
1732656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project				if (c_showcerts)
1733656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project					PEM_write_bio_X509(bio,sk_X509_value(sk,i));
1734656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project				}
1735656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			}
1736656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
1737656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		BIO_printf(bio,"---\n");
1738656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		peer=SSL_get_peer_certificate(s);
1739656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		if (peer != NULL)
1740656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			{
1741656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			BIO_printf(bio,"Server certificate\n");
1742656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			if (!(c_showcerts && got_a_chain)) /* Redundant if we showed the whole chain */
1743656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project				PEM_write_bio_X509(bio,peer);
1744656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			X509_NAME_oneline(X509_get_subject_name(peer),
1745656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project				buf,sizeof buf);
1746656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			BIO_printf(bio,"subject=%s\n",buf);
1747656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			X509_NAME_oneline(X509_get_issuer_name(peer),
1748656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project				buf,sizeof buf);
1749656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			BIO_printf(bio,"issuer=%s\n",buf);
1750656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			}
1751656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		else
1752656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			BIO_printf(bio,"no peer certificate available\n");
1753656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
1754656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		sk2=SSL_get_client_CA_list(s);
1755656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		if ((sk2 != NULL) && (sk_X509_NAME_num(sk2) > 0))
1756656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			{
1757656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			BIO_printf(bio,"---\nAcceptable client certificate CA names\n");
1758656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			for (i=0; i<sk_X509_NAME_num(sk2); i++)
1759656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project				{
1760656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project				xn=sk_X509_NAME_value(sk2,i);
1761656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project				X509_NAME_oneline(xn,buf,sizeof(buf));
1762656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project				BIO_write(bio,buf,strlen(buf));
1763656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project				BIO_write(bio,"\n",1);
1764656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project				}
1765656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			}
1766656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		else
1767656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			{
1768656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			BIO_printf(bio,"---\nNo client certificate CA names sent\n");
1769656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			}
1770656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		p=SSL_get_shared_ciphers(s,buf,sizeof buf);
1771656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		if (p != NULL)
1772656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			{
1773656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			/* This works only for SSL 2.  In later protocol
1774656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			 * versions, the client does not know what other
1775656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			 * ciphers (in addition to the one to be used
1776656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			 * in the current connection) the server supports. */
1777656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
1778656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			BIO_printf(bio,"---\nCiphers common between both SSL endpoints:\n");
1779656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			j=i=0;
1780656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			while (*p)
1781656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project				{
1782656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project				if (*p == ':')
1783656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project					{
1784656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project					BIO_write(bio,space,15-j%25);
1785656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project					i++;
1786656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project					j=0;
1787656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project					BIO_write(bio,((i%3)?" ":"\n"),1);
1788656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project					}
1789656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project				else
1790656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project					{
1791656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project					BIO_write(bio,p,1);
1792656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project					j++;
1793656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project					}
1794656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project				p++;
1795656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project				}
1796656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			BIO_write(bio,"\n",1);
1797656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			}
1798656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
1799656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		BIO_printf(bio,"---\nSSL handshake has read %ld bytes and written %ld bytes\n",
1800656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			BIO_number_read(SSL_get_rbio(s)),
1801656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			BIO_number_written(SSL_get_wbio(s)));
1802656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		}
1803656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	BIO_printf(bio,((s->hit)?"---\nReused, ":"---\nNew, "));
1804656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	c=SSL_get_current_cipher(s);
1805656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	BIO_printf(bio,"%s, Cipher is %s\n",
1806656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		SSL_CIPHER_get_version(c),
1807656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		SSL_CIPHER_get_name(c));
1808656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	if (peer != NULL) {
1809656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		EVP_PKEY *pktmp;
1810656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		pktmp = X509_get_pubkey(peer);
1811656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		BIO_printf(bio,"Server public key is %d bit\n",
1812656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project							 EVP_PKEY_bits(pktmp));
1813656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		EVP_PKEY_free(pktmp);
1814656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	}
181598d58bb80c64b02a33662f0ea80351d4a1535267Brian Carlstrom	BIO_printf(bio, "Secure Renegotiation IS%s supported\n",
181698d58bb80c64b02a33662f0ea80351d4a1535267Brian Carlstrom			SSL_get_secure_renegotiation_support(s) ? "" : " NOT");
1817656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#ifndef OPENSSL_NO_COMP
1818656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	comp=SSL_get_current_compression(s);
1819656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	expansion=SSL_get_current_expansion(s);
1820656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	BIO_printf(bio,"Compression: %s\n",
1821656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		comp ? SSL_COMP_get_name(comp) : "NONE");
1822656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	BIO_printf(bio,"Expansion: %s\n",
1823656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		expansion ? SSL_COMP_get_name(expansion) : "NONE");
1824656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#endif
1825bf9ac266e34f910ace31880ea92b8deaf6212aa6Kristian Monsen
1826bf9ac266e34f910ace31880ea92b8deaf6212aa6Kristian Monsen#if !defined(OPENSSL_NO_TLSEXT) && !defined(OPENSSL_NO_NEXTPROTONEG)
1827bf9ac266e34f910ace31880ea92b8deaf6212aa6Kristian Monsen	if (next_proto.status != -1) {
1828bf9ac266e34f910ace31880ea92b8deaf6212aa6Kristian Monsen		const unsigned char *proto;
1829bf9ac266e34f910ace31880ea92b8deaf6212aa6Kristian Monsen		unsigned int proto_len;
1830bf9ac266e34f910ace31880ea92b8deaf6212aa6Kristian Monsen		SSL_get0_next_proto_negotiated(s, &proto, &proto_len);
1831bf9ac266e34f910ace31880ea92b8deaf6212aa6Kristian Monsen		BIO_printf(bio, "Next protocol: (%d) ", next_proto.status);
1832bf9ac266e34f910ace31880ea92b8deaf6212aa6Kristian Monsen		BIO_write(bio, proto, proto_len);
1833bf9ac266e34f910ace31880ea92b8deaf6212aa6Kristian Monsen		BIO_write(bio, "\n", 1);
1834bf9ac266e34f910ace31880ea92b8deaf6212aa6Kristian Monsen	}
1835bf9ac266e34f910ace31880ea92b8deaf6212aa6Kristian Monsen#endif
1836bf9ac266e34f910ace31880ea92b8deaf6212aa6Kristian Monsen
1837656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	SSL_SESSION_print(bio,SSL_get_session(s));
1838656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	BIO_printf(bio,"---\n");
1839656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	if (peer != NULL)
1840656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		X509_free(peer);
1841656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	/* flush, or debugging output gets mixed with http response */
1842656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	(void)BIO_flush(bio);
1843656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	}
1844656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
1845656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#ifndef OPENSSL_NO_TLSEXT
1846656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
1847656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Projectstatic int ocsp_resp_cb(SSL *s, void *arg)
1848656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	{
1849656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	const unsigned char *p;
1850656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	int len;
1851656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	OCSP_RESPONSE *rsp;
1852656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	len = SSL_get_tlsext_status_ocsp_resp(s, &p);
1853656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	BIO_puts(arg, "OCSP response: ");
1854656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	if (!p)
1855656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		{
1856656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		BIO_puts(arg, "no response sent\n");
1857656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		return 1;
1858656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		}
1859656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	rsp = d2i_OCSP_RESPONSE(NULL, &p, len);
1860656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	if (!rsp)
1861656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		{
1862656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		BIO_puts(arg, "response parse error\n");
1863656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		BIO_dump_indent(arg, (char *)p, len, 4);
1864656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		return 0;
1865656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		}
1866656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	BIO_puts(arg, "\n======================================\n");
1867656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	OCSP_RESPONSE_print(arg, rsp, 0);
1868656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	BIO_puts(arg, "======================================\n");
1869656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	OCSP_RESPONSE_free(rsp);
1870656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	return 1;
1871656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	}
1872674ff29eb647c577ba1ef822c373ead69dc386cfBrian Carlstrom
1873674ff29eb647c577ba1ef822c373ead69dc386cfBrian Carlstrom#endif
1874