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" 81320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include "base/files/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" 12116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#include "base/threading/thread_restrictions.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" 16b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)#include "third_party/cros_system_api/dbus/service_constants.h" 17010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)#include "third_party/protobuf/src/google/protobuf/io/coded_stream.h" 18010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)#include "third_party/protobuf/src/google/protobuf/io/zero_copy_stream.h" 19010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)#include "third_party/protobuf/src/google/protobuf/io/zero_copy_stream_impl_lite.h" 20010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) 21c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)namespace chromeos { 22c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 234e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)FakeCryptohomeClient::FakeCryptohomeClient() 248bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) : service_is_available_(true), 258bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) async_call_id_(1), 264e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) tpm_is_ready_counter_(0), 274e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) unmount_result_(true), 281e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) system_salt_(GetStubSystemSalt()), 29010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) weak_ptr_factory_(this) { 30010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) base::FilePath cache_path; 31010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) locked_ = PathService::Get(chromeos::FILE_INSTALL_ATTRIBUTES, &cache_path) && 32010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) base::PathExists(cache_path); 33010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)} 34c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 354e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)FakeCryptohomeClient::~FakeCryptohomeClient() {} 36c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 374e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)void FakeCryptohomeClient::Init(dbus::Bus* bus) { 38c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)} 39c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 404e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)void FakeCryptohomeClient::SetAsyncCallStatusHandlers( 414e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) const AsyncCallStatusHandler& handler, 424e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) const AsyncCallStatusWithDataHandler& data_handler) { 434e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) async_call_status_handler_ = handler; 444e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) async_call_status_data_handler_ = data_handler; 45c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)} 46c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 474e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)void FakeCryptohomeClient::ResetAsyncCallStatusHandlers() { 484e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) async_call_status_handler_.Reset(); 494e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) async_call_status_data_handler_.Reset(); 50424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)} 51424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) 528bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)void FakeCryptohomeClient::WaitForServiceToBeAvailable( 538bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) const WaitForServiceToBeAvailableCallback& callback) { 548bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) if (service_is_available_) { 558bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) base::MessageLoop::current()->PostTask(FROM_HERE, 568bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) base::Bind(callback, true)); 578bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) } else { 588bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) pending_wait_for_service_to_be_available_callbacks_.push_back(callback); 598bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) } 608bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)} 618bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) 624e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)void FakeCryptohomeClient::IsMounted( 63c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) const BoolDBusMethodCallback& callback) { 644e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) base::MessageLoop::current()->PostTask( 654e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) FROM_HERE, base::Bind(callback, DBUS_METHOD_CALL_SUCCESS, true)); 66c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)} 67c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 68c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)bool FakeCryptohomeClient::Unmount(bool* success) { 69b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) *success = unmount_result_; 70b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) return true; 71c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)} 72c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 734e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)void FakeCryptohomeClient::AsyncCheckKey( 744e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) const std::string& username, 754e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) const std::string& key, 764e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) const AsyncMethodCallback& callback) { 774e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) ReturnAsyncMethodResult(callback, false); 78c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)} 79c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 804e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)void FakeCryptohomeClient::AsyncMigrateKey( 814e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) const std::string& username, 824e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) const std::string& from_key, 834e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) const std::string& to_key, 84c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) const AsyncMethodCallback& callback) { 854e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) ReturnAsyncMethodResult(callback, false); 86c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)} 87c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 884e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)void FakeCryptohomeClient::AsyncRemove( 894e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) const std::string& username, 904e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) const AsyncMethodCallback& callback) { 914e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) ReturnAsyncMethodResult(callback, false); 92c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)} 93c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 941e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)void FakeCryptohomeClient::GetSystemSalt( 951e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) const GetSystemSaltCallback& callback) { 961e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) base::MessageLoop::current()->PostTask( 971e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) FROM_HERE, 981e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) base::Bind(callback, DBUS_METHOD_CALL_SUCCESS, system_salt_)); 99c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)} 100c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 1014e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)void FakeCryptohomeClient::GetSanitizedUsername( 102c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) const std::string& username, 1034e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) const StringDBusMethodCallback& callback) { 1044e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) // Even for stub implementation we have to return different values so that 1054e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) // multi-profiles would work. 1064e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) std::string sanitized_username = GetStubSanitizedUsername(username); 1074e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) base::MessageLoop::current()->PostTask( 1084e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) FROM_HERE, 1094e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) base::Bind(callback, DBUS_METHOD_CALL_SUCCESS, sanitized_username)); 110c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)} 111c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 1124e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)std::string FakeCryptohomeClient::BlockingGetSanitizedUsername( 1134e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) const std::string& username) { 1144e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) return GetStubSanitizedUsername(username); 115c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)} 116c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 1174e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)void FakeCryptohomeClient::AsyncMount(const std::string& username, 1184e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) const std::string& key, 1194e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) int flags, 1204e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) const AsyncMethodCallback& callback) { 1214e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) ReturnAsyncMethodResult(callback, false); 122c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)} 123c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 1244e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)void FakeCryptohomeClient::AsyncAddKey( 1254e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) const std::string& username, 1264e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) const std::string& key, 1274e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) const std::string& new_key, 1284e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) const AsyncMethodCallback& callback) { 1294e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) ReturnAsyncMethodResult(callback, false); 130c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)} 131c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 132c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)void FakeCryptohomeClient::AsyncMountGuest( 133c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) const AsyncMethodCallback& callback) { 1344e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) ReturnAsyncMethodResult(callback, false); 135c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)} 136c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 137a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)void FakeCryptohomeClient::AsyncMountPublic( 138a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) const std::string& public_mount_id, 139a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) int flags, 140a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) const AsyncMethodCallback& callback) { 1414e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) ReturnAsyncMethodResult(callback, false); 142a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)} 143a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) 1444e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)void FakeCryptohomeClient::TpmIsReady( 1454e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) const BoolDBusMethodCallback& callback) { 1464e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) base::MessageLoop::current()->PostTask( 1474e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) FROM_HERE, base::Bind(callback, DBUS_METHOD_CALL_SUCCESS, true)); 148c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)} 149c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 1504e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)void FakeCryptohomeClient::TpmIsEnabled( 151c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) const BoolDBusMethodCallback& callback) { 1524e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) base::MessageLoop::current()->PostTask( 1534e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) FROM_HERE, base::Bind(callback, DBUS_METHOD_CALL_SUCCESS, true)); 154c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)} 155c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 1564e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)bool FakeCryptohomeClient::CallTpmIsEnabledAndBlock(bool* enabled) { 1574e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) *enabled = true; 1584e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) return true; 1594e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)} 1604e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 1614e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)void FakeCryptohomeClient::TpmGetPassword( 1624e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) const StringDBusMethodCallback& callback) { 1634e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) const char kStubTpmPassword[] = "Stub-TPM-password"; 1644e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) base::MessageLoop::current()->PostTask( 1654e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) FROM_HERE, 1664e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) base::Bind(callback, DBUS_METHOD_CALL_SUCCESS, 1674e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) std::string(kStubTpmPassword))); 1684e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)} 1694e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 1704e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)void FakeCryptohomeClient::TpmIsOwned( 1714e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) const BoolDBusMethodCallback& callback) { 1724e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) base::MessageLoop::current()->PostTask( 1734e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) FROM_HERE, base::Bind(callback, DBUS_METHOD_CALL_SUCCESS, true)); 1744e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)} 1754e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 1764e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)bool FakeCryptohomeClient::CallTpmIsOwnedAndBlock(bool* owned) { 1774e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) *owned = true; 1784e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) return true; 1794e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)} 1804e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 1814e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)void FakeCryptohomeClient::TpmIsBeingOwned( 1824e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) const BoolDBusMethodCallback& callback) { 1834e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) base::MessageLoop::current()->PostTask( 1844e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) FROM_HERE, base::Bind(callback, DBUS_METHOD_CALL_SUCCESS, true)); 1854e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)} 1864e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 1874e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)bool FakeCryptohomeClient::CallTpmIsBeingOwnedAndBlock(bool* owning) { 1884e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) *owning = true; 1894e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) return true; 190c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)} 191c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 192c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)void FakeCryptohomeClient::TpmCanAttemptOwnership( 193c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) const VoidDBusMethodCallback& callback) { 1944e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) base::MessageLoop::current()->PostTask( 1954e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) FROM_HERE, base::Bind(callback, DBUS_METHOD_CALL_SUCCESS)); 196c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)} 197c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 1984e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)void FakeCryptohomeClient::TpmClearStoredPassword( 1994e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) const VoidDBusMethodCallback& callback) { 2004e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) base::MessageLoop::current()->PostTask( 2014e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) FROM_HERE, base::Bind(callback, DBUS_METHOD_CALL_SUCCESS)); 2024e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)} 2034e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 2044e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)bool FakeCryptohomeClient::CallTpmClearStoredPasswordAndBlock() { 205c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) return true; 206c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)} 207c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 2084e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)void FakeCryptohomeClient::Pkcs11IsTpmTokenReady( 2094e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) const BoolDBusMethodCallback& callback) { 2104e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) base::MessageLoop::current()->PostTask( 2114e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) FROM_HERE, base::Bind(callback, DBUS_METHOD_CALL_SUCCESS, true)); 212c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)} 213c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 2144e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)void FakeCryptohomeClient::Pkcs11GetTpmTokenInfo( 2154e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) const Pkcs11GetTpmTokenInfoCallback& callback) { 2165f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) const char kStubTPMTokenName[] = "StubTPMTokenName"; 2174e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) const char kStubUserPin[] = "012345"; 2184e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) const int kStubSlot = 0; 2194e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) base::MessageLoop::current()->PostTask( 2204e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) FROM_HERE, 2214e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) base::Bind(callback, 2224e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) DBUS_METHOD_CALL_SUCCESS, 2235f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) std::string(kStubTPMTokenName), 2244e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) std::string(kStubUserPin), 2254e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) kStubSlot)); 226c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)} 227c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 2284e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)void FakeCryptohomeClient::Pkcs11GetTpmTokenInfoForUser( 2294e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) const std::string& username, 2304e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) const Pkcs11GetTpmTokenInfoCallback& callback) { 2314e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) Pkcs11GetTpmTokenInfo(callback); 232c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)} 233c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 2344e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)bool FakeCryptohomeClient::InstallAttributesGet(const std::string& name, 2354e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) std::vector<uint8>* value, 2364e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) bool* successful) { 2374e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) if (install_attrs_.find(name) != install_attrs_.end()) { 2384e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) *value = install_attrs_[name]; 2394e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) *successful = true; 2404e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) } else { 2414e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) value->clear(); 2424e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) *successful = false; 2434e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) } 2444e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) return true; 245c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)} 246c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 247c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)bool FakeCryptohomeClient::InstallAttributesSet( 248c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) const std::string& name, 249c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) const std::vector<uint8>& value, 250c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) bool* successful) { 2514e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) install_attrs_[name] = value; 2524e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) *successful = true; 2534e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) return true; 254c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)} 255c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 2564e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)bool FakeCryptohomeClient::InstallAttributesFinalize(bool* successful) { 2574e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) locked_ = true; 2584e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) *successful = true; 259010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) 260010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) // Persist the install attributes so that they can be reloaded if the 261010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) // browser is restarted. This is used for ease of development when device 262010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) // enrollment is required. 263010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) // The cryptohome::SerializedInstallAttributes protobuf lives in 264010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) // chrome/browser/chromeos, so it can't be used directly here; use the 265010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) // low-level protobuf API instead to just write the name-value pairs. 266010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) // The cache file is read by EnterpriseInstallAttributes::ReadCacheFile. 267010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) base::FilePath cache_path; 268010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) if (!PathService::Get(chromeos::FILE_INSTALL_ATTRIBUTES, &cache_path)) 269010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) return false; 270010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) 271010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) std::string result; 272010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) { 273010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) // |result| can be used only after the StringOutputStream goes out of 274010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) // scope. 275010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) google::protobuf::io::StringOutputStream result_stream(&result); 276010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) google::protobuf::io::CodedOutputStream result_output(&result_stream); 277010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) 278010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) // These tags encode a variable-length value on the wire, which can be 279010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) // used to encode strings, bytes and messages. We only needs constants 280010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) // for tag numbers 1 and 2 (see install_attributes.proto). 281010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) const int kVarLengthTag1 = (1 << 3) | 0x2; 282010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) const int kVarLengthTag2 = (2 << 3) | 0x2; 283010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) 284010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) typedef std::map<std::string, std::vector<uint8> >::const_iterator Iter; 285010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) for (Iter it = install_attrs_.begin(); it != install_attrs_.end(); ++it) { 286010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) std::string attr; 287010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) { 288010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) google::protobuf::io::StringOutputStream attr_stream(&attr); 289010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) google::protobuf::io::CodedOutputStream attr_output(&attr_stream); 290010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) 291010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) attr_output.WriteVarint32(kVarLengthTag1); 292010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) attr_output.WriteVarint32(it->first.size()); 293010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) attr_output.WriteString(it->first); 294010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) attr_output.WriteVarint32(kVarLengthTag2); 295010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) attr_output.WriteVarint32(it->second.size()); 296010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) attr_output.WriteRaw(it->second.data(), it->second.size()); 297010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) } 298010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) 299010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) // Two CodedOutputStreams are needed because inner messages must be 300010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) // prefixed by their total length, which can't be easily computed before 301010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) // writing their tags and values. 302010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) result_output.WriteVarint32(kVarLengthTag2); 303010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) result_output.WriteVarint32(attr.size()); 304010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) result_output.WriteRaw(attr.data(), attr.size()); 305010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) } 306010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) } 307010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) 308116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch // The real implementation does a blocking wait on the dbus call; the fake 309116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch // implementation must have this file written before returning. 310116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch base::ThreadRestrictions::ScopedAllowIO allow_io; 311116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch base::WriteFile(cache_path, result.data(), result.size()); 312010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) 3134e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) return true; 314c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)} 315c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 316c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)void FakeCryptohomeClient::InstallAttributesIsReady( 317c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) const BoolDBusMethodCallback& callback) { 3184e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) base::MessageLoop::current()->PostTask( 3194e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) FROM_HERE, base::Bind(callback, DBUS_METHOD_CALL_SUCCESS, true)); 320c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)} 321c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 3224e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)bool FakeCryptohomeClient::InstallAttributesIsInvalid(bool* is_invalid) { 3234e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) *is_invalid = false; 3244e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) return true; 325c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)} 326c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 3274e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)bool FakeCryptohomeClient::InstallAttributesIsFirstInstall( 3284e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) bool* is_first_install) { 3294e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) *is_first_install = !locked_; 3304e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) return true; 331c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)} 332c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 3334e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)void FakeCryptohomeClient::TpmAttestationIsPrepared( 3344e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) const BoolDBusMethodCallback& callback) { 3354e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) base::MessageLoop::current()->PostTask( 3364e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) FROM_HERE, base::Bind(callback, DBUS_METHOD_CALL_SUCCESS, true)); 337c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)} 338c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 3394e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)void FakeCryptohomeClient::TpmAttestationIsEnrolled( 3404e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) const BoolDBusMethodCallback& callback) { 3414e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) base::MessageLoop::current()->PostTask( 3424e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) FROM_HERE, base::Bind(callback, DBUS_METHOD_CALL_SUCCESS, true)); 343c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)} 344c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 3454e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)void FakeCryptohomeClient::AsyncTpmAttestationCreateEnrollRequest( 346a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) chromeos::attestation::PrivacyCAType pca_type, 3474e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) const AsyncMethodCallback& callback) { 3484e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) ReturnAsyncMethodResult(callback, true); 349c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)} 350c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 3514e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)void FakeCryptohomeClient::AsyncTpmAttestationEnroll( 352a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) chromeos::attestation::PrivacyCAType pca_type, 3534e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) const std::string& pca_response, 3544e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) const AsyncMethodCallback& callback) { 3554e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) ReturnAsyncMethodResult(callback, false); 356c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)} 357c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 3584e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)void FakeCryptohomeClient::AsyncTpmAttestationCreateCertRequest( 359a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) chromeos::attestation::PrivacyCAType pca_type, 3604e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) attestation::AttestationCertificateProfile certificate_profile, 3618bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) const std::string& user_id, 3624e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) const std::string& request_origin, 363c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) const AsyncMethodCallback& callback) { 3644e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) ReturnAsyncMethodResult(callback, true); 365c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)} 366c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 3674e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)void FakeCryptohomeClient::AsyncTpmAttestationFinishCertRequest( 3684e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) const std::string& pca_response, 3694e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) attestation::AttestationKeyType key_type, 3708bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) const std::string& user_id, 3714e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) const std::string& key_name, 3724e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) const AsyncMethodCallback& callback) { 3734e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) ReturnAsyncMethodResult(callback, true); 374c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)} 375c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 376c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)void FakeCryptohomeClient::TpmAttestationDoesKeyExist( 377c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) attestation::AttestationKeyType key_type, 3788bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) const std::string& user_id, 379c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) const std::string& key_name, 380c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) const BoolDBusMethodCallback& callback) { 3814e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) base::MessageLoop::current()->PostTask( 3824e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) FROM_HERE, base::Bind(callback, DBUS_METHOD_CALL_SUCCESS, false)); 383c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)} 384c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 3854e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)void FakeCryptohomeClient::TpmAttestationGetCertificate( 386c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) attestation::AttestationKeyType key_type, 3878bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) const std::string& user_id, 388c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) const std::string& key_name, 3894e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) const DataMethodCallback& callback) { 3904e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) base::MessageLoop::current()->PostTask( 3914e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) FROM_HERE, 3924e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) base::Bind(callback, DBUS_METHOD_CALL_SUCCESS, false, std::string())); 393c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)} 394c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 3954e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)void FakeCryptohomeClient::TpmAttestationGetPublicKey( 3964e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) attestation::AttestationKeyType key_type, 3978bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) const std::string& user_id, 3984e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) const std::string& key_name, 3994e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) const DataMethodCallback& callback) { 400868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) base::MessageLoop::current()->PostTask( 401b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) FROM_HERE, 4024e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) base::Bind(callback, DBUS_METHOD_CALL_SUCCESS, false, std::string())); 403c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)} 404c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 4054e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)void FakeCryptohomeClient::TpmAttestationRegisterKey( 4064e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) attestation::AttestationKeyType key_type, 4078bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) const std::string& user_id, 4084e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) const std::string& key_name, 4094e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) const AsyncMethodCallback& callback) { 4104e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) ReturnAsyncMethodResult(callback, true); 411bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch} 412bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch 413c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)void FakeCryptohomeClient::TpmAttestationSignEnterpriseChallenge( 414c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) attestation::AttestationKeyType key_type, 4158bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) const std::string& user_id, 416c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) const std::string& key_name, 417c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) const std::string& domain, 418c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) const std::string& device_id, 419c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) attestation::AttestationChallengeOptions options, 420c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) const std::string& challenge, 421c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) const AsyncMethodCallback& callback) { 4224e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) ReturnAsyncMethodResult(callback, true); 423c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)} 424c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 4254e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)void FakeCryptohomeClient::TpmAttestationSignSimpleChallenge( 4264e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) attestation::AttestationKeyType key_type, 4278bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) const std::string& user_id, 4284e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) const std::string& key_name, 4294e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) const std::string& challenge, 4304e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) const AsyncMethodCallback& callback) { 4314e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) ReturnAsyncMethodResult(callback, true); 432c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)} 433c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 4344e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)void FakeCryptohomeClient::TpmAttestationGetKeyPayload( 435c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) attestation::AttestationKeyType key_type, 4368bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) const std::string& user_id, 437c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) const std::string& key_name, 4384e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) const DataMethodCallback& callback) { 4394e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) base::MessageLoop::current()->PostTask( 4404e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) FROM_HERE, 4414e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) base::Bind(callback, DBUS_METHOD_CALL_SUCCESS, false, std::string())); 442c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)} 443c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 4444e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)void FakeCryptohomeClient::TpmAttestationSetKeyPayload( 4454e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) attestation::AttestationKeyType key_type, 4468bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) const std::string& user_id, 4474e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) const std::string& key_name, 4484e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) const std::string& payload, 4494e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) const BoolDBusMethodCallback& callback) { 4504e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) base::MessageLoop::current()->PostTask( 4514e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) FROM_HERE, base::Bind(callback, DBUS_METHOD_CALL_SUCCESS, false)); 452c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)} 453c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 4540f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)void FakeCryptohomeClient::TpmAttestationDeleteKeys( 4550f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles) attestation::AttestationKeyType key_type, 4560f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles) const std::string& user_id, 4570f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles) const std::string& key_prefix, 4580f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles) const BoolDBusMethodCallback& callback) { 4590f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles) base::MessageLoop::current()->PostTask( 4600f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles) FROM_HERE, base::Bind(callback, DBUS_METHOD_CALL_SUCCESS, false)); 4610f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)} 4620f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles) 4631320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tuccivoid FakeCryptohomeClient::GetKeyDataEx( 4641320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci const cryptohome::AccountIdentifier& id, 4651320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci const cryptohome::AuthorizationRequest& auth, 4661320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci const cryptohome::GetKeyDataRequest& request, 4671320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci const ProtobufMethodCallback& callback) { 4681320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci cryptohome::BaseReply reply; 4691320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci reply.MutableExtension(cryptohome::GetKeyDataReply::reply); 4701320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci ReturnProtobufMethodCallback(reply, callback); 4711320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci} 4721320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 473a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)void FakeCryptohomeClient::CheckKeyEx( 474a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) const cryptohome::AccountIdentifier& id, 475a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) const cryptohome::AuthorizationRequest& auth, 476a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) const cryptohome::CheckKeyRequest& request, 477a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) const ProtobufMethodCallback& callback) { 478116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch cryptohome::BaseReply reply; 479116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch ReturnProtobufMethodCallback(reply, callback); 480a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)} 481a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 482a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)void FakeCryptohomeClient::MountEx( 483a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) const cryptohome::AccountIdentifier& id, 484a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) const cryptohome::AuthorizationRequest& auth, 485a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) const cryptohome::MountRequest& request, 486a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) const ProtobufMethodCallback& callback) { 487116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch cryptohome::BaseReply reply; 488116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch cryptohome::MountReply* mount = 489116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch reply.MutableExtension(cryptohome::MountReply::reply); 490116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch mount->set_sanitized_username(GetStubSanitizedUsername(id.email())); 491116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch ReturnProtobufMethodCallback(reply, callback); 492a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)} 493a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 494a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)void FakeCryptohomeClient::AddKeyEx( 495a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) const cryptohome::AccountIdentifier& id, 496a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) const cryptohome::AuthorizationRequest& auth, 497a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) const cryptohome::AddKeyRequest& request, 498a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) const ProtobufMethodCallback& callback) { 499116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch cryptohome::BaseReply reply; 500116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch ReturnProtobufMethodCallback(reply, callback); 501a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)} 502a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 503effb81e5f8246d0db0270817048dc992db66e9fbBen Murdochvoid FakeCryptohomeClient::RemoveKeyEx( 504effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch const cryptohome::AccountIdentifier& id, 505effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch const cryptohome::AuthorizationRequest& auth, 506effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch const cryptohome::RemoveKeyRequest& request, 507effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch const ProtobufMethodCallback& callback) { 508116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch cryptohome::BaseReply reply; 509116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch ReturnProtobufMethodCallback(reply, callback); 510effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch} 511effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch 512a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)void FakeCryptohomeClient::UpdateKeyEx( 513a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) const cryptohome::AccountIdentifier& id, 514a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) const cryptohome::AuthorizationRequest& auth, 515a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) const cryptohome::UpdateKeyRequest& request, 516a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) const ProtobufMethodCallback& callback) { 517116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch cryptohome::BaseReply reply; 518116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch ReturnProtobufMethodCallback(reply, callback); 519116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch} 520116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 521116680a4aac90f2aa7413d9095a592090648e557Ben Murdochvoid FakeCryptohomeClient::GetBootAttribute( 522116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch const cryptohome::GetBootAttributeRequest& request, 523116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch const ProtobufMethodCallback& callback) { 524116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch cryptohome::BaseReply reply; 525116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch cryptohome::GetBootAttributeReply* attr_reply = 526116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch reply.MutableExtension(cryptohome::GetBootAttributeReply::reply); 527116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch attr_reply->set_value(""); 528116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch ReturnProtobufMethodCallback(reply, callback); 529116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch} 530116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 531116680a4aac90f2aa7413d9095a592090648e557Ben Murdochvoid FakeCryptohomeClient::SetBootAttribute( 532116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch const cryptohome::SetBootAttributeRequest& request, 533116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch const ProtobufMethodCallback& callback) { 534116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch cryptohome::BaseReply reply; 535116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch ReturnProtobufMethodCallback(reply, callback); 536116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch} 537116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 538116680a4aac90f2aa7413d9095a592090648e557Ben Murdochvoid FakeCryptohomeClient::FlushAndSignBootAttributes( 539116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch const cryptohome::FlushAndSignBootAttributesRequest& request, 540116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch const ProtobufMethodCallback& callback) { 541116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch cryptohome::BaseReply reply; 542116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch ReturnProtobufMethodCallback(reply, callback); 543a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)} 544a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 5458bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)void FakeCryptohomeClient::SetServiceIsAvailable(bool is_available) { 5468bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) service_is_available_ = is_available; 5478bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) if (is_available) { 5488bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) std::vector<WaitForServiceToBeAvailableCallback> callbacks; 5498bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) callbacks.swap(pending_wait_for_service_to_be_available_callbacks_); 5508bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) for (size_t i = 0; i < callbacks.size(); ++i) 5518bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) callbacks[i].Run(is_available); 5528bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) } 5538bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)} 5548bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) 5554e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)// static 5564e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)std::vector<uint8> FakeCryptohomeClient::GetStubSystemSalt() { 5574e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) const char kStubSystemSalt[] = "stub_system_salt"; 5584e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) return std::vector<uint8>(kStubSystemSalt, 5594e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) kStubSystemSalt + arraysize(kStubSystemSalt) - 1); 5604e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)} 5614e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 562a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)void FakeCryptohomeClient::ReturnProtobufMethodCallback( 563116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch const cryptohome::BaseReply& reply, 564a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) const ProtobufMethodCallback& callback) { 565a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) base::MessageLoop::current()->PostTask( 566a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) FROM_HERE, 567a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) base::Bind(callback, 568a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) DBUS_METHOD_CALL_SUCCESS, 569a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) true, 570a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) reply)); 571a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)} 572a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 5734e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)void FakeCryptohomeClient::ReturnAsyncMethodResult( 5744e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) const AsyncMethodCallback& callback, 5754e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) bool returns_data) { 5764e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) base::MessageLoop::current()->PostTask( 5774e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) FROM_HERE, 5784e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) base::Bind(&FakeCryptohomeClient::ReturnAsyncMethodResultInternal, 5794e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) weak_ptr_factory_.GetWeakPtr(), 5804e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) callback, 5814e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) returns_data)); 5824e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)} 5834e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 5844e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)void FakeCryptohomeClient::ReturnAsyncMethodResultInternal( 5854e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) const AsyncMethodCallback& callback, 5864e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) bool returns_data) { 5874e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) callback.Run(async_call_id_); 5884e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) if (!returns_data && !async_call_status_handler_.is_null()) { 5894e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) base::MessageLoop::current()->PostTask( 5904e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) FROM_HERE, 5914e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) base::Bind(async_call_status_handler_, 5924e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) async_call_id_, 5934e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) true, 5944e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) cryptohome::MOUNT_ERROR_NONE)); 5954e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) } else if (returns_data && !async_call_status_data_handler_.is_null()) { 5964e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) base::MessageLoop::current()->PostTask( 5974e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) FROM_HERE, 5984e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) base::Bind(async_call_status_data_handler_, 5994e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) async_call_id_, 6004e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) true, 6014e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) std::string())); 6024e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) } 6034e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) ++async_call_id_; 604c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)} 605c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 6064e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)} // namespace chromeos 607