// // Copyright (C) 2015 The Android Open Source Project // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. // #include "tpm_manager/server/mock_tpm_nvram.h" namespace tpm_manager { using testing::_; using testing::Invoke; using testing::Return; MockTpmNvram::MockTpmNvram() { ON_CALL(*this, DefineSpace(_, _, _, _, _)) .WillByDefault(Invoke(this, &MockTpmNvram::FakeDefineSpace)); ON_CALL(*this, DestroySpace(_)) .WillByDefault(Invoke(this, &MockTpmNvram::FakeDestroySpace)); ON_CALL(*this, WriteSpace(_, _, _)) .WillByDefault(Invoke(this, &MockTpmNvram::FakeWriteSpace)); ON_CALL(*this, ReadSpace(_, _, _)) .WillByDefault(Invoke(this, &MockTpmNvram::FakeReadSpace)); ON_CALL(*this, LockSpace(_, _, _, _)) .WillByDefault(Invoke(this, &MockTpmNvram::FakeLockSpace)); ON_CALL(*this, ListSpaces(_)) .WillByDefault(Invoke(this, &MockTpmNvram::FakeListSpaces)); ON_CALL(*this, GetSpaceInfo(_, _, _, _, _, _)) .WillByDefault(Invoke(this, &MockTpmNvram::FakeGetSpaceInfo)); } MockTpmNvram::~MockTpmNvram() {} NvramResult MockTpmNvram::FakeDefineSpace( uint32_t index, size_t size, const std::vector<NvramSpaceAttribute>& attributes, const std::string& authorization_value, NvramSpacePolicy policy) { if (size == 0) { return NVRAM_RESULT_INVALID_PARAMETER; } if (nvram_map_.count(index) != 0) { return NVRAM_RESULT_SPACE_ALREADY_EXISTS; } NvSpace ns; ns.data.resize(size, '\xff'); ns.read_locked = false; ns.write_locked = false; ns.attributes = attributes; ns.authorization_value = authorization_value; ns.policy = policy; nvram_map_[index] = ns; return NVRAM_RESULT_SUCCESS; } NvramResult MockTpmNvram::FakeDestroySpace(uint32_t index) { if (nvram_map_.count(index) == 0) { return NVRAM_RESULT_SPACE_DOES_NOT_EXIST; } nvram_map_.erase(index); return NVRAM_RESULT_SUCCESS; } NvramResult MockTpmNvram::FakeWriteSpace( uint32_t index, const std::string& data, const std::string& authorization_value) { if (nvram_map_.count(index) == 0) { return NVRAM_RESULT_SPACE_DOES_NOT_EXIST; } if (nvram_map_[index].authorization_value != authorization_value) { return NVRAM_RESULT_ACCESS_DENIED; } if (nvram_map_[index].write_locked) { return NVRAM_RESULT_OPERATION_DISABLED; } std::string& space_data = nvram_map_[index].data; size_t size = space_data.size(); if (data.size() > size) { return NVRAM_RESULT_INVALID_PARAMETER; } space_data = data; space_data.resize(size); return NVRAM_RESULT_SUCCESS; } NvramResult MockTpmNvram::FakeReadSpace( uint32_t index, std::string* data, const std::string& authorization_value) { if (nvram_map_.count(index) == 0) { return NVRAM_RESULT_SPACE_DOES_NOT_EXIST; } if (nvram_map_[index].authorization_value != authorization_value) { return NVRAM_RESULT_ACCESS_DENIED; } if (nvram_map_[index].read_locked) { return NVRAM_RESULT_OPERATION_DISABLED; } *data = nvram_map_[index].data; return NVRAM_RESULT_SUCCESS; } NvramResult MockTpmNvram::FakeLockSpace( uint32_t index, bool lock_read, bool lock_write, const std::string& authorization_value) { if (nvram_map_.count(index) == 0) { return NVRAM_RESULT_SPACE_DOES_NOT_EXIST; } if (nvram_map_[index].authorization_value != authorization_value) { return NVRAM_RESULT_ACCESS_DENIED; } if (lock_read) { nvram_map_[index].read_locked = true; } if (lock_write) { nvram_map_[index].write_locked = true; } return NVRAM_RESULT_SUCCESS; } NvramResult MockTpmNvram::FakeListSpaces(std::vector<uint32_t>* index_list) { for (auto iter : nvram_map_) { index_list->push_back(iter.first); } return NVRAM_RESULT_SUCCESS; } NvramResult MockTpmNvram::FakeGetSpaceInfo( uint32_t index, size_t* size, bool* is_read_locked, bool* is_write_locked, std::vector<NvramSpaceAttribute>* attributes, NvramSpacePolicy* policy) { if (nvram_map_.count(index) == 0) { return NVRAM_RESULT_SPACE_DOES_NOT_EXIST; } NvSpace& space = nvram_map_[index]; *size = space.data.size(); *is_read_locked = space.read_locked; *is_write_locked = space.write_locked; *attributes = space.attributes; *policy = space.policy; return NVRAM_RESULT_SUCCESS; } } // namespace tpm_manager