s_client.c revision 325337
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-2006 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 in the chain\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    ext_buf[0] = ext_type >> 8;
634    ext_buf[1] = ext_type & 0xFF;
635    ext_buf[2] = inlen >> 8;
636    ext_buf[3] = inlen & 0xFF;
637    memcpy(ext_buf + 4, in, inlen);
638
639    BIO_snprintf(pem_name, sizeof(pem_name), "SERVERINFO FOR EXTENSION %d",
640                 ext_type);
641    PEM_write_bio(bio_c_out, pem_name, "", ext_buf, 4 + inlen);
642    return 1;
643}
644
645#endif
646
647enum {
648    PROTO_OFF = 0,
649    PROTO_SMTP,
650    PROTO_POP3,
651    PROTO_IMAP,
652    PROTO_FTP,
653    PROTO_XMPP
654};
655
656int MAIN(int, char **);
657
658int MAIN(int argc, char **argv)
659{
660    int build_chain = 0;
661    SSL *con = NULL;
662#ifndef OPENSSL_NO_KRB5
663    KSSL_CTX *kctx;
664#endif
665    int s, k, width, state = 0;
666    char *cbuf = NULL, *sbuf = NULL, *mbuf = NULL;
667    int cbuf_len, cbuf_off;
668    int sbuf_len, sbuf_off;
669    fd_set readfds, writefds;
670    short port = PORT;
671    int full_log = 1;
672    char *host = SSL_HOST_NAME;
673    char *cert_file = NULL, *key_file = NULL, *chain_file = NULL;
674    int cert_format = FORMAT_PEM, key_format = FORMAT_PEM;
675    char *passarg = NULL, *pass = NULL;
676    X509 *cert = NULL;
677    EVP_PKEY *key = NULL;
678    STACK_OF(X509) *chain = NULL;
679    char *CApath = NULL, *CAfile = NULL;
680    char *chCApath = NULL, *chCAfile = NULL;
681    char *vfyCApath = NULL, *vfyCAfile = NULL;
682    int reconnect = 0, badop = 0, verify = SSL_VERIFY_NONE;
683    int crlf = 0;
684    int write_tty, read_tty, write_ssl, read_ssl, tty_on, ssl_pending;
685    SSL_CTX *ctx = NULL;
686    int ret = 1, in_init = 1, i, nbio_test = 0;
687    int starttls_proto = PROTO_OFF;
688    int prexit = 0;
689    X509_VERIFY_PARAM *vpm = NULL;
690    int badarg = 0;
691    const SSL_METHOD *meth = NULL;
692    int socket_type = SOCK_STREAM;
693    BIO *sbio;
694    char *inrand = NULL;
695    int mbuf_len = 0;
696    struct timeval timeout, *timeoutp;
697    char *engine_id = NULL;
698    ENGINE *e = NULL;
699#ifndef OPENSSL_NO_ENGINE
700    char *ssl_client_engine_id = NULL;
701    ENGINE *ssl_client_engine = NULL;
702#endif
703#if defined(OPENSSL_SYS_WINDOWS) || defined(OPENSSL_SYS_MSDOS) || defined(OPENSSL_SYS_NETWARE) || defined(OPENSSL_SYS_BEOS_R5)
704    struct timeval tv;
705# if defined(OPENSSL_SYS_BEOS_R5)
706    int stdin_set = 0;
707# endif
708#endif
709#ifndef OPENSSL_NO_TLSEXT
710    char *servername = NULL;
711    tlsextctx tlsextcbp = { NULL, 0 };
712# ifndef OPENSSL_NO_NEXTPROTONEG
713    const char *next_proto_neg_in = NULL;
714# endif
715    const char *alpn_in = NULL;
716# define MAX_SI_TYPES 100
717    unsigned short serverinfo_types[MAX_SI_TYPES];
718    int serverinfo_types_count = 0;
719#endif
720    char *sess_in = NULL;
721    char *sess_out = NULL;
722    struct sockaddr peer;
723    int peerlen = sizeof(peer);
724    int fallback_scsv = 0;
725    int enable_timeouts = 0;
726    long socket_mtu = 0;
727#ifndef OPENSSL_NO_JPAKE
728    static char *jpake_secret = NULL;
729# define no_jpake !jpake_secret
730#else
731# define no_jpake 1
732#endif
733#ifndef OPENSSL_NO_SRP
734    char *srppass = NULL;
735    int srp_lateuser = 0;
736    SRP_ARG srp_arg = { NULL, NULL, 0, 0, 0, 1024 };
737#endif
738    SSL_EXCERT *exc = NULL;
739
740    SSL_CONF_CTX *cctx = NULL;
741    STACK_OF(OPENSSL_STRING) *ssl_args = NULL;
742
743    char *crl_file = NULL;
744    int crl_format = FORMAT_PEM;
745    int crl_download = 0;
746    STACK_OF(X509_CRL) *crls = NULL;
747    int prot_opt = 0, no_prot_opt = 0;
748
749    meth = SSLv23_client_method();
750
751    apps_startup();
752    c_Pause = 0;
753    c_quiet = 0;
754    c_ign_eof = 0;
755    c_debug = 0;
756    c_msg = 0;
757    c_showcerts = 0;
758
759    if (bio_err == NULL)
760        bio_err = BIO_new_fp(stderr, BIO_NOCLOSE);
761
762    if (!load_config(bio_err, NULL))
763        goto end;
764
765    cctx = SSL_CONF_CTX_new();
766    if (!cctx)
767        goto end;
768    SSL_CONF_CTX_set_flags(cctx, SSL_CONF_FLAG_CLIENT);
769    SSL_CONF_CTX_set_flags(cctx, SSL_CONF_FLAG_CMDLINE);
770
771    if (((cbuf = OPENSSL_malloc(BUFSIZZ)) == NULL) ||
772        ((sbuf = OPENSSL_malloc(BUFSIZZ)) == NULL) ||
773        ((mbuf = OPENSSL_malloc(BUFSIZZ)) == NULL)) {
774        BIO_printf(bio_err, "out of memory\n");
775        goto end;
776    }
777
778    verify_depth = 0;
779    verify_error = X509_V_OK;
780#ifdef FIONBIO
781    c_nbio = 0;
782#endif
783
784    argc--;
785    argv++;
786    while (argc >= 1) {
787        if (strcmp(*argv, "-host") == 0) {
788            if (--argc < 1)
789                goto bad;
790            host = *(++argv);
791        } else if (strcmp(*argv, "-port") == 0) {
792            if (--argc < 1)
793                goto bad;
794            port = atoi(*(++argv));
795            if (port == 0)
796                goto bad;
797        } else if (strcmp(*argv, "-connect") == 0) {
798            if (--argc < 1)
799                goto bad;
800            if (!extract_host_port(*(++argv), &host, NULL, &port))
801                goto bad;
802        } else if (strcmp(*argv, "-verify") == 0) {
803            verify = SSL_VERIFY_PEER;
804            if (--argc < 1)
805                goto bad;
806            verify_depth = atoi(*(++argv));
807            if (!c_quiet)
808                BIO_printf(bio_err, "verify depth is %d\n", verify_depth);
809        } else if (strcmp(*argv, "-cert") == 0) {
810            if (--argc < 1)
811                goto bad;
812            cert_file = *(++argv);
813        } else if (strcmp(*argv, "-CRL") == 0) {
814            if (--argc < 1)
815                goto bad;
816            crl_file = *(++argv);
817        } else if (strcmp(*argv, "-crl_download") == 0)
818            crl_download = 1;
819        else if (strcmp(*argv, "-sess_out") == 0) {
820            if (--argc < 1)
821                goto bad;
822            sess_out = *(++argv);
823        } else if (strcmp(*argv, "-sess_in") == 0) {
824            if (--argc < 1)
825                goto bad;
826            sess_in = *(++argv);
827        } else if (strcmp(*argv, "-certform") == 0) {
828            if (--argc < 1)
829                goto bad;
830            cert_format = str2fmt(*(++argv));
831        } else if (strcmp(*argv, "-CRLform") == 0) {
832            if (--argc < 1)
833                goto bad;
834            crl_format = str2fmt(*(++argv));
835        } else if (args_verify(&argv, &argc, &badarg, bio_err, &vpm)) {
836            if (badarg)
837                goto bad;
838            continue;
839        } else if (strcmp(*argv, "-verify_return_error") == 0)
840            verify_return_error = 1;
841        else if (strcmp(*argv, "-verify_quiet") == 0)
842            verify_quiet = 1;
843        else if (strcmp(*argv, "-brief") == 0) {
844            c_brief = 1;
845            verify_quiet = 1;
846            c_quiet = 1;
847        } else if (args_excert(&argv, &argc, &badarg, bio_err, &exc)) {
848            if (badarg)
849                goto bad;
850            continue;
851        } else if (args_ssl(&argv, &argc, cctx, &badarg, bio_err, &ssl_args,
852                            &no_prot_opt)) {
853            if (badarg)
854                goto bad;
855            continue;
856        } else if (strcmp(*argv, "-prexit") == 0)
857            prexit = 1;
858        else if (strcmp(*argv, "-crlf") == 0)
859            crlf = 1;
860        else if (strcmp(*argv, "-quiet") == 0) {
861            c_quiet = 1;
862            c_ign_eof = 1;
863        } else if (strcmp(*argv, "-ign_eof") == 0)
864            c_ign_eof = 1;
865        else if (strcmp(*argv, "-no_ign_eof") == 0)
866            c_ign_eof = 0;
867        else if (strcmp(*argv, "-pause") == 0)
868            c_Pause = 1;
869        else if (strcmp(*argv, "-debug") == 0)
870            c_debug = 1;
871#ifndef OPENSSL_NO_TLSEXT
872        else if (strcmp(*argv, "-tlsextdebug") == 0)
873            c_tlsextdebug = 1;
874        else if (strcmp(*argv, "-status") == 0)
875            c_status_req = 1;
876#endif
877#ifdef WATT32
878        else if (strcmp(*argv, "-wdebug") == 0)
879            dbug_init();
880#endif
881        else if (strcmp(*argv, "-msg") == 0)
882            c_msg = 1;
883        else if (strcmp(*argv, "-msgfile") == 0) {
884            if (--argc < 1)
885                goto bad;
886            bio_c_msg = BIO_new_file(*(++argv), "w");
887        }
888#ifndef OPENSSL_NO_SSL_TRACE
889        else if (strcmp(*argv, "-trace") == 0)
890            c_msg = 2;
891#endif
892        else if (strcmp(*argv, "-showcerts") == 0)
893            c_showcerts = 1;
894        else if (strcmp(*argv, "-nbio_test") == 0)
895            nbio_test = 1;
896        else if (strcmp(*argv, "-state") == 0)
897            state = 1;
898#ifndef OPENSSL_NO_PSK
899        else if (strcmp(*argv, "-psk_identity") == 0) {
900            if (--argc < 1)
901                goto bad;
902            psk_identity = *(++argv);
903        } else if (strcmp(*argv, "-psk") == 0) {
904            size_t j;
905
906            if (--argc < 1)
907                goto bad;
908            psk_key = *(++argv);
909            for (j = 0; j < strlen(psk_key); j++) {
910                if (isxdigit((unsigned char)psk_key[j]))
911                    continue;
912                BIO_printf(bio_err, "Not a hex number '%s'\n", *argv);
913                goto bad;
914            }
915        }
916#endif
917#ifndef OPENSSL_NO_SRP
918        else if (strcmp(*argv, "-srpuser") == 0) {
919            if (--argc < 1)
920                goto bad;
921            srp_arg.srplogin = *(++argv);
922            meth = TLSv1_client_method();
923        } else if (strcmp(*argv, "-srppass") == 0) {
924            if (--argc < 1)
925                goto bad;
926            srppass = *(++argv);
927            meth = TLSv1_client_method();
928        } else if (strcmp(*argv, "-srp_strength") == 0) {
929            if (--argc < 1)
930                goto bad;
931            srp_arg.strength = atoi(*(++argv));
932            BIO_printf(bio_err, "SRP minimal length for N is %d\n",
933                       srp_arg.strength);
934            meth = TLSv1_client_method();
935        } else if (strcmp(*argv, "-srp_lateuser") == 0) {
936            srp_lateuser = 1;
937            meth = TLSv1_client_method();
938        } else if (strcmp(*argv, "-srp_moregroups") == 0) {
939            srp_arg.amp = 1;
940            meth = TLSv1_client_method();
941        }
942#endif
943#ifndef OPENSSL_NO_SSL2
944        else if (strcmp(*argv, "-ssl2") == 0) {
945            meth = SSLv2_client_method();
946            prot_opt++;
947        }
948#endif
949#ifndef OPENSSL_NO_SSL3_METHOD
950        else if (strcmp(*argv, "-ssl3") == 0) {
951            meth = SSLv3_client_method();
952            prot_opt++;
953        }
954#endif
955#ifndef OPENSSL_NO_TLS1
956        else if (strcmp(*argv, "-tls1_2") == 0) {
957            meth = TLSv1_2_client_method();
958            prot_opt++;
959        } else if (strcmp(*argv, "-tls1_1") == 0) {
960            meth = TLSv1_1_client_method();
961            prot_opt++;
962        } else if (strcmp(*argv, "-tls1") == 0) {
963            meth = TLSv1_client_method();
964            prot_opt++;
965        }
966#endif
967#ifndef OPENSSL_NO_DTLS1
968        else if (strcmp(*argv, "-dtls") == 0) {
969            meth = DTLS_client_method();
970            socket_type = SOCK_DGRAM;
971            prot_opt++;
972        } else if (strcmp(*argv, "-dtls1") == 0) {
973            meth = DTLSv1_client_method();
974            socket_type = SOCK_DGRAM;
975            prot_opt++;
976        } else if (strcmp(*argv, "-dtls1_2") == 0) {
977            meth = DTLSv1_2_client_method();
978            socket_type = SOCK_DGRAM;
979            prot_opt++;
980        } else if (strcmp(*argv, "-timeout") == 0)
981            enable_timeouts = 1;
982        else if (strcmp(*argv, "-mtu") == 0) {
983            if (--argc < 1)
984                goto bad;
985            socket_mtu = atol(*(++argv));
986        }
987#endif
988        else if (strcmp(*argv, "-fallback_scsv") == 0) {
989            fallback_scsv = 1;
990        } else if (strcmp(*argv, "-keyform") == 0) {
991            if (--argc < 1)
992                goto bad;
993            key_format = str2fmt(*(++argv));
994        } else if (strcmp(*argv, "-pass") == 0) {
995            if (--argc < 1)
996                goto bad;
997            passarg = *(++argv);
998        } else if (strcmp(*argv, "-cert_chain") == 0) {
999            if (--argc < 1)
1000                goto bad;
1001            chain_file = *(++argv);
1002        } else if (strcmp(*argv, "-key") == 0) {
1003            if (--argc < 1)
1004                goto bad;
1005            key_file = *(++argv);
1006        } else if (strcmp(*argv, "-reconnect") == 0) {
1007            reconnect = 5;
1008        } else if (strcmp(*argv, "-CApath") == 0) {
1009            if (--argc < 1)
1010                goto bad;
1011            CApath = *(++argv);
1012        } else if (strcmp(*argv, "-chainCApath") == 0) {
1013            if (--argc < 1)
1014                goto bad;
1015            chCApath = *(++argv);
1016        } else if (strcmp(*argv, "-verifyCApath") == 0) {
1017            if (--argc < 1)
1018                goto bad;
1019            vfyCApath = *(++argv);
1020        } else if (strcmp(*argv, "-build_chain") == 0)
1021            build_chain = 1;
1022        else if (strcmp(*argv, "-CAfile") == 0) {
1023            if (--argc < 1)
1024                goto bad;
1025            CAfile = *(++argv);
1026        } else if (strcmp(*argv, "-chainCAfile") == 0) {
1027            if (--argc < 1)
1028                goto bad;
1029            chCAfile = *(++argv);
1030        } else if (strcmp(*argv, "-verifyCAfile") == 0) {
1031            if (--argc < 1)
1032                goto bad;
1033            vfyCAfile = *(++argv);
1034        }
1035#ifndef OPENSSL_NO_TLSEXT
1036# ifndef OPENSSL_NO_NEXTPROTONEG
1037        else if (strcmp(*argv, "-nextprotoneg") == 0) {
1038            if (--argc < 1)
1039                goto bad;
1040            next_proto_neg_in = *(++argv);
1041        }
1042# endif
1043        else if (strcmp(*argv, "-alpn") == 0) {
1044            if (--argc < 1)
1045                goto bad;
1046            alpn_in = *(++argv);
1047        } else if (strcmp(*argv, "-serverinfo") == 0) {
1048            char *c;
1049            int start = 0;
1050            int len;
1051
1052            if (--argc < 1)
1053                goto bad;
1054            c = *(++argv);
1055            serverinfo_types_count = 0;
1056            len = strlen(c);
1057            for (i = 0; i <= len; ++i) {
1058                if (i == len || c[i] == ',') {
1059                    serverinfo_types[serverinfo_types_count]
1060                        = atoi(c + start);
1061                    serverinfo_types_count++;
1062                    start = i + 1;
1063                }
1064                if (serverinfo_types_count == MAX_SI_TYPES)
1065                    break;
1066            }
1067        }
1068#endif
1069#ifdef FIONBIO
1070        else if (strcmp(*argv, "-nbio") == 0) {
1071            c_nbio = 1;
1072        }
1073#endif
1074        else if (strcmp(*argv, "-starttls") == 0) {
1075            if (--argc < 1)
1076                goto bad;
1077            ++argv;
1078            if (strcmp(*argv, "smtp") == 0)
1079                starttls_proto = PROTO_SMTP;
1080            else if (strcmp(*argv, "pop3") == 0)
1081                starttls_proto = PROTO_POP3;
1082            else if (strcmp(*argv, "imap") == 0)
1083                starttls_proto = PROTO_IMAP;
1084            else if (strcmp(*argv, "ftp") == 0)
1085                starttls_proto = PROTO_FTP;
1086            else if (strcmp(*argv, "xmpp") == 0)
1087                starttls_proto = PROTO_XMPP;
1088            else
1089                goto bad;
1090        }
1091#ifndef OPENSSL_NO_ENGINE
1092        else if (strcmp(*argv, "-engine") == 0) {
1093            if (--argc < 1)
1094                goto bad;
1095            engine_id = *(++argv);
1096        } else if (strcmp(*argv, "-ssl_client_engine") == 0) {
1097            if (--argc < 1)
1098                goto bad;
1099            ssl_client_engine_id = *(++argv);
1100        }
1101#endif
1102        else if (strcmp(*argv, "-rand") == 0) {
1103            if (--argc < 1)
1104                goto bad;
1105            inrand = *(++argv);
1106        }
1107#ifndef OPENSSL_NO_TLSEXT
1108        else if (strcmp(*argv, "-servername") == 0) {
1109            if (--argc < 1)
1110                goto bad;
1111            servername = *(++argv);
1112            /* meth=TLSv1_client_method(); */
1113        }
1114#endif
1115#ifndef OPENSSL_NO_JPAKE
1116        else if (strcmp(*argv, "-jpake") == 0) {
1117            if (--argc < 1)
1118                goto bad;
1119            jpake_secret = *++argv;
1120        }
1121#endif
1122#ifndef OPENSSL_NO_SRTP
1123        else if (strcmp(*argv, "-use_srtp") == 0) {
1124            if (--argc < 1)
1125                goto bad;
1126            srtp_profiles = *(++argv);
1127        }
1128#endif
1129        else if (strcmp(*argv, "-keymatexport") == 0) {
1130            if (--argc < 1)
1131                goto bad;
1132            keymatexportlabel = *(++argv);
1133        } else if (strcmp(*argv, "-keymatexportlen") == 0) {
1134            if (--argc < 1)
1135                goto bad;
1136            keymatexportlen = atoi(*(++argv));
1137            if (keymatexportlen == 0)
1138                goto bad;
1139        } else {
1140            BIO_printf(bio_err, "unknown option %s\n", *argv);
1141            badop = 1;
1142            break;
1143        }
1144        argc--;
1145        argv++;
1146    }
1147    if (badop) {
1148 bad:
1149        sc_usage();
1150        goto end;
1151    }
1152#if !defined(OPENSSL_NO_JPAKE) && !defined(OPENSSL_NO_PSK)
1153    if (jpake_secret) {
1154        if (psk_key) {
1155            BIO_printf(bio_err, "Can't use JPAKE and PSK together\n");
1156            goto end;
1157        }
1158        psk_identity = "JPAKE";
1159    }
1160#endif
1161
1162    if (prot_opt > 1) {
1163        BIO_printf(bio_err, "Cannot supply multiple protocol flags\n");
1164        goto end;
1165    }
1166
1167    if (prot_opt == 1 && no_prot_opt) {
1168        BIO_printf(bio_err, "Cannot supply both a protocol flag and "
1169                            "\"-no_<prot>\"\n");
1170        goto end;
1171    }
1172
1173    OpenSSL_add_ssl_algorithms();
1174    SSL_load_error_strings();
1175
1176#if !defined(OPENSSL_NO_TLSEXT) && !defined(OPENSSL_NO_NEXTPROTONEG)
1177    next_proto.status = -1;
1178    if (next_proto_neg_in) {
1179        next_proto.data =
1180            next_protos_parse(&next_proto.len, next_proto_neg_in);
1181        if (next_proto.data == NULL) {
1182            BIO_printf(bio_err, "Error parsing -nextprotoneg argument\n");
1183            goto end;
1184        }
1185    } else
1186        next_proto.data = NULL;
1187#endif
1188
1189    e = setup_engine(bio_err, engine_id, 1);
1190#ifndef OPENSSL_NO_ENGINE
1191    if (ssl_client_engine_id) {
1192        ssl_client_engine = ENGINE_by_id(ssl_client_engine_id);
1193        if (!ssl_client_engine) {
1194            BIO_printf(bio_err, "Error getting client auth engine\n");
1195            goto end;
1196        }
1197    }
1198#endif
1199    if (!app_passwd(bio_err, passarg, NULL, &pass, NULL)) {
1200        BIO_printf(bio_err, "Error getting password\n");
1201        goto end;
1202    }
1203
1204    if (key_file == NULL)
1205        key_file = cert_file;
1206
1207    if (key_file) {
1208
1209        key = load_key(bio_err, key_file, key_format, 0, pass, e,
1210                       "client certificate private key file");
1211        if (!key) {
1212            ERR_print_errors(bio_err);
1213            goto end;
1214        }
1215
1216    }
1217
1218    if (cert_file) {
1219        cert = load_cert(bio_err, cert_file, cert_format,
1220                         NULL, e, "client certificate file");
1221
1222        if (!cert) {
1223            ERR_print_errors(bio_err);
1224            goto end;
1225        }
1226    }
1227
1228    if (chain_file) {
1229        chain = load_certs(bio_err, chain_file, FORMAT_PEM,
1230                           NULL, e, "client certificate chain");
1231        if (!chain)
1232            goto end;
1233    }
1234
1235    if (crl_file) {
1236        X509_CRL *crl;
1237        crl = load_crl(crl_file, crl_format);
1238        if (!crl) {
1239            BIO_puts(bio_err, "Error loading CRL\n");
1240            ERR_print_errors(bio_err);
1241            goto end;
1242        }
1243        crls = sk_X509_CRL_new_null();
1244        if (!crls || !sk_X509_CRL_push(crls, crl)) {
1245            BIO_puts(bio_err, "Error adding CRL\n");
1246            ERR_print_errors(bio_err);
1247            X509_CRL_free(crl);
1248            goto end;
1249        }
1250    }
1251
1252    if (!load_excert(&exc, bio_err))
1253        goto end;
1254
1255    if (!app_RAND_load_file(NULL, bio_err, 1) && inrand == NULL
1256        && !RAND_status()) {
1257        BIO_printf(bio_err,
1258                   "warning, not much extra random data, consider using the -rand option\n");
1259    }
1260    if (inrand != NULL)
1261        BIO_printf(bio_err, "%ld semi-random bytes loaded\n",
1262                   app_RAND_load_files(inrand));
1263
1264    if (bio_c_out == NULL) {
1265        if (c_quiet && !c_debug) {
1266            bio_c_out = BIO_new(BIO_s_null());
1267            if (c_msg && !bio_c_msg)
1268                bio_c_msg = BIO_new_fp(stdout, BIO_NOCLOSE);
1269        } else {
1270            if (bio_c_out == NULL)
1271                bio_c_out = BIO_new_fp(stdout, BIO_NOCLOSE);
1272        }
1273    }
1274#ifndef OPENSSL_NO_SRP
1275    if (!app_passwd(bio_err, srppass, NULL, &srp_arg.srppassin, NULL)) {
1276        BIO_printf(bio_err, "Error getting password\n");
1277        goto end;
1278    }
1279#endif
1280
1281    ctx = SSL_CTX_new(meth);
1282    if (ctx == NULL) {
1283        ERR_print_errors(bio_err);
1284        goto end;
1285    }
1286
1287    if (vpm)
1288        SSL_CTX_set1_param(ctx, vpm);
1289
1290    if (!args_ssl_call(ctx, bio_err, cctx, ssl_args, 1, no_jpake)) {
1291        ERR_print_errors(bio_err);
1292        goto end;
1293    }
1294
1295    if (!ssl_load_stores(ctx, vfyCApath, vfyCAfile, chCApath, chCAfile,
1296                         crls, crl_download)) {
1297        BIO_printf(bio_err, "Error loading store locations\n");
1298        ERR_print_errors(bio_err);
1299        goto end;
1300    }
1301#ifndef OPENSSL_NO_ENGINE
1302    if (ssl_client_engine) {
1303        if (!SSL_CTX_set_client_cert_engine(ctx, ssl_client_engine)) {
1304            BIO_puts(bio_err, "Error setting client auth engine\n");
1305            ERR_print_errors(bio_err);
1306            ENGINE_free(ssl_client_engine);
1307            goto end;
1308        }
1309        ENGINE_free(ssl_client_engine);
1310    }
1311#endif
1312
1313#ifndef OPENSSL_NO_PSK
1314# ifdef OPENSSL_NO_JPAKE
1315    if (psk_key != NULL)
1316# else
1317    if (psk_key != NULL || jpake_secret)
1318# endif
1319    {
1320        if (c_debug)
1321            BIO_printf(bio_c_out,
1322                       "PSK key given or JPAKE in use, setting client callback\n");
1323        SSL_CTX_set_psk_client_callback(ctx, psk_client_cb);
1324    }
1325#endif
1326#ifndef OPENSSL_NO_SRTP
1327    if (srtp_profiles != NULL)
1328        SSL_CTX_set_tlsext_use_srtp(ctx, srtp_profiles);
1329#endif
1330    if (exc)
1331        ssl_ctx_set_excert(ctx, exc);
1332
1333#if !defined(OPENSSL_NO_TLSEXT)
1334# if !defined(OPENSSL_NO_NEXTPROTONEG)
1335    if (next_proto.data)
1336        SSL_CTX_set_next_proto_select_cb(ctx, next_proto_cb, &next_proto);
1337# endif
1338    if (alpn_in) {
1339        unsigned short alpn_len;
1340        unsigned char *alpn = next_protos_parse(&alpn_len, alpn_in);
1341
1342        if (alpn == NULL) {
1343            BIO_printf(bio_err, "Error parsing -alpn argument\n");
1344            goto end;
1345        }
1346        SSL_CTX_set_alpn_protos(ctx, alpn, alpn_len);
1347        OPENSSL_free(alpn);
1348    }
1349#endif
1350#ifndef OPENSSL_NO_TLSEXT
1351    for (i = 0; i < serverinfo_types_count; i++) {
1352        SSL_CTX_add_client_custom_ext(ctx,
1353                                      serverinfo_types[i],
1354                                      NULL, NULL, NULL,
1355                                      serverinfo_cli_parse_cb, NULL);
1356    }
1357#endif
1358
1359    if (state)
1360        SSL_CTX_set_info_callback(ctx, apps_ssl_info_callback);
1361#if 0
1362    else
1363        SSL_CTX_set_cipher_list(ctx, getenv("SSL_CIPHER"));
1364#endif
1365
1366    SSL_CTX_set_verify(ctx, verify, verify_callback);
1367
1368    if ((CAfile || CApath)
1369        && !SSL_CTX_load_verify_locations(ctx, CAfile, CApath)) {
1370        ERR_print_errors(bio_err);
1371    }
1372    if (!SSL_CTX_set_default_verify_paths(ctx)) {
1373        ERR_print_errors(bio_err);
1374    }
1375
1376    ssl_ctx_add_crls(ctx, crls, crl_download);
1377    if (!set_cert_key_stuff(ctx, cert, key, chain, build_chain))
1378        goto end;
1379
1380#ifndef OPENSSL_NO_TLSEXT
1381    if (servername != NULL) {
1382        tlsextcbp.biodebug = bio_err;
1383        SSL_CTX_set_tlsext_servername_callback(ctx, ssl_servername_cb);
1384        SSL_CTX_set_tlsext_servername_arg(ctx, &tlsextcbp);
1385    }
1386# ifndef OPENSSL_NO_SRP
1387    if (srp_arg.srplogin) {
1388        if (!srp_lateuser && !SSL_CTX_set_srp_username(ctx, srp_arg.srplogin)) {
1389            BIO_printf(bio_err, "Unable to set SRP username\n");
1390            goto end;
1391        }
1392        srp_arg.msg = c_msg;
1393        srp_arg.debug = c_debug;
1394        SSL_CTX_set_srp_cb_arg(ctx, &srp_arg);
1395        SSL_CTX_set_srp_client_pwd_callback(ctx, ssl_give_srp_client_pwd_cb);
1396        SSL_CTX_set_srp_strength(ctx, srp_arg.strength);
1397        if (c_msg || c_debug || srp_arg.amp == 0)
1398            SSL_CTX_set_srp_verify_param_callback(ctx,
1399                                                  ssl_srp_verify_param_cb);
1400    }
1401# endif
1402#endif
1403
1404    con = SSL_new(ctx);
1405    if (sess_in) {
1406        SSL_SESSION *sess;
1407        BIO *stmp = BIO_new_file(sess_in, "r");
1408        if (!stmp) {
1409            BIO_printf(bio_err, "Can't open session file %s\n", sess_in);
1410            ERR_print_errors(bio_err);
1411            goto end;
1412        }
1413        sess = PEM_read_bio_SSL_SESSION(stmp, NULL, 0, NULL);
1414        BIO_free(stmp);
1415        if (!sess) {
1416            BIO_printf(bio_err, "Can't open session file %s\n", sess_in);
1417            ERR_print_errors(bio_err);
1418            goto end;
1419        }
1420        SSL_set_session(con, sess);
1421        SSL_SESSION_free(sess);
1422    }
1423
1424    if (fallback_scsv)
1425        SSL_set_mode(con, SSL_MODE_SEND_FALLBACK_SCSV);
1426
1427#ifndef OPENSSL_NO_TLSEXT
1428    if (servername != NULL) {
1429        if (!SSL_set_tlsext_host_name(con, servername)) {
1430            BIO_printf(bio_err, "Unable to set TLS servername extension.\n");
1431            ERR_print_errors(bio_err);
1432            goto end;
1433        }
1434    }
1435#endif
1436#ifndef OPENSSL_NO_KRB5
1437    if (con && (kctx = kssl_ctx_new()) != NULL) {
1438        SSL_set0_kssl_ctx(con, kctx);
1439        kssl_ctx_setstring(kctx, KSSL_SERVER, host);
1440    }
1441#endif                          /* OPENSSL_NO_KRB5 */
1442/*      SSL_set_cipher_list(con,"RC4-MD5"); */
1443#if 0
1444# ifdef TLSEXT_TYPE_opaque_prf_input
1445    SSL_set_tlsext_opaque_prf_input(con, "Test client", 11);
1446# endif
1447#endif
1448
1449 re_start:
1450
1451    if (init_client(&s, host, port, socket_type) == 0) {
1452        BIO_printf(bio_err, "connect:errno=%d\n", get_last_socket_error());
1453        SHUTDOWN(s);
1454        goto end;
1455    }
1456    BIO_printf(bio_c_out, "CONNECTED(%08X)\n", s);
1457
1458#ifdef FIONBIO
1459    if (c_nbio) {
1460        unsigned long l = 1;
1461        BIO_printf(bio_c_out, "turning on non blocking io\n");
1462        if (BIO_socket_ioctl(s, FIONBIO, &l) < 0) {
1463            ERR_print_errors(bio_err);
1464            goto end;
1465        }
1466    }
1467#endif
1468    if (c_Pause & 0x01)
1469        SSL_set_debug(con, 1);
1470
1471    if (socket_type == SOCK_DGRAM) {
1472
1473        sbio = BIO_new_dgram(s, BIO_NOCLOSE);
1474        if (getsockname(s, &peer, (void *)&peerlen) < 0) {
1475            BIO_printf(bio_err, "getsockname:errno=%d\n",
1476                       get_last_socket_error());
1477            SHUTDOWN(s);
1478            goto end;
1479        }
1480
1481        (void)BIO_ctrl_set_connected(sbio, 1, &peer);
1482
1483        if (enable_timeouts) {
1484            timeout.tv_sec = 0;
1485            timeout.tv_usec = DGRAM_RCV_TIMEOUT;
1486            BIO_ctrl(sbio, BIO_CTRL_DGRAM_SET_RECV_TIMEOUT, 0, &timeout);
1487
1488            timeout.tv_sec = 0;
1489            timeout.tv_usec = DGRAM_SND_TIMEOUT;
1490            BIO_ctrl(sbio, BIO_CTRL_DGRAM_SET_SEND_TIMEOUT, 0, &timeout);
1491        }
1492
1493        if (socket_mtu) {
1494            if (socket_mtu < DTLS_get_link_min_mtu(con)) {
1495                BIO_printf(bio_err, "MTU too small. Must be at least %ld\n",
1496                           DTLS_get_link_min_mtu(con));
1497                BIO_free(sbio);
1498                goto shut;
1499            }
1500            SSL_set_options(con, SSL_OP_NO_QUERY_MTU);
1501            if (!DTLS_set_link_mtu(con, socket_mtu)) {
1502                BIO_printf(bio_err, "Failed to set MTU\n");
1503                BIO_free(sbio);
1504                goto shut;
1505            }
1506        } else
1507            /* want to do MTU discovery */
1508            BIO_ctrl(sbio, BIO_CTRL_DGRAM_MTU_DISCOVER, 0, NULL);
1509    } else
1510        sbio = BIO_new_socket(s, BIO_NOCLOSE);
1511
1512    if (nbio_test) {
1513        BIO *test;
1514
1515        test = BIO_new(BIO_f_nbio_test());
1516        sbio = BIO_push(test, sbio);
1517    }
1518
1519    if (c_debug) {
1520        SSL_set_debug(con, 1);
1521        BIO_set_callback(sbio, bio_dump_callback);
1522        BIO_set_callback_arg(sbio, (char *)bio_c_out);
1523    }
1524    if (c_msg) {
1525#ifndef OPENSSL_NO_SSL_TRACE
1526        if (c_msg == 2)
1527            SSL_set_msg_callback(con, SSL_trace);
1528        else
1529#endif
1530            SSL_set_msg_callback(con, msg_cb);
1531        SSL_set_msg_callback_arg(con, bio_c_msg ? bio_c_msg : bio_c_out);
1532    }
1533#ifndef OPENSSL_NO_TLSEXT
1534    if (c_tlsextdebug) {
1535        SSL_set_tlsext_debug_callback(con, tlsext_cb);
1536        SSL_set_tlsext_debug_arg(con, bio_c_out);
1537    }
1538    if (c_status_req) {
1539        SSL_set_tlsext_status_type(con, TLSEXT_STATUSTYPE_ocsp);
1540        SSL_CTX_set_tlsext_status_cb(ctx, ocsp_resp_cb);
1541        SSL_CTX_set_tlsext_status_arg(ctx, bio_c_out);
1542# if 0
1543        {
1544            STACK_OF(OCSP_RESPID) *ids = sk_OCSP_RESPID_new_null();
1545            OCSP_RESPID *id = OCSP_RESPID_new();
1546            id->value.byKey = ASN1_OCTET_STRING_new();
1547            id->type = V_OCSP_RESPID_KEY;
1548            ASN1_STRING_set(id->value.byKey, "Hello World", -1);
1549            sk_OCSP_RESPID_push(ids, id);
1550            SSL_set_tlsext_status_ids(con, ids);
1551        }
1552# endif
1553    }
1554#endif
1555#ifndef OPENSSL_NO_JPAKE
1556    if (jpake_secret)
1557        jpake_client_auth(bio_c_out, sbio, jpake_secret);
1558#endif
1559
1560    SSL_set_bio(con, sbio, sbio);
1561    SSL_set_connect_state(con);
1562
1563    /* ok, lets connect */
1564    if (fileno_stdin() > SSL_get_fd(con))
1565        width = fileno_stdin() + 1;
1566    else
1567        width = SSL_get_fd(con) + 1;
1568
1569    read_tty = 1;
1570    write_tty = 0;
1571    tty_on = 0;
1572    read_ssl = 1;
1573    write_ssl = 1;
1574
1575    cbuf_len = 0;
1576    cbuf_off = 0;
1577    sbuf_len = 0;
1578    sbuf_off = 0;
1579
1580    /* This is an ugly hack that does a lot of assumptions */
1581    /*
1582     * We do have to handle multi-line responses which may come in a single
1583     * packet or not. We therefore have to use BIO_gets() which does need a
1584     * buffering BIO. So during the initial chitchat we do push a buffering
1585     * BIO into the chain that is removed again later on to not disturb the
1586     * rest of the s_client operation.
1587     */
1588    if (starttls_proto == PROTO_SMTP) {
1589        int foundit = 0;
1590        BIO *fbio = BIO_new(BIO_f_buffer());
1591        BIO_push(fbio, sbio);
1592        /* wait for multi-line response to end from SMTP */
1593        do {
1594            mbuf_len = BIO_gets(fbio, mbuf, BUFSIZZ);
1595        }
1596        while (mbuf_len > 3 && mbuf[3] == '-');
1597        /* STARTTLS command requires EHLO... */
1598        BIO_printf(fbio, "EHLO openssl.client.net\r\n");
1599        (void)BIO_flush(fbio);
1600        /* wait for multi-line response to end EHLO SMTP response */
1601        do {
1602            mbuf_len = BIO_gets(fbio, mbuf, BUFSIZZ);
1603            if (strstr(mbuf, "STARTTLS"))
1604                foundit = 1;
1605        }
1606        while (mbuf_len > 3 && mbuf[3] == '-');
1607        (void)BIO_flush(fbio);
1608        BIO_pop(fbio);
1609        BIO_free(fbio);
1610        if (!foundit)
1611            BIO_printf(bio_err,
1612                       "didn't found starttls in server response,"
1613                       " try anyway...\n");
1614        BIO_printf(sbio, "STARTTLS\r\n");
1615        BIO_read(sbio, sbuf, BUFSIZZ);
1616    } else if (starttls_proto == PROTO_POP3) {
1617        BIO_read(sbio, mbuf, BUFSIZZ);
1618        BIO_printf(sbio, "STLS\r\n");
1619        BIO_read(sbio, sbuf, BUFSIZZ);
1620    } else if (starttls_proto == PROTO_IMAP) {
1621        int foundit = 0;
1622        BIO *fbio = BIO_new(BIO_f_buffer());
1623        BIO_push(fbio, sbio);
1624        BIO_gets(fbio, mbuf, BUFSIZZ);
1625        /* STARTTLS command requires CAPABILITY... */
1626        BIO_printf(fbio, ". CAPABILITY\r\n");
1627        (void)BIO_flush(fbio);
1628        /* wait for multi-line CAPABILITY response */
1629        do {
1630            mbuf_len = BIO_gets(fbio, mbuf, BUFSIZZ);
1631            if (strstr(mbuf, "STARTTLS"))
1632                foundit = 1;
1633        }
1634        while (mbuf_len > 3 && mbuf[0] != '.');
1635        (void)BIO_flush(fbio);
1636        BIO_pop(fbio);
1637        BIO_free(fbio);
1638        if (!foundit)
1639            BIO_printf(bio_err,
1640                       "didn't found STARTTLS in server response,"
1641                       " try anyway...\n");
1642        BIO_printf(sbio, ". STARTTLS\r\n");
1643        BIO_read(sbio, sbuf, BUFSIZZ);
1644    } else if (starttls_proto == PROTO_FTP) {
1645        BIO *fbio = BIO_new(BIO_f_buffer());
1646        BIO_push(fbio, sbio);
1647        /* wait for multi-line response to end from FTP */
1648        do {
1649            mbuf_len = BIO_gets(fbio, mbuf, BUFSIZZ);
1650        }
1651        while (mbuf_len > 3 && mbuf[3] == '-');
1652        (void)BIO_flush(fbio);
1653        BIO_pop(fbio);
1654        BIO_free(fbio);
1655        BIO_printf(sbio, "AUTH TLS\r\n");
1656        BIO_read(sbio, sbuf, BUFSIZZ);
1657    }
1658    if (starttls_proto == PROTO_XMPP) {
1659        int seen = 0;
1660        BIO_printf(sbio, "<stream:stream "
1661                   "xmlns:stream='http://etherx.jabber.org/streams' "
1662                   "xmlns='jabber:client' to='%s' version='1.0'>", host);
1663        seen = BIO_read(sbio, mbuf, BUFSIZZ);
1664        mbuf[seen] = 0;
1665        while (!strstr
1666               (mbuf, "<starttls xmlns='urn:ietf:params:xml:ns:xmpp-tls'")) {
1667            if (strstr(mbuf, "/stream:features>"))
1668                goto shut;
1669            seen = BIO_read(sbio, mbuf, BUFSIZZ);
1670            if (seen <= 0)
1671                goto shut;
1672            mbuf[seen] = 0;
1673        }
1674        BIO_printf(sbio,
1675                   "<starttls xmlns='urn:ietf:params:xml:ns:xmpp-tls'/>");
1676        seen = BIO_read(sbio, sbuf, BUFSIZZ);
1677        sbuf[seen] = 0;
1678        if (!strstr(sbuf, "<proceed"))
1679            goto shut;
1680        mbuf[0] = 0;
1681    }
1682
1683    for (;;) {
1684        FD_ZERO(&readfds);
1685        FD_ZERO(&writefds);
1686
1687        if ((SSL_version(con) == DTLS1_VERSION) &&
1688            DTLSv1_get_timeout(con, &timeout))
1689            timeoutp = &timeout;
1690        else
1691            timeoutp = NULL;
1692
1693        if (SSL_in_init(con) && !SSL_total_renegotiations(con)) {
1694            in_init = 1;
1695            tty_on = 0;
1696        } else {
1697            tty_on = 1;
1698            if (in_init) {
1699                in_init = 0;
1700#if 0                           /* This test doesn't really work as intended
1701                                 * (needs to be fixed) */
1702# ifndef OPENSSL_NO_TLSEXT
1703                if (servername != NULL && !SSL_session_reused(con)) {
1704                    BIO_printf(bio_c_out,
1705                               "Server did %sacknowledge servername extension.\n",
1706                               tlsextcbp.ack ? "" : "not ");
1707                }
1708# endif
1709#endif
1710                if (sess_out) {
1711                    BIO *stmp = BIO_new_file(sess_out, "w");
1712                    if (stmp) {
1713                        PEM_write_bio_SSL_SESSION(stmp, SSL_get_session(con));
1714                        BIO_free(stmp);
1715                    } else
1716                        BIO_printf(bio_err, "Error writing session file %s\n",
1717                                   sess_out);
1718                }
1719                if (c_brief) {
1720                    BIO_puts(bio_err, "CONNECTION ESTABLISHED\n");
1721                    print_ssl_summary(bio_err, con);
1722                }
1723
1724                print_stuff(bio_c_out, con, full_log);
1725                if (full_log > 0)
1726                    full_log--;
1727
1728                if (starttls_proto) {
1729                    BIO_printf(bio_err, "%s", mbuf);
1730                    /* We don't need to know any more */
1731                    starttls_proto = PROTO_OFF;
1732                }
1733
1734                if (reconnect) {
1735                    reconnect--;
1736                    BIO_printf(bio_c_out,
1737                               "drop connection and then reconnect\n");
1738                    SSL_shutdown(con);
1739                    SSL_set_connect_state(con);
1740                    SHUTDOWN(SSL_get_fd(con));
1741                    goto re_start;
1742                }
1743            }
1744        }
1745
1746        ssl_pending = read_ssl && SSL_pending(con);
1747
1748        if (!ssl_pending) {
1749#if !defined(OPENSSL_SYS_WINDOWS) && !defined(OPENSSL_SYS_MSDOS) && !defined(OPENSSL_SYS_NETWARE) && !defined (OPENSSL_SYS_BEOS_R5)
1750            if (tty_on) {
1751                if (read_tty)
1752                    openssl_fdset(fileno_stdin(), &readfds);
1753#if !defined(OPENSSL_SYS_VMS)
1754                if (write_tty)
1755                    openssl_fdset(fileno_stdout(), &writefds);
1756#endif
1757            }
1758            if (read_ssl)
1759                openssl_fdset(SSL_get_fd(con), &readfds);
1760            if (write_ssl)
1761                openssl_fdset(SSL_get_fd(con), &writefds);
1762#else
1763            if (!tty_on || !write_tty) {
1764                if (read_ssl)
1765                    openssl_fdset(SSL_get_fd(con), &readfds);
1766                if (write_ssl)
1767                    openssl_fdset(SSL_get_fd(con), &writefds);
1768            }
1769#endif
1770/*-         printf("mode tty(%d %d%d) ssl(%d%d)\n",
1771                    tty_on,read_tty,write_tty,read_ssl,write_ssl);*/
1772
1773            /*
1774             * Note: under VMS with SOCKETSHR the second parameter is
1775             * currently of type (int *) whereas under other systems it is
1776             * (void *) if you don't have a cast it will choke the compiler:
1777             * if you do have a cast then you can either go for (int *) or
1778             * (void *).
1779             */
1780#if defined(OPENSSL_SYS_WINDOWS) || defined(OPENSSL_SYS_MSDOS)
1781            /*
1782             * Under Windows/DOS we make the assumption that we can always
1783             * write to the tty: therefore if we need to write to the tty we
1784             * just fall through. Otherwise we timeout the select every
1785             * second and see if there are any keypresses. Note: this is a
1786             * hack, in a proper Windows application we wouldn't do this.
1787             */
1788            i = 0;
1789            if (!write_tty) {
1790                if (read_tty) {
1791                    tv.tv_sec = 1;
1792                    tv.tv_usec = 0;
1793                    i = select(width, (void *)&readfds, (void *)&writefds,
1794                               NULL, &tv);
1795# if defined(OPENSSL_SYS_WINCE) || defined(OPENSSL_SYS_MSDOS)
1796                    if (!i && (!_kbhit() || !read_tty))
1797                        continue;
1798# else
1799                    if (!i && (!((_kbhit())
1800                                 || (WAIT_OBJECT_0 ==
1801                                     WaitForSingleObject(GetStdHandle
1802                                                         (STD_INPUT_HANDLE),
1803                                                         0)))
1804                               || !read_tty))
1805                        continue;
1806# endif
1807                } else
1808                    i = select(width, (void *)&readfds, (void *)&writefds,
1809                               NULL, timeoutp);
1810            }
1811#elif defined(OPENSSL_SYS_NETWARE)
1812            if (!write_tty) {
1813                if (read_tty) {
1814                    tv.tv_sec = 1;
1815                    tv.tv_usec = 0;
1816                    i = select(width, (void *)&readfds, (void *)&writefds,
1817                               NULL, &tv);
1818                } else
1819                    i = select(width, (void *)&readfds, (void *)&writefds,
1820                               NULL, timeoutp);
1821            }
1822#elif defined(OPENSSL_SYS_BEOS_R5)
1823            /* Under BeOS-R5 the situation is similar to DOS */
1824            i = 0;
1825            stdin_set = 0;
1826            (void)fcntl(fileno_stdin(), F_SETFL, O_NONBLOCK);
1827            if (!write_tty) {
1828                if (read_tty) {
1829                    tv.tv_sec = 1;
1830                    tv.tv_usec = 0;
1831                    i = select(width, (void *)&readfds, (void *)&writefds,
1832                               NULL, &tv);
1833                    if (read(fileno_stdin(), sbuf, 0) >= 0)
1834                        stdin_set = 1;
1835                    if (!i && (stdin_set != 1 || !read_tty))
1836                        continue;
1837                } else
1838                    i = select(width, (void *)&readfds, (void *)&writefds,
1839                               NULL, timeoutp);
1840            }
1841            (void)fcntl(fileno_stdin(), F_SETFL, 0);
1842#else
1843            i = select(width, (void *)&readfds, (void *)&writefds,
1844                       NULL, timeoutp);
1845#endif
1846            if (i < 0) {
1847                BIO_printf(bio_err, "bad select %d\n",
1848                           get_last_socket_error());
1849                goto shut;
1850                /* goto end; */
1851            }
1852        }
1853
1854        if ((SSL_version(con) == DTLS1_VERSION)
1855            && DTLSv1_handle_timeout(con) > 0) {
1856            BIO_printf(bio_err, "TIMEOUT occured\n");
1857        }
1858
1859        if (!ssl_pending && FD_ISSET(SSL_get_fd(con), &writefds)) {
1860            k = SSL_write(con, &(cbuf[cbuf_off]), (unsigned int)cbuf_len);
1861            switch (SSL_get_error(con, k)) {
1862            case SSL_ERROR_NONE:
1863                cbuf_off += k;
1864                cbuf_len -= k;
1865                if (k <= 0)
1866                    goto end;
1867                /* we have done a  write(con,NULL,0); */
1868                if (cbuf_len <= 0) {
1869                    read_tty = 1;
1870                    write_ssl = 0;
1871                } else {        /* if (cbuf_len > 0) */
1872
1873                    read_tty = 0;
1874                    write_ssl = 1;
1875                }
1876                break;
1877            case SSL_ERROR_WANT_WRITE:
1878                BIO_printf(bio_c_out, "write W BLOCK\n");
1879                write_ssl = 1;
1880                read_tty = 0;
1881                break;
1882            case SSL_ERROR_WANT_READ:
1883                BIO_printf(bio_c_out, "write R BLOCK\n");
1884                write_tty = 0;
1885                read_ssl = 1;
1886                write_ssl = 0;
1887                break;
1888            case SSL_ERROR_WANT_X509_LOOKUP:
1889                BIO_printf(bio_c_out, "write X BLOCK\n");
1890                break;
1891            case SSL_ERROR_ZERO_RETURN:
1892                if (cbuf_len != 0) {
1893                    BIO_printf(bio_c_out, "shutdown\n");
1894                    ret = 0;
1895                    goto shut;
1896                } else {
1897                    read_tty = 1;
1898                    write_ssl = 0;
1899                    break;
1900                }
1901
1902            case SSL_ERROR_SYSCALL:
1903                if ((k != 0) || (cbuf_len != 0)) {
1904                    BIO_printf(bio_err, "write:errno=%d\n",
1905                               get_last_socket_error());
1906                    goto shut;
1907                } else {
1908                    read_tty = 1;
1909                    write_ssl = 0;
1910                }
1911                break;
1912            case SSL_ERROR_SSL:
1913                ERR_print_errors(bio_err);
1914                goto shut;
1915            }
1916        }
1917#if defined(OPENSSL_SYS_WINDOWS) || defined(OPENSSL_SYS_MSDOS) || defined(OPENSSL_SYS_NETWARE) || defined(OPENSSL_SYS_BEOS_R5) || defined(OPENSSL_SYS_VMS)
1918        /* Assume Windows/DOS/BeOS can always write */
1919        else if (!ssl_pending && write_tty)
1920#else
1921        else if (!ssl_pending && FD_ISSET(fileno_stdout(), &writefds))
1922#endif
1923        {
1924#ifdef CHARSET_EBCDIC
1925            ascii2ebcdic(&(sbuf[sbuf_off]), &(sbuf[sbuf_off]), sbuf_len);
1926#endif
1927            i = raw_write_stdout(&(sbuf[sbuf_off]), sbuf_len);
1928
1929            if (i <= 0) {
1930                BIO_printf(bio_c_out, "DONE\n");
1931                ret = 0;
1932                goto shut;
1933                /* goto end; */
1934            }
1935
1936            sbuf_len -= i;;
1937            sbuf_off += i;
1938            if (sbuf_len <= 0) {
1939                read_ssl = 1;
1940                write_tty = 0;
1941            }
1942        } else if (ssl_pending || FD_ISSET(SSL_get_fd(con), &readfds)) {
1943#ifdef RENEG
1944            {
1945                static int iiii;
1946                if (++iiii == 52) {
1947                    SSL_renegotiate(con);
1948                    iiii = 0;
1949                }
1950            }
1951#endif
1952#if 1
1953            k = SSL_read(con, sbuf, 1024 /* BUFSIZZ */ );
1954#else
1955/* Demo for pending and peek :-) */
1956            k = SSL_read(con, sbuf, 16);
1957            {
1958                char zbuf[10240];
1959                printf("read=%d pending=%d peek=%d\n", k, SSL_pending(con),
1960                       SSL_peek(con, zbuf, 10240));
1961            }
1962#endif
1963
1964            switch (SSL_get_error(con, k)) {
1965            case SSL_ERROR_NONE:
1966                if (k <= 0)
1967                    goto end;
1968                sbuf_off = 0;
1969                sbuf_len = k;
1970
1971                read_ssl = 0;
1972                write_tty = 1;
1973                break;
1974            case SSL_ERROR_WANT_WRITE:
1975                BIO_printf(bio_c_out, "read W BLOCK\n");
1976                write_ssl = 1;
1977                read_tty = 0;
1978                break;
1979            case SSL_ERROR_WANT_READ:
1980                BIO_printf(bio_c_out, "read R BLOCK\n");
1981                write_tty = 0;
1982                read_ssl = 1;
1983                if ((read_tty == 0) && (write_ssl == 0))
1984                    write_ssl = 1;
1985                break;
1986            case SSL_ERROR_WANT_X509_LOOKUP:
1987                BIO_printf(bio_c_out, "read X BLOCK\n");
1988                break;
1989            case SSL_ERROR_SYSCALL:
1990                ret = get_last_socket_error();
1991                if (c_brief)
1992                    BIO_puts(bio_err, "CONNECTION CLOSED BY SERVER\n");
1993                else
1994                    BIO_printf(bio_err, "read:errno=%d\n", ret);
1995                goto shut;
1996            case SSL_ERROR_ZERO_RETURN:
1997                BIO_printf(bio_c_out, "closed\n");
1998                ret = 0;
1999                goto shut;
2000            case SSL_ERROR_SSL:
2001                ERR_print_errors(bio_err);
2002                goto shut;
2003                /* break; */
2004            }
2005        }
2006#if defined(OPENSSL_SYS_WINDOWS) || defined(OPENSSL_SYS_MSDOS)
2007# if defined(OPENSSL_SYS_WINCE) || defined(OPENSSL_SYS_MSDOS)
2008        else if (_kbhit())
2009# else
2010        else if ((_kbhit())
2011                 || (WAIT_OBJECT_0 ==
2012                     WaitForSingleObject(GetStdHandle(STD_INPUT_HANDLE), 0)))
2013# endif
2014#elif defined (OPENSSL_SYS_NETWARE)
2015        else if (_kbhit())
2016#elif defined(OPENSSL_SYS_BEOS_R5)
2017        else if (stdin_set)
2018#else
2019        else if (FD_ISSET(fileno_stdin(), &readfds))
2020#endif
2021        {
2022            if (crlf) {
2023                int j, lf_num;
2024
2025                i = raw_read_stdin(cbuf, BUFSIZZ / 2);
2026                lf_num = 0;
2027                /* both loops are skipped when i <= 0 */
2028                for (j = 0; j < i; j++)
2029                    if (cbuf[j] == '\n')
2030                        lf_num++;
2031                for (j = i - 1; j >= 0; j--) {
2032                    cbuf[j + lf_num] = cbuf[j];
2033                    if (cbuf[j] == '\n') {
2034                        lf_num--;
2035                        i++;
2036                        cbuf[j + lf_num] = '\r';
2037                    }
2038                }
2039                assert(lf_num == 0);
2040            } else
2041                i = raw_read_stdin(cbuf, BUFSIZZ);
2042
2043            if ((!c_ign_eof) && ((i <= 0) || (cbuf[0] == 'Q'))) {
2044                BIO_printf(bio_err, "DONE\n");
2045                ret = 0;
2046                goto shut;
2047            }
2048
2049            if ((!c_ign_eof) && (cbuf[0] == 'R')) {
2050                BIO_printf(bio_err, "RENEGOTIATING\n");
2051                SSL_renegotiate(con);
2052                cbuf_len = 0;
2053            }
2054#ifndef OPENSSL_NO_HEARTBEATS
2055            else if ((!c_ign_eof) && (cbuf[0] == 'B')) {
2056                BIO_printf(bio_err, "HEARTBEATING\n");
2057                SSL_heartbeat(con);
2058                cbuf_len = 0;
2059            }
2060#endif
2061            else {
2062                cbuf_len = i;
2063                cbuf_off = 0;
2064#ifdef CHARSET_EBCDIC
2065                ebcdic2ascii(cbuf, cbuf, i);
2066#endif
2067            }
2068
2069            write_ssl = 1;
2070            read_tty = 0;
2071        }
2072    }
2073
2074    ret = 0;
2075 shut:
2076    if (in_init)
2077        print_stuff(bio_c_out, con, full_log);
2078    SSL_shutdown(con);
2079    SHUTDOWN(SSL_get_fd(con));
2080 end:
2081    if (con != NULL) {
2082        if (prexit != 0)
2083            print_stuff(bio_c_out, con, 1);
2084        SSL_free(con);
2085    }
2086#if !defined(OPENSSL_NO_TLSEXT) && !defined(OPENSSL_NO_NEXTPROTONEG)
2087    if (next_proto.data)
2088        OPENSSL_free(next_proto.data);
2089#endif
2090    if (ctx != NULL)
2091        SSL_CTX_free(ctx);
2092    if (cert)
2093        X509_free(cert);
2094    if (crls)
2095        sk_X509_CRL_pop_free(crls, X509_CRL_free);
2096    if (key)
2097        EVP_PKEY_free(key);
2098    if (chain)
2099        sk_X509_pop_free(chain, X509_free);
2100    if (pass)
2101        OPENSSL_free(pass);
2102#ifndef OPENSSL_NO_SRP
2103    OPENSSL_free(srp_arg.srppassin);
2104#endif
2105    if (vpm)
2106        X509_VERIFY_PARAM_free(vpm);
2107    ssl_excert_free(exc);
2108    if (ssl_args)
2109        sk_OPENSSL_STRING_free(ssl_args);
2110    if (cctx)
2111        SSL_CONF_CTX_free(cctx);
2112#ifndef OPENSSL_NO_JPAKE
2113    if (jpake_secret && psk_key)
2114        OPENSSL_free(psk_key);
2115#endif
2116    if (cbuf != NULL) {
2117        OPENSSL_cleanse(cbuf, BUFSIZZ);
2118        OPENSSL_free(cbuf);
2119    }
2120    if (sbuf != NULL) {
2121        OPENSSL_cleanse(sbuf, BUFSIZZ);
2122        OPENSSL_free(sbuf);
2123    }
2124    if (mbuf != NULL) {
2125        OPENSSL_cleanse(mbuf, BUFSIZZ);
2126        OPENSSL_free(mbuf);
2127    }
2128    release_engine(e);
2129    if (bio_c_out != NULL) {
2130        BIO_free(bio_c_out);
2131        bio_c_out = NULL;
2132    }
2133    if (bio_c_msg != NULL) {
2134        BIO_free(bio_c_msg);
2135        bio_c_msg = NULL;
2136    }
2137    SSL_COMP_free_compression_methods();
2138    apps_shutdown();
2139    OPENSSL_EXIT(ret);
2140}
2141
2142static void print_stuff(BIO *bio, SSL *s, int full)
2143{
2144    X509 *peer = NULL;
2145    char *p;
2146    static const char *space = "                ";
2147    char buf[BUFSIZ];
2148    STACK_OF(X509) *sk;
2149    STACK_OF(X509_NAME) *sk2;
2150    const SSL_CIPHER *c;
2151    X509_NAME *xn;
2152    int j, i;
2153#ifndef OPENSSL_NO_COMP
2154    const COMP_METHOD *comp, *expansion;
2155#endif
2156    unsigned char *exportedkeymat;
2157
2158    if (full) {
2159        int got_a_chain = 0;
2160
2161        sk = SSL_get_peer_cert_chain(s);
2162        if (sk != NULL) {
2163            got_a_chain = 1;    /* we don't have it for SSL2 (yet) */
2164
2165            BIO_printf(bio, "---\nCertificate chain\n");
2166            for (i = 0; i < sk_X509_num(sk); i++) {
2167                X509_NAME_oneline(X509_get_subject_name(sk_X509_value(sk, i)),
2168                                  buf, sizeof buf);
2169                BIO_printf(bio, "%2d s:%s\n", i, buf);
2170                X509_NAME_oneline(X509_get_issuer_name(sk_X509_value(sk, i)),
2171                                  buf, sizeof buf);
2172                BIO_printf(bio, "   i:%s\n", buf);
2173                if (c_showcerts)
2174                    PEM_write_bio_X509(bio, sk_X509_value(sk, i));
2175            }
2176        }
2177
2178        BIO_printf(bio, "---\n");
2179        peer = SSL_get_peer_certificate(s);
2180        if (peer != NULL) {
2181            BIO_printf(bio, "Server certificate\n");
2182
2183            /* Redundant if we showed the whole chain */
2184            if (!(c_showcerts && got_a_chain))
2185                PEM_write_bio_X509(bio, peer);
2186            X509_NAME_oneline(X509_get_subject_name(peer), buf, sizeof buf);
2187            BIO_printf(bio, "subject=%s\n", buf);
2188            X509_NAME_oneline(X509_get_issuer_name(peer), buf, sizeof buf);
2189            BIO_printf(bio, "issuer=%s\n", buf);
2190        } else
2191            BIO_printf(bio, "no peer certificate available\n");
2192
2193        sk2 = SSL_get_client_CA_list(s);
2194        if ((sk2 != NULL) && (sk_X509_NAME_num(sk2) > 0)) {
2195            BIO_printf(bio, "---\nAcceptable client certificate CA names\n");
2196            for (i = 0; i < sk_X509_NAME_num(sk2); i++) {
2197                xn = sk_X509_NAME_value(sk2, i);
2198                X509_NAME_oneline(xn, buf, sizeof(buf));
2199                BIO_write(bio, buf, strlen(buf));
2200                BIO_write(bio, "\n", 1);
2201            }
2202        } else {
2203            BIO_printf(bio, "---\nNo client certificate CA names sent\n");
2204        }
2205        p = SSL_get_shared_ciphers(s, buf, sizeof buf);
2206        if (p != NULL) {
2207            /*
2208             * This works only for SSL 2.  In later protocol versions, the
2209             * client does not know what other ciphers (in addition to the
2210             * one to be used in the current connection) the server supports.
2211             */
2212
2213            BIO_printf(bio,
2214                       "---\nCiphers common between both SSL endpoints:\n");
2215            j = i = 0;
2216            while (*p) {
2217                if (*p == ':') {
2218                    BIO_write(bio, space, 15 - j % 25);
2219                    i++;
2220                    j = 0;
2221                    BIO_write(bio, ((i % 3) ? " " : "\n"), 1);
2222                } else {
2223                    BIO_write(bio, p, 1);
2224                    j++;
2225                }
2226                p++;
2227            }
2228            BIO_write(bio, "\n", 1);
2229        }
2230
2231        ssl_print_sigalgs(bio, s);
2232        ssl_print_tmp_key(bio, s);
2233
2234        BIO_printf(bio,
2235                   "---\nSSL handshake has read %ld bytes and written %ld bytes\n",
2236                   BIO_number_read(SSL_get_rbio(s)),
2237                   BIO_number_written(SSL_get_wbio(s)));
2238    }
2239    BIO_printf(bio, (SSL_cache_hit(s) ? "---\nReused, " : "---\nNew, "));
2240    c = SSL_get_current_cipher(s);
2241    BIO_printf(bio, "%s, Cipher is %s\n",
2242               SSL_CIPHER_get_version(c), SSL_CIPHER_get_name(c));
2243    if (peer != NULL) {
2244        EVP_PKEY *pktmp;
2245        pktmp = X509_get_pubkey(peer);
2246        BIO_printf(bio, "Server public key is %d bit\n",
2247                   EVP_PKEY_bits(pktmp));
2248        EVP_PKEY_free(pktmp);
2249    }
2250    BIO_printf(bio, "Secure Renegotiation IS%s supported\n",
2251               SSL_get_secure_renegotiation_support(s) ? "" : " NOT");
2252#ifndef OPENSSL_NO_COMP
2253    comp = SSL_get_current_compression(s);
2254    expansion = SSL_get_current_expansion(s);
2255    BIO_printf(bio, "Compression: %s\n",
2256               comp ? SSL_COMP_get_name(comp) : "NONE");
2257    BIO_printf(bio, "Expansion: %s\n",
2258               expansion ? SSL_COMP_get_name(expansion) : "NONE");
2259#endif
2260
2261#ifdef SSL_DEBUG
2262    {
2263        /* Print out local port of connection: useful for debugging */
2264        int sock;
2265        struct sockaddr_in ladd;
2266        socklen_t ladd_size = sizeof(ladd);
2267        sock = SSL_get_fd(s);
2268        getsockname(sock, (struct sockaddr *)&ladd, &ladd_size);
2269        BIO_printf(bio_c_out, "LOCAL PORT is %u\n", ntohs(ladd.sin_port));
2270    }
2271#endif
2272
2273#if !defined(OPENSSL_NO_TLSEXT)
2274# if !defined(OPENSSL_NO_NEXTPROTONEG)
2275    if (next_proto.status != -1) {
2276        const unsigned char *proto;
2277        unsigned int proto_len;
2278        SSL_get0_next_proto_negotiated(s, &proto, &proto_len);
2279        BIO_printf(bio, "Next protocol: (%d) ", next_proto.status);
2280        BIO_write(bio, proto, proto_len);
2281        BIO_write(bio, "\n", 1);
2282    }
2283# endif
2284    {
2285        const unsigned char *proto;
2286        unsigned int proto_len;
2287        SSL_get0_alpn_selected(s, &proto, &proto_len);
2288        if (proto_len > 0) {
2289            BIO_printf(bio, "ALPN protocol: ");
2290            BIO_write(bio, proto, proto_len);
2291            BIO_write(bio, "\n", 1);
2292        } else
2293            BIO_printf(bio, "No ALPN negotiated\n");
2294    }
2295#endif
2296
2297#ifndef OPENSSL_NO_SRTP
2298    {
2299        SRTP_PROTECTION_PROFILE *srtp_profile =
2300            SSL_get_selected_srtp_profile(s);
2301
2302        if (srtp_profile)
2303            BIO_printf(bio, "SRTP Extension negotiated, profile=%s\n",
2304                       srtp_profile->name);
2305    }
2306#endif
2307
2308    SSL_SESSION_print(bio, SSL_get_session(s));
2309    if (keymatexportlabel != NULL) {
2310        BIO_printf(bio, "Keying material exporter:\n");
2311        BIO_printf(bio, "    Label: '%s'\n", keymatexportlabel);
2312        BIO_printf(bio, "    Length: %i bytes\n", keymatexportlen);
2313        exportedkeymat = OPENSSL_malloc(keymatexportlen);
2314        if (exportedkeymat != NULL) {
2315            if (!SSL_export_keying_material(s, exportedkeymat,
2316                                            keymatexportlen,
2317                                            keymatexportlabel,
2318                                            strlen(keymatexportlabel),
2319                                            NULL, 0, 0)) {
2320                BIO_printf(bio, "    Error\n");
2321            } else {
2322                BIO_printf(bio, "    Keying material: ");
2323                for (i = 0; i < keymatexportlen; i++)
2324                    BIO_printf(bio, "%02X", exportedkeymat[i]);
2325                BIO_printf(bio, "\n");
2326            }
2327            OPENSSL_free(exportedkeymat);
2328        }
2329    }
2330    BIO_printf(bio, "---\n");
2331    if (peer != NULL)
2332        X509_free(peer);
2333    /* flush, or debugging output gets mixed with http response */
2334    (void)BIO_flush(bio);
2335}
2336
2337#ifndef OPENSSL_NO_TLSEXT
2338
2339static int ocsp_resp_cb(SSL *s, void *arg)
2340{
2341    const unsigned char *p;
2342    int len;
2343    OCSP_RESPONSE *rsp;
2344    len = SSL_get_tlsext_status_ocsp_resp(s, &p);
2345    BIO_puts(arg, "OCSP response: ");
2346    if (!p) {
2347        BIO_puts(arg, "no response sent\n");
2348        return 1;
2349    }
2350    rsp = d2i_OCSP_RESPONSE(NULL, &p, len);
2351    if (!rsp) {
2352        BIO_puts(arg, "response parse error\n");
2353        BIO_dump_indent(arg, (char *)p, len, 4);
2354        return 0;
2355    }
2356    BIO_puts(arg, "\n======================================\n");
2357    OCSP_RESPONSE_print(arg, rsp, 0);
2358    BIO_puts(arg, "======================================\n");
2359    OCSP_RESPONSE_free(rsp);
2360    return 1;
2361}
2362
2363#endif
2364