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