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