fake_cryptohome_client.cc revision 1320f92c476a1ad9d19dba2a48c72b75566198e9
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