diff options
author | zelidrag@chromium.org <zelidrag@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2011-12-03 00:57:01 +0000 |
---|---|---|
committer | zelidrag@chromium.org <zelidrag@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2011-12-03 00:57:01 +0000 |
commit | 8c5e41e48924619bc30e9bc3fefc8a7f9fdad90c (patch) | |
tree | 52c2e7d1a965dab49e0678b6be0b091e6f6739d7 /chrome/browser/chromeos/cros/cryptohome_library.cc | |
parent | 5b7cb5670cb2a1f9154c39e0dea8a104b2293aa8 (diff) | |
download | chromium_src-8c5e41e48924619bc30e9bc3fefc8a7f9fdad90c.zip chromium_src-8c5e41e48924619bc30e9bc3fefc8a7f9fdad90c.tar.gz chromium_src-8c5e41e48924619bc30e9bc3fefc8a7f9fdad90c.tar.bz2 |
Shaving parallel authenticator yak to remove unnecessary dependency on this class from OAuth specific code. Moved system salt and supplemental key related methods to cryptohome and cert libraries instead.
BUG=chromium-os:23301
TEST=none
Review URL: http://codereview.chromium.org/8761016
git-svn-id: svn://svn.chromium.org/chrome/trunk/src@112834 0039d316-1c4b-4281-b951-d872f2087c98
Diffstat (limited to 'chrome/browser/chromeos/cros/cryptohome_library.cc')
-rw-r--r-- | chrome/browser/chromeos/cros/cryptohome_library.cc | 88 |
1 files changed, 61 insertions, 27 deletions
diff --git a/chrome/browser/chromeos/cros/cryptohome_library.cc b/chrome/browser/chromeos/cros/cryptohome_library.cc index 4711dcf..a9183d5 100644 --- a/chrome/browser/chromeos/cros/cryptohome_library.cc +++ b/chrome/browser/chromeos/cros/cryptohome_library.cc @@ -8,14 +8,21 @@ #include "base/command_line.h" #include "base/hash_tables.h" #include "base/message_loop.h" +#include "base/string_number_conversions.h" +#include "base/string_util.h" #include "chrome/browser/chromeos/cros/cros_library.h" #include "chrome/common/chrome_switches.h" #include "content/public/browser/browser_thread.h" +#include "crypto/encryptor.h" +#include "crypto/sha2.h" using content::BrowserThread; namespace { - const char kStubSystemSalt[] = "stub_system_salt"; + +const char kStubSystemSalt[] = "stub_system_salt"; +const int kPassHashLen = 32; + } namespace chromeos { @@ -84,23 +91,6 @@ class CryptohomeLibraryImpl : public CryptohomeLibrary { return chromeos::CryptohomeIsMounted(); } - virtual CryptohomeBlob GetSystemSalt() OVERRIDE { - CryptohomeBlob system_salt; - char* salt_buf; - int salt_len; - bool result = chromeos::CryptohomeGetSystemSaltSafe(&salt_buf, &salt_len); - if (result) { - system_salt.resize(salt_len); - if ((int)system_salt.size() == salt_len) { - memcpy(&system_salt[0], static_cast<const void*>(salt_buf), - salt_len); - } else { - system_salt.clear(); - } - } - return system_salt; - } - virtual bool AsyncSetOwnerUser( const std::string& username, Delegate* d) OVERRIDE { return CacheCallback( @@ -184,7 +174,31 @@ class CryptohomeLibraryImpl : public CryptohomeLibrary { return chromeos::CryptohomePkcs11IsTpmTokenReady(); } + virtual std::string HashPassword(const std::string& password) OVERRIDE { + // Get salt, ascii encode, update sha with that, then update with ascii + // of password, then end. + std::string ascii_salt = GetSystemSalt(); + char passhash_buf[kPassHashLen]; + + // Hash salt and password + crypto::SHA256HashString(ascii_salt + password, + &passhash_buf, sizeof(passhash_buf)); + + return StringToLowerASCII(base::HexEncode( + reinterpret_cast<const void*>(passhash_buf), + sizeof(passhash_buf) / 2)); + } + + virtual std::string GetSystemSalt() OVERRIDE { + LoadSystemSalt(); // no-op if it's already loaded. + return StringToLowerASCII(base::HexEncode( + reinterpret_cast<const void*>(system_salt_.data()), + system_salt_.size())); + } + private: + typedef base::hash_map<int, Delegate*> CallbackMap; + static void Handler(const chromeos::CryptohomeAsyncCallStatus& event, void* cryptohome_library) { CryptohomeLibraryImpl* library = @@ -213,7 +227,25 @@ class CryptohomeLibraryImpl : public CryptohomeLibrary { return true; } - typedef base::hash_map<int, Delegate*> CallbackMap; + void LoadSystemSalt() { + if (!system_salt_.empty()) + return; + + char* salt_buf; + int salt_len; + bool result = chromeos::CryptohomeGetSystemSaltSafe(&salt_buf, &salt_len); + if (result) { + system_salt_.resize(salt_len); + if (static_cast<int>(system_salt_.size()) == salt_len) + memcpy(&system_salt_[0], static_cast<const void*>(salt_buf), salt_len); + else + system_salt_.clear(); + } + CHECK(!system_salt_.empty()); + CHECK_EQ(system_salt_.size() % 2, 0U); + } + + chromeos::CryptohomeBlob system_salt_; mutable CallbackMap callback_map_; void* cryptohome_connection_; @@ -277,14 +309,6 @@ class CryptohomeLibraryStubImpl : public CryptohomeLibrary { return true; } - virtual CryptohomeBlob GetSystemSalt() OVERRIDE { - CryptohomeBlob salt = CryptohomeBlob(); - for (size_t i = 0; i < strlen(kStubSystemSalt); i++) - salt.push_back(static_cast<unsigned char>(kStubSystemSalt[i])); - - return salt; - } - virtual bool AsyncSetOwnerUser( const std::string& username, Delegate* callback) OVERRIDE { BrowserThread::PostTask( @@ -360,6 +384,16 @@ class CryptohomeLibraryStubImpl : public CryptohomeLibrary { virtual bool Pkcs11IsTpmTokenReady() OVERRIDE { return true; } + virtual std::string HashPassword(const std::string& password) OVERRIDE { + return StringToLowerASCII(base::HexEncode( + reinterpret_cast<const void*>(password.data()), + password.length())); + } + + virtual std::string GetSystemSalt() OVERRIDE { + return kStubSystemSalt; + } + private: static void DoStubCallback(Delegate* callback) { if (callback) |