s_client.c 115.6 KB
Newer Older
R
Rich Salz 已提交
1
/*
M
Matt Caswell 已提交
2
 * Copyright 1995-2020 The OpenSSL Project Authors. All Rights Reserved.
3
 * Copyright 2005 Nokia. All rights reserved.
4
 *
5
 * Licensed under the Apache License 2.0 (the "License").  You may not use
R
Rich Salz 已提交
6 7 8
 * this file except in compliance with the License.  You can obtain a copy
 * in the file LICENSE in the source distribution or at
 * https://www.openssl.org/source/license.html
9
 */
R
Rich Salz 已提交
10

11
#include "e_os.h"
12
#include <ctype.h>
U
Ulf Möller 已提交
13 14 15
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
V
Viktor Dukhovni 已提交
16
#include <errno.h>
17
#include <openssl/e_os2.h>
18

M
Matt Caswell 已提交
19 20
#ifndef OPENSSL_NO_SOCK

21 22 23 24 25 26
/*
 * With IPv6, it looks like Digital has mixed up the proper order of
 * recursive header file inclusion, resulting in the compiler complaining
 * that u_int isn't defined, but only if _POSIX_C_SOURCE is defined, which is
 * needed to have fileno() declared correctly...  So let's define u_int
 */
27
#if defined(OPENSSL_SYS_VMS_DECC) && !defined(__U_INT)
28
# define __U_INT
U
Ulf Möller 已提交
29 30 31
typedef unsigned int u_int;
#endif

32
#include "apps.h"
33
#include "progs.h"
34 35 36 37
#include <openssl/x509.h>
#include <openssl/ssl.h>
#include <openssl/err.h>
#include <openssl/pem.h>
38
#include <openssl/rand.h>
39
#include <openssl/ocsp.h>
40
#include <openssl/bn.h>
41
#include <openssl/trace.h>
M
Matt Caswell 已提交
42
#include <openssl/async.h>
B
Ben Laurie 已提交
43
#ifndef OPENSSL_NO_SRP
44
# include <openssl/srp.h>
B
Ben Laurie 已提交
45
#endif
46 47 48
#ifndef OPENSSL_NO_CT
# include <openssl/ct.h>
#endif
49
#include "s_apps.h"
B
Ben Laurie 已提交
50
#include "timeouts.h"
R
Rich Salz 已提交
51
#include "internal/sockets.h"
52

53 54 55 56 57 58
#if defined(__has_feature)
# if __has_feature(memory_sanitizer)
#  include <sanitizer/msan_interface.h>
# endif
#endif

59 60 61 62 63 64
DEFINE_STACK_OF(X509)
DEFINE_STACK_OF(X509_CRL)
DEFINE_STACK_OF(X509_NAME)
DEFINE_STACK_OF(SCT)
DEFINE_STACK_OF_STRING()

65 66
#undef BUFSIZZ
#define BUFSIZZ 1024*8
67
#define S_CLIENT_IRC_READ_TIMEOUT 8
68

V
Viktor Dukhovni 已提交
69
static char *prog;
70
static int c_debug = 0;
71 72 73 74 75
static int c_showcerts = 0;
static char *keymatexportlabel = NULL;
static int keymatexportlen = 20;
static BIO *bio_c_out = NULL;
static int c_quiet = 0;
76
static char *sess_out = NULL;
77
static SSL_SESSION *psksess = NULL;
78

R
Rob Percival 已提交
79
static void print_stuff(BIO *berr, SSL *con, int full);
M
Matt Caswell 已提交
80
#ifndef OPENSSL_NO_OCSP
81
static int ocsp_resp_cb(SSL *s, void *arg);
M
Matt Caswell 已提交
82
#endif
83
static int ldap_ExtendedResponse_parse(const char *buf, long rem);
84
static int is_dNS_name(const char *host);
85

V
Viktor Dukhovni 已提交
86 87 88 89 90 91 92 93 94 95 96 97 98 99 100
static int saved_errno;

static void save_errno(void)
{
    saved_errno = errno;
    errno = 0;
}

static int restore_errno(void)
{
    int ret = errno;
    errno = saved_errno;
    return ret;
}

M
Matt Caswell 已提交
101 102 103 104 105 106 107 108 109 110 111 112
static void do_ssl_shutdown(SSL *ssl)
{
    int ret;

    do {
        /* We only do unidirectional shutdown */
        ret = SSL_shutdown(ssl);
        if (ret < 0) {
            switch (SSL_get_error(ssl, ret)) {
            case SSL_ERROR_WANT_READ:
            case SSL_ERROR_WANT_WRITE:
            case SSL_ERROR_WANT_ASYNC:
M
Matt Caswell 已提交
113
            case SSL_ERROR_WANT_ASYNC_JOB:
M
Matt Caswell 已提交
114 115 116 117 118 119 120 121
                /* We just do busy waiting. Nothing clever */
                continue;
            }
            ret = 0;
        }
    } while (ret < 0);
}

122
/* Default PSK identity and key */
123
static char *psk_identity = "Client_identity";
124

M
Matt Caswell 已提交
125
#ifndef OPENSSL_NO_PSK
126
static unsigned int psk_client_cb(SSL *ssl, const char *hint, char *identity,
127 128 129 130 131
                                  unsigned int max_identity_len,
                                  unsigned char *psk,
                                  unsigned int max_psk_len)
{
    int ret;
132 133
    long key_len;
    unsigned char *key;
134 135 136 137 138 139 140 141

    if (c_debug)
        BIO_printf(bio_c_out, "psk_client_cb\n");
    if (!hint) {
        /* no ServerKeyExchange message */
        if (c_debug)
            BIO_printf(bio_c_out,
                       "NULL received PSK identity hint, continuing anyway\n");
142
    } else if (c_debug) {
143
        BIO_printf(bio_c_out, "Received PSK identity hint '%s'\n", hint);
144
    }
145 146 147 148 149 150 151 152 153 154

    /*
     * lookup PSK identity and PSK key based on the given identity hint here
     */
    ret = BIO_snprintf(identity, max_identity_len, "%s", psk_identity);
    if (ret < 0 || (unsigned int)ret > max_identity_len)
        goto out_err;
    if (c_debug)
        BIO_printf(bio_c_out, "created identity '%s' len=%d\n", identity,
                   ret);
155 156 157 158 159

    /* convert the PSK key to binary */
    key = OPENSSL_hexstr2buf(psk_key, &key_len);
    if (key == NULL) {
        BIO_printf(bio_err, "Could not convert PSK key '%s' to buffer\n",
160 161 162
                   psk_key);
        return 0;
    }
B
Benjamin Kaduk 已提交
163
    if (max_psk_len > INT_MAX || key_len > (long)max_psk_len) {
164
        BIO_printf(bio_err,
165 166 167
                   "psk buffer of callback is too small (%d) for key (%ld)\n",
                   max_psk_len, key_len);
        OPENSSL_free(key);
168 169
        return 0;
    }
170

171 172
    memcpy(psk, key, key_len);
    OPENSSL_free(key);
173

174
    if (c_debug)
175
        BIO_printf(bio_c_out, "created PSK len=%ld\n", key_len);
176

177
    return key_len;
178
 out_err:
179 180 181 182
    if (c_debug)
        BIO_printf(bio_err, "Error in PSK client callback\n");
    return 0;
}
183 184
#endif

185 186
const unsigned char tls13_aes128gcmsha256_id[] = { 0x13, 0x01 };
const unsigned char tls13_aes256gcmsha384_id[] = { 0x13, 0x02 };
187

188 189 190 191
static int psk_use_session_cb(SSL *s, const EVP_MD *md,
                              const unsigned char **id, size_t *idlen,
                              SSL_SESSION **sess)
{
192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207
    SSL_SESSION *usesess = NULL;
    const SSL_CIPHER *cipher = NULL;

    if (psksess != NULL) {
        SSL_SESSION_up_ref(psksess);
        usesess = psksess;
    } else {
        long key_len;
        unsigned char *key = OPENSSL_hexstr2buf(psk_key, &key_len);

        if (key == NULL) {
            BIO_printf(bio_err, "Could not convert PSK key '%s' to buffer\n",
                       psk_key);
            return 0;
        }

208 209
        /* We default to SHA-256 */
        cipher = SSL_CIPHER_find(s, tls13_aes128gcmsha256_id);
210
        if (cipher == NULL) {
211
            BIO_printf(bio_err, "Error finding suitable ciphersuite\n");
212
            OPENSSL_free(key);
213
            return 0;
214
        }
215

216 217 218 219 220 221 222 223 224 225 226 227
        usesess = SSL_SESSION_new();
        if (usesess == NULL
                || !SSL_SESSION_set1_master_key(usesess, key, key_len)
                || !SSL_SESSION_set_cipher(usesess, cipher)
                || !SSL_SESSION_set_protocol_version(usesess, TLS1_3_VERSION)) {
            OPENSSL_free(key);
            goto err;
        }
        OPENSSL_free(key);
    }

    cipher = SSL_SESSION_get0_cipher(usesess);
228
    if (cipher == NULL)
229
        goto err;
230

231 232 233 234 235 236 237 238 239 240 241
    if (md != NULL && SSL_CIPHER_get_handshake_digest(cipher) != md) {
        /* PSK not usable, ignore it */
        *id = NULL;
        *idlen = 0;
        *sess = NULL;
        SSL_SESSION_free(usesess);
    } else {
        *sess = usesess;
        *id = (unsigned char *)psk_identity;
        *idlen = strlen(psk_identity);
    }
242 243

    return 1;
244 245 246 247

 err:
    SSL_SESSION_free(usesess);
    return 0;
248 249
}

250 251
/* This is a context that we pass to callbacks */
typedef struct tlsextctx_st {
252 253
    BIO *biodebug;
    int ack;
254 255
} tlsextctx;

R
Rich Salz 已提交
256
static int ssl_servername_cb(SSL *s, int *ad, void *arg)
257 258 259 260 261 262 263 264 265 266
{
    tlsextctx *p = (tlsextctx *) arg;
    const char *hn = SSL_get_servername(s, TLSEXT_NAMETYPE_host_name);
    if (SSL_get_servername_type(s) != -1)
        p->ack = !SSL_session_reused(s) && hn != NULL;
    else
        BIO_printf(bio_err, "Can't use SSL_get_servername\n");

    return SSL_TLSEXT_ERR_OK;
}
B
Ben Laurie 已提交
267

268
#ifndef OPENSSL_NO_SRP
B
Ben Laurie 已提交
269 270

/* This is a context that we pass to all callbacks */
271 272 273 274 275 276
typedef struct srp_arg_st {
    char *srppassin;
    char *srplogin;
    int msg;                    /* copy from c_msg */
    int debug;                  /* copy from c_debug */
    int amp;                    /* allow more groups */
277
    int strength;               /* minimal size for N */
278 279
} SRP_ARG;

D
Dr. Stephen Henson 已提交
280
static int srp_Verify_N_and_g(const BIGNUM *N, const BIGNUM *g)
281 282 283 284 285 286
{
    BN_CTX *bn_ctx = BN_CTX_new();
    BIGNUM *p = BN_new();
    BIGNUM *r = BN_new();
    int ret =
        g != NULL && N != NULL && bn_ctx != NULL && BN_is_odd(N) &&
K
Kurt Roeckx 已提交
287
        BN_check_prime(N, bn_ctx, NULL) == 1 &&
288 289
        p != NULL && BN_rshift1(p, N) &&
        /* p = (N-1)/2 */
K
Kurt Roeckx 已提交
290
        BN_check_prime(p, bn_ctx, NULL) == 1 &&
291 292 293 294 295
        r != NULL &&
        /* verify g^((N-1)/2) == -1 (mod N) */
        BN_mod_exp(r, g, p, N, bn_ctx) &&
        BN_add_word(r, 1) && BN_cmp(r, N) == 0;

R
Rich Salz 已提交
296 297 298
    BN_free(r);
    BN_free(p);
    BN_CTX_free(bn_ctx);
299 300
    return ret;
}
B
Ben Laurie 已提交
301

302 303 304 305 306 307 308
/*-
 * This callback is used here for two purposes:
 * - extended debugging
 * - making some primality tests for unknown groups
 * The callback is only called for a non default group.
 *
 * An application does not need the call back at all if
309
 * only the standard groups are used.  In real life situations,
310 311
 * client and server already share well known groups,
 * thus there is no need to verify them.
312
 * Furthermore, in case that a server actually proposes a group that
313 314
 * is not one of those defined in RFC 5054, it is more appropriate
 * to add the group to a static list and then compare since
315 316
 * primality tests are rather cpu consuming.
 */
D
Dr. Stephen Henson 已提交
317

R
Rich Salz 已提交
318
static int ssl_srp_verify_param_cb(SSL *s, void *arg)
319 320 321
{
    SRP_ARG *srp_arg = (SRP_ARG *)arg;
    BIGNUM *N = NULL, *g = NULL;
322 323

    if (((N = SSL_get_srp_N(s)) == NULL) || ((g = SSL_get_srp_g(s)) == NULL))
324 325 326 327 328 329 330 331 332 333 334 335 336 337 338 339 340 341 342 343 344 345 346 347 348 349 350 351 352
        return 0;
    if (srp_arg->debug || srp_arg->msg || srp_arg->amp == 1) {
        BIO_printf(bio_err, "SRP parameters:\n");
        BIO_printf(bio_err, "\tN=");
        BN_print(bio_err, N);
        BIO_printf(bio_err, "\n\tg=");
        BN_print(bio_err, g);
        BIO_printf(bio_err, "\n");
    }

    if (SRP_check_known_gN_param(g, N))
        return 1;

    if (srp_arg->amp == 1) {
        if (srp_arg->debug)
            BIO_printf(bio_err,
                       "SRP param N and g are not known params, going to check deeper.\n");

        /*
         * The srp_moregroups is a real debugging feature. Implementors
         * should rather add the value to the known ones. The minimal size
         * has already been tested.
         */
        if (BN_num_bits(g) <= BN_BITS && srp_Verify_N_and_g(N, g))
            return 1;
    }
    BIO_printf(bio_err, "SRP param N and g rejected.\n");
    return 0;
}
B
Ben Laurie 已提交
353

354
# define PWD_STRLEN 1024
355 356 357 358

static char *ssl_give_srp_client_pwd_cb(SSL *s, void *arg)
{
    SRP_ARG *srp_arg = (SRP_ARG *)arg;
R
Rich Salz 已提交
359
    char *pass = app_malloc(PWD_STRLEN + 1, "SRP password buffer");
360 361 362 363 364 365 366 367 368 369 370 371 372 373 374
    PW_CB_DATA cb_tmp;
    int l;

    cb_tmp.password = (char *)srp_arg->srppassin;
    cb_tmp.prompt_info = "SRP user";
    if ((l = password_callback(pass, PWD_STRLEN, 0, &cb_tmp)) < 0) {
        BIO_printf(bio_err, "Can't read Password\n");
        OPENSSL_free(pass);
        return NULL;
    }
    *(pass + l) = '\0';

    return pass;
}

375
#endif
376

377
#ifndef OPENSSL_NO_NEXTPROTONEG
B
Ben Laurie 已提交
378 379
/* This the context that we pass to next_proto_cb */
typedef struct tlsextnextprotoctx_st {
380
    unsigned char *data;
T
Todd Short 已提交
381
    size_t len;
382
    int status;
B
Ben Laurie 已提交
383 384 385 386
} tlsextnextprotoctx;

static tlsextnextprotoctx next_proto;

387 388 389 390 391 392 393 394 395 396 397 398 399 400 401 402 403 404 405 406 407 408 409
static int next_proto_cb(SSL *s, unsigned char **out, unsigned char *outlen,
                         const unsigned char *in, unsigned int inlen,
                         void *arg)
{
    tlsextnextprotoctx *ctx = arg;

    if (!c_quiet) {
        /* We can assume that |in| is syntactically valid. */
        unsigned i;
        BIO_printf(bio_c_out, "Protocols advertised by server: ");
        for (i = 0; i < inlen;) {
            if (i)
                BIO_write(bio_c_out, ", ", 2);
            BIO_write(bio_c_out, &in[i + 1], in[i]);
            i += in[i] + 1;
        }
        BIO_write(bio_c_out, "\n", 1);
    }

    ctx->status =
        SSL_select_next_proto(out, outlen, in, inlen, ctx->data, ctx->len);
    return SSL_TLSEXT_ERR_OK;
}
410
#endif                         /* ndef OPENSSL_NO_NEXTPROTONEG */
411 412 413 414

static int serverinfo_cli_parse_cb(SSL *s, unsigned int ext_type,
                                   const unsigned char *in, size_t inlen,
                                   int *al, void *arg)
415
{
416 417 418 419
    char pem_name[100];
    unsigned char ext_buf[4 + 65536];

    /* Reconstruct the type/len fields prior to extension data */
420 421 422 423 424
    inlen &= 0xffff; /* for formal memcmpy correctness */
    ext_buf[0] = (unsigned char)(ext_type >> 8);
    ext_buf[1] = (unsigned char)(ext_type);
    ext_buf[2] = (unsigned char)(inlen >> 8);
    ext_buf[3] = (unsigned char)(inlen);
425 426 427 428 429 430 431 432
    memcpy(ext_buf + 4, in, inlen);

    BIO_snprintf(pem_name, sizeof(pem_name), "SERVERINFO FOR EXTENSION %d",
                 ext_type);
    PEM_write_bio(bio_c_out, pem_name, "", ext_buf, 4 + inlen);
    return 1;
}

V
Viktor Dukhovni 已提交
433 434 435 436 437 438 439 440
/*
 * Hex decoder that tolerates optional whitespace.  Returns number of bytes
 * produced, advances inptr to end of input string.
 */
static ossl_ssize_t hexdecode(const char **inptr, void *result)
{
    unsigned char **out = (unsigned char **)result;
    const char *in = *inptr;
F
FdaSilvaYY 已提交
441
    unsigned char *ret = app_malloc(strlen(in) / 2, "hexdecode");
V
Viktor Dukhovni 已提交
442 443 444 445 446 447 448 449
    unsigned char *cp = ret;
    uint8_t byte;
    int nibble = 0;

    if (ret == NULL)
        return -1;

    for (byte = 0; *in; ++in) {
R
Rich Salz 已提交
450
        int x;
V
Viktor Dukhovni 已提交
451

452
        if (isspace(_UC(*in)))
V
Viktor Dukhovni 已提交
453
            continue;
R
Rich Salz 已提交
454 455
        x = OPENSSL_hexchar2int(*in);
        if (x < 0) {
V
Viktor Dukhovni 已提交
456 457 458
            OPENSSL_free(ret);
            return 0;
        }
R
Rich Salz 已提交
459
        byte |= (char)x;
V
Viktor Dukhovni 已提交
460 461 462 463 464 465 466 467 468 469 470 471 472 473 474 475 476 477 478 479 480 481 482 483 484 485 486 487 488 489 490 491 492
        if ((nibble ^= 1) == 0) {
            *cp++ = byte;
            byte = 0;
        } else {
            byte <<= 4;
        }
    }
    if (nibble != 0) {
        OPENSSL_free(ret);
        return 0;
    }
    *inptr = in;

    return cp - (*out = ret);
}

/*
 * Decode unsigned 0..255, returns 1 on success, <= 0 on failure. Advances
 * inptr to next field skipping leading whitespace.
 */
static ossl_ssize_t checked_uint8(const char **inptr, void *out)
{
    uint8_t *result = (uint8_t *)out;
    const char *in = *inptr;
    char *endp;
    long v;
    int e;

    save_errno();
    v = strtol(in, &endp, 10);
    e = restore_errno();

    if (((v == LONG_MIN || v == LONG_MAX) && e == ERANGE) ||
493
        endp == in || !isspace(_UC(*endp)) ||
V
Viktor Dukhovni 已提交
494 495 496
        v != (*result = (uint8_t) v)) {
        return -1;
    }
497
    for (in = endp; isspace(_UC(*in)); ++in)
V
Viktor Dukhovni 已提交
498 499 500 501 502 503
        continue;

    *inptr = in;
    return 1;
}

R
Rich Salz 已提交
504 505 506 507 508 509
struct tlsa_field {
    void *var;
    const char *name;
    ossl_ssize_t (*parser)(const char **, void *);
};

V
Viktor Dukhovni 已提交
510 511
static int tlsa_import_rr(SSL *con, const char *rrdata)
{
R
Rich Salz 已提交
512 513 514 515 516
    /* Not necessary to re-init these values; the "parsers" do that. */
    static uint8_t usage;
    static uint8_t selector;
    static uint8_t mtype;
    static unsigned char *data;
R
Rich Salz 已提交
517
    static struct tlsa_field tlsa_fields[] = {
V
Viktor Dukhovni 已提交
518 519 520 521 522 523 524
        { &usage, "usage", checked_uint8 },
        { &selector, "selector", checked_uint8 },
        { &mtype, "mtype", checked_uint8 },
        { &data, "data", hexdecode },
        { NULL, }
    };
    struct tlsa_field *f;
R
Rich Salz 已提交
525 526 527
    int ret;
    const char *cp = rrdata;
    ossl_ssize_t len = 0;
V
Viktor Dukhovni 已提交
528 529 530 531 532 533 534 535 536 537 538 539 540 541 542 543 544 545 546 547 548 549 550 551 552 553 554 555 556 557 558 559 560 561 562 563 564 565 566 567 568 569

    for (f = tlsa_fields; f->var; ++f) {
        /* Returns number of bytes produced, advances cp to next field */
        if ((len = f->parser(&cp, f->var)) <= 0) {
            BIO_printf(bio_err, "%s: warning: bad TLSA %s field in: %s\n",
                       prog, f->name, rrdata);
            return 0;
        }
    }
    /* The data field is last, so len is its length */
    ret = SSL_dane_tlsa_add(con, usage, selector, mtype, data, len);
    OPENSSL_free(data);

    if (ret == 0) {
        ERR_print_errors(bio_err);
        BIO_printf(bio_err, "%s: warning: unusable TLSA rrdata: %s\n",
                   prog, rrdata);
        return 0;
    }
    if (ret < 0) {
        ERR_print_errors(bio_err);
        BIO_printf(bio_err, "%s: warning: error loading TLSA rrdata: %s\n",
                   prog, rrdata);
        return 0;
    }
    return ret;
}

static int tlsa_import_rrset(SSL *con, STACK_OF(OPENSSL_STRING) *rrset)
{
    int num = sk_OPENSSL_STRING_num(rrset);
    int count = 0;
    int i;

    for (i = 0; i < num; ++i) {
        char *rrdata = sk_OPENSSL_STRING_value(rrset, i);
        if (tlsa_import_rr(con, rrdata) > 0)
            ++count;
    }
    return count > 0;
}

570 571
typedef enum OPTION_choice {
    OPT_ERR = -1, OPT_EOF = 0, OPT_HELP,
572
    OPT_4, OPT_6, OPT_HOST, OPT_PORT, OPT_CONNECT, OPT_BIND, OPT_UNIX,
573
    OPT_XMPPHOST, OPT_VERIFY, OPT_NAMEOPT,
574 575 576
    OPT_CERT, OPT_CRL, OPT_CRL_DOWNLOAD, OPT_SESS_OUT, OPT_SESS_IN,
    OPT_CERTFORM, OPT_CRLFORM, OPT_VERIFY_RET_ERROR, OPT_VERIFY_QUIET,
    OPT_BRIEF, OPT_PREXIT, OPT_CRLF, OPT_QUIET, OPT_NBIO,
R
Rich Salz 已提交
577
    OPT_SSL_CLIENT_ENGINE, OPT_IGN_EOF, OPT_NO_IGN_EOF,
R
Rich Salz 已提交
578
    OPT_DEBUG, OPT_TLSEXTDEBUG, OPT_STATUS, OPT_WDEBUG,
579 580
    OPT_MSG, OPT_MSGFILE, OPT_ENGINE, OPT_TRACE, OPT_SECURITY_DEBUG,
    OPT_SECURITY_DEBUG_VERBOSE, OPT_SHOWCERTS, OPT_NBIO_TEST, OPT_STATE,
581
    OPT_PSK_IDENTITY, OPT_PSK, OPT_PSK_SESS,
582 583 584 585 586
#ifndef OPENSSL_NO_SRP
    OPT_SRPUSER, OPT_SRPPASS, OPT_SRP_STRENGTH, OPT_SRP_LATEUSER,
    OPT_SRP_MOREGROUPS,
#endif
    OPT_SSL3, OPT_SSL_CONFIG,
587
    OPT_TLS1_3, OPT_TLS1_2, OPT_TLS1_1, OPT_TLS1, OPT_DTLS, OPT_DTLS1,
M
Matt Caswell 已提交
588
    OPT_DTLS1_2, OPT_SCTP, OPT_TIMEOUT, OPT_MTU, OPT_KEYFORM, OPT_PASS,
589 590 591 592 593
    OPT_CERT_CHAIN, OPT_KEY, OPT_RECONNECT, OPT_BUILD_CHAIN,
    OPT_NEXTPROTONEG, OPT_ALPN,
    OPT_CAPATH, OPT_NOCAPATH, OPT_CHAINCAPATH, OPT_VERIFYCAPATH,
    OPT_CAFILE, OPT_NOCAFILE, OPT_CHAINCAFILE, OPT_VERIFYCAFILE,
    OPT_CASTORE, OPT_NOCASTORE, OPT_CHAINCASTORE, OPT_VERIFYCASTORE,
594
    OPT_SERVERINFO, OPT_STARTTLS, OPT_SERVERNAME, OPT_NOSERVERNAME, OPT_ASYNC,
595
    OPT_USE_SRTP, OPT_KEYMATEXPORT, OPT_KEYMATEXPORTLEN, OPT_PROTOHOST,
596 597
    OPT_MAXFRAGLEN, OPT_MAX_SEND_FRAG, OPT_SPLIT_SEND_FRAG, OPT_MAX_PIPELINES,
    OPT_READ_BUF, OPT_KEYLOG_FILE, OPT_EARLY_DATA, OPT_REQCAFILE,
598 599 600
    OPT_V_ENUM,
    OPT_X_ENUM,
    OPT_S_ENUM,
601 602
    OPT_FALLBACKSCSV, OPT_NOCMDS, OPT_PROXY, OPT_PROXY_USER, OPT_PROXY_PASS,
    OPT_DANE_TLSA_DOMAIN,
603
#ifndef OPENSSL_NO_CT
604
    OPT_CT, OPT_NOCT, OPT_CTLOG_FILE,
605
#endif
R
Rich Salz 已提交
606
    OPT_DANE_TLSA_RRDATA, OPT_DANE_EE_NO_NAME,
607
    OPT_ENABLE_PHA,
608
    OPT_SCTP_LABEL_BUG,
609
    OPT_R_ENUM, OPT_PROV_ENUM
610 611
} OPTION_CHOICE;

F
FdaSilvaYY 已提交
612
const OPTIONS s_client_options[] = {
R
Rich Salz 已提交
613 614
    {OPT_HELP_STR, 1, '-', "Usage: %s [options] [host:port]\n"},

R
Rich Salz 已提交
615
    OPT_SECTION("General"),
616
    {"help", OPT_HELP, '-', "Display this summary"},
R
Rich Salz 已提交
617 618 619 620 621
#ifndef OPENSSL_NO_ENGINE
    {"engine", OPT_ENGINE, 's', "Use engine, possibly a hardware device"},
    {"ssl_client_engine", OPT_SSL_CLIENT_ENGINE, 's',
     "Specify engine to be used for client certificate operations"},
#endif
622
    {"ssl_config", OPT_SSL_CONFIG, 's', "Use specified section for SSL_CTX configuration"},
R
Rich Salz 已提交
623 624 625 626 627 628 629
#ifndef OPENSSL_NO_CT
    {"ct", OPT_CT, '-', "Request and parse SCTs (also enables OCSP stapling)"},
    {"noct", OPT_NOCT, '-', "Do not request or parse SCTs (default)"},
    {"ctlogfile", OPT_CTLOG_FILE, '<', "CT log list CONF file"},
#endif

    OPT_SECTION("Network"),
630 631 632
    {"host", OPT_HOST, 's', "Use -connect instead"},
    {"port", OPT_PORT, 'p', "Use -connect instead"},
    {"connect", OPT_CONNECT, 's',
633
     "TCP/IP where to connect (default is :" PORT ")"},
634
    {"bind", OPT_BIND, 's', "bind local address for connection"},
635 636
    {"proxy", OPT_PROXY, 's',
     "Connect to via specified proxy to the real server"},
637 638
    {"proxy_user", OPT_PROXY_USER, 's', "UserID for proxy authentication"},
    {"proxy_pass", OPT_PROXY_PASS, 's', "Proxy authentication password source"},
639
#ifdef AF_UNIX
640
    {"unix", OPT_UNIX, 's', "Connect over the specified Unix-domain socket"},
641 642
#endif
    {"4", OPT_4, '-', "Use IPv4 only"},
643
#ifdef AF_INET6
644
    {"6", OPT_6, '-', "Use IPv6 only"},
645
#endif
R
Rich Salz 已提交
646 647 648 649 650 651 652 653 654 655 656 657
    {"maxfraglen", OPT_MAXFRAGLEN, 'p',
     "Enable Maximum Fragment Length Negotiation (len values: 512, 1024, 2048 and 4096)"},
    {"max_send_frag", OPT_MAX_SEND_FRAG, 'p', "Maximum Size of send frames "},
    {"split_send_frag", OPT_SPLIT_SEND_FRAG, 'p',
     "Size used to split data for encrypt pipelines"},
    {"max_pipelines", OPT_MAX_PIPELINES, 'p',
     "Maximum number of encrypt/decrypt pipelines to be used"},
    {"read_buf", OPT_READ_BUF, 'p',
     "Default read buffer size to be used for connections"},
    {"fallback_scsv", OPT_FALLBACKSCSV, '-', "Send the fallback SCSV"},

    OPT_SECTION("Identity"),
658
    {"cert", OPT_CERT, '<', "Client certificate file to use"},
659
    {"certform", OPT_CERTFORM, 'F',
660 661 662 663 664
     "Client certificate file format (PEM or DER) PEM default"},
    {"cert_chain", OPT_CERT_CHAIN, '<',
     "Client certificate chain file (in PEM format)"},
    {"build_chain", OPT_BUILD_CHAIN, '-', "Build client certificate chain"},
    {"key", OPT_KEY, 's', "Private key file to use; default is: -cert file"},
665
    {"keyform", OPT_KEYFORM, 'E', "Key format (PEM, DER or engine) PEM default"},
666
    {"pass", OPT_PASS, 's', "Private key file pass phrase source"},
667 668
    {"verify", OPT_VERIFY, 'p', "Turn on peer certificate verification"},
    {"nameopt", OPT_NAMEOPT, 's', "Certificate subject/issuer name printing options"},
669 670
    {"CApath", OPT_CAPATH, '/', "PEM format directory of CA's"},
    {"CAfile", OPT_CAFILE, '<', "PEM format file of CA's"},
R
Roger Ning 已提交
671
    {"CAstore", OPT_CASTORE, ':', "URI to store of CA's"},
672 673 674 675
    {"no-CAfile", OPT_NOCAFILE, '-',
     "Do not load the default certificates file"},
    {"no-CApath", OPT_NOCAPATH, '-',
     "Do not load certificates from the default certificates directory"},
R
Roger Ning 已提交
676
    {"no-CAstore", OPT_NOCASTORE, '-',
677
     "Do not load certificates from the default certificates store"},
D
Dr. Stephen Henson 已提交
678
    {"requestCAfile", OPT_REQCAFILE, '<',
679
      "PEM format file of CA names to send to the server"},
V
Viktor Dukhovni 已提交
680 681 682
    {"dane_tlsa_domain", OPT_DANE_TLSA_DOMAIN, 's', "DANE TLSA base domain"},
    {"dane_tlsa_rrdata", OPT_DANE_TLSA_RRDATA, 's',
     "DANE TLSA rrdata presentation form"},
683 684
    {"dane_ee_no_namechecks", OPT_DANE_EE_NO_NAME, '-',
     "Disable name checks when matching DANE-EE(3) TLSA records"},
R
Rich Salz 已提交
685 686 687 688 689 690 691
    {"psk_identity", OPT_PSK_IDENTITY, 's', "PSK identity"},
    {"psk", OPT_PSK, 's', "PSK in hex (without 0x)"},
    {"psk_session", OPT_PSK_SESS, '<', "File to read PSK SSL session from"},
    {"name", OPT_PROTOHOST, 's',
     "Hostname to use for \"-starttls lmtp\", \"-starttls smtp\" or \"-starttls xmpp[-server]\""},

    OPT_SECTION("Session"),
692 693
    {"reconnect", OPT_RECONNECT, '-',
     "Drop and re-make the connection with the same Session-ID"},
R
Rich Salz 已提交
694 695 696 697
    {"sess_out", OPT_SESS_OUT, '>', "File to write SSL session to"},
    {"sess_in", OPT_SESS_IN, '<', "File to read SSL session from"},

    OPT_SECTION("Input/Output"),
698 699 700 701 702
    {"crlf", OPT_CRLF, '-', "Convert LF from terminal into CRLF"},
    {"quiet", OPT_QUIET, '-', "No s_client output"},
    {"ign_eof", OPT_IGN_EOF, '-', "Ignore input eof (default when -quiet)"},
    {"no_ign_eof", OPT_NO_IGN_EOF, '-', "Don't ignore input eof"},
    {"starttls", OPT_STARTTLS, 's',
703
     "Use the appropriate STARTTLS command before starting TLS"},
704
    {"xmpphost", OPT_XMPPHOST, 's',
705
     "Alias of -name option for \"-starttls xmpp[-server]\""},
R
Rich Salz 已提交
706 707 708 709
    {"brief", OPT_BRIEF, '-',
     "Restrict output to brief summary of connection parameters"},
    {"prexit", OPT_PREXIT, '-',
     "Print session information when the program exits"},
R
Rich Salz 已提交
710 711 712 713 714 715 716 717 718 719 720 721 722 723

    OPT_SECTION("Debug"),
    {"showcerts", OPT_SHOWCERTS, '-',
     "Show all certificates sent by the server"},
    {"debug", OPT_DEBUG, '-', "Extra output"},
    {"msg", OPT_MSG, '-', "Show protocol messages"},
    {"msgfile", OPT_MSGFILE, '>',
     "File to send output of -msg or -trace, instead of stdout"},
    {"nbio_test", OPT_NBIO_TEST, '-', "More ssl protocol testing"},
    {"state", OPT_STATE, '-', "Print the ssl states"},
    {"keymatexport", OPT_KEYMATEXPORT, 's',
     "Export keying material using label"},
    {"keymatexportlen", OPT_KEYMATEXPORTLEN, 'p',
     "Export len bytes of keying material (default 20)"},
R
Rich Salz 已提交
724 725 726 727
    {"security_debug", OPT_SECURITY_DEBUG, '-',
     "Enable security debug messages"},
    {"security_debug_verbose", OPT_SECURITY_DEBUG_VERBOSE, '-',
     "Output more security debug output"},
R
Rich Salz 已提交
728 729 730 731 732 733 734
#ifndef OPENSSL_NO_SSL_TRACE
    {"trace", OPT_TRACE, '-', "Show trace output of protocol messages"},
#endif
#ifdef WATT32
    {"wdebug", OPT_WDEBUG, '-', "WATT-32 tcp debugging"},
#endif
    {"keylogfile", OPT_KEYLOG_FILE, '>', "Write TLS secrets to file"},
735 736
    {"nocommands", OPT_NOCMDS, '-', "Do not use interactive command letters"},
    {"servername", OPT_SERVERNAME, 's',
737
     "Set TLS extension servername (SNI) in ClientHello (default)"},
738 739
    {"noservername", OPT_NOSERVERNAME, '-',
     "Do not send the server name (SNI) extension in the ClientHello"},
740 741
    {"tlsextdebug", OPT_TLSEXTDEBUG, '-',
     "Hex dump of all TLS extensions received"},
M
Matt Caswell 已提交
742
#ifndef OPENSSL_NO_OCSP
743
    {"status", OPT_STATUS, '-', "Request certificate status from server"},
M
Matt Caswell 已提交
744
#endif
745 746 747 748
    {"serverinfo", OPT_SERVERINFO, 's',
     "types  Send empty ClientHello extensions (comma-separated numbers)"},
    {"alpn", OPT_ALPN, 's',
     "Enable ALPN extension, considering named protocols supported (comma-separated list)"},
749
    {"async", OPT_ASYNC, '-', "Support asynchronous operation"},
R
Rich Salz 已提交
750 751 752
    {"nbio", OPT_NBIO, '-', "Use non-blocking IO"},

    OPT_SECTION("Protocol and version"),
753 754 755
#ifndef OPENSSL_NO_SSL3
    {"ssl3", OPT_SSL3, '-', "Just use SSLv3"},
#endif
756 757 758 759 760 761 762 763 764
#ifndef OPENSSL_NO_TLS1
    {"tls1", OPT_TLS1, '-', "Just use TLSv1"},
#endif
#ifndef OPENSSL_NO_TLS1_1
    {"tls1_1", OPT_TLS1_1, '-', "Just use TLSv1.1"},
#endif
#ifndef OPENSSL_NO_TLS1_2
    {"tls1_2", OPT_TLS1_2, '-', "Just use TLSv1.2"},
#endif
765 766 767
#ifndef OPENSSL_NO_TLS1_3
    {"tls1_3", OPT_TLS1_3, '-', "Just use TLSv1.3"},
#endif
768
#ifndef OPENSSL_NO_DTLS
R
Rich Salz 已提交
769 770 771
    {"dtls", OPT_DTLS, '-', "Use any version of DTLS"},
    {"timeout", OPT_TIMEOUT, '-',
     "Enable send/receive timeout on DTLS connections"},
772 773
    {"mtu", OPT_MTU, 'p', "Set the link layer MTU"},
#endif
774 775 776 777
#ifndef OPENSSL_NO_DTLS1
    {"dtls1", OPT_DTLS1, '-', "Just use DTLSv1"},
#endif
#ifndef OPENSSL_NO_DTLS1_2
R
Rich Salz 已提交
778
    {"dtls1_2", OPT_DTLS1_2, '-', "Just use DTLSv1.2"},
779
#endif
M
Matt Caswell 已提交
780 781
#ifndef OPENSSL_NO_SCTP
    {"sctp", OPT_SCTP, '-', "Use SCTP"},
782
    {"sctp_label_bug", OPT_SCTP_LABEL_BUG, '-', "Enable SCTP label length bug"},
M
Matt Caswell 已提交
783
#endif
R
Rich Salz 已提交
784 785 786
#ifndef OPENSSL_NO_NEXTPROTONEG
    {"nextprotoneg", OPT_NEXTPROTONEG, 's',
     "Enable NPN extension, considering named protocols supported (comma-separated list)"},
787
#endif
R
Rich Salz 已提交
788 789 790 791 792
    {"early_data", OPT_EARLY_DATA, '<', "File to send as early data"},
    {"enable_pha", OPT_ENABLE_PHA, '-', "Enable post-handshake-authentication"},
#ifndef OPENSSL_NO_SRTP
    {"use_srtp", OPT_USE_SRTP, 's',
     "Offer SRTP key management with a colon-separated profile list"},
793 794
#endif
#ifndef OPENSSL_NO_SRP
795
    {"srpuser", OPT_SRPUSER, 's', "SRP authentication for 'user'"},
796 797 798 799 800
    {"srppass", OPT_SRPPASS, 's', "Password for 'user'"},
    {"srp_lateuser", OPT_SRP_LATEUSER, '-',
     "SRP username into second ClientHello message"},
    {"srp_moregroups", OPT_SRP_MOREGROUPS, '-',
     "Tolerate other than the known g N values."},
801
    {"srp_strength", OPT_SRP_STRENGTH, 'p', "Minimal length in bits for N"},
802
#endif
R
Rich Salz 已提交
803 804 805 806 807 808 809 810 811 812

    OPT_R_OPTIONS,
    OPT_S_OPTIONS,
    OPT_V_OPTIONS,
    {"CRL", OPT_CRL, '<', "CRL file to use"},
    {"crl_download", OPT_CRL_DOWNLOAD, '-', "Download CRL from distribution points"},
    {"CRLform", OPT_CRLFORM, 'F', "CRL format (PEM or DER) PEM is default"},
    {"verify_return_error", OPT_VERIFY_RET_ERROR, '-',
     "Close connection on verification error"},
    {"verify_quiet", OPT_VERIFY_QUIET, '-', "Restrict verify output to errors"},
813 814
    {"chainCAfile", OPT_CHAINCAFILE, '<',
     "CA file for certificate chain (PEM format)"},
R
Rich Salz 已提交
815 816 817 818 819 820 821 822 823 824 825
    {"chainCApath", OPT_CHAINCAPATH, '/',
     "Use dir as certificate store path to build CA certificate chain"},
    {"chainCAstore", OPT_CHAINCASTORE, ':',
     "CA store URI for certificate chain"},
    {"verifyCAfile", OPT_VERIFYCAFILE, '<',
     "CA file for certificate verification (PEM format)"},
    {"verifyCApath", OPT_VERIFYCAPATH, '/',
     "Use dir as certificate store path to verify CA certificate"},
    {"verifyCAstore", OPT_VERIFYCASTORE, ':',
     "CA store URI for certificate verification"},
    OPT_X_OPTIONS,
826
    OPT_PROV_OPTIONS,
R
Rich Salz 已提交
827 828 829

    OPT_PARAMETERS(),
    {"host:port", 0, 0, "Where to connect; same as -connect option"},
R
Rich Salz 已提交
830
    {NULL}
831 832 833 834
};

typedef enum PROTOCOL_choice {
    PROTO_OFF,
835 836 837 838
    PROTO_SMTP,
    PROTO_POP3,
    PROTO_IMAP,
    PROTO_FTP,
839
    PROTO_TELNET,
840
    PROTO_XMPP,
841
    PROTO_XMPP_SERVER,
842
    PROTO_CONNECT,
V
Valentin Vidic 已提交
843
    PROTO_IRC,
K
Keigo Tanaka 已提交
844
    PROTO_MYSQL,
845
    PROTO_POSTGRES,
846
    PROTO_LMTP,
847
    PROTO_NNTP,
848 849
    PROTO_SIEVE,
    PROTO_LDAP
850 851
} PROTOCOL_CHOICE;

852
static const OPT_PAIR services[] = {
853 854 855 856 857
    {"smtp", PROTO_SMTP},
    {"pop3", PROTO_POP3},
    {"imap", PROTO_IMAP},
    {"ftp", PROTO_FTP},
    {"xmpp", PROTO_XMPP},
858
    {"xmpp-server", PROTO_XMPP_SERVER},
859
    {"telnet", PROTO_TELNET},
860
    {"irc", PROTO_IRC},
K
Keigo Tanaka 已提交
861
    {"mysql", PROTO_MYSQL},
V
Valentin Vidic 已提交
862
    {"postgres", PROTO_POSTGRES},
863
    {"lmtp", PROTO_LMTP},
864
    {"nntp", PROTO_NNTP},
865
    {"sieve", PROTO_SIEVE},
866
    {"ldap", PROTO_LDAP},
867
    {NULL, 0}
868 869
};

870 871 872 873
#define IS_INET_FLAG(o) \
 (o == OPT_4 || o == OPT_6 || o == OPT_HOST || o == OPT_PORT || o == OPT_CONNECT)
#define IS_UNIX_FLAG(o) (o == OPT_UNIX)

874 875
#define IS_PROT_FLAG(o) \
 (o == OPT_SSL3 || o == OPT_TLS1 || o == OPT_TLS1_1 || o == OPT_TLS1_2 \
876
  || o == OPT_TLS1_3 || o == OPT_DTLS || o == OPT_DTLS1 || o == OPT_DTLS1_2)
877

878 879 880 881 882 883 884 885 886
/* Free |*dest| and optionally set it to a copy of |source|. */
static void freeandcopy(char **dest, const char *source)
{
    OPENSSL_free(*dest);
    *dest = NULL;
    if (source != NULL)
        *dest = OPENSSL_strdup(source);
}

887
static int new_session_cb(SSL *s, SSL_SESSION *sess)
888 889
{

890 891 892 893 894 895 896 897 898 899 900 901 902 903 904 905 906 907 908 909
    if (sess_out != NULL) {
        BIO *stmp = BIO_new_file(sess_out, "w");

        if (stmp == NULL) {
            BIO_printf(bio_err, "Error writing session file %s\n", sess_out);
        } else {
            PEM_write_bio_SSL_SESSION(stmp, sess);
            BIO_free(stmp);
        }
    }

    /*
     * Session data gets dumped on connection for TLSv1.2 and below, and on
     * arrival of the NewSessionTicket for TLSv1.3.
     */
    if (SSL_version(s) == TLS1_3_VERSION) {
        BIO_printf(bio_c_out,
                   "---\nPost-Handshake New Session Ticket arrived:\n");
        SSL_SESSION_print(bio_c_out, sess);
        BIO_printf(bio_c_out, "---\n");
910 911 912 913 914 915 916 917 918
    }

    /*
     * We always return a "fail" response so that the session gets freed again
     * because we haven't used the reference.
     */
    return 0;
}

919
int s_client_main(int argc, char **argv)
920
{
921
    BIO *sbio;
922
    EVP_PKEY *key = NULL;
923
    SSL *con = NULL;
924
    SSL_CTX *ctx = NULL;
925 926
    STACK_OF(X509) *chain = NULL;
    X509 *cert = NULL;
927
    X509_VERIFY_PARAM *vpm = NULL;
928 929 930
    SSL_EXCERT *exc = NULL;
    SSL_CONF_CTX *cctx = NULL;
    STACK_OF(OPENSSL_STRING) *ssl_args = NULL;
V
Viktor Dukhovni 已提交
931 932
    char *dane_tlsa_domain = NULL;
    STACK_OF(OPENSSL_STRING) *dane_tlsa_rrset = NULL;
933
    int dane_ee_no_name = 0;
934
    STACK_OF(X509_CRL) *crls = NULL;
935
    const SSL_METHOD *meth = TLS_client_method();
936
    const char *CApath = NULL, *CAfile = NULL, *CAstore = NULL;
937 938 939 940
    char *cbuf = NULL, *sbuf = NULL, *mbuf = NULL;
    char *proxystr = NULL, *proxyuser = NULL;
    char *proxypassarg = NULL, *proxypass = NULL;
    char *connectstr = NULL, *bindstr = NULL;
V
Viktor Dukhovni 已提交
941
    char *cert_file = NULL, *key_file = NULL, *chain_file = NULL;
942
    char *chCApath = NULL, *chCAfile = NULL, *chCAstore = NULL, *host = NULL;
943
    char *port = OPENSSL_strdup(PORT);
944
    char *bindhost = NULL, *bindport = NULL;
945 946
    char *passarg = NULL, *pass = NULL;
    char *vfyCApath = NULL, *vfyCAfile = NULL, *vfyCAstore = NULL;
D
Dr. Stephen Henson 已提交
947
    char *ReqCAfile = NULL;
948
    char *sess_in = NULL, *crl_file = NULL, *p;
949
    const char *protohost = NULL;
950
    struct timeval timeout, *timeoutp;
951
    fd_set readfds, writefds;
952
    int noCApath = 0, noCAfile = 0, noCAstore = 0;
953 954 955
    int build_chain = 0, cbuf_len, cbuf_off, cert_format = FORMAT_PEM;
    int key_format = FORMAT_PEM, crlf = 0, full_log = 1, mbuf_len = 0;
    int prexit = 0;
M
Matt Caswell 已提交
956
    int sdebug = 0;
957
    int reconnect = 0, verify = SSL_VERIFY_NONE, vpmtouched = 0;
958
    int ret = 1, in_init = 1, i, nbio_test = 0, sock = -1, k, width, state = 0;
959
    int sbuf_len, sbuf_off, cmdletters = 1;
M
Matt Caswell 已提交
960
    int socket_family = AF_UNSPEC, socket_type = SOCK_STREAM, protocol = 0;
961 962
    int starttls_proto = PROTO_OFF, crl_format = FORMAT_PEM, crl_download = 0;
    int write_tty, read_tty, write_ssl, read_ssl, tty_on, ssl_pending;
963
#if !defined(OPENSSL_SYS_WINDOWS) && !defined(OPENSSL_SYS_MSDOS)
964
    int at_eof = 0;
965
#endif
966
    int read_buf_len = 0;
967 968
    int fallback_scsv = 0;
    OPTION_CHOICE o;
M
Matt Caswell 已提交
969 970 971 972
#ifndef OPENSSL_NO_DTLS
    int enable_timeouts = 0;
    long socket_mtu = 0;
#endif
973
#ifndef OPENSSL_NO_ENGINE
974
    ENGINE *ssl_client_engine = NULL;
975
#endif
R
Rich Salz 已提交
976
    ENGINE *e = NULL;
R
Rich Salz 已提交
977
#if defined(OPENSSL_SYS_WINDOWS) || defined(OPENSSL_SYS_MSDOS)
978
    struct timeval tv;
979
#endif
M
Matt Caswell 已提交
980
    const char *servername = NULL;
981
    int noservername = 0;
982
    const char *alpn_in = NULL;
983
    tlsextctx tlsextcbp = { NULL, 0 };
984
    const char *ssl_config = NULL;
985
#define MAX_SI_TYPES 100
986 987
    unsigned short serverinfo_types[MAX_SI_TYPES];
    int serverinfo_count = 0, start = 0, len;
988
#ifndef OPENSSL_NO_NEXTPROTONEG
989
    const char *next_proto_neg_in = NULL;
D
Dr. Stephen Henson 已提交
990
#endif
B
Ben Laurie 已提交
991
#ifndef OPENSSL_NO_SRP
992 993 994 995
    char *srppass = NULL;
    int srp_lateuser = 0;
    SRP_ARG srp_arg = { NULL, NULL, 0, 0, 0, 1024 };
#endif
T
Todd Short 已提交
996
#ifndef OPENSSL_NO_SRTP
997
    char *srtp_profiles = NULL;
T
Todd Short 已提交
998
#endif
999 1000
#ifndef OPENSSL_NO_CT
    char *ctlog_file = NULL;
1001
    int ct_validation = 0;
1002
#endif
1003
    int min_version = 0, max_version = 0, prot_opt = 0, no_prot_opt = 0;
F
FdaSilvaYY 已提交
1004
    int async = 0;
1005
    unsigned int max_send_fragment = 0;
1006
    unsigned int split_send_fragment = 0, max_pipelines = 0;
1007 1008
    enum { use_inet, use_unix, use_unknown } connect_type = use_unknown;
    int count4or6 = 0;
1009
    uint8_t maxfraglen = 0;
F
FdaSilvaYY 已提交
1010
    int c_nbio = 0, c_msg = 0, c_ign_eof = 0, c_brief = 0;
R
Richard Levitte 已提交
1011 1012 1013 1014
    int c_tlsextdebug = 0;
#ifndef OPENSSL_NO_OCSP
    int c_status_req = 0;
#endif
F
FdaSilvaYY 已提交
1015
    BIO *bio_c_msg = NULL;
1016
    const char *keylog_file = NULL, *early_data_file = NULL;
T
Todd Short 已提交
1017
#ifndef OPENSSL_NO_DTLS
M
Matt Caswell 已提交
1018
    int isdtls = 0;
T
Todd Short 已提交
1019
#endif
1020
    char *psksessf = NULL;
1021
    int enable_pha = 0;
1022 1023 1024
#ifndef OPENSSL_NO_SCTP
    int sctp_label_bug = 0;
#endif
1025

1026 1027 1028 1029 1030 1031 1032 1033 1034 1035
    FD_ZERO(&readfds);
    FD_ZERO(&writefds);
/* Known false-positive of MemorySanitizer. */
#if defined(__has_feature)
# if __has_feature(memory_sanitizer)
    __msan_unpoison(&readfds, sizeof(readfds));
    __msan_unpoison(&writefds, sizeof(writefds));
# endif
#endif

1036
    prog = opt_progname(argv[0]);
1037 1038 1039
    c_quiet = 0;
    c_debug = 0;
    c_showcerts = 0;
1040 1041
    c_nbio = 0;
    vpm = X509_VERIFY_PARAM_new();
1042 1043
    cctx = SSL_CONF_CTX_new();

R
Rich Salz 已提交
1044
    if (vpm == NULL || cctx == NULL) {
1045
        BIO_printf(bio_err, "%s: out of memory\n", prog);
1046 1047 1048
        goto end;
    }

1049 1050 1051 1052
    cbuf = app_malloc(BUFSIZZ, "cbuf");
    sbuf = app_malloc(BUFSIZZ, "sbuf");
    mbuf = app_malloc(BUFSIZZ, "mbuf");

1053
    SSL_CONF_CTX_set_flags(cctx, SSL_CONF_FLAG_CLIENT | SSL_CONF_FLAG_CMDLINE);
1054

1055 1056
    prog = opt_init(argc, argv, s_client_options);
    while ((o = opt_next()) != OPT_EOF) {
1057 1058 1059
        /* Check for intermixing flags. */
        if (connect_type == use_unix && IS_INET_FLAG(o)) {
            BIO_printf(bio_err,
F
FdaSilvaYY 已提交
1060 1061
                       "%s: Intermixed protocol flags (unix and internet domains)\n",
                       prog);
1062 1063 1064 1065
            goto end;
        }
        if (connect_type == use_inet && IS_UNIX_FLAG(o)) {
            BIO_printf(bio_err,
F
FdaSilvaYY 已提交
1066 1067
                       "%s: Intermixed protocol flags (internet and unix domains)\n",
                       prog);
1068 1069
            goto end;
        }
1070 1071 1072 1073 1074 1075 1076 1077

        if (IS_PROT_FLAG(o) && ++prot_opt > 1) {
            BIO_printf(bio_err, "Cannot supply multiple protocol flags\n");
            goto end;
        }
        if (IS_NO_PROT_FLAG(o))
            no_prot_opt++;
        if (prot_opt == 1 && no_prot_opt) {
F
FdaSilvaYY 已提交
1078 1079
            BIO_printf(bio_err,
                       "Cannot supply both a protocol flag and '-no_<prot>'\n");
1080 1081 1082
            goto end;
        }

1083 1084 1085 1086 1087 1088 1089 1090 1091 1092
        switch (o) {
        case OPT_EOF:
        case OPT_ERR:
 opthelp:
            BIO_printf(bio_err, "%s: Use -help for summary.\n", prog);
            goto end;
        case OPT_HELP:
            opt_help(s_client_options);
            ret = 0;
            goto end;
1093
        case OPT_4:
1094
            connect_type = use_inet;
1095
            socket_family = AF_INET;
1096
            count4or6++;
1097 1098
            break;
#ifdef AF_INET6
1099 1100 1101 1102
        case OPT_6:
            connect_type = use_inet;
            socket_family = AF_INET6;
            count4or6++;
1103 1104
            break;
#endif
1105 1106
        case OPT_HOST:
            connect_type = use_inet;
1107
            freeandcopy(&host, opt_arg());
1108 1109
            break;
        case OPT_PORT:
1110
            connect_type = use_inet;
1111
            freeandcopy(&port, opt_arg());
1112 1113
            break;
        case OPT_CONNECT:
1114
            connect_type = use_inet;
1115
            freeandcopy(&connectstr, opt_arg());
1116
            break;
1117 1118 1119
        case OPT_BIND:
            freeandcopy(&bindstr, opt_arg());
            break;
1120 1121 1122
        case OPT_PROXY:
            proxystr = opt_arg();
            starttls_proto = PROTO_CONNECT;
1123
            break;
1124 1125 1126 1127 1128 1129
        case OPT_PROXY_USER:
            proxyuser = opt_arg();
            break;
        case OPT_PROXY_PASS:
            proxypassarg = opt_arg();
            break;
1130
#ifdef AF_UNIX
1131
        case OPT_UNIX:
1132
            connect_type = use_unix;
1133
            socket_family = AF_UNIX;
1134
            freeandcopy(&host, opt_arg());
1135
            break;
1136
#endif
1137
        case OPT_XMPPHOST:
1138 1139 1140
            /* fall through, since this is an alias */
        case OPT_PROTOHOST:
            protohost = opt_arg();
1141
            break;
1142
        case OPT_VERIFY:
1143
            verify = SSL_VERIFY_PEER;
1144
            verify_args.depth = atoi(opt_arg());
1145
            if (!c_quiet)
1146
                BIO_printf(bio_err, "verify depth is %d\n", verify_args.depth);
1147 1148 1149 1150
            break;
        case OPT_CERT:
            cert_file = opt_arg();
            break;
1151 1152 1153 1154
        case OPT_NAMEOPT:
            if (!set_nameopt(opt_arg()))
                goto end;
            break;
1155 1156 1157 1158
        case OPT_CRL:
            crl_file = opt_arg();
            break;
        case OPT_CRL_DOWNLOAD:
1159
            crl_download = 1;
1160 1161 1162 1163 1164 1165 1166 1167 1168 1169 1170 1171 1172 1173 1174 1175
            break;
        case OPT_SESS_OUT:
            sess_out = opt_arg();
            break;
        case OPT_SESS_IN:
            sess_in = opt_arg();
            break;
        case OPT_CERTFORM:
            if (!opt_format(opt_arg(), OPT_FMT_PEMDER, &cert_format))
                goto opthelp;
            break;
        case OPT_CRLFORM:
            if (!opt_format(opt_arg(), OPT_FMT_PEMDER, &crl_format))
                goto opthelp;
            break;
        case OPT_VERIFY_RET_ERROR:
1176
            verify = SSL_VERIFY_PEER;
1177
            verify_args.return_error = 1;
1178 1179
            break;
        case OPT_VERIFY_QUIET:
1180
            verify_args.quiet = 1;
1181 1182
            break;
        case OPT_BRIEF:
1183
            c_brief = verify_args.quiet = c_quiet = 1;
1184 1185 1186 1187 1188 1189 1190 1191 1192 1193 1194 1195 1196 1197 1198 1199 1200 1201 1202 1203 1204
            break;
        case OPT_S_CASES:
            if (ssl_args == NULL)
                ssl_args = sk_OPENSSL_STRING_new_null();
            if (ssl_args == NULL
                || !sk_OPENSSL_STRING_push(ssl_args, opt_flag())
                || !sk_OPENSSL_STRING_push(ssl_args, opt_arg())) {
                BIO_printf(bio_err, "%s: Memory allocation failure\n", prog);
                goto end;
            }
            break;
        case OPT_V_CASES:
            if (!opt_verify(o, vpm))
                goto end;
            vpmtouched++;
            break;
        case OPT_X_CASES:
            if (!args_excert(o, &exc))
                goto end;
            break;
        case OPT_PREXIT:
1205
            prexit = 1;
1206 1207
            break;
        case OPT_CRLF:
1208
            crlf = 1;
1209 1210 1211 1212 1213 1214 1215
            break;
        case OPT_QUIET:
            c_quiet = c_ign_eof = 1;
            break;
        case OPT_NBIO:
            c_nbio = 1;
            break;
R
Rich Salz 已提交
1216 1217 1218
        case OPT_NOCMDS:
            cmdletters = 0;
            break;
1219
        case OPT_ENGINE:
R
Rich Salz 已提交
1220
            e = setup_engine(opt_arg(), 1);
1221 1222
            break;
        case OPT_SSL_CLIENT_ENGINE:
R
Rich Salz 已提交
1223 1224 1225 1226 1227 1228 1229
#ifndef OPENSSL_NO_ENGINE
            ssl_client_engine = ENGINE_by_id(opt_arg());
            if (ssl_client_engine == NULL) {
                BIO_printf(bio_err, "Error getting client auth engine\n");
                goto opthelp;
            }
#endif
1230
            break;
R
Rich Salz 已提交
1231 1232 1233
        case OPT_R_CASES:
            if (!opt_rand(o))
                goto end;
1234
            break;
1235 1236 1237 1238
        case OPT_PROV_CASES:
            if (!opt_provider(o))
                goto end;
            break;
1239
        case OPT_IGN_EOF:
1240
            c_ign_eof = 1;
1241 1242
            break;
        case OPT_NO_IGN_EOF:
1243
            c_ign_eof = 0;
1244 1245
            break;
        case OPT_DEBUG:
1246
            c_debug = 1;
1247 1248
            break;
        case OPT_TLSEXTDEBUG:
1249
            c_tlsextdebug = 1;
1250 1251
            break;
        case OPT_STATUS:
R
Richard Levitte 已提交
1252
#ifndef OPENSSL_NO_OCSP
1253
            c_status_req = 1;
R
Richard Levitte 已提交
1254
#endif
1255 1256
            break;
        case OPT_WDEBUG:
1257
#ifdef WATT32
1258 1259
            dbug_init();
#endif
1260
            break;
1261
        case OPT_MSG:
1262
            c_msg = 1;
1263 1264 1265 1266 1267
            break;
        case OPT_MSGFILE:
            bio_c_msg = BIO_new_file(opt_arg(), "w");
            break;
        case OPT_TRACE:
1268
#ifndef OPENSSL_NO_SSL_TRACE
1269 1270
            c_msg = 2;
#endif
1271
            break;
1272
        case OPT_SECURITY_DEBUG:
1273
            sdebug = 1;
1274 1275
            break;
        case OPT_SECURITY_DEBUG_VERBOSE:
1276
            sdebug = 2;
1277 1278
            break;
        case OPT_SHOWCERTS:
1279
            c_showcerts = 1;
1280 1281
            break;
        case OPT_NBIO_TEST:
1282
            nbio_test = 1;
1283 1284
            break;
        case OPT_STATE:
1285
            state = 1;
1286 1287 1288 1289 1290 1291
            break;
        case OPT_PSK_IDENTITY:
            psk_identity = opt_arg();
            break;
        case OPT_PSK:
            for (p = psk_key = opt_arg(); *p; p++) {
1292
                if (isxdigit(_UC(*p)))
1293
                    continue;
1294 1295
                BIO_printf(bio_err, "Not a hex number '%s'\n", psk_key);
                goto end;
1296
            }
D
Dr. Stephen Henson 已提交
1297
            break;
1298 1299 1300
        case OPT_PSK_SESS:
            psksessf = opt_arg();
            break;
B
Ben Laurie 已提交
1301
#ifndef OPENSSL_NO_SRP
1302 1303
        case OPT_SRPUSER:
            srp_arg.srplogin = opt_arg();
1304 1305
            if (min_version < TLS1_VERSION)
                min_version = TLS1_VERSION;
1306 1307 1308
            break;
        case OPT_SRPPASS:
            srppass = opt_arg();
1309 1310
            if (min_version < TLS1_VERSION)
                min_version = TLS1_VERSION;
1311 1312 1313
            break;
        case OPT_SRP_STRENGTH:
            srp_arg.strength = atoi(opt_arg());
1314 1315
            BIO_printf(bio_err, "SRP minimal length for N is %d\n",
                       srp_arg.strength);
1316 1317
            if (min_version < TLS1_VERSION)
                min_version = TLS1_VERSION;
1318 1319
            break;
        case OPT_SRP_LATEUSER:
1320
            srp_lateuser = 1;
1321 1322
            if (min_version < TLS1_VERSION)
                min_version = TLS1_VERSION;
1323 1324
            break;
        case OPT_SRP_MOREGROUPS:
1325
            srp_arg.amp = 1;
1326 1327
            if (min_version < TLS1_VERSION)
                min_version = TLS1_VERSION;
1328
            break;
B
Ben Laurie 已提交
1329
#endif
1330 1331 1332
        case OPT_SSL_CONFIG:
            ssl_config = opt_arg();
            break;
1333
        case OPT_SSL3:
1334 1335
            min_version = SSL3_VERSION;
            max_version = SSL3_VERSION;
1336
            break;
1337 1338 1339 1340
        case OPT_TLS1_3:
            min_version = TLS1_3_VERSION;
            max_version = TLS1_3_VERSION;
            break;
1341
        case OPT_TLS1_2:
1342 1343
            min_version = TLS1_2_VERSION;
            max_version = TLS1_2_VERSION;
1344 1345
            break;
        case OPT_TLS1_1:
1346 1347
            min_version = TLS1_1_VERSION;
            max_version = TLS1_1_VERSION;
1348 1349
            break;
        case OPT_TLS1:
1350 1351
            min_version = TLS1_VERSION;
            max_version = TLS1_VERSION;
1352 1353
            break;
        case OPT_DTLS:
1354
#ifndef OPENSSL_NO_DTLS
1355 1356
            meth = DTLS_client_method();
            socket_type = SOCK_DGRAM;
M
Matt Caswell 已提交
1357
            isdtls = 1;
1358
#endif
1359 1360
            break;
        case OPT_DTLS1:
1361
#ifndef OPENSSL_NO_DTLS1
1362 1363 1364
            meth = DTLS_client_method();
            min_version = DTLS1_VERSION;
            max_version = DTLS1_VERSION;
1365
            socket_type = SOCK_DGRAM;
M
Matt Caswell 已提交
1366
            isdtls = 1;
1367
#endif
1368 1369
            break;
        case OPT_DTLS1_2:
1370
#ifndef OPENSSL_NO_DTLS1_2
1371 1372 1373
            meth = DTLS_client_method();
            min_version = DTLS1_2_VERSION;
            max_version = DTLS1_2_VERSION;
1374
            socket_type = SOCK_DGRAM;
M
Matt Caswell 已提交
1375 1376 1377 1378 1379 1380
            isdtls = 1;
#endif
            break;
        case OPT_SCTP:
#ifndef OPENSSL_NO_SCTP
            protocol = IPPROTO_SCTP;
1381 1382 1383 1384 1385
#endif
            break;
        case OPT_SCTP_LABEL_BUG:
#ifndef OPENSSL_NO_SCTP
            sctp_label_bug = 1;
1386
#endif
1387 1388
            break;
        case OPT_TIMEOUT:
1389
#ifndef OPENSSL_NO_DTLS
1390
            enable_timeouts = 1;
1391
#endif
1392 1393
            break;
        case OPT_MTU:
1394
#ifndef OPENSSL_NO_DTLS
1395
            socket_mtu = atol(opt_arg());
1396
#endif
1397
            break;
1398
        case OPT_FALLBACKSCSV:
1399
            fallback_scsv = 1;
1400 1401
            break;
        case OPT_KEYFORM:
1402
            if (!opt_format(opt_arg(), OPT_FMT_PDE, &key_format))
1403 1404 1405 1406 1407 1408 1409 1410 1411 1412 1413 1414
                goto opthelp;
            break;
        case OPT_PASS:
            passarg = opt_arg();
            break;
        case OPT_CERT_CHAIN:
            chain_file = opt_arg();
            break;
        case OPT_KEY:
            key_file = opt_arg();
            break;
        case OPT_RECONNECT:
1415
            reconnect = 5;
1416 1417 1418 1419
            break;
        case OPT_CAPATH:
            CApath = opt_arg();
            break;
1420 1421 1422
        case OPT_NOCAPATH:
            noCApath = 1;
            break;
1423 1424 1425 1426 1427 1428 1429
        case OPT_CHAINCAPATH:
            chCApath = opt_arg();
            break;
        case OPT_VERIFYCAPATH:
            vfyCApath = opt_arg();
            break;
        case OPT_BUILD_CHAIN:
1430
            build_chain = 1;
1431
            break;
D
Dr. Stephen Henson 已提交
1432 1433 1434
        case OPT_REQCAFILE:
            ReqCAfile = opt_arg();
            break;
1435 1436 1437
        case OPT_CAFILE:
            CAfile = opt_arg();
            break;
1438 1439 1440
        case OPT_NOCAFILE:
            noCAfile = 1;
            break;
1441 1442
#ifndef OPENSSL_NO_CT
        case OPT_NOCT:
1443
            ct_validation = 0;
1444
            break;
1445 1446
        case OPT_CT:
            ct_validation = 1;
1447 1448 1449 1450 1451
            break;
        case OPT_CTLOG_FILE:
            ctlog_file = opt_arg();
            break;
#endif
1452 1453 1454 1455 1456 1457
        case OPT_CHAINCAFILE:
            chCAfile = opt_arg();
            break;
        case OPT_VERIFYCAFILE:
            vfyCAfile = opt_arg();
            break;
1458 1459 1460 1461 1462 1463 1464 1465 1466 1467 1468 1469
        case OPT_CASTORE:
            CAstore = opt_arg();
            break;
        case OPT_NOCASTORE:
            noCAstore = 1;
            break;
        case OPT_CHAINCASTORE:
            chCAstore = opt_arg();
            break;
        case OPT_VERIFYCASTORE:
            vfyCAstore = opt_arg();
            break;
V
Viktor Dukhovni 已提交
1470 1471 1472 1473 1474 1475 1476 1477 1478 1479 1480 1481
        case OPT_DANE_TLSA_DOMAIN:
            dane_tlsa_domain = opt_arg();
            break;
        case OPT_DANE_TLSA_RRDATA:
            if (dane_tlsa_rrset == NULL)
                dane_tlsa_rrset = sk_OPENSSL_STRING_new_null();
            if (dane_tlsa_rrset == NULL ||
                !sk_OPENSSL_STRING_push(dane_tlsa_rrset, opt_arg())) {
                BIO_printf(bio_err, "%s: Memory allocation failure\n", prog);
                goto end;
            }
            break;
1482 1483 1484
        case OPT_DANE_EE_NO_NAME:
            dane_ee_no_name = 1;
            break;
1485
        case OPT_NEXTPROTONEG:
M
Matt Caswell 已提交
1486
#ifndef OPENSSL_NO_NEXTPROTONEG
1487
            next_proto_neg_in = opt_arg();
M
Matt Caswell 已提交
1488
#endif
1489 1490 1491 1492 1493 1494 1495 1496 1497 1498 1499 1500
            break;
        case OPT_ALPN:
            alpn_in = opt_arg();
            break;
        case OPT_SERVERINFO:
            p = opt_arg();
            len = strlen(p);
            for (start = 0, i = 0; i <= len; ++i) {
                if (i == len || p[i] == ',') {
                    serverinfo_types[serverinfo_count] = atoi(p + start);
                    if (++serverinfo_count == MAX_SI_TYPES)
                        break;
1501 1502 1503
                    start = i + 1;
                }
            }
1504 1505 1506 1507
            break;
        case OPT_STARTTLS:
            if (!opt_pair(opt_arg(), services, &starttls_proto))
                goto end;
1508
            break;
1509 1510 1511
        case OPT_SERVERNAME:
            servername = opt_arg();
            break;
1512 1513 1514
        case OPT_NOSERVERNAME:
            noservername = 1;
            break;
1515
        case OPT_USE_SRTP:
T
Todd Short 已提交
1516
#ifndef OPENSSL_NO_SRTP
1517
            srtp_profiles = opt_arg();
T
Todd Short 已提交
1518
#endif
1519 1520 1521 1522 1523 1524
            break;
        case OPT_KEYMATEXPORT:
            keymatexportlabel = opt_arg();
            break;
        case OPT_KEYMATEXPORTLEN:
            keymatexportlen = atoi(opt_arg());
1525
            break;
1526 1527 1528
        case OPT_ASYNC:
            async = 1;
            break;
1529 1530 1531 1532 1533 1534 1535 1536 1537 1538 1539 1540 1541 1542 1543 1544 1545 1546 1547 1548 1549 1550
        case OPT_MAXFRAGLEN:
            len = atoi(opt_arg());
            switch (len) {
            case 512:
                maxfraglen = TLSEXT_max_fragment_length_512;
                break;
            case 1024:
                maxfraglen = TLSEXT_max_fragment_length_1024;
                break;
            case 2048:
                maxfraglen = TLSEXT_max_fragment_length_2048;
                break;
            case 4096:
                maxfraglen = TLSEXT_max_fragment_length_4096;
                break;
            default:
                BIO_printf(bio_err,
                           "%s: Max Fragment Len %u is out of permitted values",
                           prog, len);
                goto opthelp;
            }
            break;
1551 1552 1553
        case OPT_MAX_SEND_FRAG:
            max_send_fragment = atoi(opt_arg());
            break;
1554 1555 1556 1557 1558 1559
        case OPT_SPLIT_SEND_FRAG:
            split_send_fragment = atoi(opt_arg());
            break;
        case OPT_MAX_PIPELINES:
            max_pipelines = atoi(opt_arg());
            break;
1560 1561 1562
        case OPT_READ_BUF:
            read_buf_len = atoi(opt_arg());
            break;
1563 1564 1565
        case OPT_KEYLOG_FILE:
            keylog_file = opt_arg();
            break;
1566 1567 1568
        case OPT_EARLY_DATA:
            early_data_file = opt_arg();
            break;
1569 1570
        case OPT_ENABLE_PHA:
            enable_pha = 1;
1571
            break;
1572 1573
        }
    }
1574

1575 1576 1577 1578
    if (count4or6 >= 2) {
        BIO_printf(bio_err, "%s: Can't use both -4 and -6\n", prog);
        goto opthelp;
    }
1579 1580 1581 1582 1583 1584 1585 1586 1587 1588 1589 1590 1591 1592
    if (noservername) {
        if (servername != NULL) {
            BIO_printf(bio_err,
                       "%s: Can't use -servername and -noservername together\n",
                       prog);
            goto opthelp;
        }
        if (dane_tlsa_domain != NULL) {
            BIO_printf(bio_err,
               "%s: Can't use -dane_tlsa_domain and -noservername together\n",
               prog);
            goto opthelp;
        }
    }
1593
    argc = opt_num_rest();
1594 1595 1596 1597 1598 1599 1600 1601 1602 1603 1604 1605
    if (argc == 1) {
        /* If there's a positional argument, it's the equivalent of
         * OPT_CONNECT.
         * Don't allow -connect and a separate argument.
         */
        if (connectstr != NULL) {
            BIO_printf(bio_err,
                       "%s: must not provide both -connect option and target parameter\n",
                       prog);
            goto opthelp;
        }
        connect_type = use_inet;
1606
        freeandcopy(&connectstr, *opt_rest());
1607
    } else if (argc != 0) {
K
Kurt Roeckx 已提交
1608
        goto opthelp;
1609
    }
1610

1611 1612 1613 1614 1615 1616
#ifndef OPENSSL_NO_NEXTPROTONEG
    if (min_version == TLS1_3_VERSION && next_proto_neg_in != NULL) {
        BIO_printf(bio_err, "Cannot supply -nextprotoneg with TLSv1.3\n");
        goto opthelp;
    }
#endif
1617
    if (proxystr != NULL) {
1618 1619
        int res;
        char *tmp_host = host, *tmp_port = port;
1620
        if (connectstr == NULL) {
1621
            BIO_printf(bio_err, "%s: -proxy requires use of -connect or target parameter\n", prog);
1622 1623
            goto opthelp;
        }
1624 1625 1626 1627 1628 1629
        res = BIO_parse_hostserv(proxystr, &host, &port, BIO_PARSE_PRIO_HOST);
        if (tmp_host != host)
            OPENSSL_free(tmp_host);
        if (tmp_port != port)
            OPENSSL_free(tmp_port);
        if (!res) {
F
FdaSilvaYY 已提交
1630 1631
            BIO_printf(bio_err,
                       "%s: -proxy argument malformed or ambiguous\n", prog);
1632 1633 1634 1635 1636 1637 1638 1639 1640 1641 1642 1643 1644 1645
            goto end;
        }
    } else {
        int res = 1;
        char *tmp_host = host, *tmp_port = port;
        if (connectstr != NULL)
            res = BIO_parse_hostserv(connectstr, &host, &port,
                                     BIO_PARSE_PRIO_HOST);
        if (tmp_host != host)
            OPENSSL_free(tmp_host);
        if (tmp_port != port)
            OPENSSL_free(tmp_port);
        if (!res) {
            BIO_printf(bio_err,
1646
                       "%s: -connect argument or target parameter malformed or ambiguous\n",
1647
                       prog);
1648
            goto end;
1649
        }
1650 1651
    }

1652 1653 1654 1655 1656 1657 1658 1659 1660 1661 1662 1663
    if (bindstr != NULL) {
        int res;
        res = BIO_parse_hostserv(bindstr, &bindhost, &bindport,
                                 BIO_PARSE_PRIO_HOST);
        if (!res) {
            BIO_printf(bio_err,
                       "%s: -bind argument parameter malformed or ambiguous\n",
                       prog);
            goto end;
        }
    }

1664
#ifdef AF_UNIX
1665
    if (socket_family == AF_UNIX && socket_type != SOCK_STREAM) {
1666 1667 1668 1669
        BIO_printf(bio_err,
                   "Can't use unix sockets and datagrams together\n");
        goto end;
    }
1670
#endif
1671

M
Matt Caswell 已提交
1672 1673 1674 1675 1676 1677 1678 1679 1680 1681
#ifndef OPENSSL_NO_SCTP
    if (protocol == IPPROTO_SCTP) {
        if (socket_type != SOCK_DGRAM) {
            BIO_printf(bio_err, "Can't use -sctp without DTLS\n");
            goto end;
        }
        /* SCTP is unusual. It uses DTLS over a SOCK_STREAM protocol */
        socket_type = SOCK_STREAM;
    }
#endif
1682

1683
#if !defined(OPENSSL_NO_NEXTPROTONEG)
1684 1685 1686 1687 1688 1689 1690 1691 1692 1693
    next_proto.status = -1;
    if (next_proto_neg_in) {
        next_proto.data =
            next_protos_parse(&next_proto.len, next_proto_neg_in);
        if (next_proto.data == NULL) {
            BIO_printf(bio_err, "Error parsing -nextprotoneg argument\n");
            goto end;
        }
    } else
        next_proto.data = NULL;
B
Ben Laurie 已提交
1694 1695
#endif

1696
    if (!app_passwd(passarg, NULL, &pass, NULL)) {
1697 1698 1699 1700 1701 1702 1703 1704 1705 1706 1707
        BIO_printf(bio_err, "Error getting private key password\n");
        goto end;
    }

    if (!app_passwd(proxypassarg, NULL, &proxypass, NULL)) {
        BIO_printf(bio_err, "Error getting proxy password\n");
        goto end;
    }

    if (proxypass != NULL && proxyuser == NULL) {
        BIO_printf(bio_err, "Error: Must specify proxy_user with proxy_pass\n");
1708 1709 1710 1711 1712 1713
        goto end;
    }

    if (key_file == NULL)
        key_file = cert_file;

1714
    if (key_file != NULL) {
1715
        key = load_key(key_file, key_format, 0, pass, e,
1716
                       "client certificate private key file");
1717
        if (key == NULL) {
1718 1719 1720 1721 1722
            ERR_print_errors(bio_err);
            goto end;
        }
    }

1723
    if (cert_file != NULL) {
1724
        cert = load_cert(cert_file, cert_format, "client certificate file");
1725
        if (cert == NULL) {
1726 1727 1728 1729 1730
            ERR_print_errors(bio_err);
            goto end;
        }
    }

1731
    if (chain_file != NULL) {
1732
        if (!load_certs(chain_file, &chain, FORMAT_PEM, NULL,
1733
                        "client certificate chain"))
1734 1735 1736
            goto end;
    }

1737
    if (crl_file != NULL) {
1738 1739
        X509_CRL *crl;
        crl = load_crl(crl_file, crl_format);
1740
        if (crl == NULL) {
1741 1742 1743 1744 1745
            BIO_puts(bio_err, "Error loading CRL\n");
            ERR_print_errors(bio_err);
            goto end;
        }
        crls = sk_X509_CRL_new_null();
1746
        if (crls == NULL || !sk_X509_CRL_push(crls, crl)) {
1747 1748 1749 1750 1751 1752 1753
            BIO_puts(bio_err, "Error adding CRL\n");
            ERR_print_errors(bio_err);
            X509_CRL_free(crl);
            goto end;
        }
    }

1754
    if (!load_excert(&exc))
1755 1756 1757 1758 1759
        goto end;

    if (bio_c_out == NULL) {
        if (c_quiet && !c_debug) {
            bio_c_out = BIO_new(BIO_s_null());
1760
            if (c_msg && bio_c_msg == NULL)
1761
                bio_c_msg = dup_bio_out(FORMAT_TEXT);
1762
        } else if (bio_c_out == NULL)
1763
            bio_c_out = dup_bio_out(FORMAT_TEXT);
1764
    }
B
Ben Laurie 已提交
1765
#ifndef OPENSSL_NO_SRP
1766
    if (!app_passwd(srppass, NULL, &srp_arg.srppassin, NULL)) {
1767 1768 1769 1770 1771 1772 1773 1774 1775 1776 1777
        BIO_printf(bio_err, "Error getting password\n");
        goto end;
    }
#endif

    ctx = SSL_CTX_new(meth);
    if (ctx == NULL) {
        ERR_print_errors(bio_err);
        goto end;
    }

1778 1779
    SSL_CTX_clear_mode(ctx, SSL_MODE_AUTO_RETRY);

1780
    if (sdebug)
R
Rich Salz 已提交
1781
        ssl_ctx_security_debug(ctx, sdebug);
1782

1783 1784 1785
    if (!config_ctx(cctx, ssl_args, ctx))
        goto end;

1786
    if (ssl_config != NULL) {
1787 1788 1789
        if (SSL_CTX_config(ctx, ssl_config) == 0) {
            BIO_printf(bio_err, "Error using configuration \"%s\"\n",
                       ssl_config);
F
FdaSilvaYY 已提交
1790 1791
            ERR_print_errors(bio_err);
            goto end;
1792 1793 1794
        }
    }

1795 1796 1797 1798 1799
#ifndef OPENSSL_NO_SCTP
    if (protocol == IPPROTO_SCTP && sctp_label_bug == 1)
        SSL_CTX_set_mode(ctx, SSL_MODE_DTLS_SCTP_LABEL_LENGTH_BUG);
#endif

1800 1801
    if (min_version != 0
        && SSL_CTX_set_min_proto_version(ctx, min_version) == 0)
1802
        goto end;
1803 1804
    if (max_version != 0
        && SSL_CTX_set_max_proto_version(ctx, max_version) == 0)
1805 1806
        goto end;

1807
    if (vpmtouched && !SSL_CTX_set1_param(ctx, vpm)) {
M
Matt Caswell 已提交
1808 1809 1810 1811
        BIO_printf(bio_err, "Error setting verify params\n");
        ERR_print_errors(bio_err);
        goto end;
    }
1812

M
Matt Caswell 已提交
1813
    if (async) {
1814
        SSL_CTX_set_mode(ctx, SSL_MODE_ASYNC);
M
Matt Caswell 已提交
1815
    }
1816

1817 1818 1819 1820 1821 1822
    if (max_send_fragment > 0
        && !SSL_CTX_set_max_send_fragment(ctx, max_send_fragment)) {
        BIO_printf(bio_err, "%s: Max send fragment size %u is out of permitted range\n",
                   prog, max_send_fragment);
        goto end;
    }
1823

1824 1825 1826 1827 1828
    if (split_send_fragment > 0
        && !SSL_CTX_set_split_send_fragment(ctx, split_send_fragment)) {
        BIO_printf(bio_err, "%s: Split send fragment size %u is out of permitted range\n",
                   prog, split_send_fragment);
        goto end;
1829
    }
1830 1831 1832 1833 1834 1835

    if (max_pipelines > 0
        && !SSL_CTX_set_max_pipelines(ctx, max_pipelines)) {
        BIO_printf(bio_err, "%s: Max pipelines %u is out of permitted range\n",
                   prog, max_pipelines);
        goto end;
1836
    }
1837

1838 1839 1840 1841
    if (read_buf_len > 0) {
        SSL_CTX_set_default_read_buffer_len(ctx, read_buf_len);
    }

1842 1843 1844 1845 1846 1847 1848 1849
    if (maxfraglen > 0
            && !SSL_CTX_set_tlsext_max_fragment_length(ctx, maxfraglen)) {
        BIO_printf(bio_err,
                   "%s: Max Fragment Length code %u is out of permitted values"
                   "\n", prog, maxfraglen);
        goto end;
    }

1850 1851 1852
    if (!ssl_load_stores(ctx,
                         vfyCApath, vfyCAfile, vfyCAstore,
                         chCApath, chCAfile, chCAstore,
1853 1854 1855 1856 1857
                         crls, crl_download)) {
        BIO_printf(bio_err, "Error loading store locations\n");
        ERR_print_errors(bio_err);
        goto end;
    }
D
Dr. Stephen Henson 已提交
1858 1859
    if (ReqCAfile != NULL) {
        STACK_OF(X509_NAME) *nm = sk_X509_NAME_new_null();
1860

D
Dr. Stephen Henson 已提交
1861 1862 1863 1864 1865 1866 1867 1868
        if (nm == NULL || !SSL_add_file_cert_subjects_to_stack(nm, ReqCAfile)) {
            sk_X509_NAME_pop_free(nm, X509_NAME_free);
            BIO_printf(bio_err, "Error loading CA names\n");
            ERR_print_errors(bio_err);
            goto end;
        }
        SSL_CTX_set0_CA_list(ctx, nm);
    }
1869
#ifndef OPENSSL_NO_ENGINE
1870 1871 1872 1873 1874 1875 1876 1877 1878
    if (ssl_client_engine) {
        if (!SSL_CTX_set_client_cert_engine(ctx, ssl_client_engine)) {
            BIO_puts(bio_err, "Error setting client auth engine\n");
            ERR_print_errors(bio_err);
            ENGINE_free(ssl_client_engine);
            goto end;
        }
        ENGINE_free(ssl_client_engine);
    }
1879 1880
#endif

1881
#ifndef OPENSSL_NO_PSK
R
Rich Salz 已提交
1882
    if (psk_key != NULL) {
1883
        if (c_debug)
F
FdaSilvaYY 已提交
1884
            BIO_printf(bio_c_out, "PSK key given, setting client callback\n");
1885 1886
        SSL_CTX_set_psk_client_callback(ctx, psk_client_cb);
    }
P
Piotr Sikora 已提交
1887
#endif
1888 1889 1890 1891 1892 1893 1894 1895 1896 1897 1898 1899 1900 1901 1902 1903
    if (psksessf != NULL) {
        BIO *stmp = BIO_new_file(psksessf, "r");

        if (stmp == NULL) {
            BIO_printf(bio_err, "Can't open PSK session file %s\n", psksessf);
            ERR_print_errors(bio_err);
            goto end;
        }
        psksess = PEM_read_bio_SSL_SESSION(stmp, NULL, 0, NULL);
        BIO_free(stmp);
        if (psksess == NULL) {
            BIO_printf(bio_err, "Can't read PSK session file %s\n", psksessf);
            ERR_print_errors(bio_err);
            goto end;
        }
    }
1904 1905 1906
    if (psk_key != NULL || psksess != NULL)
        SSL_CTX_set_psk_use_session_callback(ctx, psk_use_session_cb);

P
Piotr Sikora 已提交
1907
#ifndef OPENSSL_NO_SRTP
M
Matt Caswell 已提交
1908
    if (srtp_profiles != NULL) {
1909 1910
        /* Returns 0 on success! */
        if (SSL_CTX_set_tlsext_use_srtp(ctx, srtp_profiles) != 0) {
M
Matt Caswell 已提交
1911 1912 1913 1914 1915
            BIO_printf(bio_err, "Error setting SRTP profile\n");
            ERR_print_errors(bio_err);
            goto end;
        }
    }
1916
#endif
1917

1918
    if (exc != NULL)
1919
        ssl_ctx_set_excert(ctx, exc);
1920

1921
#if !defined(OPENSSL_NO_NEXTPROTONEG)
1922
    if (next_proto.data != NULL)
1923
        SSL_CTX_set_next_proto_select_cb(ctx, next_proto_cb, &next_proto);
1924
#endif
1925
    if (alpn_in) {
T
Todd Short 已提交
1926
        size_t alpn_len;
1927 1928 1929 1930 1931 1932
        unsigned char *alpn = next_protos_parse(&alpn_len, alpn_in);

        if (alpn == NULL) {
            BIO_printf(bio_err, "Error parsing -alpn argument\n");
            goto end;
        }
1933 1934
        /* Returns 0 on success! */
        if (SSL_CTX_set_alpn_protos(ctx, alpn, alpn_len) != 0) {
F
FdaSilvaYY 已提交
1935
            BIO_printf(bio_err, "Error setting ALPN\n");
M
Matt Caswell 已提交
1936 1937
            goto end;
        }
1938 1939
        OPENSSL_free(alpn);
    }
1940

1941
    for (i = 0; i < serverinfo_count; i++) {
V
Viktor Dukhovni 已提交
1942
        if (!SSL_CTX_add_client_custom_ext(ctx,
1943 1944 1945 1946
                                           serverinfo_types[i],
                                           NULL, NULL, NULL,
                                           serverinfo_cli_parse_cb, NULL)) {
            BIO_printf(bio_err,
F
FdaSilvaYY 已提交
1947 1948
                       "Warning: Unable to add custom extension %u, skipping\n",
                       serverinfo_types[i]);
M
Matt Caswell 已提交
1949
        }
1950
    }
B
Ben Laurie 已提交
1951

1952 1953
    if (state)
        SSL_CTX_set_info_callback(ctx, apps_ssl_info_callback);
1954

1955
#ifndef OPENSSL_NO_CT
1956 1957 1958
    /* Enable SCT processing, without early connection termination */
    if (ct_validation &&
        !SSL_CTX_enable_ct(ctx, SSL_CT_VALIDATION_PERMISSIVE)) {
1959 1960 1961 1962
        ERR_print_errors(bio_err);
        goto end;
    }

1963
    if (!ctx_set_ctlog_list_file(ctx, ctlog_file)) {
1964
        if (ct_validation) {
1965 1966 1967 1968 1969 1970 1971 1972 1973 1974 1975
            ERR_print_errors(bio_err);
            goto end;
        }

        /*
         * If CT validation is not enabled, the log list isn't needed so don't
         * show errors or abort. We try to load it regardless because then we
         * can show the names of the logs any SCTs came from (SCTs may be seen
         * even with validation disabled).
         */
        ERR_clear_error();
1976 1977 1978
    }
#endif

1979
    SSL_CTX_set_verify(ctx, verify, verify_callback);
1980

1981 1982
    if (!ctx_set_verify_locations(ctx, CAfile, noCAfile, CApath, noCApath,
                                  CAstore, noCAstore)) {
1983
        ERR_print_errors(bio_err);
1984
        goto end;
1985
    }
1986

1987
    ssl_ctx_add_crls(ctx, crls, crl_download);
1988

1989 1990
    if (!set_cert_key_stuff(ctx, cert, key, chain, build_chain))
        goto end;
1991

1992
    if (!noservername) {
1993 1994 1995 1996 1997 1998 1999 2000 2001 2002 2003 2004 2005 2006 2007 2008 2009 2010 2011 2012 2013
        tlsextcbp.biodebug = bio_err;
        SSL_CTX_set_tlsext_servername_callback(ctx, ssl_servername_cb);
        SSL_CTX_set_tlsext_servername_arg(ctx, &tlsextcbp);
    }
# ifndef OPENSSL_NO_SRP
    if (srp_arg.srplogin) {
        if (!srp_lateuser && !SSL_CTX_set_srp_username(ctx, srp_arg.srplogin)) {
            BIO_printf(bio_err, "Unable to set SRP username\n");
            goto end;
        }
        srp_arg.msg = c_msg;
        srp_arg.debug = c_debug;
        SSL_CTX_set_srp_cb_arg(ctx, &srp_arg);
        SSL_CTX_set_srp_client_pwd_callback(ctx, ssl_give_srp_client_pwd_cb);
        SSL_CTX_set_srp_strength(ctx, srp_arg.strength);
        if (c_msg || c_debug || srp_arg.amp == 0)
            SSL_CTX_set_srp_verify_param_callback(ctx,
                                                  ssl_srp_verify_param_cb);
    }
# endif

V
Viktor Dukhovni 已提交
2014 2015 2016
    if (dane_tlsa_domain != NULL) {
        if (SSL_CTX_dane_enable(ctx) <= 0) {
            BIO_printf(bio_err,
F
FdaSilvaYY 已提交
2017 2018
                       "%s: Error enabling DANE TLSA authentication.\n",
                       prog);
V
Viktor Dukhovni 已提交
2019 2020 2021 2022 2023
            ERR_print_errors(bio_err);
            goto end;
        }
    }

2024 2025 2026 2027 2028
    /*
     * In TLSv1.3 NewSessionTicket messages arrive after the handshake and can
     * come at any time. Therefore we use a callback to write out the session
     * when we know about it. This approach works for < TLSv1.3 as well.
     */
2029 2030 2031
    SSL_CTX_set_session_cache_mode(ctx, SSL_SESS_CACHE_CLIENT
                                        | SSL_SESS_CACHE_NO_INTERNAL_STORE);
    SSL_CTX_sess_set_new_cb(ctx, new_session_cb);
2032

2033 2034 2035
    if (set_keylog_file(ctx, keylog_file))
        goto end;

2036
    con = SSL_new(ctx);
2037 2038 2039
    if (con == NULL)
        goto end;

2040 2041
    if (enable_pha)
        SSL_set_post_handshake_auth(con, 1);
2042

2043
    if (sess_in != NULL) {
2044 2045
        SSL_SESSION *sess;
        BIO *stmp = BIO_new_file(sess_in, "r");
2046
        if (stmp == NULL) {
2047 2048 2049 2050 2051 2052
            BIO_printf(bio_err, "Can't open session file %s\n", sess_in);
            ERR_print_errors(bio_err);
            goto end;
        }
        sess = PEM_read_bio_SSL_SESSION(stmp, NULL, 0, NULL);
        BIO_free(stmp);
2053
        if (sess == NULL) {
2054 2055 2056 2057
            BIO_printf(bio_err, "Can't open session file %s\n", sess_in);
            ERR_print_errors(bio_err);
            goto end;
        }
V
Viktor Dukhovni 已提交
2058
        if (!SSL_set_session(con, sess)) {
M
Matt Caswell 已提交
2059 2060 2061 2062
            BIO_printf(bio_err, "Can't set session\n");
            ERR_print_errors(bio_err);
            goto end;
        }
2063

2064 2065 2066 2067 2068
        SSL_SESSION_free(sess);
    }

    if (fallback_scsv)
        SSL_set_mode(con, SSL_MODE_SEND_FALLBACK_SCSV);
B
Bodo Moeller 已提交
2069

2070
    if (!noservername && (servername != NULL || dane_tlsa_domain == NULL)) {
2071
        if (servername == NULL) {
P
Pauli 已提交
2072
            if(host == NULL || is_dNS_name(host))
2073 2074 2075
                servername = (host == NULL) ? "localhost" : host;
        }
        if (servername != NULL && !SSL_set_tlsext_host_name(con, servername)) {
2076 2077 2078 2079 2080
            BIO_printf(bio_err, "Unable to set TLS servername extension.\n");
            ERR_print_errors(bio_err);
            goto end;
        }
    }
2081

V
Viktor Dukhovni 已提交
2082 2083 2084 2085 2086 2087 2088 2089 2090
    if (dane_tlsa_domain != NULL) {
        if (SSL_dane_enable(con, dane_tlsa_domain) <= 0) {
            BIO_printf(bio_err, "%s: Error enabling DANE TLSA "
                       "authentication.\n", prog);
            ERR_print_errors(bio_err);
            goto end;
        }
        if (dane_tlsa_rrset == NULL) {
            BIO_printf(bio_err, "%s: DANE TLSA authentication requires at "
2091
                       "least one -dane_tlsa_rrdata option.\n", prog);
V
Viktor Dukhovni 已提交
2092 2093 2094 2095 2096 2097 2098
            goto end;
        }
        if (tlsa_import_rrset(con, dane_tlsa_rrset) <= 0) {
            BIO_printf(bio_err, "%s: Failed to import any TLSA "
                       "records.\n", prog);
            goto end;
        }
2099 2100
        if (dane_ee_no_name)
            SSL_dane_set_flags(con, DANE_FLAG_NO_DANE_EE_NAMECHECKS);
V
Viktor Dukhovni 已提交
2101
    } else if (dane_tlsa_rrset != NULL) {
2102 2103 2104
        BIO_printf(bio_err, "%s: DANE TLSA authentication requires the "
                   "-dane_tlsa_domain option.\n", prog);
        goto end;
V
Viktor Dukhovni 已提交
2105 2106
    }

2107
 re_start:
2108
    if (init_client(&sock, host, port, bindhost, bindport, socket_family,
2109
                    socket_type, protocol) == 0) {
2110
        BIO_printf(bio_err, "connect:errno=%d\n", get_last_socket_error());
2111
        BIO_closesocket(sock);
2112 2113
        goto end;
    }
2114
    BIO_printf(bio_c_out, "CONNECTED(%08X)\n", sock);
2115

2116
    if (c_nbio) {
2117
        if (!BIO_socket_nbio(sock, 1)) {
2118 2119 2120
            ERR_print_errors(bio_err);
            goto end;
        }
R
Rich Salz 已提交
2121
        BIO_printf(bio_c_out, "Turned on non blocking io\n");
2122
    }
M
Matt Caswell 已提交
2123
#ifndef OPENSSL_NO_DTLS
M
Matt Caswell 已提交
2124
    if (isdtls) {
2125
        union BIO_sock_info_u peer_info;
2126

M
Matt Caswell 已提交
2127 2128
#ifndef OPENSSL_NO_SCTP
        if (protocol == IPPROTO_SCTP)
2129
            sbio = BIO_new_dgram_sctp(sock, BIO_NOCLOSE);
M
Matt Caswell 已提交
2130 2131
        else
#endif
2132
            sbio = BIO_new_dgram(sock, BIO_NOCLOSE);
M
Matt Caswell 已提交
2133

2134 2135
        if ((peer_info.addr = BIO_ADDR_new()) == NULL) {
            BIO_printf(bio_err, "memory allocation failure\n");
2136
            BIO_closesocket(sock);
R
Richard Levitte 已提交
2137
            goto end;
2138
        }
2139
        if (!BIO_sock_info(sock, BIO_SOCK_INFO_ADDRESS, &peer_info)) {
2140 2141
            BIO_printf(bio_err, "getsockname:errno=%d\n",
                       get_last_socket_error());
2142
            BIO_ADDR_free(peer_info.addr);
2143
            BIO_closesocket(sock);
2144 2145 2146
            goto end;
        }

2147 2148 2149
        (void)BIO_ctrl_set_connected(sbio, peer_info.addr);
        BIO_ADDR_free(peer_info.addr);
        peer_info.addr = NULL;
2150 2151 2152 2153 2154 2155 2156 2157 2158 2159 2160 2161 2162 2163 2164 2165 2166 2167 2168 2169 2170 2171 2172 2173

        if (enable_timeouts) {
            timeout.tv_sec = 0;
            timeout.tv_usec = DGRAM_RCV_TIMEOUT;
            BIO_ctrl(sbio, BIO_CTRL_DGRAM_SET_RECV_TIMEOUT, 0, &timeout);

            timeout.tv_sec = 0;
            timeout.tv_usec = DGRAM_SND_TIMEOUT;
            BIO_ctrl(sbio, BIO_CTRL_DGRAM_SET_SEND_TIMEOUT, 0, &timeout);
        }

        if (socket_mtu) {
            if (socket_mtu < DTLS_get_link_min_mtu(con)) {
                BIO_printf(bio_err, "MTU too small. Must be at least %ld\n",
                           DTLS_get_link_min_mtu(con));
                BIO_free(sbio);
                goto shut;
            }
            SSL_set_options(con, SSL_OP_NO_QUERY_MTU);
            if (!DTLS_set_link_mtu(con, socket_mtu)) {
                BIO_printf(bio_err, "Failed to set MTU\n");
                BIO_free(sbio);
                goto shut;
            }
2174
        } else {
2175 2176
            /* want to do MTU discovery */
            BIO_ctrl(sbio, BIO_CTRL_DGRAM_MTU_DISCOVER, 0, NULL);
2177
        }
2178
    } else
M
Matt Caswell 已提交
2179
#endif /* OPENSSL_NO_DTLS */
2180
        sbio = BIO_new_socket(sock, BIO_NOCLOSE);
2181 2182 2183 2184 2185 2186 2187 2188 2189 2190 2191 2192 2193

    if (nbio_test) {
        BIO *test;

        test = BIO_new(BIO_f_nbio_test());
        sbio = BIO_push(test, sbio);
    }

    if (c_debug) {
        BIO_set_callback(sbio, bio_dump_callback);
        BIO_set_callback_arg(sbio, (char *)bio_c_out);
    }
    if (c_msg) {
2194
#ifndef OPENSSL_NO_SSL_TRACE
2195 2196 2197
        if (c_msg == 2)
            SSL_set_msg_callback(con, SSL_trace);
        else
2198
#endif
2199 2200 2201
            SSL_set_msg_callback(con, msg_cb);
        SSL_set_msg_callback_arg(con, bio_c_msg ? bio_c_msg : bio_c_out);
    }
2202

2203 2204 2205 2206
    if (c_tlsextdebug) {
        SSL_set_tlsext_debug_callback(con, tlsext_cb);
        SSL_set_tlsext_debug_arg(con, bio_c_out);
    }
M
Matt Caswell 已提交
2207
#ifndef OPENSSL_NO_OCSP
2208 2209 2210 2211 2212
    if (c_status_req) {
        SSL_set_tlsext_status_type(con, TLSEXT_STATUSTYPE_ocsp);
        SSL_CTX_set_tlsext_status_cb(ctx, ocsp_resp_cb);
        SSL_CTX_set_tlsext_status_arg(ctx, bio_c_out);
    }
M
Matt Caswell 已提交
2213
#endif
2214 2215 2216 2217 2218

    SSL_set_bio(con, sbio, sbio);
    SSL_set_connect_state(con);

    /* ok, lets connect */
2219 2220
    if (fileno_stdin() > SSL_get_fd(con))
        width = fileno_stdin() + 1;
2221 2222
    else
        width = SSL_get_fd(con) + 1;
2223

2224 2225 2226 2227 2228 2229 2230 2231 2232 2233 2234
    read_tty = 1;
    write_tty = 0;
    tty_on = 0;
    read_ssl = 1;
    write_ssl = 1;

    cbuf_len = 0;
    cbuf_off = 0;
    sbuf_len = 0;
    sbuf_off = 0;

2235 2236 2237
    switch ((PROTOCOL_CHOICE) starttls_proto) {
    case PROTO_OFF:
        break;
2238
    case PROTO_LMTP:
2239 2240 2241 2242 2243 2244 2245 2246 2247 2248 2249 2250
    case PROTO_SMTP:
        {
            /*
             * This is an ugly hack that does a lot of assumptions. We do
             * have to handle multi-line responses which may come in a single
             * packet or not. We therefore have to use BIO_gets() which does
             * need a buffering BIO. So during the initial chitchat we do
             * push a buffering BIO into the chain that is removed again
             * later on to not disturb the rest of the s_client operation.
             */
            int foundit = 0;
            BIO *fbio = BIO_new(BIO_f_buffer());
2251

2252
            BIO_push(fbio, sbio);
2253
            /* Wait for multi-line response to end from LMTP or SMTP */
2254 2255
            do {
                mbuf_len = BIO_gets(fbio, mbuf, BUFSIZZ);
2256
            } while (mbuf_len > 3 && mbuf[3] == '-');
2257 2258
            if (protohost == NULL)
                protohost = "mail.example.com";
2259
            if (starttls_proto == (int)PROTO_LMTP)
2260
                BIO_printf(fbio, "LHLO %s\r\n", protohost);
2261
            else
2262
                BIO_printf(fbio, "EHLO %s\r\n", protohost);
2263
            (void)BIO_flush(fbio);
2264 2265 2266 2267
            /*
             * Wait for multi-line response to end LHLO LMTP or EHLO SMTP
             * response.
             */
2268 2269 2270 2271
            do {
                mbuf_len = BIO_gets(fbio, mbuf, BUFSIZZ);
                if (strstr(mbuf, "STARTTLS"))
                    foundit = 1;
2272
            } while (mbuf_len > 3 && mbuf[3] == '-');
2273 2274 2275 2276 2277
            (void)BIO_flush(fbio);
            BIO_pop(fbio);
            BIO_free(fbio);
            if (!foundit)
                BIO_printf(bio_err,
2278
                           "Didn't find STARTTLS in server response,"
Q
Quanah Gibson-Mount 已提交
2279
                           " trying anyway...\n");
2280 2281
            BIO_printf(sbio, "STARTTLS\r\n");
            BIO_read(sbio, sbuf, BUFSIZZ);
2282
        }
2283 2284 2285 2286 2287 2288 2289 2290 2291 2292
        break;
    case PROTO_POP3:
        {
            BIO_read(sbio, mbuf, BUFSIZZ);
            BIO_printf(sbio, "STLS\r\n");
            mbuf_len = BIO_read(sbio, sbuf, BUFSIZZ);
            if (mbuf_len < 0) {
                BIO_printf(bio_err, "BIO_read failed\n");
                goto end;
            }
2293
        }
2294 2295 2296 2297 2298
        break;
    case PROTO_IMAP:
        {
            int foundit = 0;
            BIO *fbio = BIO_new(BIO_f_buffer());
2299

2300 2301 2302 2303 2304 2305 2306 2307 2308 2309 2310 2311 2312 2313 2314 2315 2316
            BIO_push(fbio, sbio);
            BIO_gets(fbio, mbuf, BUFSIZZ);
            /* STARTTLS command requires CAPABILITY... */
            BIO_printf(fbio, ". CAPABILITY\r\n");
            (void)BIO_flush(fbio);
            /* wait for multi-line CAPABILITY response */
            do {
                mbuf_len = BIO_gets(fbio, mbuf, BUFSIZZ);
                if (strstr(mbuf, "STARTTLS"))
                    foundit = 1;
            }
            while (mbuf_len > 3 && mbuf[0] != '.');
            (void)BIO_flush(fbio);
            BIO_pop(fbio);
            BIO_free(fbio);
            if (!foundit)
                BIO_printf(bio_err,
2317
                           "Didn't find STARTTLS in server response,"
Q
Quanah Gibson-Mount 已提交
2318
                           " trying anyway...\n");
2319 2320
            BIO_printf(sbio, ". STARTTLS\r\n");
            BIO_read(sbio, sbuf, BUFSIZZ);
2321
        }
2322 2323 2324 2325
        break;
    case PROTO_FTP:
        {
            BIO *fbio = BIO_new(BIO_f_buffer());
2326

2327 2328 2329 2330 2331
            BIO_push(fbio, sbio);
            /* wait for multi-line response to end from FTP */
            do {
                mbuf_len = BIO_gets(fbio, mbuf, BUFSIZZ);
            }
2332
            while (mbuf_len > 3 && (!isdigit(mbuf[0]) || !isdigit(mbuf[1]) || !isdigit(mbuf[2]) || mbuf[3] != ' '));
2333 2334 2335 2336 2337
            (void)BIO_flush(fbio);
            BIO_pop(fbio);
            BIO_free(fbio);
            BIO_printf(sbio, "AUTH TLS\r\n");
            BIO_read(sbio, sbuf, BUFSIZZ);
2338
        }
2339 2340
        break;
    case PROTO_XMPP:
2341
    case PROTO_XMPP_SERVER:
2342
        {
2343 2344 2345
            int seen = 0;
            BIO_printf(sbio, "<stream:stream "
                       "xmlns:stream='http://etherx.jabber.org/streams' "
2346 2347
                       "xmlns='jabber:%s' to='%s' version='1.0'>",
                       starttls_proto == PROTO_XMPP ? "client" : "server",
2348
                       protohost ? protohost : host);
2349
            seen = BIO_read(sbio, mbuf, BUFSIZZ);
2350 2351 2352 2353 2354
            if (seen < 0) {
                BIO_printf(bio_err, "BIO_read failed\n");
                goto end;
            }
            mbuf[seen] = '\0';
2355 2356 2357 2358 2359 2360
            while (!strstr
                   (mbuf, "<starttls xmlns='urn:ietf:params:xml:ns:xmpp-tls'")
                   && !strstr(mbuf,
                              "<starttls xmlns=\"urn:ietf:params:xml:ns:xmpp-tls\""))
            {
                seen = BIO_read(sbio, mbuf, BUFSIZZ);
2361

2362 2363
                if (seen <= 0)
                    goto shut;
2364

2365
                mbuf[seen] = '\0';
2366 2367 2368 2369
            }
            BIO_printf(sbio,
                       "<starttls xmlns='urn:ietf:params:xml:ns:xmpp-tls'/>");
            seen = BIO_read(sbio, sbuf, BUFSIZZ);
2370 2371 2372 2373 2374
            if (seen < 0) {
                BIO_printf(bio_err, "BIO_read failed\n");
                goto shut;
            }
            sbuf[seen] = '\0';
2375 2376
            if (!strstr(sbuf, "<proceed"))
                goto shut;
2377
            mbuf[0] = '\0';
2378
        }
2379
        break;
2380 2381 2382 2383 2384 2385 2386 2387 2388 2389 2390 2391 2392 2393 2394 2395 2396 2397 2398 2399 2400 2401 2402 2403 2404 2405 2406 2407 2408
    case PROTO_TELNET:
        {
            static const unsigned char tls_do[] = {
                /* IAC    DO   START_TLS */
                   255,   253, 46
            };
            static const unsigned char tls_will[] = {
                /* IAC  WILL START_TLS */
                   255, 251, 46
            };
            static const unsigned char tls_follows[] = {
                /* IAC  SB   START_TLS FOLLOWS IAC  SE */
                   255, 250, 46,       1,      255, 240
            };
            int bytes;

            /* Telnet server should demand we issue START_TLS */
            bytes = BIO_read(sbio, mbuf, BUFSIZZ);
            if (bytes != 3 || memcmp(mbuf, tls_do, 3) != 0)
                goto shut;
            /* Agree to issue START_TLS and send the FOLLOWS sub-command */
            BIO_write(sbio, tls_will, 3);
            BIO_write(sbio, tls_follows, 6);
            (void)BIO_flush(sbio);
            /* Telnet server also sent the FOLLOWS sub-command */
            bytes = BIO_read(sbio, mbuf, BUFSIZZ);
            if (bytes != 6 || memcmp(mbuf, tls_follows, 6) != 0)
                goto shut;
        }
2409 2410
        break;
    case PROTO_CONNECT:
2411 2412 2413
        if (!OSSL_HTTP_proxy_connect(sbio, host, port, proxyuser, proxypass,
                                     0 /* no timeout */, bio_err, prog))
            goto shut;
2414
        break;
2415 2416 2417 2418 2419 2420 2421 2422 2423 2424 2425 2426 2427 2428 2429 2430 2431 2432 2433 2434 2435 2436 2437 2438 2439 2440 2441 2442 2443 2444 2445 2446 2447 2448 2449 2450 2451 2452 2453 2454 2455 2456 2457 2458 2459 2460 2461 2462 2463 2464 2465 2466 2467 2468 2469 2470 2471 2472 2473 2474 2475
    case PROTO_IRC:
        {
            int numeric;
            BIO *fbio = BIO_new(BIO_f_buffer());

            BIO_push(fbio, sbio);
            BIO_printf(fbio, "STARTTLS\r\n");
            (void)BIO_flush(fbio);
            width = SSL_get_fd(con) + 1;

            do {
                numeric = 0;

                FD_ZERO(&readfds);
                openssl_fdset(SSL_get_fd(con), &readfds);
                timeout.tv_sec = S_CLIENT_IRC_READ_TIMEOUT;
                timeout.tv_usec = 0;
                /*
                 * If the IRCd doesn't respond within
                 * S_CLIENT_IRC_READ_TIMEOUT seconds, assume
                 * it doesn't support STARTTLS. Many IRCds
                 * will not give _any_ sort of response to a
                 * STARTTLS command when it's not supported.
                 */
                if (!BIO_get_buffer_num_lines(fbio)
                    && !BIO_pending(fbio)
                    && !BIO_pending(sbio)
                    && select(width, (void *)&readfds, NULL, NULL,
                              &timeout) < 1) {
                    BIO_printf(bio_err,
                               "Timeout waiting for response (%d seconds).\n",
                               S_CLIENT_IRC_READ_TIMEOUT);
                    break;
                }

                mbuf_len = BIO_gets(fbio, mbuf, BUFSIZZ);
                if (mbuf_len < 1 || sscanf(mbuf, "%*s %d", &numeric) != 1)
                    break;
                /* :example.net 451 STARTTLS :You have not registered */
                /* :example.net 421 STARTTLS :Unknown command */
                if ((numeric == 451 || numeric == 421)
                    && strstr(mbuf, "STARTTLS") != NULL) {
                    BIO_printf(bio_err, "STARTTLS not supported: %s", mbuf);
                    break;
                }
                if (numeric == 691) {
                    BIO_printf(bio_err, "STARTTLS negotiation failed: ");
                    ERR_print_errors(bio_err);
                    break;
                }
            } while (numeric != 670);

            (void)BIO_flush(fbio);
            BIO_pop(fbio);
            BIO_free(fbio);
            if (numeric != 670) {
                BIO_printf(bio_err, "Server does not support STARTTLS.\n");
                ret = 1;
                goto shut;
            }
        }
V
Valentin Vidic 已提交
2476
        break;
K
Keigo Tanaka 已提交
2477 2478 2479 2480 2481 2482 2483 2484 2485 2486 2487 2488 2489 2490 2491 2492 2493 2494 2495 2496 2497 2498 2499 2500 2501 2502 2503 2504 2505 2506 2507 2508 2509 2510 2511 2512 2513 2514 2515 2516 2517 2518 2519 2520 2521 2522 2523 2524 2525 2526 2527 2528 2529 2530 2531
    case PROTO_MYSQL:
        {
            /* SSL request packet */
            static const unsigned char ssl_req[] = {
                /* payload_length,   sequence_id */
                   0x20, 0x00, 0x00, 0x01,
                /* payload */
                /* capability flags, CLIENT_SSL always set */
                   0x85, 0xae, 0x7f, 0x00,
                /* max-packet size */
                   0x00, 0x00, 0x00, 0x01,
                /* character set */
                   0x21,
                /* string[23] reserved (all [0]) */
                   0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
                   0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
                   0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
            };
            int bytes = 0;
            int ssl_flg = 0x800;
            int pos;
            const unsigned char *packet = (const unsigned char *)sbuf;

            /* Receiving Initial Handshake packet. */
            bytes = BIO_read(sbio, (void *)packet, BUFSIZZ);
            if (bytes < 0) {
                BIO_printf(bio_err, "BIO_read failed\n");
                goto shut;
            /* Packet length[3], Packet number[1] + minimum payload[17] */
            } else if (bytes < 21) {
                BIO_printf(bio_err, "MySQL packet too short.\n");
                goto shut;
            } else if (bytes != (4 + packet[0] +
                                 (packet[1] << 8) +
                                 (packet[2] << 16))) {
                BIO_printf(bio_err, "MySQL packet length does not match.\n");
                goto shut;
            /* protocol version[1] */
            } else if (packet[4] != 0xA) {
                BIO_printf(bio_err,
                           "Only MySQL protocol version 10 is supported.\n");
                goto shut;
            }

            pos = 5;
            /* server version[string+NULL] */
            for (;;) {
                if (pos >= bytes) {
                    BIO_printf(bio_err, "Cannot confirm server version. ");
                    goto shut;
                } else if (packet[pos++] == '\0') {
                    break;
                }
            }

2532
            /* make sure we have at least 15 bytes left in the packet */
K
Keigo Tanaka 已提交
2533 2534 2535 2536 2537 2538 2539 2540 2541 2542 2543 2544 2545 2546 2547 2548 2549 2550 2551 2552 2553 2554 2555 2556
            if (pos + 15 > bytes) {
                BIO_printf(bio_err,
                           "MySQL server handshake packet is broken.\n");
                goto shut;
            }

            pos += 12; /* skip over conn id[4] + SALT[8] */
            if (packet[pos++] != '\0') { /* verify filler */
                BIO_printf(bio_err,
                           "MySQL packet is broken.\n");
                goto shut;
            }

            /* capability flags[2] */
            if (!((packet[pos] + (packet[pos + 1] << 8)) & ssl_flg)) {
                BIO_printf(bio_err, "MySQL server does not support SSL.\n");
                goto shut;
            }

            /* Sending SSL Handshake packet. */
            BIO_write(sbio, ssl_req, sizeof(ssl_req));
            (void)BIO_flush(sbio);
        }
        break;
V
Valentin Vidic 已提交
2557 2558 2559 2560 2561 2562 2563 2564 2565 2566 2567 2568 2569 2570 2571 2572 2573 2574
    case PROTO_POSTGRES:
        {
            static const unsigned char ssl_request[] = {
                /* Length        SSLRequest */
                   0, 0, 0, 8,   4, 210, 22, 47
            };
            int bytes;

            /* Send SSLRequest packet */
            BIO_write(sbio, ssl_request, 8);
            (void)BIO_flush(sbio);

            /* Reply will be a single S if SSL is enabled */
            bytes = BIO_read(sbio, sbuf, BUFSIZZ);
            if (bytes != 1 || sbuf[0] != 'S')
                goto shut;
        }
        break;
2575 2576 2577 2578 2579 2580 2581 2582 2583 2584
    case PROTO_NNTP:
        {
            int foundit = 0;
            BIO *fbio = BIO_new(BIO_f_buffer());

            BIO_push(fbio, sbio);
            BIO_gets(fbio, mbuf, BUFSIZZ);
            /* STARTTLS command requires CAPABILITIES... */
            BIO_printf(fbio, "CAPABILITIES\r\n");
            (void)BIO_flush(fbio);
2585 2586 2587 2588 2589 2590 2591 2592 2593 2594
            BIO_gets(fbio, mbuf, BUFSIZZ);
            /* no point in trying to parse the CAPABILITIES response if there is none */
            if (strstr(mbuf, "101") != NULL) {
                /* wait for multi-line CAPABILITIES response */
                do {
                    mbuf_len = BIO_gets(fbio, mbuf, BUFSIZZ);
                    if (strstr(mbuf, "STARTTLS"))
                        foundit = 1;
                } while (mbuf_len > 1 && mbuf[0] != '.');
            }
2595 2596 2597 2598 2599 2600 2601 2602
            (void)BIO_flush(fbio);
            BIO_pop(fbio);
            BIO_free(fbio);
            if (!foundit)
                BIO_printf(bio_err,
                           "Didn't find STARTTLS in server response,"
                           " trying anyway...\n");
            BIO_printf(sbio, "STARTTLS\r\n");
2603 2604 2605 2606 2607 2608 2609 2610 2611 2612
            mbuf_len = BIO_read(sbio, mbuf, BUFSIZZ);
            if (mbuf_len < 0) {
                BIO_printf(bio_err, "BIO_read failed\n");
                goto end;
            }
            mbuf[mbuf_len] = '\0';
            if (strstr(mbuf, "382") == NULL) {
                BIO_printf(bio_err, "STARTTLS failed: %s", mbuf);
                goto shut;
            }
2613 2614
        }
        break;
2615 2616 2617 2618 2619 2620 2621 2622 2623 2624 2625 2626 2627 2628 2629 2630 2631 2632 2633 2634 2635 2636 2637 2638 2639 2640 2641 2642 2643 2644 2645
    case PROTO_SIEVE:
        {
            int foundit = 0;
            BIO *fbio = BIO_new(BIO_f_buffer());

            BIO_push(fbio, sbio);
            /* wait for multi-line response to end from Sieve */
            do {
                mbuf_len = BIO_gets(fbio, mbuf, BUFSIZZ);
                /*
                 * According to RFC 5804 § 1.7, capability
                 * is case-insensitive, make it uppercase
                 */
                if (mbuf_len > 1 && mbuf[0] == '"') {
                    make_uppercase(mbuf);
                    if (strncmp(mbuf, "\"STARTTLS\"", 10) == 0)
                        foundit = 1;
                }
            } while (mbuf_len > 1 && mbuf[0] == '"');
            (void)BIO_flush(fbio);
            BIO_pop(fbio);
            BIO_free(fbio);
            if (!foundit)
                BIO_printf(bio_err,
                           "Didn't find STARTTLS in server response,"
                           " trying anyway...\n");
            BIO_printf(sbio, "STARTTLS\r\n");
            mbuf_len = BIO_read(sbio, mbuf, BUFSIZZ);
            if (mbuf_len < 0) {
                BIO_printf(bio_err, "BIO_read failed\n");
                goto end;
2646 2647 2648 2649
            }
            mbuf[mbuf_len] = '\0';
            if (mbuf_len < 2) {
                BIO_printf(bio_err, "STARTTLS failed: %s", mbuf);
2650 2651 2652 2653 2654 2655 2656 2657 2658 2659 2660 2661 2662 2663
                goto shut;
            }
            /*
             * According to RFC 5804 § 2.2, response codes are case-
             * insensitive, make it uppercase but preserve the response.
             */
            strncpy(sbuf, mbuf, 2);
            make_uppercase(sbuf);
            if (strncmp(sbuf, "OK", 2) != 0) {
                BIO_printf(bio_err, "STARTTLS not supported: %s", mbuf);
                goto shut;
            }
        }
        break;
2664 2665 2666 2667 2668 2669 2670 2671 2672 2673 2674 2675 2676 2677 2678 2679 2680 2681 2682 2683 2684 2685 2686 2687 2688 2689 2690 2691 2692 2693 2694 2695 2696 2697 2698 2699 2700 2701 2702 2703 2704 2705 2706 2707 2708 2709 2710 2711 2712 2713 2714 2715 2716 2717 2718 2719 2720 2721 2722 2723 2724 2725 2726 2727 2728 2729 2730 2731 2732
    case PROTO_LDAP:
        {
            /* StartTLS Operation according to RFC 4511 */
            static char ldap_tls_genconf[] = "asn1=SEQUENCE:LDAPMessage\n"
                "[LDAPMessage]\n"
                "messageID=INTEGER:1\n"
                "extendedReq=EXPLICIT:23A,IMPLICIT:0C,"
                "FORMAT:ASCII,OCT:1.3.6.1.4.1.1466.20037\n";
            long errline = -1;
            char *genstr = NULL;
            int result = -1;
            ASN1_TYPE *atyp = NULL;
            BIO *ldapbio = BIO_new(BIO_s_mem());
            CONF *cnf = NCONF_new(NULL);

            if (cnf == NULL) {
                BIO_free(ldapbio);
                goto end;
            }
            BIO_puts(ldapbio, ldap_tls_genconf);
            if (NCONF_load_bio(cnf, ldapbio, &errline) <= 0) {
                BIO_free(ldapbio);
                NCONF_free(cnf);
                if (errline <= 0) {
                    BIO_printf(bio_err, "NCONF_load_bio failed\n");
                    goto end;
                } else {
                    BIO_printf(bio_err, "Error on line %ld\n", errline);
                    goto end;
                }
            }
            BIO_free(ldapbio);
            genstr = NCONF_get_string(cnf, "default", "asn1");
            if (genstr == NULL) {
                NCONF_free(cnf);
                BIO_printf(bio_err, "NCONF_get_string failed\n");
                goto end;
            }
            atyp = ASN1_generate_nconf(genstr, cnf);
            if (atyp == NULL) {
                NCONF_free(cnf);
                BIO_printf(bio_err, "ASN1_generate_nconf failed\n");
                goto end;
            }
            NCONF_free(cnf);

            /* Send SSLRequest packet */
            BIO_write(sbio, atyp->value.sequence->data,
                      atyp->value.sequence->length);
            (void)BIO_flush(sbio);
            ASN1_TYPE_free(atyp);

            mbuf_len = BIO_read(sbio, mbuf, BUFSIZZ);
            if (mbuf_len < 0) {
                BIO_printf(bio_err, "BIO_read failed\n");
                goto end;
            }
            result = ldap_ExtendedResponse_parse(mbuf, mbuf_len);
            if (result < 0) {
                BIO_printf(bio_err, "ldap_ExtendedResponse_parse failed\n");
                goto shut;
            } else if (result > 0) {
                BIO_printf(bio_err, "STARTTLS failed, LDAP Result Code: %i\n",
                           result);
                goto shut;
            }
            mbuf_len = 0;
        }
        break;
2733 2734
    }

2735
    if (early_data_file != NULL
2736 2737 2738 2739
            && ((SSL_get0_session(con) != NULL
                 && SSL_SESSION_get_max_early_data(SSL_get0_session(con)) > 0)
                || (psksess != NULL
                    && SSL_SESSION_get_max_early_data(psksess) > 0))) {
2740 2741 2742 2743 2744 2745 2746 2747 2748 2749 2750 2751 2752
        BIO *edfile = BIO_new_file(early_data_file, "r");
        size_t readbytes, writtenbytes;
        int finish = 0;

        if (edfile == NULL) {
            BIO_printf(bio_err, "Cannot open early data file\n");
            goto shut;
        }

        while (!finish) {
            if (!BIO_read_ex(edfile, cbuf, BUFSIZZ, &readbytes))
                finish = 1;

2753
            while (!SSL_write_early_data(con, cbuf, readbytes, &writtenbytes)) {
2754 2755 2756 2757 2758 2759 2760 2761 2762
                switch (SSL_get_error(con, 0)) {
                case SSL_ERROR_WANT_WRITE:
                case SSL_ERROR_WANT_ASYNC:
                case SSL_ERROR_WANT_READ:
                    /* Just keep trying - busy waiting */
                    continue;
                default:
                    BIO_printf(bio_err, "Error writing early data\n");
                    BIO_free(edfile);
2763
                    ERR_print_errors(bio_err);
2764 2765 2766 2767 2768 2769 2770 2771
                    goto shut;
                }
            }
        }

        BIO_free(edfile);
    }

2772 2773 2774 2775
    for (;;) {
        FD_ZERO(&readfds);
        FD_ZERO(&writefds);

2776
        if (SSL_is_dtls(con) && DTLSv1_get_timeout(con, &timeout))
2777 2778 2779 2780
            timeoutp = &timeout;
        else
            timeoutp = NULL;

M
Matt Caswell 已提交
2781
        if (!SSL_is_init_finished(con) && SSL_total_renegotiations(con) == 0
2782
                && SSL_get_key_update_type(con) == SSL_KEY_UPDATE_NONE) {
2783 2784 2785 2786 2787 2788
            in_init = 1;
            tty_on = 0;
        } else {
            tty_on = 1;
            if (in_init) {
                in_init = 0;
2789

2790 2791
                if (c_brief) {
                    BIO_puts(bio_err, "CONNECTION ESTABLISHED\n");
R
Rich Salz 已提交
2792
                    print_ssl_summary(con);
2793 2794
                }

R
Rob Percival 已提交
2795
                print_stuff(bio_c_out, con, full_log);
2796 2797 2798 2799
                if (full_log > 0)
                    full_log--;

                if (starttls_proto) {
2800
                    BIO_write(bio_err, mbuf, mbuf_len);
2801
                    /* We don't need to know any more */
2802 2803
                    if (!reconnect)
                        starttls_proto = PROTO_OFF;
2804 2805 2806 2807 2808 2809
                }

                if (reconnect) {
                    reconnect--;
                    BIO_printf(bio_c_out,
                               "drop connection and then reconnect\n");
M
Matt Caswell 已提交
2810
                    do_ssl_shutdown(con);
2811
                    SSL_set_connect_state(con);
R
Rich Salz 已提交
2812
                    BIO_closesocket(SSL_get_fd(con));
2813 2814 2815 2816 2817
                    goto re_start;
                }
            }
        }

2818
        ssl_pending = read_ssl && SSL_has_pending(con);
2819 2820

        if (!ssl_pending) {
R
Rich Salz 已提交
2821
#if !defined(OPENSSL_SYS_WINDOWS) && !defined(OPENSSL_SYS_MSDOS)
2822
            if (tty_on) {
2823 2824 2825 2826 2827 2828
                /*
                 * Note that select() returns when read _would not block_,
                 * and EOF satisfies that.  To avoid a CPU-hogging loop,
                 * set the flag so we exit.
                 */
                if (read_tty && !at_eof)
2829 2830
                    openssl_fdset(fileno_stdin(), &readfds);
#if !defined(OPENSSL_SYS_VMS)
2831
                if (write_tty)
2832
                    openssl_fdset(fileno_stdout(), &writefds);
2833
#endif
2834 2835 2836 2837 2838
            }
            if (read_ssl)
                openssl_fdset(SSL_get_fd(con), &readfds);
            if (write_ssl)
                openssl_fdset(SSL_get_fd(con), &writefds);
2839
#else
2840 2841 2842 2843 2844 2845 2846 2847 2848 2849 2850 2851 2852 2853 2854
            if (!tty_on || !write_tty) {
                if (read_ssl)
                    openssl_fdset(SSL_get_fd(con), &readfds);
                if (write_ssl)
                    openssl_fdset(SSL_get_fd(con), &writefds);
            }
#endif

            /*
             * Note: under VMS with SOCKETSHR the second parameter is
             * currently of type (int *) whereas under other systems it is
             * (void *) if you don't have a cast it will choke the compiler:
             * if you do have a cast then you can either go for (int *) or
             * (void *).
             */
2855
#if defined(OPENSSL_SYS_WINDOWS) || defined(OPENSSL_SYS_MSDOS)
2856 2857 2858 2859 2860 2861 2862 2863 2864 2865 2866 2867 2868 2869
            /*
             * Under Windows/DOS we make the assumption that we can always
             * write to the tty: therefore if we need to write to the tty we
             * just fall through. Otherwise we timeout the select every
             * second and see if there are any keypresses. Note: this is a
             * hack, in a proper Windows application we wouldn't do this.
             */
            i = 0;
            if (!write_tty) {
                if (read_tty) {
                    tv.tv_sec = 1;
                    tv.tv_usec = 0;
                    i = select(width, (void *)&readfds, (void *)&writefds,
                               NULL, &tv);
2870
                    if (!i && (!has_stdin_waiting() || !read_tty))
2871 2872 2873 2874 2875
                        continue;
                } else
                    i = select(width, (void *)&readfds, (void *)&writefds,
                               NULL, timeoutp);
            }
2876
#else
2877 2878 2879 2880 2881 2882 2883 2884 2885 2886
            i = select(width, (void *)&readfds, (void *)&writefds,
                       NULL, timeoutp);
#endif
            if (i < 0) {
                BIO_printf(bio_err, "bad select %d\n",
                           get_last_socket_error());
                goto shut;
            }
        }

2887
        if (SSL_is_dtls(con) && DTLSv1_handle_timeout(con) > 0)
2888 2889 2890 2891 2892 2893 2894 2895 2896 2897 2898 2899 2900 2901 2902 2903 2904 2905 2906 2907 2908 2909 2910 2911 2912
            BIO_printf(bio_err, "TIMEOUT occurred\n");

        if (!ssl_pending && FD_ISSET(SSL_get_fd(con), &writefds)) {
            k = SSL_write(con, &(cbuf[cbuf_off]), (unsigned int)cbuf_len);
            switch (SSL_get_error(con, k)) {
            case SSL_ERROR_NONE:
                cbuf_off += k;
                cbuf_len -= k;
                if (k <= 0)
                    goto end;
                /* we have done a  write(con,NULL,0); */
                if (cbuf_len <= 0) {
                    read_tty = 1;
                    write_ssl = 0;
                } else {        /* if (cbuf_len > 0) */

                    read_tty = 0;
                    write_ssl = 1;
                }
                break;
            case SSL_ERROR_WANT_WRITE:
                BIO_printf(bio_c_out, "write W BLOCK\n");
                write_ssl = 1;
                read_tty = 0;
                break;
2913 2914
            case SSL_ERROR_WANT_ASYNC:
                BIO_printf(bio_c_out, "write A BLOCK\n");
2915
                wait_for_async(con);
2916 2917 2918
                write_ssl = 1;
                read_tty = 0;
                break;
2919 2920 2921 2922 2923 2924 2925 2926 2927 2928 2929 2930 2931 2932 2933 2934 2935 2936 2937 2938 2939 2940 2941 2942 2943 2944 2945 2946 2947 2948
            case SSL_ERROR_WANT_READ:
                BIO_printf(bio_c_out, "write R BLOCK\n");
                write_tty = 0;
                read_ssl = 1;
                write_ssl = 0;
                break;
            case SSL_ERROR_WANT_X509_LOOKUP:
                BIO_printf(bio_c_out, "write X BLOCK\n");
                break;
            case SSL_ERROR_ZERO_RETURN:
                if (cbuf_len != 0) {
                    BIO_printf(bio_c_out, "shutdown\n");
                    ret = 0;
                    goto shut;
                } else {
                    read_tty = 1;
                    write_ssl = 0;
                    break;
                }

            case SSL_ERROR_SYSCALL:
                if ((k != 0) || (cbuf_len != 0)) {
                    BIO_printf(bio_err, "write:errno=%d\n",
                               get_last_socket_error());
                    goto shut;
                } else {
                    read_tty = 1;
                    write_ssl = 0;
                }
                break;
M
Matt Caswell 已提交
2949 2950
            case SSL_ERROR_WANT_ASYNC_JOB:
                /* This shouldn't ever happen in s_client - treat as an error */
2951 2952 2953 2954 2955
            case SSL_ERROR_SSL:
                ERR_print_errors(bio_err);
                goto shut;
            }
        }
2956
#if defined(OPENSSL_SYS_WINDOWS) || defined(OPENSSL_SYS_MSDOS) || defined(OPENSSL_SYS_VMS)
2957 2958
        /* Assume Windows/DOS/BeOS can always write */
        else if (!ssl_pending && write_tty)
2959
#else
2960
        else if (!ssl_pending && FD_ISSET(fileno_stdout(), &writefds))
2961
#endif
2962
        {
2963
#ifdef CHARSET_EBCDIC
2964 2965 2966 2967 2968 2969 2970 2971 2972 2973
            ascii2ebcdic(&(sbuf[sbuf_off]), &(sbuf[sbuf_off]), sbuf_len);
#endif
            i = raw_write_stdout(&(sbuf[sbuf_off]), sbuf_len);

            if (i <= 0) {
                BIO_printf(bio_c_out, "DONE\n");
                ret = 0;
                goto shut;
            }

F
FdaSilvaYY 已提交
2974
            sbuf_len -= i;
2975 2976 2977 2978 2979 2980
            sbuf_off += i;
            if (sbuf_len <= 0) {
                read_ssl = 1;
                write_tty = 0;
            }
        } else if (ssl_pending || FD_ISSET(SSL_get_fd(con), &readfds)) {
2981
#ifdef RENEG
2982 2983 2984 2985 2986 2987 2988
            {
                static int iiii;
                if (++iiii == 52) {
                    SSL_renegotiate(con);
                    iiii = 0;
                }
            }
2989
#endif
2990 2991 2992 2993 2994 2995 2996 2997 2998 2999 3000 3001
            k = SSL_read(con, sbuf, 1024 /* BUFSIZZ */ );

            switch (SSL_get_error(con, k)) {
            case SSL_ERROR_NONE:
                if (k <= 0)
                    goto end;
                sbuf_off = 0;
                sbuf_len = k;

                read_ssl = 0;
                write_tty = 1;
                break;
3002 3003
            case SSL_ERROR_WANT_ASYNC:
                BIO_printf(bio_c_out, "read A BLOCK\n");
3004
                wait_for_async(con);
3005 3006 3007 3008 3009
                write_tty = 0;
                read_ssl = 1;
                if ((read_tty == 0) && (write_ssl == 0))
                    write_ssl = 1;
                break;
3010 3011 3012 3013 3014 3015 3016 3017 3018 3019 3020 3021 3022 3023 3024 3025 3026 3027 3028 3029 3030 3031 3032 3033 3034 3035
            case SSL_ERROR_WANT_WRITE:
                BIO_printf(bio_c_out, "read W BLOCK\n");
                write_ssl = 1;
                read_tty = 0;
                break;
            case SSL_ERROR_WANT_READ:
                BIO_printf(bio_c_out, "read R BLOCK\n");
                write_tty = 0;
                read_ssl = 1;
                if ((read_tty == 0) && (write_ssl == 0))
                    write_ssl = 1;
                break;
            case SSL_ERROR_WANT_X509_LOOKUP:
                BIO_printf(bio_c_out, "read X BLOCK\n");
                break;
            case SSL_ERROR_SYSCALL:
                ret = get_last_socket_error();
                if (c_brief)
                    BIO_puts(bio_err, "CONNECTION CLOSED BY SERVER\n");
                else
                    BIO_printf(bio_err, "read:errno=%d\n", ret);
                goto shut;
            case SSL_ERROR_ZERO_RETURN:
                BIO_printf(bio_c_out, "closed\n");
                ret = 0;
                goto shut;
M
Matt Caswell 已提交
3036 3037
            case SSL_ERROR_WANT_ASYNC_JOB:
                /* This shouldn't ever happen in s_client. Treat as an error */
3038 3039 3040 3041 3042
            case SSL_ERROR_SSL:
                ERR_print_errors(bio_err);
                goto shut;
            }
        }
3043 3044 3045
/* OPENSSL_SYS_MSDOS includes OPENSSL_SYS_WINDOWS */
#if defined(OPENSSL_SYS_MSDOS)
        else if (has_stdin_waiting())
3046
#else
3047
        else if (FD_ISSET(fileno_stdin(), &readfds))
3048 3049 3050 3051 3052 3053 3054 3055 3056 3057 3058 3059 3060 3061 3062 3063 3064 3065 3066 3067
#endif
        {
            if (crlf) {
                int j, lf_num;

                i = raw_read_stdin(cbuf, BUFSIZZ / 2);
                lf_num = 0;
                /* both loops are skipped when i <= 0 */
                for (j = 0; j < i; j++)
                    if (cbuf[j] == '\n')
                        lf_num++;
                for (j = i - 1; j >= 0; j--) {
                    cbuf[j + lf_num] = cbuf[j];
                    if (cbuf[j] == '\n') {
                        lf_num--;
                        i++;
                        cbuf[j + lf_num] = '\r';
                    }
                }
                assert(lf_num == 0);
3068
            } else
3069
                i = raw_read_stdin(cbuf, BUFSIZZ);
3070
#if !defined(OPENSSL_SYS_WINDOWS) && !defined(OPENSSL_SYS_MSDOS)
3071 3072
            if (i == 0)
                at_eof = 1;
3073
#endif
3074

R
Rich Salz 已提交
3075
            if ((!c_ign_eof) && ((i <= 0) || (cbuf[0] == 'Q' && cmdletters))) {
3076 3077 3078 3079 3080
                BIO_printf(bio_err, "DONE\n");
                ret = 0;
                goto shut;
            }

R
Rich Salz 已提交
3081
            if ((!c_ign_eof) && (cbuf[0] == 'R' && cmdletters)) {
3082 3083 3084
                BIO_printf(bio_err, "RENEGOTIATING\n");
                SSL_renegotiate(con);
                cbuf_len = 0;
3085
            } else if (!c_ign_eof && (cbuf[0] == 'K' || cbuf[0] == 'k' )
M
Matt Caswell 已提交
3086
                    && cmdletters) {
3087 3088 3089 3090 3091
                BIO_printf(bio_err, "KEYUPDATE\n");
                SSL_key_update(con,
                               cbuf[0] == 'K' ? SSL_KEY_UPDATE_REQUESTED
                                              : SSL_KEY_UPDATE_NOT_REQUESTED);
                cbuf_len = 0;
R
Richard Levitte 已提交
3092
            } else {
3093 3094
                cbuf_len = i;
                cbuf_off = 0;
3095
#ifdef CHARSET_EBCDIC
3096 3097 3098 3099 3100 3101 3102 3103 3104 3105 3106 3107
                ebcdic2ascii(cbuf, cbuf, i);
#endif
            }

            write_ssl = 1;
            read_tty = 0;
        }
    }

    ret = 0;
 shut:
    if (in_init)
R
Rob Percival 已提交
3108
        print_stuff(bio_c_out, con, full_log);
M
Matt Caswell 已提交
3109
    do_ssl_shutdown(con);
3110

3111 3112 3113 3114 3115 3116 3117 3118 3119 3120 3121
    /*
     * If we ended with an alert being sent, but still with data in the
     * network buffer to be read, then calling BIO_closesocket() will
     * result in a TCP-RST being sent. On some platforms (notably
     * Windows) then this will result in the peer immediately abandoning
     * the connection including any buffered alert data before it has
     * had a chance to be read. Shutting down the sending side first,
     * and then closing the socket sends TCP-FIN first followed by
     * TCP-RST. This seems to allow the peer to read the alert data.
     */
    shutdown(SSL_get_fd(con), 1); /* SHUT_WR */
3122 3123 3124 3125 3126 3127 3128 3129 3130
    /*
     * We just said we have nothing else to say, but it doesn't mean that
     * the other side has nothing. It's even recommended to consume incoming
     * data. [In testing context this ensures that alerts are passed on...]
     */
    timeout.tv_sec = 0;
    timeout.tv_usec = 500000;  /* some extreme round-trip */
    do {
        FD_ZERO(&readfds);
3131 3132
        openssl_fdset(sock, &readfds);
    } while (select(sock + 1, &readfds, NULL, NULL, &timeout) > 0
3133 3134
             && BIO_read(sbio, sbuf, BUFSIZZ) > 0);

R
Rich Salz 已提交
3135
    BIO_closesocket(SSL_get_fd(con));
3136 3137 3138
 end:
    if (con != NULL) {
        if (prexit != 0)
R
Rob Percival 已提交
3139
            print_stuff(bio_c_out, con, 1);
3140 3141
        SSL_free(con);
    }
3142
    SSL_SESSION_free(psksess);
3143
#if !defined(OPENSSL_NO_NEXTPROTONEG)
R
Rich Salz 已提交
3144
    OPENSSL_free(next_proto.data);
3145
#endif
R
Rich Salz 已提交
3146
    SSL_CTX_free(ctx);
3147
    set_keylog_file(NULL, NULL);
R
Rich Salz 已提交
3148
    X509_free(cert);
R
Rich Salz 已提交
3149
    sk_X509_CRL_pop_free(crls, X509_CRL_free);
R
Rich Salz 已提交
3150
    EVP_PKEY_free(key);
R
Rich Salz 已提交
3151
    sk_X509_pop_free(chain, X509_free);
R
Rich Salz 已提交
3152
    OPENSSL_free(pass);
D
Dr. Stephen Henson 已提交
3153 3154 3155
#ifndef OPENSSL_NO_SRP
    OPENSSL_free(srp_arg.srppassin);
#endif
D
Dr. Stephen Henson 已提交
3156
    OPENSSL_free(connectstr);
3157
    OPENSSL_free(bindstr);
3158 3159
    OPENSSL_free(host);
    OPENSSL_free(port);
R
Rich Salz 已提交
3160
    X509_VERIFY_PARAM_free(vpm);
3161
    ssl_excert_free(exc);
3162
    sk_OPENSSL_STRING_free(ssl_args);
V
Viktor Dukhovni 已提交
3163
    sk_OPENSSL_STRING_free(dane_tlsa_rrset);
R
Rich Salz 已提交
3164
    SSL_CONF_CTX_free(cctx);
R
Rich Salz 已提交
3165 3166 3167
    OPENSSL_clear_free(cbuf, BUFSIZZ);
    OPENSSL_clear_free(sbuf, BUFSIZZ);
    OPENSSL_clear_free(mbuf, BUFSIZZ);
3168 3169
    if (proxypass != NULL)
        OPENSSL_clear_free(proxypass, strlen(proxypass));
3170
    release_engine(e);
R
Rich Salz 已提交
3171 3172 3173 3174
    BIO_free(bio_c_out);
    bio_c_out = NULL;
    BIO_free(bio_c_msg);
    bio_c_msg = NULL;
K
KaoruToda 已提交
3175
    return ret;
3176
}
3177

R
Rob Percival 已提交
3178
static void print_stuff(BIO *bio, SSL *s, int full)
3179 3180 3181 3182
{
    X509 *peer = NULL;
    STACK_OF(X509) *sk;
    const SSL_CIPHER *c;
3183 3184
    int i, istls13 = (SSL_version(s) == TLS1_3_VERSION);
    long verify_result;
3185
#ifndef OPENSSL_NO_COMP
3186 3187 3188
    const COMP_METHOD *comp, *expansion;
#endif
    unsigned char *exportedkeymat;
3189
#ifndef OPENSSL_NO_CT
R
Rob Percival 已提交
3190
    const SSL_CTX *ctx = SSL_get_SSL_CTX(s);
3191
#endif
3192 3193 3194 3195 3196 3197

    if (full) {
        int got_a_chain = 0;

        sk = SSL_get_peer_cert_chain(s);
        if (sk != NULL) {
3198
            got_a_chain = 1;
3199 3200 3201

            BIO_printf(bio, "---\nCertificate chain\n");
            for (i = 0; i < sk_X509_num(sk); i++) {
3202 3203 3204 3205 3206 3207
                BIO_printf(bio, "%2d s:", i);
                X509_NAME_print_ex(bio, X509_get_subject_name(sk_X509_value(sk, i)), 0, get_nameopt());
                BIO_puts(bio, "\n");
                BIO_printf(bio, "   i:");
                X509_NAME_print_ex(bio, X509_get_issuer_name(sk_X509_value(sk, i)), 0, get_nameopt());
                BIO_puts(bio, "\n");
3208 3209 3210 3211 3212 3213 3214 3215 3216 3217 3218 3219 3220
                if (c_showcerts)
                    PEM_write_bio_X509(bio, sk_X509_value(sk, i));
            }
        }

        BIO_printf(bio, "---\n");
        peer = SSL_get_peer_certificate(s);
        if (peer != NULL) {
            BIO_printf(bio, "Server certificate\n");

            /* Redundant if we showed the whole chain */
            if (!(c_showcerts && got_a_chain))
                PEM_write_bio_X509(bio, peer);
3221
            dump_cert_text(bio, peer);
3222
        } else {
3223
            BIO_printf(bio, "no peer certificate available\n");
3224
        }
3225
        print_ca_names(bio, s);
3226 3227 3228 3229

        ssl_print_sigalgs(bio, s);
        ssl_print_tmp_key(bio, s);

3230
#ifndef OPENSSL_NO_CT
3231 3232 3233 3234 3235 3236 3237 3238 3239 3240 3241 3242 3243 3244 3245 3246 3247 3248 3249 3250 3251 3252 3253 3254 3255 3256 3257 3258 3259
        /*
         * When the SSL session is anonymous, or resumed via an abbreviated
         * handshake, no SCTs are provided as part of the handshake.  While in
         * a resumed session SCTs may be present in the session's certificate,
         * no callbacks are invoked to revalidate these, and in any case that
         * set of SCTs may be incomplete.  Thus it makes little sense to
         * attempt to display SCTs from a resumed session's certificate, and of
         * course none are associated with an anonymous peer.
         */
        if (peer != NULL && !SSL_session_reused(s) && SSL_ct_is_enabled(s)) {
            const STACK_OF(SCT) *scts = SSL_get0_peer_scts(s);
            int sct_count = scts != NULL ? sk_SCT_num(scts) : 0;

            BIO_printf(bio, "---\nSCTs present (%i)\n", sct_count);
            if (sct_count > 0) {
                const CTLOG_STORE *log_store = SSL_CTX_get0_ctlog_store(ctx);

                BIO_printf(bio, "---\n");
                for (i = 0; i < sct_count; ++i) {
                    SCT *sct = sk_SCT_value(scts, i);

                    BIO_printf(bio, "SCT validation status: %s\n",
                               SCT_validation_status_string(sct));
                    SCT_print(sct, bio, 0, log_store);
                    if (i < sct_count - 1)
                        BIO_printf(bio, "\n---\n");
                }
                BIO_printf(bio, "\n");
            }
3260
        }
3261 3262
#endif

3263
        BIO_printf(bio,
3264 3265
                   "---\nSSL handshake has read %ju bytes "
                   "and written %ju bytes\n",
R
Rich Salz 已提交
3266 3267
                   BIO_number_read(SSL_get_rbio(s)),
                   BIO_number_written(SSL_get_wbio(s)));
3268
    }
3269
    print_verify_detail(s, bio);
3270
    BIO_printf(bio, (SSL_session_reused(s) ? "---\nReused, " : "---\nNew, "));
3271 3272 3273 3274 3275
    c = SSL_get_current_cipher(s);
    BIO_printf(bio, "%s, Cipher is %s\n",
               SSL_CIPHER_get_version(c), SSL_CIPHER_get_name(c));
    if (peer != NULL) {
        EVP_PKEY *pktmp;
3276

D
Dr. Stephen Henson 已提交
3277
        pktmp = X509_get0_pubkey(peer);
3278 3279 3280 3281 3282
        BIO_printf(bio, "Server public key is %d bit\n",
                   EVP_PKEY_bits(pktmp));
    }
    BIO_printf(bio, "Secure Renegotiation IS%s supported\n",
               SSL_get_secure_renegotiation_support(s) ? "" : " NOT");
3283
#ifndef OPENSSL_NO_COMP
3284 3285 3286 3287 3288 3289 3290
    comp = SSL_get_current_compression(s);
    expansion = SSL_get_current_expansion(s);
    BIO_printf(bio, "Compression: %s\n",
               comp ? SSL_COMP_get_name(comp) : "NONE");
    BIO_printf(bio, "Expansion: %s\n",
               expansion ? SSL_COMP_get_name(expansion) : "NONE");
#endif
3291 3292 3293
#ifndef OPENSSL_NO_KTLS
    if (BIO_get_ktls_send(SSL_get_wbio(s)))
        BIO_printf(bio_err, "Using Kernel TLS for sending\n");
3294 3295
    if (BIO_get_ktls_recv(SSL_get_rbio(s)))
        BIO_printf(bio_err, "Using Kernel TLS for receiving\n");
3296
#endif
3297

3298
    if (OSSL_TRACE_ENABLED(TLS)) {
3299 3300
        /* Print out local port of connection: useful for debugging */
        int sock;
3301 3302
        union BIO_sock_info_u info;

3303
        sock = SSL_get_fd(s);
3304 3305 3306
        if ((info.addr = BIO_ADDR_new()) != NULL
            && BIO_sock_info(sock, BIO_SOCK_INFO_ADDRESS, &info)) {
            BIO_printf(bio_c_out, "LOCAL PORT is %u\n",
J
Jon Loeliger 已提交
3307
                       ntohs(BIO_ADDR_rawport(info.addr)));
3308 3309
        }
        BIO_ADDR_free(info.addr);
3310
    }
3311

3312
#if !defined(OPENSSL_NO_NEXTPROTONEG)
3313 3314 3315 3316 3317 3318 3319 3320
    if (next_proto.status != -1) {
        const unsigned char *proto;
        unsigned int proto_len;
        SSL_get0_next_proto_negotiated(s, &proto, &proto_len);
        BIO_printf(bio, "Next protocol: (%d) ", next_proto.status);
        BIO_write(bio, proto, proto_len);
        BIO_write(bio, "\n", 1);
    }
3321
#endif
3322 3323 3324 3325 3326 3327 3328 3329 3330 3331 3332
    {
        const unsigned char *proto;
        unsigned int proto_len;
        SSL_get0_alpn_selected(s, &proto, &proto_len);
        if (proto_len > 0) {
            BIO_printf(bio, "ALPN protocol: ");
            BIO_write(bio, proto, proto_len);
            BIO_write(bio, "\n", 1);
        } else
            BIO_printf(bio, "No ALPN negotiated\n");
    }
3333

P
Piotr Sikora 已提交
3334
#ifndef OPENSSL_NO_SRTP
3335 3336 3337 3338 3339 3340 3341 3342 3343 3344
    {
        SRTP_PROTECTION_PROFILE *srtp_profile =
            SSL_get_selected_srtp_profile(s);

        if (srtp_profile)
            BIO_printf(bio, "SRTP Extension negotiated, profile=%s\n",
                       srtp_profile->name);
    }
#endif

3345
    if (istls13) {
3346 3347 3348 3349 3350 3351 3352 3353 3354 3355 3356 3357 3358 3359
        switch (SSL_get_early_data_status(s)) {
        case SSL_EARLY_DATA_NOT_SENT:
            BIO_printf(bio, "Early data was not sent\n");
            break;

        case SSL_EARLY_DATA_REJECTED:
            BIO_printf(bio, "Early data was rejected\n");
            break;

        case SSL_EARLY_DATA_ACCEPTED:
            BIO_printf(bio, "Early data was accepted\n");
            break;

        }
3360 3361 3362 3363 3364 3365 3366 3367 3368 3369 3370 3371

        /*
         * We also print the verify results when we dump session information,
         * but in TLSv1.3 we may not get that right away (or at all) depending
         * on when we get a NewSessionTicket. Therefore we print it now as well.
         */
        verify_result = SSL_get_verify_result(s);
        BIO_printf(bio, "Verify return code: %ld (%s)\n", verify_result,
                   X509_verify_cert_error_string(verify_result));
    } else {
        /* In TLSv1.3 we do this on arrival of a NewSessionTicket */
        SSL_SESSION_print(bio, SSL_get_session(s));
3372 3373
    }

F
FdaSilvaYY 已提交
3374
    if (SSL_get_session(s) != NULL && keymatexportlabel != NULL) {
3375 3376 3377
        BIO_printf(bio, "Keying material exporter:\n");
        BIO_printf(bio, "    Label: '%s'\n", keymatexportlabel);
        BIO_printf(bio, "    Length: %i bytes\n", keymatexportlen);
R
Rich Salz 已提交
3378 3379 3380 3381 3382 3383 3384 3385 3386 3387 3388 3389
        exportedkeymat = app_malloc(keymatexportlen, "export key");
        if (!SSL_export_keying_material(s, exportedkeymat,
                                        keymatexportlen,
                                        keymatexportlabel,
                                        strlen(keymatexportlabel),
                                        NULL, 0, 0)) {
            BIO_printf(bio, "    Error\n");
        } else {
            BIO_printf(bio, "    Keying material: ");
            for (i = 0; i < keymatexportlen; i++)
                BIO_printf(bio, "%02X", exportedkeymat[i]);
            BIO_printf(bio, "\n");
3390
        }
R
Rich Salz 已提交
3391
        OPENSSL_free(exportedkeymat);
3392 3393
    }
    BIO_printf(bio, "---\n");
R
Rich Salz 已提交
3394
    X509_free(peer);
3395 3396 3397
    /* flush, or debugging output gets mixed with http response */
    (void)BIO_flush(bio);
}
3398

M
Matt Caswell 已提交
3399
# ifndef OPENSSL_NO_OCSP
3400
static int ocsp_resp_cb(SSL *s, void *arg)
3401 3402 3403 3404 3405 3406
{
    const unsigned char *p;
    int len;
    OCSP_RESPONSE *rsp;
    len = SSL_get_tlsext_status_ocsp_resp(s, &p);
    BIO_puts(arg, "OCSP response: ");
3407
    if (p == NULL) {
3408 3409 3410 3411
        BIO_puts(arg, "no response sent\n");
        return 1;
    }
    rsp = d2i_OCSP_RESPONSE(NULL, &p, len);
3412
    if (rsp == NULL) {
3413 3414 3415 3416 3417 3418 3419 3420 3421 3422
        BIO_puts(arg, "response parse error\n");
        BIO_dump_indent(arg, (char *)p, len, 4);
        return 0;
    }
    BIO_puts(arg, "\n======================================\n");
    OCSP_RESPONSE_print(arg, rsp, 0);
    BIO_puts(arg, "======================================\n");
    OCSP_RESPONSE_free(rsp);
    return 1;
}
M
Matt Caswell 已提交
3423
# endif
M
Matt Caswell 已提交
3424

3425 3426 3427 3428 3429 3430 3431 3432 3433 3434 3435 3436 3437 3438 3439 3440 3441 3442 3443 3444 3445 3446 3447 3448 3449 3450 3451 3452 3453 3454 3455 3456 3457 3458 3459 3460 3461 3462 3463 3464 3465 3466 3467 3468
static int ldap_ExtendedResponse_parse(const char *buf, long rem)
{
    const unsigned char *cur, *end;
    long len;
    int tag, xclass, inf, ret = -1;

    cur = (const unsigned char *)buf;
    end = cur + rem;

    /*
     * From RFC 4511:
     *
     *    LDAPMessage ::= SEQUENCE {
     *         messageID       MessageID,
     *         protocolOp      CHOICE {
     *              ...
     *              extendedResp          ExtendedResponse,
     *              ... },
     *         controls       [0] Controls OPTIONAL }
     *
     *    ExtendedResponse ::= [APPLICATION 24] SEQUENCE {
     *         COMPONENTS OF LDAPResult,
     *         responseName     [10] LDAPOID OPTIONAL,
     *         responseValue    [11] OCTET STRING OPTIONAL }
     *
     *    LDAPResult ::= SEQUENCE {
     *         resultCode         ENUMERATED {
     *              success                      (0),
     *              ...
     *              other                        (80),
     *              ...  },
     *         matchedDN          LDAPDN,
     *         diagnosticMessage  LDAPString,
     *         referral           [3] Referral OPTIONAL }
     */

    /* pull SEQUENCE */
    inf = ASN1_get_object(&cur, &len, &tag, &xclass, rem);
    if (inf != V_ASN1_CONSTRUCTED || tag != V_ASN1_SEQUENCE ||
        (rem = end - cur, len > rem)) {
        BIO_printf(bio_err, "Unexpected LDAP response\n");
        goto end;
    }

3469 3470
    rem = len;  /* ensure that we don't overstep the SEQUENCE */

3471 3472 3473 3474 3475 3476 3477 3478 3479 3480 3481 3482 3483 3484 3485 3486 3487 3488 3489 3490 3491 3492 3493 3494 3495 3496 3497 3498 3499 3500 3501 3502 3503 3504 3505 3506 3507 3508
    /* pull MessageID */
    inf = ASN1_get_object(&cur, &len, &tag, &xclass, rem);
    if (inf != V_ASN1_UNIVERSAL || tag != V_ASN1_INTEGER ||
        (rem = end - cur, len > rem)) {
        BIO_printf(bio_err, "No MessageID\n");
        goto end;
    }

    cur += len; /* shall we check for MessageId match or just skip? */

    /* pull [APPLICATION 24] */
    rem = end - cur;
    inf = ASN1_get_object(&cur, &len, &tag, &xclass, rem);
    if (inf != V_ASN1_CONSTRUCTED || xclass != V_ASN1_APPLICATION ||
        tag != 24) {
        BIO_printf(bio_err, "Not ExtendedResponse\n");
        goto end;
    }

    /* pull resultCode */
    rem = end - cur;
    inf = ASN1_get_object(&cur, &len, &tag, &xclass, rem);
    if (inf != V_ASN1_UNIVERSAL || tag != V_ASN1_ENUMERATED || len == 0 ||
        (rem = end - cur, len > rem)) {
        BIO_printf(bio_err, "Not LDAPResult\n");
        goto end;
    }

    /* len should always be one, but just in case... */
    for (ret = 0, inf = 0; inf < len; inf++) {
        ret <<= 8;
        ret |= cur[inf];
    }
    /* There is more data, but we don't care... */
 end:
    return ret;
}

3509
/*
P
Pauli 已提交
3510
 * Host dNS Name verifier: used for checking that the hostname is in dNS format
3511 3512 3513 3514 3515 3516 3517 3518 3519 3520 3521 3522 3523 3524 3525 3526 3527 3528 3529 3530 3531 3532 3533 3534 3535 3536 3537 3538 3539 3540 3541 3542 3543 3544 3545 3546 3547 3548 3549 3550 3551 3552 3553 3554 3555 3556 3557 3558 3559 3560 3561 3562 3563 3564 3565 3566 3567 3568 3569 3570 3571 3572 3573
 * before setting it as SNI
 */
static int is_dNS_name(const char *host)
{
    const size_t MAX_LABEL_LENGTH = 63;
    size_t i;
    int isdnsname = 0;
    size_t length = strlen(host);
    size_t label_length = 0;
    int all_numeric = 1;

    /*
     * Deviation from strict DNS name syntax, also check names with '_'
     * Check DNS name syntax, any '-' or '.' must be internal,
     * and on either side of each '.' we can't have a '-' or '.'.
     *
     * If the name has just one label, we don't consider it a DNS name.
     */
    for (i = 0; i < length && label_length < MAX_LABEL_LENGTH; ++i) {
        char c = host[i];

        if ((c >= 'a' && c <= 'z')
            || (c >= 'A' && c <= 'Z')
            || c == '_') {
            label_length += 1;
            all_numeric = 0;
            continue;
        }

        if (c >= '0' && c <= '9') {
            label_length += 1;
            continue;
        }

        /* Dot and hyphen cannot be first or last. */
        if (i > 0 && i < length - 1) {
            if (c == '-') {
                label_length += 1;
                continue;
            }
            /*
             * Next to a dot the preceding and following characters must not be
             * another dot or a hyphen.  Otherwise, record that the name is
             * plausible, since it has two or more labels.
             */
            if (c == '.'
                && host[i + 1] != '.'
                && host[i - 1] != '-'
                && host[i + 1] != '-') {
                label_length = 0;
                isdnsname = 1;
                continue;
            }
        }
        isdnsname = 0;
        break;
    }

    /* dNS name must not be all numeric and labels must be shorter than 64 characters. */
    isdnsname &= !all_numeric && !(label_length == MAX_LABEL_LENGTH);

    return isdnsname;
}
F
FdaSilvaYY 已提交
3574
#endif                          /* OPENSSL_NO_SOCK */