1f86a34eaa3f556456d90b94f7af4c72bbab6f08fUtkarsh Sanghi//
2f86a34eaa3f556456d90b94f7af4c72bbab6f08fUtkarsh Sanghi// Copyright (C) 2015 The Android Open Source Project
3f86a34eaa3f556456d90b94f7af4c72bbab6f08fUtkarsh Sanghi//
4f86a34eaa3f556456d90b94f7af4c72bbab6f08fUtkarsh Sanghi// Licensed under the Apache License, Version 2.0 (the "License");
5f86a34eaa3f556456d90b94f7af4c72bbab6f08fUtkarsh Sanghi// you may not use this file except in compliance with the License.
6f86a34eaa3f556456d90b94f7af4c72bbab6f08fUtkarsh Sanghi// You may obtain a copy of the License at
7f86a34eaa3f556456d90b94f7af4c72bbab6f08fUtkarsh Sanghi//
8f86a34eaa3f556456d90b94f7af4c72bbab6f08fUtkarsh Sanghi//      http://www.apache.org/licenses/LICENSE-2.0
9f86a34eaa3f556456d90b94f7af4c72bbab6f08fUtkarsh Sanghi//
10f86a34eaa3f556456d90b94f7af4c72bbab6f08fUtkarsh Sanghi// Unless required by applicable law or agreed to in writing, software
11f86a34eaa3f556456d90b94f7af4c72bbab6f08fUtkarsh Sanghi// distributed under the License is distributed on an "AS IS" BASIS,
12f86a34eaa3f556456d90b94f7af4c72bbab6f08fUtkarsh Sanghi// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13f86a34eaa3f556456d90b94f7af4c72bbab6f08fUtkarsh Sanghi// See the License for the specific language governing permissions and
14f86a34eaa3f556456d90b94f7af4c72bbab6f08fUtkarsh Sanghi// limitations under the License.
15f86a34eaa3f556456d90b94f7af4c72bbab6f08fUtkarsh Sanghi//
16f86a34eaa3f556456d90b94f7af4c72bbab6f08fUtkarsh Sanghi
17f86a34eaa3f556456d90b94f7af4c72bbab6f08fUtkarsh Sanghi#include "tpm_manager/server/mock_tpm_nvram.h"
18f86a34eaa3f556456d90b94f7af4c72bbab6f08fUtkarsh Sanghi
19f86a34eaa3f556456d90b94f7af4c72bbab6f08fUtkarsh Sanghinamespace tpm_manager {
20f86a34eaa3f556456d90b94f7af4c72bbab6f08fUtkarsh Sanghi
21f86a34eaa3f556456d90b94f7af4c72bbab6f08fUtkarsh Sanghiusing testing::_;
22f86a34eaa3f556456d90b94f7af4c72bbab6f08fUtkarsh Sanghiusing testing::Invoke;
23f86a34eaa3f556456d90b94f7af4c72bbab6f08fUtkarsh Sanghiusing testing::Return;
24f86a34eaa3f556456d90b94f7af4c72bbab6f08fUtkarsh Sanghi
25f86a34eaa3f556456d90b94f7af4c72bbab6f08fUtkarsh SanghiMockTpmNvram::MockTpmNvram() {
26a94133441da308b30c6fe18cc4e2b866498ee401Darren Krahn  ON_CALL(*this, DefineSpace(_, _, _, _, _))
27a94133441da308b30c6fe18cc4e2b866498ee401Darren Krahn      .WillByDefault(Invoke(this, &MockTpmNvram::FakeDefineSpace));
28a94133441da308b30c6fe18cc4e2b866498ee401Darren Krahn  ON_CALL(*this, DestroySpace(_))
29a94133441da308b30c6fe18cc4e2b866498ee401Darren Krahn      .WillByDefault(Invoke(this, &MockTpmNvram::FakeDestroySpace));
30a94133441da308b30c6fe18cc4e2b866498ee401Darren Krahn  ON_CALL(*this, WriteSpace(_, _, _))
31a94133441da308b30c6fe18cc4e2b866498ee401Darren Krahn      .WillByDefault(Invoke(this, &MockTpmNvram::FakeWriteSpace));
32a94133441da308b30c6fe18cc4e2b866498ee401Darren Krahn  ON_CALL(*this, ReadSpace(_, _, _))
33a94133441da308b30c6fe18cc4e2b866498ee401Darren Krahn      .WillByDefault(Invoke(this, &MockTpmNvram::FakeReadSpace));
34a94133441da308b30c6fe18cc4e2b866498ee401Darren Krahn  ON_CALL(*this, LockSpace(_, _, _, _))
35a94133441da308b30c6fe18cc4e2b866498ee401Darren Krahn      .WillByDefault(Invoke(this, &MockTpmNvram::FakeLockSpace));
36a94133441da308b30c6fe18cc4e2b866498ee401Darren Krahn  ON_CALL(*this, ListSpaces(_))
37a94133441da308b30c6fe18cc4e2b866498ee401Darren Krahn      .WillByDefault(Invoke(this, &MockTpmNvram::FakeListSpaces));
38a94133441da308b30c6fe18cc4e2b866498ee401Darren Krahn  ON_CALL(*this, GetSpaceInfo(_, _, _, _, _, _))
39a94133441da308b30c6fe18cc4e2b866498ee401Darren Krahn      .WillByDefault(Invoke(this, &MockTpmNvram::FakeGetSpaceInfo));
40f86a34eaa3f556456d90b94f7af4c72bbab6f08fUtkarsh Sanghi}
41f86a34eaa3f556456d90b94f7af4c72bbab6f08fUtkarsh Sanghi
42f86a34eaa3f556456d90b94f7af4c72bbab6f08fUtkarsh SanghiMockTpmNvram::~MockTpmNvram() {}
43f86a34eaa3f556456d90b94f7af4c72bbab6f08fUtkarsh Sanghi
44a94133441da308b30c6fe18cc4e2b866498ee401Darren KrahnNvramResult MockTpmNvram::FakeDefineSpace(
45a94133441da308b30c6fe18cc4e2b866498ee401Darren Krahn    uint32_t index,
46a94133441da308b30c6fe18cc4e2b866498ee401Darren Krahn    size_t size,
47a94133441da308b30c6fe18cc4e2b866498ee401Darren Krahn    const std::vector<NvramSpaceAttribute>& attributes,
48a94133441da308b30c6fe18cc4e2b866498ee401Darren Krahn    const std::string& authorization_value,
49a94133441da308b30c6fe18cc4e2b866498ee401Darren Krahn    NvramSpacePolicy policy) {
50a94133441da308b30c6fe18cc4e2b866498ee401Darren Krahn  if (size == 0) {
51a94133441da308b30c6fe18cc4e2b866498ee401Darren Krahn    return NVRAM_RESULT_INVALID_PARAMETER;
52a94133441da308b30c6fe18cc4e2b866498ee401Darren Krahn  }
53a94133441da308b30c6fe18cc4e2b866498ee401Darren Krahn  if (nvram_map_.count(index) != 0) {
54a94133441da308b30c6fe18cc4e2b866498ee401Darren Krahn    return NVRAM_RESULT_SPACE_ALREADY_EXISTS;
55f86a34eaa3f556456d90b94f7af4c72bbab6f08fUtkarsh Sanghi  }
56f86a34eaa3f556456d90b94f7af4c72bbab6f08fUtkarsh Sanghi  NvSpace ns;
57a94133441da308b30c6fe18cc4e2b866498ee401Darren Krahn  ns.data.resize(size, '\xff');
58a94133441da308b30c6fe18cc4e2b866498ee401Darren Krahn  ns.read_locked = false;
59a94133441da308b30c6fe18cc4e2b866498ee401Darren Krahn  ns.write_locked = false;
60a94133441da308b30c6fe18cc4e2b866498ee401Darren Krahn  ns.attributes = attributes;
61a94133441da308b30c6fe18cc4e2b866498ee401Darren Krahn  ns.authorization_value = authorization_value;
62a94133441da308b30c6fe18cc4e2b866498ee401Darren Krahn  ns.policy = policy;
63f86a34eaa3f556456d90b94f7af4c72bbab6f08fUtkarsh Sanghi  nvram_map_[index] = ns;
64a94133441da308b30c6fe18cc4e2b866498ee401Darren Krahn  return NVRAM_RESULT_SUCCESS;
65f86a34eaa3f556456d90b94f7af4c72bbab6f08fUtkarsh Sanghi}
66f86a34eaa3f556456d90b94f7af4c72bbab6f08fUtkarsh Sanghi
67a94133441da308b30c6fe18cc4e2b866498ee401Darren KrahnNvramResult MockTpmNvram::FakeDestroySpace(uint32_t index) {
68a94133441da308b30c6fe18cc4e2b866498ee401Darren Krahn  if (nvram_map_.count(index) == 0) {
69a94133441da308b30c6fe18cc4e2b866498ee401Darren Krahn    return NVRAM_RESULT_SPACE_DOES_NOT_EXIST;
70f86a34eaa3f556456d90b94f7af4c72bbab6f08fUtkarsh Sanghi  }
71a94133441da308b30c6fe18cc4e2b866498ee401Darren Krahn  nvram_map_.erase(index);
72a94133441da308b30c6fe18cc4e2b866498ee401Darren Krahn  return NVRAM_RESULT_SUCCESS;
73f86a34eaa3f556456d90b94f7af4c72bbab6f08fUtkarsh Sanghi}
74f86a34eaa3f556456d90b94f7af4c72bbab6f08fUtkarsh Sanghi
75a94133441da308b30c6fe18cc4e2b866498ee401Darren KrahnNvramResult MockTpmNvram::FakeWriteSpace(
76a94133441da308b30c6fe18cc4e2b866498ee401Darren Krahn    uint32_t index,
77a94133441da308b30c6fe18cc4e2b866498ee401Darren Krahn    const std::string& data,
78a94133441da308b30c6fe18cc4e2b866498ee401Darren Krahn    const std::string& authorization_value) {
79a94133441da308b30c6fe18cc4e2b866498ee401Darren Krahn  if (nvram_map_.count(index) == 0) {
80a94133441da308b30c6fe18cc4e2b866498ee401Darren Krahn    return NVRAM_RESULT_SPACE_DOES_NOT_EXIST;
81a94133441da308b30c6fe18cc4e2b866498ee401Darren Krahn  }
82a94133441da308b30c6fe18cc4e2b866498ee401Darren Krahn  if (nvram_map_[index].authorization_value != authorization_value) {
83a94133441da308b30c6fe18cc4e2b866498ee401Darren Krahn    return NVRAM_RESULT_ACCESS_DENIED;
84a94133441da308b30c6fe18cc4e2b866498ee401Darren Krahn  }
85a94133441da308b30c6fe18cc4e2b866498ee401Darren Krahn  if (nvram_map_[index].write_locked) {
86a94133441da308b30c6fe18cc4e2b866498ee401Darren Krahn    return NVRAM_RESULT_OPERATION_DISABLED;
87a94133441da308b30c6fe18cc4e2b866498ee401Darren Krahn  }
88a94133441da308b30c6fe18cc4e2b866498ee401Darren Krahn  std::string& space_data = nvram_map_[index].data;
89a94133441da308b30c6fe18cc4e2b866498ee401Darren Krahn  size_t size = space_data.size();
90a94133441da308b30c6fe18cc4e2b866498ee401Darren Krahn  if (data.size() > size) {
91a94133441da308b30c6fe18cc4e2b866498ee401Darren Krahn    return NVRAM_RESULT_INVALID_PARAMETER;
92a94133441da308b30c6fe18cc4e2b866498ee401Darren Krahn  }
93a94133441da308b30c6fe18cc4e2b866498ee401Darren Krahn  space_data = data;
94a94133441da308b30c6fe18cc4e2b866498ee401Darren Krahn  space_data.resize(size);
95a94133441da308b30c6fe18cc4e2b866498ee401Darren Krahn  return NVRAM_RESULT_SUCCESS;
96f86a34eaa3f556456d90b94f7af4c72bbab6f08fUtkarsh Sanghi}
97f86a34eaa3f556456d90b94f7af4c72bbab6f08fUtkarsh Sanghi
98a94133441da308b30c6fe18cc4e2b866498ee401Darren KrahnNvramResult MockTpmNvram::FakeReadSpace(
99a94133441da308b30c6fe18cc4e2b866498ee401Darren Krahn    uint32_t index,
100a94133441da308b30c6fe18cc4e2b866498ee401Darren Krahn    std::string* data,
101a94133441da308b30c6fe18cc4e2b866498ee401Darren Krahn    const std::string& authorization_value) {
102a94133441da308b30c6fe18cc4e2b866498ee401Darren Krahn  if (nvram_map_.count(index) == 0) {
103a94133441da308b30c6fe18cc4e2b866498ee401Darren Krahn    return NVRAM_RESULT_SPACE_DOES_NOT_EXIST;
104f86a34eaa3f556456d90b94f7af4c72bbab6f08fUtkarsh Sanghi  }
105a94133441da308b30c6fe18cc4e2b866498ee401Darren Krahn  if (nvram_map_[index].authorization_value != authorization_value) {
106a94133441da308b30c6fe18cc4e2b866498ee401Darren Krahn    return NVRAM_RESULT_ACCESS_DENIED;
107f86a34eaa3f556456d90b94f7af4c72bbab6f08fUtkarsh Sanghi  }
108a94133441da308b30c6fe18cc4e2b866498ee401Darren Krahn  if (nvram_map_[index].read_locked) {
109a94133441da308b30c6fe18cc4e2b866498ee401Darren Krahn    return NVRAM_RESULT_OPERATION_DISABLED;
110a94133441da308b30c6fe18cc4e2b866498ee401Darren Krahn  }
111a94133441da308b30c6fe18cc4e2b866498ee401Darren Krahn  *data = nvram_map_[index].data;
112a94133441da308b30c6fe18cc4e2b866498ee401Darren Krahn  return NVRAM_RESULT_SUCCESS;
113f86a34eaa3f556456d90b94f7af4c72bbab6f08fUtkarsh Sanghi}
114f86a34eaa3f556456d90b94f7af4c72bbab6f08fUtkarsh Sanghi
115a94133441da308b30c6fe18cc4e2b866498ee401Darren KrahnNvramResult MockTpmNvram::FakeLockSpace(
116a94133441da308b30c6fe18cc4e2b866498ee401Darren Krahn    uint32_t index,
117a94133441da308b30c6fe18cc4e2b866498ee401Darren Krahn    bool lock_read,
118a94133441da308b30c6fe18cc4e2b866498ee401Darren Krahn    bool lock_write,
119a94133441da308b30c6fe18cc4e2b866498ee401Darren Krahn    const std::string& authorization_value) {
120a94133441da308b30c6fe18cc4e2b866498ee401Darren Krahn  if (nvram_map_.count(index) == 0) {
121a94133441da308b30c6fe18cc4e2b866498ee401Darren Krahn    return NVRAM_RESULT_SPACE_DOES_NOT_EXIST;
122a94133441da308b30c6fe18cc4e2b866498ee401Darren Krahn  }
123a94133441da308b30c6fe18cc4e2b866498ee401Darren Krahn  if (nvram_map_[index].authorization_value != authorization_value) {
124a94133441da308b30c6fe18cc4e2b866498ee401Darren Krahn    return NVRAM_RESULT_ACCESS_DENIED;
125a94133441da308b30c6fe18cc4e2b866498ee401Darren Krahn  }
126a94133441da308b30c6fe18cc4e2b866498ee401Darren Krahn  if (lock_read) {
127a94133441da308b30c6fe18cc4e2b866498ee401Darren Krahn    nvram_map_[index].read_locked = true;
128a94133441da308b30c6fe18cc4e2b866498ee401Darren Krahn  }
129a94133441da308b30c6fe18cc4e2b866498ee401Darren Krahn  if (lock_write) {
130a94133441da308b30c6fe18cc4e2b866498ee401Darren Krahn    nvram_map_[index].write_locked = true;
131a94133441da308b30c6fe18cc4e2b866498ee401Darren Krahn  }
132a94133441da308b30c6fe18cc4e2b866498ee401Darren Krahn  return NVRAM_RESULT_SUCCESS;
133f86a34eaa3f556456d90b94f7af4c72bbab6f08fUtkarsh Sanghi}
134f86a34eaa3f556456d90b94f7af4c72bbab6f08fUtkarsh Sanghi
135a94133441da308b30c6fe18cc4e2b866498ee401Darren KrahnNvramResult MockTpmNvram::FakeListSpaces(std::vector<uint32_t>* index_list) {
136a94133441da308b30c6fe18cc4e2b866498ee401Darren Krahn  for (auto iter : nvram_map_) {
137a94133441da308b30c6fe18cc4e2b866498ee401Darren Krahn    index_list->push_back(iter.first);
13837fb0f8c79ba0780b9a9b68082fd67dcc3ccb55dUtkarsh Sanghi  }
139a94133441da308b30c6fe18cc4e2b866498ee401Darren Krahn  return NVRAM_RESULT_SUCCESS;
140f86a34eaa3f556456d90b94f7af4c72bbab6f08fUtkarsh Sanghi}
141f86a34eaa3f556456d90b94f7af4c72bbab6f08fUtkarsh Sanghi
142a94133441da308b30c6fe18cc4e2b866498ee401Darren KrahnNvramResult MockTpmNvram::FakeGetSpaceInfo(
143a94133441da308b30c6fe18cc4e2b866498ee401Darren Krahn    uint32_t index,
144a94133441da308b30c6fe18cc4e2b866498ee401Darren Krahn    size_t* size,
145a94133441da308b30c6fe18cc4e2b866498ee401Darren Krahn    bool* is_read_locked,
146a94133441da308b30c6fe18cc4e2b866498ee401Darren Krahn    bool* is_write_locked,
147a94133441da308b30c6fe18cc4e2b866498ee401Darren Krahn    std::vector<NvramSpaceAttribute>* attributes,
148a94133441da308b30c6fe18cc4e2b866498ee401Darren Krahn    NvramSpacePolicy* policy) {
149a94133441da308b30c6fe18cc4e2b866498ee401Darren Krahn  if (nvram_map_.count(index) == 0) {
150a94133441da308b30c6fe18cc4e2b866498ee401Darren Krahn    return NVRAM_RESULT_SPACE_DOES_NOT_EXIST;
151f86a34eaa3f556456d90b94f7af4c72bbab6f08fUtkarsh Sanghi  }
152a94133441da308b30c6fe18cc4e2b866498ee401Darren Krahn  NvSpace& space = nvram_map_[index];
153a94133441da308b30c6fe18cc4e2b866498ee401Darren Krahn  *size = space.data.size();
154a94133441da308b30c6fe18cc4e2b866498ee401Darren Krahn  *is_read_locked = space.read_locked;
155a94133441da308b30c6fe18cc4e2b866498ee401Darren Krahn  *is_write_locked = space.write_locked;
156a94133441da308b30c6fe18cc4e2b866498ee401Darren Krahn  *attributes = space.attributes;
157a94133441da308b30c6fe18cc4e2b866498ee401Darren Krahn  *policy = space.policy;
158a94133441da308b30c6fe18cc4e2b866498ee401Darren Krahn  return NVRAM_RESULT_SUCCESS;
159f86a34eaa3f556456d90b94f7af4c72bbab6f08fUtkarsh Sanghi}
160f86a34eaa3f556456d90b94f7af4c72bbab6f08fUtkarsh Sanghi
161f86a34eaa3f556456d90b94f7af4c72bbab6f08fUtkarsh Sanghi}  // namespace tpm_manager
162