Index: chrome/browser/chromeos/options/wifi_config_model.cc |
diff --git a/chrome/browser/chromeos/options/wifi_config_model.cc b/chrome/browser/chromeos/options/wifi_config_model.cc |
index 7125a625e183f4f1bbac8f0109b8f7458ac11953..9147d8cc05ed2b9c493545e6258fbe053edd0280 100644 |
--- a/chrome/browser/chromeos/options/wifi_config_model.cc |
+++ b/chrome/browser/chromeos/options/wifi_config_model.cc |
@@ -9,6 +9,7 @@ |
#include "base/utf_string_conversions.h" |
#include "chrome/browser/browser_process.h" // g_browser_process |
#include "chrome/common/net/x509_certificate_model.h" |
+#include "crypto/nss_util.h" // crypto::GetTPMTokenInfo() |
#include "net/base/cert_database.h" |
#include "net/base/x509_certificate.h" |
#include "ui/base/l10n/l10n_util_collator.h" // CompareString16WithCollator |
@@ -65,6 +66,18 @@ void WifiConfigModel::UpdateCertificates() { |
// so build filtered lists once. |
net::CertificateList cert_list; |
cert_db_.ListCerts(&cert_list); |
+ |
+ // Need TPM token name to filter user certificates. |
+ std::string tpm_token_name; |
+ if (crypto::IsTPMTokenReady()) { |
+ std::string unused_pin; |
+ // TODO(jamescook): Make this asynchronous. It results in a synchronous |
+ // D-Bus call to cryptohome. |
+ crypto::GetTPMTokenInfo(&tpm_token_name, &unused_pin); |
+ } else { |
+ LOG(WARNING) << "TPM token not ready"; |
+ } |
+ |
for (net::CertificateList::const_iterator it = cert_list.begin(); |
it != cert_list.end(); |
++it) { |
@@ -72,9 +85,15 @@ void WifiConfigModel::UpdateCertificates() { |
net::X509Certificate::OSCertHandle cert_handle = cert->os_cert_handle(); |
net::CertType type = x509_certificate_model::GetType(cert_handle); |
switch (type) { |
- case net::USER_CERT: |
- user_certs_.push_back(*it); |
+ case net::USER_CERT: { |
+ // Only include user certs that are in the TPM token (and hence |
+ // available via PKCS#11 to flimflam and wpa_supplicant). |
+ std::string cert_token_name = |
+ x509_certificate_model::GetTokenName(cert_handle); |
+ if (cert_token_name == tpm_token_name) |
+ user_certs_.push_back(*it); |
break; |
+ } |
case net::CA_CERT: { |
// Exclude root CA certificates that are built into Chrome. |
std::string token_name = |