1 #include <darwintest.h> 2 #include "nvram_helper.h" 3 4 T_GLOBAL_META(T_META_NAMESPACE("xnu.nvram"), 5 T_META_RADAR_COMPONENT_NAME("xnu"), 6 T_META_RADAR_COMPONENT_VERSION("nvram")); 7 8 static io_registry_entry_t optionsRef = IO_OBJECT_NULL; 9 10 // xcrun -sdk macosx.internal make -C tests nvram_system && sudo ./tests/build/sym/nvram_system 11 12 // Test that writing, reading, and deleting of system variables with system entitlement should succeed 13 T_DECL(TestSystemEntitled, "Test system guids with entitlement") 14 { 15 #if ((TARGET_OS_OSX) && !(__x86_64__)) 16 const char *varToTest = SystemNVRAMGuidString ":" "varToTest2"; 17 18 optionsRef = CreateOptionsRef(); 19 20 TestVarOp(OP_SET, varToTest, DefaultSetVal, KERN_SUCCESS, optionsRef); 21 TestVarOp(OP_GET, varToTest, NULL, KERN_SUCCESS, optionsRef); 22 TestVarOp(OP_DEL, varToTest, NULL, KERN_SUCCESS, optionsRef); 23 24 ReleaseOptionsRef(optionsRef); 25 #else 26 T_PASS("Test not supported"); 27 #endif /* ((TARGET_OS_OSX) && !(__x86_64__)) */ 28 } 29 30 31 #if !(TARGET_CPU_ARM64 && TARGET_OS_OSX) 32 // Test that system guid is translated to common guid on devices without system namespace support 33 T_DECL(TestSysNonAS, "Test system guids for devices without system namespace") 34 { 35 const char *varWithSys = SystemNVRAMGuidString ":" "varToTestSys"; 36 const char *varWOSys = "varToTestSys"; 37 38 optionsRef = CreateOptionsRef(); 39 40 TestVarOp(OP_SET, varWithSys, DefaultSetVal, KERN_SUCCESS, optionsRef); 41 TestVarOp(OP_GET, varWOSys, NULL, KERN_SUCCESS, optionsRef); 42 TestVarOp(OP_DEL, varWOSys, NULL, KERN_SUCCESS, optionsRef); 43 44 ReleaseOptionsRef(optionsRef); 45 } 46 #endif 47 48 // Variable entitlement tests for system variables 49 #if ((TARGET_OS_OSX) && !(__x86_64__)) 50 // Test that read of entitled system variables without entitlement should fail 51 T_DECL(TestEntRdSys, "Test read entitled system variables") 52 { 53 char * varToTest = SystemNVRAMGuidString ":" "testEntRdSys"; 54 55 optionsRef = CreateOptionsRef(); 56 57 TestVarOp(OP_SET, varToTest, DefaultSetVal, KERN_SUCCESS, optionsRef); 58 TestVarOp(OP_GET, varToTest, NULL, KERN_FAILURE, optionsRef); 59 60 ReleaseOptionsRef(optionsRef); 61 } 62 63 // Test that writing of entitled system variables without entitlement should fail 64 T_DECL(TestEntModRstSys, "Test write entitled system variables") 65 { 66 char * varToTest = SystemNVRAMGuidString ":" "testEntModRstSys"; 67 68 optionsRef = CreateOptionsRef(); 69 70 TestVarOp(OP_SET, varToTest, DefaultSetVal, kIOReturnNotPrivileged, optionsRef); 71 72 ReleaseOptionsRef(optionsRef); 73 } 74 75 // Test that deleting of entitled system variables without entitlement should fail 76 T_DECL(TestEntDelSys, "Test delete entitled system variables") 77 { 78 char * varToTest = SystemNVRAMGuidString ":" "testEntDelSys"; 79 80 optionsRef = CreateOptionsRef(); 81 82 TestVarOp(OP_SET, varToTest, DefaultSetVal, KERN_SUCCESS, optionsRef); 83 TestVarOp(OP_DEL, varToTest, NULL, KERN_FAILURE, optionsRef); 84 85 ReleaseOptionsRef(optionsRef); 86 } 87 88 // Test resetting of nvram with entitlement should not erase testEntRstSys 89 // To reset nvram, call the test with -r argument: 90 // sudo ./tests/build/sym/nvram_system -n xnu.nvram.TestEntRstSys -- -r 91 T_DECL(TestEntRstSys, "Test reset entitled system variables") 92 { 93 opterr = 0; 94 optind = 0; 95 char * varToTest = SystemNVRAMGuidString ":" "testEntRstSys"; 96 97 optionsRef = CreateOptionsRef(); 98 99 TestVarOp(OP_SET, varToTest, DefaultSetVal, KERN_SUCCESS, optionsRef); 100 101 if (getopt(argc, argv, "r") == 'r') { 102 TestVarOp(OP_RES, NULL, NULL, KERN_SUCCESS, optionsRef); 103 TestVarOp(OP_GET, varToTest, NULL, KERN_SUCCESS, optionsRef); 104 } else { 105 TestVarOp(OP_DEL, varToTest, NULL, KERN_SUCCESS, optionsRef); 106 T_PASS("NVram reset not invoked"); 107 } 108 109 ReleaseOptionsRef(optionsRef); 110 } 111 112 // Test NVRAM Reset 113 // To reset nvram, call the test with -r argument: 114 // sudo ./tests/build/sym/nvram_system -n xnu.nvram.TestNVRAMResetSys -- -r 115 T_DECL(TestNVRAMResetSys, "Test NVRAM Reset for system region variables") 116 { 117 opterr = 0; 118 optind = 0; 119 const char * varToTest = "testVar1"; 120 const char * varToTestWSys = SystemNVRAMGuidString ":" "testVar2"; 121 122 optionsRef = CreateOptionsRef(); 123 124 if (getopt(argc, argv, "r") == 'r') { 125 TestVarOp(OP_SET, varToTest, DefaultSetVal, KERN_SUCCESS, optionsRef); 126 TestVarOp(OP_SET, varToTestWSys, DefaultSetVal, KERN_SUCCESS, optionsRef); 127 128 TestVarOp(OP_RES, NULL, NULL, KERN_SUCCESS, optionsRef); 129 TestVarOp(OP_GET, varToTest, NULL, KERN_FAILURE, optionsRef); 130 131 TestVarOp(OP_GET, varToTestWSys, NULL, KERN_FAILURE, optionsRef); 132 } else { 133 T_PASS("NVram reset not invoked"); 134 } 135 136 ReleaseOptionsRef(optionsRef); 137 } 138 139 // Test NVRAM Obliterate 140 // To obliterate nvram, call the test with -r argument: 141 // sudo ./tests/build/sym/nvram_system -n xnu.nvram.TestNVRAMOblitSys -- -r 142 T_DECL(TestNVRAMOblitSys, "Test NVRAM Obliterate for system region") 143 { 144 opterr = 0; 145 optind = 0; 146 const char * varToTest = "testVar1"; 147 const char * varToTestWSys = SystemNVRAMGuidString ":" "testVar2"; 148 const char * varToTestWRand = RandomNVRAMGuidString ":" "testVar3"; 149 const char * oblitSys = SystemNVRAMGuidString ":" "ObliterateNVRam"; 150 const char * oblitNonSys = CommonNVRAMGuidString ":" "ObliterateNVRam"; 151 152 optionsRef = CreateOptionsRef(); 153 154 if (getopt(argc, argv, "r") == 'r') { 155 // Set variables with common namespace, random namespace and system namespace 156 TestVarOp(OP_SET, varToTest, DefaultSetVal, KERN_SUCCESS, optionsRef); 157 TestVarOp(OP_SET, varToTestWSys, DefaultSetVal, KERN_SUCCESS, optionsRef); 158 TestVarOp(OP_SET, varToTestWRand, DefaultSetVal, KERN_SUCCESS, optionsRef); 159 160 // Obliterate sys first and make sure non-sys variables aren't deleted 161 TestVarOp(OP_OBL, oblitSys, NULL, KERN_SUCCESS, optionsRef); 162 163 TestVarOp(OP_GET, varToTestWSys, NULL, KERN_FAILURE, optionsRef); 164 TestVarOp(OP_GET, varToTest, NULL, KERN_SUCCESS, optionsRef); 165 TestVarOp(OP_GET, varToTestWRand, NULL, KERN_SUCCESS, optionsRef); 166 167 // Now, obliterate common region and make sure all non-sys variables are deleted 168 TestVarOp(OP_SET, varToTestWSys, DefaultSetVal, KERN_SUCCESS, optionsRef); 169 170 TestVarOp(OP_OBL, oblitNonSys, NULL, KERN_SUCCESS, optionsRef); 171 172 TestVarOp(OP_GET, varToTestWSys, NULL, KERN_SUCCESS, optionsRef); 173 TestVarOp(OP_GET, varToTest, NULL, KERN_FAILURE, optionsRef); 174 TestVarOp(OP_GET, varToTestWRand, NULL, KERN_FAILURE, optionsRef); 175 TestVarOp(OP_DEL, varToTestWSys, NULL, KERN_SUCCESS, optionsRef); 176 } else { 177 T_PASS("NVram obliterate not invoked"); 178 } 179 180 ReleaseOptionsRef(optionsRef); 181 } 182 #endif /* ((TARGET_OS_OSX) && !(__x86_64__)) */ 183