|  | // Copyright lowRISC contributors. | 
|  | // Licensed under the Apache License, Version 2.0, see LICENSE for details. | 
|  | // SPDX-License-Identifier: Apache-2.0 | 
|  |  | 
|  | #include "sw/device/lib/base/hardened_memory.h" | 
|  |  | 
|  | #include <vector> | 
|  |  | 
|  | #include "gmock/gmock.h" | 
|  | #include "gtest/gtest.h" | 
|  |  | 
|  | // NOTE: This test does not verify hardening measures; it only checks that the | 
|  | // "normal" contract of the functions is upheld. | 
|  |  | 
|  | namespace hardened_memory_unittest { | 
|  | namespace { | 
|  |  | 
|  | using ::testing::Each; | 
|  | using ::testing::ElementsAre; | 
|  |  | 
|  | TEST(HardenedMemory, Memcpy) { | 
|  | std::vector<uint32_t> xs = {1, 2, 3, 4, 5, 6, 7, 8}; | 
|  | std::vector<uint32_t> ys(8); | 
|  |  | 
|  | hardened_memcpy(ys.data(), xs.data(), 0); | 
|  | EXPECT_THAT(ys, Each(0)); | 
|  |  | 
|  | hardened_memcpy(ys.data() + 1, xs.data(), 7); | 
|  | EXPECT_THAT(ys, ElementsAre(0, 1, 2, 3, 4, 5, 6, 7)); | 
|  | } | 
|  |  | 
|  | constexpr uint32_t kRandomWord = 0xdeadbeef; | 
|  |  | 
|  | // Override whatever the default randomness source is so we can verify it | 
|  | // actually gets used. | 
|  | extern "C" size_t hardened_memshred_random_word() { return kRandomWord; } | 
|  |  | 
|  | TEST(HardenedMemory, MemShred) { | 
|  | std::vector<uint32_t> xs = {1, 2, 3, 4, 5, 6, 7, 8}; | 
|  | hardened_memshred(xs.data(), xs.size()); | 
|  |  | 
|  | EXPECT_THAT(xs, Each(kRandomWord)); | 
|  | } | 
|  |  | 
|  | TEST(HardenedMemory, MemEq) { | 
|  | std::vector<uint32_t> xs = {1, 2, 3, 4, 5, 6, 7, 8}; | 
|  | std::vector<uint32_t> ys = xs; | 
|  |  | 
|  | EXPECT_EQ(hardened_memeq(ys.data(), xs.data(), xs.size()), kHardenedBoolTrue); | 
|  |  | 
|  | ++ys[5]; | 
|  | EXPECT_EQ(hardened_memeq(ys.data(), xs.data(), xs.size()), | 
|  | kHardenedBoolFalse); | 
|  | } | 
|  |  | 
|  | }  // namespace | 
|  | }  // namespace hardened_memory_unittest |