xref: /openbsd/lib/libssl/ssl_pkt.c (revision f4fe6251)
1*f4fe6251Sjsing /* $OpenBSD: ssl_pkt.c,v 1.68 2024/07/22 14:47:15 jsing Exp $ */
23395f70eSjsing /* Copyright (C) 1995-1998 Eric Young (eay@cryptsoft.com)
33395f70eSjsing  * All rights reserved.
43395f70eSjsing  *
53395f70eSjsing  * This package is an SSL implementation written
63395f70eSjsing  * by Eric Young (eay@cryptsoft.com).
73395f70eSjsing  * The implementation was written so as to conform with Netscapes SSL.
83395f70eSjsing  *
93395f70eSjsing  * This library is free for commercial and non-commercial use as long as
103395f70eSjsing  * the following conditions are aheared to.  The following conditions
113395f70eSjsing  * apply to all code found in this distribution, be it the RC4, RSA,
123395f70eSjsing  * lhash, DES, etc., code; not just the SSL code.  The SSL documentation
133395f70eSjsing  * included with this distribution is covered by the same copyright terms
143395f70eSjsing  * except that the holder is Tim Hudson (tjh@cryptsoft.com).
153395f70eSjsing  *
163395f70eSjsing  * Copyright remains Eric Young's, and as such any Copyright notices in
173395f70eSjsing  * the code are not to be removed.
183395f70eSjsing  * If this package is used in a product, Eric Young should be given attribution
193395f70eSjsing  * as the author of the parts of the library used.
203395f70eSjsing  * This can be in the form of a textual message at program startup or
213395f70eSjsing  * in documentation (online or textual) provided with the package.
223395f70eSjsing  *
233395f70eSjsing  * Redistribution and use in source and binary forms, with or without
243395f70eSjsing  * modification, are permitted provided that the following conditions
253395f70eSjsing  * are met:
263395f70eSjsing  * 1. Redistributions of source code must retain the copyright
273395f70eSjsing  *    notice, this list of conditions and the following disclaimer.
283395f70eSjsing  * 2. Redistributions in binary form must reproduce the above copyright
293395f70eSjsing  *    notice, this list of conditions and the following disclaimer in the
303395f70eSjsing  *    documentation and/or other materials provided with the distribution.
313395f70eSjsing  * 3. All advertising materials mentioning features or use of this software
323395f70eSjsing  *    must display the following acknowledgement:
333395f70eSjsing  *    "This product includes cryptographic software written by
343395f70eSjsing  *     Eric Young (eay@cryptsoft.com)"
353395f70eSjsing  *    The word 'cryptographic' can be left out if the rouines from the library
363395f70eSjsing  *    being used are not cryptographic related :-).
373395f70eSjsing  * 4. If you include any Windows specific code (or a derivative thereof) from
383395f70eSjsing  *    the apps directory (application code) you must include an acknowledgement:
393395f70eSjsing  *    "This product includes software written by Tim Hudson (tjh@cryptsoft.com)"
403395f70eSjsing  *
413395f70eSjsing  * THIS SOFTWARE IS PROVIDED BY ERIC YOUNG ``AS IS'' AND
423395f70eSjsing  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
433395f70eSjsing  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
443395f70eSjsing  * ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
453395f70eSjsing  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
463395f70eSjsing  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
473395f70eSjsing  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
483395f70eSjsing  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
493395f70eSjsing  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
503395f70eSjsing  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
513395f70eSjsing  * SUCH DAMAGE.
523395f70eSjsing  *
533395f70eSjsing  * The licence and distribution terms for any publically available version or
543395f70eSjsing  * derivative of this code cannot be changed.  i.e. this code cannot simply be
553395f70eSjsing  * copied and put under another distribution licence
563395f70eSjsing  * [including the GNU Public Licence.]
573395f70eSjsing  */
583395f70eSjsing /* ====================================================================
593395f70eSjsing  * Copyright (c) 1998-2002 The OpenSSL Project.  All rights reserved.
603395f70eSjsing  *
613395f70eSjsing  * Redistribution and use in source and binary forms, with or without
623395f70eSjsing  * modification, are permitted provided that the following conditions
633395f70eSjsing  * are met:
643395f70eSjsing  *
653395f70eSjsing  * 1. Redistributions of source code must retain the above copyright
663395f70eSjsing  *    notice, this list of conditions and the following disclaimer.
673395f70eSjsing  *
683395f70eSjsing  * 2. Redistributions in binary form must reproduce the above copyright
693395f70eSjsing  *    notice, this list of conditions and the following disclaimer in
703395f70eSjsing  *    the documentation and/or other materials provided with the
713395f70eSjsing  *    distribution.
723395f70eSjsing  *
733395f70eSjsing  * 3. All advertising materials mentioning features or use of this
743395f70eSjsing  *    software must display the following acknowledgment:
753395f70eSjsing  *    "This product includes software developed by the OpenSSL Project
763395f70eSjsing  *    for use in the OpenSSL Toolkit. (http://www.openssl.org/)"
773395f70eSjsing  *
783395f70eSjsing  * 4. The names "OpenSSL Toolkit" and "OpenSSL Project" must not be used to
793395f70eSjsing  *    endorse or promote products derived from this software without
803395f70eSjsing  *    prior written permission. For written permission, please contact
813395f70eSjsing  *    openssl-core@openssl.org.
823395f70eSjsing  *
833395f70eSjsing  * 5. Products derived from this software may not be called "OpenSSL"
843395f70eSjsing  *    nor may "OpenSSL" appear in their names without prior written
853395f70eSjsing  *    permission of the OpenSSL Project.
863395f70eSjsing  *
873395f70eSjsing  * 6. Redistributions of any form whatsoever must retain the following
883395f70eSjsing  *    acknowledgment:
893395f70eSjsing  *    "This product includes software developed by the OpenSSL Project
903395f70eSjsing  *    for use in the OpenSSL Toolkit (http://www.openssl.org/)"
913395f70eSjsing  *
923395f70eSjsing  * THIS SOFTWARE IS PROVIDED BY THE OpenSSL PROJECT ``AS IS'' AND ANY
933395f70eSjsing  * EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
943395f70eSjsing  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
953395f70eSjsing  * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE OpenSSL PROJECT OR
963395f70eSjsing  * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
973395f70eSjsing  * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
983395f70eSjsing  * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
993395f70eSjsing  * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
1003395f70eSjsing  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
1013395f70eSjsing  * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
1023395f70eSjsing  * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED
1033395f70eSjsing  * OF THE POSSIBILITY OF SUCH DAMAGE.
1043395f70eSjsing  * ====================================================================
1053395f70eSjsing  *
1063395f70eSjsing  * This product includes cryptographic software written by Eric Young
1073395f70eSjsing  * (eay@cryptsoft.com).  This product includes software written by Tim
1083395f70eSjsing  * Hudson (tjh@cryptsoft.com).
1093395f70eSjsing  *
1103395f70eSjsing  */
1113395f70eSjsing 
1123395f70eSjsing #include <errno.h>
113ee4250f6Sjsing #include <limits.h>
1143395f70eSjsing #include <stdio.h>
1153395f70eSjsing 
1163395f70eSjsing #include <openssl/buffer.h>
1173395f70eSjsing #include <openssl/evp.h>
1183395f70eSjsing 
1193395f70eSjsing #include "bytestring.h"
120c9675a23Stb #include "dtls_local.h"
121c9675a23Stb #include "ssl_local.h"
122ee4250f6Sjsing #include "tls_content.h"
1233395f70eSjsing 
1243395f70eSjsing static int do_ssl3_write(SSL *s, int type, const unsigned char *buf,
125f91e30d7Sjsing     unsigned int len);
1263395f70eSjsing static int ssl3_get_record(SSL *s);
1273395f70eSjsing 
128a2584b01Sbeck /*
129a2584b01Sbeck  * Force a WANT_READ return for certain error conditions where
130a2584b01Sbeck  * we don't want to spin internally.
131a2584b01Sbeck  */
132e2a9b682Sjsing void
ssl_force_want_read(SSL * s)133a2584b01Sbeck ssl_force_want_read(SSL *s)
134a2584b01Sbeck {
135a2584b01Sbeck 	BIO *bio;
136a2584b01Sbeck 
137a2584b01Sbeck 	bio = SSL_get_rbio(s);
138a2584b01Sbeck 	BIO_clear_retry_flags(bio);
139a2584b01Sbeck 	BIO_set_retry_read(bio);
140e2a9b682Sjsing 
1416f7f653bSjsing 	s->rwstate = SSL_READING;
142a2584b01Sbeck }
143a2584b01Sbeck 
144301623b9Sjsing /*
145301623b9Sjsing  * If extend == 0, obtain new n-byte packet; if extend == 1, increase
146301623b9Sjsing  * packet by another n bytes.
14702876cc3Sjsing  * The packet will be in the sub-array of s->s3->rbuf.buf specified
1486f7f653bSjsing  * by s->packet and s->packet_length.
1496f7f653bSjsing  * (If s->read_ahead is set, 'max' bytes may be stored in rbuf
1506f7f653bSjsing  * [plus s->packet_length bytes if extend == 1].)
151301623b9Sjsing  */
1523395f70eSjsing static int
ssl3_read_n(SSL * s,int n,int max,int extend)1533395f70eSjsing ssl3_read_n(SSL *s, int n, int max, int extend)
1543395f70eSjsing {
15502876cc3Sjsing 	SSL3_BUFFER_INTERNAL *rb = &(s->s3->rbuf);
1563395f70eSjsing 	int i, len, left;
1573395f70eSjsing 	size_t align;
1583395f70eSjsing 	unsigned char *pkt;
1593395f70eSjsing 
1603395f70eSjsing 	if (n <= 0)
1613395f70eSjsing 		return n;
1623395f70eSjsing 
163dfea2de7Stb 	if (rb->buf == NULL) {
1643395f70eSjsing 		if (!ssl3_setup_read_buffer(s))
1653395f70eSjsing 			return -1;
166dfea2de7Stb 	}
167dfea2de7Stb 	if (rb->buf == NULL)
168dfea2de7Stb 		return -1;
1693395f70eSjsing 
1703395f70eSjsing 	left = rb->left;
1713395f70eSjsing 	align = (size_t)rb->buf + SSL3_RT_HEADER_LENGTH;
1723395f70eSjsing 	align = (-align) & (SSL3_ALIGN_PAYLOAD - 1);
1733395f70eSjsing 
1743395f70eSjsing 	if (!extend) {
1753395f70eSjsing 		/* start with empty packet ... */
1763395f70eSjsing 		if (left == 0)
1773395f70eSjsing 			rb->offset = align;
1783395f70eSjsing 		else if (align != 0 && left >= SSL3_RT_HEADER_LENGTH) {
1793395f70eSjsing 			/* check if next packet length is large
1803395f70eSjsing 			 * enough to justify payload alignment... */
1813395f70eSjsing 			pkt = rb->buf + rb->offset;
1823395f70eSjsing 			if (pkt[0] == SSL3_RT_APPLICATION_DATA &&
1833395f70eSjsing 			    (pkt[3]<<8|pkt[4]) >= 128) {
1843395f70eSjsing 				/* Note that even if packet is corrupted
1853395f70eSjsing 				 * and its length field is insane, we can
1863395f70eSjsing 				 * only be led to wrong decision about
1873395f70eSjsing 				 * whether memmove will occur or not.
1883395f70eSjsing 				 * Header values has no effect on memmove
1893395f70eSjsing 				 * arguments and therefore no buffer
1903395f70eSjsing 				 * overrun can be triggered. */
1913395f70eSjsing 				memmove(rb->buf + align, pkt, left);
1923395f70eSjsing 				rb->offset = align;
1933395f70eSjsing 			}
1943395f70eSjsing 		}
1956f7f653bSjsing 		s->packet = rb->buf + rb->offset;
1966f7f653bSjsing 		s->packet_length = 0;
1973395f70eSjsing 		/* ... now we can act as if 'extend' was set */
1983395f70eSjsing 	}
1993395f70eSjsing 
2003395f70eSjsing 	/* For DTLS/UDP reads should not span multiple packets
2013395f70eSjsing 	 * because the read operation returns the whole packet
2023395f70eSjsing 	 * at once (as long as it fits into the buffer). */
2039e659261Sjsing 	if (SSL_is_dtls(s)) {
2043395f70eSjsing 		if (left > 0 && n > left)
2053395f70eSjsing 			n = left;
2063395f70eSjsing 	}
2073395f70eSjsing 
2083395f70eSjsing 	/* if there is enough in the buffer from a previous read, take some */
2093395f70eSjsing 	if (left >= n) {
2106f7f653bSjsing 		s->packet_length += n;
2113395f70eSjsing 		rb->left = left - n;
2123395f70eSjsing 		rb->offset += n;
2133395f70eSjsing 		return (n);
2143395f70eSjsing 	}
2153395f70eSjsing 
2163395f70eSjsing 	/* else we need to read more data */
2173395f70eSjsing 
2186f7f653bSjsing 	len = s->packet_length;
2193395f70eSjsing 	pkt = rb->buf + align;
2203395f70eSjsing 	/* Move any available bytes to front of buffer:
2213395f70eSjsing 	 * 'len' bytes already pointed to by 'packet',
2223395f70eSjsing 	 * 'left' extra ones at the end */
2236f7f653bSjsing 	if (s->packet != pkt)  {
2243395f70eSjsing 		/* len > 0 */
2256f7f653bSjsing 		memmove(pkt, s->packet, len + left);
2266f7f653bSjsing 		s->packet = pkt;
2273395f70eSjsing 		rb->offset = len + align;
2283395f70eSjsing 	}
2293395f70eSjsing 
2303395f70eSjsing 	if (n > (int)(rb->len - rb->offset)) {
2313395f70eSjsing 		/* does not happen */
232c9d7abb7Sbeck 		SSLerror(s, ERR_R_INTERNAL_ERROR);
2333395f70eSjsing 		return -1;
2343395f70eSjsing 	}
2353395f70eSjsing 
2366f7f653bSjsing 	if (s->read_ahead || SSL_is_dtls(s)) {
2373395f70eSjsing 		if (max < n)
2383395f70eSjsing 			max = n;
2393395f70eSjsing 		if (max > (int)(rb->len - rb->offset))
2403395f70eSjsing 			max = rb->len - rb->offset;
24150c78444Sjsing 	} else {
24250c78444Sjsing 		/* ignore max parameter */
24350c78444Sjsing 		max = n;
2443395f70eSjsing 	}
2453395f70eSjsing 
2463395f70eSjsing 	while (left < n) {
24702876cc3Sjsing 		/* Now we have len+left bytes at the front of s->s3->rbuf.buf
2483395f70eSjsing 		 * and need to read in more until we have len+n (up to
2493395f70eSjsing 		 * len+max if possible) */
2503395f70eSjsing 
2513395f70eSjsing 		errno = 0;
2523395f70eSjsing 		if (s->rbio != NULL) {
2536f7f653bSjsing 			s->rwstate = SSL_READING;
2543395f70eSjsing 			i = BIO_read(s->rbio, pkt + len + left, max - left);
2553395f70eSjsing 		} else {
256c9d7abb7Sbeck 			SSLerror(s, SSL_R_READ_BIO_NOT_SET);
2573395f70eSjsing 			i = -1;
2583395f70eSjsing 		}
2593395f70eSjsing 
2603395f70eSjsing 		if (i <= 0) {
2613395f70eSjsing 			rb->left = left;
2626f7f653bSjsing 			if (s->mode & SSL_MODE_RELEASE_BUFFERS &&
2639e659261Sjsing 			    !SSL_is_dtls(s)) {
2643395f70eSjsing 				if (len + left == 0)
2653395f70eSjsing 					ssl3_release_read_buffer(s);
2663395f70eSjsing 			}
2673395f70eSjsing 			return (i);
2683395f70eSjsing 		}
2693395f70eSjsing 		left += i;
2703395f70eSjsing 
2713395f70eSjsing 		/*
2723395f70eSjsing 		 * reads should *never* span multiple packets for DTLS because
2733395f70eSjsing 		 * the underlying transport protocol is message oriented as
2743395f70eSjsing 		 * opposed to byte oriented as in the TLS case.
2753395f70eSjsing 		 */
2769e659261Sjsing 		if (SSL_is_dtls(s)) {
2773395f70eSjsing 			if (n > left)
2783395f70eSjsing 				n = left; /* makes the while condition false */
2793395f70eSjsing 		}
2803395f70eSjsing 	}
2813395f70eSjsing 
2823395f70eSjsing 	/* done reading, now the book-keeping */
2833395f70eSjsing 	rb->offset += n;
2843395f70eSjsing 	rb->left = left - n;
2856f7f653bSjsing 	s->packet_length += n;
2866f7f653bSjsing 	s->rwstate = SSL_NOTHING;
2873395f70eSjsing 
2883395f70eSjsing 	return (n);
2893395f70eSjsing }
2903395f70eSjsing 
2913395f70eSjsing int
ssl3_packet_read(SSL * s,int plen)2923395f70eSjsing ssl3_packet_read(SSL *s, int plen)
2933395f70eSjsing {
2943395f70eSjsing 	int n;
2953395f70eSjsing 
29602876cc3Sjsing 	n = ssl3_read_n(s, plen, s->s3->rbuf.len, 0);
2973395f70eSjsing 	if (n <= 0)
2983395f70eSjsing 		return n;
2996f7f653bSjsing 	if (s->packet_length < plen)
3006f7f653bSjsing 		return s->packet_length;
3013395f70eSjsing 
3023395f70eSjsing 	return plen;
3033395f70eSjsing }
3043395f70eSjsing 
3053395f70eSjsing int
ssl3_packet_extend(SSL * s,int plen)3063395f70eSjsing ssl3_packet_extend(SSL *s, int plen)
3073395f70eSjsing {
3083395f70eSjsing 	int rlen, n;
3093395f70eSjsing 
3106f7f653bSjsing 	if (s->packet_length >= plen)
3113395f70eSjsing 		return plen;
3126f7f653bSjsing 	rlen = plen - s->packet_length;
3133395f70eSjsing 
3143395f70eSjsing 	n = ssl3_read_n(s, rlen, rlen, 1);
3153395f70eSjsing 	if (n <= 0)
3163395f70eSjsing 		return n;
3176f7f653bSjsing 	if (s->packet_length < plen)
3186f7f653bSjsing 		return s->packet_length;
3193395f70eSjsing 
3203395f70eSjsing 	return plen;
3213395f70eSjsing }
3223395f70eSjsing 
3233395f70eSjsing /* Call this to get a new input record.
3243395f70eSjsing  * It will return <= 0 if more data is needed, normally due to an error
3253395f70eSjsing  * or non-blocking IO.
3263395f70eSjsing  * When it finishes, one packet has been decoded and can be found in
3276f7f653bSjsing  * ssl->s3->rrec.type    - is the type of record
3286f7f653bSjsing  * ssl->s3->rrec.data, 	 - data
3296f7f653bSjsing  * ssl->s3->rrec.length, - number of bytes
3303395f70eSjsing  */
3313395f70eSjsing /* used only by ssl3_read_bytes */
3323395f70eSjsing static int
ssl3_get_record(SSL * s)3333395f70eSjsing ssl3_get_record(SSL *s)
3343395f70eSjsing {
33502876cc3Sjsing 	SSL3_BUFFER_INTERNAL *rb = &(s->s3->rbuf);
33602876cc3Sjsing 	SSL3_RECORD_INTERNAL *rr = &(s->s3->rrec);
33740038cb8Sjsing 	uint8_t alert_desc;
33840038cb8Sjsing 	int al, n;
33940038cb8Sjsing 	int ret = -1;
3403395f70eSjsing 
3413395f70eSjsing  again:
3423395f70eSjsing 	/* check if we have the header */
3436f7f653bSjsing 	if ((s->rstate != SSL_ST_READ_BODY) ||
3446f7f653bSjsing 	    (s->packet_length < SSL3_RT_HEADER_LENGTH)) {
3453395f70eSjsing 		CBS header;
3463395f70eSjsing 		uint16_t len, ssl_version;
3473395f70eSjsing 		uint8_t type;
3483395f70eSjsing 
3493395f70eSjsing 		n = ssl3_packet_read(s, SSL3_RT_HEADER_LENGTH);
3503395f70eSjsing 		if (n <= 0)
3513395f70eSjsing 			return (n);
3523395f70eSjsing 
3536f7f653bSjsing 		s->mac_packet = 1;
3546f7f653bSjsing 		s->rstate = SSL_ST_READ_BODY;
3553395f70eSjsing 
3566f7f653bSjsing 		if (s->server && s->first_packet) {
3573395f70eSjsing 			if ((ret = ssl_server_legacy_first_packet(s)) != 1)
3583395f70eSjsing 				return (ret);
3593395f70eSjsing 			ret = -1;
3603395f70eSjsing 		}
3613395f70eSjsing 
3626f7f653bSjsing 		CBS_init(&header, s->packet, SSL3_RT_HEADER_LENGTH);
3633395f70eSjsing 
3646182911eSjsing 		/* Pull apart the header into the SSL3_RECORD_INTERNAL */
3653395f70eSjsing 		if (!CBS_get_u8(&header, &type) ||
3663395f70eSjsing 		    !CBS_get_u16(&header, &ssl_version) ||
3673395f70eSjsing 		    !CBS_get_u16(&header, &len)) {
368c9d7abb7Sbeck 			SSLerror(s, SSL_R_BAD_PACKET_LENGTH);
3693395f70eSjsing 			goto err;
3703395f70eSjsing 		}
3713395f70eSjsing 
3723395f70eSjsing 		rr->type = type;
3733395f70eSjsing 		rr->length = len;
3743395f70eSjsing 
3753395f70eSjsing 		/* Lets check version */
3766f7f653bSjsing 		if (!s->first_packet && ssl_version != s->version) {
3773395f70eSjsing 			if ((s->version & 0xFF00) == (ssl_version & 0xFF00) &&
3786f7f653bSjsing 			    !tls12_record_layer_write_protected(s->rl)) {
3793395f70eSjsing 				/* Send back error using their minor version number :-) */
3803395f70eSjsing 				s->version = ssl_version;
3811365e68cSjsing 			}
3821365e68cSjsing 			SSLerror(s, SSL_R_WRONG_VERSION_NUMBER);
3833395f70eSjsing 			al = SSL_AD_PROTOCOL_VERSION;
384ba06b73eStb 			goto fatal_err;
3853395f70eSjsing 		}
3863395f70eSjsing 
3873395f70eSjsing 		if ((ssl_version >> 8) != SSL3_VERSION_MAJOR) {
388c9d7abb7Sbeck 			SSLerror(s, SSL_R_WRONG_VERSION_NUMBER);
3893395f70eSjsing 			goto err;
3903395f70eSjsing 		}
3913395f70eSjsing 
39240038cb8Sjsing 		if (rr->length > rb->len - SSL3_RT_HEADER_LENGTH) {
3933395f70eSjsing 			al = SSL_AD_RECORD_OVERFLOW;
394c9d7abb7Sbeck 			SSLerror(s, SSL_R_PACKET_LENGTH_TOO_LONG);
395ba06b73eStb 			goto fatal_err;
3963395f70eSjsing 		}
3973395f70eSjsing 	}
3983395f70eSjsing 
3993395f70eSjsing 	n = ssl3_packet_extend(s, SSL3_RT_HEADER_LENGTH + rr->length);
4003395f70eSjsing 	if (n <= 0)
4013395f70eSjsing 		return (n);
4023395f70eSjsing 	if (n != SSL3_RT_HEADER_LENGTH + rr->length)
4033395f70eSjsing 		return (n);
4043395f70eSjsing 
4056f7f653bSjsing 	s->rstate = SSL_ST_READ_HEADER; /* set state for later operations */
4063395f70eSjsing 
40740038cb8Sjsing 	/*
40840038cb8Sjsing 	 * A full record has now been read from the wire, which now needs
40940038cb8Sjsing 	 * to be processed.
4103395f70eSjsing 	 */
4116f7f653bSjsing 	tls12_record_layer_set_version(s->rl, s->version);
4123395f70eSjsing 
413ee4250f6Sjsing 	if (!tls12_record_layer_open_record(s->rl, s->packet, s->packet_length,
414ee4250f6Sjsing 	    s->s3->rcontent)) {
4156f7f653bSjsing 		tls12_record_layer_alert(s->rl, &alert_desc);
4163395f70eSjsing 
41740038cb8Sjsing 		if (alert_desc == 0)
41840038cb8Sjsing 			goto err;
4193395f70eSjsing 
42040038cb8Sjsing 		if (alert_desc == SSL_AD_RECORD_OVERFLOW)
421c9d7abb7Sbeck 			SSLerror(s, SSL_R_ENCRYPTED_LENGTH_TOO_LONG);
42240038cb8Sjsing 		else if (alert_desc == SSL_AD_BAD_RECORD_MAC)
423c9d7abb7Sbeck 			SSLerror(s, SSL_R_DECRYPTION_FAILED_OR_BAD_RECORD_MAC);
42440038cb8Sjsing 
42540038cb8Sjsing 		al = alert_desc;
426ba06b73eStb 		goto fatal_err;
4273395f70eSjsing 	}
4283395f70eSjsing 
4293395f70eSjsing 	/* we have pulled in a full packet so zero things */
4306f7f653bSjsing 	s->packet_length = 0;
4313395f70eSjsing 
432ee4250f6Sjsing 	if (tls_content_remaining(s->s3->rcontent) == 0) {
433b6a22251Sbeck 		/*
43451bf8b95Sjsing 		 * Zero-length fragments are only permitted for application
43551bf8b95Sjsing 		 * data, as per RFC 5246 section 6.2.1.
43651bf8b95Sjsing 		 */
43751bf8b95Sjsing 		if (rr->type != SSL3_RT_APPLICATION_DATA) {
43851bf8b95Sjsing 			SSLerror(s, SSL_R_BAD_LENGTH);
43951bf8b95Sjsing 			al = SSL_AD_UNEXPECTED_MESSAGE;
44051bf8b95Sjsing 			goto fatal_err;
44151bf8b95Sjsing 		}
44251bf8b95Sjsing 
443ee4250f6Sjsing 		tls_content_clear(s->s3->rcontent);
444ee4250f6Sjsing 
44551bf8b95Sjsing 		/*
44640038cb8Sjsing 		 * CBC countermeasures for known IV weaknesses can legitimately
44740038cb8Sjsing 		 * insert a single empty record, so we allow ourselves to read
44840038cb8Sjsing 		 * once past a single empty record without forcing want_read.
449b6a22251Sbeck 		 */
4506f7f653bSjsing 		if (s->empty_record_count++ > SSL_MAX_EMPTY_RECORDS) {
451c9d7abb7Sbeck 			SSLerror(s, SSL_R_PEER_BEHAVING_BADLY);
452b6a22251Sbeck 			return -1;
453b6a22251Sbeck 		}
4546f7f653bSjsing 		if (s->empty_record_count > 1) {
455b6a22251Sbeck 			ssl_force_want_read(s);
456b6a22251Sbeck 			return -1;
457b6a22251Sbeck 		}
4583395f70eSjsing 		goto again;
459b6a22251Sbeck 	}
4603395f70eSjsing 
4616f7f653bSjsing 	s->empty_record_count = 0;
46240038cb8Sjsing 
4633395f70eSjsing 	return (1);
4643395f70eSjsing 
465ba06b73eStb  fatal_err:
4663395f70eSjsing 	ssl3_send_alert(s, SSL3_AL_FATAL, al);
4673395f70eSjsing  err:
4683395f70eSjsing 	return (ret);
4693395f70eSjsing }
4703395f70eSjsing 
4713395f70eSjsing /* Call this to write data in records of type 'type'
4723395f70eSjsing  * It will return <= 0 if not all data has been sent or non-blocking IO.
4733395f70eSjsing  */
4743395f70eSjsing int
ssl3_write_bytes(SSL * s,int type,const void * buf_,int len)4753395f70eSjsing ssl3_write_bytes(SSL *s, int type, const void *buf_, int len)
4763395f70eSjsing {
4773395f70eSjsing 	const unsigned char *buf = buf_;
4783395f70eSjsing 	unsigned int tot, n, nw;
4793395f70eSjsing 	int i;
4803395f70eSjsing 
4813395f70eSjsing 	if (len < 0) {
482c9d7abb7Sbeck 		SSLerror(s, ERR_R_INTERNAL_ERROR);
4833395f70eSjsing 		return -1;
4843395f70eSjsing 	}
4853395f70eSjsing 
4866f7f653bSjsing 	s->rwstate = SSL_NOTHING;
48702876cc3Sjsing 	tot = s->s3->wnum;
48802876cc3Sjsing 	s->s3->wnum = 0;
4893395f70eSjsing 
4906f7f653bSjsing 	if (SSL_in_init(s) && !s->in_handshake) {
4916f7f653bSjsing 		i = s->handshake_func(s);
4923395f70eSjsing 		if (i < 0)
4933395f70eSjsing 			return (i);
4943395f70eSjsing 		if (i == 0) {
495c9d7abb7Sbeck 			SSLerror(s, SSL_R_SSL_HANDSHAKE_FAILURE);
4963395f70eSjsing 			return -1;
4973395f70eSjsing 		}
4983395f70eSjsing 	}
4993395f70eSjsing 
5003395f70eSjsing 	if (len < tot)
5013395f70eSjsing 		len = tot;
5023395f70eSjsing 	n = (len - tot);
5033395f70eSjsing 	for (;;) {
5043395f70eSjsing 		if (n > s->max_send_fragment)
5053395f70eSjsing 			nw = s->max_send_fragment;
5063395f70eSjsing 		else
5073395f70eSjsing 			nw = n;
5083395f70eSjsing 
509f91e30d7Sjsing 		i = do_ssl3_write(s, type, &(buf[tot]), nw);
5103395f70eSjsing 		if (i <= 0) {
51102876cc3Sjsing 			s->s3->wnum = tot;
5123395f70eSjsing 			return i;
5133395f70eSjsing 		}
5143395f70eSjsing 
5153395f70eSjsing 		if ((i == (int)n) || (type == SSL3_RT_APPLICATION_DATA &&
5166f7f653bSjsing 		    (s->mode & SSL_MODE_ENABLE_PARTIAL_WRITE))) {
5173395f70eSjsing 			/*
5183395f70eSjsing 			 * Next chunk of data should get another prepended
5193395f70eSjsing 			 * empty fragment in ciphersuites with known-IV
5203395f70eSjsing 			 * weakness.
5213395f70eSjsing 			 */
52202876cc3Sjsing 			s->s3->empty_fragment_done = 0;
5233395f70eSjsing 
5243395f70eSjsing 			return tot + i;
5253395f70eSjsing 		}
5263395f70eSjsing 
5273395f70eSjsing 		n -= i;
5283395f70eSjsing 		tot += i;
5293395f70eSjsing 	}
5303395f70eSjsing }
5313395f70eSjsing 
5323395f70eSjsing static int
do_ssl3_write(SSL * s,int type,const unsigned char * buf,unsigned int len)533f91e30d7Sjsing do_ssl3_write(SSL *s, int type, const unsigned char *buf, unsigned int len)
534f91e30d7Sjsing {
53502876cc3Sjsing 	SSL3_BUFFER_INTERNAL *wb = &(s->s3->wbuf);
536f91e30d7Sjsing 	SSL_SESSION *sess = s->session;
53718691bb1Sjsing 	int need_empty_fragment = 0;
538d6d3cb6fSjsing 	size_t align, out_len;
539d6d3cb6fSjsing 	CBB cbb;
54018691bb1Sjsing 	int ret;
541f91e30d7Sjsing 
542d6d3cb6fSjsing 	memset(&cbb, 0, sizeof(cbb));
543d6d3cb6fSjsing 
544f91e30d7Sjsing 	if (wb->buf == NULL)
545f91e30d7Sjsing 		if (!ssl3_setup_write_buffer(s))
546f91e30d7Sjsing 			return -1;
547f91e30d7Sjsing 
54818691bb1Sjsing 	/*
54918691bb1Sjsing 	 * First check if there is a SSL3_BUFFER_INTERNAL still being written
55018691bb1Sjsing 	 * out.  This will happen with non blocking IO.
55118691bb1Sjsing 	 */
552f91e30d7Sjsing 	if (wb->left != 0)
553f91e30d7Sjsing 		return (ssl3_write_pending(s, type, buf, len));
554f91e30d7Sjsing 
55518691bb1Sjsing 	/* If we have an alert to send, let's send it. */
55602876cc3Sjsing 	if (s->s3->alert_dispatch) {
557e3dbb073Sjsing 		if ((ret = ssl3_dispatch_alert(s)) <= 0)
55818691bb1Sjsing 			return (ret);
55918691bb1Sjsing 		/* If it went, fall through and send more stuff. */
56018691bb1Sjsing 
56118691bb1Sjsing 		/* We may have released our buffer, if so get it again. */
562f91e30d7Sjsing 		if (wb->buf == NULL)
563f91e30d7Sjsing 			if (!ssl3_setup_write_buffer(s))
564f91e30d7Sjsing 				return -1;
565f91e30d7Sjsing 	}
566f91e30d7Sjsing 
567f91e30d7Sjsing 	if (len == 0)
568f91e30d7Sjsing 		return 0;
569f91e30d7Sjsing 
570f91e30d7Sjsing 	/*
571f91e30d7Sjsing 	 * Countermeasure against known-IV weakness in CBC ciphersuites
57218691bb1Sjsing 	 * (see http://www.openssl.org/~bodo/tls-cbc.txt). Note that this
57318691bb1Sjsing 	 * is unnecessary for AEAD.
574f91e30d7Sjsing 	 */
5756f7f653bSjsing 	if (sess != NULL && tls12_record_layer_write_protected(s->rl)) {
57602876cc3Sjsing 		if (s->s3->need_empty_fragments &&
57702876cc3Sjsing 		    !s->s3->empty_fragment_done &&
57818691bb1Sjsing 		    type == SSL3_RT_APPLICATION_DATA)
57918691bb1Sjsing 			need_empty_fragment = 1;
58018691bb1Sjsing 	}
58118691bb1Sjsing 
58218691bb1Sjsing 	/*
58318691bb1Sjsing 	 * An extra fragment would be a couple of cipher blocks, which would
58418691bb1Sjsing 	 * be a multiple of SSL3_ALIGN_PAYLOAD, so if we want to align the real
58518691bb1Sjsing 	 * payload, then we can just simply pretend we have two headers.
58618691bb1Sjsing 	 */
58718691bb1Sjsing 	align = (size_t)wb->buf + SSL3_RT_HEADER_LENGTH;
58818691bb1Sjsing 	if (need_empty_fragment)
58918691bb1Sjsing 		align += SSL3_RT_HEADER_LENGTH;
590f91e30d7Sjsing 	align = (-align) & (SSL3_ALIGN_PAYLOAD - 1);
591f91e30d7Sjsing 	wb->offset = align;
592f91e30d7Sjsing 
593d6d3cb6fSjsing 	if (!CBB_init_fixed(&cbb, wb->buf + align, wb->len - align))
594d6d3cb6fSjsing 		goto err;
595d6d3cb6fSjsing 
59656e1ead7Stb 	tls12_record_layer_set_version(s->rl, s->version);
597acef91a0Sjsing 
59818691bb1Sjsing 	if (need_empty_fragment) {
5996f7f653bSjsing 		if (!tls12_record_layer_seal_record(s->rl, type,
600acef91a0Sjsing 		    buf, 0, &cbb))
601f91e30d7Sjsing 			goto err;
60202876cc3Sjsing 		s->s3->empty_fragment_done = 1;
603f91e30d7Sjsing 	}
604f91e30d7Sjsing 
6056f7f653bSjsing 	if (!tls12_record_layer_seal_record(s->rl, type, buf, len, &cbb))
606f91e30d7Sjsing 		goto err;
607f91e30d7Sjsing 
608d6d3cb6fSjsing 	if (!CBB_finish(&cbb, NULL, &out_len))
609d6d3cb6fSjsing 		goto err;
610d6d3cb6fSjsing 
611d6d3cb6fSjsing 	wb->left = out_len;
6123395f70eSjsing 
61318691bb1Sjsing 	/*
61418691bb1Sjsing 	 * Memorize arguments so that ssl3_write_pending can detect
61518691bb1Sjsing 	 * bad write retries later.
61618691bb1Sjsing 	 */
61702876cc3Sjsing 	s->s3->wpend_tot = len;
61802876cc3Sjsing 	s->s3->wpend_buf = buf;
61902876cc3Sjsing 	s->s3->wpend_type = type;
62002876cc3Sjsing 	s->s3->wpend_ret = len;
6213395f70eSjsing 
62218691bb1Sjsing 	/* We now just need to write the buffer. */
6233395f70eSjsing 	return ssl3_write_pending(s, type, buf, len);
62418691bb1Sjsing 
6253395f70eSjsing  err:
626d6d3cb6fSjsing 	CBB_cleanup(&cbb);
627d6d3cb6fSjsing 
6283395f70eSjsing 	return -1;
6293395f70eSjsing }
6303395f70eSjsing 
63102876cc3Sjsing /* if s->s3->wbuf.left != 0, we need to call this */
6323395f70eSjsing int
ssl3_write_pending(SSL * s,int type,const unsigned char * buf,unsigned int len)6333395f70eSjsing ssl3_write_pending(SSL *s, int type, const unsigned char *buf, unsigned int len)
6343395f70eSjsing {
6353395f70eSjsing 	int i;
63602876cc3Sjsing 	SSL3_BUFFER_INTERNAL *wb = &(s->s3->wbuf);
6373395f70eSjsing 
6383395f70eSjsing 	/* XXXX */
63902876cc3Sjsing 	if ((s->s3->wpend_tot > (int)len) || ((s->s3->wpend_buf != buf) &&
6406f7f653bSjsing 	    !(s->mode & SSL_MODE_ACCEPT_MOVING_WRITE_BUFFER)) ||
64102876cc3Sjsing 	    (s->s3->wpend_type != type)) {
642c9d7abb7Sbeck 		SSLerror(s, SSL_R_BAD_WRITE_RETRY);
6433395f70eSjsing 		return (-1);
6443395f70eSjsing 	}
6453395f70eSjsing 
6463395f70eSjsing 	for (;;) {
6473395f70eSjsing 		errno = 0;
6483395f70eSjsing 		if (s->wbio != NULL) {
6496f7f653bSjsing 			s->rwstate = SSL_WRITING;
650821d9f84Sjsing 			i = BIO_write(s->wbio, (char *)&(wb->buf[wb->offset]),
6513395f70eSjsing 			    (unsigned int)wb->left);
6523395f70eSjsing 		} else {
653c9d7abb7Sbeck 			SSLerror(s, SSL_R_BIO_NOT_SET);
6543395f70eSjsing 			i = -1;
6553395f70eSjsing 		}
6563395f70eSjsing 		if (i == wb->left) {
6573395f70eSjsing 			wb->left = 0;
6583395f70eSjsing 			wb->offset += i;
6596f7f653bSjsing 			if (s->mode & SSL_MODE_RELEASE_BUFFERS &&
6609e659261Sjsing 			    !SSL_is_dtls(s))
6613395f70eSjsing 				ssl3_release_write_buffer(s);
6626f7f653bSjsing 			s->rwstate = SSL_NOTHING;
66302876cc3Sjsing 			return (s->s3->wpend_ret);
6643395f70eSjsing 		} else if (i <= 0) {
6653395f70eSjsing 			/*
6663395f70eSjsing 			 * For DTLS, just drop it. That's kind of the
6673395f70eSjsing 			 * whole point in using a datagram service.
6683395f70eSjsing 			 */
6699e659261Sjsing 			if (SSL_is_dtls(s))
6703395f70eSjsing 				wb->left = 0;
6713395f70eSjsing 			return (i);
6723395f70eSjsing 		}
6733395f70eSjsing 		wb->offset += i;
6743395f70eSjsing 		wb->left -= i;
6753395f70eSjsing 	}
6763395f70eSjsing }
6773395f70eSjsing 
678b1a5c5c8Sjsing static ssize_t
ssl3_read_cb(void * buf,size_t n,void * cb_arg)679b1a5c5c8Sjsing ssl3_read_cb(void *buf, size_t n, void *cb_arg)
680b1a5c5c8Sjsing {
681b1a5c5c8Sjsing 	SSL *s = cb_arg;
682b1a5c5c8Sjsing 
683ee4250f6Sjsing 	return tls_content_read(s->s3->rcontent, buf, n);
684b1a5c5c8Sjsing }
685b1a5c5c8Sjsing 
686b1a5c5c8Sjsing #define SSL3_ALERT_LENGTH	2
687b1a5c5c8Sjsing 
68856fd52a7Sjsing int
ssl3_read_alert(SSL * s)68956fd52a7Sjsing ssl3_read_alert(SSL *s)
69056fd52a7Sjsing {
69156fd52a7Sjsing 	uint8_t alert_level, alert_descr;
692b1a5c5c8Sjsing 	ssize_t ret;
6937ec9e62fSjsing 	CBS cbs;
69456fd52a7Sjsing 
69556fd52a7Sjsing 	/*
69656fd52a7Sjsing 	 * TLSv1.2 permits an alert to be fragmented across multiple records or
69756fd52a7Sjsing 	 * for multiple alerts to be be coalesced into a single alert record.
69856fd52a7Sjsing 	 * In the case of DTLS, there is no way to reassemble an alert
69956fd52a7Sjsing 	 * fragmented across multiple records, hence a full alert must be
70056fd52a7Sjsing 	 * available in the record.
70156fd52a7Sjsing 	 */
702b1a5c5c8Sjsing 	if (s->s3->alert_fragment == NULL) {
703b1a5c5c8Sjsing 		if ((s->s3->alert_fragment = tls_buffer_new(0)) == NULL)
704b1a5c5c8Sjsing 			return -1;
705b1a5c5c8Sjsing 		tls_buffer_set_capacity_limit(s->s3->alert_fragment,
706b1a5c5c8Sjsing 		    SSL3_ALERT_LENGTH);
70756fd52a7Sjsing 	}
708b1a5c5c8Sjsing 	ret = tls_buffer_extend(s->s3->alert_fragment, SSL3_ALERT_LENGTH,
709b1a5c5c8Sjsing 	    ssl3_read_cb, s);
710b1a5c5c8Sjsing 	if (ret <= 0 && ret != TLS_IO_WANT_POLLIN)
711b1a5c5c8Sjsing 		return -1;
712b1a5c5c8Sjsing 	if (ret != SSL3_ALERT_LENGTH) {
71356fd52a7Sjsing 		if (SSL_is_dtls(s)) {
71456fd52a7Sjsing 			SSLerror(s, SSL_R_BAD_LENGTH);
71556fd52a7Sjsing 			ssl3_send_alert(s, SSL3_AL_FATAL, SSL_AD_DECODE_ERROR);
71656fd52a7Sjsing 			return -1;
71756fd52a7Sjsing 		}
71856fd52a7Sjsing 		return 1;
71956fd52a7Sjsing 	}
72056fd52a7Sjsing 
721b1a5c5c8Sjsing 	if (!tls_buffer_data(s->s3->alert_fragment, &cbs))
722b1a5c5c8Sjsing 		return -1;
72356fd52a7Sjsing 
7247ec9e62fSjsing 	ssl_msg_callback_cbs(s, 0, SSL3_RT_ALERT, &cbs);
7257ec9e62fSjsing 
7267ec9e62fSjsing 	if (!CBS_get_u8(&cbs, &alert_level))
7277ec9e62fSjsing 		return -1;
7287ec9e62fSjsing 	if (!CBS_get_u8(&cbs, &alert_descr))
7297ec9e62fSjsing 		return -1;
7307ec9e62fSjsing 
731b1a5c5c8Sjsing 	tls_buffer_free(s->s3->alert_fragment);
732b1a5c5c8Sjsing 	s->s3->alert_fragment = NULL;
73356fd52a7Sjsing 
73456fd52a7Sjsing 	ssl_info_callback(s, SSL_CB_READ_ALERT,
73556fd52a7Sjsing 	    (alert_level << 8) | alert_descr);
73656fd52a7Sjsing 
73756fd52a7Sjsing 	if (alert_level == SSL3_AL_WARNING) {
73856fd52a7Sjsing 		s->s3->warn_alert = alert_descr;
73956fd52a7Sjsing 		if (alert_descr == SSL_AD_CLOSE_NOTIFY) {
7406f7f653bSjsing 			s->shutdown |= SSL_RECEIVED_SHUTDOWN;
74156fd52a7Sjsing 			return 0;
74256fd52a7Sjsing 		}
74356fd52a7Sjsing 		/* We requested renegotiation and the peer rejected it. */
74456fd52a7Sjsing 		if (alert_descr == SSL_AD_NO_RENEGOTIATION) {
74556fd52a7Sjsing 			SSLerror(s, SSL_R_NO_RENEGOTIATION);
74656fd52a7Sjsing 			ssl3_send_alert(s, SSL3_AL_FATAL,
74756fd52a7Sjsing 			    SSL_AD_HANDSHAKE_FAILURE);
74856fd52a7Sjsing 			return -1;
74956fd52a7Sjsing 		}
75056fd52a7Sjsing 	} else if (alert_level == SSL3_AL_FATAL) {
7516f7f653bSjsing 		s->rwstate = SSL_NOTHING;
75256fd52a7Sjsing 		s->s3->fatal_alert = alert_descr;
75356fd52a7Sjsing 		SSLerror(s, SSL_AD_REASON_OFFSET + alert_descr);
75456fd52a7Sjsing 		ERR_asprintf_error_data("SSL alert number %d", alert_descr);
7556f7f653bSjsing 		s->shutdown |= SSL_RECEIVED_SHUTDOWN;
75656fd52a7Sjsing 		SSL_CTX_remove_session(s->ctx, s->session);
75756fd52a7Sjsing 		return 0;
75856fd52a7Sjsing 	} else {
75956fd52a7Sjsing 		SSLerror(s, SSL_R_UNKNOWN_ALERT_TYPE);
76056fd52a7Sjsing 		ssl3_send_alert(s, SSL3_AL_FATAL, SSL_AD_ILLEGAL_PARAMETER);
76156fd52a7Sjsing 		return -1;
76256fd52a7Sjsing 	}
76356fd52a7Sjsing 
76456fd52a7Sjsing 	return 1;
76556fd52a7Sjsing }
76656fd52a7Sjsing 
767b23067a6Sjsing int
ssl3_read_change_cipher_spec(SSL * s)768b23067a6Sjsing ssl3_read_change_cipher_spec(SSL *s)
769b23067a6Sjsing {
770ee4250f6Sjsing 	const uint8_t ccs[1] = { SSL3_MT_CCS };
771b23067a6Sjsing 
772b23067a6Sjsing 	/*
773b23067a6Sjsing 	 * 'Change Cipher Spec' is just a single byte, so we know exactly what
774b23067a6Sjsing 	 * the record payload has to look like.
775b23067a6Sjsing 	 */
776ee4250f6Sjsing 	if (tls_content_remaining(s->s3->rcontent) != sizeof(ccs)) {
777b23067a6Sjsing 		SSLerror(s, SSL_R_BAD_CHANGE_CIPHER_SPEC);
778b23067a6Sjsing 		ssl3_send_alert(s, SSL3_AL_FATAL, SSL_AD_DECODE_ERROR);
779b23067a6Sjsing 		return -1;
780b23067a6Sjsing 	}
781ee4250f6Sjsing 	if (!tls_content_equal(s->s3->rcontent, ccs, sizeof(ccs))) {
782b23067a6Sjsing 		SSLerror(s, SSL_R_BAD_CHANGE_CIPHER_SPEC);
783b23067a6Sjsing 		ssl3_send_alert(s, SSL3_AL_FATAL, SSL_AD_ILLEGAL_PARAMETER);
784b23067a6Sjsing 		return -1;
785b23067a6Sjsing 	}
786b23067a6Sjsing 
787b23067a6Sjsing 	/* XDTLS: check that epoch is consistent */
788b23067a6Sjsing 
789ee4250f6Sjsing 	ssl_msg_callback_cbs(s, 0, SSL3_RT_CHANGE_CIPHER_SPEC,
790ee4250f6Sjsing 	    tls_content_cbs(s->s3->rcontent));
791b23067a6Sjsing 
792b23067a6Sjsing 	/* Check that we have a cipher to change to. */
793b23067a6Sjsing 	if (s->s3->hs.cipher == NULL) {
794b23067a6Sjsing 		SSLerror(s, SSL_R_CCS_RECEIVED_EARLY);
795b23067a6Sjsing 		ssl3_send_alert(s, SSL3_AL_FATAL, SSL_AD_UNEXPECTED_MESSAGE);
796b23067a6Sjsing 		return -1;
797b23067a6Sjsing 	}
798b23067a6Sjsing 
799b23067a6Sjsing 	/* Check that we should be receiving a Change Cipher Spec. */
800b23067a6Sjsing 	if (SSL_is_dtls(s)) {
801b23067a6Sjsing 		if (!s->d1->change_cipher_spec_ok) {
802b23067a6Sjsing 			/*
803b23067a6Sjsing 			 * We can't process a CCS now, because previous
804b23067a6Sjsing 			 * handshake messages are still missing, so just
805b23067a6Sjsing 			 * drop it.
806b23067a6Sjsing 			 */
807ee4250f6Sjsing 			tls_content_clear(s->s3->rcontent);
808b23067a6Sjsing 			return 1;
809b23067a6Sjsing 		}
810b23067a6Sjsing 		s->d1->change_cipher_spec_ok = 0;
811b23067a6Sjsing 	} else {
812b23067a6Sjsing 		if ((s->s3->flags & SSL3_FLAGS_CCS_OK) == 0) {
813b23067a6Sjsing 			SSLerror(s, SSL_R_CCS_RECEIVED_EARLY);
814b23067a6Sjsing 			ssl3_send_alert(s, SSL3_AL_FATAL,
815b23067a6Sjsing 			    SSL_AD_UNEXPECTED_MESSAGE);
816b23067a6Sjsing 			return -1;
817b23067a6Sjsing 		}
818b23067a6Sjsing 		s->s3->flags &= ~SSL3_FLAGS_CCS_OK;
819b23067a6Sjsing 	}
820b23067a6Sjsing 
821ee4250f6Sjsing 	tls_content_clear(s->s3->rcontent);
822b23067a6Sjsing 
823b23067a6Sjsing 	s->s3->change_cipher_spec = 1;
824b23067a6Sjsing 	if (!ssl3_do_change_cipher_spec(s))
825b23067a6Sjsing 		return -1;
826b23067a6Sjsing 
827b23067a6Sjsing 	return 1;
828b23067a6Sjsing }
829b23067a6Sjsing 
830225d6b92Sjsing static int
ssl3_read_handshake_unexpected(SSL * s)831225d6b92Sjsing ssl3_read_handshake_unexpected(SSL *s)
832225d6b92Sjsing {
833d7e52203Sjsing 	uint32_t hs_msg_length;
834d7e52203Sjsing 	uint8_t hs_msg_type;
835b1a5c5c8Sjsing 	ssize_t ssret;
836d7e52203Sjsing 	CBS cbs;
837d7e52203Sjsing 	int ret;
838225d6b92Sjsing 
839225d6b92Sjsing 	/*
840225d6b92Sjsing 	 * We need four bytes of handshake data so we have a handshake message
841225d6b92Sjsing 	 * header - this may be in the same record or fragmented across multiple
842225d6b92Sjsing 	 * records.
843225d6b92Sjsing 	 */
844b1a5c5c8Sjsing 	if (s->s3->handshake_fragment == NULL) {
845b1a5c5c8Sjsing 		if ((s->s3->handshake_fragment = tls_buffer_new(0)) == NULL)
846b1a5c5c8Sjsing 			return -1;
847b1a5c5c8Sjsing 		tls_buffer_set_capacity_limit(s->s3->handshake_fragment,
848b1a5c5c8Sjsing 		    SSL3_HM_HEADER_LENGTH);
849225d6b92Sjsing 	}
850b1a5c5c8Sjsing 	ssret = tls_buffer_extend(s->s3->handshake_fragment, SSL3_HM_HEADER_LENGTH,
851b1a5c5c8Sjsing 	    ssl3_read_cb, s);
852b1a5c5c8Sjsing 	if (ssret <= 0 && ssret != TLS_IO_WANT_POLLIN)
853b1a5c5c8Sjsing 		return -1;
854b1a5c5c8Sjsing 	if (ssret != SSL3_HM_HEADER_LENGTH)
855225d6b92Sjsing 		return 1;
856225d6b92Sjsing 
8576f7f653bSjsing 	if (s->in_handshake) {
858225d6b92Sjsing 		SSLerror(s, ERR_R_INTERNAL_ERROR);
859225d6b92Sjsing 		return -1;
860225d6b92Sjsing 	}
861225d6b92Sjsing 
862225d6b92Sjsing 	/*
863225d6b92Sjsing 	 * This code currently deals with HelloRequest and ClientHello messages -
864225d6b92Sjsing 	 * anything else is pushed to the handshake_func. Almost all of this
865225d6b92Sjsing 	 * belongs in the client/server handshake code.
866225d6b92Sjsing 	 */
867225d6b92Sjsing 
868d7e52203Sjsing 	/* Parse handshake message header. */
869b1a5c5c8Sjsing 	if (!tls_buffer_data(s->s3->handshake_fragment, &cbs))
870b1a5c5c8Sjsing 		return -1;
871d7e52203Sjsing 	if (!CBS_get_u8(&cbs, &hs_msg_type))
872d7e52203Sjsing 		return -1;
873d7e52203Sjsing 	if (!CBS_get_u24(&cbs, &hs_msg_length))
874d7e52203Sjsing 		return -1;
875225d6b92Sjsing 
876d7e52203Sjsing 	if (hs_msg_type == SSL3_MT_HELLO_REQUEST) {
877d7e52203Sjsing 		/*
878d7e52203Sjsing 		 * Incoming HelloRequest messages should only be received by a
879d7e52203Sjsing 		 * client. A server may send these at any time - a client should
880d7e52203Sjsing 		 * ignore the message if received in the middle of a handshake.
881d7e52203Sjsing 		 * See RFC 5246 sections 7.4 and 7.4.1.1.
882d7e52203Sjsing 		 */
883d7e52203Sjsing 		if (s->server) {
884d7e52203Sjsing 			SSLerror(s, SSL_R_UNEXPECTED_MESSAGE);
885d7e52203Sjsing 			ssl3_send_alert(s, SSL3_AL_FATAL,
886d7e52203Sjsing 			     SSL_AD_UNEXPECTED_MESSAGE);
887d7e52203Sjsing 			return -1;
888d7e52203Sjsing 		}
889d7e52203Sjsing 
890d7e52203Sjsing 		if (hs_msg_length != 0) {
891225d6b92Sjsing 			SSLerror(s, SSL_R_BAD_HELLO_REQUEST);
892225d6b92Sjsing 			ssl3_send_alert(s, SSL3_AL_FATAL, SSL_AD_DECODE_ERROR);
893225d6b92Sjsing 			return -1;
894225d6b92Sjsing 		}
895225d6b92Sjsing 
896b1a5c5c8Sjsing 		if (!tls_buffer_data(s->s3->handshake_fragment, &cbs))
897b1a5c5c8Sjsing 			return -1;
898b1a5c5c8Sjsing 		ssl_msg_callback_cbs(s, 0, SSL3_RT_HANDSHAKE, &cbs);
899225d6b92Sjsing 
900b1a5c5c8Sjsing 		tls_buffer_free(s->s3->handshake_fragment);
901b1a5c5c8Sjsing 		s->s3->handshake_fragment = NULL;
902225d6b92Sjsing 
903d7e52203Sjsing 		/*
904d7e52203Sjsing 		 * It should be impossible to hit this, but keep the safety
905d7e52203Sjsing 		 * harness for now...
906d7e52203Sjsing 		 */
907387303bbSjsing 		if (s->session == NULL || s->s3->hs.cipher == NULL)
908225d6b92Sjsing 			return 1;
909225d6b92Sjsing 
910d7e52203Sjsing 		/*
911d7e52203Sjsing 		 * Ignore this message if we're currently handshaking,
912d7e52203Sjsing 		 * renegotiation is already pending or renegotiation is disabled
913d7e52203Sjsing 		 * via flags.
914d7e52203Sjsing 		 */
915d7e52203Sjsing 		if (!SSL_is_init_finished(s) || s->s3->renegotiate ||
916d7e52203Sjsing 		    (s->s3->flags & SSL3_FLAGS_NO_RENEGOTIATE_CIPHERS) != 0)
917d7e52203Sjsing 			return 1;
918d7e52203Sjsing 
919d7e52203Sjsing 		if (!ssl3_renegotiate(s))
920d7e52203Sjsing 			return 1;
921d7e52203Sjsing 		if (!ssl3_renegotiate_check(s))
922d7e52203Sjsing 			return 1;
923d7e52203Sjsing 
924d7e52203Sjsing 	} else if (hs_msg_type == SSL3_MT_CLIENT_HELLO) {
925d7e52203Sjsing 		/*
926d7e52203Sjsing 		 * Incoming ClientHello messages should only be received by a
927d7e52203Sjsing 		 * server. A client may send these in response to server
928d7e52203Sjsing 		 * initiated renegotiation (HelloRequest) or in order to
929d7e52203Sjsing 		 * initiate renegotiation by the client. See RFC 5246 section
930d7e52203Sjsing 		 * 7.4.1.2.
931d7e52203Sjsing 		 */
932d7e52203Sjsing 		if (!s->server) {
933d7e52203Sjsing 			SSLerror(s, SSL_R_UNEXPECTED_MESSAGE);
934d7e52203Sjsing 			ssl3_send_alert(s, SSL3_AL_FATAL,
935d7e52203Sjsing 			     SSL_AD_UNEXPECTED_MESSAGE);
936225d6b92Sjsing 			return -1;
937225d6b92Sjsing 		}
938225d6b92Sjsing 
939d7e52203Sjsing 		/*
940d7e52203Sjsing 		 * A client should not be sending a ClientHello unless we're not
941d7e52203Sjsing 		 * currently handshaking.
942225d6b92Sjsing 		 */
943d7e52203Sjsing 		if (!SSL_is_init_finished(s)) {
944d7e52203Sjsing 			SSLerror(s, SSL_R_UNEXPECTED_MESSAGE);
945d7e52203Sjsing 			ssl3_send_alert(s, SSL3_AL_FATAL,
946d7e52203Sjsing 			    SSL_AD_UNEXPECTED_MESSAGE);
947d7e52203Sjsing 			return -1;
948d7e52203Sjsing 		}
949d7e52203Sjsing 
9506f7f653bSjsing 		if ((s->options & SSL_OP_NO_CLIENT_RENEGOTIATION) != 0) {
951d7e52203Sjsing 			ssl3_send_alert(s, SSL3_AL_FATAL,
952d7e52203Sjsing 			    SSL_AD_NO_RENEGOTIATION);
953d7e52203Sjsing 			return -1;
954d7e52203Sjsing 		}
955d7e52203Sjsing 
956387303bbSjsing 		if (s->session == NULL || s->s3->hs.cipher == NULL) {
957d7e52203Sjsing 			SSLerror(s, ERR_R_INTERNAL_ERROR);
958d7e52203Sjsing 			return -1;
959d7e52203Sjsing 		}
960d7e52203Sjsing 
961d7e52203Sjsing 		/* Client requested renegotiation but it is not permitted. */
962d7e52203Sjsing 		if (!s->s3->send_connection_binding ||
963d7e52203Sjsing 		    (s->s3->flags & SSL3_FLAGS_NO_RENEGOTIATE_CIPHERS) != 0) {
964d7e52203Sjsing 			ssl3_send_alert(s, SSL3_AL_WARNING,
965d7e52203Sjsing 			    SSL_AD_NO_RENEGOTIATION);
966225d6b92Sjsing 			return 1;
967225d6b92Sjsing 		}
968225d6b92Sjsing 
969d7e52203Sjsing 		s->s3->hs.state = SSL_ST_ACCEPT;
9706f7f653bSjsing 		s->renegotiate = 1;
9716f7f653bSjsing 		s->new_session = 1;
972d7e52203Sjsing 
973d7e52203Sjsing 	} else {
974d7e52203Sjsing 		SSLerror(s, SSL_R_UNEXPECTED_MESSAGE);
975d7e52203Sjsing 		ssl3_send_alert(s, SSL3_AL_FATAL, SSL_AD_UNEXPECTED_MESSAGE);
976d7e52203Sjsing 		return -1;
977225d6b92Sjsing 	}
978d7e52203Sjsing 
9796f7f653bSjsing 	if ((ret = s->handshake_func(s)) < 0)
980d7e52203Sjsing 		return ret;
981d7e52203Sjsing 	if (ret == 0) {
982225d6b92Sjsing 		SSLerror(s, SSL_R_SSL_HANDSHAKE_FAILURE);
983d7e52203Sjsing 		return -1;
984225d6b92Sjsing 	}
985225d6b92Sjsing 
9866f7f653bSjsing 	if (!(s->mode & SSL_MODE_AUTO_RETRY)) {
987225d6b92Sjsing 		if (s->s3->rbuf.left == 0) {
988225d6b92Sjsing 			ssl_force_want_read(s);
989d7e52203Sjsing 			return -1;
990225d6b92Sjsing 		}
991225d6b92Sjsing 	}
992225d6b92Sjsing 
993d7e52203Sjsing 	/*
994d7e52203Sjsing 	 * We either finished a handshake or ignored the request, now try again
995d7e52203Sjsing 	 * to obtain the (application) data we were asked for.
996d7e52203Sjsing 	 */
997225d6b92Sjsing 	return 1;
998225d6b92Sjsing }
999225d6b92Sjsing 
10003395f70eSjsing /* Return up to 'len' payload bytes received in 'type' records.
10013395f70eSjsing  * 'type' is one of the following:
10023395f70eSjsing  *
10033395f70eSjsing  *   -  SSL3_RT_HANDSHAKE (when ssl3_get_message calls us)
10043395f70eSjsing  *   -  SSL3_RT_APPLICATION_DATA (when ssl3_read calls us)
10053395f70eSjsing  *   -  0 (during a shutdown, no data has to be returned)
10063395f70eSjsing  *
10073395f70eSjsing  * If we don't have stored data to work from, read a SSL/TLS record first
10083395f70eSjsing  * (possibly multiple records if we still don't have anything to return).
10093395f70eSjsing  *
10103395f70eSjsing  * This function must handle any surprises the peer may have for us, such as
10113395f70eSjsing  * Alert records (e.g. close_notify), ChangeCipherSpec records (not really
10123395f70eSjsing  * a surprise, but handled as if it were), or renegotiation requests.
10133395f70eSjsing  * Also if record payloads contain fragments too small to process, we store
10143395f70eSjsing  * them until there is enough for the respective protocol (the record protocol
10153395f70eSjsing  * may use arbitrary fragmentation and even interleaving):
10163395f70eSjsing  *     Change cipher spec protocol
10173395f70eSjsing  *             just 1 byte needed, no need for keeping anything stored
10183395f70eSjsing  *     Alert protocol
10193395f70eSjsing  *             2 bytes needed (AlertLevel, AlertDescription)
10203395f70eSjsing  *     Handshake protocol
10213395f70eSjsing  *             4 bytes needed (HandshakeType, uint24 length) -- we just have
10223395f70eSjsing  *             to detect unexpected Client Hello and Hello Request messages
10233395f70eSjsing  *             here, anything else is handled by higher layers
10243395f70eSjsing  *     Application data protocol
10253395f70eSjsing  *             none of our business
10263395f70eSjsing  */
10273395f70eSjsing int
ssl3_read_bytes(SSL * s,int type,unsigned char * buf,int len,int peek)10283395f70eSjsing ssl3_read_bytes(SSL *s, int type, unsigned char *buf, int len, int peek)
10293395f70eSjsing {
1030c2712b29Sjsing 	int rrcount = 0;
1031ee4250f6Sjsing 	ssize_t ssret;
1032824388bbSjsing 	int ret;
10333395f70eSjsing 
1034824388bbSjsing 	if (s->s3->rbuf.buf == NULL) {
10353395f70eSjsing 		if (!ssl3_setup_read_buffer(s))
1036824388bbSjsing 			return -1;
1037824388bbSjsing 	}
10383395f70eSjsing 
1039ee4250f6Sjsing 	if (s->s3->rcontent == NULL) {
1040ee4250f6Sjsing 		if ((s->s3->rcontent = tls_content_new()) == NULL)
1041ee4250f6Sjsing 			return -1;
1042ee4250f6Sjsing 	}
1043ee4250f6Sjsing 
10443395f70eSjsing 	if (len < 0) {
1045c9d7abb7Sbeck 		SSLerror(s, ERR_R_INTERNAL_ERROR);
10463395f70eSjsing 		return -1;
10473395f70eSjsing 	}
10483395f70eSjsing 
1049824388bbSjsing 	if (type != 0 && type != SSL3_RT_APPLICATION_DATA &&
1050824388bbSjsing 	    type != SSL3_RT_HANDSHAKE) {
1051824388bbSjsing 		SSLerror(s, ERR_R_INTERNAL_ERROR);
1052824388bbSjsing 		return -1;
1053824388bbSjsing 	}
1054824388bbSjsing 	if (peek && type != SSL3_RT_APPLICATION_DATA) {
1055c9d7abb7Sbeck 		SSLerror(s, ERR_R_INTERNAL_ERROR);
10563395f70eSjsing 		return -1;
10573395f70eSjsing 	}
10583395f70eSjsing 
1059b1a5c5c8Sjsing 	if (type == SSL3_RT_HANDSHAKE &&
1060b1a5c5c8Sjsing 	    s->s3->handshake_fragment != NULL &&
1061b1a5c5c8Sjsing 	    tls_buffer_remaining(s->s3->handshake_fragment) > 0) {
1062b1a5c5c8Sjsing 		ssize_t ssn;
10633395f70eSjsing 
1064b1a5c5c8Sjsing 		if ((ssn = tls_buffer_read(s->s3->handshake_fragment, buf,
1065b1a5c5c8Sjsing 		    len)) <= 0)
1066b1a5c5c8Sjsing 			return -1;
1067b1a5c5c8Sjsing 
1068b1a5c5c8Sjsing 		if (tls_buffer_remaining(s->s3->handshake_fragment) == 0) {
1069b1a5c5c8Sjsing 			tls_buffer_free(s->s3->handshake_fragment);
1070b1a5c5c8Sjsing 			s->s3->handshake_fragment = NULL;
10713395f70eSjsing 		}
1072b1a5c5c8Sjsing 
1073b1a5c5c8Sjsing 		return (int)ssn;
10743395f70eSjsing 	}
10753395f70eSjsing 
10766f7f653bSjsing 	if (SSL_in_init(s) && !s->in_handshake) {
10776f7f653bSjsing 		if ((ret = s->handshake_func(s)) < 0)
1078824388bbSjsing 			return ret;
1079824388bbSjsing 		if (ret == 0) {
1080c9d7abb7Sbeck 			SSLerror(s, SSL_R_SSL_HANDSHAKE_FAILURE);
1081824388bbSjsing 			return -1;
10823395f70eSjsing 		}
10833395f70eSjsing 	}
10843395f70eSjsing 
10853395f70eSjsing  start:
10863395f70eSjsing 	/*
10873395f70eSjsing 	 * Do not process more than three consecutive records, otherwise the
10883395f70eSjsing 	 * peer can cause us to loop indefinitely. Instead, return with an
10893395f70eSjsing 	 * SSL_ERROR_WANT_READ so the caller can choose when to handle further
10903395f70eSjsing 	 * processing. In the future, the total number of non-handshake and
10913395f70eSjsing 	 * non-application data records per connection should probably also be
10923395f70eSjsing 	 * limited...
10933395f70eSjsing 	 */
10943395f70eSjsing 	if (rrcount++ >= 3) {
1095a2584b01Sbeck 		ssl_force_want_read(s);
10963395f70eSjsing 		return -1;
10973395f70eSjsing 	}
10983395f70eSjsing 
10996f7f653bSjsing 	s->rwstate = SSL_NOTHING;
11003395f70eSjsing 
1101ee4250f6Sjsing 	if (tls_content_remaining(s->s3->rcontent) == 0) {
1102824388bbSjsing 		if ((ret = ssl3_get_record(s)) <= 0)
1103824388bbSjsing 			return ret;
11043395f70eSjsing 	}
11053395f70eSjsing 
1106824388bbSjsing 	/* We now have a packet which can be read and processed. */
11073395f70eSjsing 
1108ee4250f6Sjsing 	if (s->s3->change_cipher_spec &&
1109ee4250f6Sjsing 	    tls_content_type(s->s3->rcontent) != SSL3_RT_HANDSHAKE) {
1110c9d7abb7Sbeck 		SSLerror(s, SSL_R_DATA_BETWEEN_CCS_AND_FINISHED);
1111824388bbSjsing 		ssl3_send_alert(s, SSL3_AL_FATAL, SSL_AD_UNEXPECTED_MESSAGE);
1112824388bbSjsing 		return -1;
11133395f70eSjsing 	}
11143395f70eSjsing 
1115824388bbSjsing 	/*
1116824388bbSjsing 	 * If the other end has shut down, throw anything we read away (even in
1117824388bbSjsing 	 * 'peek' mode).
1118824388bbSjsing 	 */
11196f7f653bSjsing 	if (s->shutdown & SSL_RECEIVED_SHUTDOWN) {
11206f7f653bSjsing 		s->rwstate = SSL_NOTHING;
1121ee4250f6Sjsing 		tls_content_clear(s->s3->rcontent);
1122ee4250f6Sjsing 		s->s3->rrec.length = 0;
1123824388bbSjsing 		return 0;
11243395f70eSjsing 	}
11253395f70eSjsing 
11263395f70eSjsing 	/* SSL3_RT_APPLICATION_DATA or SSL3_RT_HANDSHAKE */
1127ee4250f6Sjsing 	if (tls_content_type(s->s3->rcontent) == type) {
1128824388bbSjsing 		/*
1129824388bbSjsing 		 * Make sure that we are not getting application data when we
1130824388bbSjsing 		 * are doing a handshake for the first time.
1131824388bbSjsing 		 */
11321365e68cSjsing 		if (SSL_in_init(s) && type == SSL3_RT_APPLICATION_DATA &&
11336f7f653bSjsing 		    !tls12_record_layer_read_protected(s->rl)) {
1134c9d7abb7Sbeck 			SSLerror(s, SSL_R_APP_DATA_IN_HANDSHAKE);
1135824388bbSjsing 			ssl3_send_alert(s, SSL3_AL_FATAL,
1136824388bbSjsing 			    SSL_AD_UNEXPECTED_MESSAGE);
1137824388bbSjsing 			return -1;
11383395f70eSjsing 		}
11393395f70eSjsing 
11403395f70eSjsing 		if (len <= 0)
1141824388bbSjsing 			return len;
11423395f70eSjsing 
1143ee4250f6Sjsing 		if (peek) {
1144ee4250f6Sjsing 			ssret = tls_content_peek(s->s3->rcontent, buf, len);
1145ee4250f6Sjsing 		} else {
1146ee4250f6Sjsing 			ssret = tls_content_read(s->s3->rcontent, buf, len);
1147ee4250f6Sjsing 		}
1148ee4250f6Sjsing 		if (ssret < INT_MIN || ssret > INT_MAX)
1149ee4250f6Sjsing 			return -1;
1150ee4250f6Sjsing 		if (ssret < 0)
1151ee4250f6Sjsing 			return (int)ssret;
11523395f70eSjsing 
1153ee4250f6Sjsing 		if (tls_content_remaining(s->s3->rcontent) == 0) {
11546f7f653bSjsing 			s->rstate = SSL_ST_READ_HEADER;
1155ee4250f6Sjsing 
11566f7f653bSjsing 			if (s->mode & SSL_MODE_RELEASE_BUFFERS &&
115702876cc3Sjsing 			    s->s3->rbuf.left == 0)
11583395f70eSjsing 				ssl3_release_read_buffer(s);
11593395f70eSjsing 		}
1160ee4250f6Sjsing 
1161ee4250f6Sjsing 		return ssret;
11623395f70eSjsing 	}
1163824388bbSjsing 
1164ee4250f6Sjsing 	if (tls_content_type(s->s3->rcontent) == SSL3_RT_ALERT) {
116556fd52a7Sjsing 		if ((ret = ssl3_read_alert(s)) <= 0)
116656fd52a7Sjsing 			return ret;
11673395f70eSjsing 		goto start;
11683395f70eSjsing 	}
11693395f70eSjsing 
11706f7f653bSjsing 	if (s->shutdown & SSL_SENT_SHUTDOWN) {
11716f7f653bSjsing 		s->rwstate = SSL_NOTHING;
1172ee4250f6Sjsing 		tls_content_clear(s->s3->rcontent);
1173ee4250f6Sjsing 		s->s3->rrec.length = 0;
1174824388bbSjsing 		return 0;
1175824388bbSjsing 	}
1176824388bbSjsing 
1177ee4250f6Sjsing 	if (tls_content_type(s->s3->rcontent) == SSL3_RT_APPLICATION_DATA) {
1178824388bbSjsing 		/*
1179824388bbSjsing 		 * At this point, we were expecting handshake data, but have
1180824388bbSjsing 		 * application data. If the library was running inside
1181824388bbSjsing 		 * ssl3_read() (i.e. in_read_app_data is set) and it makes
1182824388bbSjsing 		 * sense to read application data at this point (session
1183824388bbSjsing 		 * renegotiation not yet started), we will indulge it.
1184824388bbSjsing 		 */
1185824388bbSjsing 		if (s->s3->in_read_app_data != 0 &&
1186824388bbSjsing 		    s->s3->total_renegotiations != 0 &&
1187824388bbSjsing 		    (((s->s3->hs.state & SSL_ST_CONNECT) &&
1188824388bbSjsing 		    (s->s3->hs.state >= SSL3_ST_CW_CLNT_HELLO_A) &&
1189824388bbSjsing 		    (s->s3->hs.state <= SSL3_ST_CR_SRVR_HELLO_A)) || (
1190824388bbSjsing 		    (s->s3->hs.state & SSL_ST_ACCEPT) &&
1191824388bbSjsing 		    (s->s3->hs.state <= SSL3_ST_SW_HELLO_REQ_A) &&
1192824388bbSjsing 		    (s->s3->hs.state >= SSL3_ST_SR_CLNT_HELLO_A)))) {
1193824388bbSjsing 			s->s3->in_read_app_data = 2;
1194824388bbSjsing 			return -1;
1195824388bbSjsing 		} else {
1196824388bbSjsing 			SSLerror(s, SSL_R_UNEXPECTED_RECORD);
1197824388bbSjsing 			ssl3_send_alert(s, SSL3_AL_FATAL,
1198824388bbSjsing 			    SSL_AD_UNEXPECTED_MESSAGE);
1199824388bbSjsing 			return -1;
1200824388bbSjsing 		}
12013395f70eSjsing 	}
12023395f70eSjsing 
1203ee4250f6Sjsing 	if (tls_content_type(s->s3->rcontent) == SSL3_RT_CHANGE_CIPHER_SPEC) {
1204b23067a6Sjsing 		if ((ret = ssl3_read_change_cipher_spec(s)) <= 0)
1205b23067a6Sjsing 			return ret;
12063395f70eSjsing 		goto start;
12073395f70eSjsing 	}
12083395f70eSjsing 
1209ee4250f6Sjsing 	if (tls_content_type(s->s3->rcontent) == SSL3_RT_HANDSHAKE) {
1210225d6b92Sjsing 		if ((ret = ssl3_read_handshake_unexpected(s)) <= 0)
1211225d6b92Sjsing 			return ret;
12123395f70eSjsing 		goto start;
12133395f70eSjsing 	}
12143395f70eSjsing 
12153395f70eSjsing 	/*
1216824388bbSjsing 	 * Unknown record type - TLSv1.2 sends an unexpected message alert while
1217824388bbSjsing 	 * earlier versions silently ignore the record.
12183395f70eSjsing 	 */
1219824388bbSjsing 	if (ssl_effective_tls_version(s) <= TLS1_1_VERSION) {
1220ee4250f6Sjsing 		tls_content_clear(s->s3->rcontent);
12213395f70eSjsing 		goto start;
12223395f70eSjsing 	}
1223c9d7abb7Sbeck 	SSLerror(s, SSL_R_UNEXPECTED_RECORD);
1224824388bbSjsing 	ssl3_send_alert(s, SSL3_AL_FATAL, SSL_AD_UNEXPECTED_MESSAGE);
1225824388bbSjsing 	return -1;
12263395f70eSjsing }
12273395f70eSjsing 
12283395f70eSjsing int
ssl3_do_change_cipher_spec(SSL * s)12293395f70eSjsing ssl3_do_change_cipher_spec(SSL *s)
12303395f70eSjsing {
123102876cc3Sjsing 	if (s->s3->hs.tls12.key_block == NULL) {
12323395f70eSjsing 		if (s->session == NULL || s->session->master_key_length == 0) {
12333395f70eSjsing 			/* might happen if dtls1_read_bytes() calls this */
1234c9d7abb7Sbeck 			SSLerror(s, SSL_R_CCS_RECEIVED_EARLY);
12353395f70eSjsing 			return (0);
12363395f70eSjsing 		}
12373395f70eSjsing 
1238*f4fe6251Sjsing 		s->session->cipher_value = s->s3->hs.cipher->value;
1239387303bbSjsing 
124053f78dfdSjsing 		if (!tls1_setup_key_block(s))
12413395f70eSjsing 			return (0);
12423395f70eSjsing 	}
12433395f70eSjsing 
1244b3d9ef4bSjsing 	if (!tls1_change_read_cipher_state(s))
12453395f70eSjsing 		return (0);
12463395f70eSjsing 
1247643d65b6Sjsing 	/*
1248643d65b6Sjsing 	 * We have to record the message digest at this point so we can get it
1249643d65b6Sjsing 	 * before we read the finished message.
1250643d65b6Sjsing 	 */
1251643d65b6Sjsing 	if (!tls12_derive_peer_finished(s))
1252643d65b6Sjsing 		return (0);
12533395f70eSjsing 
12543395f70eSjsing 	return (1);
12553395f70eSjsing }
12563395f70eSjsing 
1257e3dbb073Sjsing static int
ssl3_write_alert(SSL * s)1258e3dbb073Sjsing ssl3_write_alert(SSL *s)
1259e3dbb073Sjsing {
1260e3dbb073Sjsing 	if (SSL_is_dtls(s))
126102876cc3Sjsing 		return do_dtls1_write(s, SSL3_RT_ALERT, s->s3->send_alert,
126202876cc3Sjsing 		    sizeof(s->s3->send_alert));
1263e3dbb073Sjsing 
126402876cc3Sjsing 	return do_ssl3_write(s, SSL3_RT_ALERT, s->s3->send_alert,
126502876cc3Sjsing 	    sizeof(s->s3->send_alert));
1266e3dbb073Sjsing }
1267e3dbb073Sjsing 
12683395f70eSjsing int
ssl3_send_alert(SSL * s,int level,int desc)12693395f70eSjsing ssl3_send_alert(SSL *s, int level, int desc)
12703395f70eSjsing {
1271063f2f30Sjsing 	/* If alert is fatal, remove session from cache. */
1272b50283dfSjsing 	if (level == SSL3_AL_FATAL)
12733395f70eSjsing 		SSL_CTX_remove_session(s->ctx, s->session);
12743395f70eSjsing 
127502876cc3Sjsing 	s->s3->alert_dispatch = 1;
127602876cc3Sjsing 	s->s3->send_alert[0] = level;
127702876cc3Sjsing 	s->s3->send_alert[1] = desc;
12783395f70eSjsing 
1279063f2f30Sjsing 	/*
1280063f2f30Sjsing 	 * If data is still being written out, the alert will be dispatched at
1281063f2f30Sjsing 	 * some point in the future.
1282063f2f30Sjsing 	 */
128302876cc3Sjsing 	if (s->s3->wbuf.left != 0)
12843395f70eSjsing 		return -1;
1285063f2f30Sjsing 
1286063f2f30Sjsing 	return ssl3_dispatch_alert(s);
12873395f70eSjsing }
12883395f70eSjsing 
12893395f70eSjsing int
ssl3_dispatch_alert(SSL * s)12903395f70eSjsing ssl3_dispatch_alert(SSL *s)
12913395f70eSjsing {
1292063f2f30Sjsing 	int ret;
12933395f70eSjsing 
129402876cc3Sjsing 	s->s3->alert_dispatch = 0;
1295063f2f30Sjsing 	if ((ret = ssl3_write_alert(s)) <= 0) {
129602876cc3Sjsing 		s->s3->alert_dispatch = 1;
1297063f2f30Sjsing 		return ret;
1298063f2f30Sjsing 	}
1299063f2f30Sjsing 
1300063f2f30Sjsing 	/*
1301063f2f30Sjsing 	 * Alert sent to BIO.  If it is important, flush it now.
13023395f70eSjsing 	 * If the message does not get sent due to non-blocking IO,
1303063f2f30Sjsing 	 * we will not worry too much.
1304063f2f30Sjsing 	 */
130502876cc3Sjsing 	if (s->s3->send_alert[0] == SSL3_AL_FATAL)
13063395f70eSjsing 		(void)BIO_flush(s->wbio);
13073395f70eSjsing 
130802876cc3Sjsing 	ssl_msg_callback(s, 1, SSL3_RT_ALERT, s->s3->send_alert, 2);
13093395f70eSjsing 
1310545b2b63Sjsing 	ssl_info_callback(s, SSL_CB_WRITE_ALERT,
131102876cc3Sjsing 	    (s->s3->send_alert[0] << 8) | s->s3->send_alert[1]);
13123395f70eSjsing 
1313063f2f30Sjsing 	return ret;
13143395f70eSjsing }
1315