blob: b8d56a7b6528d7fad164368ef0757b088819dc04 [file] [log] [blame]
// Copyright Microsoft and CHERIoT Contributors.
// SPDX-License-Identifier: MIT
#define TEST_NAME "Static sealing (inner compartment)"
#include "static_sealing.h"
#include "tests.hh"
#include <fail-simulator-on-error.h>
using namespace CHERI;
int test_static_sealed_object(Sealed<TestType> obj)
{
// Get our static sealing key.
SKey key = STATIC_SEALING_TYPE(SealingType);
Capability keyCap{key};
debug_log("Static sealing key: {}", key);
// Make sure the sealing key has sensible permissions
TEST((check_pointer<PermissionSet{Permission::Seal,
Permission::Unseal,
Permission::Global,
Permission::User0}>(key, 1)),
"Incorrect permissions on static sealing key {}",
key);
// Make sure it's in the right range.
TEST(
keyCap.address() >= 16,
"Software sealing key has an address in the hardware-reserved range: {}",
keyCap.address());
TEST(keyCap.address() < 0x10000,
"Software sealing key has an address too large: {}",
keyCap.address());
// Make sure that it's a single sealing type
TEST(keyCap.bounds() == 1, "Invalid bounds on {}", key);
// Try to use it
Capability unsealed = token_unseal(key, obj);
debug_log("Unsealed object: {}", unsealed);
// Make sure that the unsealed allocation is the right everything.
TEST(unsealed->value == 42, "Unexpected value in static sealed object");
TEST(unsealed.length() == sizeof(TestType),
"Incorrect length on unsealed capability {}",
unsealed);
TEST((check_pointer<PermissionSet{Permission::Load,
Permission::Store,
Permission::LoadStoreCapability,
Permission::LoadMutable,
Permission::LoadGlobal,
Permission::Global}>(unsealed, 1)),
"Incorrect permissions on unsealed statically sealed object {}",
unsealed);
return 0;
}