Blame SOURCES/edk2-MdePkg-Include-Protocol-Tls.h-Add-the-data-type-of-E.patch

63d87e
From 22ebe3ff84003e9256759e230ac68da35c6d77a2 Mon Sep 17 00:00:00 2001
63d87e
From: Laszlo Ersek <lersek@redhat.com>
63d87e
Date: Mon, 2 Dec 2019 12:31:37 +0100
63d87e
Subject: [PATCH 1/9] MdePkg/Include/Protocol/Tls.h: Add the data type of
63d87e
 EfiTlsVerifyHost (CVE-2019-14553)
63d87e
MIME-Version: 1.0
63d87e
Content-Type: text/plain; charset=UTF-8
63d87e
Content-Transfer-Encoding: 8bit
63d87e
63d87e
RH-Author: Laszlo Ersek <lersek@redhat.com>
63d87e
Message-id: <20191117220052.15700-2-lersek@redhat.com>
63d87e
Patchwork-id: 92457
63d87e
O-Subject: [RHEL-8.2.0 edk2 PATCH 1/9] MdePkg/Include/Protocol/Tls.h: Add the data type of EfiTlsVerifyHost (CVE-2019-14553)
63d87e
Bugzilla: 1536624
63d87e
RH-Acked-by: Philippe Mathieu-Daudé <philmd@redhat.com>
63d87e
RH-Acked-by: Vitaly Kuznetsov <vkuznets@redhat.com>
63d87e
63d87e
From: "Wu, Jiaxin" <jiaxin.wu@intel.com>
63d87e
63d87e
REF: https://bugzilla.tianocore.org/show_bug.cgi?id=960
63d87e
CVE: CVE-2019-14553
63d87e
In the patch, we add the new data type named "EfiTlsVerifyHost" and
63d87e
the EFI_TLS_VERIFY_HOST_FLAG for the TLS protocol consumer (HTTP)
63d87e
to enable the host name check so as to avoid the potential
63d87e
Man-In-The-Middle attack.
63d87e
63d87e
Signed-off-by: Wu Jiaxin <jiaxin.wu@intel.com>
63d87e
Reviewed-by: Ye Ting <ting.ye@intel.com>
63d87e
Reviewed-by: Long Qin <qin.long@intel.com>
63d87e
Reviewed-by: Fu Siyuan <siyuan.fu@intel.com>
63d87e
Acked-by: Laszlo Ersek <lersek@redhat.com>
63d87e
Message-Id: <20190927034441.3096-2-Jiaxin.wu@intel.com>
63d87e
Cc: David Woodhouse <dwmw2@infradead.org>
63d87e
Cc: Jian J Wang <jian.j.wang@intel.com>
63d87e
Cc: Jiaxin Wu <jiaxin.wu@intel.com>
63d87e
Cc: Sivaraman Nainar <sivaramann@amiindia.co.in>
63d87e
Cc: Xiaoyu Lu <xiaoyux.lu@intel.com>
63d87e
Signed-off-by: Laszlo Ersek <lersek@redhat.com>
63d87e
Reviewed-by: Liming Gao <liming.gao@intel.com>
63d87e
(cherry picked from commit 31efec82796cb950e99d1622aa9c0eb8380613a0)
63d87e
---
63d87e
 MdePkg/Include/Protocol/Tls.h | 68 ++++++++++++++++++++++++++++++++++++-------
63d87e
 1 file changed, 57 insertions(+), 11 deletions(-)
63d87e
63d87e
diff --git a/MdePkg/Include/Protocol/Tls.h b/MdePkg/Include/Protocol/Tls.h
63d87e
index bf1b672..af524ae 100644
63d87e
--- a/MdePkg/Include/Protocol/Tls.h
63d87e
+++ b/MdePkg/Include/Protocol/Tls.h
63d87e
@@ -42,10 +42,6 @@ typedef struct _EFI_TLS_PROTOCOL EFI_TLS_PROTOCOL;
63d87e
 ///
63d87e
 typedef enum {
63d87e
   ///
63d87e
-  /// Session Configuration
63d87e
-  ///
63d87e
-
63d87e
-  ///
63d87e
   /// TLS session Version. The corresponding Data is of type EFI_TLS_VERSION.
63d87e
   ///
63d87e
   EfiTlsVersion,
63d87e
@@ -86,11 +82,6 @@ typedef enum {
63d87e
   /// The corresponding Data is of type EFI_TLS_SESSION_STATE.
63d87e
   ///
63d87e
   EfiTlsSessionState,
63d87e
-
63d87e
-  ///
63d87e
-  /// Session information
63d87e
-  ///
63d87e
-
63d87e
   ///
63d87e
   /// TLS session data client random.
63d87e
   /// The corresponding Data is of type EFI_TLS_RANDOM.
63d87e
@@ -106,9 +97,15 @@ typedef enum {
63d87e
   /// The corresponding Data is of type EFI_TLS_MASTER_SECRET.
63d87e
   ///
63d87e
   EfiTlsKeyMaterial,
63d87e
+  ///
63d87e
+  /// TLS session hostname for validation which is used to verify whether the name
63d87e
+  /// within the peer certificate matches a given host name.
63d87e
+  /// This parameter is invalid when EfiTlsVerifyMethod is EFI_TLS_VERIFY_NONE.
63d87e
+  /// The corresponding Data is of type EFI_TLS_VERIFY_HOST.
63d87e
+  ///
63d87e
+  EfiTlsVerifyHost,
63d87e
 
63d87e
   EfiTlsSessionDataTypeMaximum
63d87e
-
63d87e
 } EFI_TLS_SESSION_DATA_TYPE;
63d87e
 
63d87e
 ///
63d87e
@@ -178,7 +175,8 @@ typedef UINT32  EFI_TLS_VERIFY;
63d87e
 ///
63d87e
 #define EFI_TLS_VERIFY_PEER                  0x1
63d87e
 ///
63d87e
-/// TLS session will fail peer certificate is absent.
63d87e
+/// EFI_TLS_VERIFY_FAIL_IF_NO_PEER_CERT is only meaningful in the server mode.
63d87e
+/// TLS session will fail if client certificate is absent.
63d87e
 ///
63d87e
 #define EFI_TLS_VERIFY_FAIL_IF_NO_PEER_CERT  0x2
63d87e
 ///
63d87e
@@ -188,6 +186,54 @@ typedef UINT32  EFI_TLS_VERIFY;
63d87e
 #define EFI_TLS_VERIFY_CLIENT_ONCE           0x4
63d87e
 
63d87e
 ///
63d87e
+/// EFI_TLS_VERIFY_HOST_FLAG
63d87e
+///
63d87e
+typedef UINT32 EFI_TLS_VERIFY_HOST_FLAG;
63d87e
+///
63d87e
+/// There is no additional flags set for hostname validation.
63d87e
+/// Wildcards are supported and they match only in the left-most label.
63d87e
+///
63d87e
+#define EFI_TLS_VERIFY_FLAG_NONE                    0x00
63d87e
+///
63d87e
+/// Always check the Subject Distinguished Name (DN) in the peer certificate even if the
63d87e
+/// certificate contains Subject Alternative Name (SAN).
63d87e
+///
63d87e
+#define EFI_TLS_VERIFY_FLAG_ALWAYS_CHECK_SUBJECT    0x01
63d87e
+///
63d87e
+/// Disable the match of all wildcards.
63d87e
+///
63d87e
+#define EFI_TLS_VERIFY_FLAG_NO_WILDCARDS            0x02
63d87e
+///
63d87e
+/// Disable the "*" as wildcard in labels that have a prefix or suffix (e.g. "www*" or "*www").
63d87e
+///
63d87e
+#define EFI_TLS_VERIFY_FLAG_NO_PARTIAL_WILDCARDS    0x04
63d87e
+///
63d87e
+/// Allow the "*" to match more than one labels. Otherwise, only matches a single label.
63d87e
+///
63d87e
+#define EFI_TLS_VERIFY_FLAG_MULTI_LABEL_WILDCARDS   0x08
63d87e
+///
63d87e
+/// Restrict to only match direct child sub-domains which start with ".".
63d87e
+/// For example, a name of ".example.com" would match "www.example.com" with this flag,
63d87e
+/// but would not match "www.sub.example.com".
63d87e
+///
63d87e
+#define EFI_TLS_VERIFY_FLAG_SINGLE_LABEL_SUBDOMAINS 0x10
63d87e
+///
63d87e
+/// Never check the Subject Distinguished Name (DN) even there is no
63d87e
+/// Subject Alternative Name (SAN) in the certificate.
63d87e
+///
63d87e
+#define EFI_TLS_VERIFY_FLAG_NEVER_CHECK_SUBJECT     0x20
63d87e
+
63d87e
+///
63d87e
+/// EFI_TLS_VERIFY_HOST
63d87e
+///
63d87e
+#pragma pack (1)
63d87e
+typedef struct {
63d87e
+  EFI_TLS_VERIFY_HOST_FLAG Flags;
63d87e
+  CHAR8                    *HostName;
63d87e
+} EFI_TLS_VERIFY_HOST;
63d87e
+#pragma pack ()
63d87e
+
63d87e
+///
63d87e
 /// EFI_TLS_RANDOM
63d87e
 /// Note: The definition of EFI_TLS_RANDOM is from "RFC 5246 A.4.1.
63d87e
 ///       Hello Messages".
63d87e
-- 
63d87e
1.8.3.1
63d87e