libtls: fix legacy protocol parsing
authortb <tb@openbsd.org>
Fri, 2 Aug 2024 15:00:01 +0000 (15:00 +0000)
committertb <tb@openbsd.org>
Fri, 2 Aug 2024 15:00:01 +0000 (15:00 +0000)
Redefining TLS_PROTOCOL_TLSv1_0 and TLS_PROTOCOL_TLSv1_1 to be the same
as TLS_PROTOCOL_TLSv1_2 had undesired side effects, as witnessed in the
accompanying regress tests. The protocol string all:tlsv1.0 would disable
TLSv1.2 (so only enable TLSv1.3) and tlsv1.2:!tlsv1.1 would disable all
protocols.

It makes more sense to ignore any setting of TLSv1.0 and TLSv1.1, so if
you request 'tlsv1.1' you get no protocol, but 'all:!tlsv1.1' will enable
the two supported protocols TLSv1.3 and TLSv1.2.

Restore the defines to their original values and adjust the parsing code
to set/unset them.

Issue reported by Kenjiro Nakayama
Fixes https://github.com/libressl/openbsd/issues/151

with/ok jsing

lib/libtls/tls.h
lib/libtls/tls_config.c

index 67804d7..6b36886 100644 (file)
@@ -1,4 +1,4 @@
-/* $OpenBSD: tls.h,v 1.66 2024/03/27 07:35:30 joshua Exp $ */
+/* $OpenBSD: tls.h,v 1.67 2024/08/02 15:00:01 tb Exp $ */
 /*
  * Copyright (c) 2014 Joel Sing <jsing@openbsd.org>
  *
@@ -33,8 +33,8 @@ extern "C" {
  * Deprecated versions of TLS. Using these effectively selects
  * the minimum supported version.
  */
-#define TLS_PROTOCOL_TLSv1_0   (1 << 3)
-#define TLS_PROTOCOL_TLSv1_1   (1 << 3)
+#define TLS_PROTOCOL_TLSv1_0   (1 << 1)
+#define TLS_PROTOCOL_TLSv1_1   (1 << 2)
 /* Supported versions of TLS */
 #define TLS_PROTOCOL_TLSv1_2   (1 << 3)
 #define TLS_PROTOCOL_TLSv1_3   (1 << 4)
index 10dc500..22fa845 100644 (file)
@@ -1,4 +1,4 @@
-/* $OpenBSD: tls_config.c,v 1.70 2024/03/28 06:55:02 joshua Exp $ */
+/* $OpenBSD: tls_config.c,v 1.71 2024/08/02 15:00:01 tb Exp $ */
 /*
  * Copyright (c) 2014 Joel Sing <jsing@openbsd.org>
  *
@@ -261,9 +261,9 @@ tls_config_parse_protocols(uint32_t *protocols, const char *protostr)
                if (strcasecmp(p, "tlsv1") == 0)
                        proto = TLS_PROTOCOL_TLSv1;
                else if (strcasecmp(p, "tlsv1.0") == 0)
-                       proto = TLS_PROTOCOL_TLSv1_2;
+                       proto = TLS_PROTOCOL_TLSv1_0;
                else if (strcasecmp(p, "tlsv1.1") == 0)
-                       proto = TLS_PROTOCOL_TLSv1_2;
+                       proto = TLS_PROTOCOL_TLSv1_1;
                else if (strcasecmp(p, "tlsv1.2") == 0)
                        proto = TLS_PROTOCOL_TLSv1_2;
                else if (strcasecmp(p, "tlsv1.3") == 0)