xref: /openbsd-src/lib/libssl/ssl_packet.c (revision 42f4d18f4342bb9466778fff3c6f94ce97ba8bd2)
1*42f4d18fSjsing /* $OpenBSD: ssl_packet.c,v 1.16 2024/06/28 13:37:49 jsing Exp $ */
224a1aa5bSjsing /*
324a1aa5bSjsing  * Copyright (c) 2016, 2017 Joel Sing <jsing@openbsd.org>
424a1aa5bSjsing  *
524a1aa5bSjsing  * Permission to use, copy, modify, and distribute this software for any
624a1aa5bSjsing  * purpose with or without fee is hereby granted, provided that the above
724a1aa5bSjsing  * copyright notice and this permission notice appear in all copies.
824a1aa5bSjsing  *
924a1aa5bSjsing  * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
1024a1aa5bSjsing  * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
1124a1aa5bSjsing  * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
1224a1aa5bSjsing  * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
1324a1aa5bSjsing  * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
1424a1aa5bSjsing  * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
1524a1aa5bSjsing  * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
1624a1aa5bSjsing  */
1724a1aa5bSjsing 
1824a1aa5bSjsing #include "bytestring.h"
19c9675a23Stb #include "ssl_local.h"
2024a1aa5bSjsing 
2124a1aa5bSjsing static int
ssl_is_sslv3_handshake(CBS * header)2224a1aa5bSjsing ssl_is_sslv3_handshake(CBS *header)
2324a1aa5bSjsing {
2424a1aa5bSjsing 	uint16_t record_version;
2524a1aa5bSjsing 	uint8_t record_type;
2624a1aa5bSjsing 	CBS cbs;
2724a1aa5bSjsing 
2824a1aa5bSjsing 	CBS_dup(header, &cbs);
2924a1aa5bSjsing 
3024a1aa5bSjsing 	if (!CBS_get_u8(&cbs, &record_type) ||
3124a1aa5bSjsing 	    !CBS_get_u16(&cbs, &record_version))
3224a1aa5bSjsing 		return 0;
3324a1aa5bSjsing 
3424a1aa5bSjsing 	if (record_type != SSL3_RT_HANDSHAKE)
3524a1aa5bSjsing 		return 0;
3624a1aa5bSjsing 	if ((record_version >> 8) != SSL3_VERSION_MAJOR)
3724a1aa5bSjsing 		return 0;
3824a1aa5bSjsing 
3924a1aa5bSjsing 	return 1;
4024a1aa5bSjsing }
4124a1aa5bSjsing 
4224a1aa5bSjsing /*
4324a1aa5bSjsing  * Potentially do legacy processing on the first packet received by a TLS
4424a1aa5bSjsing  * server. We return 1 if we want SSLv3/TLS record processing to continue
4524a1aa5bSjsing  * normally, otherwise we must set an SSLerr and return -1.
4624a1aa5bSjsing  */
4724a1aa5bSjsing int
ssl_server_legacy_first_packet(SSL * s)4824a1aa5bSjsing ssl_server_legacy_first_packet(SSL *s)
4924a1aa5bSjsing {
5024a1aa5bSjsing 	const char *data;
5124a1aa5bSjsing 	CBS header;
5224a1aa5bSjsing 
539e659261Sjsing 	if (SSL_is_dtls(s))
5424a1aa5bSjsing 		return 1;
5524a1aa5bSjsing 
566f7f653bSjsing 	CBS_init(&header, s->packet, SSL3_RT_HEADER_LENGTH);
5724a1aa5bSjsing 
5824a1aa5bSjsing 	if (ssl_is_sslv3_handshake(&header) == 1)
5924a1aa5bSjsing 		return 1;
6024a1aa5bSjsing 
6124a1aa5bSjsing 	/* Only continue if this is not a version locked method. */
626ba40c14Sjsing 	if (s->method->min_tls_version == s->method->max_tls_version)
6324a1aa5bSjsing 		return 1;
6424a1aa5bSjsing 
6524a1aa5bSjsing 	/* Ensure that we have SSL3_RT_HEADER_LENGTH (5 bytes) of the packet. */
6624a1aa5bSjsing 	if (CBS_len(&header) != SSL3_RT_HEADER_LENGTH) {
67c9d7abb7Sbeck 		SSLerror(s, ERR_R_INTERNAL_ERROR);
6824a1aa5bSjsing 		return -1;
6924a1aa5bSjsing 	}
7024a1aa5bSjsing 	data = (const char *)CBS_data(&header);
7124a1aa5bSjsing 
7224a1aa5bSjsing 	/* Is this a cleartext protocol? */
7324a1aa5bSjsing 	if (strncmp("GET ", data, 4) == 0 ||
7424a1aa5bSjsing 	    strncmp("POST ", data, 5) == 0 ||
7524a1aa5bSjsing 	    strncmp("HEAD ", data, 5) == 0 ||
7624a1aa5bSjsing 	    strncmp("PUT ", data, 4) == 0) {
77c9d7abb7Sbeck 		SSLerror(s, SSL_R_HTTP_REQUEST);
7824a1aa5bSjsing 		return -1;
7924a1aa5bSjsing 	}
8024a1aa5bSjsing 	if (strncmp("CONNE", data, 5) == 0) {
81c9d7abb7Sbeck 		SSLerror(s, SSL_R_HTTPS_PROXY_REQUEST);
8224a1aa5bSjsing 		return -1;
8324a1aa5bSjsing 	}
8424a1aa5bSjsing 
85c9d7abb7Sbeck 	SSLerror(s, SSL_R_UNKNOWN_PROTOCOL);
8624a1aa5bSjsing 
8724a1aa5bSjsing 	return -1;
8824a1aa5bSjsing }
89