/ tools / client.c
client.c
   1  /*
   2   * Copyright (c) 2016 Thomas Pornin <pornin@bolet.org>
   3   *
   4   * Permission is hereby granted, free of charge, to any person obtaining 
   5   * a copy of this software and associated documentation files (the
   6   * "Software"), to deal in the Software without restriction, including
   7   * without limitation the rights to use, copy, modify, merge, publish,
   8   * distribute, sublicense, and/or sell copies of the Software, and to
   9   * permit persons to whom the Software is furnished to do so, subject to
  10   * the following conditions:
  11   *
  12   * The above copyright notice and this permission notice shall be 
  13   * included in all copies or substantial portions of the Software.
  14   *
  15   * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, 
  16   * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
  17   * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND 
  18   * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS
  19   * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN
  20   * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
  21   * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
  22   * SOFTWARE.
  23   */
  24  
  25  #include <stdio.h>
  26  #include <stdlib.h>
  27  #include <string.h>
  28  #include <stdint.h>
  29  #include <errno.h>
  30  #include <signal.h>
  31  
  32  #ifdef _WIN32
  33  #include <winsock2.h>
  34  #include <ws2tcpip.h>
  35  #else
  36  #include <sys/types.h>
  37  #include <sys/socket.h>
  38  #include <netdb.h>
  39  #include <netinet/in.h>
  40  #include <arpa/inet.h>
  41  #include <unistd.h>
  42  #include <fcntl.h>
  43  
  44  #define SOCKET             int
  45  #define INVALID_SOCKET     (-1)
  46  #endif
  47  
  48  #include "brssl.h"
  49  
  50  static int
  51  host_connect(const char *host, const char *port, int verbose)
  52  {
  53  	struct addrinfo hints, *si, *p;
  54  	SOCKET fd;
  55  	int err;
  56  
  57  	memset(&hints, 0, sizeof hints);
  58  	hints.ai_family = PF_UNSPEC;
  59  	hints.ai_socktype = SOCK_STREAM;
  60  	err = getaddrinfo(host, port, &hints, &si);
  61  	if (err != 0) {
  62  		fprintf(stderr, "ERROR: getaddrinfo(): %s\n",
  63  			gai_strerror(err));
  64  		return INVALID_SOCKET;
  65  	}
  66  	fd = INVALID_SOCKET;
  67  	for (p = si; p != NULL; p = p->ai_next) {
  68  		if (verbose) {
  69  			struct sockaddr *sa;
  70  			void *addr;
  71  			char tmp[INET6_ADDRSTRLEN + 50];
  72  
  73  			sa = (struct sockaddr *)p->ai_addr;
  74  			if (sa->sa_family == AF_INET) {
  75  				addr = &((struct sockaddr_in *)
  76  					(void *)sa)->sin_addr;
  77  			} else if (sa->sa_family == AF_INET6) {
  78  				addr = &((struct sockaddr_in6 *)
  79  					(void *)sa)->sin6_addr;
  80  			} else {
  81  				addr = NULL;
  82  			}
  83  			if (addr != NULL) {
  84  				if (!inet_ntop(p->ai_family, addr,
  85  					tmp, sizeof tmp))
  86  				{
  87  					strcpy(tmp, "<invalid>");
  88  				}
  89  			} else {
  90  				sprintf(tmp, "<unknown family: %d>",
  91  					(int)sa->sa_family);
  92  			}
  93  			fprintf(stderr, "connecting to: %s\n", tmp);
  94  		}
  95  		fd = socket(p->ai_family, p->ai_socktype, p->ai_protocol);
  96  		if (fd == INVALID_SOCKET) {
  97  			if (verbose) {
  98  				perror("socket()");
  99  			}
 100  			continue;
 101  		}
 102  		if (connect(fd, p->ai_addr, p->ai_addrlen) == INVALID_SOCKET) {
 103  			if (verbose) {
 104  				perror("connect()");
 105  			}
 106  #ifdef _WIN32
 107  			closesocket(fd);
 108  #else
 109  			close(fd);
 110  #endif
 111  			continue;
 112  		}
 113  		break;
 114  	}
 115  	if (p == NULL) {
 116  		freeaddrinfo(si);
 117  		fprintf(stderr, "ERROR: failed to connect\n");
 118  		return INVALID_SOCKET;
 119  	}
 120  	freeaddrinfo(si);
 121  	if (verbose) {
 122  		fprintf(stderr, "connected.\n");
 123  	}
 124  
 125  	/*
 126  	 * We make the socket non-blocking, since we are going to use
 127  	 * poll() or select() to organise I/O.
 128  	 */
 129  #ifdef _WIN32
 130  	{
 131  		u_long arg;
 132  
 133  		arg = 1;
 134  		ioctlsocket(fd, FIONBIO, &arg);
 135  	}
 136  #else
 137  	fcntl(fd, F_SETFL, O_NONBLOCK);
 138  #endif
 139  	return fd;
 140  }
 141  
 142  typedef struct {
 143  	const br_ssl_client_certificate_class *vtable;
 144  	int verbose;
 145  	br_x509_certificate *chain;
 146  	size_t chain_len;
 147  	private_key *sk;
 148  	int issuer_key_type;
 149  } ccert_context;
 150  
 151  static void
 152  cc_start_name_list(const br_ssl_client_certificate_class **pctx)
 153  {
 154  	ccert_context *zc;
 155  
 156  	zc = (ccert_context *)pctx;
 157  	if (zc->verbose) {
 158  		fprintf(stderr, "Server requests a client certificate.\n");
 159  		fprintf(stderr, "--- anchor DN list start ---\n");
 160  	}
 161  }
 162  
 163  static void
 164  cc_start_name(const br_ssl_client_certificate_class **pctx, size_t len)
 165  {
 166  	ccert_context *zc;
 167  
 168  	zc = (ccert_context *)pctx;
 169  	if (zc->verbose) {
 170  		fprintf(stderr, "new anchor name, length = %u\n",
 171  			(unsigned)len);
 172  	}
 173  }
 174  
 175  static void
 176  cc_append_name(const br_ssl_client_certificate_class **pctx,
 177  	const unsigned char *data, size_t len)
 178  {
 179  	ccert_context *zc;
 180  
 181  	zc = (ccert_context *)pctx;
 182  	if (zc->verbose) {
 183  		size_t u;
 184  
 185  		for (u = 0; u < len; u ++) {
 186  			if (u == 0) {
 187  				fprintf(stderr, "  ");
 188  			} else if (u > 0 && u % 16 == 0) {
 189  				fprintf(stderr, "\n  ");
 190  			}
 191  			fprintf(stderr, " %02x", data[u]);
 192  		}
 193  		if (len > 0) {
 194  			fprintf(stderr, "\n");
 195  		}
 196  	}
 197  }
 198  
 199  static void
 200  cc_end_name(const br_ssl_client_certificate_class **pctx)
 201  {
 202  	(void)pctx;
 203  }
 204  
 205  static void
 206  cc_end_name_list(const br_ssl_client_certificate_class **pctx)
 207  {
 208  	ccert_context *zc;
 209  
 210  	zc = (ccert_context *)pctx;
 211  	if (zc->verbose) {
 212  		fprintf(stderr, "--- anchor DN list end ---\n");
 213  	}
 214  }
 215  
 216  static void
 217  print_hashes(unsigned hh, unsigned hh2)
 218  {
 219  	int i;
 220  
 221  	for (i = 0; i < 8; i ++) {
 222  		const char *name;
 223  
 224  		name = hash_function_name(i);
 225  		if (((hh >> i) & 1) != 0) {
 226  			fprintf(stderr, " %s", name);
 227  		} else if (((hh2 >> i) & 1) != 0) {
 228  			fprintf(stderr, " (%s)", name);
 229  		}
 230  	}
 231  }
 232  
 233  static int
 234  choose_hash(unsigned hh)
 235  {
 236  	static const int f[] = {
 237  		br_sha256_ID, br_sha224_ID, br_sha384_ID, br_sha512_ID,
 238  		br_sha1_ID, br_md5sha1_ID, -1
 239  	};
 240  
 241  	size_t u;
 242  
 243  	for (u = 0; f[u] >= 0; u ++) {
 244  		if (((hh >> f[u]) & 1) != 0) {
 245  			return f[u];
 246  		}
 247  	}
 248  	return -1;
 249  }
 250  
 251  static void
 252  cc_choose(const br_ssl_client_certificate_class **pctx,
 253  	const br_ssl_client_context *cc, uint32_t auth_types,
 254  	br_ssl_client_certificate *choices)
 255  {
 256  	ccert_context *zc;
 257  	int scurve;
 258  
 259  	zc = (ccert_context *)pctx;
 260  	scurve = br_ssl_client_get_server_curve(cc);
 261  	if (zc->verbose) {
 262  		unsigned hashes;
 263  
 264  		hashes = br_ssl_client_get_server_hashes(cc);
 265  		if ((auth_types & 0x00FF) != 0) {
 266  			fprintf(stderr, "supported: RSA signatures:");
 267  			print_hashes(auth_types, hashes);
 268  			fprintf(stderr, "\n");
 269  		}
 270  		if ((auth_types & 0xFF00) != 0) {
 271  			fprintf(stderr, "supported: ECDSA signatures:");
 272  			print_hashes(auth_types >> 8, hashes >> 8);
 273  			fprintf(stderr, "\n");
 274  		}
 275  		if ((auth_types & 0x010000) != 0) {
 276  			fprintf(stderr, "supported:"
 277  				" fixed ECDH (cert signed with RSA)\n");
 278  		}
 279  		if ((auth_types & 0x020000) != 0) {
 280  			fprintf(stderr, "supported:"
 281  				" fixed ECDH (cert signed with ECDSA)\n");
 282  		}
 283  		if (scurve) {
 284  			fprintf(stderr, "server key curve: %s (%d)\n",
 285  				ec_curve_name(scurve), scurve);
 286  		} else {
 287  			fprintf(stderr, "server key is not EC\n");
 288  		}
 289  	}
 290  	switch (zc->sk->key_type) {
 291  	case BR_KEYTYPE_RSA:
 292  		if ((choices->hash_id = choose_hash(auth_types)) >= 0) {
 293  			if (zc->verbose) {
 294  				fprintf(stderr, "using RSA, hash = %d (%s)\n",
 295  					choices->hash_id,
 296  					hash_function_name(choices->hash_id));
 297  			}
 298  			choices->auth_type = BR_AUTH_RSA;
 299  			choices->chain = zc->chain;
 300  			choices->chain_len = zc->chain_len;
 301  			return;
 302  		}
 303  		break;
 304  	case BR_KEYTYPE_EC:
 305  		if (zc->issuer_key_type != 0
 306  			&& scurve == zc->sk->key.ec.curve)
 307  		{
 308  			int x;
 309  
 310  			x = (zc->issuer_key_type == BR_KEYTYPE_RSA) ? 16 : 17;
 311  			if (((auth_types >> x) & 1) != 0) {
 312  				if (zc->verbose) {
 313  					fprintf(stderr, "using static ECDH\n");
 314  				}
 315  				choices->auth_type = BR_AUTH_ECDH;
 316  				choices->hash_id = -1;
 317  				choices->chain = zc->chain;
 318  				choices->chain_len = zc->chain_len;
 319  				return;
 320  			}
 321  		}
 322  		if ((choices->hash_id = choose_hash(auth_types >> 8)) >= 0) {
 323  			if (zc->verbose) {
 324  				fprintf(stderr, "using ECDSA, hash = %d (%s)\n",
 325  					choices->hash_id,
 326  					hash_function_name(choices->hash_id));
 327  			}
 328  			choices->auth_type = BR_AUTH_ECDSA;
 329  			choices->chain = zc->chain;
 330  			choices->chain_len = zc->chain_len;
 331  			return;
 332  		}
 333  		break;
 334  	}
 335  	if (zc->verbose) {
 336  		fprintf(stderr, "no matching client certificate\n");
 337  	}
 338  	choices->chain = NULL;
 339  	choices->chain_len = 0;
 340  }
 341  
 342  static uint32_t
 343  cc_do_keyx(const br_ssl_client_certificate_class **pctx,
 344  	unsigned char *data, size_t *len)
 345  {
 346  	const br_ec_impl *iec;
 347  	ccert_context *zc;
 348  	size_t xoff, xlen;
 349  	uint32_t r;
 350  
 351  	zc = (ccert_context *)pctx;
 352  	iec = br_ec_get_default();
 353  	r = iec->mul(data, *len, zc->sk->key.ec.x,
 354  		zc->sk->key.ec.xlen, zc->sk->key.ec.curve);
 355  	xoff = iec->xoff(zc->sk->key.ec.curve, &xlen);
 356  	memmove(data, data + xoff, xlen);
 357  	*len = xlen;
 358  	return r;
 359  }
 360  
 361  static size_t
 362  cc_do_sign(const br_ssl_client_certificate_class **pctx,
 363  	int hash_id, size_t hv_len, unsigned char *data, size_t len)
 364  {
 365  	ccert_context *zc;
 366  	unsigned char hv[64];
 367  
 368  	zc = (ccert_context *)pctx;
 369  	memcpy(hv, data, hv_len);
 370  	switch (zc->sk->key_type) {
 371  		const br_hash_class *hc;
 372  		const unsigned char *hash_oid;
 373  		uint32_t x;
 374  		size_t sig_len;
 375  
 376  	case BR_KEYTYPE_RSA:
 377  		hash_oid = get_hash_oid(hash_id);
 378  		if (hash_oid == NULL && hash_id != 0) {
 379  			if (zc->verbose) {
 380  				fprintf(stderr, "ERROR: cannot RSA-sign with"
 381  					" unknown hash function: %d\n",
 382  					hash_id);
 383  			}
 384  			return 0;
 385  		}
 386  		sig_len = (zc->sk->key.rsa.n_bitlen + 7) >> 3;
 387  		if (len < sig_len) {
 388  			if (zc->verbose) {
 389  				fprintf(stderr, "ERROR: cannot RSA-sign,"
 390  					" buffer is too small"
 391  					" (sig=%lu, buf=%lu)\n",
 392  					(unsigned long)sig_len,
 393  					(unsigned long)len);
 394  			}
 395  			return 0;
 396  		}
 397  		x = br_rsa_pkcs1_sign_get_default()(
 398  			hash_oid, hv, hv_len, &zc->sk->key.rsa, data);
 399  		if (!x) {
 400  			if (zc->verbose) {
 401  				fprintf(stderr, "ERROR: RSA-sign failure\n");
 402  			}
 403  			return 0;
 404  		}
 405  		return sig_len;
 406  
 407  	case BR_KEYTYPE_EC:
 408  		hc = get_hash_impl(hash_id);
 409  		if (hc == NULL) {
 410  			if (zc->verbose) {
 411  				fprintf(stderr, "ERROR: cannot ECDSA-sign with"
 412  					" unknown hash function: %d\n",
 413  					hash_id);
 414  			}
 415  			return 0;
 416  		}
 417  		if (len < 139) {
 418  			if (zc->verbose) {
 419  				fprintf(stderr, "ERROR: cannot ECDSA-sign"
 420  					" (output buffer = %lu)\n",
 421  					(unsigned long)len);
 422  			}
 423  			return 0;
 424  		}
 425  		sig_len = br_ecdsa_sign_asn1_get_default()(
 426  			br_ec_get_default(), hc, hv, &zc->sk->key.ec, data);
 427  		if (sig_len == 0) {
 428  			if (zc->verbose) {
 429  				fprintf(stderr, "ERROR: ECDSA-sign failure\n");
 430  			}
 431  			return 0;
 432  		}
 433  		return sig_len;
 434  
 435  	default:
 436  		return 0;
 437  	}
 438  }
 439  
 440  static const br_ssl_client_certificate_class ccert_vtable = {
 441  	sizeof(ccert_context),
 442  	cc_start_name_list,
 443  	cc_start_name,
 444  	cc_append_name,
 445  	cc_end_name,
 446  	cc_end_name_list,
 447  	cc_choose,
 448  	cc_do_keyx,
 449  	cc_do_sign
 450  };
 451  
 452  static void
 453  free_alpn(void *alpn)
 454  {
 455  	xfree(*(char **)alpn);
 456  }
 457  
 458  static void
 459  usage_client(void)
 460  {
 461  	fprintf(stderr,
 462  "usage: brssl client server[:port] [ options ]\n");
 463  	fprintf(stderr,
 464  "options:\n");
 465  	fprintf(stderr,
 466  "   -q              suppress verbose messages\n");
 467  	fprintf(stderr,
 468  "   -trace          activate extra debug messages (dump of all packets)\n");
 469  	fprintf(stderr,
 470  "   -sni name       use this specific name for SNI\n");
 471  	fprintf(stderr,
 472  "   -nosni          do not send any SNI\n");
 473  	fprintf(stderr,
 474  "   -mono           use monodirectional buffering\n");
 475  	fprintf(stderr,
 476  "   -buf length     set the I/O buffer length (in bytes)\n");
 477  	fprintf(stderr,
 478  "   -CA file        add certificates in 'file' to trust anchors\n");
 479  	fprintf(stderr,
 480  "   -cert file      set client certificate chain\n");
 481  	fprintf(stderr,
 482  "   -key file       set client private key (for certificate authentication)\n");
 483  	fprintf(stderr,
 484  "   -nostaticecdh   prohibit full-static ECDH (client certificate)\n");
 485  	fprintf(stderr,
 486  "   -list           list supported names (protocols, algorithms...)\n");
 487  	fprintf(stderr,
 488  "   -vmin name      set minimum supported version (default: TLS-1.0)\n");
 489  	fprintf(stderr,
 490  "   -vmax name      set maximum supported version (default: TLS-1.2)\n");
 491  	fprintf(stderr,
 492  "   -cs names       set list of supported cipher suites (comma-separated)\n");
 493  	fprintf(stderr,
 494  "   -hf names       add support for some hash functions (comma-separated)\n");
 495  	fprintf(stderr,
 496  "   -minhello len   set minimum ClientHello length (in bytes)\n");
 497  	fprintf(stderr,
 498  "   -fallback       send the TLS_FALLBACK_SCSV (i.e. claim a downgrade)\n");
 499  	fprintf(stderr,
 500  "   -noreneg        prohibit renegotiations\n");
 501  	fprintf(stderr,
 502  "   -alpn name      add protocol name to list of protocols (ALPN extension)\n");
 503  	fprintf(stderr,
 504  "   -strictalpn     fail on ALPN mismatch\n");
 505  }
 506  
 507  /* see brssl.h */
 508  int
 509  do_client(int argc, char *argv[])
 510  {
 511  	int retcode;
 512  	int verbose;
 513  	int trace;
 514  	int i, bidi;
 515  	const char *server_name;
 516  	char *host;
 517  	char *port;
 518  	const char *sni;
 519  	anchor_list anchors = VEC_INIT;
 520  	unsigned vmin, vmax;
 521  	VECTOR(char *) alpn_names = VEC_INIT;
 522  	cipher_suite *suites;
 523  	size_t num_suites;
 524  	uint16_t *suite_ids;
 525  	unsigned hfuns;
 526  	size_t u;
 527  	br_ssl_client_context cc;
 528  	br_x509_minimal_context xc;
 529  	x509_noanchor_context xwc;
 530  	const br_hash_class *dnhash;
 531  	ccert_context zc;
 532  	br_x509_certificate *chain;
 533  	size_t chain_len;
 534  	private_key *sk;
 535  	int nostaticecdh;
 536  	unsigned char *iobuf;
 537  	size_t iobuf_len;
 538  	size_t minhello_len;
 539  	int fallback;
 540  	uint32_t flags;
 541  	SOCKET fd;
 542  
 543  	retcode = 0;
 544  	verbose = 1;
 545  	trace = 0;
 546  	server_name = NULL;
 547  	host = NULL;
 548  	port = NULL;
 549  	sni = NULL;
 550  	bidi = 1;
 551  	vmin = 0;
 552  	vmax = 0;
 553  	suites = NULL;
 554  	num_suites = 0;
 555  	hfuns = 0;
 556  	suite_ids = NULL;
 557  	chain = NULL;
 558  	chain_len = 0;
 559  	sk = NULL;
 560  	nostaticecdh = 0;
 561  	iobuf = NULL;
 562  	iobuf_len = 0;
 563  	minhello_len = (size_t)-1;
 564  	fallback = 0;
 565  	flags = 0;
 566  	fd = INVALID_SOCKET;
 567  	for (i = 0; i < argc; i ++) {
 568  		const char *arg;
 569  
 570  		arg = argv[i];
 571  		if (arg[0] != '-') {
 572  			if (server_name != NULL) {
 573  				fprintf(stderr,
 574  					"ERROR: duplicate server name\n");
 575  				usage_client();
 576  				goto client_exit_error;
 577  			}
 578  			server_name = arg;
 579  			continue;
 580  		}
 581  		if (eqstr(arg, "-v") || eqstr(arg, "-verbose")) {
 582  			verbose = 1;
 583  		} else if (eqstr(arg, "-q") || eqstr(arg, "-quiet")) {
 584  			verbose = 0;
 585  		} else if (eqstr(arg, "-trace")) {
 586  			trace = 1;
 587  		} else if (eqstr(arg, "-sni")) {
 588  			if (++ i >= argc) {
 589  				fprintf(stderr,
 590  					"ERROR: no argument for '-sni'\n");
 591  				usage_client();
 592  				goto client_exit_error;
 593  			}
 594  			if (sni != NULL) {
 595  				fprintf(stderr, "ERROR: duplicate SNI\n");
 596  				usage_client();
 597  				goto client_exit_error;
 598  			}
 599  			sni = argv[i];
 600  		} else if (eqstr(arg, "-nosni")) {
 601  			if (sni != NULL) {
 602  				fprintf(stderr, "ERROR: duplicate SNI\n");
 603  				usage_client();
 604  				goto client_exit_error;
 605  			}
 606  			sni = "";
 607  		} else if (eqstr(arg, "-mono")) {
 608  			bidi = 0;
 609  		} else if (eqstr(arg, "-buf")) {
 610  			if (++ i >= argc) {
 611  				fprintf(stderr,
 612  					"ERROR: no argument for '-buf'\n");
 613  				usage_client();
 614  				goto client_exit_error;
 615  			}
 616  			arg = argv[i];
 617  			if (iobuf_len != 0) {
 618  				fprintf(stderr,
 619  					"ERROR: duplicate I/O buffer length\n");
 620  				usage_client();
 621  				goto client_exit_error;
 622  			}
 623  			iobuf_len = parse_size(arg);
 624  			if (iobuf_len == (size_t)-1) {
 625  				usage_client();
 626  				goto client_exit_error;
 627  			}
 628  		} else if (eqstr(arg, "-CA")) {
 629  			if (++ i >= argc) {
 630  				fprintf(stderr,
 631  					"ERROR: no argument for '-CA'\n");
 632  				usage_client();
 633  				goto client_exit_error;
 634  			}
 635  			arg = argv[i];
 636  			if (read_trust_anchors(&anchors, arg) == 0) {
 637  				usage_client();
 638  				goto client_exit_error;
 639  			}
 640  		} else if (eqstr(arg, "-cert")) {
 641  			if (++ i >= argc) {
 642  				fprintf(stderr,
 643  					"ERROR: no argument for '-cert'\n");
 644  				usage_client();
 645  				goto client_exit_error;
 646  			}
 647  			if (chain != NULL) {
 648  				fprintf(stderr,
 649  					"ERROR: duplicate certificate chain\n");
 650  				usage_client();
 651  				goto client_exit_error;
 652  			}
 653  			arg = argv[i];
 654  			chain = read_certificates(arg, &chain_len);
 655  			if (chain == NULL || chain_len == 0) {
 656  				goto client_exit_error;
 657  			}
 658  		} else if (eqstr(arg, "-key")) {
 659  			if (++ i >= argc) {
 660  				fprintf(stderr,
 661  					"ERROR: no argument for '-key'\n");
 662  				usage_client();
 663  				goto client_exit_error;
 664  			}
 665  			if (sk != NULL) {
 666  				fprintf(stderr,
 667  					"ERROR: duplicate private key\n");
 668  				usage_client();
 669  				goto client_exit_error;
 670  			}
 671  			arg = argv[i];
 672  			sk = read_private_key(arg);
 673  			if (sk == NULL) {
 674  				goto client_exit_error;
 675  			}
 676  		} else if (eqstr(arg, "-nostaticecdh")) {
 677  			nostaticecdh = 1;
 678  		} else if (eqstr(arg, "-list")) {
 679  			list_names();
 680  			goto client_exit;
 681  		} else if (eqstr(arg, "-vmin")) {
 682  			if (++ i >= argc) {
 683  				fprintf(stderr,
 684  					"ERROR: no argument for '-vmin'\n");
 685  				usage_client();
 686  				goto client_exit_error;
 687  			}
 688  			arg = argv[i];
 689  			if (vmin != 0) {
 690  				fprintf(stderr,
 691  					"ERROR: duplicate minimum version\n");
 692  				usage_client();
 693  				goto client_exit_error;
 694  			}
 695  			vmin = parse_version(arg, strlen(arg));
 696  			if (vmin == 0) {
 697  				fprintf(stderr,
 698  					"ERROR: unrecognised version '%s'\n",
 699  					arg);
 700  				usage_client();
 701  				goto client_exit_error;
 702  			}
 703  		} else if (eqstr(arg, "-vmax")) {
 704  			if (++ i >= argc) {
 705  				fprintf(stderr,
 706  					"ERROR: no argument for '-vmax'\n");
 707  				usage_client();
 708  				goto client_exit_error;
 709  			}
 710  			arg = argv[i];
 711  			if (vmax != 0) {
 712  				fprintf(stderr,
 713  					"ERROR: duplicate maximum version\n");
 714  				usage_client();
 715  				goto client_exit_error;
 716  			}
 717  			vmax = parse_version(arg, strlen(arg));
 718  			if (vmax == 0) {
 719  				fprintf(stderr,
 720  					"ERROR: unrecognised version '%s'\n",
 721  					arg);
 722  				usage_client();
 723  				goto client_exit_error;
 724  			}
 725  		} else if (eqstr(arg, "-cs")) {
 726  			if (++ i >= argc) {
 727  				fprintf(stderr,
 728  					"ERROR: no argument for '-cs'\n");
 729  				usage_client();
 730  				goto client_exit_error;
 731  			}
 732  			arg = argv[i];
 733  			if (suites != NULL) {
 734  				fprintf(stderr, "ERROR: duplicate list"
 735  					" of cipher suites\n");
 736  				usage_client();
 737  				goto client_exit_error;
 738  			}
 739  			suites = parse_suites(arg, &num_suites);
 740  			if (suites == NULL) {
 741  				usage_client();
 742  				goto client_exit_error;
 743  			}
 744  		} else if (eqstr(arg, "-hf")) {
 745  			unsigned x;
 746  
 747  			if (++ i >= argc) {
 748  				fprintf(stderr,
 749  					"ERROR: no argument for '-hf'\n");
 750  				usage_client();
 751  				goto client_exit_error;
 752  			}
 753  			arg = argv[i];
 754  			x = parse_hash_functions(arg);
 755  			if (x == 0) {
 756  				usage_client();
 757  				goto client_exit_error;
 758  			}
 759  			hfuns |= x;
 760  		} else if (eqstr(arg, "-minhello")) {
 761  			if (++ i >= argc) {
 762  				fprintf(stderr,
 763  					"ERROR: no argument for '-minhello'\n");
 764  				usage_client();
 765  				goto client_exit_error;
 766  			}
 767  			arg = argv[i];
 768  			if (minhello_len != (size_t)-1) {
 769  				fprintf(stderr, "ERROR: duplicate minimum"
 770  					" ClientHello length\n");
 771  				usage_client();
 772  				goto client_exit_error;
 773  			}
 774  			minhello_len = parse_size(arg);
 775  			/*
 776  			 * Minimum ClientHello length must fit on 16 bits.
 777  			 */
 778  			if (minhello_len == (size_t)-1
 779  				|| (((minhello_len >> 12) >> 4) != 0))
 780  			{
 781  				usage_client();
 782  				goto client_exit_error;
 783  			}
 784  		} else if (eqstr(arg, "-fallback")) {
 785  			fallback = 1;
 786  		} else if (eqstr(arg, "-noreneg")) {
 787  			flags |= BR_OPT_NO_RENEGOTIATION;
 788  		} else if (eqstr(arg, "-alpn")) {
 789  			if (++ i >= argc) {
 790  				fprintf(stderr,
 791  					"ERROR: no argument for '-alpn'\n");
 792  				usage_client();
 793  				goto client_exit_error;
 794  			}
 795  			VEC_ADD(alpn_names, xstrdup(argv[i]));
 796  		} else if (eqstr(arg, "-strictalpn")) {
 797  			flags |= BR_OPT_FAIL_ON_ALPN_MISMATCH;
 798  		} else {
 799  			fprintf(stderr, "ERROR: unknown option: '%s'\n", arg);
 800  			usage_client();
 801  			goto client_exit_error;
 802  		}
 803  	}
 804  	if (server_name == NULL) {
 805  		fprintf(stderr, "ERROR: no server name/address provided\n");
 806  		usage_client();
 807  		goto client_exit_error;
 808  	}
 809  	for (u = strlen(server_name); u > 0; u --) {
 810  		int c = server_name[u - 1];
 811  		if (c == ':') {
 812  			break;
 813  		}
 814  		if (c < '0' || c > '9') {
 815  			u = 0;
 816  			break;
 817  		}
 818  	}
 819  	if (u == 0) {
 820  		host = xstrdup(server_name);
 821  		port = xstrdup("443");
 822  	} else {
 823  		port = xstrdup(server_name + u);
 824  		host = xmalloc(u);
 825  		memcpy(host, server_name, u - 1);
 826  		host[u - 1] = 0;
 827  	}
 828  	if (sni == NULL) {
 829  		sni = host;
 830  	}
 831  
 832  	if (chain == NULL && sk != NULL) {
 833  		fprintf(stderr, "ERROR: private key specified, but"
 834  			" no certificate chain\n");
 835  		usage_client();
 836  		goto client_exit_error;
 837  	}
 838  	if (chain != NULL && sk == NULL) {
 839  		fprintf(stderr, "ERROR: certificate chain specified, but"
 840  			" no private key\n");
 841  		usage_client();
 842  		goto client_exit_error;
 843  	}
 844  
 845  	if (vmin == 0) {
 846  		vmin = BR_TLS10;
 847  	}
 848  	if (vmax == 0) {
 849  		vmax = BR_TLS12;
 850  	}
 851  	if (vmax < vmin) {
 852  		fprintf(stderr, "ERROR: impossible minimum/maximum protocol"
 853  			" version combination\n");
 854  		usage_client();
 855  		goto client_exit_error;
 856  	}
 857  	if (suites == NULL) {
 858  		num_suites = 0;
 859  
 860  		for (u = 0; cipher_suites[u].name; u ++) {
 861  			if ((cipher_suites[u].req & REQ_TLS12) == 0
 862  				|| vmax >= BR_TLS12)
 863  			{
 864  				num_suites ++;
 865  			}
 866  		}
 867  		suites = xmalloc(num_suites * sizeof *suites);
 868  		num_suites = 0;
 869  		for (u = 0; cipher_suites[u].name; u ++) {
 870  			if ((cipher_suites[u].req & REQ_TLS12) == 0
 871  				|| vmax >= BR_TLS12)
 872  			{
 873  				suites[num_suites ++] = cipher_suites[u];
 874  			}
 875  		}
 876  	}
 877  	if (hfuns == 0) {
 878  		hfuns = (unsigned)-1;
 879  	}
 880  	if (iobuf_len == 0) {
 881  		if (bidi) {
 882  			iobuf_len = BR_SSL_BUFSIZE_BIDI;
 883  		} else {
 884  			iobuf_len = BR_SSL_BUFSIZE_MONO;
 885  		}
 886  	}
 887  	iobuf = xmalloc(iobuf_len);
 888  
 889  	/*
 890  	 * Compute implementation requirements and inject implementations.
 891  	 */
 892  	suite_ids = xmalloc((num_suites + 1) * sizeof *suite_ids);
 893  	br_ssl_client_zero(&cc);
 894  	br_ssl_engine_set_versions(&cc.eng, vmin, vmax);
 895  	dnhash = NULL;
 896  	for (u = 0; hash_functions[u].name; u ++) {
 897  		const br_hash_class *hc;
 898  		int id;
 899  
 900  		hc = hash_functions[u].hclass;
 901  		id = (hc->desc >> BR_HASHDESC_ID_OFF) & BR_HASHDESC_ID_MASK;
 902  		if ((hfuns & ((unsigned)1 << id)) != 0) {
 903  			dnhash = hc;
 904  		}
 905  	}
 906  	if (dnhash == NULL) {
 907  		fprintf(stderr, "ERROR: no supported hash function\n");
 908  		goto client_exit_error;
 909  	}
 910  	br_x509_minimal_init(&xc, dnhash,
 911  		&VEC_ELT(anchors, 0), VEC_LEN(anchors));
 912  	if (vmin <= BR_TLS11) {
 913  		if (!(hfuns & (1 << br_md5_ID))) {
 914  			fprintf(stderr, "ERROR: TLS 1.0 and 1.1 need MD5\n");
 915  			goto client_exit_error;
 916  		}
 917  		if (!(hfuns & (1 << br_sha1_ID))) {
 918  			fprintf(stderr, "ERROR: TLS 1.0 and 1.1 need SHA-1\n");
 919  			goto client_exit_error;
 920  		}
 921  	}
 922  	for (u = 0; u < num_suites; u ++) {
 923  		unsigned req;
 924  
 925  		req = suites[u].req;
 926  		suite_ids[u] = suites[u].suite;
 927  		if ((req & REQ_TLS12) != 0 && vmax < BR_TLS12) {
 928  			fprintf(stderr,
 929  				"ERROR: cipher suite %s requires TLS 1.2\n",
 930  				suites[u].name);
 931  			goto client_exit_error;
 932  		}
 933  		if ((req & REQ_SHA1) != 0 && !(hfuns & (1 << br_sha1_ID))) {
 934  			fprintf(stderr,
 935  				"ERROR: cipher suite %s requires SHA-1\n",
 936  				suites[u].name);
 937  			goto client_exit_error;
 938  		}
 939  		if ((req & REQ_SHA256) != 0 && !(hfuns & (1 << br_sha256_ID))) {
 940  			fprintf(stderr,
 941  				"ERROR: cipher suite %s requires SHA-256\n",
 942  				suites[u].name);
 943  			goto client_exit_error;
 944  		}
 945  		if ((req & REQ_SHA384) != 0 && !(hfuns & (1 << br_sha384_ID))) {
 946  			fprintf(stderr,
 947  				"ERROR: cipher suite %s requires SHA-384\n",
 948  				suites[u].name);
 949  			goto client_exit_error;
 950  		}
 951  		/* TODO: algorithm implementation selection */
 952  		if ((req & REQ_AESCBC) != 0) {
 953  			br_ssl_engine_set_default_aes_cbc(&cc.eng);
 954  		}
 955  		if ((req & REQ_AESCCM) != 0) {
 956  			br_ssl_engine_set_default_aes_ccm(&cc.eng);
 957  		}
 958  		if ((req & REQ_AESGCM) != 0) {
 959  			br_ssl_engine_set_default_aes_gcm(&cc.eng);
 960  		}
 961  		if ((req & REQ_CHAPOL) != 0) {
 962  			br_ssl_engine_set_default_chapol(&cc.eng);
 963  		}
 964  		if ((req & REQ_3DESCBC) != 0) {
 965  			br_ssl_engine_set_default_des_cbc(&cc.eng);
 966  		}
 967  		if ((req & REQ_RSAKEYX) != 0) {
 968  			br_ssl_client_set_default_rsapub(&cc);
 969  		}
 970  		if ((req & REQ_ECDHE_RSA) != 0) {
 971  			br_ssl_engine_set_default_ec(&cc.eng);
 972  			br_ssl_engine_set_default_rsavrfy(&cc.eng);
 973  		}
 974  		if ((req & REQ_ECDHE_ECDSA) != 0) {
 975  			br_ssl_engine_set_default_ecdsa(&cc.eng);
 976  		}
 977  		if ((req & REQ_ECDH) != 0) {
 978  			br_ssl_engine_set_default_ec(&cc.eng);
 979  		}
 980  	}
 981  	if (fallback) {
 982  		suite_ids[num_suites ++] = 0x5600;
 983  	}
 984  	br_ssl_engine_set_suites(&cc.eng, suite_ids, num_suites);
 985  
 986  	for (u = 0; hash_functions[u].name; u ++) {
 987  		const br_hash_class *hc;
 988  		int id;
 989  
 990  		hc = hash_functions[u].hclass;
 991  		id = (hc->desc >> BR_HASHDESC_ID_OFF) & BR_HASHDESC_ID_MASK;
 992  		if ((hfuns & ((unsigned)1 << id)) != 0) {
 993  			br_ssl_engine_set_hash(&cc.eng, id, hc);
 994  			br_x509_minimal_set_hash(&xc, id, hc);
 995  		}
 996  	}
 997  	if (vmin <= BR_TLS11) {
 998  		br_ssl_engine_set_prf10(&cc.eng, &br_tls10_prf);
 999  	}
1000  	if (vmax >= BR_TLS12) {
1001  		if ((hfuns & ((unsigned)1 << br_sha256_ID)) != 0) {
1002  			br_ssl_engine_set_prf_sha256(&cc.eng,
1003  				&br_tls12_sha256_prf);
1004  		}
1005  		if ((hfuns & ((unsigned)1 << br_sha384_ID)) != 0) {
1006  			br_ssl_engine_set_prf_sha384(&cc.eng,
1007  				&br_tls12_sha384_prf);
1008  		}
1009  	}
1010  	br_x509_minimal_set_rsa(&xc, br_rsa_pkcs1_vrfy_get_default());
1011  	br_x509_minimal_set_ecdsa(&xc,
1012  		br_ec_get_default(), br_ecdsa_vrfy_asn1_get_default());
1013  
1014  	/*
1015  	 * If there is no provided trust anchor, then certificate validation
1016  	 * will always fail. In that situation, we use our custom wrapper
1017  	 * that tolerates unknown anchors.
1018  	 */
1019  	if (VEC_LEN(anchors) == 0) {
1020  		if (verbose) {
1021  			fprintf(stderr,
1022  				"WARNING: no configured trust anchor\n");
1023  		}
1024  		x509_noanchor_init(&xwc, &xc.vtable);
1025  		br_ssl_engine_set_x509(&cc.eng, &xwc.vtable);
1026  	} else {
1027  		br_ssl_engine_set_x509(&cc.eng, &xc.vtable);
1028  	}
1029  
1030  	if (minhello_len != (size_t)-1) {
1031  		br_ssl_client_set_min_clienthello_len(&cc, minhello_len);
1032  	}
1033  	br_ssl_engine_set_all_flags(&cc.eng, flags);
1034  	if (VEC_LEN(alpn_names) != 0) {
1035  		br_ssl_engine_set_protocol_names(&cc.eng,
1036  			(const char **)&VEC_ELT(alpn_names, 0),
1037  			VEC_LEN(alpn_names));
1038  	}
1039  
1040  	if (chain != NULL) {
1041  		zc.vtable = &ccert_vtable;
1042  		zc.verbose = verbose;
1043  		zc.chain = chain;
1044  		zc.chain_len = chain_len;
1045  		zc.sk = sk;
1046  		if (nostaticecdh || sk->key_type != BR_KEYTYPE_EC) {
1047  			zc.issuer_key_type = 0;
1048  		} else {
1049  			zc.issuer_key_type = get_cert_signer_algo(&chain[0]);
1050  			if (zc.issuer_key_type == 0) {
1051  				goto client_exit_error;
1052  			}
1053  		}
1054  		br_ssl_client_set_client_certificate(&cc, &zc.vtable);
1055  	}
1056  
1057  	br_ssl_engine_set_buffer(&cc.eng, iobuf, iobuf_len, bidi);
1058  	br_ssl_client_reset(&cc, sni, 0);
1059  
1060  	/*
1061  	 * On Unix systems, we need to avoid SIGPIPE.
1062  	 */
1063  #ifndef _WIN32
1064  	signal(SIGPIPE, SIG_IGN);
1065  #endif
1066  
1067  	/*
1068  	 * Connect to the peer.
1069  	 */
1070  	fd = host_connect(host, port, verbose);
1071  	if (fd == INVALID_SOCKET) {
1072  		goto client_exit_error;
1073  	}
1074  
1075  	/*
1076  	 * Run the engine until completion.
1077  	 */
1078  	if (run_ssl_engine(&cc.eng, fd,
1079  		(verbose ? RUN_ENGINE_VERBOSE : 0)
1080  		| (trace ? RUN_ENGINE_TRACE : 0)) != 0)
1081  	{
1082  		goto client_exit_error;
1083  	} else {
1084  		goto client_exit;
1085  	}
1086  
1087  	/*
1088  	 * Release allocated structures.
1089  	 */
1090  client_exit:
1091  	xfree(host);
1092  	xfree(port);
1093  	xfree(suites);
1094  	xfree(suite_ids);
1095  	VEC_CLEAREXT(anchors, &free_ta_contents);
1096  	VEC_CLEAREXT(alpn_names, &free_alpn);
1097  	free_certificates(chain, chain_len);
1098  	free_private_key(sk);
1099  	xfree(iobuf);
1100  	if (fd != INVALID_SOCKET) {
1101  #ifdef _WIN32
1102  		closesocket(fd);
1103  #else
1104  		close(fd);
1105  #endif
1106  	}
1107  	return retcode;
1108  
1109  client_exit_error:
1110  	retcode = -1;
1111  	goto client_exit;
1112  }