fake_cryptohome_client.cc revision 010d83a9304c5a91596085d917d248abff47903a
14e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)// Copyright 2013 The Chromium Authors. All rights reserved. 2c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be 3c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)// found in the LICENSE file. 4c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 5c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "chromeos/dbus/fake_cryptohome_client.h" 6c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 7c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "base/bind.h" 8010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)#include "base/file_util.h" 94e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)#include "base/location.h" 109ab5563a3196760eb381d102cbb2bc0f7abc6a50Ben Murdoch#include "base/message_loop/message_loop.h" 11010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)#include "base/path_service.h" 12010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)#include "base/threading/worker_pool.h" 13010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)#include "chromeos/chromeos_paths.h" 14a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)#include "chromeos/dbus/cryptohome/key.pb.h" 15a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)#include "chromeos/dbus/cryptohome/rpc.pb.h" 164e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)#include "crypto/nss_util.h" 17b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)#include "third_party/cros_system_api/dbus/service_constants.h" 18010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)#include "third_party/protobuf/src/google/protobuf/io/coded_stream.h" 19010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)#include "third_party/protobuf/src/google/protobuf/io/zero_copy_stream.h" 20010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)#include "third_party/protobuf/src/google/protobuf/io/zero_copy_stream_impl_lite.h" 21010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) 22010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)namespace { 23010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) 24010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)// Helper to asynchronously write a file in the WorkerPool. 25010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)void PersistFile(const base::FilePath& path, const std::string& content) { 26010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) base::WriteFile(path, content.data(), content.size()); 27010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)} 28010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) 29010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)} // namespace 30c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 31c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)namespace chromeos { 32c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 334e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)FakeCryptohomeClient::FakeCryptohomeClient() 348bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) : service_is_available_(true), 358bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) async_call_id_(1), 364e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) tpm_is_ready_counter_(0), 374e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) unmount_result_(true), 381e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) system_salt_(GetStubSystemSalt()), 39010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) weak_ptr_factory_(this) { 40010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) base::FilePath cache_path; 41010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) locked_ = PathService::Get(chromeos::FILE_INSTALL_ATTRIBUTES, &cache_path) && 42010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) base::PathExists(cache_path); 43010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)} 44c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 454e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)FakeCryptohomeClient::~FakeCryptohomeClient() {} 46c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 474e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)void FakeCryptohomeClient::Init(dbus::Bus* bus) { 48c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)} 49c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 504e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)void FakeCryptohomeClient::SetAsyncCallStatusHandlers( 514e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) const AsyncCallStatusHandler& handler, 524e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) const AsyncCallStatusWithDataHandler& data_handler) { 534e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) async_call_status_handler_ = handler; 544e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) async_call_status_data_handler_ = data_handler; 55c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)} 56c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 574e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)void FakeCryptohomeClient::ResetAsyncCallStatusHandlers() { 584e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) async_call_status_handler_.Reset(); 594e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) async_call_status_data_handler_.Reset(); 60424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)} 61424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) 628bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)void FakeCryptohomeClient::WaitForServiceToBeAvailable( 638bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) const WaitForServiceToBeAvailableCallback& callback) { 648bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) if (service_is_available_) { 658bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) base::MessageLoop::current()->PostTask(FROM_HERE, 668bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) base::Bind(callback, true)); 678bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) } else { 688bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) pending_wait_for_service_to_be_available_callbacks_.push_back(callback); 698bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) } 708bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)} 718bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) 724e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)void FakeCryptohomeClient::IsMounted( 73c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) const BoolDBusMethodCallback& callback) { 744e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) base::MessageLoop::current()->PostTask( 754e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) FROM_HERE, base::Bind(callback, DBUS_METHOD_CALL_SUCCESS, true)); 76c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)} 77c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 78c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)bool FakeCryptohomeClient::Unmount(bool* success) { 79b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) *success = unmount_result_; 80b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) return true; 81c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)} 82c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 834e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)void FakeCryptohomeClient::AsyncCheckKey( 844e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) const std::string& username, 854e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) const std::string& key, 864e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) const AsyncMethodCallback& callback) { 874e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) ReturnAsyncMethodResult(callback, false); 88c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)} 89c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 904e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)void FakeCryptohomeClient::AsyncMigrateKey( 914e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) const std::string& username, 924e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) const std::string& from_key, 934e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) const std::string& to_key, 94c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) const AsyncMethodCallback& callback) { 954e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) ReturnAsyncMethodResult(callback, false); 96c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)} 97c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 984e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)void FakeCryptohomeClient::AsyncRemove( 994e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) const std::string& username, 1004e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) const AsyncMethodCallback& callback) { 1014e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) ReturnAsyncMethodResult(callback, false); 102c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)} 103c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 1041e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)void FakeCryptohomeClient::GetSystemSalt( 1051e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) const GetSystemSaltCallback& callback) { 1061e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) base::MessageLoop::current()->PostTask( 1071e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) FROM_HERE, 1081e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) base::Bind(callback, DBUS_METHOD_CALL_SUCCESS, system_salt_)); 109c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)} 110c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 1114e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)void FakeCryptohomeClient::GetSanitizedUsername( 112c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) const std::string& username, 1134e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) const StringDBusMethodCallback& callback) { 1144e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) // Even for stub implementation we have to return different values so that 1154e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) // multi-profiles would work. 1164e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) std::string sanitized_username = GetStubSanitizedUsername(username); 1174e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) base::MessageLoop::current()->PostTask( 1184e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) FROM_HERE, 1194e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) base::Bind(callback, DBUS_METHOD_CALL_SUCCESS, sanitized_username)); 120c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)} 121c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 1224e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)std::string FakeCryptohomeClient::BlockingGetSanitizedUsername( 1234e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) const std::string& username) { 1244e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) return GetStubSanitizedUsername(username); 125c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)} 126c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 1274e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)void FakeCryptohomeClient::AsyncMount(const std::string& username, 1284e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) const std::string& key, 1294e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) int flags, 1304e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) const AsyncMethodCallback& callback) { 1314e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) ReturnAsyncMethodResult(callback, false); 132c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)} 133c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 1344e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)void FakeCryptohomeClient::AsyncAddKey( 1354e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) const std::string& username, 1364e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) const std::string& key, 1374e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) const std::string& new_key, 1384e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) const AsyncMethodCallback& callback) { 1394e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) ReturnAsyncMethodResult(callback, false); 140c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)} 141c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 142c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)void FakeCryptohomeClient::AsyncMountGuest( 143c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) const AsyncMethodCallback& callback) { 1444e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) ReturnAsyncMethodResult(callback, false); 145c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)} 146c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 147a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)void FakeCryptohomeClient::AsyncMountPublic( 148a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) const std::string& public_mount_id, 149a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) int flags, 150a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) const AsyncMethodCallback& callback) { 1514e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) ReturnAsyncMethodResult(callback, false); 152a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)} 153a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) 1544e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)void FakeCryptohomeClient::TpmIsReady( 1554e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) const BoolDBusMethodCallback& callback) { 1564e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) base::MessageLoop::current()->PostTask( 1574e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) FROM_HERE, base::Bind(callback, DBUS_METHOD_CALL_SUCCESS, true)); 158c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)} 159c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 1604e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)void FakeCryptohomeClient::TpmIsEnabled( 161c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) const BoolDBusMethodCallback& callback) { 1624e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) base::MessageLoop::current()->PostTask( 1634e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) FROM_HERE, base::Bind(callback, DBUS_METHOD_CALL_SUCCESS, true)); 164c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)} 165c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 1664e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)bool FakeCryptohomeClient::CallTpmIsEnabledAndBlock(bool* enabled) { 1674e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) *enabled = true; 1684e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) return true; 1694e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)} 1704e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 1714e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)void FakeCryptohomeClient::TpmGetPassword( 1724e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) const StringDBusMethodCallback& callback) { 1734e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) const char kStubTpmPassword[] = "Stub-TPM-password"; 1744e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) base::MessageLoop::current()->PostTask( 1754e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) FROM_HERE, 1764e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) base::Bind(callback, DBUS_METHOD_CALL_SUCCESS, 1774e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) std::string(kStubTpmPassword))); 1784e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)} 1794e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 1804e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)void FakeCryptohomeClient::TpmIsOwned( 1814e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) const BoolDBusMethodCallback& callback) { 1824e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) base::MessageLoop::current()->PostTask( 1834e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) FROM_HERE, base::Bind(callback, DBUS_METHOD_CALL_SUCCESS, true)); 1844e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)} 1854e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 1864e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)bool FakeCryptohomeClient::CallTpmIsOwnedAndBlock(bool* owned) { 1874e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) *owned = true; 1884e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) return true; 1894e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)} 1904e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 1914e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)void FakeCryptohomeClient::TpmIsBeingOwned( 1924e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) const BoolDBusMethodCallback& callback) { 1934e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) base::MessageLoop::current()->PostTask( 1944e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) FROM_HERE, base::Bind(callback, DBUS_METHOD_CALL_SUCCESS, true)); 1954e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)} 1964e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 1974e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)bool FakeCryptohomeClient::CallTpmIsBeingOwnedAndBlock(bool* owning) { 1984e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) *owning = true; 1994e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) return true; 200c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)} 201c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 202c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)void FakeCryptohomeClient::TpmCanAttemptOwnership( 203c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) const VoidDBusMethodCallback& callback) { 2044e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) base::MessageLoop::current()->PostTask( 2054e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) FROM_HERE, base::Bind(callback, DBUS_METHOD_CALL_SUCCESS)); 206c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)} 207c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 2084e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)void FakeCryptohomeClient::TpmClearStoredPassword( 2094e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) const VoidDBusMethodCallback& callback) { 2104e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) base::MessageLoop::current()->PostTask( 2114e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) FROM_HERE, base::Bind(callback, DBUS_METHOD_CALL_SUCCESS)); 2124e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)} 2134e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 2144e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)bool FakeCryptohomeClient::CallTpmClearStoredPasswordAndBlock() { 215c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) return true; 216c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)} 217c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 2184e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)void FakeCryptohomeClient::Pkcs11IsTpmTokenReady( 2194e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) const BoolDBusMethodCallback& callback) { 2204e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) base::MessageLoop::current()->PostTask( 2214e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) FROM_HERE, base::Bind(callback, DBUS_METHOD_CALL_SUCCESS, true)); 222c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)} 223c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 2244e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)void FakeCryptohomeClient::Pkcs11GetTpmTokenInfo( 2254e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) const Pkcs11GetTpmTokenInfoCallback& callback) { 2264e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) const char kStubUserPin[] = "012345"; 2274e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) const int kStubSlot = 0; 2284e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) base::MessageLoop::current()->PostTask( 2294e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) FROM_HERE, 2304e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) base::Bind(callback, 2314e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) DBUS_METHOD_CALL_SUCCESS, 2324e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) std::string(crypto::kTestTPMTokenName), 2334e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) std::string(kStubUserPin), 2344e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) kStubSlot)); 235c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)} 236c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 2374e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)void FakeCryptohomeClient::Pkcs11GetTpmTokenInfoForUser( 2384e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) const std::string& username, 2394e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) const Pkcs11GetTpmTokenInfoCallback& callback) { 2404e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) Pkcs11GetTpmTokenInfo(callback); 241c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)} 242c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 2434e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)bool FakeCryptohomeClient::InstallAttributesGet(const std::string& name, 2444e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) std::vector<uint8>* value, 2454e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) bool* successful) { 2464e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) if (install_attrs_.find(name) != install_attrs_.end()) { 2474e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) *value = install_attrs_[name]; 2484e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) *successful = true; 2494e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) } else { 2504e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) value->clear(); 2514e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) *successful = false; 2524e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) } 2534e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) return true; 254c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)} 255c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 256c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)bool FakeCryptohomeClient::InstallAttributesSet( 257c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) const std::string& name, 258c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) const std::vector<uint8>& value, 259c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) bool* successful) { 2604e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) install_attrs_[name] = value; 2614e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) *successful = true; 2624e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) return true; 263c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)} 264c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 2654e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)bool FakeCryptohomeClient::InstallAttributesFinalize(bool* successful) { 2664e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) locked_ = true; 2674e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) *successful = true; 268010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) 269010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) // Persist the install attributes so that they can be reloaded if the 270010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) // browser is restarted. This is used for ease of development when device 271010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) // enrollment is required. 272010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) // The cryptohome::SerializedInstallAttributes protobuf lives in 273010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) // chrome/browser/chromeos, so it can't be used directly here; use the 274010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) // low-level protobuf API instead to just write the name-value pairs. 275010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) // The cache file is read by EnterpriseInstallAttributes::ReadCacheFile. 276010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) base::FilePath cache_path; 277010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) if (!PathService::Get(chromeos::FILE_INSTALL_ATTRIBUTES, &cache_path)) 278010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) return false; 279010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) 280010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) std::string result; 281010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) { 282010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) // |result| can be used only after the StringOutputStream goes out of 283010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) // scope. 284010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) google::protobuf::io::StringOutputStream result_stream(&result); 285010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) google::protobuf::io::CodedOutputStream result_output(&result_stream); 286010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) 287010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) // These tags encode a variable-length value on the wire, which can be 288010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) // used to encode strings, bytes and messages. We only needs constants 289010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) // for tag numbers 1 and 2 (see install_attributes.proto). 290010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) const int kVarLengthTag1 = (1 << 3) | 0x2; 291010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) const int kVarLengthTag2 = (2 << 3) | 0x2; 292010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) 293010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) typedef std::map<std::string, std::vector<uint8> >::const_iterator Iter; 294010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) for (Iter it = install_attrs_.begin(); it != install_attrs_.end(); ++it) { 295010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) std::string attr; 296010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) { 297010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) google::protobuf::io::StringOutputStream attr_stream(&attr); 298010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) google::protobuf::io::CodedOutputStream attr_output(&attr_stream); 299010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) 300010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) attr_output.WriteVarint32(kVarLengthTag1); 301010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) attr_output.WriteVarint32(it->first.size()); 302010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) attr_output.WriteString(it->first); 303010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) attr_output.WriteVarint32(kVarLengthTag2); 304010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) attr_output.WriteVarint32(it->second.size()); 305010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) attr_output.WriteRaw(it->second.data(), it->second.size()); 306010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) } 307010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) 308010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) // Two CodedOutputStreams are needed because inner messages must be 309010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) // prefixed by their total length, which can't be easily computed before 310010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) // writing their tags and values. 311010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) result_output.WriteVarint32(kVarLengthTag2); 312010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) result_output.WriteVarint32(attr.size()); 313010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) result_output.WriteRaw(attr.data(), attr.size()); 314010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) } 315010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) } 316010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) 317010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) base::WorkerPool::PostTask( 318010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) FROM_HERE, base::Bind(&PersistFile, cache_path, result), false); 319010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) 3204e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) return true; 321c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)} 322c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 323c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)void FakeCryptohomeClient::InstallAttributesIsReady( 324c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) const BoolDBusMethodCallback& callback) { 3254e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) base::MessageLoop::current()->PostTask( 3264e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) FROM_HERE, base::Bind(callback, DBUS_METHOD_CALL_SUCCESS, true)); 327c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)} 328c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 3294e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)bool FakeCryptohomeClient::InstallAttributesIsInvalid(bool* is_invalid) { 3304e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) *is_invalid = false; 3314e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) return true; 332c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)} 333c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 3344e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)bool FakeCryptohomeClient::InstallAttributesIsFirstInstall( 3354e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) bool* is_first_install) { 3364e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) *is_first_install = !locked_; 3374e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) return true; 338c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)} 339c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 3404e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)void FakeCryptohomeClient::TpmAttestationIsPrepared( 3414e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) const BoolDBusMethodCallback& callback) { 3424e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) base::MessageLoop::current()->PostTask( 3434e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) FROM_HERE, base::Bind(callback, DBUS_METHOD_CALL_SUCCESS, true)); 344c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)} 345c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 3464e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)void FakeCryptohomeClient::TpmAttestationIsEnrolled( 3474e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) const BoolDBusMethodCallback& callback) { 3484e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) base::MessageLoop::current()->PostTask( 3494e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) FROM_HERE, base::Bind(callback, DBUS_METHOD_CALL_SUCCESS, true)); 350c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)} 351c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 3524e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)void FakeCryptohomeClient::AsyncTpmAttestationCreateEnrollRequest( 353a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) chromeos::attestation::PrivacyCAType pca_type, 3544e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) const AsyncMethodCallback& callback) { 3554e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) ReturnAsyncMethodResult(callback, true); 356c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)} 357c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 3584e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)void FakeCryptohomeClient::AsyncTpmAttestationEnroll( 359a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) chromeos::attestation::PrivacyCAType pca_type, 3604e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) const std::string& pca_response, 3614e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) const AsyncMethodCallback& callback) { 3624e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) ReturnAsyncMethodResult(callback, false); 363c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)} 364c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 3654e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)void FakeCryptohomeClient::AsyncTpmAttestationCreateCertRequest( 366a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) chromeos::attestation::PrivacyCAType pca_type, 3674e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) attestation::AttestationCertificateProfile certificate_profile, 3688bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) const std::string& user_id, 3694e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) const std::string& request_origin, 370c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) const AsyncMethodCallback& callback) { 3714e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) ReturnAsyncMethodResult(callback, true); 372c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)} 373c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 3744e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)void FakeCryptohomeClient::AsyncTpmAttestationFinishCertRequest( 3754e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) const std::string& pca_response, 3764e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) attestation::AttestationKeyType key_type, 3778bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) const std::string& user_id, 3784e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) const std::string& key_name, 3794e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) const AsyncMethodCallback& callback) { 3804e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) ReturnAsyncMethodResult(callback, true); 381c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)} 382c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 383c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)void FakeCryptohomeClient::TpmAttestationDoesKeyExist( 384c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) attestation::AttestationKeyType key_type, 3858bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) const std::string& user_id, 386c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) const std::string& key_name, 387c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) const BoolDBusMethodCallback& callback) { 3884e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) base::MessageLoop::current()->PostTask( 3894e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) FROM_HERE, base::Bind(callback, DBUS_METHOD_CALL_SUCCESS, false)); 390c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)} 391c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 3924e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)void FakeCryptohomeClient::TpmAttestationGetCertificate( 393c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) attestation::AttestationKeyType key_type, 3948bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) const std::string& user_id, 395c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) const std::string& key_name, 3964e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) const DataMethodCallback& callback) { 3974e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) base::MessageLoop::current()->PostTask( 3984e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) FROM_HERE, 3994e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) base::Bind(callback, DBUS_METHOD_CALL_SUCCESS, false, std::string())); 400c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)} 401c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 4024e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)void FakeCryptohomeClient::TpmAttestationGetPublicKey( 4034e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) attestation::AttestationKeyType key_type, 4048bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) const std::string& user_id, 4054e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) const std::string& key_name, 4064e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) const DataMethodCallback& callback) { 407868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) base::MessageLoop::current()->PostTask( 408b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) FROM_HERE, 4094e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) base::Bind(callback, DBUS_METHOD_CALL_SUCCESS, false, std::string())); 410c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)} 411c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 4124e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)void FakeCryptohomeClient::TpmAttestationRegisterKey( 4134e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) attestation::AttestationKeyType key_type, 4148bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) const std::string& user_id, 4154e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) const std::string& key_name, 4164e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) const AsyncMethodCallback& callback) { 4174e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) ReturnAsyncMethodResult(callback, true); 418bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch} 419bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch 420c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)void FakeCryptohomeClient::TpmAttestationSignEnterpriseChallenge( 421c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) attestation::AttestationKeyType key_type, 4228bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) const std::string& user_id, 423c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) const std::string& key_name, 424c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) const std::string& domain, 425c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) const std::string& device_id, 426c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) attestation::AttestationChallengeOptions options, 427c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) const std::string& challenge, 428c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) const AsyncMethodCallback& callback) { 4294e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) ReturnAsyncMethodResult(callback, true); 430c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)} 431c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 4324e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)void FakeCryptohomeClient::TpmAttestationSignSimpleChallenge( 4334e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) attestation::AttestationKeyType key_type, 4348bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) const std::string& user_id, 4354e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) const std::string& key_name, 4364e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) const std::string& challenge, 4374e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) const AsyncMethodCallback& callback) { 4384e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) ReturnAsyncMethodResult(callback, true); 439c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)} 440c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 4414e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)void FakeCryptohomeClient::TpmAttestationGetKeyPayload( 442c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) attestation::AttestationKeyType key_type, 4438bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) const std::string& user_id, 444c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) const std::string& key_name, 4454e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) const DataMethodCallback& callback) { 4464e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) base::MessageLoop::current()->PostTask( 4474e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) FROM_HERE, 4484e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) base::Bind(callback, DBUS_METHOD_CALL_SUCCESS, false, std::string())); 449c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)} 450c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 4514e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)void FakeCryptohomeClient::TpmAttestationSetKeyPayload( 4524e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) attestation::AttestationKeyType key_type, 4538bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) const std::string& user_id, 4544e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) const std::string& key_name, 4554e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) const std::string& payload, 4564e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) const BoolDBusMethodCallback& callback) { 4574e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) base::MessageLoop::current()->PostTask( 4584e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) FROM_HERE, base::Bind(callback, DBUS_METHOD_CALL_SUCCESS, false)); 459c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)} 460c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 4610f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)void FakeCryptohomeClient::TpmAttestationDeleteKeys( 4620f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles) attestation::AttestationKeyType key_type, 4630f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles) const std::string& user_id, 4640f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles) const std::string& key_prefix, 4650f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles) const BoolDBusMethodCallback& callback) { 4660f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles) base::MessageLoop::current()->PostTask( 4670f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles) FROM_HERE, base::Bind(callback, DBUS_METHOD_CALL_SUCCESS, false)); 4680f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)} 4690f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles) 470a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)void FakeCryptohomeClient::CheckKeyEx( 471a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) const cryptohome::AccountIdentifier& id, 472a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) const cryptohome::AuthorizationRequest& auth, 473a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) const cryptohome::CheckKeyRequest& request, 474a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) const ProtobufMethodCallback& callback) { 475a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) ReturnProtobufMethodCallback(id.email(), callback); 476a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)} 477a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 478a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)void FakeCryptohomeClient::MountEx( 479a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) const cryptohome::AccountIdentifier& id, 480a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) const cryptohome::AuthorizationRequest& auth, 481a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) const cryptohome::MountRequest& request, 482a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) const ProtobufMethodCallback& callback) { 483a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) ReturnProtobufMethodCallback(id.email(), callback); 484a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)} 485a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 486a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)void FakeCryptohomeClient::AddKeyEx( 487a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) const cryptohome::AccountIdentifier& id, 488a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) const cryptohome::AuthorizationRequest& auth, 489a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) const cryptohome::AddKeyRequest& request, 490a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) const ProtobufMethodCallback& callback) { 491a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) ReturnProtobufMethodCallback(id.email(), callback); 492a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)} 493a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 494effb81e5f8246d0db0270817048dc992db66e9fbBen Murdochvoid FakeCryptohomeClient::RemoveKeyEx( 495effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch const cryptohome::AccountIdentifier& id, 496effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch const cryptohome::AuthorizationRequest& auth, 497effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch const cryptohome::RemoveKeyRequest& request, 498effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch const ProtobufMethodCallback& callback) { 499effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch ReturnProtobufMethodCallback(id.email(), callback); 500effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch} 501effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch 502a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)void FakeCryptohomeClient::UpdateKeyEx( 503a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) const cryptohome::AccountIdentifier& id, 504a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) const cryptohome::AuthorizationRequest& auth, 505a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) const cryptohome::UpdateKeyRequest& request, 506a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) const ProtobufMethodCallback& callback) { 507a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) ReturnProtobufMethodCallback(id.email(), callback); 508a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)} 509a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 5108bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)void FakeCryptohomeClient::SetServiceIsAvailable(bool is_available) { 5118bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) service_is_available_ = is_available; 5128bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) if (is_available) { 5138bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) std::vector<WaitForServiceToBeAvailableCallback> callbacks; 5148bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) callbacks.swap(pending_wait_for_service_to_be_available_callbacks_); 5158bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) for (size_t i = 0; i < callbacks.size(); ++i) 5168bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) callbacks[i].Run(is_available); 5178bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) } 5188bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)} 5198bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) 5204e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)// static 5214e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)std::vector<uint8> FakeCryptohomeClient::GetStubSystemSalt() { 5224e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) const char kStubSystemSalt[] = "stub_system_salt"; 5234e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) return std::vector<uint8>(kStubSystemSalt, 5244e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) kStubSystemSalt + arraysize(kStubSystemSalt) - 1); 5254e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)} 5264e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 527a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)void FakeCryptohomeClient::ReturnProtobufMethodCallback( 528a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) const std::string& userid, 529a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) const ProtobufMethodCallback& callback) { 530a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) cryptohome::BaseReply reply; 531a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) reply.set_error(cryptohome::CRYPTOHOME_ERROR_NOT_SET); 532a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) cryptohome::MountReply* mount = 533a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) reply.MutableExtension(cryptohome::MountReply::reply); 534a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) mount->set_sanitized_username(GetStubSanitizedUsername(userid)); 535a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) base::MessageLoop::current()->PostTask( 536a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) FROM_HERE, 537a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) base::Bind(callback, 538a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) DBUS_METHOD_CALL_SUCCESS, 539a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) true, 540a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) reply)); 541a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)} 542a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 5434e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)void FakeCryptohomeClient::ReturnAsyncMethodResult( 5444e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) const AsyncMethodCallback& callback, 5454e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) bool returns_data) { 5464e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) base::MessageLoop::current()->PostTask( 5474e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) FROM_HERE, 5484e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) base::Bind(&FakeCryptohomeClient::ReturnAsyncMethodResultInternal, 5494e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) weak_ptr_factory_.GetWeakPtr(), 5504e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) callback, 5514e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) returns_data)); 5524e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)} 5534e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 5544e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)void FakeCryptohomeClient::ReturnAsyncMethodResultInternal( 5554e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) const AsyncMethodCallback& callback, 5564e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) bool returns_data) { 5574e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) callback.Run(async_call_id_); 5584e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) if (!returns_data && !async_call_status_handler_.is_null()) { 5594e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) base::MessageLoop::current()->PostTask( 5604e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) FROM_HERE, 5614e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) base::Bind(async_call_status_handler_, 5624e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) async_call_id_, 5634e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) true, 5644e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) cryptohome::MOUNT_ERROR_NONE)); 5654e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) } else if (returns_data && !async_call_status_data_handler_.is_null()) { 5664e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) base::MessageLoop::current()->PostTask( 5674e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) FROM_HERE, 5684e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) base::Bind(async_call_status_data_handler_, 5694e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) async_call_id_, 5704e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) true, 5714e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) std::string())); 5724e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) } 5734e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) ++async_call_id_; 574c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)} 575c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 5764e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)} // namespace chromeos 577