summaryrefslogtreecommitdiffstats
path: root/crypto
diff options
context:
space:
mode:
authormattm@chromium.org <mattm@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2014-07-13 07:19:00 +0000
committermattm@chromium.org <mattm@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2014-07-13 07:19:00 +0000
commit49631886cb557424721d2d9c1a43c90b2ab99f04 (patch)
tree457d8704979a4491c4b3d3ec095281ea6edee06d /crypto
parentc493c5517381b5bf3a4563ffb63cb43c339bf98f (diff)
downloadchromium_src-49631886cb557424721d2d9c1a43c90b2ab99f04.zip
chromium_src-49631886cb557424721d2d9c1a43c90b2ab99f04.tar.gz
chromium_src-49631886cb557424721d2d9c1a43c90b2ab99f04.tar.bz2
Add GetSystemNSSKeySlot, merge GetPrivateNSSKeySlot/GetPublicNSSKeySlot to GetPersistentNSSKeySlot.
GetSystemNSSKeySlot returns the ChromeOS system-wide TPM slot. ChromeOS has separate slots for each user and linux doesn't have a public/private split, so GetPrivateNSSKeySlot no longer makes sense. BUG=210525 TBR=stevenjb@chromium.org Review URL: https://codereview.chromium.org/383593002 git-svn-id: svn://svn.chromium.org/chrome/trunk/src@282862 0039d316-1c4b-4281-b951-d872f2087c98
Diffstat (limited to 'crypto')
-rw-r--r--crypto/nss_util.cc67
-rw-r--r--crypto/nss_util.h20
-rw-r--r--crypto/nss_util_internal.h20
3 files changed, 52 insertions, 55 deletions
diff --git a/crypto/nss_util.cc b/crypto/nss_util.cc
index 1598ba9..ea4b59c 100644
--- a/crypto/nss_util.cc
+++ b/crypto/nss_util.cc
@@ -316,8 +316,9 @@ class NSSInitSingleton {
return tpm_token_enabled_for_nss_;
}
- void InitializeTPMToken(int token_slot_id,
- const base::Callback<void(bool)>& callback) {
+ void InitializeTPMTokenAndSystemSlot(
+ int system_slot_id,
+ const base::Callback<void(bool)>& callback) {
DCHECK(thread_checker_.CalledOnValidThread());
// Should not be called while there is already an initialization in
// progress.
@@ -345,9 +346,9 @@ class NSSInitSingleton {
if (base::WorkerPool::PostTaskAndReply(
FROM_HERE,
base::Bind(&NSSInitSingleton::InitializeTPMTokenOnWorkerThread,
- token_slot_id,
+ system_slot_id,
tpm_args_ptr),
- base::Bind(&NSSInitSingleton::OnInitializedTPMToken,
+ base::Bind(&NSSInitSingleton::OnInitializedTPMTokenAndSystemSlot,
base::Unretained(this), // NSSInitSingleton is leaky
callback,
base::Passed(&tpm_args)),
@@ -382,8 +383,9 @@ class NSSInitSingleton {
}
}
- void OnInitializedTPMToken(const base::Callback<void(bool)>& callback,
- scoped_ptr<TPMModuleAndSlot> tpm_args) {
+ void OnInitializedTPMTokenAndSystemSlot(
+ const base::Callback<void(bool)>& callback,
+ scoped_ptr<TPMModuleAndSlot> tpm_args) {
DCHECK(thread_checker_.CalledOnValidThread());
DVLOG(2) << "Loaded chaps: " << !!tpm_args->chaps_module
<< ", got tpm slot: " << !!tpm_args->tpm_slot;
@@ -624,7 +626,7 @@ class NSSInitSingleton {
ignore_result(g_test_nss_db_dir.Get().Delete());
}
- PK11SlotInfo* GetPublicNSSKeySlot() {
+ PK11SlotInfo* GetPersistentNSSKeySlot() {
// TODO(mattm): Change to DCHECK when callers have been fixed.
if (!thread_checker_.CalledOnValidThread()) {
DVLOG(1) << "Called on wrong thread.\n"
@@ -636,29 +638,24 @@ class NSSInitSingleton {
return PK11_GetInternalKeySlot();
}
- PK11SlotInfo* GetPrivateNSSKeySlot() {
- // TODO(mattm): Change to DCHECK when callers have been fixed.
- if (!thread_checker_.CalledOnValidThread()) {
- DVLOG(1) << "Called on wrong thread.\n"
- << base::debug::StackTrace().ToString();
- }
+#if defined(OS_CHROMEOS)
+ PK11SlotInfo* GetSystemNSSKeySlot() {
+ DCHECK(thread_checker_.CalledOnValidThread());
if (test_slot_)
return PK11_ReferenceSlot(test_slot_);
-#if defined(OS_CHROMEOS)
- if (tpm_token_enabled_for_nss_) {
- if (IsTPMTokenReady(base::Closure())) {
- return PK11_ReferenceSlot(tpm_slot_);
- } else {
- // If we were supposed to get the hardware token, but were
- // unable to, return NULL rather than fall back to sofware.
- return NULL;
- }
- }
-#endif
- return PK11_GetInternalKeySlot();
+ // TODO(mattm): chromeos::TPMTokenloader always calls
+ // InitializeTPMTokenAndSystemSlot with slot 0. If the system slot is
+ // disabled, tpm_slot_ will be the first user's slot instead. Can that be
+ // detected and return NULL instead?
+ if (tpm_token_enabled_for_nss_ && IsTPMTokenReady(base::Closure()))
+ return PK11_ReferenceSlot(tpm_slot_);
+ // If we were supposed to get the hardware token, but were
+ // unable to, return NULL rather than fall back to sofware.
+ return NULL;
}
+#endif
#if defined(USE_NSS)
base::Lock* write_lock() {
@@ -1069,6 +1066,10 @@ AutoSECMODListReadLock::~AutoSECMODListReadLock() {
#endif // defined(USE_NSS)
#if defined(OS_CHROMEOS)
+PK11SlotInfo* GetSystemNSSKeySlot() {
+ return g_nss_singleton.Get().GetSystemNSSKeySlot();
+}
+
void EnableTPMTokenForNSS() {
g_nss_singleton.Get().EnableTPMTokenForNSS();
}
@@ -1081,9 +1082,11 @@ bool IsTPMTokenReady(const base::Closure& callback) {
return g_nss_singleton.Get().IsTPMTokenReady(callback);
}
-void InitializeTPMToken(int token_slot_id,
- const base::Callback<void(bool)>& callback) {
- g_nss_singleton.Get().InitializeTPMToken(token_slot_id, callback);
+void InitializeTPMTokenAndSystemSlot(
+ int token_slot_id,
+ const base::Callback<void(bool)>& callback) {
+ g_nss_singleton.Get().InitializeTPMTokenAndSystemSlot(token_slot_id,
+ callback);
}
ScopedTestNSSChromeOSUser::ScopedTestNSSChromeOSUser(
@@ -1157,12 +1160,8 @@ PRTime BaseTimeToPRTime(base::Time time) {
return time.ToInternalValue() - base::Time::UnixEpoch().ToInternalValue();
}
-PK11SlotInfo* GetPublicNSSKeySlot() {
- return g_nss_singleton.Get().GetPublicNSSKeySlot();
-}
-
-PK11SlotInfo* GetPrivateNSSKeySlot() {
- return g_nss_singleton.Get().GetPrivateNSSKeySlot();
+PK11SlotInfo* GetPersistentNSSKeySlot() {
+ return g_nss_singleton.Get().GetPersistentNSSKeySlot();
}
} // namespace crypto
diff --git a/crypto/nss_util.h b/crypto/nss_util.h
index 4f8a1d6..0efdbc2 100644
--- a/crypto/nss_util.h
+++ b/crypto/nss_util.h
@@ -95,9 +95,9 @@ CRYPTO_EXPORT void LoadNSSLibraries();
bool CheckNSSVersion(const char* version);
#if defined(OS_CHROMEOS)
-// Indicates that NSS should load the Chaps library so that we
-// can access the TPM through NSS. Once this is called,
-// GetPrivateNSSKeySlot() will return the TPM slot if one was found.
+// Indicates that NSS should use the Chaps library so that we
+// can access the TPM through NSS. InitializeTPMTokenAndSystemSlot and
+// InitializeTPMForChromeOSUser must still be called to load the slots.
CRYPTO_EXPORT void EnableTPMTokenForNSS();
// Returns true if EnableTPMTokenForNSS has been called.
@@ -113,13 +113,13 @@ CRYPTO_EXPORT bool IsTPMTokenEnabledForNSS();
CRYPTO_EXPORT bool IsTPMTokenReady(const base::Closure& callback)
WARN_UNUSED_RESULT;
-// Initialize the TPM token. The |callback| will run on the same thread with
-// true if the token and slot were successfully loaded or were already
-// initialized. |callback| will be passed false if loading failed.
-// Once called, InitializeTPMToken must not be called again until the |callback|
-// has been run.
-CRYPTO_EXPORT void InitializeTPMToken(
- int token_slot_id,
+// Initialize the TPM token and system slot. The |callback| will run on the same
+// thread with true if the token and slot were successfully loaded or were
+// already initialized. |callback| will be passed false if loading failed. Once
+// called, InitializeTPMTokenAndSystemSlot must not be called again until the
+// |callback| has been run.
+CRYPTO_EXPORT void InitializeTPMTokenAndSystemSlot(
+ int system_slot_id,
const base::Callback<void(bool)>& callback);
// Exposed for unittests only.
diff --git a/crypto/nss_util_internal.h b/crypto/nss_util_internal.h
index 8175604..e9d4870 100644
--- a/crypto/nss_util_internal.h
+++ b/crypto/nss_util_internal.h
@@ -21,17 +21,11 @@ class FilePath;
namespace crypto {
-// Returns a reference to the default NSS key slot for storing
-// public-key data only (e.g. server certs). Caller must release
-// returned reference with PK11_FreeSlot.
-CRYPTO_EXPORT PK11SlotInfo* GetPublicNSSKeySlot() WARN_UNUSED_RESULT;
-
-// Returns a reference to the default slot for storing private-key and
-// mixed private-key/public-key data. Returns a hardware (TPM) NSS
-// key slot if on ChromeOS and EnableTPMForNSS() has been called
-// successfully. Caller must release returned reference with
-// PK11_FreeSlot.
-CRYPTO_EXPORT PK11SlotInfo* GetPrivateNSSKeySlot() WARN_UNUSED_RESULT;
+// Returns a reference to the default NSS key slot for storing persistent data.
+// Caller must release returned reference with PK11_FreeSlot.
+// TODO(mattm): this should be if !defined(OS_CHROMEOS), but some tests need to
+// be fixed first.
+CRYPTO_EXPORT PK11SlotInfo* GetPersistentNSSKeySlot() WARN_UNUSED_RESULT;
// A helper class that acquires the SECMOD list read lock while the
// AutoSECMODListReadLock is in scope.
@@ -46,6 +40,10 @@ class CRYPTO_EXPORT AutoSECMODListReadLock {
};
#if defined(OS_CHROMEOS)
+// Returns a reference to the system-wide TPM slot. Caller must release
+// returned reference with PK11_FreeSlot.
+CRYPTO_EXPORT PK11SlotInfo* GetSystemNSSKeySlot() WARN_UNUSED_RESULT;
+
// Prepare per-user NSS slot mapping. It is safe to call this function multiple
// times. Returns true if the user was added, or false if it already existed.
CRYPTO_EXPORT bool InitializeNSSForChromeOSUser(