Bug 1535210 - Set SSL STATE_IS_BROKEN flag for TLS1.0 and TLS 1.1 connections. r=keeler
authorKevin Jacobs <kjacobs@mozilla.com>
Wed, 15 May 2019 23:34:52 +0000
changeset 532836 0ab201cfaf67e1ef4a74c483586764405a79e306
parent 532835 aff4e1440f1a58fb3c8f497e2558c950236a2b82
child 532837 263b8a0e6c3460e7a7a2c5e9dd90346a7ceefcc6
push id11272
push userapavel@mozilla.com
push dateThu, 16 May 2019 15:28:22 +0000
treeherdermozilla-beta@2265bfc5920d [default view] [failures only]
perfherder[talos] [build metrics] [platform microbench] (compared to previous push)
reviewerskeeler
bugs1535210
milestone68.0a1
first release with
nightly linux32
nightly linux64
nightly mac
nightly win32
nightly win64
last release without
nightly linux32
nightly linux64
nightly mac
nightly win32
nightly win64
Bug 1535210 - Set SSL STATE_IS_BROKEN flag for TLS1.0 and TLS 1.1 connections. r=keeler Differential Revision: https://phabricator.services.mozilla.com/D29576
browser/base/content/test/siteIdentity/browser.ini
browser/base/content/test/siteIdentity/browser_deprecatedTLSVersions.js
build/pgo/certs/cert9.db
build/pgo/certs/key4.db
build/pgo/certs/mochitest.client
build/pgo/server-locations.txt
security/manager/ssl/nsNSSCallbacks.cpp
testing/mochitest/runtests.py
testing/mochitest/ssltunnel/ssltunnel.cpp
--- a/browser/base/content/test/siteIdentity/browser.ini
+++ b/browser/base/content/test/siteIdentity/browser.ini
@@ -109,8 +109,9 @@ support-files =
   iframe_navigation.html
 [browser_navigation_failures.js]
 [browser_secure_transport_insecure_scheme.js]
 [browser_ignore_same_page_navigation.js]
 [browser_mixed_content_with_navigation.js]
 support-files =
   file_mixedPassiveContent.html
   file_bug1045809_1.html
+[browser_deprecatedTLSVersions.js]
new file mode 100644
--- /dev/null
+++ b/browser/base/content/test/siteIdentity/browser_deprecatedTLSVersions.js
@@ -0,0 +1,61 @@
+/*
+ * Any copyright is dedicated to the Public Domain.
+ * http://creativecommons.org/publicdomain/zero/1.0/
+ *
+ * Tests for Bug 1535210 - Set SSL STATE_IS_BROKEN flag for TLS1.0 and TLS 1.1 connections
+ */
+
+const HTTPS_TLS1_0 = "https://tls1.example.com";
+const HTTPS_TLS1_1 = "https://tls11.example.com";
+const HTTPS_TLS1_2 = "https://tls12.example.com";
+const HTTPS_TLS1_3 = "https://tls13.example.com";
+
+
+function getIdentityMode(aWindow = window) {
+  return aWindow.document.getElementById("identity-box").className;
+}
+
+function getConnectionState() {
+  // Prevents items that are being lazy loaded causing issues
+  document.getElementById("identity-box").click();
+  gIdentityHandler.refreshIdentityPopup();
+  return document.getElementById("identity-popup").getAttribute("connection");
+}
+
+add_task(async function() {
+  await BrowserTestUtils.withNewTab("about:blank", async function(browser) {
+    // Try deprecated versions
+    await BrowserTestUtils.loadURI(browser, HTTPS_TLS1_0);
+    await BrowserTestUtils.browserLoaded(browser);
+    isSecurityState(browser, "broken");
+    is(getIdentityMode(), "unknownIdentity weakCipher", "Identity should be unknownIdentity");
+    is(getConnectionState(), "not-secure", "connectionState should be not-secure");
+
+    await BrowserTestUtils.loadURI(browser, HTTPS_TLS1_1);
+    await BrowserTestUtils.browserLoaded(browser);
+    isSecurityState(browser, "broken");
+    is(getIdentityMode(), "unknownIdentity weakCipher", "Identity should be unknownIdentity");
+    is(getConnectionState(), "not-secure", "connectionState should be not-secure");
+
+    // Transition to secure
+    await BrowserTestUtils.loadURI(browser, HTTPS_TLS1_2);
+    await BrowserTestUtils.browserLoaded(browser);
+    isSecurityState(browser, "secure");
+    is(getIdentityMode(), "verifiedDomain", "Identity should be verified");
+    is(getConnectionState(), "secure", "connectionState should be secure");
+
+    // Transition back to broken
+    await BrowserTestUtils.loadURI(browser, HTTPS_TLS1_1);
+    await BrowserTestUtils.browserLoaded(browser);
+    isSecurityState(browser, "broken");
+    is(getIdentityMode(), "unknownIdentity weakCipher", "Identity should be unknownIdentity");
+    is(getConnectionState(), "not-secure", "connectionState should be not-secure");
+
+    // TLS1.3 for completeness
+    await BrowserTestUtils.loadURI(browser, HTTPS_TLS1_3);
+    await BrowserTestUtils.browserLoaded(browser);
+    isSecurityState(browser, "secure");
+    is(getIdentityMode(), "verifiedDomain", "Identity should be verified");
+    is(getConnectionState(), "secure", "connectionState should be secure");
+  });
+});
index 449e713dd95de0a52c62ecdd45c0788cc60931e1..5a3baaf54bbb34ecfd85a47dfc5f03cf4fd18177
GIT binary patch
literal 229376
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
z000000000000000000000000000000000000000000000000000002^|A8Dq6Tbu(
zZ72C@EBV<)^3z6zV2bCnB!6(;S~Ay4i(rrECQ?W-bQTSLV1I$$Qj%w(M{sQ`L1EG8
znW+p8on|h{Cu$QM@mwB-$DoEXSS$uBp%;Z_Cdo8aAn4*#6WCOWiDZtk4#62u%VJSd
zzFyu)l540$FvLqXU?7>NuSy`|xpZbcmyy7t)AS^>b+OreRx*p7!HS_$bR@I2vGt=(
zarGd7)fg>FuBHaT22Ww~=o}UWov_(F4M~nVmJ`QMa3{HWBi>Xxho>gVQN_9pZ3CCi
zNvCsEBy*Lq<>_21C6!L$@hH?}l9D7xQIlYcr>8Sm=mt{gGzPjM1xc2?E&=(j@qO5A
znw%tC7TZz^o0`br(YZVs$y{jz0vXRpNnx<iwlK3|Xbi4oXAmSyNNEuq6<F+Weq0ir
z%JXCL22fJyis->$mzRqZ-V*K?Rtt-T$-@3Z7ompWx!|l|i(r-@M=(OrLtri-<lV_T
zD0nT16WHXf7B&fw2v-Wrg@c6dLS4Zn!FIuX!6-q1KtAt5UVYv)VJf;x0000000000
z00000000000000000000000000000000000000000000000000000000000000000
z000000000000000000000QhP81b6(D;Q1%@Rg{-aOTJL8x@P+AZecQ~?XZm8obBC5
zPq%K_UM+O$op>YBW5rqrTP%Z|P_big6XE^Kd;|RB@)GMS`6{tpqzO2@O-IG7v0ST;
zaxJl3i;i;5v0P$D+cm>-O*<-Ug5?@_RMrT~HSDOY0hX)ZQLY}AtJ_ho4wkFkQLYx2
ztJzVlG_YLtj>@WGxvCxIs$jXw9px%vxr!a_a|J9{zN4~oSgveGxiVO;bVs=aELTd8
K;I7bK?*9Xkx|p{B
index 33da46fa1c9d223d0dcc95d05555632eb48408fe..c0de19d70781a569d2f7930056f5c6125d23a6e8
GIT binary patch
literal 294912
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
zqjl|6`Ce4h0l#veI8Nf<ezuLoP=<O#v2yK|uGu@L;3{sX*e1X5CP}82f-sk!fwc88
z9krY6l<!?lbZ92GQK3{V+eaRYK1hF|B=@7-kzS`k(yhBBc495U0DIk}mfX1RSqOsZ
z9N%E7$33wg^^Mw-65G=0DGH7*cjz5`ui3S4iMb;Agw8{mZi`7$7Ok(+*zm1`|Nr#P
zzIo_v`aeB#0{{R3;QtAl%`eiJ*F-VjViq?q000000000000000000000000000000
z00000000000000000000000000000000000000000000000000000000000000000
z004mhk5Q455mQQX+mmk1AojPAP?C~SQ}U-3&}=Rxjrm9vvl_F!c>w?b0000000000
z00000000000000000000000000000000000000000000000000000000000000000
z00000000000000000000{0~7!N<>Whb3#H&N<>W)^Mr^r+K?#PFvdOl$p7nX00000
z00000000000000000000000000000000000000000000000000000000000000000
z00000000000000000000000000Px?O3TZGkQeIvTDMLYOPew{7it+dG4f90HgoL?!
z2Kb>c{von~7=M3^zqc&<Fv>5`7cJ`%;D_}ji#H=iVqeJ9BB_6FNx?#5Z}-O)Di#ub
zU3oSn>(48cEcBKEVg8|;LkaA`pbyClAq9WlPQ$`w84!u_^+gHD2pH}W@I<?Zc?*Q1
zLqY{MH|9lh|6GZdh1Cx25f+RIjSw*O_s006(ZQQh<W-PLTX|VzHn-fpxy|N{0^*zZ
z5*!v1dMF?`)F(n>a~L^)lpk6X9WL{8SQ!tLyfjjhf?D#J$+2a6VrpVGUJoBsurDeU
z<*yU^Ymk5cCP{<Hu%5)o1M=cX(O>t*zZ>lr7!ZsKju6mC2Zv(3FdnE-w193{s87Jp
zjPe{vwqM^H;~(GKzrx82BN4y8A#Us7056O$TEI9A<B9eZ*cBLx@xw%-LNNjUB%6Cg
zn$TTG6SGJ}8gq{*W*}x}^8x?>0000000000000000000000000000000000000000
z0000000000000000000000000000000000000000000000000000000_-}}XRGK;@
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
UkY=fYzHY(ZTHatVY4pl}0l1aA_W%F@
index c7a408b7a6cbc0d3e2a77fbdbf4abaffb578aa8d..43c8c200fb5a07b4f9785f8252552eb52ef17cd1
GIT binary patch
literal 2448
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
CSbppP
--- a/build/pgo/server-locations.txt
+++ b/build/pgo/server-locations.txt
@@ -281,21 +281,24 @@ https://fail-handshake.example.com:443  
 
 # Hosts for sha1 console warning tests
 https://sha1ee.example.com:443                                    privileged,cert=sha1_end_entity
 https://sha256ee.example.com:443                                  privileged,cert=sha256_end_entity
 
 # Hosts for imminent distrust warning tests
 https://imminently-distrusted.example.com:443                     privileged,cert=imminently_distrusted
 
-# Hosts for ssl3/rc4 console warning tests
-https://ssl3.example.com:443        privileged,ssl3
-https://rc4.example.com:443         privileged,rc4
-https://ssl3rc4.example.com:443     privileged,ssl3,rc4
-https://tls1.example.com:443        privileged,tls1
+# Hosts for ssl3/rc4/tls1 warning tests
+https://ssl3.example.com:443         privileged,ssl3
+https://rc4.example.com:443          privileged,rc4
+https://ssl3rc4.example.com:443      privileged,ssl3,rc4
+https://tls1.example.com:443         privileged,tls1
+https://tls11.example.com:443        privileged,tls1_1
+https://tls12.example.com:443        privileged,tls1_2
+https://tls13.example.com:443        privileged,tls1,tls1_3
 
 # Hosts for youtube rewrite tests
 https://mochitest.youtube.com:443
 
 # Host for U2F localhost tests
 https://localhost:443
 
 # Bug 1402530
--- a/security/manager/ssl/nsNSSCallbacks.cpp
+++ b/security/manager/ssl/nsNSSCallbacks.cpp
@@ -1266,20 +1266,22 @@ void HandshakeCallback(PRFileDesc* fd, v
     }
   } else {
     // TLS 1.3 dropped support for renegotiation.
     siteSupportsSafeRenego = true;
   }
   bool renegotiationUnsafe = !siteSupportsSafeRenego &&
                              ioLayerHelpers.treatUnsafeNegotiationAsBroken();
 
+  bool deprecatedTlsVer =
+      (channelInfo.protocolVersion < SSL_LIBRARY_VERSION_TLS_1_2);
   RememberCertErrorsTable::GetInstance().LookupCertErrorBits(infoObject);
 
   uint32_t state;
-  if (renegotiationUnsafe) {
+  if (renegotiationUnsafe || deprecatedTlsVer) {
     state = nsIWebProgressListener::STATE_IS_BROKEN;
   } else {
     state = nsIWebProgressListener::STATE_IS_SECURE;
     SSLVersionRange defVersion;
     rv = SSL_VersionRangeGetDefault(ssl_variant_stream, &defVersion);
     if (rv == SECSuccess && versions.max >= defVersion.max) {
       // we know this site no longer requires a version fallback
       ioLayerHelpers.removeInsecureFallbackSite(infoObject->GetHostName(),
--- a/testing/mochitest/runtests.py
+++ b/testing/mochitest/runtests.py
@@ -617,16 +617,19 @@ class SSLTunnel:
             match = self.redirRE.match(option)
             if match:
                 redirhost = match.group("redirhost")
                 config.write("redirhost:%s:%s:%s:%s\n" %
                              (loc.host, loc.port, self.sslPort, redirhost))
 
             if option in (
                     'tls1',
+                    'tls1_1',
+                    'tls1_2',
+                    'tls1_3',
                     'ssl3',
                     'rc4',
                     'failHandshake'):
                 config.write(
                     "%s:%s:%s:%s\n" %
                     (option, loc.host, loc.port, self.sslPort))
 
     def buildConfig(self, locations, public=None):
--- a/testing/mochitest/ssltunnel/ssltunnel.cpp
+++ b/testing/mochitest/ssltunnel/ssltunnel.cpp
@@ -137,16 +137,19 @@ enum client_auth_option { caNone = 0, ca
 typedef struct {
   int32_t listen_port;
   string cert_nickname;
   PLHashTable* host_cert_table;
   PLHashTable* host_clientauth_table;
   PLHashTable* host_redir_table;
   PLHashTable* host_ssl3_table;
   PLHashTable* host_tls1_table;
+  PLHashTable* host_tls11_table;
+  PLHashTable* host_tls12_table;
+  PLHashTable* host_tls13_table;
   PLHashTable* host_rc4_table;
   PLHashTable* host_failhandshake_table;
 } server_info_t;
 
 typedef struct {
   PRFileDesc* client_sock;
   PRNetAddr client_addr;
   server_info_t* server_info;
@@ -238,17 +241,20 @@ void SignalShutdown() {
   PR_Unlock(shutdown_lock);
 }
 
 // available flags
 enum {
   USE_SSL3 = 1 << 0,
   USE_RC4 = 1 << 1,
   FAIL_HANDSHAKE = 1 << 2,
-  USE_TLS1 = 1 << 4
+  USE_TLS1 = 1 << 3,
+  USE_TLS1_1 = 1 << 4,
+  USE_TLS1_2 = 1 << 5,
+  USE_TLS1_3 = 1 << 6
 };
 
 bool ReadConnectRequest(server_info_t* server_info, relayBuffer& buffer,
                         int32_t* result, string& certificate,
                         client_auth_option* clientauth, string& host,
                         string& location, int32_t* flags) {
   if (buffer.present() < 4) {
     LOG_DEBUG(
@@ -302,16 +308,28 @@ bool ReadConnectRequest(server_info_t* s
   if (PL_HashTableLookup(server_info->host_rc4_table, token)) {
     *flags |= USE_RC4;
   }
 
   if (PL_HashTableLookup(server_info->host_tls1_table, token)) {
     *flags |= USE_TLS1;
   }
 
+  if (PL_HashTableLookup(server_info->host_tls11_table, token)) {
+    *flags |= USE_TLS1_1;
+  }
+
+  if (PL_HashTableLookup(server_info->host_tls12_table, token)) {
+    *flags |= USE_TLS1_2;
+  }
+
+  if (PL_HashTableLookup(server_info->host_tls13_table, token)) {
+    *flags |= USE_TLS1_3;
+  }
+
   if (PL_HashTableLookup(server_info->host_failhandshake_table, token)) {
     *flags |= FAIL_HANDSHAKE;
   }
 
   token = strtok2(_caret, "/", &_caret);
   if (strcmp(token, "HTTP")) {
     LOG_ERRORD((" not tailed with HTTP but with %s", token));
     return true;
@@ -363,25 +381,44 @@ bool ConfigureSSLServerSocket(PRFileDesc
   SSL_OptionSet(ssl_socket, SSL_HANDSHAKE_AS_CLIENT, false);
   SSL_OptionSet(ssl_socket, SSL_HANDSHAKE_AS_SERVER, true);
 
   if (clientAuth != caNone) {
     SSL_OptionSet(ssl_socket, SSL_REQUEST_CERTIFICATE, true);
     SSL_OptionSet(ssl_socket, SSL_REQUIRE_CERTIFICATE, clientAuth == caRequire);
   }
 
+  SSLVersionRange range = {SSL_LIBRARY_VERSION_TLS_1_3,
+                           SSL_LIBRARY_VERSION_3_0};
   if (flags & USE_SSL3) {
-    SSLVersionRange range = {SSL_LIBRARY_VERSION_3_0, SSL_LIBRARY_VERSION_3_0};
-    SSL_VersionRangeSet(ssl_socket, &range);
+    range.min = PR_MIN(range.min, SSL_LIBRARY_VERSION_3_0);
+    range.max = PR_MAX(range.max, SSL_LIBRARY_VERSION_3_0);
+  }
+  if (flags & USE_TLS1) {
+    range.min = PR_MIN(range.min, SSL_LIBRARY_VERSION_TLS_1_0);
+    range.max = PR_MAX(range.max, SSL_LIBRARY_VERSION_TLS_1_0);
+  }
+  if (flags & USE_TLS1_1) {
+    range.min = PR_MIN(range.min, SSL_LIBRARY_VERSION_TLS_1_1);
+    range.max = PR_MAX(range.max, SSL_LIBRARY_VERSION_TLS_1_1);
   }
-
-  if (flags & USE_TLS1) {
-    SSLVersionRange range = {SSL_LIBRARY_VERSION_TLS_1_0,
-                             SSL_LIBRARY_VERSION_TLS_1_0};
-    SSL_VersionRangeSet(ssl_socket, &range);
+  if (flags & USE_TLS1_2) {
+    range.min = PR_MIN(range.min, SSL_LIBRARY_VERSION_TLS_1_2);
+    range.max = PR_MAX(range.max, SSL_LIBRARY_VERSION_TLS_1_2);
+  }
+  if (flags & USE_TLS1_3) {
+    range.min = PR_MIN(range.min, SSL_LIBRARY_VERSION_TLS_1_3);
+    range.max = PR_MAX(range.max, SSL_LIBRARY_VERSION_TLS_1_3);
+  }
+  // Set the valid range, if any were specified (if not, skip
+  // when the default range is invalid, i.e. max > min)
+  if (range.min <= range.max &&
+      SSL_VersionRangeSet(ssl_socket, &range) != SECSuccess) {
+    LOG_ERROR(("Error configuring SSL socket version range\n"));
+    return false;
   }
 
   if (flags & USE_RC4) {
     for (uint16_t i = 0; i < SSL_NumImplementedCiphers; ++i) {
       uint16_t cipher_id = SSL_ImplementedCiphers[i];
       switch (cipher_id) {
         case TLS_ECDHE_ECDSA_WITH_RC4_128_SHA:
         case TLS_ECDHE_RSA_WITH_RC4_128_SHA:
@@ -696,16 +733,22 @@ void HandleConnection(void* data) {
                                              match_hostname, &match);
                 PL_HashTableEnumerateEntries(
                     ci->server_info->host_clientauth_table, match_hostname,
                     &match);
                 PL_HashTableEnumerateEntries(ci->server_info->host_ssl3_table,
                                              match_hostname, &match);
                 PL_HashTableEnumerateEntries(ci->server_info->host_tls1_table,
                                              match_hostname, &match);
+                PL_HashTableEnumerateEntries(ci->server_info->host_tls11_table,
+                                             match_hostname, &match);
+                PL_HashTableEnumerateEntries(ci->server_info->host_tls12_table,
+                                             match_hostname, &match);
+                PL_HashTableEnumerateEntries(ci->server_info->host_tls13_table,
+                                             match_hostname, &match);
                 PL_HashTableEnumerateEntries(ci->server_info->host_rc4_table,
                                              match_hostname, &match);
                 PL_HashTableEnumerateEntries(
                     ci->server_info->host_failhandshake_table, match_hostname,
                     &match);
                 ci->http_proxy_only = !match.matched;
               } else {
                 ci->http_proxy_only = false;
@@ -955,16 +998,28 @@ server_info_t* findServerInfo(int portnu
 PLHashTable* get_ssl3_table(server_info_t* server) {
   return server->host_ssl3_table;
 }
 
 PLHashTable* get_tls1_table(server_info_t* server) {
   return server->host_tls1_table;
 }
 
+PLHashTable* get_tls11_table(server_info_t* server) {
+  return server->host_tls11_table;
+}
+
+PLHashTable* get_tls12_table(server_info_t* server) {
+  return server->host_tls12_table;
+}
+
+PLHashTable* get_tls13_table(server_info_t* server) {
+  return server->host_tls13_table;
+}
+
 PLHashTable* get_rc4_table(server_info_t* server) {
   return server->host_rc4_table;
 }
 
 PLHashTable* get_failhandshake_table(server_info_t* server) {
   return server->host_failhandshake_table;
 }
 
@@ -1011,17 +1066,16 @@ int parseWeakCryptoConfig(char* const& k
   return 0;
 }
 
 int processConfigLine(char* configLine) {
   if (*configLine == 0 || *configLine == '#') return 0;
 
   char* _caret;
   char* keyword = strtok2(configLine, ":", &_caret);
-
   // Configure usage of http/ssl tunneling proxy behavior
   if (!strcmp(keyword, "httpproxy")) {
     char* value = strtok2(_caret, ":", &_caret);
     if (!strcmp(value, "1")) do_http_proxy = true;
 
     return 0;
   }
 
@@ -1131,31 +1185,58 @@ int processConfigLine(char* configLine) 
       if (!server.host_redir_table) {
         LOG_ERROR(("Internal, could not create hash table\n"));
         return 1;
       }
 
       server.host_ssl3_table =
           PL_NewHashTable(0, PL_HashString, PL_CompareStrings,
                           PL_CompareStrings, nullptr, nullptr);
-      ;
+
       if (!server.host_ssl3_table) {
         LOG_ERROR(("Internal, could not create hash table\n"));
         return 1;
       }
 
       server.host_tls1_table =
           PL_NewHashTable(0, PL_HashString, PL_CompareStrings,
                           PL_CompareStrings, nullptr, nullptr);
-      ;
+
       if (!server.host_tls1_table) {
         LOG_ERROR(("Internal, could not create hash table\n"));
         return 1;
       }
 
+      server.host_tls11_table =
+          PL_NewHashTable(0, PL_HashString, PL_CompareStrings,
+                          PL_CompareStrings, nullptr, nullptr);
+
+      if (!server.host_tls11_table) {
+        LOG_ERROR(("Internal, could not create hash table\n"));
+        return 1;
+      }
+
+      server.host_tls12_table =
+          PL_NewHashTable(0, PL_HashString, PL_CompareStrings,
+                          PL_CompareStrings, nullptr, nullptr);
+
+      if (!server.host_tls12_table) {
+        LOG_ERROR(("Internal, could not create hash table\n"));
+        return 1;
+      }
+
+      server.host_tls13_table =
+          PL_NewHashTable(0, PL_HashString, PL_CompareStrings,
+                          PL_CompareStrings, nullptr, nullptr);
+
+      if (!server.host_tls13_table) {
+        LOG_ERROR(("Internal, could not create hash table\n"));
+        return 1;
+      }
+
       server.host_rc4_table =
           PL_NewHashTable(0, PL_HashString, PL_CompareStrings,
                           PL_CompareStrings, nullptr, nullptr);
       ;
       if (!server.host_rc4_table) {
         LOG_ERROR(("Internal, could not create hash table\n"));
         return 1;
       }
@@ -1288,16 +1369,25 @@ int processConfigLine(char* configLine) 
   }
 
   if (!strcmp(keyword, "ssl3")) {
     return parseWeakCryptoConfig(keyword, _caret, get_ssl3_table);
   }
   if (!strcmp(keyword, "tls1")) {
     return parseWeakCryptoConfig(keyword, _caret, get_tls1_table);
   }
+  if (!strcmp(keyword, "tls1_1")) {
+    return parseWeakCryptoConfig(keyword, _caret, get_tls11_table);
+  }
+  if (!strcmp(keyword, "tls1_2")) {
+    return parseWeakCryptoConfig(keyword, _caret, get_tls12_table);
+  }
+  if (!strcmp(keyword, "tls1_3")) {
+    return parseWeakCryptoConfig(keyword, _caret, get_tls13_table);
+  }
 
   if (!strcmp(keyword, "rc4")) {
     return parseWeakCryptoConfig(keyword, _caret, get_rc4_table);
   }
 
   if (!strcmp(keyword, "failHandshake")) {
     return parseWeakCryptoConfig(keyword, _caret, get_failhandshake_table);
   }
@@ -1379,17 +1469,17 @@ int freeClientAuthHashItems(PLHashEntry*
   return HT_ENUMERATE_REMOVE;
 }
 
 int freeSSL3HashItems(PLHashEntry* he, int i, void* arg) {
   delete[](char*) he->key;
   return HT_ENUMERATE_REMOVE;
 }
 
-int freeTLS1HashItems(PLHashEntry* he, int i, void* arg) {
+int freeTLSHashItems(PLHashEntry* he, int i, void* arg) {
   delete[](char*) he->key;
   return HT_ENUMERATE_REMOVE;
 }
 
 int freeRC4HashItems(PLHashEntry* he, int i, void* arg) {
   delete[](char*) he->key;
   return HT_ENUMERATE_REMOVE;
 }
@@ -1531,26 +1621,35 @@ int main(int argc, char** argv) {
     PL_HashTableEnumerateEntries(server.host_cert_table, freeHostCertHashItems,
                                  nullptr);
     PL_HashTableEnumerateEntries(server.host_clientauth_table,
                                  freeClientAuthHashItems, nullptr);
     PL_HashTableEnumerateEntries(server.host_redir_table,
                                  freeHostRedirHashItems, nullptr);
     PL_HashTableEnumerateEntries(server.host_ssl3_table, freeSSL3HashItems,
                                  nullptr);
-    PL_HashTableEnumerateEntries(server.host_tls1_table, freeTLS1HashItems,
+    PL_HashTableEnumerateEntries(server.host_tls1_table, freeTLSHashItems,
+                                 nullptr);
+    PL_HashTableEnumerateEntries(server.host_tls11_table, freeTLSHashItems,
+                                 nullptr);
+    PL_HashTableEnumerateEntries(server.host_tls12_table, freeTLSHashItems,
+                                 nullptr);
+    PL_HashTableEnumerateEntries(server.host_tls13_table, freeTLSHashItems,
                                  nullptr);
     PL_HashTableEnumerateEntries(server.host_rc4_table, freeRC4HashItems,
                                  nullptr);
     PL_HashTableEnumerateEntries(server.host_failhandshake_table,
                                  freeRC4HashItems, nullptr);
     PL_HashTableDestroy(server.host_cert_table);
     PL_HashTableDestroy(server.host_clientauth_table);
     PL_HashTableDestroy(server.host_redir_table);
     PL_HashTableDestroy(server.host_ssl3_table);
     PL_HashTableDestroy(server.host_tls1_table);
+    PL_HashTableDestroy(server.host_tls11_table);
+    PL_HashTableDestroy(server.host_tls12_table);
+    PL_HashTableDestroy(server.host_tls13_table);
     PL_HashTableDestroy(server.host_rc4_table);
     PL_HashTableDestroy(server.host_failhandshake_table);
   }
 
   PR_Cleanup();
   return 0;
 }