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