Backed out changeset 928233ea49ee (bug 634697) for causing leaks. CLOSED TREE
authorDorel Luca <dluca@mozilla.com>
Wed, 15 Jul 2020 16:39:11 +0300
changeset 540522 840f993400695f8c67d44b35f5f7f4b2c4bcf5fd
parent 540521 324b5c008634f57345f7ce7c67a245264a6d4444
child 540523 da148d9c0ef61a986247e3792b00eefc4e17dc45
push id37603
push userccoroiu@mozilla.com
push dateWed, 15 Jul 2020 16:06:28 +0000
treeherdermozilla-central@840f99340069 [default view] [failures only]
perfherder[talos] [build metrics] [platform microbench] (compared to previous push)
bugs634697
milestone80.0a1
backs out928233ea49eeca3dddc25d4cdc59995b17f78092
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
Backed out changeset 928233ea49ee (bug 634697) for causing leaks. CLOSED TREE
build/pgo/certs/cert9.db
build/pgo/certs/key4.db
build/pgo/certs/mochitest.client
build/pgo/server-locations.txt
security/manager/locales/en-US/security/certificates/certManager.ftl
security/manager/pki/resources/content/certManager.js
security/manager/ssl/DataStorageList.h
security/manager/ssl/nsClientAuthRemember.cpp
security/manager/ssl/nsClientAuthRemember.h
security/manager/ssl/nsIClientAuthRememberService.idl
security/manager/ssl/nsNSSComponent.cpp
security/manager/ssl/nsNSSIOLayer.cpp
security/manager/ssl/tests/mochitest/browser/browser_clientAuthRememberService.js
security/manager/ssl/tests/mochitest/browser/browser_clientAuth_connection.js
toolkit/components/cleardata/ClearDataService.jsm
index 7011091aacc0f0b55288f6bf1de841eeb927c9be..2fb059f69e2bacef6d8e23a82141f9b9dce846fd
GIT binary patch
literal 229376
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
zp+fFwbd>-A0000000000000000000000000000000000000000000000000000000
z000000000000000000000000000000000000002+{{sbrHohDe<0$>>ApL7E{cER2
zFvknn(tmK?Ryx;4htLVnOQMov8EiWG!2Sh#YiXX90l}@M1eHx^WTr8>47#N>pQuZ4
z#`E}8K9d&4WV4y<#6T+DLYir=M9{~lC30v~GwB>tJ%S6Kp2eo7e!IMhG}l;#V2qb;
zz(_jJP@O=;^BAlI9y5{6pc_bM>tnM8>=ZU9gB?qw>PctoV(Uk%;^s;DrZPIxTx~6a
z9iGbKGq`LjI^l5mTGAX%EGJ%&=s|Y(L40ToE?+~MqmDHhS_dA3o6g{>N$09!%QJX1
zY8r#e=Tm7ZWEE+SvNpj1&q!yo(G8?B=uC7&O42MveFE}B<$H2CbOmX)Jhr7&4lRkv
zXYlxP(z&um1PY#+n#yFObzx=2(wRKz!5~PNkkKJHE3r8dg7{<xjUT|`_oJpVl+n)M
zn45zW-4-1XRf>v5DWbk2SCN*mQFvasML0{CEgUB7Dzp?5a_{6G622A23+-}Oi|&h#
zidKqBMFT`0B7NZ{;ZEUv;V5CSP%-ymZf))~Q5w2R0000000000000000000000000
z00000000000000000000000000000000000000000000000000000000000000000
z000000QhN!1P}a_(D|ng)l`>HOR1|=Uo*YIFI?`dBbJeqz0-g6blc}UD@CLpNjH-`
ztJXR>U>TIe1-tg$Cp5p#Gr~VD9cOzbPc6<~mVm?CwO7m*%e84Q*BZ;UYA@Fk%O$qA
zT?;JNyuGq!SgvV%WlgYL<MzrLVY!Cw<r-kQ`t9ZFVY#~P<?3L$+U@O?7M82oURez+
xSG~PlH7r-Py<8P6SGm1ou7u?(wpUgG%aw00R}RaSZ7-LA<;oZkJe1nX{eS#@)HnbD
index d454ed584a747e9c18237d7e75bc834ce92662db..80e69e2f5b691c4464d79613afe3624c3e0a4fdf
GIT binary patch
literal 294912
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
z00000000000000000000000000000000000000000090kMn_3St}ARPPr13m^I3(0
zmXeBIm&?1K0skmv!XjD1dcq3+6951J00000000000000000000000000000000000
z00000000000000000000000000000000000000000000000000000000002+KLiye
z89C*z1qCG~89hTnFBxULF<HEEf>->(|I^t3000000000000000000000000000000
z00000000000000000000000000000000000000000000000000000000000000000
z;J-N)%5Zv=yu2JrhKACSijq+b8|)nz<%5xli1P9Y2|{CoBV<Fd!NJ&IKUqu+Iw&*{
zBkLU!g!7?FHYZ2nhUK@Q=zr}=!%pF7|IZtA>=cIj@|-A+UpHvknJh!1f+O)mA)K(7
z{qn*np<nkiu=84m9KZ$!q7gC(V<&_U#w*GX5s8V2MBsN8K=J+BXbU@sJ;pmK92*&n
zFb?*^24gVc_$cx!D5cH3>@xU09q{|$??i~>pCvphB65F7c%*-<1b!H~U~~{h8xt+_
zYgid?w7fJ*l7?O~)iia5iJYFCQ^4CF9Uh2|L<j3d{vPCCzevh3Dx42FYM;C~O6>Qu
z2|8ecLPNsQ;jsuqOn4;L7we6V#31yeBK<>tWt8VeasK|=SpNC7{Ue;b2nzZ83*xg0
z5AnqYVh|=#SRafJ!a6h(8-zW8j>LupQ{az?G^vM<Az_}3GNFkqp*vv`{|Nv900000
z00000000000000000000000000000000000000000000000000000000000000000
z0000000000000000000000000_-}}vQkp&@5*>;4w!sDmV}tz+&^~OG;^dfUY;Ytd
zJP6~1MMq*N=_xtML;XU$(G>W7SpRJV2K)zQLLFJcOhOm_6951J000000000000000
z00000000000000000000000000000000000000000000000000000000000000000
z00000000000002+-v~FQ68TB<^DnuX7|U`42Cgz+&zsP;rS75p^}xZn2Az~V(S?Sq
z2{JqV$NZHmZb(sZQ7X}^_+4mhouOP`#_^EP9X~2MjAPo%gdeSlQ;RHNcl@n*=0n(n
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
V45aC(=u9y!=`cJpGBz~A?_ZQ?Bf<ax
index a7bb340e7c7e64b2dca15763780432dfa9cca233..c6c8b47aa1e09e400f22dc29a0be559a43fab2d3
GIT binary patch
literal 2448
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
DYYcXD
--- a/build/pgo/server-locations.txt
+++ b/build/pgo/server-locations.txt
@@ -112,17 +112,16 @@ https://sub1.test2.example.com:443     p
 https://sub2.test1.example.com:443     privileged
 https://sub2.test2.example.com:443     privileged
 https://nocert.example.com:443         privileged,nocert
 https://self-signed.example.com:443    privileged,cert=selfsigned
 https://untrusted.example.com:443      privileged,cert=untrusted
 https://expired.example.com:443        privileged,cert=expired
 https://requestclientcert.example.com:443         privileged,clientauth=request
 https://requireclientcert.example.com:443         privileged,clientauth=require
-https://requireclientcert-2.example.com:443         privileged,clientauth=require
 https://mismatch.expired.example.com:443	privileged,cert=expired
 https://mismatch.untrusted.example.com:443	privileged,cert=untrusted
 https://untrusted-expired.example.com:443	privileged,cert=untrustedandexpired
 https://mismatch.untrusted-expired.example.com:443	privileged,cert=untrustedandexpired
 https://supports-insecure.expired.example.com:443   privileged,cert=expired
 https://no-subject-alt-name.example.com:443   cert=noSubjectAltName
 
 # Used for secure contexts on ip addresses, see bug 1616675. Note that
--- a/security/manager/locales/en-US/security/certificates/certManager.ftl
+++ b/security/manager/locales/en-US/security/certificates/certManager.ftl
@@ -179,19 +179,16 @@ delete-email-cert-impact = If you delete a person’s e-mail certificate, you will no longer be able to send encrypted e-mail to that person.
 
 # Used for semi-uniquely representing a cert.
 #
 # Variables:
 #   $serialNumber : the serial number of the cert in AA:BB:CC hex format.
 cert-with-serial =
     .value = Certificate with serial number: { $serialNumber }
 
-# Used to indicate that the user chose not to send a client authentication certificate to a server that requested one in a TLS handshake.
-send-no-client-certificate = Send no client certificate
-
 ## Add Security Exception dialog
 add-exception-branded-warning = You are about to override how { -brand-short-name } identifies this site.
 add-exception-invalid-header = This site attempts to identify itself with invalid information.
 add-exception-domain-mismatch-short = Wrong Site
 add-exception-domain-mismatch-long = The certificate belongs to a different site, which could mean that someone is trying to impersonate this site.
 add-exception-expired-short = Outdated Information
 add-exception-expired-long = The certificate is not currently valid. It may have been stolen or lost, and could be used by someone to impersonate this site.
 add-exception-unverified-or-bad-signature-short = Unknown Identity
--- a/security/manager/pki/resources/content/certManager.js
+++ b/security/manager/pki/resources/content/certManager.js
@@ -44,32 +44,30 @@ var emailTreeView;
  */
 var userTreeView;
 
 var clientAuthRememberService;
 
 var richlist;
 
 var rememberedDecisionsRichList = {
-  async buildRichList() {
+  buildRichList() {
     let rememberedDecisions = clientAuthRememberService.getDecisions();
 
     let oldItems = richlist.querySelectorAll("richlistitem");
     for (let item of oldItems) {
       item.remove();
     }
 
     let frag = document.createDocumentFragment();
     for (let decision of rememberedDecisions) {
-      let richlistitem = await this._richBoxAddItem(decision);
+      let richlistitem = this._richBoxAddItem(decision);
       frag.appendChild(richlistitem);
     }
     richlist.appendChild(frag);
-
-    richlist.addEventListener("select", () => this.setButtonState());
   },
 
   _createItem(item) {
     let innerHbox = document.createXULElement("hbox");
     innerHbox.setAttribute("align", "center");
     innerHbox.setAttribute("flex", "1");
 
     let row = document.createXULElement("label");
@@ -78,91 +76,66 @@ var rememberedDecisionsRichList = {
     row.setAttribute("style", "margin-inline-start: 15px;");
     row.setAttribute("value", item);
     row.setAttribute("ordinal", "1");
     innerHbox.appendChild(row);
 
     return innerHbox;
   },
 
-  async _richBoxAddItem(item) {
+  _richBoxAddItem(item) {
     let richlistitem = document.createXULElement("richlistitem");
 
     richlistitem.setAttribute("entryKey", item.entryKey);
     richlistitem.setAttribute("dbKey", item.dbKey);
 
     let hbox = document.createXULElement("hbox");
     hbox.setAttribute("flex", "1");
     hbox.setAttribute("equalsize", "always");
 
+    let tmpCert = certdb.findCertByDBKey(item.dbKey);
+
     hbox.appendChild(this._createItem(item.asciiHost));
-    if (item.dbKey == "") {
-      let noCertSpecified = await document.l10n.formatValue(
-        "send-no-client-certificate"
-      );
-
-      hbox.appendChild(this._createItem(noCertSpecified));
 
-      hbox.appendChild(this._createItem(""));
-    } else {
-      let tmpCert = certdb.findCertByDBKey(item.dbKey);
+    hbox.appendChild(this._createItem(tmpCert.commonName));
 
-      hbox.appendChild(this._createItem(tmpCert.commonName));
-
-      hbox.appendChild(this._createItem(tmpCert.serialNumber));
-    }
+    hbox.appendChild(this._createItem(tmpCert.serialNumber));
 
     richlistitem.appendChild(hbox);
 
     return richlistitem;
   },
 
-  async deleteSelectedRichListItem() {
+  deleteSelectedRichListItem() {
     let selectedItem = richlist.selectedItem;
     let index = richlist.selectedIndex;
     if (index < 0) {
       return;
     }
 
     clientAuthRememberService.forgetRememberedDecision(
       selectedItem.attributes.entryKey.value
     );
 
-    await this.buildRichList();
-    this.setButtonState();
+    this.buildRichList();
   },
 
   viewSelectedRichListItem() {
     let selectedItem = richlist.selectedItem;
     let index = richlist.selectedIndex;
     if (index < 0) {
       return;
     }
 
-    if (selectedItem.attributes.dbKey.value != "") {
-      let cert = certdb.findCertByDBKey(selectedItem.attributes.dbKey.value);
-      viewCertHelper(window, cert);
-    }
-  },
-
-  setButtonState() {
-    let rememberedDeleteButton = document.getElementById(
-      "remembered_deleteButton"
-    );
-    let rememberedViewButton = document.getElementById("remembered_viewButton");
-
-    rememberedDeleteButton.disabled = richlist.selectedIndex < 0;
-    rememberedViewButton.disabled =
-      richlist.selectedItem == null
-        ? true
-        : richlist.selectedItem.attributes.dbKey.value == "";
+    let cert = certdb.findCertByDBKey(selectedItem.attributes.dbKey.value);
+    viewCertHelper(window, cert);
   },
 };
 
-async function LoadCerts() {
+function LoadCerts() {
   certdb = Cc["@mozilla.org/security/x509certdb;1"].getService(
     Ci.nsIX509CertDB
   );
   var certcache = certdb.getCerts();
 
   caTreeView = Cc["@mozilla.org/security/nsCertTree;1"].createInstance(
     Ci.nsICertTree
   );
@@ -188,19 +161,17 @@ async function LoadCerts() {
   document.getElementById("user-tree").view = userTreeView;
 
   clientAuthRememberService = Cc[
     "@mozilla.org/security/clientAuthRememberService;1"
   ].getService(Ci.nsIClientAuthRememberService);
 
   richlist = document.getElementById("rememberedList");
 
-  await rememberedDecisionsRichList.buildRichList();
-
-  rememberedDecisionsRichList.setButtonState();
+  rememberedDecisionsRichList.buildRichList();
 
   enableBackupAllButton();
 }
 
 function enableBackupAllButton() {
   let backupAllButton = document.getElementById("mine_backupAllButton");
   backupAllButton.disabled = userTreeView.rowCount < 1;
 }
--- a/security/manager/ssl/DataStorageList.h
+++ b/security/manager/ssl/DataStorageList.h
@@ -9,12 +9,11 @@
 // storage in the profile directory.
 //
 // Please note that it is crucial for performance reasons for the number of
 // these classes to remain low.  If you need to add to this list, you may
 // need to update the algorithm in DataStorage::SetCachedStorageEntries()
 // to something faster.
 
 DATA_STORAGE(AlternateServices)
-DATA_STORAGE(ClientAuthRememberList)
 DATA_STORAGE(SecurityPreloadState)
 DATA_STORAGE(SiteSecurityServiceState)
 DATA_STORAGE(TRRBlacklist)
--- a/security/manager/ssl/nsClientAuthRemember.cpp
+++ b/security/manager/ssl/nsClientAuthRemember.cpp
@@ -2,43 +2,38 @@
  *
  * This Source Code Form is subject to the terms of the Mozilla Public
  * License, v. 2.0. If a copy of the MPL was not distributed with this
  * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
 
 #include "nsClientAuthRemember.h"
 
 #include "mozilla/BasePrincipal.h"
-#include "mozilla/DataStorage.h"
 #include "mozilla/RefPtr.h"
 #include "nsCRT.h"
 #include "nsNSSCertHelper.h"
 #include "nsIObserverService.h"
 #include "nsNetUtil.h"
 #include "nsPromiseFlatString.h"
 #include "nsThreadUtils.h"
 #include "nsStringBuffer.h"
 #include "cert.h"
 #include "nspr.h"
 #include "pk11pub.h"
 #include "certdb.h"
 #include "sechash.h"
 #include "SharedSSLState.h"
 
-#include "nsJSUtils.h"
-
 using namespace mozilla;
 using namespace mozilla::psm;
 
-NS_IMPL_ISUPPORTS(nsClientAuthRememberService, nsIClientAuthRememberService)
+NS_IMPL_ISUPPORTS(nsClientAuthRememberService, nsIClientAuthRememberService,
+                  nsIObserver)
 NS_IMPL_ISUPPORTS(nsClientAuthRemember, nsIClientAuthRememberRecord)
 
-const nsCString nsClientAuthRemember::SentinelValue =
-    nsCString("no client certificate");
-
 NS_IMETHODIMP
 nsClientAuthRemember::GetAsciiHost(/*out*/ nsACString& aAsciiHost) {
   aAsciiHost = mAsciiHost;
   return NS_OK;
 }
 
 NS_IMETHODIMP
 nsClientAuthRemember::GetFingerprint(/*out*/ nsACString& aFingerprint) {
@@ -53,95 +48,104 @@ nsClientAuthRemember::GetDbKey(/*out*/ n
 }
 
 NS_IMETHODIMP
 nsClientAuthRemember::GetEntryKey(/*out*/ nsACString& aEntryKey) {
   aEntryKey = mEntryKey;
   return NS_OK;
 }
 
+nsClientAuthRememberService::nsClientAuthRememberService()
+    : monitor("nsClientAuthRememberService.monitor") {}
+
+nsClientAuthRememberService::~nsClientAuthRememberService() {
+  RemoveAllFromMemory();
+}
+
 nsresult nsClientAuthRememberService::Init() {
   if (!NS_IsMainThread()) {
     NS_ERROR("nsClientAuthRememberService::Init called off the main thread");
     return NS_ERROR_NOT_SAME_THREAD;
   }
 
-  mClientAuthRememberList =
-      mozilla::DataStorage::Get(DataStorageClass::ClientAuthRememberList);
-  nsresult rv = mClientAuthRememberList->Init(nullptr);
-
-  if (NS_WARN_IF(NS_FAILED(rv))) {
-    return rv;
+  nsCOMPtr<nsIObserverService> observerService =
+      mozilla::services::GetObserverService();
+  if (observerService) {
+    observerService->AddObserver(this, "profile-before-change", false);
+    observerService->AddObserver(this, "last-pb-context-exited", false);
   }
 
   return NS_OK;
 }
 
 NS_IMETHODIMP
 nsClientAuthRememberService::ForgetRememberedDecision(const nsACString& key) {
-  mClientAuthRememberList->Remove(PromiseFlatCString(key),
-                                  mozilla::DataStorage_Persistent);
+  {
+    ReentrantMonitorAutoEnter lock(monitor);
+    mSettingsTable.RemoveEntry(PromiseFlatCString(key).get());
+  }
 
   nsNSSComponent::ClearSSLExternalAndInternalSessionCacheNative();
   return NS_OK;
 }
 
 NS_IMETHODIMP
 nsClientAuthRememberService::GetDecisions(
     nsTArray<RefPtr<nsIClientAuthRememberRecord>>& results) {
-  nsTArray<mozilla::psm::DataStorageItem> decisions;
-  mClientAuthRememberList->GetAll(&decisions);
+  ReentrantMonitorAutoEnter lock(monitor);
+  for (auto iter = mSettingsTable.Iter(); !iter.Done(); iter.Next()) {
+    if (!nsClientAuthRememberService::IsPrivateBrowsingKey(
+            iter.Get()->mEntryKey)) {
+      results.AppendElement(iter.Get()->mSettings);
+    }
+  }
+
+  return NS_OK;
+}
 
-  for (const mozilla::psm::DataStorageItem& decision : decisions) {
-    if (decision.type() == DataStorageType::DataStorage_Persistent) {
-      RefPtr<nsIClientAuthRememberRecord> tmp =
-          new nsClientAuthRemember(decision.key(), decision.value());
+NS_IMETHODIMP
+nsClientAuthRememberService::Observe(nsISupports* aSubject, const char* aTopic,
+                                     const char16_t* aData) {
+  // check the topic
+  if (!nsCRT::strcmp(aTopic, "profile-before-change")) {
+    // The profile is about to change,
+    // or is going away because the application is shutting down.
 
-      results.AppendElement(tmp);
-    }
+    ReentrantMonitorAutoEnter lock(monitor);
+    RemoveAllFromMemory();
+  } else if (!nsCRT::strcmp(aTopic, "last-pb-context-exited")) {
+    ReentrantMonitorAutoEnter lock(monitor);
+    ClearPrivateDecisions();
   }
 
   return NS_OK;
 }
 
 NS_IMETHODIMP
 nsClientAuthRememberService::ClearRememberedDecisions() {
-  mClientAuthRememberList->Clear();
-  nsNSSComponent::ClearSSLExternalAndInternalSessionCacheNative();
+  ReentrantMonitorAutoEnter lock(monitor);
+  RemoveAllFromMemory();
   return NS_OK;
 }
 
-NS_IMETHODIMP
-nsClientAuthRememberService::DeleteDecisionsByHost(
-    const nsACString& aHostName, JS::Handle<JS::Value> aOriginAttributes,
-    JSContext* aCx) {
-  OriginAttributes attrs;
-  if (!aOriginAttributes.isObject() || !attrs.Init(aCx, aOriginAttributes)) {
-    return NS_ERROR_INVALID_ARG;
-  }
-  DataStorageType storageType = GetDataStorageType(attrs);
-
-  nsTArray<mozilla::psm::DataStorageItem> decisions;
-  mClientAuthRememberList->GetAll(&decisions);
-
-  for (const mozilla::psm::DataStorageItem& decision : decisions) {
-    if (decision.type() == storageType) {
-      RefPtr<nsIClientAuthRememberRecord> tmp =
-          new nsClientAuthRemember(decision.key(), decision.value());
-      nsAutoCString asciiHost;
-      tmp->GetAsciiHost(asciiHost);
-      if (asciiHost.Equals(aHostName)) {
-        mClientAuthRememberList->Remove(decision.key(), decision.type());
-      }
+nsresult nsClientAuthRememberService::ClearPrivateDecisions() {
+  ReentrantMonitorAutoEnter lock(monitor);
+  for (auto iter = mSettingsTable.Iter(); !iter.Done(); iter.Next()) {
+    if (nsClientAuthRememberService::IsPrivateBrowsingKey(
+            iter.Get()->mEntryKey)) {
+      iter.Remove();
     }
   }
-  nsNSSComponent::ClearSSLExternalAndInternalSessionCacheNative();
   return NS_OK;
 }
 
+void nsClientAuthRememberService::RemoveAllFromMemory() {
+  mSettingsTable.Clear();
+}
+
 NS_IMETHODIMP
 nsClientAuthRememberService::RememberDecision(
     const nsACString& aHostName, const OriginAttributes& aOriginAttributes,
     CERTCertificate* aServerCert, CERTCertificate* aClientCert) {
   // aClientCert == nullptr means: remember that user does not want to use a
   // cert
   NS_ENSURE_ARG_POINTER(aServerCert);
   if (aHostName.IsEmpty()) {
@@ -149,106 +153,101 @@ nsClientAuthRememberService::RememberDec
   }
 
   nsAutoCString fpStr;
   nsresult rv = GetCertFingerprintByOidTag(aServerCert, SEC_OID_SHA256, fpStr);
   if (NS_FAILED(rv)) {
     return rv;
   }
 
-  if (aClientCert) {
-    RefPtr<nsNSSCertificate> pipCert(new nsNSSCertificate(aClientCert));
-    nsAutoCString dbkey;
-    rv = pipCert->GetDbKey(dbkey);
-    if (NS_SUCCEEDED(rv)) {
-      AddEntryToList(aHostName, aOriginAttributes, fpStr, dbkey);
+  {
+    ReentrantMonitorAutoEnter lock(monitor);
+    if (aClientCert) {
+      RefPtr<nsNSSCertificate> pipCert(new nsNSSCertificate(aClientCert));
+      nsAutoCString dbkey;
+      rv = pipCert->GetDbKey(dbkey);
+      if (NS_SUCCEEDED(rv)) {
+        AddEntryToList(aHostName, aOriginAttributes, fpStr, dbkey);
+      }
+    } else {
+      nsCString empty;
+      AddEntryToList(aHostName, aOriginAttributes, fpStr, empty);
     }
-  } else {
-    AddEntryToList(aHostName, aOriginAttributes, fpStr,
-                   nsClientAuthRemember::SentinelValue);
   }
 
   return NS_OK;
 }
 
 NS_IMETHODIMP
 nsClientAuthRememberService::HasRememberedDecision(
     const nsACString& aHostName, const OriginAttributes& aOriginAttributes,
     CERTCertificate* aCert, nsACString& aCertDBKey, bool* aRetVal) {
   if (aHostName.IsEmpty()) return NS_ERROR_INVALID_ARG;
 
   NS_ENSURE_ARG_POINTER(aCert);
   NS_ENSURE_ARG_POINTER(aRetVal);
   *aRetVal = false;
-  aCertDBKey.Truncate();
 
   nsresult rv;
   nsAutoCString fpStr;
   rv = GetCertFingerprintByOidTag(aCert, SEC_OID_SHA256, fpStr);
   if (NS_FAILED(rv)) return rv;
 
   nsAutoCString entryKey;
   GetEntryKey(aHostName, aOriginAttributes, fpStr, entryKey);
-  DataStorageType storageType = GetDataStorageType(aOriginAttributes);
-
-  nsCString listEntry = mClientAuthRememberList->Get(entryKey, storageType);
-  if (listEntry.IsEmpty()) {
-    return NS_OK;
+  {
+    ReentrantMonitorAutoEnter lock(monitor);
+    nsClientAuthRememberEntry* entry = mSettingsTable.GetEntry(entryKey.get());
+    if (!entry) return NS_OK;
+    entry->mSettings->GetDbKey(aCertDBKey);
+    *aRetVal = true;
   }
-
-  if (!listEntry.Equals(nsClientAuthRemember::SentinelValue)) {
-    aCertDBKey = listEntry;
-  }
-  *aRetVal = true;
-
   return NS_OK;
 }
 
 nsresult nsClientAuthRememberService::AddEntryToList(
     const nsACString& aHostName, const OriginAttributes& aOriginAttributes,
     const nsACString& aFingerprint, const nsACString& aDBKey) {
   nsAutoCString entryKey;
   GetEntryKey(aHostName, aOriginAttributes, aFingerprint, entryKey);
-  DataStorageType storageType = GetDataStorageType(aOriginAttributes);
+
+  {
+    ReentrantMonitorAutoEnter lock(monitor);
+    nsClientAuthRememberEntry* entry = mSettingsTable.PutEntry(entryKey.get());
 
-  nsCString tmpDbKey(aDBKey);
-  nsresult rv = mClientAuthRememberList->Put(entryKey, tmpDbKey, storageType);
-  if (NS_FAILED(rv)) {
-    return rv;
+    if (!entry) {
+      NS_ERROR("can't insert a null entry!");
+      return NS_ERROR_OUT_OF_MEMORY;
+    }
+
+    entry->mEntryKey = entryKey;
+
+    entry->mSettings =
+        new nsClientAuthRemember(aHostName, aFingerprint, aDBKey, entryKey);
   }
 
   return NS_OK;
 }
 
 void nsClientAuthRememberService::GetEntryKey(
     const nsACString& aHostName, const OriginAttributes& aOriginAttributes,
     const nsACString& aFingerprint, nsACString& aEntryKey) {
   nsAutoCString hostCert(aHostName);
-  hostCert.Append(',');
-  hostCert.Append(aFingerprint);
-  hostCert.Append(',');
-
   nsAutoCString suffix;
   aOriginAttributes.CreateSuffix(suffix);
   hostCert.Append(suffix);
+  hostCert.Append(':');
+  hostCert.Append(aFingerprint);
 
   aEntryKey.Assign(hostCert);
 }
 
 bool nsClientAuthRememberService::IsPrivateBrowsingKey(
     const nsCString& entryKey) {
   const int32_t separator = entryKey.Find(":", false, 0, -1);
   nsCString suffix;
   if (separator >= 0) {
     entryKey.Left(suffix, separator);
   } else {
     suffix = entryKey;
   }
   return OriginAttributes::IsPrivateBrowsing(suffix);
 }
-
-DataStorageType nsClientAuthRememberService::GetDataStorageType(
-    const OriginAttributes& aOriginAttributes) {
-  if (aOriginAttributes.mPrivateBrowsingId > 0) {
-    return DataStorage_Private;
-  }
-  return DataStorage_Persistent;
-}
--- a/security/manager/ssl/nsClientAuthRemember.h
+++ b/security/manager/ssl/nsClientAuthRemember.h
@@ -5,17 +5,16 @@
  * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
 
 #ifndef __NSCLIENTAUTHREMEMBER_H__
 #define __NSCLIENTAUTHREMEMBER_H__
 
 #include <utility>
 
 #include "mozilla/Attributes.h"
-#include "mozilla/DataStorage.h"
 #include "mozilla/HashFunctions.h"
 #include "mozilla/ReentrantMonitor.h"
 #include "nsIClientAuthRememberService.h"
 #include "nsIObserver.h"
 #include "nsNSSCertificate.h"
 #include "nsString.h"
 #include "nsTHashtable.h"
 #include "nsWeakReference.h"
@@ -26,66 +25,103 @@ class OriginAttributes;
 
 using mozilla::OriginAttributes;
 
 class nsClientAuthRemember final : public nsIClientAuthRememberRecord {
  public:
   NS_DECL_THREADSAFE_ISUPPORTS
   NS_DECL_NSICLIENTAUTHREMEMBERRECORD
 
-  nsClientAuthRemember(const nsCString& aEntryKey, const nsCString& aDBKey) {
+  nsClientAuthRemember(const nsACString& aAsciiHost,
+                       const nsACString& aFingerprint, const nsACString& aDBKey,
+                       const nsACString& aEntryKey) {
+    mAsciiHost = aAsciiHost;
+    mFingerprint = aFingerprint;
+    mDBKey = aDBKey;
     mEntryKey = aEntryKey;
-    if (!aDBKey.Equals(nsClientAuthRemember::SentinelValue)) {
-      mDBKey = aDBKey;
-    }
-
-    nsTArray<nsCString*> fields = {&mAsciiHost, &mFingerprint};
-
-    auto fieldsIter = fields.begin();
-    auto splitter = aEntryKey.Split(',');
-    auto splitterIter = splitter.begin();
-    for (; fieldsIter != fields.end() && splitterIter != splitter.end();
-         ++fieldsIter, ++splitterIter) {
-      (*fieldsIter)->Assign(*splitterIter);
-    }
   }
 
   nsCString mAsciiHost;
   nsCString mFingerprint;
   nsCString mDBKey;
   nsCString mEntryKey;
-  static const nsCString SentinelValue;
 
  protected:
   ~nsClientAuthRemember() = default;
 };
 
-class nsClientAuthRememberService final : public nsIClientAuthRememberService {
+// hash entry class
+class nsClientAuthRememberEntry final : public PLDHashEntryHdr {
+ public:
+  // Hash methods
+  typedef const char* KeyType;
+  typedef const char* KeyTypePointer;
+
+  // do nothing with aHost - we require mHead to be set before we're live!
+  explicit nsClientAuthRememberEntry(KeyTypePointer aHostWithCertUTF8) {}
+
+  nsClientAuthRememberEntry(nsClientAuthRememberEntry&& aToMove)
+      : PLDHashEntryHdr(std::move(aToMove)),
+        mSettings(std::move(aToMove.mSettings)),
+        mEntryKey(std::move(aToMove.mEntryKey)) {}
+
+  ~nsClientAuthRememberEntry() = default;
+
+  KeyType GetKey() const { return EntryKeyPtr(); }
+
+  KeyTypePointer GetKeyPointer() const { return EntryKeyPtr(); }
+
+  bool KeyEquals(KeyTypePointer aKey) const {
+    return !strcmp(EntryKeyPtr(), aKey);
+  }
+
+  static KeyTypePointer KeyToPointer(KeyType aKey) { return aKey; }
+
+  static PLDHashNumber HashKey(KeyTypePointer aKey) {
+    return mozilla::HashString(aKey);
+  }
+
+  enum { ALLOW_MEMMOVE = false };
+
+  // get methods
+  inline const nsCString& GetEntryKey() const { return mEntryKey; }
+
+  inline KeyTypePointer EntryKeyPtr() const { return mEntryKey.get(); }
+
+  nsCOMPtr<nsIClientAuthRememberRecord> mSettings;
+  nsCString mEntryKey;
+};
+
+class nsClientAuthRememberService final : public nsIObserver,
+                                          public nsIClientAuthRememberService {
  public:
   NS_DECL_THREADSAFE_ISUPPORTS
+  NS_DECL_NSIOBSERVER
   NS_DECL_NSICLIENTAUTHREMEMBERSERVICE
 
-  nsClientAuthRememberService() = default;
+  nsClientAuthRememberService();
 
   nsresult Init();
 
   static void GetEntryKey(const nsACString& aHostName,
                           const OriginAttributes& aOriginAttributes,
                           const nsACString& aFingerprint,
                           /*out*/ nsACString& aEntryKey);
 
   static bool IsPrivateBrowsingKey(const nsCString& entryKey);
 
  protected:
-  ~nsClientAuthRememberService() = default;
+  ~nsClientAuthRememberService();
 
-  static mozilla::DataStorageType GetDataStorageType(
-      const OriginAttributes& aOriginAttributes);
+  mozilla::ReentrantMonitor monitor;
+  nsTHashtable<nsClientAuthRememberEntry> mSettingsTable;
 
-  RefPtr<mozilla::DataStorage> mClientAuthRememberList;
+  void RemoveAllFromMemory();
+
+  nsresult ClearPrivateDecisions();
 
   nsresult AddEntryToList(const nsACString& aHost,
                           const OriginAttributes& aOriginAttributes,
                           const nsACString& aServerFingerprint,
                           const nsACString& aDBKey);
 };
 
 #endif
--- a/security/manager/ssl/nsIClientAuthRememberService.idl
+++ b/security/manager/ssl/nsIClientAuthRememberService.idl
@@ -49,14 +49,9 @@ interface nsIClientAuthRememberService :
   [must_use, noscript]
   bool hasRememberedDecision(in ACString aHostName,
                              in const_OriginAttributesRef aOriginAttributes,
                              in CERTCertificatePtr aServerCert,
                              out ACString aCertDBKey);
 
   [must_use]
   void clearRememberedDecisions();
-
-  [implicit_jscontext]
-  void deleteDecisionsByHost(in ACString aHostName,
-                             in jsval aOriginAttributes);
-
 };
--- a/security/manager/ssl/nsNSSComponent.cpp
+++ b/security/manager/ssl/nsNSSComponent.cpp
@@ -2483,17 +2483,24 @@ nsresult nsNSSComponent::GetNewPrompter(
 
 nsresult nsNSSComponent::LogoutAuthenticatedPK11() {
   nsCOMPtr<nsICertOverrideService> icos =
       do_GetService("@mozilla.org/security/certoverride;1");
   if (icos) {
     icos->ClearValidityOverride("all:temporary-certificates"_ns, 0);
   }
 
-  nsNSSComponent::ClearSSLExternalAndInternalSessionCacheNative();
+  nsCOMPtr<nsIClientAuthRememberService> svc =
+      do_GetService(NS_CLIENTAUTHREMEMBERSERVICE_CONTRACTID);
+
+  if (svc) {
+    nsresult rv = svc->ClearRememberedDecisions();
+
+    Unused << NS_WARN_IF(NS_FAILED(rv));
+  }
 
   nsCOMPtr<nsIObserverService> os = mozilla::services::GetObserverService();
   if (os) {
     os->NotifyObservers(nullptr, "net:cancel-all-connections", nullptr);
   }
 
   return NS_OK;
 }
--- a/security/manager/ssl/nsNSSIOLayer.cpp
+++ b/security/manager/ssl/nsNSSIOLayer.cpp
@@ -2337,22 +2337,17 @@ void ClientAuthDataRunnable::RunOnTarget
     nsCString rememberedDBKey;
     bool found;
     nsresult rv =
         cars->HasRememberedDecision(hostname, mInfo.OriginAttributesRef(),
                                     mServerCert, rememberedDBKey, &found);
     if (NS_WARN_IF(NS_FAILED(rv))) {
       return;
     }
-    if (found) {
-      // An empty dbKey indicates that the user chose not to use a certificate
-      // and chose to remember this decision
-      if (rememberedDBKey.IsEmpty()) {
-        return;
-      }
+    if (found && !rememberedDBKey.IsEmpty()) {
       nsCOMPtr<nsIX509CertDB> certdb = do_GetService(NS_X509CERTDB_CONTRACTID);
       if (NS_WARN_IF(!certdb)) {
         return;
       }
       nsCOMPtr<nsIX509Cert> foundCert;
       nsresult rv =
           certdb->FindCertByDBKey(rememberedDBKey, getter_AddRefs(foundCert));
       if (NS_WARN_IF(NS_FAILED(rv))) {
--- a/security/manager/ssl/tests/mochitest/browser/browser_clientAuthRememberService.js
+++ b/security/manager/ssl/tests/mochitest/browser/browser_clientAuthRememberService.js
@@ -6,17 +6,16 @@
 /**
  * Test certificate (i.e. build/pgo/certs/mochitest.client).
  * @type nsIX509Cert
  */
 var cert;
 var cert2;
 var cert3;
 
-var sdr = Cc["@mozilla.org/security/sdr;1"].getService(Ci.nsISecretDecoderRing);
 var certDB = Cc["@mozilla.org/security/x509certdb;1"].getService(
   Ci.nsIX509CertDB
 );
 
 var deleted = false;
 
 const { MockRegistrar } = ChromeUtils.import(
   "resource://testing-common/MockRegistrar.jsm"
@@ -39,61 +38,16 @@ function findCertByCommonName(commonName
   for (let cert of certDB.getCerts()) {
     if (cert.commonName == commonName) {
       return cert;
     }
   }
   return null;
 }
 
-async function testHelper(connectURL, expectedURL) {
-  let win = await BrowserTestUtils.openNewBrowserWindow();
-
-  await SpecialPowers.pushPrefEnv({
-    set: [["security.default_personal_cert", "Ask Every Time"]],
-  });
-
-  await BrowserTestUtils.loadURI(win.gBrowser.selectedBrowser, connectURL);
-
-  await BrowserTestUtils.browserLoaded(
-    win.gBrowser.selectedBrowser,
-    false,
-    expectedURL,
-    true
-  );
-  let loadedURL = win.gBrowser.selectedBrowser.documentURI.spec;
-  Assert.ok(
-    loadedURL.startsWith(expectedURL),
-    `Expected and actual URLs should match (got '${loadedURL}', expected '${expectedURL}')`
-  );
-
-  await win.close();
-
-  // This clears the TLS session cache so we don't use a previously-established
-  // ticket to connect and bypass selecting a client auth certificate in
-  // subsequent tests.
-  sdr.logout();
-}
-
-async function openRequireClientCert() {
-  gClientAuthDialogs.chooseCertificateCalled = false;
-  await testHelper(
-    "https://requireclientcert.example.com:443",
-    "https://requireclientcert.example.com/"
-  );
-}
-
-async function openRequireClientCert2() {
-  gClientAuthDialogs.chooseCertificateCalled = false;
-  await testHelper(
-    "https://requireclientcert-2.example.com:443",
-    "https://requireclientcert-2.example.com/"
-  );
-}
-
 // Mock implementation of nsIClientAuthRememberService
 const gClientAuthRememberService = {
   forgetRememberedDecision(key) {
     deleted = true;
     Assert.equal(
       key,
       "exampleKey2",
       "Expected to get the same key that was passed in getDecisions()"
@@ -118,58 +72,33 @@ const gClientAuthRememberService = {
         entryKey: "exampleKey3",
       },
     ];
   },
 
   QueryInterface: ChromeUtils.generateQI(["nsIClientAuthRememberService"]),
 };
 
-const gClientAuthDialogs = {
-  _chooseCertificateCalled: false,
-
-  get chooseCertificateCalled() {
-    return this._chooseCertificateCalled;
-  },
-
-  set chooseCertificateCalled(value) {
-    this._chooseCertificateCalled = value;
-  },
-
-  chooseCertificate(
-    hostname,
-    port,
-    organization,
-    issuerOrg,
-    certList,
-    selectedIndex,
-    rememberClientAuthCertificate
-  ) {
-    rememberClientAuthCertificate.value = true;
-    this.chooseCertificateCalled = true;
-    selectedIndex.value = 0;
-    return true;
-  },
-
-  QueryInterface: ChromeUtils.generateQI([Ci.nsIClientAuthDialogs]),
-};
-
 add_task(async function testRememberedDecisionsUI() {
   cert = findCertByCommonName("Mochitest client");
   cert2 = await readCertificate("pgo-ca-all-usages.pem", ",,");
   cert3 = await readCertificate("client-cert-via-intermediate.pem", ",,");
   isnot(cert, null, "Should be able to find the test client cert");
   isnot(cert2, null, "Should be able to find pgo-ca-all-usages.pem");
   isnot(cert3, null, "Should be able to find client-cert-via-intermediate.pem");
 
   let clientAuthRememberServiceCID = MockRegistrar.register(
     "@mozilla.org/security/clientAuthRememberService;1",
     gClientAuthRememberService
   );
 
+  registerCleanupFunction(() => {
+    MockRegistrar.unregister(clientAuthRememberServiceCID);
+  });
+
   let win = await openCertmanager();
 
   let listItems = win.document
     .getElementById("rememberedList")
     .querySelectorAll("richlistitem");
 
   Assert.equal(
     listItems.length,
@@ -215,56 +144,9 @@ add_task(async function testRememberedDe
   win.document.getElementById("rememberedList").selectedIndex = 1;
 
   win.document.getElementById("remembered_deleteButton").click();
 
   Assert.ok(deleted, "Expected forgetRememberedDecision() to get called");
 
   win.document.getElementById("certmanager").acceptDialog();
   await BrowserTestUtils.windowClosed(win);
-
-  MockRegistrar.unregister(clientAuthRememberServiceCID);
 });
-
-add_task(async function testDeletingRememberedDecisions() {
-  let clientAuthDialogsCID = MockRegistrar.register(
-    "@mozilla.org/nsClientAuthDialogs;1",
-    gClientAuthDialogs
-  );
-  let cars = Cc["@mozilla.org/security/clientAuthRememberService;1"].getService(
-    Ci.nsIClientAuthRememberService
-  );
-
-  await openRequireClientCert();
-  Assert.ok(
-    gClientAuthDialogs.chooseCertificateCalled,
-    "chooseCertificate should have been called if visiting 'requireclientcert.example.com' for the first time"
-  );
-
-  await openRequireClientCert();
-  Assert.ok(
-    !gClientAuthDialogs.chooseCertificateCalled,
-    "chooseCertificate should not have been called if visiting 'requireclientcert.example.com' for the second time"
-  );
-
-  await openRequireClientCert2();
-  Assert.ok(
-    gClientAuthDialogs.chooseCertificateCalled,
-    "chooseCertificate should have been called if visiting'requireclientcert-2.example.com' for the first time"
-  );
-
-  let originAttributes = { privateBrowsingId: 0 };
-  cars.deleteDecisionsByHost("requireclientcert.example.com", originAttributes);
-
-  await openRequireClientCert();
-  Assert.ok(
-    gClientAuthDialogs.chooseCertificateCalled,
-    "chooseCertificate should have been called after removing all remembered decisions for 'requireclientcert.example.com'"
-  );
-
-  await openRequireClientCert2();
-  Assert.ok(
-    !gClientAuthDialogs.chooseCertificateCalled,
-    "chooseCertificate should not have been called if visiting 'requireclientcert-2.example.com' for the second time"
-  );
-
-  MockRegistrar.unregister(clientAuthDialogsCID);
-});
--- a/security/manager/ssl/tests/mochitest/browser/browser_clientAuth_connection.js
+++ b/security/manager/ssl/tests/mochitest/browser/browser_clientAuth_connection.js
@@ -16,19 +16,16 @@ const DialogState = {
   ASSERT_NOT_CALLED: "ASSERT_NOT_CALLED",
   // Return that the user selected the first given cert.
   RETURN_CERT_SELECTED: "RETURN_CERT_SELECTED",
   // Return that the user canceled.
   RETURN_CERT_NOT_SELECTED: "RETURN_CERT_NOT_SELECTED",
 };
 
 var sdr = Cc["@mozilla.org/security/sdr;1"].getService(Ci.nsISecretDecoderRing);
-let cars = Cc["@mozilla.org/security/clientAuthRememberService;1"].getService(
-  Ci.nsIClientAuthRememberService
-);
 
 var gExpectedClientCertificateChoices;
 
 // Mock implementation of nsIClientAuthDialogs.
 const gClientAuthDialogs = {
   _state: DialogState.ASSERT_NOT_CALLED,
   _rememberClientAuthCertificate: false,
   _chooseCertificateCalled: false,
@@ -158,27 +155,20 @@ add_task(async function setup() {
  * Test helper for the tests below.
  *
  * @param {String} prefValue
  *        Value to set the "security.default_personal_cert" pref to.
  * @param {String} expectedURL
  *        If the connection is expected to load successfully, the URL that
  *        should load. If the connection is expected to fail and result in an
  *        error page, |undefined|.
- * @param {Boolean} expectCallingChooseCertificate
- *        Determines whether we expect chooseCertificate to be called.
  * @param {Object} options
  *        Optional options object to pass on to the window that gets opened.
  */
-async function testHelper(
-  prefValue,
-  expectedURL,
-  expectCallingChooseCertificate,
-  options = undefined
-) {
+async function testHelper(prefValue, expectedURL, options = undefined) {
   gClientAuthDialogs.chooseCertificateCalled = false;
   await SpecialPowers.pushPrefEnv({
     set: [["security.default_personal_cert", prefValue]],
   });
 
   let win = await BrowserTestUtils.openNewBrowserWindow(options);
 
   await BrowserTestUtils.loadURI(
@@ -194,17 +184,17 @@ async function testHelper(
   );
   let loadedURL = win.gBrowser.selectedBrowser.documentURI.spec;
   Assert.ok(
     loadedURL.startsWith(expectedURL),
     `Expected and actual URLs should match (got '${loadedURL}', expected '${expectedURL}')`
   );
   Assert.equal(
     gClientAuthDialogs.chooseCertificateCalled,
-    expectCallingChooseCertificate,
+    prefValue == "Ask Every Time",
     "chooseCertificate should have been called if we were expecting it to be called"
   );
 
   await win.close();
 
   // This clears the TLS session cache so we don't use a previously-established
   // ticket to connect and bypass selecting a client auth certificate in
   // subsequent tests.
@@ -212,101 +202,64 @@ async function testHelper(
 }
 
 // Test that if a certificate is chosen automatically the connection succeeds,
 // and that nsIClientAuthDialogs.chooseCertificate() is never called.
 add_task(async function testCertChosenAutomatically() {
   gClientAuthDialogs.state = DialogState.ASSERT_NOT_CALLED;
   await testHelper(
     "Select Automatically",
-    "https://requireclientcert.example.com/",
-    false
+    "https://requireclientcert.example.com/"
   );
   // This clears all saved client auth certificate state so we don't influence
   // subsequent tests.
-  cars.clearRememberedDecisions();
+  sdr.logoutAndTeardown();
 });
 
 // Test that if the user doesn't choose a certificate, the connection fails and
 // an error page is displayed.
 add_task(async function testCertNotChosenByUser() {
   gClientAuthDialogs.state = DialogState.RETURN_CERT_NOT_SELECTED;
   await testHelper(
     "Ask Every Time",
-    "about:neterror?e=nssFailure2&u=https%3A//requireclientcert.example.com/",
-    true
+    "about:neterror?e=nssFailure2&u=https%3A//requireclientcert.example.com/"
   );
-  cars.clearRememberedDecisions();
+  sdr.logoutAndTeardown();
 });
 
 // Test that if the user chooses a certificate the connection suceeeds.
 add_task(async function testCertChosenByUser() {
   gClientAuthDialogs.state = DialogState.RETURN_CERT_SELECTED;
-  await testHelper(
-    "Ask Every Time",
-    "https://requireclientcert.example.com/",
-    true
-  );
-  cars.clearRememberedDecisions();
-});
-
-// Test that the cancel decision is remembered correctly
-add_task(async function testEmptyCertChosenByUser() {
-  gClientAuthDialogs.state = DialogState.RETURN_CERT_NOT_SELECTED;
-  gClientAuthDialogs.rememberClientAuthCertificate = true;
-  await testHelper(
-    "Ask Every Time",
-    "about:neterror?e=nssFailure2&u=https%3A//requireclientcert.example.com/",
-    true
-  );
-  await testHelper(
-    "Ask Every Time",
-    "about:neterror?e=nssFailure2&u=https%3A//requireclientcert.example.com/",
-    false
-  );
-  cars.clearRememberedDecisions();
+  await testHelper("Ask Every Time", "https://requireclientcert.example.com/");
+  sdr.logoutAndTeardown();
 });
 
 // Test that if the user chooses a certificate in a private browsing window,
 // configures Firefox to remember this certificate for the duration of the
 // session, closes that window (and thus all private windows), reopens a private
 // window, and visits that site again, they are re-asked for a certificate (i.e.
 // any state from the previous private session should be gone). Similarly, after
 // closing that private window, if the user opens a non-private window, they
 // again should be asked to choose a certificate (i.e. private state should not
 // be remembered/used in non-private contexts).
 add_task(async function testClearPrivateBrowsingState() {
   gClientAuthDialogs.rememberClientAuthCertificate = true;
   gClientAuthDialogs.state = DialogState.RETURN_CERT_SELECTED;
-  await testHelper(
-    "Ask Every Time",
-    "https://requireclientcert.example.com/",
-    true,
-    {
-      private: true,
-    }
-  );
-  await testHelper(
-    "Ask Every Time",
-    "https://requireclientcert.example.com/",
-    true,
-    {
-      private: true,
-    }
-  );
-  await testHelper(
-    "Ask Every Time",
-    "https://requireclientcert.example.com/",
-    true
-  );
-  // NB: we don't `cars.clearRememberedDecisions()` in between the two calls to
+  await testHelper("Ask Every Time", "https://requireclientcert.example.com/", {
+    private: true,
+  });
+  await testHelper("Ask Every Time", "https://requireclientcert.example.com/", {
+    private: true,
+  });
+  await testHelper("Ask Every Time", "https://requireclientcert.example.com/");
+  // NB: we don't `sdr.logoutAndTeardown()` in between the two calls to
   // `testHelper` because that would clear all client auth certificate state and
   // obscure what we're testing (that Firefox properly clears the relevant state
   // when the last private window closes).
-  cars.clearRememberedDecisions();
+  sdr.logoutAndTeardown();
 });
 
 // Test that 3rd party certificates are taken into account when filtering client
 // certificates based on the acceptible CA list sent by the server.
 add_task(async function testCertFilteringWithIntermediate() {
   let intermediateBytes = await OS.File.read(
     getTestFilePath("intermediate.pem")
   ).then(
@@ -324,19 +277,15 @@ add_task(async function testCertFilterin
     error => {
       throw error;
     }
   );
   let nssComponent = Cc["@mozilla.org/psm;1"].getService(Ci.nsINSSComponent);
   nssComponent.addEnterpriseIntermediate(intermediateBytes);
   gExpectedClientCertificateChoices = 4;
   gClientAuthDialogs.state = DialogState.RETURN_CERT_SELECTED;
-  await testHelper(
-    "Ask Every Time",
-    "https://requireclientcert.example.com/",
-    true
-  );
-  cars.clearRememberedDecisions();
+  await testHelper("Ask Every Time", "https://requireclientcert.example.com/");
+  sdr.logoutAndTeardown();
   // This will reset the added intermediate.
   await SpecialPowers.pushPrefEnv({
     set: [["security.enterprise_roots.enabled", true]],
   });
 });
--- a/toolkit/components/cleardata/ClearDataService.jsm
+++ b/toolkit/components/cleardata/ClearDataService.jsm
@@ -923,38 +923,29 @@ const SecuritySettingsCleaner = {
           sss.resetState(
             Ci.nsISiteSecurityService.HEADER_HSTS,
             uri,
             0,
             entry.originAttributes
           );
         }
       }
-      let cars = Cc[
-        "@mozilla.org/security/clientAuthRememberService;1"
-      ].getService(Ci.nsIClientAuthRememberService);
-
-      cars.deleteDecisionsByHost(aHost, aOriginAttributes);
 
       aResolve();
     });
   },
 
   deleteAll() {
     return new Promise(aResolve => {
       // Clear site security settings - no support for ranges in this
       // interface either, so we clearAll().
       let sss = Cc["@mozilla.org/ssservice;1"].getService(
         Ci.nsISiteSecurityService
       );
       sss.clearAll();
-      let cars = Cc[
-        "@mozilla.org/security/clientAuthRememberService;1"
-      ].getService(Ci.nsIClientAuthRememberService);
-      cars.clearRememberedDecisions();
       aResolve();
     });
   },
 };
 
 const EMECleaner = {
   deleteByHost(aHost, aOriginAttributes) {
     return new Promise(aResolve => {