| // |
| // 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, DefineNvram(_, _)) |
| .WillByDefault(Invoke(this, &MockTpmNvram::FakeDefineNvram)); |
| ON_CALL(*this, DestroyNvram(_)) |
| .WillByDefault(Invoke(this, &MockTpmNvram::FakeDestroyNvram)); |
| ON_CALL(*this, WriteNvram(_, _)) |
| .WillByDefault(Invoke(this, &MockTpmNvram::FakeWriteNvram)); |
| ON_CALL(*this, ReadNvram(_, _)) |
| .WillByDefault(Invoke(this, &MockTpmNvram::FakeReadNvram)); |
| ON_CALL(*this, IsNvramDefined(_, _)) |
| .WillByDefault(Invoke(this, &MockTpmNvram::FakeIsNvramDefined)); |
| ON_CALL(*this, IsNvramLocked(_, _)) |
| .WillByDefault(Invoke(this, &MockTpmNvram::FakeIsNvramLocked)); |
| ON_CALL(*this, GetNvramSize(_, _)) |
| .WillByDefault(Invoke(this, &MockTpmNvram::FakeGetNvramSize)); |
| } |
| |
| MockTpmNvram::~MockTpmNvram() {} |
| |
| bool MockTpmNvram::FakeDefineNvram(uint32_t index, size_t length) { |
| if (length == 0) { |
| return false; |
| } |
| NvSpace ns; |
| ns.data.resize(length, '\xff'); |
| ns.written = false; |
| nvram_map_[index] = ns; |
| return true; |
| } |
| |
| bool MockTpmNvram::FakeDestroyNvram(uint32_t index) { |
| auto it = nvram_map_.find(index); |
| if (it == nvram_map_.end()) { |
| return false; |
| } |
| nvram_map_.erase(it); |
| return true; |
| } |
| |
| bool MockTpmNvram::FakeWriteNvram(uint32_t index, const std::string& data) { |
| auto it = nvram_map_.find(index); |
| if (it == nvram_map_.end()) { |
| return false; |
| } |
| NvSpace& nv = it->second; |
| if (nv.written || nv.data.size() < data.size()) { |
| return false; |
| } |
| nv.data.replace(0, data.size(), data); |
| nv.written = true; |
| return true; |
| } |
| |
| bool MockTpmNvram::FakeReadNvram(uint32_t index, std::string* data) { |
| auto it = nvram_map_.find(index); |
| if (it == nvram_map_.end()) { |
| return false; |
| } |
| const NvSpace& nv = it->second; |
| if (!nv.written) { |
| return false; |
| } |
| data->assign(nv.data); |
| return true; |
| } |
| |
| bool MockTpmNvram::FakeIsNvramDefined(uint32_t index, bool* defined) { |
| *defined = (nvram_map_.find(index) != nvram_map_.end()); |
| return true; |
| } |
| |
| bool MockTpmNvram::FakeIsNvramLocked(uint32_t index, bool* locked) { |
| bool defined; |
| if (!IsNvramDefined(index, &defined) || !defined) { |
| return false; |
| } |
| *locked = nvram_map_[index].written; |
| return true; |
| } |
| |
| bool MockTpmNvram::FakeGetNvramSize(uint32_t index, size_t* size) { |
| bool defined; |
| if (!IsNvramDefined(index, &defined) || !defined) { |
| return false; |
| } |
| *size = nvram_map_[index].data.size(); |
| return true; |
| } |
| |
| } // namespace tpm_manager |