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