1811b136ab381658b7ec80aff885f80db495424d2Darren Krahn//
2811b136ab381658b7ec80aff885f80db495424d2Darren Krahn// Copyright (C) 2016 The Android Open Source Project
3811b136ab381658b7ec80aff885f80db495424d2Darren Krahn//
4811b136ab381658b7ec80aff885f80db495424d2Darren Krahn// Licensed under the Apache License, Version 2.0 (the "License");
5811b136ab381658b7ec80aff885f80db495424d2Darren Krahn// you may not use this file except in compliance with the License.
6811b136ab381658b7ec80aff885f80db495424d2Darren Krahn// You may obtain a copy of the License at
7811b136ab381658b7ec80aff885f80db495424d2Darren Krahn//
8811b136ab381658b7ec80aff885f80db495424d2Darren Krahn//      http://www.apache.org/licenses/LICENSE-2.0
9811b136ab381658b7ec80aff885f80db495424d2Darren Krahn//
10811b136ab381658b7ec80aff885f80db495424d2Darren Krahn// Unless required by applicable law or agreed to in writing, software
11811b136ab381658b7ec80aff885f80db495424d2Darren Krahn// distributed under the License is distributed on an "AS IS" BASIS,
12811b136ab381658b7ec80aff885f80db495424d2Darren Krahn// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13811b136ab381658b7ec80aff885f80db495424d2Darren Krahn// See the License for the specific language governing permissions and
14811b136ab381658b7ec80aff885f80db495424d2Darren Krahn// limitations under the License.
15811b136ab381658b7ec80aff885f80db495424d2Darren Krahn//
16811b136ab381658b7ec80aff885f80db495424d2Darren Krahn
17811b136ab381658b7ec80aff885f80db495424d2Darren Krahn#include <algorithm>
18811b136ab381658b7ec80aff885f80db495424d2Darren Krahn#include <string>
19811b136ab381658b7ec80aff885f80db495424d2Darren Krahn#include <vector>
20811b136ab381658b7ec80aff885f80db495424d2Darren Krahn
21811b136ab381658b7ec80aff885f80db495424d2Darren Krahn#include <android-base/logging.h>
22811b136ab381658b7ec80aff885f80db495424d2Darren Krahn#include <android-base/macros.h>
23811b136ab381658b7ec80aff885f80db495424d2Darren Krahn#include <gtest/gtest.h>
24811b136ab381658b7ec80aff885f80db495424d2Darren Krahn#include <hardware/nvram.h>
25811b136ab381658b7ec80aff885f80db495424d2Darren Krahn#include <openssl/sha.h>
26811b136ab381658b7ec80aff885f80db495424d2Darren Krahn
27811b136ab381658b7ec80aff885f80db495424d2Darren Krahn#include "nvram/hal/tests/scoped_nvram_device.h"
28811b136ab381658b7ec80aff885f80db495424d2Darren Krahn
29811b136ab381658b7ec80aff885f80db495424d2Darren Krahnnamespace {
30811b136ab381658b7ec80aff885f80db495424d2Darren Krahn
31811b136ab381658b7ec80aff885f80db495424d2Darren Krahnconstexpr uint32_t kTestIndex1 = 0xDEAD0001;
32811b136ab381658b7ec80aff885f80db495424d2Darren Krahnconstexpr uint32_t kTestIndex2 = 0xDEAD0002;
33811b136ab381658b7ec80aff885f80db495424d2Darren Krahnconstexpr uint32_t kTestIndexNeverExists = 0xDEAD0003;
34811b136ab381658b7ec80aff885f80db495424d2Darren Krahn// Once we run a test that locks writing, that space is burned until reboot.
35811b136ab381658b7ec80aff885f80db495424d2Darren Krahn// This value is the base index from which to dynamically burn spaces.
36811b136ab381658b7ec80aff885f80db495424d2Darren Krahnconstexpr uint32_t kTestIndexBurnBase = 0xDEAD0010;
37811b136ab381658b7ec80aff885f80db495424d2Darren Krahnconstexpr uint32_t kTestIndexBurnMax = 0xDEAD00FF;
38811b136ab381658b7ec80aff885f80db495424d2Darren Krahnconstexpr nvram_control_t kDefaultControls[] = {NV_CONTROL_BOOT_WRITE_LOCK,
39811b136ab381658b7ec80aff885f80db495424d2Darren Krahn                                                NV_CONTROL_BOOT_READ_LOCK};
40811b136ab381658b7ec80aff885f80db495424d2Darren Krahnconstexpr char kNoAuth[] = "";
41811b136ab381658b7ec80aff885f80db495424d2Darren Krahn// If using authorization with an index returned by GetNextBurnSpace use this
42811b136ab381658b7ec80aff885f80db495424d2Darren Krahn// as the value so the space can be cleaned up later.
43811b136ab381658b7ec80aff885f80db495424d2Darren Krahnconstexpr char kBurnSpaceAuth[] = "hal_test_burn";
44811b136ab381658b7ec80aff885f80db495424d2Darren Krahn
45811b136ab381658b7ec80aff885f80db495424d2Darren Krahn// Returns true if |target| contains |value|.
46811b136ab381658b7ec80aff885f80db495424d2Darren Krahntemplate <typename T>
47811b136ab381658b7ec80aff885f80db495424d2Darren Krahnbool Contains(T value, const std::vector<T>& target) {
48811b136ab381658b7ec80aff885f80db495424d2Darren Krahn  return (std::find(target.begin(), target.end(), value) != target.end());
49811b136ab381658b7ec80aff885f80db495424d2Darren Krahn}
50811b136ab381658b7ec80aff885f80db495424d2Darren Krahn
51811b136ab381658b7ec80aff885f80db495424d2Darren Krahn// Returns true if |target| contains all of |values|.
52811b136ab381658b7ec80aff885f80db495424d2Darren Krahntemplate <typename T>
53811b136ab381658b7ec80aff885f80db495424d2Darren Krahnbool ContainsAll(const std::vector<T>& values,
54811b136ab381658b7ec80aff885f80db495424d2Darren Krahn                 const std::vector<T>& target) {
55811b136ab381658b7ec80aff885f80db495424d2Darren Krahn  return std::all_of(values.begin(), values.end(),
56811b136ab381658b7ec80aff885f80db495424d2Darren Krahn                     [target](T value) { return Contains(value, target); });
57811b136ab381658b7ec80aff885f80db495424d2Darren Krahn}
58811b136ab381658b7ec80aff885f80db495424d2Darren Krahn
59811b136ab381658b7ec80aff885f80db495424d2Darren Krahn// Adds a few safety checks so tests don't get hardware into a state where it
60811b136ab381658b7ec80aff885f80db495424d2Darren Krahn// needs factory reset.
61811b136ab381658b7ec80aff885f80db495424d2Darren Krahnclass SafeScopedNvramDevice : public nvram::ScopedNvramDevice {
62811b136ab381658b7ec80aff885f80db495424d2Darren Krahn public:
63811b136ab381658b7ec80aff885f80db495424d2Darren Krahn  nvram_result_t CreateSpace(uint32_t index,
64811b136ab381658b7ec80aff885f80db495424d2Darren Krahn                             uint64_t size_in_bytes,
65811b136ab381658b7ec80aff885f80db495424d2Darren Krahn                             const std::vector<nvram_control_t>& control_list,
66811b136ab381658b7ec80aff885f80db495424d2Darren Krahn                             const std::string& authorization_value) override {
67811b136ab381658b7ec80aff885f80db495424d2Darren Krahn    CHECK(!Contains(NV_CONTROL_PERSISTENT_WRITE_LOCK, control_list))
68811b136ab381658b7ec80aff885f80db495424d2Darren Krahn        << "Do not use NV_CONTROL_PERSISTENT_WRITE_LOCK in tests.";
69811b136ab381658b7ec80aff885f80db495424d2Darren Krahn    CHECK(!Contains(NV_CONTROL_BOOT_WRITE_LOCK, control_list) ||
70811b136ab381658b7ec80aff885f80db495424d2Darren Krahn          !Contains(NV_CONTROL_WRITE_AUTHORIZATION, control_list) ||
71811b136ab381658b7ec80aff885f80db495424d2Darren Krahn          authorization_value == kNoAuth ||
72811b136ab381658b7ec80aff885f80db495424d2Darren Krahn          authorization_value == kBurnSpaceAuth)
73811b136ab381658b7ec80aff885f80db495424d2Darren Krahn        << "Do not lock spaces with unknown authorization values.";
74811b136ab381658b7ec80aff885f80db495424d2Darren Krahn    return nvram::ScopedNvramDevice::CreateSpace(
75811b136ab381658b7ec80aff885f80db495424d2Darren Krahn        index, size_in_bytes, control_list, authorization_value);
76811b136ab381658b7ec80aff885f80db495424d2Darren Krahn  }
77811b136ab381658b7ec80aff885f80db495424d2Darren Krahn
78811b136ab381658b7ec80aff885f80db495424d2Darren Krahn  nvram_result_t DisableCreate() override {
79811b136ab381658b7ec80aff885f80db495424d2Darren Krahn    LOG(FATAL) << "Do not use DisableCreate in tests.";
80811b136ab381658b7ec80aff885f80db495424d2Darren Krahn    return NV_RESULT_OPERATION_DISABLED;
81811b136ab381658b7ec80aff885f80db495424d2Darren Krahn  }
82811b136ab381658b7ec80aff885f80db495424d2Darren Krahn};
83811b136ab381658b7ec80aff885f80db495424d2Darren Krahn
84811b136ab381658b7ec80aff885f80db495424d2Darren Krahnclass ScopedNvramSpace {
85811b136ab381658b7ec80aff885f80db495424d2Darren Krahn public:
86811b136ab381658b7ec80aff885f80db495424d2Darren Krahn  ScopedNvramSpace(SafeScopedNvramDevice* device, uint32_t index, uint32_t size)
87811b136ab381658b7ec80aff885f80db495424d2Darren Krahn      : ScopedNvramSpace(device,
88811b136ab381658b7ec80aff885f80db495424d2Darren Krahn                         index,
89811b136ab381658b7ec80aff885f80db495424d2Darren Krahn                         size,
90811b136ab381658b7ec80aff885f80db495424d2Darren Krahn                         std::vector<nvram_control_t>(
91811b136ab381658b7ec80aff885f80db495424d2Darren Krahn                             &kDefaultControls[0],
92811b136ab381658b7ec80aff885f80db495424d2Darren Krahn                             &kDefaultControls[arraysize(kDefaultControls)]),
93811b136ab381658b7ec80aff885f80db495424d2Darren Krahn                         kNoAuth) {}
94811b136ab381658b7ec80aff885f80db495424d2Darren Krahn
95811b136ab381658b7ec80aff885f80db495424d2Darren Krahn  ScopedNvramSpace(SafeScopedNvramDevice* device,
96811b136ab381658b7ec80aff885f80db495424d2Darren Krahn                   uint32_t index,
97811b136ab381658b7ec80aff885f80db495424d2Darren Krahn                   uint32_t size,
98811b136ab381658b7ec80aff885f80db495424d2Darren Krahn                   const std::vector<nvram_control_t>& control_list)
99811b136ab381658b7ec80aff885f80db495424d2Darren Krahn      : ScopedNvramSpace(device,
100811b136ab381658b7ec80aff885f80db495424d2Darren Krahn                         index,
101811b136ab381658b7ec80aff885f80db495424d2Darren Krahn                         size,
102811b136ab381658b7ec80aff885f80db495424d2Darren Krahn                         control_list,
103811b136ab381658b7ec80aff885f80db495424d2Darren Krahn                         kNoAuth) {}
104811b136ab381658b7ec80aff885f80db495424d2Darren Krahn
105811b136ab381658b7ec80aff885f80db495424d2Darren Krahn  ScopedNvramSpace(SafeScopedNvramDevice* device,
106811b136ab381658b7ec80aff885f80db495424d2Darren Krahn                   uint32_t index,
107811b136ab381658b7ec80aff885f80db495424d2Darren Krahn                   uint32_t size,
108811b136ab381658b7ec80aff885f80db495424d2Darren Krahn                   const std::vector<nvram_control_t>& control_list,
109811b136ab381658b7ec80aff885f80db495424d2Darren Krahn                   const std::string& authorization_value)
110811b136ab381658b7ec80aff885f80db495424d2Darren Krahn      : device_(device),
111811b136ab381658b7ec80aff885f80db495424d2Darren Krahn        index_(index),
112811b136ab381658b7ec80aff885f80db495424d2Darren Krahn        authorization_value_(authorization_value) {
113811b136ab381658b7ec80aff885f80db495424d2Darren Krahn    Create(size, control_list);
114811b136ab381658b7ec80aff885f80db495424d2Darren Krahn  }
115811b136ab381658b7ec80aff885f80db495424d2Darren Krahn
116811b136ab381658b7ec80aff885f80db495424d2Darren Krahn  ~ScopedNvramSpace() { Delete(); }
117811b136ab381658b7ec80aff885f80db495424d2Darren Krahn
118811b136ab381658b7ec80aff885f80db495424d2Darren Krahn private:
119811b136ab381658b7ec80aff885f80db495424d2Darren Krahn  void Create(uint32_t size,
120811b136ab381658b7ec80aff885f80db495424d2Darren Krahn              const std::vector<nvram_control_t>& control_list) {
121811b136ab381658b7ec80aff885f80db495424d2Darren Krahn    ASSERT_EQ(
122811b136ab381658b7ec80aff885f80db495424d2Darren Krahn        NV_RESULT_SUCCESS,
123811b136ab381658b7ec80aff885f80db495424d2Darren Krahn        device_->CreateSpace(index_, size, control_list, authorization_value_));
124811b136ab381658b7ec80aff885f80db495424d2Darren Krahn  }
125811b136ab381658b7ec80aff885f80db495424d2Darren Krahn
126811b136ab381658b7ec80aff885f80db495424d2Darren Krahn  void Delete() {
127811b136ab381658b7ec80aff885f80db495424d2Darren Krahn    ASSERT_EQ(NV_RESULT_SUCCESS,
128811b136ab381658b7ec80aff885f80db495424d2Darren Krahn              device_->DeleteSpace(index_, authorization_value_));
129811b136ab381658b7ec80aff885f80db495424d2Darren Krahn  }
130811b136ab381658b7ec80aff885f80db495424d2Darren Krahn
131811b136ab381658b7ec80aff885f80db495424d2Darren Krahn  SafeScopedNvramDevice* device_;
132811b136ab381658b7ec80aff885f80db495424d2Darren Krahn  uint32_t index_;
133811b136ab381658b7ec80aff885f80db495424d2Darren Krahn  std::string authorization_value_;
134811b136ab381658b7ec80aff885f80db495424d2Darren Krahn};
135811b136ab381658b7ec80aff885f80db495424d2Darren Krahn
136811b136ab381658b7ec80aff885f80db495424d2Darren Krahn// Remove all unlocked burn spaces. Returns false on failure.
137811b136ab381658b7ec80aff885f80db495424d2Darren Krahnbool CleanBurnSpaces(SafeScopedNvramDevice* device) {
138811b136ab381658b7ec80aff885f80db495424d2Darren Krahn  // Burned spaces will only be available for cleanup after reboot so there's no
139811b136ab381658b7ec80aff885f80db495424d2Darren Krahn  // sense in attempting cleanup more than once.
140811b136ab381658b7ec80aff885f80db495424d2Darren Krahn  static bool cleaned = false;
141811b136ab381658b7ec80aff885f80db495424d2Darren Krahn  if (cleaned) {
142811b136ab381658b7ec80aff885f80db495424d2Darren Krahn    return true;
143811b136ab381658b7ec80aff885f80db495424d2Darren Krahn  }
144811b136ab381658b7ec80aff885f80db495424d2Darren Krahn  bool success = true;
145811b136ab381658b7ec80aff885f80db495424d2Darren Krahn  cleaned = true;
146811b136ab381658b7ec80aff885f80db495424d2Darren Krahn  std::vector<uint32_t> space_index_list;
147811b136ab381658b7ec80aff885f80db495424d2Darren Krahn  if (device->GetSpaceList(&space_index_list) != NV_RESULT_SUCCESS) {
148811b136ab381658b7ec80aff885f80db495424d2Darren Krahn    return false;
149811b136ab381658b7ec80aff885f80db495424d2Darren Krahn  }
150811b136ab381658b7ec80aff885f80db495424d2Darren Krahn  for (uint32_t index : space_index_list) {
151811b136ab381658b7ec80aff885f80db495424d2Darren Krahn    if (index >= kTestIndexBurnBase && index <= kTestIndexBurnMax) {
152811b136ab381658b7ec80aff885f80db495424d2Darren Krahn      int write_lock, read_lock;
153811b136ab381658b7ec80aff885f80db495424d2Darren Krahn      if (device->IsSpaceLocked(index, &write_lock, &read_lock) !=
154811b136ab381658b7ec80aff885f80db495424d2Darren Krahn          NV_RESULT_SUCCESS) {
155811b136ab381658b7ec80aff885f80db495424d2Darren Krahn        success = false;
156811b136ab381658b7ec80aff885f80db495424d2Darren Krahn        continue;
157811b136ab381658b7ec80aff885f80db495424d2Darren Krahn      }
158811b136ab381658b7ec80aff885f80db495424d2Darren Krahn      if (!write_lock) {
159811b136ab381658b7ec80aff885f80db495424d2Darren Krahn        nvram_result_t result = device->DeleteSpace(index, kNoAuth);
160811b136ab381658b7ec80aff885f80db495424d2Darren Krahn        if (result == NV_RESULT_ACCESS_DENIED) {
161811b136ab381658b7ec80aff885f80db495424d2Darren Krahn          result = device->DeleteSpace(index, kBurnSpaceAuth);
162811b136ab381658b7ec80aff885f80db495424d2Darren Krahn        }
163811b136ab381658b7ec80aff885f80db495424d2Darren Krahn        if (result != NV_RESULT_SUCCESS) {
164811b136ab381658b7ec80aff885f80db495424d2Darren Krahn          success = false;
165811b136ab381658b7ec80aff885f80db495424d2Darren Krahn          continue;
166811b136ab381658b7ec80aff885f80db495424d2Darren Krahn        }
167811b136ab381658b7ec80aff885f80db495424d2Darren Krahn      }
168811b136ab381658b7ec80aff885f80db495424d2Darren Krahn    }
169811b136ab381658b7ec80aff885f80db495424d2Darren Krahn  }
170811b136ab381658b7ec80aff885f80db495424d2Darren Krahn  return success;
171811b136ab381658b7ec80aff885f80db495424d2Darren Krahn}
172811b136ab381658b7ec80aff885f80db495424d2Darren Krahn
173811b136ab381658b7ec80aff885f80db495424d2Darren Krahn// Returns the next available burn space index. If using authorization, the
174811b136ab381658b7ec80aff885f80db495424d2Darren Krahn// value MUST be kBurnSpaceAuth.
175811b136ab381658b7ec80aff885f80db495424d2Darren Krahnbool GetNextBurnSpace(SafeScopedNvramDevice* device, uint32_t* index) {
176811b136ab381658b7ec80aff885f80db495424d2Darren Krahn  if (!CleanBurnSpaces(device)) {
177811b136ab381658b7ec80aff885f80db495424d2Darren Krahn    return false;
178811b136ab381658b7ec80aff885f80db495424d2Darren Krahn  }
179811b136ab381658b7ec80aff885f80db495424d2Darren Krahn  std::vector<uint32_t> space_index_list;
180811b136ab381658b7ec80aff885f80db495424d2Darren Krahn  if (device->GetSpaceList(&space_index_list) != NV_RESULT_SUCCESS) {
181811b136ab381658b7ec80aff885f80db495424d2Darren Krahn    return false;
182811b136ab381658b7ec80aff885f80db495424d2Darren Krahn  }
183811b136ab381658b7ec80aff885f80db495424d2Darren Krahn  *index = kTestIndexBurnBase;
184811b136ab381658b7ec80aff885f80db495424d2Darren Krahn  while (Contains(*index, space_index_list)) {
185811b136ab381658b7ec80aff885f80db495424d2Darren Krahn    (*index)++;
186811b136ab381658b7ec80aff885f80db495424d2Darren Krahn  }
187811b136ab381658b7ec80aff885f80db495424d2Darren Krahn  if (*index >= kTestIndexBurnMax) {
188811b136ab381658b7ec80aff885f80db495424d2Darren Krahn    return false;
189811b136ab381658b7ec80aff885f80db495424d2Darren Krahn  }
190811b136ab381658b7ec80aff885f80db495424d2Darren Krahn  return true;
191811b136ab381658b7ec80aff885f80db495424d2Darren Krahn}
192811b136ab381658b7ec80aff885f80db495424d2Darren Krahn
193811b136ab381658b7ec80aff885f80db495424d2Darren Krahnstd::string SHA256HashString(const std::string& input) {
194811b136ab381658b7ec80aff885f80db495424d2Darren Krahn  uint8_t hash[SHA256_DIGEST_LENGTH];
195811b136ab381658b7ec80aff885f80db495424d2Darren Krahn  SHA256(reinterpret_cast<const uint8_t*>(input.data()), input.size(), hash);
196811b136ab381658b7ec80aff885f80db495424d2Darren Krahn  return std::string(reinterpret_cast<const char*>(hash), SHA256_DIGEST_LENGTH);
197811b136ab381658b7ec80aff885f80db495424d2Darren Krahn}
198811b136ab381658b7ec80aff885f80db495424d2Darren Krahn
199811b136ab381658b7ec80aff885f80db495424d2Darren Krahn}  // namespace
200811b136ab381658b7ec80aff885f80db495424d2Darren Krahn
201811b136ab381658b7ec80aff885f80db495424d2Darren Krahnnamespace nvram {
202811b136ab381658b7ec80aff885f80db495424d2Darren Krahn
203811b136ab381658b7ec80aff885f80db495424d2Darren KrahnTEST(NVRAMModuleTest, TotalSize) {
204811b136ab381658b7ec80aff885f80db495424d2Darren Krahn  SafeScopedNvramDevice device;
205811b136ab381658b7ec80aff885f80db495424d2Darren Krahn  uint64_t total_size = 0;
206811b136ab381658b7ec80aff885f80db495424d2Darren Krahn  ASSERT_EQ(NV_RESULT_SUCCESS, device.GetTotalSizeInBytes(&total_size));
207811b136ab381658b7ec80aff885f80db495424d2Darren Krahn  EXPECT_LE(2048u, total_size);
208811b136ab381658b7ec80aff885f80db495424d2Darren Krahn};
209811b136ab381658b7ec80aff885f80db495424d2Darren Krahn
210811b136ab381658b7ec80aff885f80db495424d2Darren KrahnTEST(NVRAMModuleTest, AvailableSize) {
211811b136ab381658b7ec80aff885f80db495424d2Darren Krahn  SafeScopedNvramDevice device;
212811b136ab381658b7ec80aff885f80db495424d2Darren Krahn  uint64_t available_size = 0;
213811b136ab381658b7ec80aff885f80db495424d2Darren Krahn  ASSERT_EQ(NV_RESULT_SUCCESS, device.GetAvailableSizeInBytes(&available_size));
214811b136ab381658b7ec80aff885f80db495424d2Darren Krahn  uint64_t total_size = 0;
215811b136ab381658b7ec80aff885f80db495424d2Darren Krahn  ASSERT_EQ(NV_RESULT_SUCCESS, device.GetTotalSizeInBytes(&total_size));
216811b136ab381658b7ec80aff885f80db495424d2Darren Krahn  EXPECT_LE(available_size, total_size);
217811b136ab381658b7ec80aff885f80db495424d2Darren Krahn}
218811b136ab381658b7ec80aff885f80db495424d2Darren Krahn
219088471151b7784cef5a8555e1f155454df106113Darren KrahnTEST(NVRAMModuleTest, MaxSpaceSize) {
220088471151b7784cef5a8555e1f155454df106113Darren Krahn  SafeScopedNvramDevice device;
221088471151b7784cef5a8555e1f155454df106113Darren Krahn  uint64_t max_space_size = 0;
222088471151b7784cef5a8555e1f155454df106113Darren Krahn  ASSERT_EQ(NV_RESULT_SUCCESS, device.GetMaxSpaceSizeInBytes(&max_space_size));
223088471151b7784cef5a8555e1f155454df106113Darren Krahn  uint64_t total_size = 0;
224088471151b7784cef5a8555e1f155454df106113Darren Krahn  ASSERT_EQ(NV_RESULT_SUCCESS, device.GetTotalSizeInBytes(&total_size));
225088471151b7784cef5a8555e1f155454df106113Darren Krahn  EXPECT_LE(max_space_size, total_size);
226088471151b7784cef5a8555e1f155454df106113Darren Krahn  EXPECT_GE(max_space_size, 32u);
227088471151b7784cef5a8555e1f155454df106113Darren Krahn}
228088471151b7784cef5a8555e1f155454df106113Darren Krahn
229811b136ab381658b7ec80aff885f80db495424d2Darren KrahnTEST(NVRAMModuleTest, MaxSpaces) {
230811b136ab381658b7ec80aff885f80db495424d2Darren Krahn  SafeScopedNvramDevice device;
231811b136ab381658b7ec80aff885f80db495424d2Darren Krahn  uint32_t num_spaces = 0;
232811b136ab381658b7ec80aff885f80db495424d2Darren Krahn  ASSERT_EQ(NV_RESULT_SUCCESS, device.GetMaxSpaces(&num_spaces));
233811b136ab381658b7ec80aff885f80db495424d2Darren Krahn  EXPECT_LE(8u, num_spaces);
234811b136ab381658b7ec80aff885f80db495424d2Darren Krahn}
235811b136ab381658b7ec80aff885f80db495424d2Darren Krahn
236811b136ab381658b7ec80aff885f80db495424d2Darren KrahnTEST(NVRAMModuleTest, SpaceList) {
237811b136ab381658b7ec80aff885f80db495424d2Darren Krahn  SafeScopedNvramDevice device;
238811b136ab381658b7ec80aff885f80db495424d2Darren Krahn  uint32_t max_spaces = 0;
239811b136ab381658b7ec80aff885f80db495424d2Darren Krahn  ASSERT_EQ(NV_RESULT_SUCCESS, device.GetMaxSpaces(&max_spaces));
240811b136ab381658b7ec80aff885f80db495424d2Darren Krahn  std::vector<uint32_t> space_index_list;
241811b136ab381658b7ec80aff885f80db495424d2Darren Krahn  ASSERT_EQ(NV_RESULT_SUCCESS, device.GetSpaceList(&space_index_list));
242811b136ab381658b7ec80aff885f80db495424d2Darren Krahn  ASSERT_LE(space_index_list.size(), max_spaces);
243811b136ab381658b7ec80aff885f80db495424d2Darren Krahn
244811b136ab381658b7ec80aff885f80db495424d2Darren Krahn  // Add a test space and check it gets reported.
245811b136ab381658b7ec80aff885f80db495424d2Darren Krahn  {
246811b136ab381658b7ec80aff885f80db495424d2Darren Krahn    ScopedNvramSpace space(&device, kTestIndex1, 32);
247811b136ab381658b7ec80aff885f80db495424d2Darren Krahn    std::vector<uint32_t> space_index_list2;
248811b136ab381658b7ec80aff885f80db495424d2Darren Krahn    ASSERT_EQ(NV_RESULT_SUCCESS, device.GetSpaceList(&space_index_list2));
249811b136ab381658b7ec80aff885f80db495424d2Darren Krahn    ASSERT_EQ(space_index_list.size() + 1, space_index_list2.size());
250811b136ab381658b7ec80aff885f80db495424d2Darren Krahn    EXPECT_TRUE(ContainsAll(space_index_list, space_index_list2));
251811b136ab381658b7ec80aff885f80db495424d2Darren Krahn    EXPECT_TRUE(Contains(kTestIndex1, space_index_list2));
252811b136ab381658b7ec80aff885f80db495424d2Darren Krahn  }
253811b136ab381658b7ec80aff885f80db495424d2Darren Krahn
254811b136ab381658b7ec80aff885f80db495424d2Darren Krahn  // Check we're back to the original list.
255811b136ab381658b7ec80aff885f80db495424d2Darren Krahn  std::vector<uint32_t> space_index_list3;
256811b136ab381658b7ec80aff885f80db495424d2Darren Krahn  ASSERT_EQ(NV_RESULT_SUCCESS, device.GetSpaceList(&space_index_list3));
257811b136ab381658b7ec80aff885f80db495424d2Darren Krahn  ASSERT_EQ(space_index_list.size(), space_index_list3.size());
258811b136ab381658b7ec80aff885f80db495424d2Darren Krahn  EXPECT_TRUE(ContainsAll(space_index_list, space_index_list3));
259811b136ab381658b7ec80aff885f80db495424d2Darren Krahn  EXPECT_FALSE(Contains(kTestIndex1, space_index_list3));
260811b136ab381658b7ec80aff885f80db495424d2Darren Krahn}
261811b136ab381658b7ec80aff885f80db495424d2Darren Krahn
262811b136ab381658b7ec80aff885f80db495424d2Darren KrahnTEST(NVRAMModuleTest, SpaceSize) {
263811b136ab381658b7ec80aff885f80db495424d2Darren Krahn  SafeScopedNvramDevice device;
264811b136ab381658b7ec80aff885f80db495424d2Darren Krahn  ScopedNvramSpace space(&device, kTestIndex1, 17);
265088471151b7784cef5a8555e1f155454df106113Darren Krahn  ScopedNvramSpace space2(&device, kTestIndex2, 32);
266811b136ab381658b7ec80aff885f80db495424d2Darren Krahn  uint64_t size = 0;
267811b136ab381658b7ec80aff885f80db495424d2Darren Krahn  ASSERT_EQ(NV_RESULT_SUCCESS, device.GetSpaceSize(kTestIndex1, &size));
268811b136ab381658b7ec80aff885f80db495424d2Darren Krahn  EXPECT_EQ(17u, size);
269811b136ab381658b7ec80aff885f80db495424d2Darren Krahn  ASSERT_EQ(NV_RESULT_SUCCESS, device.GetSpaceSize(kTestIndex2, &size));
270088471151b7784cef5a8555e1f155454df106113Darren Krahn  EXPECT_EQ(32u, size);
271811b136ab381658b7ec80aff885f80db495424d2Darren Krahn  EXPECT_EQ(NV_RESULT_SPACE_DOES_NOT_EXIST,
272811b136ab381658b7ec80aff885f80db495424d2Darren Krahn            device.GetSpaceSize(kTestIndexNeverExists, &size));
273811b136ab381658b7ec80aff885f80db495424d2Darren Krahn}
274811b136ab381658b7ec80aff885f80db495424d2Darren Krahn
275811b136ab381658b7ec80aff885f80db495424d2Darren KrahnTEST(NVRAMModuleTest, SpaceControls) {
276811b136ab381658b7ec80aff885f80db495424d2Darren Krahn  SafeScopedNvramDevice device;
277811b136ab381658b7ec80aff885f80db495424d2Darren Krahn  ScopedNvramSpace space(&device, kTestIndex1, 32);
278811b136ab381658b7ec80aff885f80db495424d2Darren Krahn  std::vector<nvram_control_t> expected_control_list(
279811b136ab381658b7ec80aff885f80db495424d2Darren Krahn      &kDefaultControls[0], &kDefaultControls[arraysize(kDefaultControls)]);
280811b136ab381658b7ec80aff885f80db495424d2Darren Krahn  std::vector<nvram_control_t> control_list;
281811b136ab381658b7ec80aff885f80db495424d2Darren Krahn  ASSERT_EQ(NV_RESULT_SUCCESS,
282811b136ab381658b7ec80aff885f80db495424d2Darren Krahn            device.GetSpaceControls(kTestIndex1, &control_list));
283811b136ab381658b7ec80aff885f80db495424d2Darren Krahn  ASSERT_EQ(expected_control_list.size(), control_list.size());
284811b136ab381658b7ec80aff885f80db495424d2Darren Krahn  EXPECT_TRUE(ContainsAll(expected_control_list, control_list));
285811b136ab381658b7ec80aff885f80db495424d2Darren Krahn  EXPECT_EQ(NV_RESULT_SPACE_DOES_NOT_EXIST,
286811b136ab381658b7ec80aff885f80db495424d2Darren Krahn            device.GetSpaceControls(kTestIndexNeverExists, &control_list));
287811b136ab381658b7ec80aff885f80db495424d2Darren Krahn}
288811b136ab381658b7ec80aff885f80db495424d2Darren Krahn
289811b136ab381658b7ec80aff885f80db495424d2Darren KrahnTEST(NVRAMModuleTest, IsLocked) {
290811b136ab381658b7ec80aff885f80db495424d2Darren Krahn  SafeScopedNvramDevice device;
291811b136ab381658b7ec80aff885f80db495424d2Darren Krahn  ScopedNvramSpace space(&device, kTestIndex1, 32);
292811b136ab381658b7ec80aff885f80db495424d2Darren Krahn  int write_lock, read_lock;
293811b136ab381658b7ec80aff885f80db495424d2Darren Krahn  ASSERT_EQ(NV_RESULT_SUCCESS,
294811b136ab381658b7ec80aff885f80db495424d2Darren Krahn            device.IsSpaceLocked(kTestIndex1, &write_lock, &read_lock));
295811b136ab381658b7ec80aff885f80db495424d2Darren Krahn  EXPECT_FALSE(read_lock);
296811b136ab381658b7ec80aff885f80db495424d2Darren Krahn  EXPECT_FALSE(write_lock);
297811b136ab381658b7ec80aff885f80db495424d2Darren Krahn  ASSERT_EQ(NV_RESULT_SUCCESS, device.EnableReadLock(kTestIndex1, kNoAuth));
298811b136ab381658b7ec80aff885f80db495424d2Darren Krahn  ASSERT_EQ(NV_RESULT_SUCCESS,
299811b136ab381658b7ec80aff885f80db495424d2Darren Krahn            device.IsSpaceLocked(kTestIndex1, &write_lock, &read_lock));
300811b136ab381658b7ec80aff885f80db495424d2Darren Krahn  EXPECT_TRUE(read_lock);
301811b136ab381658b7ec80aff885f80db495424d2Darren Krahn  EXPECT_FALSE(write_lock);
302811b136ab381658b7ec80aff885f80db495424d2Darren Krahn  EXPECT_EQ(
303811b136ab381658b7ec80aff885f80db495424d2Darren Krahn      NV_RESULT_SPACE_DOES_NOT_EXIST,
304811b136ab381658b7ec80aff885f80db495424d2Darren Krahn      device.IsSpaceLocked(kTestIndexNeverExists, &write_lock, &read_lock));
305811b136ab381658b7ec80aff885f80db495424d2Darren Krahn}
306811b136ab381658b7ec80aff885f80db495424d2Darren Krahn
307811b136ab381658b7ec80aff885f80db495424d2Darren KrahnTEST(NVRAMModuleTest, CreateSmall) {
308811b136ab381658b7ec80aff885f80db495424d2Darren Krahn  SafeScopedNvramDevice device;
309811b136ab381658b7ec80aff885f80db495424d2Darren Krahn  ScopedNvramSpace space(&device, kTestIndex1, 1);
310811b136ab381658b7ec80aff885f80db495424d2Darren Krahn}
311811b136ab381658b7ec80aff885f80db495424d2Darren Krahn
312811b136ab381658b7ec80aff885f80db495424d2Darren KrahnTEST(NVRAMModuleTest, CreateLarge) {
313811b136ab381658b7ec80aff885f80db495424d2Darren Krahn  SafeScopedNvramDevice device;
314088471151b7784cef5a8555e1f155454df106113Darren Krahn  uint64_t max_space_size = 0;
315088471151b7784cef5a8555e1f155454df106113Darren Krahn  ASSERT_EQ(NV_RESULT_SUCCESS, device.GetMaxSpaceSizeInBytes(&max_space_size));
316088471151b7784cef5a8555e1f155454df106113Darren Krahn  uint64_t available_size = 0;
317088471151b7784cef5a8555e1f155454df106113Darren Krahn  ASSERT_EQ(NV_RESULT_SUCCESS, device.GetAvailableSizeInBytes(&available_size));
318088471151b7784cef5a8555e1f155454df106113Darren Krahn  ScopedNvramSpace space(&device, kTestIndex1,
319088471151b7784cef5a8555e1f155454df106113Darren Krahn                         std::min(max_space_size, available_size));
320811b136ab381658b7ec80aff885f80db495424d2Darren Krahn}
321811b136ab381658b7ec80aff885f80db495424d2Darren Krahn
322811b136ab381658b7ec80aff885f80db495424d2Darren KrahnTEST(NVRAMModuleTest, CreateWithCustomControls) {
323811b136ab381658b7ec80aff885f80db495424d2Darren Krahn  const std::vector<nvram_control_t> kControlList{
324811b136ab381658b7ec80aff885f80db495424d2Darren Krahn      NV_CONTROL_BOOT_WRITE_LOCK, NV_CONTROL_READ_AUTHORIZATION,
325811b136ab381658b7ec80aff885f80db495424d2Darren Krahn      NV_CONTROL_WRITE_EXTEND};
326811b136ab381658b7ec80aff885f80db495424d2Darren Krahn  SafeScopedNvramDevice device;
327811b136ab381658b7ec80aff885f80db495424d2Darren Krahn  ScopedNvramSpace space(&device, kTestIndex1, 32, kControlList);
328811b136ab381658b7ec80aff885f80db495424d2Darren Krahn  std::vector<nvram_control_t> control_list;
329811b136ab381658b7ec80aff885f80db495424d2Darren Krahn  ASSERT_EQ(NV_RESULT_SUCCESS,
330811b136ab381658b7ec80aff885f80db495424d2Darren Krahn            device.GetSpaceControls(kTestIndex1, &control_list));
331811b136ab381658b7ec80aff885f80db495424d2Darren Krahn  ASSERT_EQ(kControlList.size(), control_list.size());
332811b136ab381658b7ec80aff885f80db495424d2Darren Krahn  EXPECT_TRUE(ContainsAll(control_list, kControlList));
333811b136ab381658b7ec80aff885f80db495424d2Darren Krahn  EXPECT_TRUE(ContainsAll(kControlList, control_list));
334811b136ab381658b7ec80aff885f80db495424d2Darren Krahn}
335811b136ab381658b7ec80aff885f80db495424d2Darren Krahn
336811b136ab381658b7ec80aff885f80db495424d2Darren KrahnTEST(NVRAMModuleTest, CreateWithAuthorization) {
337811b136ab381658b7ec80aff885f80db495424d2Darren Krahn  SafeScopedNvramDevice device;
338811b136ab381658b7ec80aff885f80db495424d2Darren Krahn  std::string password = "hunter2";
339811b136ab381658b7ec80aff885f80db495424d2Darren Krahn  ScopedNvramSpace space(
340811b136ab381658b7ec80aff885f80db495424d2Darren Krahn      &device, kTestIndex1, 32,
341811b136ab381658b7ec80aff885f80db495424d2Darren Krahn      {NV_CONTROL_WRITE_AUTHORIZATION, NV_CONTROL_READ_AUTHORIZATION},
342811b136ab381658b7ec80aff885f80db495424d2Darren Krahn      password);
343811b136ab381658b7ec80aff885f80db495424d2Darren Krahn  std::string data = "test";
344811b136ab381658b7ec80aff885f80db495424d2Darren Krahn  std::string bad_password = "*******";
345811b136ab381658b7ec80aff885f80db495424d2Darren Krahn  EXPECT_EQ(NV_RESULT_ACCESS_DENIED,
346811b136ab381658b7ec80aff885f80db495424d2Darren Krahn            device.WriteSpace(kTestIndex1, data, bad_password));
347811b136ab381658b7ec80aff885f80db495424d2Darren Krahn  EXPECT_EQ(NV_RESULT_SUCCESS, device.WriteSpace(kTestIndex1, data, password));
348811b136ab381658b7ec80aff885f80db495424d2Darren Krahn}
349811b136ab381658b7ec80aff885f80db495424d2Darren Krahn
350811b136ab381658b7ec80aff885f80db495424d2Darren KrahnTEST(NVRAMModuleTest, CreateAlreadyExists) {
351811b136ab381658b7ec80aff885f80db495424d2Darren Krahn  SafeScopedNvramDevice device;
352811b136ab381658b7ec80aff885f80db495424d2Darren Krahn  ScopedNvramSpace space(&device, kTestIndex1, 32);
353811b136ab381658b7ec80aff885f80db495424d2Darren Krahn  EXPECT_EQ(NV_RESULT_SPACE_ALREADY_EXISTS,
354811b136ab381658b7ec80aff885f80db495424d2Darren Krahn            device.CreateSpace(kTestIndex1, 32, {}, kNoAuth));
355811b136ab381658b7ec80aff885f80db495424d2Darren Krahn}
356811b136ab381658b7ec80aff885f80db495424d2Darren Krahn
357811b136ab381658b7ec80aff885f80db495424d2Darren KrahnTEST(NVRAMModuleTest, Delete) {
358811b136ab381658b7ec80aff885f80db495424d2Darren Krahn  SafeScopedNvramDevice device;
359811b136ab381658b7ec80aff885f80db495424d2Darren Krahn  {
360811b136ab381658b7ec80aff885f80db495424d2Darren Krahn    ScopedNvramSpace space(&device, kTestIndex1, 32);
361811b136ab381658b7ec80aff885f80db495424d2Darren Krahn    uint64_t size = 0;
362811b136ab381658b7ec80aff885f80db495424d2Darren Krahn    EXPECT_EQ(NV_RESULT_SUCCESS, device.GetSpaceSize(kTestIndex1, &size));
363811b136ab381658b7ec80aff885f80db495424d2Darren Krahn  }
364811b136ab381658b7ec80aff885f80db495424d2Darren Krahn  // ScopedNvramSpace will call Delete when it falls out of scope. Now we can
365811b136ab381658b7ec80aff885f80db495424d2Darren Krahn  // make sure that worked.
366811b136ab381658b7ec80aff885f80db495424d2Darren Krahn  uint64_t size = 0;
367811b136ab381658b7ec80aff885f80db495424d2Darren Krahn  EXPECT_EQ(NV_RESULT_SPACE_DOES_NOT_EXIST,
368811b136ab381658b7ec80aff885f80db495424d2Darren Krahn            device.GetSpaceSize(kTestIndex1, &size));
369811b136ab381658b7ec80aff885f80db495424d2Darren Krahn}
370811b136ab381658b7ec80aff885f80db495424d2Darren Krahn
371811b136ab381658b7ec80aff885f80db495424d2Darren KrahnTEST(NVRAMModuleTest, WriteLock) {
372811b136ab381658b7ec80aff885f80db495424d2Darren Krahn  SafeScopedNvramDevice device;
373811b136ab381658b7ec80aff885f80db495424d2Darren Krahn  uint32_t index;
374811b136ab381658b7ec80aff885f80db495424d2Darren Krahn  ASSERT_TRUE(GetNextBurnSpace(&device, &index));
375811b136ab381658b7ec80aff885f80db495424d2Darren Krahn  ASSERT_EQ(
376811b136ab381658b7ec80aff885f80db495424d2Darren Krahn      NV_RESULT_SUCCESS,
377811b136ab381658b7ec80aff885f80db495424d2Darren Krahn      device.CreateSpace(index, 32, {NV_CONTROL_BOOT_WRITE_LOCK}, kNoAuth));
378811b136ab381658b7ec80aff885f80db495424d2Darren Krahn  int write_lock, read_lock;
379811b136ab381658b7ec80aff885f80db495424d2Darren Krahn  EXPECT_EQ(NV_RESULT_SUCCESS,
380811b136ab381658b7ec80aff885f80db495424d2Darren Krahn            device.IsSpaceLocked(index, &write_lock, &read_lock));
381811b136ab381658b7ec80aff885f80db495424d2Darren Krahn  EXPECT_FALSE(write_lock);
382811b136ab381658b7ec80aff885f80db495424d2Darren Krahn  EXPECT_FALSE(read_lock);
383811b136ab381658b7ec80aff885f80db495424d2Darren Krahn  // It should be possible to delete if the space has not yet been locked.
384811b136ab381658b7ec80aff885f80db495424d2Darren Krahn  ASSERT_EQ(NV_RESULT_SUCCESS, device.DeleteSpace(index, kNoAuth));
385811b136ab381658b7ec80aff885f80db495424d2Darren Krahn  ASSERT_EQ(
386811b136ab381658b7ec80aff885f80db495424d2Darren Krahn      NV_RESULT_SUCCESS,
387811b136ab381658b7ec80aff885f80db495424d2Darren Krahn      device.CreateSpace(index, 32, {NV_CONTROL_BOOT_WRITE_LOCK}, kNoAuth));
388811b136ab381658b7ec80aff885f80db495424d2Darren Krahn  EXPECT_EQ(NV_RESULT_SUCCESS, device.WriteSpace(index, "test", kNoAuth));
389811b136ab381658b7ec80aff885f80db495424d2Darren Krahn  EXPECT_EQ(NV_RESULT_SUCCESS, device.EnableWriteLock(index, kNoAuth));
390811b136ab381658b7ec80aff885f80db495424d2Darren Krahn  EXPECT_EQ(NV_RESULT_SUCCESS,
391811b136ab381658b7ec80aff885f80db495424d2Darren Krahn            device.IsSpaceLocked(index, &write_lock, &read_lock));
392811b136ab381658b7ec80aff885f80db495424d2Darren Krahn  EXPECT_TRUE(write_lock);
393811b136ab381658b7ec80aff885f80db495424d2Darren Krahn  EXPECT_FALSE(read_lock);
394811b136ab381658b7ec80aff885f80db495424d2Darren Krahn  EXPECT_EQ(NV_RESULT_OPERATION_DISABLED,
395811b136ab381658b7ec80aff885f80db495424d2Darren Krahn            device.WriteSpace(index, "test2", kNoAuth));
396811b136ab381658b7ec80aff885f80db495424d2Darren Krahn  EXPECT_EQ(NV_RESULT_OPERATION_DISABLED, device.DeleteSpace(index, kNoAuth));
397811b136ab381658b7ec80aff885f80db495424d2Darren Krahn  std::string data;
398811b136ab381658b7ec80aff885f80db495424d2Darren Krahn  EXPECT_EQ(NV_RESULT_SUCCESS, device.ReadSpace(index, 4, kNoAuth, &data));
399811b136ab381658b7ec80aff885f80db495424d2Darren Krahn  EXPECT_EQ("test", data);
400811b136ab381658b7ec80aff885f80db495424d2Darren Krahn}
401811b136ab381658b7ec80aff885f80db495424d2Darren Krahn
402811b136ab381658b7ec80aff885f80db495424d2Darren KrahnTEST(NVRAMModuleTest, ReadLock) {
403811b136ab381658b7ec80aff885f80db495424d2Darren Krahn  uint32_t index = kTestIndex1;
404811b136ab381658b7ec80aff885f80db495424d2Darren Krahn  SafeScopedNvramDevice device;
405811b136ab381658b7ec80aff885f80db495424d2Darren Krahn  ScopedNvramSpace space(&device, index, 32, {NV_CONTROL_BOOT_READ_LOCK});
406811b136ab381658b7ec80aff885f80db495424d2Darren Krahn  int write_lock, read_lock;
407811b136ab381658b7ec80aff885f80db495424d2Darren Krahn  EXPECT_EQ(NV_RESULT_SUCCESS,
408811b136ab381658b7ec80aff885f80db495424d2Darren Krahn            device.IsSpaceLocked(index, &write_lock, &read_lock));
409811b136ab381658b7ec80aff885f80db495424d2Darren Krahn  EXPECT_FALSE(write_lock);
410811b136ab381658b7ec80aff885f80db495424d2Darren Krahn  EXPECT_FALSE(read_lock);
411811b136ab381658b7ec80aff885f80db495424d2Darren Krahn  EXPECT_EQ(NV_RESULT_SUCCESS, device.WriteSpace(index, "test", kNoAuth));
412811b136ab381658b7ec80aff885f80db495424d2Darren Krahn  std::string data;
413811b136ab381658b7ec80aff885f80db495424d2Darren Krahn  EXPECT_EQ(NV_RESULT_SUCCESS, device.ReadSpace(index, 4, kNoAuth, &data));
414811b136ab381658b7ec80aff885f80db495424d2Darren Krahn  EXPECT_EQ("test", data);
415811b136ab381658b7ec80aff885f80db495424d2Darren Krahn  EXPECT_EQ(NV_RESULT_SUCCESS, device.EnableReadLock(index, kNoAuth));
416811b136ab381658b7ec80aff885f80db495424d2Darren Krahn  EXPECT_EQ(NV_RESULT_SUCCESS,
417811b136ab381658b7ec80aff885f80db495424d2Darren Krahn            device.IsSpaceLocked(index, &write_lock, &read_lock));
418811b136ab381658b7ec80aff885f80db495424d2Darren Krahn  EXPECT_FALSE(write_lock);
419811b136ab381658b7ec80aff885f80db495424d2Darren Krahn  EXPECT_TRUE(read_lock);
420811b136ab381658b7ec80aff885f80db495424d2Darren Krahn  EXPECT_EQ(NV_RESULT_OPERATION_DISABLED,
421811b136ab381658b7ec80aff885f80db495424d2Darren Krahn            device.ReadSpace(index, 4, kNoAuth, &data));
422811b136ab381658b7ec80aff885f80db495424d2Darren Krahn  EXPECT_EQ(NV_RESULT_SUCCESS, device.WriteSpace(index, "test2", kNoAuth));
423811b136ab381658b7ec80aff885f80db495424d2Darren Krahn}
424811b136ab381658b7ec80aff885f80db495424d2Darren Krahn
425811b136ab381658b7ec80aff885f80db495424d2Darren KrahnTEST(NVRAMModuleTest, WriteAuthorization) {
426811b136ab381658b7ec80aff885f80db495424d2Darren Krahn  uint32_t index = kTestIndex1;
427811b136ab381658b7ec80aff885f80db495424d2Darren Krahn  std::string password = "hunter2";
428811b136ab381658b7ec80aff885f80db495424d2Darren Krahn  SafeScopedNvramDevice device;
429811b136ab381658b7ec80aff885f80db495424d2Darren Krahn  ScopedNvramSpace space(&device, index, 32, {NV_CONTROL_WRITE_AUTHORIZATION},
430811b136ab381658b7ec80aff885f80db495424d2Darren Krahn                         password);
431811b136ab381658b7ec80aff885f80db495424d2Darren Krahn  EXPECT_EQ(NV_RESULT_SUCCESS, device.WriteSpace(index, "test", password));
432811b136ab381658b7ec80aff885f80db495424d2Darren Krahn  EXPECT_EQ(NV_RESULT_ACCESS_DENIED,
433811b136ab381658b7ec80aff885f80db495424d2Darren Krahn            device.WriteSpace(index, "test2", kNoAuth));
434811b136ab381658b7ec80aff885f80db495424d2Darren Krahn  EXPECT_EQ(NV_RESULT_ACCESS_DENIED,
435811b136ab381658b7ec80aff885f80db495424d2Darren Krahn            device.WriteSpace(index, "test3", "bad_password"));
436811b136ab381658b7ec80aff885f80db495424d2Darren Krahn  EXPECT_EQ(NV_RESULT_ACCESS_DENIED, device.DeleteSpace(index, kNoAuth));
437811b136ab381658b7ec80aff885f80db495424d2Darren Krahn  EXPECT_EQ(NV_RESULT_ACCESS_DENIED, device.DeleteSpace(index, "bad"));
438811b136ab381658b7ec80aff885f80db495424d2Darren Krahn  std::string data;
439811b136ab381658b7ec80aff885f80db495424d2Darren Krahn  EXPECT_EQ(NV_RESULT_SUCCESS, device.ReadSpace(index, 4, kNoAuth, &data));
440811b136ab381658b7ec80aff885f80db495424d2Darren Krahn  EXPECT_EQ("test", data);
441811b136ab381658b7ec80aff885f80db495424d2Darren Krahn  EXPECT_EQ(NV_RESULT_SUCCESS, device.ReadSpace(index, 4, password, &data));
442811b136ab381658b7ec80aff885f80db495424d2Darren Krahn}
443811b136ab381658b7ec80aff885f80db495424d2Darren Krahn
444811b136ab381658b7ec80aff885f80db495424d2Darren KrahnTEST(NVRAMModuleTest, ReadAuthorization) {
445811b136ab381658b7ec80aff885f80db495424d2Darren Krahn  uint32_t index = kTestIndex1;
446811b136ab381658b7ec80aff885f80db495424d2Darren Krahn  std::string password = "hunter2";
447811b136ab381658b7ec80aff885f80db495424d2Darren Krahn  SafeScopedNvramDevice device;
448811b136ab381658b7ec80aff885f80db495424d2Darren Krahn  ScopedNvramSpace space(&device, index, 32, {NV_CONTROL_READ_AUTHORIZATION},
449811b136ab381658b7ec80aff885f80db495424d2Darren Krahn                         password);
450811b136ab381658b7ec80aff885f80db495424d2Darren Krahn  ASSERT_EQ(NV_RESULT_SUCCESS, device.WriteSpace(index, "test", password));
451811b136ab381658b7ec80aff885f80db495424d2Darren Krahn  EXPECT_EQ(NV_RESULT_SUCCESS, device.WriteSpace(index, "test2", kNoAuth));
452811b136ab381658b7ec80aff885f80db495424d2Darren Krahn  std::string data;
453811b136ab381658b7ec80aff885f80db495424d2Darren Krahn  EXPECT_EQ(NV_RESULT_SUCCESS, device.ReadSpace(index, 4, password, &data));
454811b136ab381658b7ec80aff885f80db495424d2Darren Krahn  EXPECT_EQ("test", data);
455811b136ab381658b7ec80aff885f80db495424d2Darren Krahn  EXPECT_EQ(NV_RESULT_ACCESS_DENIED,
456811b136ab381658b7ec80aff885f80db495424d2Darren Krahn            device.ReadSpace(index, 4, kNoAuth, &data));
457811b136ab381658b7ec80aff885f80db495424d2Darren Krahn  EXPECT_EQ(NV_RESULT_ACCESS_DENIED,
458811b136ab381658b7ec80aff885f80db495424d2Darren Krahn            device.ReadSpace(index, 4, "bad_password", &data));
459811b136ab381658b7ec80aff885f80db495424d2Darren Krahn}
460811b136ab381658b7ec80aff885f80db495424d2Darren Krahn
461811b136ab381658b7ec80aff885f80db495424d2Darren KrahnTEST(NVRAMModuleTest, WriteLockAuthorization) {
462811b136ab381658b7ec80aff885f80db495424d2Darren Krahn  SafeScopedNvramDevice device;
463811b136ab381658b7ec80aff885f80db495424d2Darren Krahn  uint32_t index;
464811b136ab381658b7ec80aff885f80db495424d2Darren Krahn  ASSERT_TRUE(GetNextBurnSpace(&device, &index));
465811b136ab381658b7ec80aff885f80db495424d2Darren Krahn  ASSERT_EQ(NV_RESULT_SUCCESS,
466811b136ab381658b7ec80aff885f80db495424d2Darren Krahn            device.CreateSpace(index, 32, {NV_CONTROL_BOOT_WRITE_LOCK,
467811b136ab381658b7ec80aff885f80db495424d2Darren Krahn                                           NV_CONTROL_BOOT_READ_LOCK,
468811b136ab381658b7ec80aff885f80db495424d2Darren Krahn                                           NV_CONTROL_WRITE_AUTHORIZATION},
469811b136ab381658b7ec80aff885f80db495424d2Darren Krahn                               kBurnSpaceAuth));
470811b136ab381658b7ec80aff885f80db495424d2Darren Krahn  EXPECT_EQ(NV_RESULT_SUCCESS, device.EnableReadLock(index, kNoAuth));
471811b136ab381658b7ec80aff885f80db495424d2Darren Krahn  EXPECT_EQ(NV_RESULT_ACCESS_DENIED, device.EnableWriteLock(index, kNoAuth));
472811b136ab381658b7ec80aff885f80db495424d2Darren Krahn  EXPECT_EQ(NV_RESULT_ACCESS_DENIED, device.EnableWriteLock(index, "bad"));
473811b136ab381658b7ec80aff885f80db495424d2Darren Krahn  EXPECT_EQ(NV_RESULT_SUCCESS, device.EnableWriteLock(index, kBurnSpaceAuth));
474811b136ab381658b7ec80aff885f80db495424d2Darren Krahn}
475811b136ab381658b7ec80aff885f80db495424d2Darren Krahn
476811b136ab381658b7ec80aff885f80db495424d2Darren KrahnTEST(NVRAMModuleTest, ReadLockAuthorization) {
477811b136ab381658b7ec80aff885f80db495424d2Darren Krahn  uint32_t index = kTestIndex1;
478811b136ab381658b7ec80aff885f80db495424d2Darren Krahn  std::string password = "hunter2";
479811b136ab381658b7ec80aff885f80db495424d2Darren Krahn  SafeScopedNvramDevice device;
480811b136ab381658b7ec80aff885f80db495424d2Darren Krahn  ScopedNvramSpace space(&device, index, 32,
481811b136ab381658b7ec80aff885f80db495424d2Darren Krahn                         {NV_CONTROL_BOOT_WRITE_LOCK, NV_CONTROL_BOOT_READ_LOCK,
482811b136ab381658b7ec80aff885f80db495424d2Darren Krahn                          NV_CONTROL_READ_AUTHORIZATION},
483811b136ab381658b7ec80aff885f80db495424d2Darren Krahn                         password);
484811b136ab381658b7ec80aff885f80db495424d2Darren Krahn  EXPECT_EQ(NV_RESULT_ACCESS_DENIED, device.EnableReadLock(index, kNoAuth));
485811b136ab381658b7ec80aff885f80db495424d2Darren Krahn  EXPECT_EQ(NV_RESULT_ACCESS_DENIED, device.EnableReadLock(index, "bad"));
486811b136ab381658b7ec80aff885f80db495424d2Darren Krahn  EXPECT_EQ(NV_RESULT_SUCCESS, device.EnableReadLock(index, password));
487811b136ab381658b7ec80aff885f80db495424d2Darren Krahn}
488811b136ab381658b7ec80aff885f80db495424d2Darren Krahn
489811b136ab381658b7ec80aff885f80db495424d2Darren KrahnTEST(NVRAMModuleTest, WriteExtend) {
490811b136ab381658b7ec80aff885f80db495424d2Darren Krahn  uint32_t index = kTestIndex1;
491811b136ab381658b7ec80aff885f80db495424d2Darren Krahn  SafeScopedNvramDevice device;
492811b136ab381658b7ec80aff885f80db495424d2Darren Krahn  ScopedNvramSpace space(&device, index, 32, {NV_CONTROL_WRITE_EXTEND});
493811b136ab381658b7ec80aff885f80db495424d2Darren Krahn  ASSERT_EQ(NV_RESULT_SUCCESS, device.WriteSpace(index, "test", kNoAuth));
494811b136ab381658b7ec80aff885f80db495424d2Darren Krahn  std::string data;
495811b136ab381658b7ec80aff885f80db495424d2Darren Krahn  EXPECT_EQ(NV_RESULT_SUCCESS, device.ReadSpace(index, 32, kNoAuth, &data));
496811b136ab381658b7ec80aff885f80db495424d2Darren Krahn  std::string hash1 = SHA256HashString(std::string(32, 0) + "test");
497811b136ab381658b7ec80aff885f80db495424d2Darren Krahn  EXPECT_EQ(hash1, data);
498811b136ab381658b7ec80aff885f80db495424d2Darren Krahn  EXPECT_EQ(NV_RESULT_SUCCESS, device.WriteSpace(index, "test2", kNoAuth));
499811b136ab381658b7ec80aff885f80db495424d2Darren Krahn  EXPECT_EQ(NV_RESULT_SUCCESS, device.ReadSpace(index, 32, kNoAuth, &data));
500811b136ab381658b7ec80aff885f80db495424d2Darren Krahn  std::string hash2 = SHA256HashString(hash1 + "test2");
501811b136ab381658b7ec80aff885f80db495424d2Darren Krahn  EXPECT_EQ(hash2, data);
502811b136ab381658b7ec80aff885f80db495424d2Darren Krahn}
503811b136ab381658b7ec80aff885f80db495424d2Darren Krahn
504811b136ab381658b7ec80aff885f80db495424d2Darren KrahnTEST(NVRAMModuleTest, WriteExtendTooShort) {
505811b136ab381658b7ec80aff885f80db495424d2Darren Krahn  uint32_t index = kTestIndex1;
506811b136ab381658b7ec80aff885f80db495424d2Darren Krahn  SafeScopedNvramDevice device;
507088471151b7784cef5a8555e1f155454df106113Darren Krahn    // Only SHA-256 is supported. Try 20 which is SHA-1 output.
508811b136ab381658b7ec80aff885f80db495424d2Darren Krahn  EXPECT_EQ(
509811b136ab381658b7ec80aff885f80db495424d2Darren Krahn      NV_RESULT_INVALID_PARAMETER,
510088471151b7784cef5a8555e1f155454df106113Darren Krahn      device.CreateSpace(index, 20, {NV_CONTROL_WRITE_EXTEND}, kNoAuth));
511811b136ab381658b7ec80aff885f80db495424d2Darren Krahn  EXPECT_EQ(NV_RESULT_SPACE_DOES_NOT_EXIST,
512811b136ab381658b7ec80aff885f80db495424d2Darren Krahn            device.WriteSpace(index, "test", kNoAuth));
513811b136ab381658b7ec80aff885f80db495424d2Darren Krahn}
514811b136ab381658b7ec80aff885f80db495424d2Darren Krahn
515811b136ab381658b7ec80aff885f80db495424d2Darren KrahnTEST(NVRAMModuleTest, WriteExtendTooLong) {
516811b136ab381658b7ec80aff885f80db495424d2Darren Krahn  uint32_t index = kTestIndex1;
517811b136ab381658b7ec80aff885f80db495424d2Darren Krahn  SafeScopedNvramDevice device;
518088471151b7784cef5a8555e1f155454df106113Darren Krahn  uint64_t max_space_size = 0;
519088471151b7784cef5a8555e1f155454df106113Darren Krahn  ASSERT_EQ(NV_RESULT_SUCCESS, device.GetMaxSpaceSizeInBytes(&max_space_size));
520088471151b7784cef5a8555e1f155454df106113Darren Krahn  if (max_space_size > 32) {
521088471151b7784cef5a8555e1f155454df106113Darren Krahn    // Only SHA-256 is supported. Try 64 which is SHA-512 output.
522088471151b7784cef5a8555e1f155454df106113Darren Krahn    EXPECT_EQ(NV_RESULT_INVALID_PARAMETER,
523088471151b7784cef5a8555e1f155454df106113Darren Krahn              device.CreateSpace(index, std::min<uint64_t>(max_space_size, 64),
524088471151b7784cef5a8555e1f155454df106113Darren Krahn                                 {NV_CONTROL_WRITE_EXTEND}, kNoAuth));
525088471151b7784cef5a8555e1f155454df106113Darren Krahn    EXPECT_EQ(NV_RESULT_SPACE_DOES_NOT_EXIST,
526088471151b7784cef5a8555e1f155454df106113Darren Krahn              device.WriteSpace(index, "test", kNoAuth));
527088471151b7784cef5a8555e1f155454df106113Darren Krahn  }
528811b136ab381658b7ec80aff885f80db495424d2Darren Krahn}
529811b136ab381658b7ec80aff885f80db495424d2Darren Krahn
530811b136ab381658b7ec80aff885f80db495424d2Darren KrahnTEST(NVRAMModuleTest, InitialValue) {
531811b136ab381658b7ec80aff885f80db495424d2Darren Krahn  uint32_t index = kTestIndex1;
532811b136ab381658b7ec80aff885f80db495424d2Darren Krahn  SafeScopedNvramDevice device;
533811b136ab381658b7ec80aff885f80db495424d2Darren Krahn  ScopedNvramSpace space(&device, index, 32);
534811b136ab381658b7ec80aff885f80db495424d2Darren Krahn  std::string data;
535811b136ab381658b7ec80aff885f80db495424d2Darren Krahn  ASSERT_EQ(NV_RESULT_SUCCESS, device.ReadSpace(index, 32, kNoAuth, &data));
536811b136ab381658b7ec80aff885f80db495424d2Darren Krahn  EXPECT_EQ(std::string(32, 0), data);
537811b136ab381658b7ec80aff885f80db495424d2Darren Krahn}
538811b136ab381658b7ec80aff885f80db495424d2Darren Krahn
539811b136ab381658b7ec80aff885f80db495424d2Darren KrahnTEST(NVRAMModuleTest, ReadWriteSpaceDoesNotExist) {
540811b136ab381658b7ec80aff885f80db495424d2Darren Krahn  uint32_t index = kTestIndexNeverExists;
541811b136ab381658b7ec80aff885f80db495424d2Darren Krahn  SafeScopedNvramDevice device;
542811b136ab381658b7ec80aff885f80db495424d2Darren Krahn  EXPECT_EQ(NV_RESULT_SPACE_DOES_NOT_EXIST,
543811b136ab381658b7ec80aff885f80db495424d2Darren Krahn            device.WriteSpace(index, "test", kNoAuth));
544811b136ab381658b7ec80aff885f80db495424d2Darren Krahn  std::string data;
545811b136ab381658b7ec80aff885f80db495424d2Darren Krahn  EXPECT_EQ(NV_RESULT_SPACE_DOES_NOT_EXIST,
546811b136ab381658b7ec80aff885f80db495424d2Darren Krahn            device.ReadSpace(index, 1, kNoAuth, &data));
547811b136ab381658b7ec80aff885f80db495424d2Darren Krahn  EXPECT_EQ(NV_RESULT_SPACE_DOES_NOT_EXIST,
548811b136ab381658b7ec80aff885f80db495424d2Darren Krahn            device.EnableWriteLock(index, kNoAuth));
549811b136ab381658b7ec80aff885f80db495424d2Darren Krahn  EXPECT_EQ(NV_RESULT_SPACE_DOES_NOT_EXIST,
550811b136ab381658b7ec80aff885f80db495424d2Darren Krahn            device.EnableReadLock(index, kNoAuth));
551811b136ab381658b7ec80aff885f80db495424d2Darren Krahn}
552811b136ab381658b7ec80aff885f80db495424d2Darren Krahn
553e52a7f4addee2c1b6b85fbd445890ccc1c5fc2d1Rahul Chaudhry}  // namespace nvram
554