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