blob: d2299c1a8498f08316766572a9b35e64c89c9288 [file] [log] [blame]
// 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