s_client.c revision 337982
1/* apps/s_client.c */
2/* Copyright (C) 1995-1998 Eric Young (eay@cryptsoft.com)
3 * All rights reserved.
4 *
5 * This package is an SSL implementation written
6 * by Eric Young (eay@cryptsoft.com).
7 * The implementation was written so as to conform with Netscapes SSL.
8 *
9 * This library is free for commercial and non-commercial use as long as
10 * the following conditions are aheared to.  The following conditions
11 * apply to all code found in this distribution, be it the RC4, RSA,
12 * lhash, DES, etc., code; not just the SSL code.  The SSL documentation
13 * included with this distribution is covered by the same copyright terms
14 * except that the holder is Tim Hudson (tjh@cryptsoft.com).
15 *
16 * Copyright remains Eric Young's, and as such any Copyright notices in
17 * the code are not to be removed.
18 * If this package is used in a product, Eric Young should be given attribution
19 * as the author of the parts of the library used.
20 * This can be in the form of a textual message at program startup or
21 * in documentation (online or textual) provided with the package.
22 *
23 * Redistribution and use in source and binary forms, with or without
24 * modification, are permitted provided that the following conditions
25 * are met:
26 * 1. Redistributions of source code must retain the copyright
27 *    notice, this list of conditions and the following disclaimer.
28 * 2. Redistributions in binary form must reproduce the above copyright
29 *    notice, this list of conditions and the following disclaimer in the
30 *    documentation and/or other materials provided with the distribution.
31 * 3. All advertising materials mentioning features or use of this software
32 *    must display the following acknowledgement:
33 *    "This product includes cryptographic software written by
34 *     Eric Young (eay@cryptsoft.com)"
35 *    The word 'cryptographic' can be left out if the rouines from the library
36 *    being used are not cryptographic related :-).
37 * 4. If you include any Windows specific code (or a derivative thereof) from
38 *    the apps directory (application code) you must include an acknowledgement:
39 *    "This product includes software written by Tim Hudson (tjh@cryptsoft.com)"
40 *
41 * THIS SOFTWARE IS PROVIDED BY ERIC YOUNG ``AS IS'' AND
42 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
43 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
44 * ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
45 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
46 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
47 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
48 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
49 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
50 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
51 * SUCH DAMAGE.
52 *
53 * The licence and distribution terms for any publically available version or
54 * derivative of this code cannot be changed.  i.e. this code cannot simply be
55 * copied and put under another distribution licence
56 * [including the GNU Public Licence.]
57 */
58/* ====================================================================
59 * Copyright (c) 1998-2018 The OpenSSL Project.  All rights reserved.
60 *
61 * Redistribution and use in source and binary forms, with or without
62 * modification, are permitted provided that the following conditions
63 * are met:
64 *
65 * 1. Redistributions of source code must retain the above copyright
66 *    notice, this list of conditions and the following disclaimer.
67 *
68 * 2. Redistributions in binary form must reproduce the above copyright
69 *    notice, this list of conditions and the following disclaimer in
70 *    the documentation and/or other materials provided with the
71 *    distribution.
72 *
73 * 3. All advertising materials mentioning features or use of this
74 *    software must display the following acknowledgment:
75 *    "This product includes software developed by the OpenSSL Project
76 *    for use in the OpenSSL Toolkit. (http://www.openssl.org/)"
77 *
78 * 4. The names "OpenSSL Toolkit" and "OpenSSL Project" must not be used to
79 *    endorse or promote products derived from this software without
80 *    prior written permission. For written permission, please contact
81 *    openssl-core@openssl.org.
82 *
83 * 5. Products derived from this software may not be called "OpenSSL"
84 *    nor may "OpenSSL" appear in their names without prior written
85 *    permission of the OpenSSL Project.
86 *
87 * 6. Redistributions of any form whatsoever must retain the following
88 *    acknowledgment:
89 *    "This product includes software developed by the OpenSSL Project
90 *    for use in the OpenSSL Toolkit (http://www.openssl.org/)"
91 *
92 * THIS SOFTWARE IS PROVIDED BY THE OpenSSL PROJECT ``AS IS'' AND ANY
93 * EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
94 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
95 * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE OpenSSL PROJECT OR
96 * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
97 * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
98 * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
99 * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
100 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
101 * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
102 * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED
103 * OF THE POSSIBILITY OF SUCH DAMAGE.
104 * ====================================================================
105 *
106 * This product includes cryptographic software written by Eric Young
107 * (eay@cryptsoft.com).  This product includes software written by Tim
108 * Hudson (tjh@cryptsoft.com).
109 *
110 */
111/* ====================================================================
112 * Copyright 2005 Nokia. All rights reserved.
113 *
114 * The portions of the attached software ("Contribution") is developed by
115 * Nokia Corporation and is licensed pursuant to the OpenSSL open source
116 * license.
117 *
118 * The Contribution, originally written by Mika Kousa and Pasi Eronen of
119 * Nokia Corporation, consists of the "PSK" (Pre-Shared Key) ciphersuites
120 * support (see RFC 4279) to OpenSSL.
121 *
122 * No patent licenses or other rights except those expressly stated in
123 * the OpenSSL open source license shall be deemed granted or received
124 * expressly, by implication, estoppel, or otherwise.
125 *
126 * No assurances are provided by Nokia that the Contribution does not
127 * infringe the patent or other intellectual property rights of any third
128 * party or that the license provides you with all the necessary rights
129 * to make use of the Contribution.
130 *
131 * THE SOFTWARE IS PROVIDED "AS IS" WITHOUT WARRANTY OF ANY KIND. IN
132 * ADDITION TO THE DISCLAIMERS INCLUDED IN THE LICENSE, NOKIA
133 * SPECIFICALLY DISCLAIMS ANY LIABILITY FOR CLAIMS BROUGHT BY YOU OR ANY
134 * OTHER ENTITY BASED ON INFRINGEMENT OF INTELLECTUAL PROPERTY RIGHTS OR
135 * OTHERWISE.
136 */
137
138#include <assert.h>
139#include <ctype.h>
140#include <stdio.h>
141#include <stdlib.h>
142#include <string.h>
143#include <openssl/e_os2.h>
144#ifdef OPENSSL_NO_STDIO
145# define APPS_WIN16
146#endif
147
148/*
149 * With IPv6, it looks like Digital has mixed up the proper order of
150 * recursive header file inclusion, resulting in the compiler complaining
151 * that u_int isn't defined, but only if _POSIX_C_SOURCE is defined, which is
152 * needed to have fileno() declared correctly...  So let's define u_int
153 */
154#if defined(OPENSSL_SYS_VMS_DECC) && !defined(__U_INT)
155# define __U_INT
156typedef unsigned int u_int;
157#endif
158
159#define USE_SOCKETS
160#include "apps.h"
161#include <openssl/x509.h>
162#include <openssl/ssl.h>
163#include <openssl/err.h>
164#include <openssl/pem.h>
165#include <openssl/rand.h>
166#include <openssl/ocsp.h>
167#include <openssl/bn.h>
168#ifndef OPENSSL_NO_SRP
169# include <openssl/srp.h>
170#endif
171#include "s_apps.h"
172#include "timeouts.h"
173
174#if (defined(OPENSSL_SYS_VMS) && __VMS_VER < 70000000)
175/* FIONBIO used as a switch to enable ioctl, and that isn't in VMS < 7.0 */
176# undef FIONBIO
177#endif
178
179#if defined(OPENSSL_SYS_BEOS_R5)
180# include <fcntl.h>
181#endif
182
183#undef PROG
184#define PROG    s_client_main
185
186/*
187 * #define SSL_HOST_NAME "www.netscape.com"
188 */
189/*
190 * #define SSL_HOST_NAME "193.118.187.102"
191 */
192#define SSL_HOST_NAME   "localhost"
193
194/* no default cert. */
195/*
196 * #define TEST_CERT "client.pem"
197 */
198
199#undef BUFSIZZ
200#define BUFSIZZ 1024*8
201
202extern int verify_depth;
203extern int verify_error;
204extern int verify_return_error;
205extern int verify_quiet;
206
207#ifdef FIONBIO
208static int c_nbio = 0;
209#endif
210static int c_Pause = 0;
211static int c_debug = 0;
212#ifndef OPENSSL_NO_TLSEXT
213static int c_tlsextdebug = 0;
214static int c_status_req = 0;
215#endif
216static int c_msg = 0;
217static int c_showcerts = 0;
218
219static char *keymatexportlabel = NULL;
220static int keymatexportlen = 20;
221
222static void sc_usage(void);
223static void print_stuff(BIO *berr, SSL *con, int full);
224#ifndef OPENSSL_NO_TLSEXT
225static int ocsp_resp_cb(SSL *s, void *arg);
226#endif
227static BIO *bio_c_out = NULL;
228static BIO *bio_c_msg = NULL;
229static int c_quiet = 0;
230static int c_ign_eof = 0;
231static int c_brief = 0;
232
233#ifndef OPENSSL_NO_PSK
234/* Default PSK identity and key */
235static char *psk_identity = "Client_identity";
236/*
237 * char *psk_key=NULL; by default PSK is not used
238 */
239
240static unsigned int psk_client_cb(SSL *ssl, const char *hint, char *identity,
241                                  unsigned int max_identity_len,
242                                  unsigned char *psk,
243                                  unsigned int max_psk_len)
244{
245    int ret;
246    long key_len;
247    unsigned char *key;
248
249    if (c_debug)
250        BIO_printf(bio_c_out, "psk_client_cb\n");
251    if (!hint) {
252        /* no ServerKeyExchange message */
253        if (c_debug)
254            BIO_printf(bio_c_out,
255                       "NULL received PSK identity hint, continuing anyway\n");
256    } else if (c_debug)
257        BIO_printf(bio_c_out, "Received PSK identity hint '%s'\n", hint);
258
259    /*
260     * lookup PSK identity and PSK key based on the given identity hint here
261     */
262    ret = BIO_snprintf(identity, max_identity_len, "%s", psk_identity);
263    if (ret < 0 || (unsigned int)ret > max_identity_len)
264        goto out_err;
265    if (c_debug)
266        BIO_printf(bio_c_out, "created identity '%s' len=%d\n", identity,
267                   ret);
268
269    /* convert the PSK key to binary */
270    key = string_to_hex(psk_key, &key_len);
271    if (key == NULL) {
272        BIO_printf(bio_err, "Could not convert PSK key '%s' to buffer\n",
273                   psk_key);
274        return 0;
275    }
276    if ((unsigned long)key_len > (unsigned long)max_psk_len) {
277        BIO_printf(bio_err,
278                   "psk buffer of callback is too small (%d) for key (%ld)\n",
279                   max_psk_len, key_len);
280        OPENSSL_free(key);
281        return 0;
282    }
283
284    memcpy(psk, key, key_len);
285    OPENSSL_free(key);
286
287    if (c_debug)
288        BIO_printf(bio_c_out, "created PSK len=%ld\n", key_len);
289
290    return key_len;
291 out_err:
292    if (c_debug)
293        BIO_printf(bio_err, "Error in PSK client callback\n");
294    return 0;
295}
296#endif
297
298static void sc_usage(void)
299{
300    BIO_printf(bio_err, "usage: s_client args\n");
301    BIO_printf(bio_err, "\n");
302    BIO_printf(bio_err, " -host host     - use -connect instead\n");
303    BIO_printf(bio_err, " -port port     - use -connect instead\n");
304    BIO_printf(bio_err,
305               " -connect host:port - who to connect to (default is %s:%s)\n",
306               SSL_HOST_NAME, PORT_STR);
307    BIO_printf(bio_err,
308               " -verify_hostname host - check peer certificate matches \"host\"\n");
309    BIO_printf(bio_err,
310               " -verify_email email - check peer certificate matches \"email\"\n");
311    BIO_printf(bio_err,
312               " -verify_ip ipaddr - check peer certificate matches \"ipaddr\"\n");
313
314    BIO_printf(bio_err,
315               " -verify arg   - turn on peer certificate verification\n");
316    BIO_printf(bio_err,
317               " -verify_return_error - return verification errors\n");
318    BIO_printf(bio_err,
319               " -cert arg     - certificate file to use, PEM format assumed\n");
320    BIO_printf(bio_err,
321               " -certform arg - certificate format (PEM or DER) PEM default\n");
322    BIO_printf(bio_err,
323               " -key arg      - Private key file to use, in cert file if\n");
324    BIO_printf(bio_err, "                 not specified but cert file is.\n");
325    BIO_printf(bio_err,
326               " -keyform arg  - key format (PEM or DER) PEM default\n");
327    BIO_printf(bio_err,
328               " -pass arg     - private key file pass phrase source\n");
329    BIO_printf(bio_err, " -CApath arg   - PEM format directory of CA's\n");
330    BIO_printf(bio_err, " -CAfile arg   - PEM format file of CA's\n");
331    BIO_printf(bio_err,
332               " -no_alt_chains - only ever use the first certificate chain found\n");
333    BIO_printf(bio_err,
334               " -reconnect    - Drop and re-make the connection with the same Session-ID\n");
335    BIO_printf(bio_err,
336               " -pause        - sleep(1) after each read(2) and write(2) system call\n");
337    BIO_printf(bio_err,
338               " -prexit       - print session information even on connection failure\n");
339    BIO_printf(bio_err,
340               " -showcerts    - Show all certificates sent by the server\n");
341    BIO_printf(bio_err, " -debug        - extra output\n");
342#ifdef WATT32
343    BIO_printf(bio_err, " -wdebug       - WATT-32 tcp debugging\n");
344#endif
345    BIO_printf(bio_err, " -msg          - Show protocol messages\n");
346    BIO_printf(bio_err, " -nbio_test    - more ssl protocol testing\n");
347    BIO_printf(bio_err, " -state        - print the 'ssl' states\n");
348#ifdef FIONBIO
349    BIO_printf(bio_err, " -nbio         - Run with non-blocking IO\n");
350#endif
351    BIO_printf(bio_err,
352               " -crlf         - convert LF from terminal into CRLF\n");
353    BIO_printf(bio_err, " -quiet        - no s_client output\n");
354    BIO_printf(bio_err,
355               " -ign_eof      - ignore input eof (default when -quiet)\n");
356    BIO_printf(bio_err, " -no_ign_eof   - don't ignore input eof\n");
357#ifndef OPENSSL_NO_PSK
358    BIO_printf(bio_err, " -psk_identity arg - PSK identity\n");
359    BIO_printf(bio_err, " -psk arg      - PSK in hex (without 0x)\n");
360# ifndef OPENSSL_NO_JPAKE
361    BIO_printf(bio_err, " -jpake arg    - JPAKE secret to use\n");
362# endif
363#endif
364#ifndef OPENSSL_NO_SRP
365    BIO_printf(bio_err,
366               " -srpuser user     - SRP authentification for 'user'\n");
367    BIO_printf(bio_err, " -srppass arg      - password for 'user'\n");
368    BIO_printf(bio_err,
369               " -srp_lateuser     - SRP username into second ClientHello message\n");
370    BIO_printf(bio_err,
371               " -srp_moregroups   - Tolerate other than the known g N values.\n");
372    BIO_printf(bio_err,
373               " -srp_strength int - minimal length in bits for N (default %d).\n",
374               SRP_MINIMAL_N);
375#endif
376    BIO_printf(bio_err, " -ssl2         - just use SSLv2\n");
377#ifndef OPENSSL_NO_SSL3_METHOD
378    BIO_printf(bio_err, " -ssl3         - just use SSLv3\n");
379#endif
380    BIO_printf(bio_err, " -tls1_2       - just use TLSv1.2\n");
381    BIO_printf(bio_err, " -tls1_1       - just use TLSv1.1\n");
382    BIO_printf(bio_err, " -tls1         - just use TLSv1\n");
383    BIO_printf(bio_err, " -dtls1        - just use DTLSv1\n");
384    BIO_printf(bio_err, " -fallback_scsv - send TLS_FALLBACK_SCSV\n");
385    BIO_printf(bio_err, " -mtu          - set the link layer MTU\n");
386    BIO_printf(bio_err,
387               " -no_tls1_2/-no_tls1_1/-no_tls1/-no_ssl3/-no_ssl2 - turn off that protocol\n");
388    BIO_printf(bio_err,
389               " -bugs         - Switch on all SSL implementation bug workarounds\n");
390    BIO_printf(bio_err,
391               " -cipher       - preferred cipher to use, use the 'openssl ciphers'\n");
392    BIO_printf(bio_err,
393               "                 command to see what is available\n");
394    BIO_printf(bio_err,
395               " -starttls prot - use the STARTTLS command before starting TLS\n");
396    BIO_printf(bio_err,
397               "                 for those protocols that support it, where\n");
398    BIO_printf(bio_err,
399               "                 'prot' defines which one to assume.  Currently,\n");
400    BIO_printf(bio_err,
401               "                 only \"smtp\", \"pop3\", \"imap\", \"ftp\" and \"xmpp\"\n");
402    BIO_printf(bio_err, "                 are supported.\n");
403#ifndef OPENSSL_NO_ENGINE
404    BIO_printf(bio_err,
405               " -engine id    - Initialise and use the specified engine\n");
406#endif
407    BIO_printf(bio_err, " -rand file%cfile%c...\n", LIST_SEPARATOR_CHAR,
408               LIST_SEPARATOR_CHAR);
409    BIO_printf(bio_err, " -sess_out arg - file to write SSL session to\n");
410    BIO_printf(bio_err, " -sess_in arg  - file to read SSL session from\n");
411#ifndef OPENSSL_NO_TLSEXT
412    BIO_printf(bio_err,
413               " -servername host  - Set TLS extension servername in ClientHello\n");
414    BIO_printf(bio_err,
415               " -tlsextdebug      - hex dump of all TLS extensions received\n");
416    BIO_printf(bio_err,
417               " -status           - request certificate status from server\n");
418    BIO_printf(bio_err,
419               " -no_ticket        - disable use of RFC4507bis session tickets\n");
420    BIO_printf(bio_err,
421               " -serverinfo types - send empty ClientHello extensions (comma-separated numbers)\n");
422    BIO_printf(bio_err,
423               " -curves arg       - Elliptic curves to advertise (colon-separated list)\n");
424    BIO_printf(bio_err,
425               " -sigalgs arg      - Signature algorithms to support (colon-separated list)\n");
426    BIO_printf(bio_err,
427               " -client_sigalgs arg - Signature algorithms to support for client\n");
428    BIO_printf(bio_err,
429               "                       certificate authentication (colon-separated list)\n");
430#endif
431#ifndef OPENSSL_NO_NEXTPROTONEG
432    BIO_printf(bio_err,
433               " -nextprotoneg arg - enable NPN extension, considering named protocols supported (comma-separated list)\n");
434#endif
435    BIO_printf(bio_err,
436               " -alpn arg         - enable ALPN extension, considering named protocols supported (comma-separated list)\n");
437    BIO_printf(bio_err,
438               " -legacy_renegotiation - enable use of legacy renegotiation (dangerous)\n");
439#ifndef OPENSSL_NO_SRTP
440    BIO_printf(bio_err,
441               " -use_srtp profiles - Offer SRTP key management with a colon-separated profile list\n");
442#endif
443    BIO_printf(bio_err,
444               " -keymatexport label   - Export keying material using label\n");
445    BIO_printf(bio_err,
446               " -keymatexportlen len  - Export len bytes of keying material (default 20)\n");
447}
448
449#ifndef OPENSSL_NO_TLSEXT
450
451/* This is a context that we pass to callbacks */
452typedef struct tlsextctx_st {
453    BIO *biodebug;
454    int ack;
455} tlsextctx;
456
457static int MS_CALLBACK ssl_servername_cb(SSL *s, int *ad, void *arg)
458{
459    tlsextctx *p = (tlsextctx *) arg;
460    const char *hn = SSL_get_servername(s, TLSEXT_NAMETYPE_host_name);
461    if (SSL_get_servername_type(s) != -1)
462        p->ack = !SSL_session_reused(s) && hn != NULL;
463    else
464        BIO_printf(bio_err, "Can't use SSL_get_servername\n");
465
466    return SSL_TLSEXT_ERR_OK;
467}
468
469# ifndef OPENSSL_NO_SRP
470
471/* This is a context that we pass to all callbacks */
472typedef struct srp_arg_st {
473    char *srppassin;
474    char *srplogin;
475    int msg;                    /* copy from c_msg */
476    int debug;                  /* copy from c_debug */
477    int amp;                    /* allow more groups */
478    int strength /* minimal size for N */ ;
479} SRP_ARG;
480
481#  define SRP_NUMBER_ITERATIONS_FOR_PRIME 64
482
483static int srp_Verify_N_and_g(BIGNUM *N, BIGNUM *g)
484{
485    BN_CTX *bn_ctx = BN_CTX_new();
486    BIGNUM *p = BN_new();
487    BIGNUM *r = BN_new();
488    int ret =
489        g != NULL && N != NULL && bn_ctx != NULL && BN_is_odd(N) &&
490        BN_is_prime_ex(N, SRP_NUMBER_ITERATIONS_FOR_PRIME, bn_ctx, NULL) &&
491        p != NULL && BN_rshift1(p, N) &&
492        /* p = (N-1)/2 */
493        BN_is_prime_ex(p, SRP_NUMBER_ITERATIONS_FOR_PRIME, bn_ctx, NULL) &&
494        r != NULL &&
495        /* verify g^((N-1)/2) == -1 (mod N) */
496        BN_mod_exp(r, g, p, N, bn_ctx) &&
497        BN_add_word(r, 1) && BN_cmp(r, N) == 0;
498
499    if (r)
500        BN_free(r);
501    if (p)
502        BN_free(p);
503    if (bn_ctx)
504        BN_CTX_free(bn_ctx);
505    return ret;
506}
507
508/*-
509 * This callback is used here for two purposes:
510 * - extended debugging
511 * - making some primality tests for unknown groups
512 * The callback is only called for a non default group.
513 *
514 * An application does not need the call back at all if
515 * only the stanard groups are used.  In real life situations,
516 * client and server already share well known groups,
517 * thus there is no need to verify them.
518 * Furthermore, in case that a server actually proposes a group that
519 * is not one of those defined in RFC 5054, it is more appropriate
520 * to add the group to a static list and then compare since
521 * primality tests are rather cpu consuming.
522 */
523
524static int MS_CALLBACK ssl_srp_verify_param_cb(SSL *s, void *arg)
525{
526    SRP_ARG *srp_arg = (SRP_ARG *)arg;
527    BIGNUM *N = NULL, *g = NULL;
528    if (!(N = SSL_get_srp_N(s)) || !(g = SSL_get_srp_g(s)))
529        return 0;
530    if (srp_arg->debug || srp_arg->msg || srp_arg->amp == 1) {
531        BIO_printf(bio_err, "SRP parameters:\n");
532        BIO_printf(bio_err, "\tN=");
533        BN_print(bio_err, N);
534        BIO_printf(bio_err, "\n\tg=");
535        BN_print(bio_err, g);
536        BIO_printf(bio_err, "\n");
537    }
538
539    if (SRP_check_known_gN_param(g, N))
540        return 1;
541
542    if (srp_arg->amp == 1) {
543        if (srp_arg->debug)
544            BIO_printf(bio_err,
545                       "SRP param N and g are not known params, going to check deeper.\n");
546
547        /*
548         * The srp_moregroups is a real debugging feature. Implementors
549         * should rather add the value to the known ones. The minimal size
550         * has already been tested.
551         */
552        if (BN_num_bits(g) <= BN_BITS && srp_Verify_N_and_g(N, g))
553            return 1;
554    }
555    BIO_printf(bio_err, "SRP param N and g rejected.\n");
556    return 0;
557}
558
559#  define PWD_STRLEN 1024
560
561static char *MS_CALLBACK ssl_give_srp_client_pwd_cb(SSL *s, void *arg)
562{
563    SRP_ARG *srp_arg = (SRP_ARG *)arg;
564    char *pass = (char *)OPENSSL_malloc(PWD_STRLEN + 1);
565    PW_CB_DATA cb_tmp;
566    int l;
567
568    if (!pass) {
569        BIO_printf(bio_err, "Malloc failure\n");
570        return NULL;
571    }
572
573    cb_tmp.password = (char *)srp_arg->srppassin;
574    cb_tmp.prompt_info = "SRP user";
575    if ((l = password_callback(pass, PWD_STRLEN, 0, &cb_tmp)) < 0) {
576        BIO_printf(bio_err, "Can't read Password\n");
577        OPENSSL_free(pass);
578        return NULL;
579    }
580    *(pass + l) = '\0';
581
582    return pass;
583}
584
585# endif
586# ifndef OPENSSL_NO_SRTP
587char *srtp_profiles = NULL;
588# endif
589
590# ifndef OPENSSL_NO_NEXTPROTONEG
591/* This the context that we pass to next_proto_cb */
592typedef struct tlsextnextprotoctx_st {
593    unsigned char *data;
594    unsigned short len;
595    int status;
596} tlsextnextprotoctx;
597
598static tlsextnextprotoctx next_proto;
599
600static int next_proto_cb(SSL *s, unsigned char **out, unsigned char *outlen,
601                         const unsigned char *in, unsigned int inlen,
602                         void *arg)
603{
604    tlsextnextprotoctx *ctx = arg;
605
606    if (!c_quiet) {
607        /* We can assume that |in| is syntactically valid. */
608        unsigned i;
609        BIO_printf(bio_c_out, "Protocols advertised by server: ");
610        for (i = 0; i < inlen;) {
611            if (i)
612                BIO_write(bio_c_out, ", ", 2);
613            BIO_write(bio_c_out, &in[i + 1], in[i]);
614            i += in[i] + 1;
615        }
616        BIO_write(bio_c_out, "\n", 1);
617    }
618
619    ctx->status =
620        SSL_select_next_proto(out, outlen, in, inlen, ctx->data, ctx->len);
621    return SSL_TLSEXT_ERR_OK;
622}
623# endif                         /* ndef OPENSSL_NO_NEXTPROTONEG */
624
625static int serverinfo_cli_parse_cb(SSL *s, unsigned int ext_type,
626                                   const unsigned char *in, size_t inlen,
627                                   int *al, void *arg)
628{
629    char pem_name[100];
630    unsigned char ext_buf[4 + 65536];
631
632    /* Reconstruct the type/len fields prior to extension data */
633    inlen &= 0xffff; /* for formal memcpy correctness */
634    ext_buf[0] = (unsigned char)(ext_type >> 8);
635    ext_buf[1] = (unsigned char)(ext_type);
636    ext_buf[2] = (unsigned char)(inlen >> 8);
637    ext_buf[3] = (unsigned char)(inlen);
638    memcpy(ext_buf + 4, in, inlen);
639
640    BIO_snprintf(pem_name, sizeof(pem_name), "SERVERINFO FOR EXTENSION %d",
641                 ext_type);
642    PEM_write_bio(bio_c_out, pem_name, "", ext_buf, 4 + inlen);
643    return 1;
644}
645
646#endif
647
648enum {
649    PROTO_OFF = 0,
650    PROTO_SMTP,
651    PROTO_POP3,
652    PROTO_IMAP,
653    PROTO_FTP,
654    PROTO_XMPP
655};
656
657int MAIN(int, char **);
658
659int MAIN(int argc, char **argv)
660{
661    int build_chain = 0;
662    SSL *con = NULL;
663#ifndef OPENSSL_NO_KRB5
664    KSSL_CTX *kctx;
665#endif
666    int s, k, width, state = 0;
667    char *cbuf = NULL, *sbuf = NULL, *mbuf = NULL;
668    int cbuf_len, cbuf_off;
669    int sbuf_len, sbuf_off;
670    fd_set readfds, writefds;
671    short port = PORT;
672    int full_log = 1;
673    char *host = SSL_HOST_NAME;
674    char *cert_file = NULL, *key_file = NULL, *chain_file = NULL;
675    int cert_format = FORMAT_PEM, key_format = FORMAT_PEM;
676    char *passarg = NULL, *pass = NULL;
677    X509 *cert = NULL;
678    EVP_PKEY *key = NULL;
679    STACK_OF(X509) *chain = NULL;
680    char *CApath = NULL, *CAfile = NULL;
681    char *chCApath = NULL, *chCAfile = NULL;
682    char *vfyCApath = NULL, *vfyCAfile = NULL;
683    int reconnect = 0, badop = 0, verify = SSL_VERIFY_NONE;
684    int crlf = 0;
685    int write_tty, read_tty, write_ssl, read_ssl, tty_on, ssl_pending;
686    SSL_CTX *ctx = NULL;
687    int ret = 1, in_init = 1, i, nbio_test = 0;
688    int starttls_proto = PROTO_OFF;
689    int prexit = 0;
690    X509_VERIFY_PARAM *vpm = NULL;
691    int badarg = 0;
692    const SSL_METHOD *meth = NULL;
693    int socket_type = SOCK_STREAM;
694    BIO *sbio;
695    char *inrand = NULL;
696    int mbuf_len = 0;
697    struct timeval timeout, *timeoutp;
698    char *engine_id = NULL;
699    ENGINE *e = NULL;
700#ifndef OPENSSL_NO_ENGINE
701    char *ssl_client_engine_id = NULL;
702    ENGINE *ssl_client_engine = NULL;
703#endif
704#if defined(OPENSSL_SYS_WINDOWS) || defined(OPENSSL_SYS_MSDOS) || defined(OPENSSL_SYS_NETWARE) || defined(OPENSSL_SYS_BEOS_R5)
705    struct timeval tv;
706# if defined(OPENSSL_SYS_BEOS_R5)
707    int stdin_set = 0;
708# endif
709#endif
710#ifndef OPENSSL_NO_TLSEXT
711    char *servername = NULL;
712    tlsextctx tlsextcbp = { NULL, 0 };
713# ifndef OPENSSL_NO_NEXTPROTONEG
714    const char *next_proto_neg_in = NULL;
715# endif
716    const char *alpn_in = NULL;
717# define MAX_SI_TYPES 100
718    unsigned short serverinfo_types[MAX_SI_TYPES];
719    int serverinfo_types_count = 0;
720#endif
721    char *sess_in = NULL;
722    char *sess_out = NULL;
723    struct sockaddr peer;
724    int peerlen = sizeof(peer);
725    int fallback_scsv = 0;
726    int enable_timeouts = 0;
727    long socket_mtu = 0;
728#ifndef OPENSSL_NO_JPAKE
729    static char *jpake_secret = NULL;
730# define no_jpake !jpake_secret
731#else
732# define no_jpake 1
733#endif
734#ifndef OPENSSL_NO_SRP
735    char *srppass = NULL;
736    int srp_lateuser = 0;
737    SRP_ARG srp_arg = { NULL, NULL, 0, 0, 0, 1024 };
738#endif
739    SSL_EXCERT *exc = NULL;
740
741    SSL_CONF_CTX *cctx = NULL;
742    STACK_OF(OPENSSL_STRING) *ssl_args = NULL;
743
744    char *crl_file = NULL;
745    int crl_format = FORMAT_PEM;
746    int crl_download = 0;
747    STACK_OF(X509_CRL) *crls = NULL;
748    int prot_opt = 0, no_prot_opt = 0;
749
750    meth = SSLv23_client_method();
751
752    apps_startup();
753    c_Pause = 0;
754    c_quiet = 0;
755    c_ign_eof = 0;
756    c_debug = 0;
757    c_msg = 0;
758    c_showcerts = 0;
759
760    if (bio_err == NULL)
761        bio_err = BIO_new_fp(stderr, BIO_NOCLOSE);
762
763    if (!load_config(bio_err, NULL))
764        goto end;
765
766    cctx = SSL_CONF_CTX_new();
767    if (!cctx)
768        goto end;
769    SSL_CONF_CTX_set_flags(cctx, SSL_CONF_FLAG_CLIENT);
770    SSL_CONF_CTX_set_flags(cctx, SSL_CONF_FLAG_CMDLINE);
771
772    if (((cbuf = OPENSSL_malloc(BUFSIZZ)) == NULL) ||
773        ((sbuf = OPENSSL_malloc(BUFSIZZ)) == NULL) ||
774        ((mbuf = OPENSSL_malloc(BUFSIZZ)) == NULL)) {
775        BIO_printf(bio_err, "out of memory\n");
776        goto end;
777    }
778
779    verify_depth = 0;
780    verify_error = X509_V_OK;
781#ifdef FIONBIO
782    c_nbio = 0;
783#endif
784
785    argc--;
786    argv++;
787    while (argc >= 1) {
788        if (strcmp(*argv, "-host") == 0) {
789            if (--argc < 1)
790                goto bad;
791            host = *(++argv);
792        } else if (strcmp(*argv, "-port") == 0) {
793            if (--argc < 1)
794                goto bad;
795            port = atoi(*(++argv));
796            if (port == 0)
797                goto bad;
798        } else if (strcmp(*argv, "-connect") == 0) {
799            if (--argc < 1)
800                goto bad;
801            if (!extract_host_port(*(++argv), &host, NULL, &port))
802                goto bad;
803        } else if (strcmp(*argv, "-verify") == 0) {
804            verify = SSL_VERIFY_PEER;
805            if (--argc < 1)
806                goto bad;
807            verify_depth = atoi(*(++argv));
808            if (!c_quiet)
809                BIO_printf(bio_err, "verify depth is %d\n", verify_depth);
810        } else if (strcmp(*argv, "-cert") == 0) {
811            if (--argc < 1)
812                goto bad;
813            cert_file = *(++argv);
814        } else if (strcmp(*argv, "-CRL") == 0) {
815            if (--argc < 1)
816                goto bad;
817            crl_file = *(++argv);
818        } else if (strcmp(*argv, "-crl_download") == 0)
819            crl_download = 1;
820        else if (strcmp(*argv, "-sess_out") == 0) {
821            if (--argc < 1)
822                goto bad;
823            sess_out = *(++argv);
824        } else if (strcmp(*argv, "-sess_in") == 0) {
825            if (--argc < 1)
826                goto bad;
827            sess_in = *(++argv);
828        } else if (strcmp(*argv, "-certform") == 0) {
829            if (--argc < 1)
830                goto bad;
831            cert_format = str2fmt(*(++argv));
832        } else if (strcmp(*argv, "-CRLform") == 0) {
833            if (--argc < 1)
834                goto bad;
835            crl_format = str2fmt(*(++argv));
836        } else if (args_verify(&argv, &argc, &badarg, bio_err, &vpm)) {
837            if (badarg)
838                goto bad;
839            continue;
840        } else if (strcmp(*argv, "-verify_return_error") == 0)
841            verify_return_error = 1;
842        else if (strcmp(*argv, "-verify_quiet") == 0)
843            verify_quiet = 1;
844        else if (strcmp(*argv, "-brief") == 0) {
845            c_brief = 1;
846            verify_quiet = 1;
847            c_quiet = 1;
848        } else if (args_excert(&argv, &argc, &badarg, bio_err, &exc)) {
849            if (badarg)
850                goto bad;
851            continue;
852        } else if (args_ssl(&argv, &argc, cctx, &badarg, bio_err, &ssl_args,
853                            &no_prot_opt)) {
854            if (badarg)
855                goto bad;
856            continue;
857        } else if (strcmp(*argv, "-prexit") == 0)
858            prexit = 1;
859        else if (strcmp(*argv, "-crlf") == 0)
860            crlf = 1;
861        else if (strcmp(*argv, "-quiet") == 0) {
862            c_quiet = 1;
863            c_ign_eof = 1;
864        } else if (strcmp(*argv, "-ign_eof") == 0)
865            c_ign_eof = 1;
866        else if (strcmp(*argv, "-no_ign_eof") == 0)
867            c_ign_eof = 0;
868        else if (strcmp(*argv, "-pause") == 0)
869            c_Pause = 1;
870        else if (strcmp(*argv, "-debug") == 0)
871            c_debug = 1;
872#ifndef OPENSSL_NO_TLSEXT
873        else if (strcmp(*argv, "-tlsextdebug") == 0)
874            c_tlsextdebug = 1;
875        else if (strcmp(*argv, "-status") == 0)
876            c_status_req = 1;
877#endif
878#ifdef WATT32
879        else if (strcmp(*argv, "-wdebug") == 0)
880            dbug_init();
881#endif
882        else if (strcmp(*argv, "-msg") == 0)
883            c_msg = 1;
884        else if (strcmp(*argv, "-msgfile") == 0) {
885            if (--argc < 1)
886                goto bad;
887            bio_c_msg = BIO_new_file(*(++argv), "w");
888        }
889#ifndef OPENSSL_NO_SSL_TRACE
890        else if (strcmp(*argv, "-trace") == 0)
891            c_msg = 2;
892#endif
893        else if (strcmp(*argv, "-showcerts") == 0)
894            c_showcerts = 1;
895        else if (strcmp(*argv, "-nbio_test") == 0)
896            nbio_test = 1;
897        else if (strcmp(*argv, "-state") == 0)
898            state = 1;
899#ifndef OPENSSL_NO_PSK
900        else if (strcmp(*argv, "-psk_identity") == 0) {
901            if (--argc < 1)
902                goto bad;
903            psk_identity = *(++argv);
904        } else if (strcmp(*argv, "-psk") == 0) {
905            size_t j;
906
907            if (--argc < 1)
908                goto bad;
909            psk_key = *(++argv);
910            for (j = 0; j < strlen(psk_key); j++) {
911                if (isxdigit((unsigned char)psk_key[j]))
912                    continue;
913                BIO_printf(bio_err, "Not a hex number '%s'\n", *argv);
914                goto bad;
915            }
916        }
917#endif
918#ifndef OPENSSL_NO_SRP
919        else if (strcmp(*argv, "-srpuser") == 0) {
920            if (--argc < 1)
921                goto bad;
922            srp_arg.srplogin = *(++argv);
923            meth = TLSv1_client_method();
924        } else if (strcmp(*argv, "-srppass") == 0) {
925            if (--argc < 1)
926                goto bad;
927            srppass = *(++argv);
928            meth = TLSv1_client_method();
929        } else if (strcmp(*argv, "-srp_strength") == 0) {
930            if (--argc < 1)
931                goto bad;
932            srp_arg.strength = atoi(*(++argv));
933            BIO_printf(bio_err, "SRP minimal length for N is %d\n",
934                       srp_arg.strength);
935            meth = TLSv1_client_method();
936        } else if (strcmp(*argv, "-srp_lateuser") == 0) {
937            srp_lateuser = 1;
938            meth = TLSv1_client_method();
939        } else if (strcmp(*argv, "-srp_moregroups") == 0) {
940            srp_arg.amp = 1;
941            meth = TLSv1_client_method();
942        }
943#endif
944#ifndef OPENSSL_NO_SSL2
945        else if (strcmp(*argv, "-ssl2") == 0) {
946            meth = SSLv2_client_method();
947            prot_opt++;
948        }
949#endif
950#ifndef OPENSSL_NO_SSL3_METHOD
951        else if (strcmp(*argv, "-ssl3") == 0) {
952            meth = SSLv3_client_method();
953            prot_opt++;
954        }
955#endif
956#ifndef OPENSSL_NO_TLS1
957        else if (strcmp(*argv, "-tls1_2") == 0) {
958            meth = TLSv1_2_client_method();
959            prot_opt++;
960        } else if (strcmp(*argv, "-tls1_1") == 0) {
961            meth = TLSv1_1_client_method();
962            prot_opt++;
963        } else if (strcmp(*argv, "-tls1") == 0) {
964            meth = TLSv1_client_method();
965            prot_opt++;
966        }
967#endif
968#ifndef OPENSSL_NO_DTLS1
969        else if (strcmp(*argv, "-dtls") == 0) {
970            meth = DTLS_client_method();
971            socket_type = SOCK_DGRAM;
972            prot_opt++;
973        } else if (strcmp(*argv, "-dtls1") == 0) {
974            meth = DTLSv1_client_method();
975            socket_type = SOCK_DGRAM;
976            prot_opt++;
977        } else if (strcmp(*argv, "-dtls1_2") == 0) {
978            meth = DTLSv1_2_client_method();
979            socket_type = SOCK_DGRAM;
980            prot_opt++;
981        } else if (strcmp(*argv, "-timeout") == 0)
982            enable_timeouts = 1;
983        else if (strcmp(*argv, "-mtu") == 0) {
984            if (--argc < 1)
985                goto bad;
986            socket_mtu = atol(*(++argv));
987        }
988#endif
989        else if (strcmp(*argv, "-fallback_scsv") == 0) {
990            fallback_scsv = 1;
991        } else if (strcmp(*argv, "-keyform") == 0) {
992            if (--argc < 1)
993                goto bad;
994            key_format = str2fmt(*(++argv));
995        } else if (strcmp(*argv, "-pass") == 0) {
996            if (--argc < 1)
997                goto bad;
998            passarg = *(++argv);
999        } else if (strcmp(*argv, "-cert_chain") == 0) {
1000            if (--argc < 1)
1001                goto bad;
1002            chain_file = *(++argv);
1003        } else if (strcmp(*argv, "-key") == 0) {
1004            if (--argc < 1)
1005                goto bad;
1006            key_file = *(++argv);
1007        } else if (strcmp(*argv, "-reconnect") == 0) {
1008            reconnect = 5;
1009        } else if (strcmp(*argv, "-CApath") == 0) {
1010            if (--argc < 1)
1011                goto bad;
1012            CApath = *(++argv);
1013        } else if (strcmp(*argv, "-chainCApath") == 0) {
1014            if (--argc < 1)
1015                goto bad;
1016            chCApath = *(++argv);
1017        } else if (strcmp(*argv, "-verifyCApath") == 0) {
1018            if (--argc < 1)
1019                goto bad;
1020            vfyCApath = *(++argv);
1021        } else if (strcmp(*argv, "-build_chain") == 0)
1022            build_chain = 1;
1023        else if (strcmp(*argv, "-CAfile") == 0) {
1024            if (--argc < 1)
1025                goto bad;
1026            CAfile = *(++argv);
1027        } else if (strcmp(*argv, "-chainCAfile") == 0) {
1028            if (--argc < 1)
1029                goto bad;
1030            chCAfile = *(++argv);
1031        } else if (strcmp(*argv, "-verifyCAfile") == 0) {
1032            if (--argc < 1)
1033                goto bad;
1034            vfyCAfile = *(++argv);
1035        }
1036#ifndef OPENSSL_NO_TLSEXT
1037# ifndef OPENSSL_NO_NEXTPROTONEG
1038        else if (strcmp(*argv, "-nextprotoneg") == 0) {
1039            if (--argc < 1)
1040                goto bad;
1041            next_proto_neg_in = *(++argv);
1042        }
1043# endif
1044        else if (strcmp(*argv, "-alpn") == 0) {
1045            if (--argc < 1)
1046                goto bad;
1047            alpn_in = *(++argv);
1048        } else if (strcmp(*argv, "-serverinfo") == 0) {
1049            char *c;
1050            int start = 0;
1051            int len;
1052
1053            if (--argc < 1)
1054                goto bad;
1055            c = *(++argv);
1056            serverinfo_types_count = 0;
1057            len = strlen(c);
1058            for (i = 0; i <= len; ++i) {
1059                if (i == len || c[i] == ',') {
1060                    serverinfo_types[serverinfo_types_count]
1061                        = atoi(c + start);
1062                    serverinfo_types_count++;
1063                    start = i + 1;
1064                }
1065                if (serverinfo_types_count == MAX_SI_TYPES)
1066                    break;
1067            }
1068        }
1069#endif
1070#ifdef FIONBIO
1071        else if (strcmp(*argv, "-nbio") == 0) {
1072            c_nbio = 1;
1073        }
1074#endif
1075        else if (strcmp(*argv, "-starttls") == 0) {
1076            if (--argc < 1)
1077                goto bad;
1078            ++argv;
1079            if (strcmp(*argv, "smtp") == 0)
1080                starttls_proto = PROTO_SMTP;
1081            else if (strcmp(*argv, "pop3") == 0)
1082                starttls_proto = PROTO_POP3;
1083            else if (strcmp(*argv, "imap") == 0)
1084                starttls_proto = PROTO_IMAP;
1085            else if (strcmp(*argv, "ftp") == 0)
1086                starttls_proto = PROTO_FTP;
1087            else if (strcmp(*argv, "xmpp") == 0)
1088                starttls_proto = PROTO_XMPP;
1089            else
1090                goto bad;
1091        }
1092#ifndef OPENSSL_NO_ENGINE
1093        else if (strcmp(*argv, "-engine") == 0) {
1094            if (--argc < 1)
1095                goto bad;
1096            engine_id = *(++argv);
1097        } else if (strcmp(*argv, "-ssl_client_engine") == 0) {
1098            if (--argc < 1)
1099                goto bad;
1100            ssl_client_engine_id = *(++argv);
1101        }
1102#endif
1103        else if (strcmp(*argv, "-rand") == 0) {
1104            if (--argc < 1)
1105                goto bad;
1106            inrand = *(++argv);
1107        }
1108#ifndef OPENSSL_NO_TLSEXT
1109        else if (strcmp(*argv, "-servername") == 0) {
1110            if (--argc < 1)
1111                goto bad;
1112            servername = *(++argv);
1113            /* meth=TLSv1_client_method(); */
1114        }
1115#endif
1116#ifndef OPENSSL_NO_JPAKE
1117        else if (strcmp(*argv, "-jpake") == 0) {
1118            if (--argc < 1)
1119                goto bad;
1120            jpake_secret = *++argv;
1121        }
1122#endif
1123#ifndef OPENSSL_NO_SRTP
1124        else if (strcmp(*argv, "-use_srtp") == 0) {
1125            if (--argc < 1)
1126                goto bad;
1127            srtp_profiles = *(++argv);
1128        }
1129#endif
1130        else if (strcmp(*argv, "-keymatexport") == 0) {
1131            if (--argc < 1)
1132                goto bad;
1133            keymatexportlabel = *(++argv);
1134        } else if (strcmp(*argv, "-keymatexportlen") == 0) {
1135            if (--argc < 1)
1136                goto bad;
1137            keymatexportlen = atoi(*(++argv));
1138            if (keymatexportlen == 0)
1139                goto bad;
1140        } else {
1141            BIO_printf(bio_err, "unknown option %s\n", *argv);
1142            badop = 1;
1143            break;
1144        }
1145        argc--;
1146        argv++;
1147    }
1148    if (badop) {
1149 bad:
1150        sc_usage();
1151        goto end;
1152    }
1153#if !defined(OPENSSL_NO_JPAKE) && !defined(OPENSSL_NO_PSK)
1154    if (jpake_secret) {
1155        if (psk_key) {
1156            BIO_printf(bio_err, "Can't use JPAKE and PSK together\n");
1157            goto end;
1158        }
1159        psk_identity = "JPAKE";
1160    }
1161#endif
1162
1163    if (prot_opt > 1) {
1164        BIO_printf(bio_err, "Cannot supply multiple protocol flags\n");
1165        goto end;
1166    }
1167
1168    if (prot_opt == 1 && no_prot_opt) {
1169        BIO_printf(bio_err, "Cannot supply both a protocol flag and "
1170                            "\"-no_<prot>\"\n");
1171        goto end;
1172    }
1173
1174    OpenSSL_add_ssl_algorithms();
1175    SSL_load_error_strings();
1176
1177#if !defined(OPENSSL_NO_TLSEXT) && !defined(OPENSSL_NO_NEXTPROTONEG)
1178    next_proto.status = -1;
1179    if (next_proto_neg_in) {
1180        next_proto.data =
1181            next_protos_parse(&next_proto.len, next_proto_neg_in);
1182        if (next_proto.data == NULL) {
1183            BIO_printf(bio_err, "Error parsing -nextprotoneg argument\n");
1184            goto end;
1185        }
1186    } else
1187        next_proto.data = NULL;
1188#endif
1189
1190    e = setup_engine(bio_err, engine_id, 1);
1191#ifndef OPENSSL_NO_ENGINE
1192    if (ssl_client_engine_id) {
1193        ssl_client_engine = ENGINE_by_id(ssl_client_engine_id);
1194        if (!ssl_client_engine) {
1195            BIO_printf(bio_err, "Error getting client auth engine\n");
1196            goto end;
1197        }
1198    }
1199#endif
1200    if (!app_passwd(bio_err, passarg, NULL, &pass, NULL)) {
1201        BIO_printf(bio_err, "Error getting password\n");
1202        goto end;
1203    }
1204
1205    if (key_file == NULL)
1206        key_file = cert_file;
1207
1208    if (key_file) {
1209
1210        key = load_key(bio_err, key_file, key_format, 0, pass, e,
1211                       "client certificate private key file");
1212        if (!key) {
1213            ERR_print_errors(bio_err);
1214            goto end;
1215        }
1216
1217    }
1218
1219    if (cert_file) {
1220        cert = load_cert(bio_err, cert_file, cert_format,
1221                         NULL, e, "client certificate file");
1222
1223        if (!cert) {
1224            ERR_print_errors(bio_err);
1225            goto end;
1226        }
1227    }
1228
1229    if (chain_file) {
1230        chain = load_certs(bio_err, chain_file, FORMAT_PEM,
1231                           NULL, e, "client certificate chain");
1232        if (!chain)
1233            goto end;
1234    }
1235
1236    if (crl_file) {
1237        X509_CRL *crl;
1238        crl = load_crl(crl_file, crl_format);
1239        if (!crl) {
1240            BIO_puts(bio_err, "Error loading CRL\n");
1241            ERR_print_errors(bio_err);
1242            goto end;
1243        }
1244        crls = sk_X509_CRL_new_null();
1245        if (!crls || !sk_X509_CRL_push(crls, crl)) {
1246            BIO_puts(bio_err, "Error adding CRL\n");
1247            ERR_print_errors(bio_err);
1248            X509_CRL_free(crl);
1249            goto end;
1250        }
1251    }
1252
1253    if (!load_excert(&exc, bio_err))
1254        goto end;
1255
1256    if (!app_RAND_load_file(NULL, bio_err, 1) && inrand == NULL
1257        && !RAND_status()) {
1258        BIO_printf(bio_err,
1259                   "warning, not much extra random data, consider using the -rand option\n");
1260    }
1261    if (inrand != NULL)
1262        BIO_printf(bio_err, "%ld semi-random bytes loaded\n",
1263                   app_RAND_load_files(inrand));
1264
1265    if (bio_c_out == NULL) {
1266        if (c_quiet && !c_debug) {
1267            bio_c_out = BIO_new(BIO_s_null());
1268            if (c_msg && !bio_c_msg)
1269                bio_c_msg = BIO_new_fp(stdout, BIO_NOCLOSE);
1270        } else {
1271            if (bio_c_out == NULL)
1272                bio_c_out = BIO_new_fp(stdout, BIO_NOCLOSE);
1273        }
1274    }
1275#ifndef OPENSSL_NO_SRP
1276    if (!app_passwd(bio_err, srppass, NULL, &srp_arg.srppassin, NULL)) {
1277        BIO_printf(bio_err, "Error getting password\n");
1278        goto end;
1279    }
1280#endif
1281
1282    ctx = SSL_CTX_new(meth);
1283    if (ctx == NULL) {
1284        ERR_print_errors(bio_err);
1285        goto end;
1286    }
1287
1288    if (vpm)
1289        SSL_CTX_set1_param(ctx, vpm);
1290
1291    if (!args_ssl_call(ctx, bio_err, cctx, ssl_args, 1, no_jpake)) {
1292        ERR_print_errors(bio_err);
1293        goto end;
1294    }
1295
1296    if (!ssl_load_stores(ctx, vfyCApath, vfyCAfile, chCApath, chCAfile,
1297                         crls, crl_download)) {
1298        BIO_printf(bio_err, "Error loading store locations\n");
1299        ERR_print_errors(bio_err);
1300        goto end;
1301    }
1302#ifndef OPENSSL_NO_ENGINE
1303    if (ssl_client_engine) {
1304        if (!SSL_CTX_set_client_cert_engine(ctx, ssl_client_engine)) {
1305            BIO_puts(bio_err, "Error setting client auth engine\n");
1306            ERR_print_errors(bio_err);
1307            ENGINE_free(ssl_client_engine);
1308            goto end;
1309        }
1310        ENGINE_free(ssl_client_engine);
1311    }
1312#endif
1313
1314#ifndef OPENSSL_NO_PSK
1315# ifdef OPENSSL_NO_JPAKE
1316    if (psk_key != NULL)
1317# else
1318    if (psk_key != NULL || jpake_secret)
1319# endif
1320    {
1321        if (c_debug)
1322            BIO_printf(bio_c_out,
1323                       "PSK key given or JPAKE in use, setting client callback\n");
1324        SSL_CTX_set_psk_client_callback(ctx, psk_client_cb);
1325    }
1326#endif
1327#ifndef OPENSSL_NO_SRTP
1328    if (srtp_profiles != NULL)
1329        SSL_CTX_set_tlsext_use_srtp(ctx, srtp_profiles);
1330#endif
1331    if (exc)
1332        ssl_ctx_set_excert(ctx, exc);
1333
1334#if !defined(OPENSSL_NO_TLSEXT)
1335# if !defined(OPENSSL_NO_NEXTPROTONEG)
1336    if (next_proto.data)
1337        SSL_CTX_set_next_proto_select_cb(ctx, next_proto_cb, &next_proto);
1338# endif
1339    if (alpn_in) {
1340        unsigned short alpn_len;
1341        unsigned char *alpn = next_protos_parse(&alpn_len, alpn_in);
1342
1343        if (alpn == NULL) {
1344            BIO_printf(bio_err, "Error parsing -alpn argument\n");
1345            goto end;
1346        }
1347        SSL_CTX_set_alpn_protos(ctx, alpn, alpn_len);
1348        OPENSSL_free(alpn);
1349    }
1350#endif
1351#ifndef OPENSSL_NO_TLSEXT
1352    for (i = 0; i < serverinfo_types_count; i++) {
1353        SSL_CTX_add_client_custom_ext(ctx,
1354                                      serverinfo_types[i],
1355                                      NULL, NULL, NULL,
1356                                      serverinfo_cli_parse_cb, NULL);
1357    }
1358#endif
1359
1360    if (state)
1361        SSL_CTX_set_info_callback(ctx, apps_ssl_info_callback);
1362#if 0
1363    else
1364        SSL_CTX_set_cipher_list(ctx, getenv("SSL_CIPHER"));
1365#endif
1366
1367    SSL_CTX_set_verify(ctx, verify, verify_callback);
1368
1369    if ((CAfile || CApath)
1370        && !SSL_CTX_load_verify_locations(ctx, CAfile, CApath)) {
1371        ERR_print_errors(bio_err);
1372    }
1373    if (!SSL_CTX_set_default_verify_paths(ctx)) {
1374        ERR_print_errors(bio_err);
1375    }
1376
1377    ssl_ctx_add_crls(ctx, crls, crl_download);
1378    if (!set_cert_key_stuff(ctx, cert, key, chain, build_chain))
1379        goto end;
1380
1381#ifndef OPENSSL_NO_TLSEXT
1382    if (servername != NULL) {
1383        tlsextcbp.biodebug = bio_err;
1384        SSL_CTX_set_tlsext_servername_callback(ctx, ssl_servername_cb);
1385        SSL_CTX_set_tlsext_servername_arg(ctx, &tlsextcbp);
1386    }
1387# ifndef OPENSSL_NO_SRP
1388    if (srp_arg.srplogin) {
1389        if (!srp_lateuser && !SSL_CTX_set_srp_username(ctx, srp_arg.srplogin)) {
1390            BIO_printf(bio_err, "Unable to set SRP username\n");
1391            goto end;
1392        }
1393        srp_arg.msg = c_msg;
1394        srp_arg.debug = c_debug;
1395        SSL_CTX_set_srp_cb_arg(ctx, &srp_arg);
1396        SSL_CTX_set_srp_client_pwd_callback(ctx, ssl_give_srp_client_pwd_cb);
1397        SSL_CTX_set_srp_strength(ctx, srp_arg.strength);
1398        if (c_msg || c_debug || srp_arg.amp == 0)
1399            SSL_CTX_set_srp_verify_param_callback(ctx,
1400                                                  ssl_srp_verify_param_cb);
1401    }
1402# endif
1403#endif
1404
1405    con = SSL_new(ctx);
1406    if (sess_in) {
1407        SSL_SESSION *sess;
1408        BIO *stmp = BIO_new_file(sess_in, "r");
1409        if (!stmp) {
1410            BIO_printf(bio_err, "Can't open session file %s\n", sess_in);
1411            ERR_print_errors(bio_err);
1412            goto end;
1413        }
1414        sess = PEM_read_bio_SSL_SESSION(stmp, NULL, 0, NULL);
1415        BIO_free(stmp);
1416        if (!sess) {
1417            BIO_printf(bio_err, "Can't open session file %s\n", sess_in);
1418            ERR_print_errors(bio_err);
1419            goto end;
1420        }
1421        SSL_set_session(con, sess);
1422        SSL_SESSION_free(sess);
1423    }
1424
1425    if (fallback_scsv)
1426        SSL_set_mode(con, SSL_MODE_SEND_FALLBACK_SCSV);
1427
1428#ifndef OPENSSL_NO_TLSEXT
1429    if (servername != NULL) {
1430        if (!SSL_set_tlsext_host_name(con, servername)) {
1431            BIO_printf(bio_err, "Unable to set TLS servername extension.\n");
1432            ERR_print_errors(bio_err);
1433            goto end;
1434        }
1435    }
1436#endif
1437#ifndef OPENSSL_NO_KRB5
1438    if (con && (kctx = kssl_ctx_new()) != NULL) {
1439        SSL_set0_kssl_ctx(con, kctx);
1440        kssl_ctx_setstring(kctx, KSSL_SERVER, host);
1441    }
1442#endif                          /* OPENSSL_NO_KRB5 */
1443/*      SSL_set_cipher_list(con,"RC4-MD5"); */
1444#if 0
1445# ifdef TLSEXT_TYPE_opaque_prf_input
1446    SSL_set_tlsext_opaque_prf_input(con, "Test client", 11);
1447# endif
1448#endif
1449
1450 re_start:
1451
1452    if (init_client(&s, host, port, socket_type) == 0) {
1453        BIO_printf(bio_err, "connect:errno=%d\n", get_last_socket_error());
1454        SHUTDOWN(s);
1455        goto end;
1456    }
1457    BIO_printf(bio_c_out, "CONNECTED(%08X)\n", s);
1458
1459#ifdef FIONBIO
1460    if (c_nbio) {
1461        unsigned long l = 1;
1462        BIO_printf(bio_c_out, "turning on non blocking io\n");
1463        if (BIO_socket_ioctl(s, FIONBIO, &l) < 0) {
1464            ERR_print_errors(bio_err);
1465            goto end;
1466        }
1467    }
1468#endif
1469    if (c_Pause & 0x01)
1470        SSL_set_debug(con, 1);
1471
1472    if (socket_type == SOCK_DGRAM) {
1473
1474        sbio = BIO_new_dgram(s, BIO_NOCLOSE);
1475        if (getsockname(s, &peer, (void *)&peerlen) < 0) {
1476            BIO_printf(bio_err, "getsockname:errno=%d\n",
1477                       get_last_socket_error());
1478            SHUTDOWN(s);
1479            goto end;
1480        }
1481
1482        (void)BIO_ctrl_set_connected(sbio, 1, &peer);
1483
1484        if (enable_timeouts) {
1485            timeout.tv_sec = 0;
1486            timeout.tv_usec = DGRAM_RCV_TIMEOUT;
1487            BIO_ctrl(sbio, BIO_CTRL_DGRAM_SET_RECV_TIMEOUT, 0, &timeout);
1488
1489            timeout.tv_sec = 0;
1490            timeout.tv_usec = DGRAM_SND_TIMEOUT;
1491            BIO_ctrl(sbio, BIO_CTRL_DGRAM_SET_SEND_TIMEOUT, 0, &timeout);
1492        }
1493
1494        if (socket_mtu) {
1495            if (socket_mtu < DTLS_get_link_min_mtu(con)) {
1496                BIO_printf(bio_err, "MTU too small. Must be at least %ld\n",
1497                           DTLS_get_link_min_mtu(con));
1498                BIO_free(sbio);
1499                goto shut;
1500            }
1501            SSL_set_options(con, SSL_OP_NO_QUERY_MTU);
1502            if (!DTLS_set_link_mtu(con, socket_mtu)) {
1503                BIO_printf(bio_err, "Failed to set MTU\n");
1504                BIO_free(sbio);
1505                goto shut;
1506            }
1507        } else
1508            /* want to do MTU discovery */
1509            BIO_ctrl(sbio, BIO_CTRL_DGRAM_MTU_DISCOVER, 0, NULL);
1510    } else
1511        sbio = BIO_new_socket(s, BIO_NOCLOSE);
1512
1513    if (nbio_test) {
1514        BIO *test;
1515
1516        test = BIO_new(BIO_f_nbio_test());
1517        sbio = BIO_push(test, sbio);
1518    }
1519
1520    if (c_debug) {
1521        SSL_set_debug(con, 1);
1522        BIO_set_callback(sbio, bio_dump_callback);
1523        BIO_set_callback_arg(sbio, (char *)bio_c_out);
1524    }
1525    if (c_msg) {
1526#ifndef OPENSSL_NO_SSL_TRACE
1527        if (c_msg == 2)
1528            SSL_set_msg_callback(con, SSL_trace);
1529        else
1530#endif
1531            SSL_set_msg_callback(con, msg_cb);
1532        SSL_set_msg_callback_arg(con, bio_c_msg ? bio_c_msg : bio_c_out);
1533    }
1534#ifndef OPENSSL_NO_TLSEXT
1535    if (c_tlsextdebug) {
1536        SSL_set_tlsext_debug_callback(con, tlsext_cb);
1537        SSL_set_tlsext_debug_arg(con, bio_c_out);
1538    }
1539    if (c_status_req) {
1540        SSL_set_tlsext_status_type(con, TLSEXT_STATUSTYPE_ocsp);
1541        SSL_CTX_set_tlsext_status_cb(ctx, ocsp_resp_cb);
1542        SSL_CTX_set_tlsext_status_arg(ctx, bio_c_out);
1543# if 0
1544        {
1545            STACK_OF(OCSP_RESPID) *ids = sk_OCSP_RESPID_new_null();
1546            OCSP_RESPID *id = OCSP_RESPID_new();
1547            id->value.byKey = ASN1_OCTET_STRING_new();
1548            id->type = V_OCSP_RESPID_KEY;
1549            ASN1_STRING_set(id->value.byKey, "Hello World", -1);
1550            sk_OCSP_RESPID_push(ids, id);
1551            SSL_set_tlsext_status_ids(con, ids);
1552        }
1553# endif
1554    }
1555#endif
1556#ifndef OPENSSL_NO_JPAKE
1557    if (jpake_secret)
1558        jpake_client_auth(bio_c_out, sbio, jpake_secret);
1559#endif
1560
1561    SSL_set_bio(con, sbio, sbio);
1562    SSL_set_connect_state(con);
1563
1564    /* ok, lets connect */
1565    if (fileno_stdin() > SSL_get_fd(con))
1566        width = fileno_stdin() + 1;
1567    else
1568        width = SSL_get_fd(con) + 1;
1569
1570    read_tty = 1;
1571    write_tty = 0;
1572    tty_on = 0;
1573    read_ssl = 1;
1574    write_ssl = 1;
1575
1576    cbuf_len = 0;
1577    cbuf_off = 0;
1578    sbuf_len = 0;
1579    sbuf_off = 0;
1580
1581    /* This is an ugly hack that does a lot of assumptions */
1582    /*
1583     * We do have to handle multi-line responses which may come in a single
1584     * packet or not. We therefore have to use BIO_gets() which does need a
1585     * buffering BIO. So during the initial chitchat we do push a buffering
1586     * BIO into the chain that is removed again later on to not disturb the
1587     * rest of the s_client operation.
1588     */
1589    if (starttls_proto == PROTO_SMTP) {
1590        int foundit = 0;
1591        BIO *fbio = BIO_new(BIO_f_buffer());
1592        BIO_push(fbio, sbio);
1593        /* wait for multi-line response to end from SMTP */
1594        do {
1595            mbuf_len = BIO_gets(fbio, mbuf, BUFSIZZ);
1596        }
1597        while (mbuf_len > 3 && mbuf[3] == '-');
1598        /* STARTTLS command requires EHLO... */
1599        BIO_printf(fbio, "EHLO openssl.client.net\r\n");
1600        (void)BIO_flush(fbio);
1601        /* wait for multi-line response to end EHLO SMTP response */
1602        do {
1603            mbuf_len = BIO_gets(fbio, mbuf, BUFSIZZ);
1604            if (strstr(mbuf, "STARTTLS"))
1605                foundit = 1;
1606        }
1607        while (mbuf_len > 3 && mbuf[3] == '-');
1608        (void)BIO_flush(fbio);
1609        BIO_pop(fbio);
1610        BIO_free(fbio);
1611        if (!foundit)
1612            BIO_printf(bio_err,
1613                       "didn't found starttls in server response,"
1614                       " try anyway...\n");
1615        BIO_printf(sbio, "STARTTLS\r\n");
1616        BIO_read(sbio, sbuf, BUFSIZZ);
1617    } else if (starttls_proto == PROTO_POP3) {
1618        BIO_read(sbio, mbuf, BUFSIZZ);
1619        BIO_printf(sbio, "STLS\r\n");
1620        BIO_read(sbio, sbuf, BUFSIZZ);
1621    } else if (starttls_proto == PROTO_IMAP) {
1622        int foundit = 0;
1623        BIO *fbio = BIO_new(BIO_f_buffer());
1624        BIO_push(fbio, sbio);
1625        BIO_gets(fbio, mbuf, BUFSIZZ);
1626        /* STARTTLS command requires CAPABILITY... */
1627        BIO_printf(fbio, ". CAPABILITY\r\n");
1628        (void)BIO_flush(fbio);
1629        /* wait for multi-line CAPABILITY response */
1630        do {
1631            mbuf_len = BIO_gets(fbio, mbuf, BUFSIZZ);
1632            if (strstr(mbuf, "STARTTLS"))
1633                foundit = 1;
1634        }
1635        while (mbuf_len > 3 && mbuf[0] != '.');
1636        (void)BIO_flush(fbio);
1637        BIO_pop(fbio);
1638        BIO_free(fbio);
1639        if (!foundit)
1640            BIO_printf(bio_err,
1641                       "didn't found STARTTLS in server response,"
1642                       " try anyway...\n");
1643        BIO_printf(sbio, ". STARTTLS\r\n");
1644        BIO_read(sbio, sbuf, BUFSIZZ);
1645    } else if (starttls_proto == PROTO_FTP) {
1646        BIO *fbio = BIO_new(BIO_f_buffer());
1647        BIO_push(fbio, sbio);
1648        /* wait for multi-line response to end from FTP */
1649        do {
1650            mbuf_len = BIO_gets(fbio, mbuf, BUFSIZZ);
1651        }
1652        while (mbuf_len > 3 && mbuf[3] == '-');
1653        (void)BIO_flush(fbio);
1654        BIO_pop(fbio);
1655        BIO_free(fbio);
1656        BIO_printf(sbio, "AUTH TLS\r\n");
1657        BIO_read(sbio, sbuf, BUFSIZZ);
1658    }
1659    if (starttls_proto == PROTO_XMPP) {
1660        int seen = 0;
1661        BIO_printf(sbio, "<stream:stream "
1662                   "xmlns:stream='http://etherx.jabber.org/streams' "
1663                   "xmlns='jabber:client' to='%s' version='1.0'>", host);
1664        seen = BIO_read(sbio, mbuf, BUFSIZZ);
1665        mbuf[seen] = 0;
1666        while (!strstr
1667               (mbuf, "<starttls xmlns='urn:ietf:params:xml:ns:xmpp-tls'")) {
1668            if (strstr(mbuf, "/stream:features>"))
1669                goto shut;
1670            seen = BIO_read(sbio, mbuf, BUFSIZZ);
1671            if (seen <= 0)
1672                goto shut;
1673            mbuf[seen] = 0;
1674        }
1675        BIO_printf(sbio,
1676                   "<starttls xmlns='urn:ietf:params:xml:ns:xmpp-tls'/>");
1677        seen = BIO_read(sbio, sbuf, BUFSIZZ);
1678        sbuf[seen] = 0;
1679        if (!strstr(sbuf, "<proceed"))
1680            goto shut;
1681        mbuf[0] = 0;
1682    }
1683
1684    for (;;) {
1685        FD_ZERO(&readfds);
1686        FD_ZERO(&writefds);
1687
1688        if ((SSL_version(con) == DTLS1_VERSION) &&
1689            DTLSv1_get_timeout(con, &timeout))
1690            timeoutp = &timeout;
1691        else
1692            timeoutp = NULL;
1693
1694        if (SSL_in_init(con) && !SSL_total_renegotiations(con)) {
1695            in_init = 1;
1696            tty_on = 0;
1697        } else {
1698            tty_on = 1;
1699            if (in_init) {
1700                in_init = 0;
1701#if 0                           /* This test doesn't really work as intended
1702                                 * (needs to be fixed) */
1703# ifndef OPENSSL_NO_TLSEXT
1704                if (servername != NULL && !SSL_session_reused(con)) {
1705                    BIO_printf(bio_c_out,
1706                               "Server did %sacknowledge servername extension.\n",
1707                               tlsextcbp.ack ? "" : "not ");
1708                }
1709# endif
1710#endif
1711                if (sess_out) {
1712                    BIO *stmp = BIO_new_file(sess_out, "w");
1713                    if (stmp) {
1714                        PEM_write_bio_SSL_SESSION(stmp, SSL_get_session(con));
1715                        BIO_free(stmp);
1716                    } else
1717                        BIO_printf(bio_err, "Error writing session file %s\n",
1718                                   sess_out);
1719                }
1720                if (c_brief) {
1721                    BIO_puts(bio_err, "CONNECTION ESTABLISHED\n");
1722                    print_ssl_summary(bio_err, con);
1723                }
1724
1725                print_stuff(bio_c_out, con, full_log);
1726                if (full_log > 0)
1727                    full_log--;
1728
1729                if (starttls_proto) {
1730                    BIO_printf(bio_err, "%s", mbuf);
1731                    /* We don't need to know any more */
1732                    starttls_proto = PROTO_OFF;
1733                }
1734
1735                if (reconnect) {
1736                    reconnect--;
1737                    BIO_printf(bio_c_out,
1738                               "drop connection and then reconnect\n");
1739                    SSL_shutdown(con);
1740                    SSL_set_connect_state(con);
1741                    SHUTDOWN(SSL_get_fd(con));
1742                    goto re_start;
1743                }
1744            }
1745        }
1746
1747        ssl_pending = read_ssl && SSL_pending(con);
1748
1749        if (!ssl_pending) {
1750#if !defined(OPENSSL_SYS_WINDOWS) && !defined(OPENSSL_SYS_MSDOS) && !defined(OPENSSL_SYS_NETWARE) && !defined (OPENSSL_SYS_BEOS_R5)
1751            if (tty_on) {
1752                if (read_tty)
1753                    openssl_fdset(fileno_stdin(), &readfds);
1754#if !defined(OPENSSL_SYS_VMS)
1755                if (write_tty)
1756                    openssl_fdset(fileno_stdout(), &writefds);
1757#endif
1758            }
1759            if (read_ssl)
1760                openssl_fdset(SSL_get_fd(con), &readfds);
1761            if (write_ssl)
1762                openssl_fdset(SSL_get_fd(con), &writefds);
1763#else
1764            if (!tty_on || !write_tty) {
1765                if (read_ssl)
1766                    openssl_fdset(SSL_get_fd(con), &readfds);
1767                if (write_ssl)
1768                    openssl_fdset(SSL_get_fd(con), &writefds);
1769            }
1770#endif
1771/*-         printf("mode tty(%d %d%d) ssl(%d%d)\n",
1772                    tty_on,read_tty,write_tty,read_ssl,write_ssl);*/
1773
1774            /*
1775             * Note: under VMS with SOCKETSHR the second parameter is
1776             * currently of type (int *) whereas under other systems it is
1777             * (void *) if you don't have a cast it will choke the compiler:
1778             * if you do have a cast then you can either go for (int *) or
1779             * (void *).
1780             */
1781#if defined(OPENSSL_SYS_WINDOWS) || defined(OPENSSL_SYS_MSDOS)
1782            /*
1783             * Under Windows/DOS we make the assumption that we can always
1784             * write to the tty: therefore if we need to write to the tty we
1785             * just fall through. Otherwise we timeout the select every
1786             * second and see if there are any keypresses. Note: this is a
1787             * hack, in a proper Windows application we wouldn't do this.
1788             */
1789            i = 0;
1790            if (!write_tty) {
1791                if (read_tty) {
1792                    tv.tv_sec = 1;
1793                    tv.tv_usec = 0;
1794                    i = select(width, (void *)&readfds, (void *)&writefds,
1795                               NULL, &tv);
1796# if defined(OPENSSL_SYS_WINCE) || defined(OPENSSL_SYS_MSDOS)
1797                    if (!i && (!_kbhit() || !read_tty))
1798                        continue;
1799# else
1800                    if (!i && (!((_kbhit())
1801                                 || (WAIT_OBJECT_0 ==
1802                                     WaitForSingleObject(GetStdHandle
1803                                                         (STD_INPUT_HANDLE),
1804                                                         0)))
1805                               || !read_tty))
1806                        continue;
1807# endif
1808                } else
1809                    i = select(width, (void *)&readfds, (void *)&writefds,
1810                               NULL, timeoutp);
1811            }
1812#elif defined(OPENSSL_SYS_NETWARE)
1813            if (!write_tty) {
1814                if (read_tty) {
1815                    tv.tv_sec = 1;
1816                    tv.tv_usec = 0;
1817                    i = select(width, (void *)&readfds, (void *)&writefds,
1818                               NULL, &tv);
1819                } else
1820                    i = select(width, (void *)&readfds, (void *)&writefds,
1821                               NULL, timeoutp);
1822            }
1823#elif defined(OPENSSL_SYS_BEOS_R5)
1824            /* Under BeOS-R5 the situation is similar to DOS */
1825            i = 0;
1826            stdin_set = 0;
1827            (void)fcntl(fileno_stdin(), F_SETFL, O_NONBLOCK);
1828            if (!write_tty) {
1829                if (read_tty) {
1830                    tv.tv_sec = 1;
1831                    tv.tv_usec = 0;
1832                    i = select(width, (void *)&readfds, (void *)&writefds,
1833                               NULL, &tv);
1834                    if (read(fileno_stdin(), sbuf, 0) >= 0)
1835                        stdin_set = 1;
1836                    if (!i && (stdin_set != 1 || !read_tty))
1837                        continue;
1838                } else
1839                    i = select(width, (void *)&readfds, (void *)&writefds,
1840                               NULL, timeoutp);
1841            }
1842            (void)fcntl(fileno_stdin(), F_SETFL, 0);
1843#else
1844            i = select(width, (void *)&readfds, (void *)&writefds,
1845                       NULL, timeoutp);
1846#endif
1847            if (i < 0) {
1848                BIO_printf(bio_err, "bad select %d\n",
1849                           get_last_socket_error());
1850                goto shut;
1851                /* goto end; */
1852            }
1853        }
1854
1855        if ((SSL_version(con) == DTLS1_VERSION)
1856            && DTLSv1_handle_timeout(con) > 0) {
1857            BIO_printf(bio_err, "TIMEOUT occured\n");
1858        }
1859
1860        if (!ssl_pending && FD_ISSET(SSL_get_fd(con), &writefds)) {
1861            k = SSL_write(con, &(cbuf[cbuf_off]), (unsigned int)cbuf_len);
1862            switch (SSL_get_error(con, k)) {
1863            case SSL_ERROR_NONE:
1864                cbuf_off += k;
1865                cbuf_len -= k;
1866                if (k <= 0)
1867                    goto end;
1868                /* we have done a  write(con,NULL,0); */
1869                if (cbuf_len <= 0) {
1870                    read_tty = 1;
1871                    write_ssl = 0;
1872                } else {        /* if (cbuf_len > 0) */
1873
1874                    read_tty = 0;
1875                    write_ssl = 1;
1876                }
1877                break;
1878            case SSL_ERROR_WANT_WRITE:
1879                BIO_printf(bio_c_out, "write W BLOCK\n");
1880                write_ssl = 1;
1881                read_tty = 0;
1882                break;
1883            case SSL_ERROR_WANT_READ:
1884                BIO_printf(bio_c_out, "write R BLOCK\n");
1885                write_tty = 0;
1886                read_ssl = 1;
1887                write_ssl = 0;
1888                break;
1889            case SSL_ERROR_WANT_X509_LOOKUP:
1890                BIO_printf(bio_c_out, "write X BLOCK\n");
1891                break;
1892            case SSL_ERROR_ZERO_RETURN:
1893                if (cbuf_len != 0) {
1894                    BIO_printf(bio_c_out, "shutdown\n");
1895                    ret = 0;
1896                    goto shut;
1897                } else {
1898                    read_tty = 1;
1899                    write_ssl = 0;
1900                    break;
1901                }
1902
1903            case SSL_ERROR_SYSCALL:
1904                if ((k != 0) || (cbuf_len != 0)) {
1905                    BIO_printf(bio_err, "write:errno=%d\n",
1906                               get_last_socket_error());
1907                    goto shut;
1908                } else {
1909                    read_tty = 1;
1910                    write_ssl = 0;
1911                }
1912                break;
1913            case SSL_ERROR_SSL:
1914                ERR_print_errors(bio_err);
1915                goto shut;
1916            }
1917        }
1918#if defined(OPENSSL_SYS_WINDOWS) || defined(OPENSSL_SYS_MSDOS) || defined(OPENSSL_SYS_NETWARE) || defined(OPENSSL_SYS_BEOS_R5) || defined(OPENSSL_SYS_VMS)
1919        /* Assume Windows/DOS/BeOS can always write */
1920        else if (!ssl_pending && write_tty)
1921#else
1922        else if (!ssl_pending && FD_ISSET(fileno_stdout(), &writefds))
1923#endif
1924        {
1925#ifdef CHARSET_EBCDIC
1926            ascii2ebcdic(&(sbuf[sbuf_off]), &(sbuf[sbuf_off]), sbuf_len);
1927#endif
1928            i = raw_write_stdout(&(sbuf[sbuf_off]), sbuf_len);
1929
1930            if (i <= 0) {
1931                BIO_printf(bio_c_out, "DONE\n");
1932                ret = 0;
1933                goto shut;
1934                /* goto end; */
1935            }
1936
1937            sbuf_len -= i;;
1938            sbuf_off += i;
1939            if (sbuf_len <= 0) {
1940                read_ssl = 1;
1941                write_tty = 0;
1942            }
1943        } else if (ssl_pending || FD_ISSET(SSL_get_fd(con), &readfds)) {
1944#ifdef RENEG
1945            {
1946                static int iiii;
1947                if (++iiii == 52) {
1948                    SSL_renegotiate(con);
1949                    iiii = 0;
1950                }
1951            }
1952#endif
1953#if 1
1954            k = SSL_read(con, sbuf, 1024 /* BUFSIZZ */ );
1955#else
1956/* Demo for pending and peek :-) */
1957            k = SSL_read(con, sbuf, 16);
1958            {
1959                char zbuf[10240];
1960                printf("read=%d pending=%d peek=%d\n", k, SSL_pending(con),
1961                       SSL_peek(con, zbuf, 10240));
1962            }
1963#endif
1964
1965            switch (SSL_get_error(con, k)) {
1966            case SSL_ERROR_NONE:
1967                if (k <= 0)
1968                    goto end;
1969                sbuf_off = 0;
1970                sbuf_len = k;
1971
1972                read_ssl = 0;
1973                write_tty = 1;
1974                break;
1975            case SSL_ERROR_WANT_WRITE:
1976                BIO_printf(bio_c_out, "read W BLOCK\n");
1977                write_ssl = 1;
1978                read_tty = 0;
1979                break;
1980            case SSL_ERROR_WANT_READ:
1981                BIO_printf(bio_c_out, "read R BLOCK\n");
1982                write_tty = 0;
1983                read_ssl = 1;
1984                if ((read_tty == 0) && (write_ssl == 0))
1985                    write_ssl = 1;
1986                break;
1987            case SSL_ERROR_WANT_X509_LOOKUP:
1988                BIO_printf(bio_c_out, "read X BLOCK\n");
1989                break;
1990            case SSL_ERROR_SYSCALL:
1991                ret = get_last_socket_error();
1992                if (c_brief)
1993                    BIO_puts(bio_err, "CONNECTION CLOSED BY SERVER\n");
1994                else
1995                    BIO_printf(bio_err, "read:errno=%d\n", ret);
1996                goto shut;
1997            case SSL_ERROR_ZERO_RETURN:
1998                BIO_printf(bio_c_out, "closed\n");
1999                ret = 0;
2000                goto shut;
2001            case SSL_ERROR_SSL:
2002                ERR_print_errors(bio_err);
2003                goto shut;
2004                /* break; */
2005            }
2006        }
2007#if defined(OPENSSL_SYS_WINDOWS) || defined(OPENSSL_SYS_MSDOS)
2008# if defined(OPENSSL_SYS_WINCE) || defined(OPENSSL_SYS_MSDOS)
2009        else if (_kbhit())
2010# else
2011        else if ((_kbhit())
2012                 || (WAIT_OBJECT_0 ==
2013                     WaitForSingleObject(GetStdHandle(STD_INPUT_HANDLE), 0)))
2014# endif
2015#elif defined (OPENSSL_SYS_NETWARE)
2016        else if (_kbhit())
2017#elif defined(OPENSSL_SYS_BEOS_R5)
2018        else if (stdin_set)
2019#else
2020        else if (FD_ISSET(fileno_stdin(), &readfds))
2021#endif
2022        {
2023            if (crlf) {
2024                int j, lf_num;
2025
2026                i = raw_read_stdin(cbuf, BUFSIZZ / 2);
2027                lf_num = 0;
2028                /* both loops are skipped when i <= 0 */
2029                for (j = 0; j < i; j++)
2030                    if (cbuf[j] == '\n')
2031                        lf_num++;
2032                for (j = i - 1; j >= 0; j--) {
2033                    cbuf[j + lf_num] = cbuf[j];
2034                    if (cbuf[j] == '\n') {
2035                        lf_num--;
2036                        i++;
2037                        cbuf[j + lf_num] = '\r';
2038                    }
2039                }
2040                assert(lf_num == 0);
2041            } else
2042                i = raw_read_stdin(cbuf, BUFSIZZ);
2043
2044            if ((!c_ign_eof) && ((i <= 0) || (cbuf[0] == 'Q'))) {
2045                BIO_printf(bio_err, "DONE\n");
2046                ret = 0;
2047                goto shut;
2048            }
2049
2050            if ((!c_ign_eof) && (cbuf[0] == 'R')) {
2051                BIO_printf(bio_err, "RENEGOTIATING\n");
2052                SSL_renegotiate(con);
2053                cbuf_len = 0;
2054            }
2055#ifndef OPENSSL_NO_HEARTBEATS
2056            else if ((!c_ign_eof) && (cbuf[0] == 'B')) {
2057                BIO_printf(bio_err, "HEARTBEATING\n");
2058                SSL_heartbeat(con);
2059                cbuf_len = 0;
2060            }
2061#endif
2062            else {
2063                cbuf_len = i;
2064                cbuf_off = 0;
2065#ifdef CHARSET_EBCDIC
2066                ebcdic2ascii(cbuf, cbuf, i);
2067#endif
2068            }
2069
2070            write_ssl = 1;
2071            read_tty = 0;
2072        }
2073    }
2074
2075    ret = 0;
2076 shut:
2077    if (in_init)
2078        print_stuff(bio_c_out, con, full_log);
2079    SSL_shutdown(con);
2080    SHUTDOWN(SSL_get_fd(con));
2081 end:
2082    if (con != NULL) {
2083        if (prexit != 0)
2084            print_stuff(bio_c_out, con, 1);
2085        SSL_free(con);
2086    }
2087#if !defined(OPENSSL_NO_TLSEXT) && !defined(OPENSSL_NO_NEXTPROTONEG)
2088    if (next_proto.data)
2089        OPENSSL_free(next_proto.data);
2090#endif
2091    if (ctx != NULL)
2092        SSL_CTX_free(ctx);
2093    if (cert)
2094        X509_free(cert);
2095    if (crls)
2096        sk_X509_CRL_pop_free(crls, X509_CRL_free);
2097    if (key)
2098        EVP_PKEY_free(key);
2099    if (chain)
2100        sk_X509_pop_free(chain, X509_free);
2101    if (pass)
2102        OPENSSL_free(pass);
2103#ifndef OPENSSL_NO_SRP
2104    OPENSSL_free(srp_arg.srppassin);
2105#endif
2106    if (vpm)
2107        X509_VERIFY_PARAM_free(vpm);
2108    ssl_excert_free(exc);
2109    if (ssl_args)
2110        sk_OPENSSL_STRING_free(ssl_args);
2111    if (cctx)
2112        SSL_CONF_CTX_free(cctx);
2113#ifndef OPENSSL_NO_JPAKE
2114    if (jpake_secret && psk_key)
2115        OPENSSL_free(psk_key);
2116#endif
2117    if (cbuf != NULL) {
2118        OPENSSL_cleanse(cbuf, BUFSIZZ);
2119        OPENSSL_free(cbuf);
2120    }
2121    if (sbuf != NULL) {
2122        OPENSSL_cleanse(sbuf, BUFSIZZ);
2123        OPENSSL_free(sbuf);
2124    }
2125    if (mbuf != NULL) {
2126        OPENSSL_cleanse(mbuf, BUFSIZZ);
2127        OPENSSL_free(mbuf);
2128    }
2129    release_engine(e);
2130    if (bio_c_out != NULL) {
2131        BIO_free(bio_c_out);
2132        bio_c_out = NULL;
2133    }
2134    if (bio_c_msg != NULL) {
2135        BIO_free(bio_c_msg);
2136        bio_c_msg = NULL;
2137    }
2138    SSL_COMP_free_compression_methods();
2139    apps_shutdown();
2140    OPENSSL_EXIT(ret);
2141}
2142
2143static void print_stuff(BIO *bio, SSL *s, int full)
2144{
2145    X509 *peer = NULL;
2146    char *p;
2147    static const char *space = "                ";
2148    char buf[BUFSIZ];
2149    STACK_OF(X509) *sk;
2150    STACK_OF(X509_NAME) *sk2;
2151    const SSL_CIPHER *c;
2152    X509_NAME *xn;
2153    int j, i;
2154#ifndef OPENSSL_NO_COMP
2155    const COMP_METHOD *comp, *expansion;
2156#endif
2157    unsigned char *exportedkeymat;
2158
2159    if (full) {
2160        int got_a_chain = 0;
2161
2162        sk = SSL_get_peer_cert_chain(s);
2163        if (sk != NULL) {
2164            got_a_chain = 1;    /* we don't have it for SSL2 (yet) */
2165
2166            BIO_printf(bio, "---\nCertificate chain\n");
2167            for (i = 0; i < sk_X509_num(sk); i++) {
2168                X509_NAME_oneline(X509_get_subject_name(sk_X509_value(sk, i)),
2169                                  buf, sizeof(buf));
2170                BIO_printf(bio, "%2d s:%s\n", i, buf);
2171                X509_NAME_oneline(X509_get_issuer_name(sk_X509_value(sk, i)),
2172                                  buf, sizeof(buf));
2173                BIO_printf(bio, "   i:%s\n", buf);
2174                if (c_showcerts)
2175                    PEM_write_bio_X509(bio, sk_X509_value(sk, i));
2176            }
2177        }
2178
2179        BIO_printf(bio, "---\n");
2180        peer = SSL_get_peer_certificate(s);
2181        if (peer != NULL) {
2182            BIO_printf(bio, "Server certificate\n");
2183
2184            /* Redundant if we showed the whole chain */
2185            if (!(c_showcerts && got_a_chain))
2186                PEM_write_bio_X509(bio, peer);
2187            X509_NAME_oneline(X509_get_subject_name(peer), buf, sizeof(buf));
2188            BIO_printf(bio, "subject=%s\n", buf);
2189            X509_NAME_oneline(X509_get_issuer_name(peer), buf, sizeof(buf));
2190            BIO_printf(bio, "issuer=%s\n", buf);
2191        } else
2192            BIO_printf(bio, "no peer certificate available\n");
2193
2194        sk2 = SSL_get_client_CA_list(s);
2195        if ((sk2 != NULL) && (sk_X509_NAME_num(sk2) > 0)) {
2196            BIO_printf(bio, "---\nAcceptable client certificate CA names\n");
2197            for (i = 0; i < sk_X509_NAME_num(sk2); i++) {
2198                xn = sk_X509_NAME_value(sk2, i);
2199                X509_NAME_oneline(xn, buf, sizeof(buf));
2200                BIO_write(bio, buf, strlen(buf));
2201                BIO_write(bio, "\n", 1);
2202            }
2203        } else {
2204            BIO_printf(bio, "---\nNo client certificate CA names sent\n");
2205        }
2206        p = SSL_get_shared_ciphers(s, buf, sizeof(buf));
2207        if (p != NULL) {
2208            /*
2209             * This works only for SSL 2.  In later protocol versions, the
2210             * client does not know what other ciphers (in addition to the
2211             * one to be used in the current connection) the server supports.
2212             */
2213
2214            BIO_printf(bio,
2215                       "---\nCiphers common between both SSL endpoints:\n");
2216            j = i = 0;
2217            while (*p) {
2218                if (*p == ':') {
2219                    BIO_write(bio, space, 15 - j % 25);
2220                    i++;
2221                    j = 0;
2222                    BIO_write(bio, ((i % 3) ? " " : "\n"), 1);
2223                } else {
2224                    BIO_write(bio, p, 1);
2225                    j++;
2226                }
2227                p++;
2228            }
2229            BIO_write(bio, "\n", 1);
2230        }
2231
2232        ssl_print_sigalgs(bio, s);
2233        ssl_print_tmp_key(bio, s);
2234
2235        BIO_printf(bio,
2236                   "---\nSSL handshake has read %ld bytes and written %ld bytes\n",
2237                   BIO_number_read(SSL_get_rbio(s)),
2238                   BIO_number_written(SSL_get_wbio(s)));
2239    }
2240    BIO_printf(bio, (SSL_cache_hit(s) ? "---\nReused, " : "---\nNew, "));
2241    c = SSL_get_current_cipher(s);
2242    BIO_printf(bio, "%s, Cipher is %s\n",
2243               SSL_CIPHER_get_version(c), SSL_CIPHER_get_name(c));
2244    if (peer != NULL) {
2245        EVP_PKEY *pktmp;
2246        pktmp = X509_get_pubkey(peer);
2247        BIO_printf(bio, "Server public key is %d bit\n",
2248                   EVP_PKEY_bits(pktmp));
2249        EVP_PKEY_free(pktmp);
2250    }
2251    BIO_printf(bio, "Secure Renegotiation IS%s supported\n",
2252               SSL_get_secure_renegotiation_support(s) ? "" : " NOT");
2253#ifndef OPENSSL_NO_COMP
2254    comp = SSL_get_current_compression(s);
2255    expansion = SSL_get_current_expansion(s);
2256    BIO_printf(bio, "Compression: %s\n",
2257               comp ? SSL_COMP_get_name(comp) : "NONE");
2258    BIO_printf(bio, "Expansion: %s\n",
2259               expansion ? SSL_COMP_get_name(expansion) : "NONE");
2260#endif
2261
2262#ifdef SSL_DEBUG
2263    {
2264        /* Print out local port of connection: useful for debugging */
2265        int sock;
2266        struct sockaddr_in ladd;
2267        socklen_t ladd_size = sizeof(ladd);
2268        sock = SSL_get_fd(s);
2269        getsockname(sock, (struct sockaddr *)&ladd, &ladd_size);
2270        BIO_printf(bio_c_out, "LOCAL PORT is %u\n", ntohs(ladd.sin_port));
2271    }
2272#endif
2273
2274#if !defined(OPENSSL_NO_TLSEXT)
2275# if !defined(OPENSSL_NO_NEXTPROTONEG)
2276    if (next_proto.status != -1) {
2277        const unsigned char *proto;
2278        unsigned int proto_len;
2279        SSL_get0_next_proto_negotiated(s, &proto, &proto_len);
2280        BIO_printf(bio, "Next protocol: (%d) ", next_proto.status);
2281        BIO_write(bio, proto, proto_len);
2282        BIO_write(bio, "\n", 1);
2283    }
2284# endif
2285    {
2286        const unsigned char *proto;
2287        unsigned int proto_len;
2288        SSL_get0_alpn_selected(s, &proto, &proto_len);
2289        if (proto_len > 0) {
2290            BIO_printf(bio, "ALPN protocol: ");
2291            BIO_write(bio, proto, proto_len);
2292            BIO_write(bio, "\n", 1);
2293        } else
2294            BIO_printf(bio, "No ALPN negotiated\n");
2295    }
2296#endif
2297
2298#ifndef OPENSSL_NO_SRTP
2299    {
2300        SRTP_PROTECTION_PROFILE *srtp_profile =
2301            SSL_get_selected_srtp_profile(s);
2302
2303        if (srtp_profile)
2304            BIO_printf(bio, "SRTP Extension negotiated, profile=%s\n",
2305                       srtp_profile->name);
2306    }
2307#endif
2308
2309    SSL_SESSION_print(bio, SSL_get_session(s));
2310    if (keymatexportlabel != NULL) {
2311        BIO_printf(bio, "Keying material exporter:\n");
2312        BIO_printf(bio, "    Label: '%s'\n", keymatexportlabel);
2313        BIO_printf(bio, "    Length: %i bytes\n", keymatexportlen);
2314        exportedkeymat = OPENSSL_malloc(keymatexportlen);
2315        if (exportedkeymat != NULL) {
2316            if (!SSL_export_keying_material(s, exportedkeymat,
2317                                            keymatexportlen,
2318                                            keymatexportlabel,
2319                                            strlen(keymatexportlabel),
2320                                            NULL, 0, 0)) {
2321                BIO_printf(bio, "    Error\n");
2322            } else {
2323                BIO_printf(bio, "    Keying material: ");
2324                for (i = 0; i < keymatexportlen; i++)
2325                    BIO_printf(bio, "%02X", exportedkeymat[i]);
2326                BIO_printf(bio, "\n");
2327            }
2328            OPENSSL_free(exportedkeymat);
2329        }
2330    }
2331    BIO_printf(bio, "---\n");
2332    if (peer != NULL)
2333        X509_free(peer);
2334    /* flush, or debugging output gets mixed with http response */
2335    (void)BIO_flush(bio);
2336}
2337
2338#ifndef OPENSSL_NO_TLSEXT
2339
2340static int ocsp_resp_cb(SSL *s, void *arg)
2341{
2342    const unsigned char *p;
2343    int len;
2344    OCSP_RESPONSE *rsp;
2345    len = SSL_get_tlsext_status_ocsp_resp(s, &p);
2346    BIO_puts(arg, "OCSP response: ");
2347    if (!p) {
2348        BIO_puts(arg, "no response sent\n");
2349        return 1;
2350    }
2351    rsp = d2i_OCSP_RESPONSE(NULL, &p, len);
2352    if (!rsp) {
2353        BIO_puts(arg, "response parse error\n");
2354        BIO_dump_indent(arg, (char *)p, len, 4);
2355        return 0;
2356    }
2357    BIO_puts(arg, "\n======================================\n");
2358    OCSP_RESPONSE_print(arg, rsp, 0);
2359    BIO_puts(arg, "======================================\n");
2360    OCSP_RESPONSE_free(rsp);
2361    return 1;
2362}
2363
2364#endif
2365