Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(54)

Unified Diff: chrome/browser/chromeos/cros/cert_library.cc

Issue 8761016: Shaving parallel authenticator yak to remove unnecessary dependency on this class from OAuth spec... (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src/
Patch Set: '' Created 9 years, 1 month ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
Index: chrome/browser/chromeos/cros/cert_library.cc
===================================================================
--- chrome/browser/chromeos/cros/cert_library.cc (revision 112243)
+++ chrome/browser/chromeos/cros/cert_library.cc (working copy)
@@ -7,12 +7,19 @@
#include <algorithm>
#include "base/observer_list_threadsafe.h"
+#include "base/string_number_conversions.h"
+#include "base/string_util.h"
#include "base/utf_string_conversions.h"
#include "chrome/browser/browser_process.h" // g_browser_process
+#include "chrome/browser/chromeos/cros/cros_library.h"
+#include "chrome/browser/chromeos/cros/cryptohome_library.h"
#include "chrome/browser/chromeos/login/user_manager.h"
#include "chrome/common/net/x509_certificate_model.h"
#include "content/public/browser/browser_thread.h"
+#include "crypto/encryptor.h"
#include "crypto/nss_util.h"
+#include "crypto/sha2.h"
+#include "crypto/symmetric_key.h"
#include "grit/generated_resources.h"
#include "net/base/cert_database.h"
#include "ui/base/l10n/l10n_util.h"
@@ -31,6 +38,32 @@
// Delay between certificate requests while waiting for TPM/PKCS#11 init.
const int kRequestDelayMs = 500;
+const size_t kKeySize = 16;
+
+// Decrypts (AES) hex encoded encrypted token given |key| and |salt|.
+std::string DecryptTokenWithKey(
+ crypto::SymmetricKey* key,
+ const std::string& salt,
+ const std::string& encrypted_token_hex) {
+ std::vector<uint8> encrypted_token_bytes;
+ if (!base::HexStringToBytes(encrypted_token_hex, &encrypted_token_bytes))
+ return std::string();
+
+ std::string encrypted_token(
+ reinterpret_cast<char*>(encrypted_token_bytes.data()),
+ encrypted_token_bytes.size());
+ crypto::Encryptor encryptor;
+ if (!encryptor.Init(key, crypto::Encryptor::CTR, std::string()))
+ return std::string();
+
+ std::string nonce = salt.substr(0, kKeySize);
+ std::string token;
+ CHECK(encryptor.SetCounter(nonce));
+ if (!encryptor.Decrypt(encrypted_token, &token))
+ return std::string();
+ return token;
+}
+
string16 GetDisplayString(net::X509Certificate* cert, bool hardware_backed) {
std::string org;
if (!cert->subject().organization_names.empty())
@@ -106,6 +139,7 @@
if (!user_logged_in_) {
user_logged_in_ = true;
certificates_loaded_ = false;
+ supplemental_user_key_.reset(NULL);
}
VLOG(1) << "Requesting Certificates.";
@@ -179,10 +213,35 @@
return server_ca_certs_;
}
- virtual crypto::SymmetricKey* GetSupplementalUserKey() const {
- return crypto::GetSupplementalUserKey();
+ virtual std::string EncryptToken(const std::string& token) OVERRIDE {
+ if (!LoadSupplementalUserKey())
+ return std::string();
+ crypto::Encryptor encryptor;
+ if (!encryptor.Init(supplemental_user_key_.get(), crypto::Encryptor::CTR,
+ std::string()))
+ return std::string();
+ std::string salt =
+ CrosLibrary::Get()->GetCryptohomeLibrary()->GetSystemSalt();
+ std::string nonce = salt.substr(0, kKeySize);
+ std::string encoded_token;
+ CHECK(encryptor.SetCounter(nonce));
+ if (!encryptor.Encrypt(token, &encoded_token))
+ return std::string();
+
+ return StringToLowerASCII(base::HexEncode(
+ reinterpret_cast<const void*>(encoded_token.data()),
+ encoded_token.size()));
}
+ virtual std::string DecryptToken(
+ const std::string& encrypted_token_hex) OVERRIDE {
+ if (!LoadSupplementalUserKey())
+ return std::string();
+ return DecryptTokenWithKey(supplemental_user_key_.get(),
+ CrosLibrary::Get()->GetCryptohomeLibrary()->GetSystemSalt(),
+ encrypted_token_hex);
+ }
+
// net::CertDatabase::Observer implementation. Observer added on UI thread.
virtual void OnCertTrustChanged(const net::X509Certificate* cert) OVERRIDE {
DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
@@ -319,6 +378,19 @@
}
}
+ bool LoadSupplementalUserKey() {
+ if (!user_logged_in_) {
+ // If we are not logged in, we cannot load any certificates.
+ // Set 'loaded' to true for the UI, since we are not waiting on loading.
+ LOG(WARNING) << "Requesting supplemental use key before login.";
+ return false;
+ }
+ if (!supplemental_user_key_.get()) {
+ supplemental_user_key_.reset(crypto::GetSupplementalUserKey());
+ }
+ return supplemental_user_key_.get() != NULL;
+ }
+
// Observers.
const scoped_refptr<CertLibraryObserverList> observer_list_;
@@ -328,6 +400,9 @@
// Cached TPM token name.
std::string tpm_token_name_;
+ // Supplemental user key.
+ scoped_ptr<crypto::SymmetricKey> supplemental_user_key_;
+
// Local state.
bool user_logged_in_;
bool certificates_loaded_;

Powered by Google App Engine
This is Rietveld 408576698