xref: /openbsd-src/lib/libssl/tls13_legacy.c (revision 3df8755f76ee673080b958c208c537efddc60aa5)
1*3df8755fSjsing /*	$OpenBSD: tls13_legacy.c,v 1.44 2024/01/30 14:50:50 jsing Exp $ */
28cf56ebeSjsing /*
38cf56ebeSjsing  * Copyright (c) 2018, 2019 Joel Sing <jsing@openbsd.org>
48cf56ebeSjsing  *
58cf56ebeSjsing  * Permission to use, copy, modify, and distribute this software for any
68cf56ebeSjsing  * purpose with or without fee is hereby granted, provided that the above
78cf56ebeSjsing  * copyright notice and this permission notice appear in all copies.
88cf56ebeSjsing  *
98cf56ebeSjsing  * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
108cf56ebeSjsing  * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
118cf56ebeSjsing  * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
128cf56ebeSjsing  * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
138cf56ebeSjsing  * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
148cf56ebeSjsing  * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
158cf56ebeSjsing  * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
168cf56ebeSjsing  */
178cf56ebeSjsing 
188cf56ebeSjsing #include <limits.h>
198cf56ebeSjsing 
20c9675a23Stb #include "ssl_local.h"
218cf56ebeSjsing #include "tls13_internal.h"
228cf56ebeSjsing 
238cf56ebeSjsing static ssize_t
tls13_legacy_wire_read(SSL * ssl,uint8_t * buf,size_t len)248cf56ebeSjsing tls13_legacy_wire_read(SSL *ssl, uint8_t *buf, size_t len)
258cf56ebeSjsing {
268cf56ebeSjsing 	int n;
278cf56ebeSjsing 
288cf56ebeSjsing 	if (ssl->rbio == NULL) {
298cf56ebeSjsing 		SSLerror(ssl, SSL_R_BIO_NOT_SET);
308cf56ebeSjsing 		return TLS13_IO_FAILURE;
318cf56ebeSjsing 	}
328cf56ebeSjsing 
336f7f653bSjsing 	ssl->rwstate = SSL_READING;
34b46ff837Sjsing 	errno = 0;
358cf56ebeSjsing 
368cf56ebeSjsing 	if ((n = BIO_read(ssl->rbio, buf, len)) <= 0) {
378cf56ebeSjsing 		if (BIO_should_read(ssl->rbio))
388cf56ebeSjsing 			return TLS13_IO_WANT_POLLIN;
398cf56ebeSjsing 		if (n == 0)
408cf56ebeSjsing 			return TLS13_IO_EOF;
418cf56ebeSjsing 
42b46ff837Sjsing 		if (ERR_peek_error() == 0 && errno != 0)
43b46ff837Sjsing 			SYSerror(errno);
44b46ff837Sjsing 
458cf56ebeSjsing 		return TLS13_IO_FAILURE;
468cf56ebeSjsing 	}
478cf56ebeSjsing 
488cf56ebeSjsing 	if (n == len)
496f7f653bSjsing 		ssl->rwstate = SSL_NOTHING;
508cf56ebeSjsing 
518cf56ebeSjsing 	return n;
528cf56ebeSjsing }
538cf56ebeSjsing 
548cf56ebeSjsing ssize_t
tls13_legacy_wire_read_cb(void * buf,size_t n,void * arg)558cf56ebeSjsing tls13_legacy_wire_read_cb(void *buf, size_t n, void *arg)
568cf56ebeSjsing {
578cf56ebeSjsing 	struct tls13_ctx *ctx = arg;
588cf56ebeSjsing 
598cf56ebeSjsing 	return tls13_legacy_wire_read(ctx->ssl, buf, n);
608cf56ebeSjsing }
618cf56ebeSjsing 
628cf56ebeSjsing static ssize_t
tls13_legacy_wire_write(SSL * ssl,const uint8_t * buf,size_t len)638cf56ebeSjsing tls13_legacy_wire_write(SSL *ssl, const uint8_t *buf, size_t len)
648cf56ebeSjsing {
658cf56ebeSjsing 	int n;
668cf56ebeSjsing 
678cf56ebeSjsing 	if (ssl->wbio == NULL) {
688cf56ebeSjsing 		SSLerror(ssl, SSL_R_BIO_NOT_SET);
698cf56ebeSjsing 		return TLS13_IO_FAILURE;
708cf56ebeSjsing 	}
718cf56ebeSjsing 
726f7f653bSjsing 	ssl->rwstate = SSL_WRITING;
73b46ff837Sjsing 	errno = 0;
748cf56ebeSjsing 
758cf56ebeSjsing 	if ((n = BIO_write(ssl->wbio, buf, len)) <= 0) {
768cf56ebeSjsing 		if (BIO_should_write(ssl->wbio))
778cf56ebeSjsing 			return TLS13_IO_WANT_POLLOUT;
788cf56ebeSjsing 
79b46ff837Sjsing 		if (ERR_peek_error() == 0 && errno != 0)
80b46ff837Sjsing 			SYSerror(errno);
81b46ff837Sjsing 
828cf56ebeSjsing 		return TLS13_IO_FAILURE;
838cf56ebeSjsing 	}
848cf56ebeSjsing 
858cf56ebeSjsing 	if (n == len)
866f7f653bSjsing 		ssl->rwstate = SSL_NOTHING;
878cf56ebeSjsing 
888cf56ebeSjsing 	return n;
898cf56ebeSjsing }
908cf56ebeSjsing 
918cf56ebeSjsing ssize_t
tls13_legacy_wire_write_cb(const void * buf,size_t n,void * arg)928cf56ebeSjsing tls13_legacy_wire_write_cb(const void *buf, size_t n, void *arg)
938cf56ebeSjsing {
948cf56ebeSjsing 	struct tls13_ctx *ctx = arg;
958cf56ebeSjsing 
968cf56ebeSjsing 	return tls13_legacy_wire_write(ctx->ssl, buf, n);
978cf56ebeSjsing }
988cf56ebeSjsing 
991e0f72feSjsing static ssize_t
tls13_legacy_wire_flush(SSL * ssl)1001e0f72feSjsing tls13_legacy_wire_flush(SSL *ssl)
1011e0f72feSjsing {
1021e0f72feSjsing 	if (BIO_flush(ssl->wbio) <= 0) {
1031e0f72feSjsing 		if (BIO_should_write(ssl->wbio))
1041e0f72feSjsing 			return TLS13_IO_WANT_POLLOUT;
1051e0f72feSjsing 
1061e0f72feSjsing 		if (ERR_peek_error() == 0 && errno != 0)
1071e0f72feSjsing 			SYSerror(errno);
1081e0f72feSjsing 
1091e0f72feSjsing 		return TLS13_IO_FAILURE;
1101e0f72feSjsing 	}
1111e0f72feSjsing 
1121e0f72feSjsing 	return TLS13_IO_SUCCESS;
1131e0f72feSjsing }
1141e0f72feSjsing 
1151e0f72feSjsing ssize_t
tls13_legacy_wire_flush_cb(void * arg)1161e0f72feSjsing tls13_legacy_wire_flush_cb(void *arg)
1171e0f72feSjsing {
1181e0f72feSjsing 	struct tls13_ctx *ctx = arg;
1191e0f72feSjsing 
1201e0f72feSjsing 	return tls13_legacy_wire_flush(ctx->ssl);
1211e0f72feSjsing }
1221e0f72feSjsing 
1238cf56ebeSjsing static void
tls13_legacy_error(SSL * ssl)1248cf56ebeSjsing tls13_legacy_error(SSL *ssl)
1258cf56ebeSjsing {
1266f7f653bSjsing 	struct tls13_ctx *ctx = ssl->tls13;
1278cf56ebeSjsing 	int reason = SSL_R_UNKNOWN;
1288cf56ebeSjsing 
1298cf56ebeSjsing 	/* If we received a fatal alert we already put an error on the stack. */
13002876cc3Sjsing 	if (ssl->s3->fatal_alert != 0)
1318cf56ebeSjsing 		return;
1328cf56ebeSjsing 
1338cf56ebeSjsing 	switch (ctx->error.code) {
1348cf56ebeSjsing 	case TLS13_ERR_VERIFY_FAILED:
1358cf56ebeSjsing 		reason = SSL_R_CERTIFICATE_VERIFY_FAILED;
1368cf56ebeSjsing 		break;
1378cf56ebeSjsing 	case TLS13_ERR_HRR_FAILED:
1388cf56ebeSjsing 		reason = SSL_R_NO_CIPHERS_AVAILABLE;
1398cf56ebeSjsing 		break;
1408cf56ebeSjsing 	case TLS13_ERR_TRAILING_DATA:
1418cf56ebeSjsing 		reason = SSL_R_EXTRA_DATA_IN_MESSAGE;
1428cf56ebeSjsing 		break;
1438cf56ebeSjsing 	case TLS13_ERR_NO_SHARED_CIPHER:
1448cf56ebeSjsing 		reason = SSL_R_NO_SHARED_CIPHER;
1458cf56ebeSjsing 		break;
1463290fa22Sjsing 	case TLS13_ERR_NO_CERTIFICATE:
1473290fa22Sjsing 		reason = SSL_R_MISSING_RSA_CERTIFICATE; /* XXX */
1483290fa22Sjsing 		break;
14994ac48a6Sjsing 	case TLS13_ERR_NO_PEER_CERTIFICATE:
15094ac48a6Sjsing 		reason = SSL_R_PEER_DID_NOT_RETURN_A_CERTIFICATE;
15194ac48a6Sjsing 		break;
1528cf56ebeSjsing 	}
1538cf56ebeSjsing 
1548cf56ebeSjsing 	/* Something (probably libcrypto) already pushed an error on the stack. */
1558cf56ebeSjsing 	if (reason == SSL_R_UNKNOWN && ERR_peek_error() != 0)
1568cf56ebeSjsing 		return;
1578cf56ebeSjsing 
1588cf56ebeSjsing 	ERR_put_error(ERR_LIB_SSL, (0xfff), reason, ctx->error.file,
1598cf56ebeSjsing 	    ctx->error.line);
1608cf56ebeSjsing }
1618cf56ebeSjsing 
16234cd1859Sjsing static int
tls13_legacy_return_code(SSL * ssl,ssize_t ret)1638cf56ebeSjsing tls13_legacy_return_code(SSL *ssl, ssize_t ret)
1648cf56ebeSjsing {
1658cf56ebeSjsing 	if (ret > INT_MAX) {
1668cf56ebeSjsing 		SSLerror(ssl, ERR_R_INTERNAL_ERROR);
1678cf56ebeSjsing 		return -1;
1688cf56ebeSjsing 	}
1698cf56ebeSjsing 
1708cf56ebeSjsing 	/* A successful read, write or other operation. */
1718cf56ebeSjsing 	if (ret > 0)
1728cf56ebeSjsing 		return ret;
1738cf56ebeSjsing 
1746f7f653bSjsing 	ssl->rwstate = SSL_NOTHING;
1758cf56ebeSjsing 
1768cf56ebeSjsing 	switch (ret) {
1778cf56ebeSjsing 	case TLS13_IO_EOF:
1788cf56ebeSjsing 		return 0;
1798cf56ebeSjsing 
1808cf56ebeSjsing 	case TLS13_IO_FAILURE:
1818cf56ebeSjsing 		tls13_legacy_error(ssl);
1828cf56ebeSjsing 		return -1;
1838cf56ebeSjsing 
1848cf56ebeSjsing 	case TLS13_IO_ALERT:
1858cf56ebeSjsing 		tls13_legacy_error(ssl);
1868cf56ebeSjsing 		return -1;
1878cf56ebeSjsing 
1888cf56ebeSjsing 	case TLS13_IO_WANT_POLLIN:
1898cf56ebeSjsing 		BIO_set_retry_read(ssl->rbio);
1906f7f653bSjsing 		ssl->rwstate = SSL_READING;
1918cf56ebeSjsing 		return -1;
1928cf56ebeSjsing 
1938cf56ebeSjsing 	case TLS13_IO_WANT_POLLOUT:
1948cf56ebeSjsing 		BIO_set_retry_write(ssl->wbio);
1956f7f653bSjsing 		ssl->rwstate = SSL_WRITING;
1968cf56ebeSjsing 		return -1;
1978cf56ebeSjsing 
1988cf56ebeSjsing 	case TLS13_IO_WANT_RETRY:
1998cf56ebeSjsing 		SSLerror(ssl, ERR_R_INTERNAL_ERROR);
2008cf56ebeSjsing 		return -1;
2018cf56ebeSjsing 	}
2028cf56ebeSjsing 
2038cf56ebeSjsing 	SSLerror(ssl, ERR_R_INTERNAL_ERROR);
2048cf56ebeSjsing 	return -1;
2058cf56ebeSjsing }
2068cf56ebeSjsing 
2078cf56ebeSjsing int
tls13_legacy_pending(const SSL * ssl)2088cf56ebeSjsing tls13_legacy_pending(const SSL *ssl)
2098cf56ebeSjsing {
2106f7f653bSjsing 	struct tls13_ctx *ctx = ssl->tls13;
2118cf56ebeSjsing 	ssize_t ret;
2128cf56ebeSjsing 
2138cf56ebeSjsing 	if (ctx == NULL)
2148cf56ebeSjsing 		return 0;
2158cf56ebeSjsing 
2168cf56ebeSjsing 	ret = tls13_pending_application_data(ctx->rl);
2178cf56ebeSjsing 	if (ret < 0 || ret > INT_MAX)
2188cf56ebeSjsing 		return 0;
2198cf56ebeSjsing 
2208cf56ebeSjsing 	return ret;
2218cf56ebeSjsing }
2228cf56ebeSjsing 
2238cf56ebeSjsing int
tls13_legacy_read_bytes(SSL * ssl,int type,unsigned char * buf,int len,int peek)2248cf56ebeSjsing tls13_legacy_read_bytes(SSL *ssl, int type, unsigned char *buf, int len, int peek)
2258cf56ebeSjsing {
2266f7f653bSjsing 	struct tls13_ctx *ctx = ssl->tls13;
2278cf56ebeSjsing 	ssize_t ret;
2288cf56ebeSjsing 
2298cf56ebeSjsing 	if (ctx == NULL || !ctx->handshake_completed) {
2306f7f653bSjsing 		if ((ret = ssl->handshake_func(ssl)) <= 0)
2318cf56ebeSjsing 			return ret;
2322f68c8e7Sjsing 		if (len == 0)
2332f68c8e7Sjsing 			return 0;
2348cf56ebeSjsing 		return tls13_legacy_return_code(ssl, TLS13_IO_WANT_POLLIN);
2358cf56ebeSjsing 	}
2368cf56ebeSjsing 
23711848c02Sjsing 	tls13_record_layer_set_retry_after_phh(ctx->rl,
2386f7f653bSjsing 	    (ctx->ssl->mode & SSL_MODE_AUTO_RETRY) != 0);
23911848c02Sjsing 
2408cf56ebeSjsing 	if (type != SSL3_RT_APPLICATION_DATA) {
2418cf56ebeSjsing 		SSLerror(ssl, ERR_R_SHOULD_NOT_HAVE_BEEN_CALLED);
2428cf56ebeSjsing 		return -1;
2438cf56ebeSjsing 	}
2448cf56ebeSjsing 	if (len < 0) {
2458cf56ebeSjsing 		SSLerror(ssl, SSL_R_BAD_LENGTH);
2468cf56ebeSjsing 		return -1;
2478cf56ebeSjsing 	}
2488cf56ebeSjsing 
2498cf56ebeSjsing 	if (peek)
2508cf56ebeSjsing 		ret = tls13_peek_application_data(ctx->rl, buf, len);
2518cf56ebeSjsing 	else
2528cf56ebeSjsing 		ret = tls13_read_application_data(ctx->rl, buf, len);
2538cf56ebeSjsing 
2548cf56ebeSjsing 	return tls13_legacy_return_code(ssl, ret);
2558cf56ebeSjsing }
2568cf56ebeSjsing 
2578cf56ebeSjsing int
tls13_legacy_write_bytes(SSL * ssl,int type,const void * vbuf,int len)2588cf56ebeSjsing tls13_legacy_write_bytes(SSL *ssl, int type, const void *vbuf, int len)
2598cf56ebeSjsing {
2606f7f653bSjsing 	struct tls13_ctx *ctx = ssl->tls13;
2618cf56ebeSjsing 	const uint8_t *buf = vbuf;
2628cf56ebeSjsing 	size_t n, sent;
2638cf56ebeSjsing 	ssize_t ret;
2648cf56ebeSjsing 
2658cf56ebeSjsing 	if (ctx == NULL || !ctx->handshake_completed) {
2666f7f653bSjsing 		if ((ret = ssl->handshake_func(ssl)) <= 0)
2678cf56ebeSjsing 			return ret;
2682f68c8e7Sjsing 		if (len == 0)
2692f68c8e7Sjsing 			return 0;
2708cf56ebeSjsing 		return tls13_legacy_return_code(ssl, TLS13_IO_WANT_POLLOUT);
2718cf56ebeSjsing 	}
2728cf56ebeSjsing 
2738cf56ebeSjsing 	if (type != SSL3_RT_APPLICATION_DATA) {
2748cf56ebeSjsing 		SSLerror(ssl, ERR_R_SHOULD_NOT_HAVE_BEEN_CALLED);
2758cf56ebeSjsing 		return -1;
2768cf56ebeSjsing 	}
2778cf56ebeSjsing 	if (len < 0) {
2788cf56ebeSjsing 		SSLerror(ssl, SSL_R_BAD_LENGTH);
2798cf56ebeSjsing 		return -1;
2808cf56ebeSjsing 	}
2818cf56ebeSjsing 
2828cf56ebeSjsing 	/*
2838cf56ebeSjsing 	 * The TLSv1.3 record layer write behaviour is the same as
2848cf56ebeSjsing 	 * SSL_MODE_ENABLE_PARTIAL_WRITE.
2858cf56ebeSjsing 	 */
2866f7f653bSjsing 	if (ssl->mode & SSL_MODE_ENABLE_PARTIAL_WRITE) {
2878cf56ebeSjsing 		ret = tls13_write_application_data(ctx->rl, buf, len);
2888cf56ebeSjsing 		return tls13_legacy_return_code(ssl, ret);
2898cf56ebeSjsing 	}
2908cf56ebeSjsing 
2918cf56ebeSjsing 	/*
2928cf56ebeSjsing 	 * In the non-SSL_MODE_ENABLE_PARTIAL_WRITE case we have to loop until
2938cf56ebeSjsing 	 * we have written out all of the requested data.
2948cf56ebeSjsing 	 */
29502876cc3Sjsing 	sent = ssl->s3->wnum;
2968cf56ebeSjsing 	if (len < sent) {
2978cf56ebeSjsing 		SSLerror(ssl, SSL_R_BAD_LENGTH);
2988cf56ebeSjsing 		return -1;
2998cf56ebeSjsing 	}
3008cf56ebeSjsing 	n = len - sent;
3018cf56ebeSjsing 	for (;;) {
3028cf56ebeSjsing 		if (n == 0) {
30302876cc3Sjsing 			ssl->s3->wnum = 0;
3048cf56ebeSjsing 			return sent;
3058cf56ebeSjsing 		}
3068cf56ebeSjsing 		if ((ret = tls13_write_application_data(ctx->rl,
3078cf56ebeSjsing 		    &buf[sent], n)) <= 0) {
30802876cc3Sjsing 			ssl->s3->wnum = sent;
3098cf56ebeSjsing 			return tls13_legacy_return_code(ssl, ret);
3108cf56ebeSjsing 		}
3118cf56ebeSjsing 		sent += ret;
3128cf56ebeSjsing 		n -= ret;
3138cf56ebeSjsing 	}
3148cf56ebeSjsing }
3158cf56ebeSjsing 
31630342cdfSjsing static int
tls13_use_legacy_stack(struct tls13_ctx * ctx)31730342cdfSjsing tls13_use_legacy_stack(struct tls13_ctx *ctx)
3188a834dadSjsing {
3198a834dadSjsing 	SSL *s = ctx->ssl;
3205e22a38dSjsing 	CBB cbb, fragment;
3218a834dadSjsing 	CBS cbs;
3228a834dadSjsing 
3235e22a38dSjsing 	memset(&cbb, 0, sizeof(cbb));
3245e22a38dSjsing 
3258a834dadSjsing 	if (!ssl3_setup_init_buffer(s))
3265e22a38dSjsing 		goto err;
3278a834dadSjsing 	if (!ssl3_setup_buffers(s))
3285e22a38dSjsing 		goto err;
3295ea94325Sjsing 	if (!ssl_init_wbio_buffer(s, 1))
3305e22a38dSjsing 		goto err;
3318a834dadSjsing 
3328a834dadSjsing 	/* Stash any unprocessed data from the last record. */
3338ccc3944Sjsing 	tls13_record_layer_rcontent(ctx->rl, &cbs);
3348a834dadSjsing 	if (CBS_len(&cbs) > 0) {
33502876cc3Sjsing 		if (!CBB_init_fixed(&cbb, s->s3->rbuf.buf,
33602876cc3Sjsing 		    s->s3->rbuf.len))
3375e22a38dSjsing 			goto err;
3385e22a38dSjsing 		if (!CBB_add_u8(&cbb, SSL3_RT_HANDSHAKE))
3395e22a38dSjsing 			goto err;
3405e22a38dSjsing 		if (!CBB_add_u16(&cbb, TLS1_2_VERSION))
3415e22a38dSjsing 			goto err;
3425e22a38dSjsing 		if (!CBB_add_u16_length_prefixed(&cbb, &fragment))
3435e22a38dSjsing 			goto err;
344307e9e7cStb 		if (!CBB_add_bytes(&fragment, CBS_data(&cbs), CBS_len(&cbs)))
3455e22a38dSjsing 			goto err;
3465e22a38dSjsing 		if (!CBB_finish(&cbb, NULL, NULL))
3475e22a38dSjsing 			goto err;
3488a834dadSjsing 
34902876cc3Sjsing 		s->s3->rbuf.offset = SSL3_RT_HEADER_LENGTH;
35002876cc3Sjsing 		s->s3->rbuf.left = CBS_len(&cbs);
35102876cc3Sjsing 		s->s3->rrec.type = SSL3_RT_HANDSHAKE;
35202876cc3Sjsing 		s->s3->rrec.length = CBS_len(&cbs);
3536f7f653bSjsing 		s->rstate = SSL_ST_READ_BODY;
3546f7f653bSjsing 		s->packet = s->s3->rbuf.buf;
3556f7f653bSjsing 		s->packet_length = SSL3_RT_HEADER_LENGTH;
3566f7f653bSjsing 		s->mac_packet = 1;
3578a834dadSjsing 	}
3588a834dadSjsing 
3598a834dadSjsing 	/* Stash the current handshake message. */
3608a834dadSjsing 	tls13_handshake_msg_data(ctx->hs_msg, &cbs);
3616f7f653bSjsing 	if (!BUF_MEM_grow_clean(s->init_buf, CBS_len(&cbs)))
362ff7f34c7Sjsing 		goto err;
3636f7f653bSjsing 	if (!CBS_write_bytes(&cbs, s->init_buf->data,
3646f7f653bSjsing 	    s->init_buf->length, NULL))
3655e22a38dSjsing 		goto err;
3668a834dadSjsing 
36702876cc3Sjsing 	s->s3->hs.tls12.reuse_message = 1;
36802876cc3Sjsing 	s->s3->hs.tls12.message_type = tls13_handshake_msg_type(ctx->hs_msg);
36902876cc3Sjsing 	s->s3->hs.tls12.message_size = CBS_len(&cbs) - SSL3_HM_HEADER_LENGTH;
3708a834dadSjsing 
371dd7d88cbStb 	/*
372dd7d88cbStb 	 * Only switch the method after initialization is complete
373dd7d88cbStb 	 * as we start part way into the legacy state machine.
374dd7d88cbStb 	 */
375dd7d88cbStb 	s->method = tls_legacy_method();
376dd7d88cbStb 
37730342cdfSjsing 	return 1;
3785e22a38dSjsing 
3795e22a38dSjsing  err:
3805e22a38dSjsing 	CBB_cleanup(&cbb);
3815e22a38dSjsing 
3825e22a38dSjsing 	return 0;
38330342cdfSjsing }
38430342cdfSjsing 
38530342cdfSjsing int
tls13_use_legacy_client(struct tls13_ctx * ctx)38630342cdfSjsing tls13_use_legacy_client(struct tls13_ctx *ctx)
38730342cdfSjsing {
38830342cdfSjsing 	SSL *s = ctx->ssl;
38930342cdfSjsing 
39030342cdfSjsing 	if (!tls13_use_legacy_stack(ctx))
39130342cdfSjsing 		return 0;
39230342cdfSjsing 
3936f7f653bSjsing 	s->handshake_func = s->method->ssl_connect;
39401f29c58Sjsing 	s->version = s->method->max_tls_version;
3959fef1c44Sjsing 
3968a834dadSjsing 	return 1;
3978a834dadSjsing }
3988a834dadSjsing 
3998a834dadSjsing int
tls13_use_legacy_server(struct tls13_ctx * ctx)4008a834dadSjsing tls13_use_legacy_server(struct tls13_ctx *ctx)
4018a834dadSjsing {
4028a834dadSjsing 	SSL *s = ctx->ssl;
4038a834dadSjsing 
4049fef1c44Sjsing 	if (!tls13_use_legacy_stack(ctx))
4059fef1c44Sjsing 		return 0;
4069fef1c44Sjsing 
4076f7f653bSjsing 	s->handshake_func = s->method->ssl_accept;
40801f29c58Sjsing 	s->version = s->method->max_tls_version;
4098a834dadSjsing 	s->server = 1;
4108a834dadSjsing 
4118a834dadSjsing 	return 1;
4128a834dadSjsing }
4138a834dadSjsing 
4148a834dadSjsing int
tls13_legacy_accept(SSL * ssl)4158a834dadSjsing tls13_legacy_accept(SSL *ssl)
4168a834dadSjsing {
4176f7f653bSjsing 	struct tls13_ctx *ctx = ssl->tls13;
4188a834dadSjsing 	int ret;
4198a834dadSjsing 
4208a834dadSjsing 	if (ctx == NULL) {
4216a3d21eeSjsing 		if ((ctx = tls13_ctx_new(TLS13_HS_SERVER, ssl)) == NULL) {
4228a834dadSjsing 			SSLerror(ssl, ERR_R_INTERNAL_ERROR); /* XXX */
4238a834dadSjsing 			return -1;
4248a834dadSjsing 		}
4258a834dadSjsing 		if (!tls13_server_init(ctx)) {
4268a834dadSjsing 			if (ERR_peek_error() == 0)
4278a834dadSjsing 				SSLerror(ssl, ERR_R_INTERNAL_ERROR); /* XXX */
4288a834dadSjsing 			return -1;
4298a834dadSjsing 		}
4308a834dadSjsing 	}
4318a834dadSjsing 
4328a834dadSjsing 	ERR_clear_error();
4338a834dadSjsing 
4348a834dadSjsing 	ret = tls13_server_accept(ctx);
4358a834dadSjsing 	if (ret == TLS13_IO_USE_LEGACY)
4366ba40c14Sjsing 		return ssl->method->ssl_accept(ssl);
4378a834dadSjsing 
438d6a7e173Stb 	ret = tls13_legacy_return_code(ssl, ret);
439d6a7e173Stb 
440d6a7e173Stb 	if (ctx->info_cb != NULL)
441d6a7e173Stb 		ctx->info_cb(ctx, TLS13_INFO_ACCEPT_EXIT, ret);
442d6a7e173Stb 
443d6a7e173Stb 	return ret;
4448a834dadSjsing }
4458a834dadSjsing 
4468a834dadSjsing int
tls13_legacy_connect(SSL * ssl)4478a834dadSjsing tls13_legacy_connect(SSL *ssl)
4488a834dadSjsing {
4496f7f653bSjsing 	struct tls13_ctx *ctx = ssl->tls13;
4508a834dadSjsing 	int ret;
4518a834dadSjsing 
4528a834dadSjsing 	if (ctx == NULL) {
4536a3d21eeSjsing 		if ((ctx = tls13_ctx_new(TLS13_HS_CLIENT, ssl)) == NULL) {
4548a834dadSjsing 			SSLerror(ssl, ERR_R_INTERNAL_ERROR); /* XXX */
4558a834dadSjsing 			return -1;
4568a834dadSjsing 		}
4578a834dadSjsing 		if (!tls13_client_init(ctx)) {
4588a834dadSjsing 			if (ERR_peek_error() == 0)
4598a834dadSjsing 				SSLerror(ssl, ERR_R_INTERNAL_ERROR); /* XXX */
4608a834dadSjsing 			return -1;
4618a834dadSjsing 		}
4628a834dadSjsing 	}
4638a834dadSjsing 
4648a834dadSjsing 	ERR_clear_error();
4658a834dadSjsing 
4668a834dadSjsing 	ret = tls13_client_connect(ctx);
4678a834dadSjsing 	if (ret == TLS13_IO_USE_LEGACY)
4686ba40c14Sjsing 		return ssl->method->ssl_connect(ssl);
4698a834dadSjsing 
470d6a7e173Stb 	ret = tls13_legacy_return_code(ssl, ret);
471d6a7e173Stb 
472d6a7e173Stb 	if (ctx->info_cb != NULL)
473d6a7e173Stb 		ctx->info_cb(ctx, TLS13_INFO_CONNECT_EXIT, ret);
474d6a7e173Stb 
475d6a7e173Stb 	return ret;
4768a834dadSjsing }
4778a834dadSjsing 
4788a834dadSjsing int
tls13_legacy_shutdown(SSL * ssl)4798cf56ebeSjsing tls13_legacy_shutdown(SSL *ssl)
4808cf56ebeSjsing {
4816f7f653bSjsing 	struct tls13_ctx *ctx = ssl->tls13;
4828cf56ebeSjsing 	uint8_t buf[512]; /* XXX */
4838cf56ebeSjsing 	ssize_t ret;
4848cf56ebeSjsing 
4858cf56ebeSjsing 	/*
486ebdc0278Stb 	 * We need to return 0 at the point that we have completed sending a
487ebdc0278Stb 	 * close-notify. We return 1 when we have sent and received close-notify
488ebdc0278Stb 	 * alerts. All other cases, including EOF, return -1 and set internal
489c6c33055Sjsing 	 * state appropriately. Note that all of this insanity can also be
490c6c33055Sjsing 	 * externally controlled by manipulating the shutdown flags.
4918cf56ebeSjsing 	 */
4926f7f653bSjsing 	if (ctx == NULL || ssl->quiet_shutdown) {
4936f7f653bSjsing 		ssl->shutdown = SSL_SENT_SHUTDOWN | SSL_RECEIVED_SHUTDOWN;
4948cf56ebeSjsing 		return 1;
4958cf56ebeSjsing 	}
4968cf56ebeSjsing 
497c6c33055Sjsing 	if ((ssl->shutdown & SSL_SENT_SHUTDOWN) == 0) {
4986f7f653bSjsing 		ssl->shutdown |= SSL_SENT_SHUTDOWN;
499c6c33055Sjsing 		ret = tls13_send_alert(ctx->rl, TLS13_ALERT_CLOSE_NOTIFY);
500c6c33055Sjsing 		if (ret == TLS13_IO_EOF)
501c6c33055Sjsing 			return -1;
502c6c33055Sjsing 		if (ret != TLS13_IO_SUCCESS)
5038cf56ebeSjsing 			return tls13_legacy_return_code(ssl, ret);
504*3df8755fSjsing 		goto done;
5058cf56ebeSjsing 	}
506c6c33055Sjsing 
507ebdc0278Stb 	ret = tls13_record_layer_send_pending(ctx->rl);
508ebdc0278Stb 	if (ret == TLS13_IO_EOF)
509ebdc0278Stb 		return -1;
510ebdc0278Stb 	if (ret != TLS13_IO_SUCCESS)
5118cf56ebeSjsing 		return tls13_legacy_return_code(ssl, ret);
512c6c33055Sjsing 
513c6c33055Sjsing 	if ((ssl->shutdown & SSL_RECEIVED_SHUTDOWN) == 0) {
5148cf56ebeSjsing 		/*
5153b4c6944Sjsing 		 * If there is no application data pending, attempt to read more
51694736e2dStb 		 * data in order to receive a close-notify. This should trigger
5173b4c6944Sjsing 		 * a record to be read from the wire, which may be application
518c6c33055Sjsing 		 * handshake or alert data. Only one attempt is made with no
519c6c33055Sjsing 		 * error handling, in order to match previous semantics.
5208cf56ebeSjsing 		 */
5213b4c6944Sjsing 		if (tls13_pending_application_data(ctx->rl) == 0) {
522c6c33055Sjsing 			(void)tls13_read_application_data(ctx->rl, buf, sizeof(buf));
52394736e2dStb 			if (!ctx->close_notify_recv)
52494736e2dStb 				return -1;
5258cf56ebeSjsing 		}
5263b4c6944Sjsing 	}
5278cf56ebeSjsing 
528*3df8755fSjsing  done:
529c6c33055Sjsing 	if (ssl->shutdown == (SSL_SENT_SHUTDOWN | SSL_RECEIVED_SHUTDOWN))
5308cf56ebeSjsing 		return 1;
5318cf56ebeSjsing 
5328cf56ebeSjsing 	return 0;
5338cf56ebeSjsing }
534e4de2a75Sjsing 
535e4de2a75Sjsing int
tls13_legacy_servername_process(struct tls13_ctx * ctx,uint8_t * alert)536e4de2a75Sjsing tls13_legacy_servername_process(struct tls13_ctx *ctx, uint8_t *alert)
537e4de2a75Sjsing {
538e4de2a75Sjsing 	int legacy_alert = SSL_AD_UNRECOGNIZED_NAME;
539e4de2a75Sjsing 	int ret = SSL_TLSEXT_ERR_NOACK;
540e4de2a75Sjsing 	SSL_CTX *ssl_ctx = ctx->ssl->ctx;
54109f16f60Stb 	SSL *s = ctx->ssl;
542e4de2a75Sjsing 
5436f7f653bSjsing 	if (ssl_ctx->tlsext_servername_callback == NULL)
54409f16f60Stb 		ssl_ctx = s->initial_ctx;
5456f7f653bSjsing 	if (ssl_ctx->tlsext_servername_callback == NULL)
546e4de2a75Sjsing 		return 1;
547e4de2a75Sjsing 
5486f7f653bSjsing 	ret = ssl_ctx->tlsext_servername_callback(s, &legacy_alert,
5496f7f653bSjsing 	    ssl_ctx->tlsext_servername_arg);
550e4de2a75Sjsing 
5517fdc4fbdStb 	/*
5527fdc4fbdStb 	 * Ignore SSL_TLSEXT_ERR_ALERT_WARNING returns to match OpenSSL's
5537fdc4fbdStb 	 * behavior: the only warning alerts in TLSv1.3 are close_notify and
5547fdc4fbdStb 	 * user_canceled, neither of which should be returned by the callback.
5557fdc4fbdStb 	 */
5567fdc4fbdStb 	if (ret == SSL_TLSEXT_ERR_ALERT_FATAL) {
557e4de2a75Sjsing 		if (legacy_alert >= 0 && legacy_alert <= 255)
558e4de2a75Sjsing 			*alert = legacy_alert;
559e4de2a75Sjsing 		return 0;
560e4de2a75Sjsing 	}
561e4de2a75Sjsing 
562e4de2a75Sjsing 	return 1;
563e4de2a75Sjsing }
564