1 //
2 // Copyright (C) 2015 The Android Open Source Project
3 //
4 // Licensed under the Apache License, Version 2.0 (the "License");
5 // you may not use this file except in compliance with the License.
6 // You may obtain a copy of the License at
7 //
8 //      http://www.apache.org/licenses/LICENSE-2.0
9 //
10 // Unless required by applicable law or agreed to in writing, software
11 // distributed under the License is distributed on an "AS IS" BASIS,
12 // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 // See the License for the specific language governing permissions and
14 // limitations under the License.
15 //
16 
17 #include "tpm_manager/server/mock_tpm_nvram.h"
18 
19 namespace tpm_manager {
20 
21 using testing::_;
22 using testing::Invoke;
23 using testing::Return;
24 
MockTpmNvram()25 MockTpmNvram::MockTpmNvram() {
26   ON_CALL(*this, DefineNvram(_, _))
27       .WillByDefault(Invoke(this, &MockTpmNvram::FakeDefineNvram));
28   ON_CALL(*this, DestroyNvram(_))
29       .WillByDefault(Invoke(this, &MockTpmNvram::FakeDestroyNvram));
30   ON_CALL(*this, WriteNvram(_, _))
31       .WillByDefault(Invoke(this, &MockTpmNvram::FakeWriteNvram));
32   ON_CALL(*this, ReadNvram(_, _))
33       .WillByDefault(Invoke(this, &MockTpmNvram::FakeReadNvram));
34   ON_CALL(*this, IsNvramDefined(_, _))
35       .WillByDefault(Invoke(this, &MockTpmNvram::FakeIsNvramDefined));
36   ON_CALL(*this, IsNvramLocked(_, _))
37       .WillByDefault(Invoke(this, &MockTpmNvram::FakeIsNvramLocked));
38   ON_CALL(*this, GetNvramSize(_, _))
39       .WillByDefault(Invoke(this, &MockTpmNvram::FakeGetNvramSize));
40 }
41 
~MockTpmNvram()42 MockTpmNvram::~MockTpmNvram() {}
43 
FakeDefineNvram(uint32_t index,size_t length)44 bool MockTpmNvram::FakeDefineNvram(uint32_t index, size_t length) {
45   if (length == 0) {
46     return false;
47   }
48   NvSpace ns;
49   ns.data.resize(length, '\xff');
50   ns.written = false;
51   nvram_map_[index] = ns;
52   return true;
53 }
54 
FakeDestroyNvram(uint32_t index)55 bool MockTpmNvram::FakeDestroyNvram(uint32_t index) {
56   auto it = nvram_map_.find(index);
57   if (it == nvram_map_.end()) {
58     return false;
59   }
60   nvram_map_.erase(it);
61   return true;
62 }
63 
FakeWriteNvram(uint32_t index,const std::string & data)64 bool MockTpmNvram::FakeWriteNvram(uint32_t index, const std::string& data) {
65   auto it = nvram_map_.find(index);
66   if (it == nvram_map_.end()) {
67     return false;
68   }
69   NvSpace& nv = it->second;
70   if (nv.written || nv.data.size() < data.size()) {
71     return false;
72   }
73   nv.data.replace(0, data.size(), data);
74   nv.written = true;
75   return true;
76 }
77 
FakeReadNvram(uint32_t index,std::string * data)78 bool MockTpmNvram::FakeReadNvram(uint32_t index, std::string* data) {
79   auto it = nvram_map_.find(index);
80   if (it == nvram_map_.end()) {
81     return false;
82   }
83   const NvSpace& nv = it->second;
84   if (!nv.written) {
85     return false;
86   }
87   data->assign(nv.data);
88   return true;
89 }
90 
FakeIsNvramDefined(uint32_t index,bool * defined)91 bool MockTpmNvram::FakeIsNvramDefined(uint32_t index, bool* defined) {
92   *defined = (nvram_map_.find(index) != nvram_map_.end());
93   return true;
94 }
95 
FakeIsNvramLocked(uint32_t index,bool * locked)96 bool MockTpmNvram::FakeIsNvramLocked(uint32_t index, bool* locked) {
97   bool defined;
98   if (!IsNvramDefined(index, &defined) || !defined) {
99     return false;
100   }
101   *locked = nvram_map_[index].written;
102   return true;
103 }
104 
FakeGetNvramSize(uint32_t index,size_t * size)105 bool MockTpmNvram::FakeGetNvramSize(uint32_t index, size_t* size) {
106   bool defined;
107   if (!IsNvramDefined(index, &defined) || !defined) {
108     return false;
109   }
110   *size = nvram_map_[index].data.size();
111   return true;
112 }
113 
114 }  // namespace tpm_manager
115