summaryrefslogtreecommitdiffstats
path: root/crypto/nss_util.cc
diff options
context:
space:
mode:
authorgspencer@chromium.org <gspencer@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2012-04-03 21:58:07 +0000
committergspencer@chromium.org <gspencer@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2012-04-03 21:58:07 +0000
commitb2afd2518cbec88a31f484465b363dadc7d2555a (patch)
treeb517e6caf4dae0844d796071e09d3f704b8a75d5 /crypto/nss_util.cc
parent8e7c85a49bc4824f8078e980960c98655573a0c1 (diff)
downloadchromium_src-b2afd2518cbec88a31f484465b363dadc7d2555a.zip
chromium_src-b2afd2518cbec88a31f484465b363dadc7d2555a.tar.gz
chromium_src-b2afd2518cbec88a31f484465b363dadc7d2555a.tar.bz2
Forces TPM slot to be "Friendly", allowing NSS to avoid locking
Also added VLOG(1) logging for PKCS11 slot info. BUG=chromium:118206 TEST=Ran on device, tried to repro bug, and was unable to. Confirmed that friendly bit was set (based on log output). Review URL: https://chromiumcodereview.appspot.com/9969019 git-svn-id: svn://svn.chromium.org/chrome/trunk/src@130474 0039d316-1c4b-4281-b951-d872f2087c98
Diffstat (limited to 'crypto/nss_util.cc')
-rw-r--r--crypto/nss_util.cc51
1 files changed, 48 insertions, 3 deletions
diff --git a/crypto/nss_util.cc b/crypto/nss_util.cc
index 48f356c..43912c2 100644
--- a/crypto/nss_util.cc
+++ b/crypto/nss_util.cc
@@ -196,6 +196,32 @@ PK11SlotInfo* FindSlotWithTokenName(const std::string& token_name) {
#endif // defined(USE_NSS)
+#if defined(OS_CHROMEOS)
+void LogSlotInfo() {
+ AutoSECMODListReadLock auto_lock;
+ SECMODModuleList* head = SECMOD_GetDefaultModuleList();
+ VLOG(1) << "Current PK11 Slot Status:";
+ for (SECMODModuleList* item = head; item != NULL; item = item->next) {
+ int slot_count = item->module->loaded ? item->module->slotCount : 0;
+ for (int i = 0; i < slot_count; i++) {
+ PK11SlotInfo* slot = item->module->slots[i];
+ if (slot) {
+ VLOG(1) << " ###############################";
+ VLOG(1) << " Token Name : " << PK11_GetTokenName(slot);
+ VLOG(1) << " Slot Name : " << PK11_GetSlotName(slot);
+ VLOG(1) << " Slot ID : " << PK11_GetSlotID(slot);
+ VLOG(1) << " Is Friendly : "
+ << (PK11_IsFriendly(slot) ? "True" : "False");
+ VLOG(1) << " Default Flags: " << PK11_GetDefaultFlags(slot);
+ VLOG(1) << " Need Login : "
+ << (PK11_NeedLogin(slot) ? "Yes" : "No");
+ VLOG(1) << " Is Hardware :" << (PK11_IsHW(slot) ? "Yes" : "No");
+ }
+ }
+ }
+}
+#endif
+
// A singleton to initialize/deinitialize NSPR.
// Separate from the NSS singleton because we initialize NSPR on the UI thread.
// Now that we're leaking the singleton, we could merge back with the NSS
@@ -545,18 +571,38 @@ class NSSInitSingleton {
// time, or after a timeout).
"trustOrder=100 slotParams=(1={slotFlags=[RSA] askpw=only})");
}
- if (chaps_module_) {
+ if (chaps_module_ && chaps_module_->loaded) {
+ int size = 0;
+ PK11DefaultArrayEntry* entries = PK11_GetDefaultArray(&size);
+ PK11DefaultArrayEntry* friendly_entry = NULL;
+ for (int i = 0; i < size; ++i) {
+ if (entries[i].flag == SECMOD_FRIENDLY_FLAG) {
+ friendly_entry = &entries[i];
+ break;
+ }
+ }
+
// If this gets set, then we'll use the TPM for certs with
// private keys, otherwise we'll fall back to the software
// implementation.
tpm_slot_ = GetTPMSlot();
+
+ // Force the TPM slot to be "Friendly", since it seems to ignore setting
+ // "PublicCerts" above, and otherwise NSS does some unnecessary locking,
+ // and slows things down.
+ if (tpm_slot_ && friendly_entry)
+ PK11_UpdateSlotAttribute(tpm_slot_, friendly_entry, PR_TRUE);
+
+ if (VLOG_IS_ON(1))
+ LogSlotInfo();
+
callback.Run(tpm_slot_ != NULL);
return;
}
}
callback.Run(false);
}
-#endif
+#endif // defined(OS_CHROMEOS)
#if defined(USE_NSS)
// Load nss's built-in root certs.
@@ -637,7 +683,6 @@ bool NSSInitSingleton::force_nodb_init_ = false;
base::LazyInstance<NSSInitSingleton>::Leaky
g_nss_singleton = LAZY_INSTANCE_INITIALIZER;
-
} // namespace
#if defined(USE_NSS)