| // 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; | 
 | } |