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 iphoneos.internal make -C tests nvram_nonentitled && sudo ./tests/build/sym/nvram_nonentitled 11 12 // Test basic read, write, delete for a random variable 13 T_DECL(TestBasicCmds, "Test basic nvram commands") 14 { 15 const char *varToTest = "varToTest1"; 16 17 optionsRef = GetOptions(); 18 19 T_ASSERT_EQ(SetVariable(varToTest, "1234", optionsRef), KERN_SUCCESS, "Set variable %s successfully\n", varToTest); 20 T_ASSERT_EQ(GetVariable(varToTest, optionsRef), KERN_SUCCESS, "Read variable %s successfully\n", varToTest); 21 T_ASSERT_EQ(DeleteVariable(varToTest, optionsRef), KERN_SUCCESS, "Deleted variable %s successfully\n", varToTest); 22 23 ReleaseOptions(optionsRef); 24 } 25 26 // Test basic read, write, delete for a random variable with random guid 27 T_DECL(TestRandomGuid, "Test random guid") 28 { 29 const char *varToTest = "11112222-77F8-4392-B4A3-1E7304206516:varToTest3"; 30 31 optionsRef = GetOptions(); 32 33 T_ASSERT_EQ(SetVariable(varToTest, "1234", optionsRef), KERN_SUCCESS, "Set variable %s successfully\n", varToTest); 34 T_ASSERT_EQ(GetVariable(varToTest, optionsRef), KERN_SUCCESS, "Read variable %s successfully\n", varToTest); 35 T_ASSERT_EQ(DeleteVariable(varToTest, optionsRef), KERN_SUCCESS, "Deleted variable %s successfully\n", varToTest); 36 37 ReleaseOptions(optionsRef); 38 } 39 40 #if !(__x86_64__) 41 #if (TARGET_OS_OSX) 42 // Test that writing of system variables without system entitlement should fail 43 T_DECL(TestSystem, "Test system guids") 44 { 45 const char *varToTest = "40A0DDD2-77F8-4392-B4A3-1E7304206516:varToTest2"; 46 47 optionsRef = GetOptions(); 48 49 T_ASSERT_NE(SetVariable(varToTest, "1234", optionsRef), KERN_SUCCESS, "Set variable %s failed as expected\n", varToTest); 50 51 ReleaseOptions(optionsRef); 52 } 53 #endif /* (TARGET_OS_OSX) */ 54 55 // Test that variables with NeverAllowedToDelete bit set cannot be deleted even with ResetNVram() 56 // To reset nvram, call the test with -r argument: 57 // sudo ./tests/build/sym/nvram_nonentitled -n xnu.nvram.TestImmutable -- -r 58 T_DECL(TestImmutable, "Test immutable variable") 59 { 60 opterr = 0; 61 optind = 0; 62 const char * varToTest = "testNeverDel"; 63 64 optionsRef = GetOptions(); 65 66 T_ASSERT_EQ(SetVariable(varToTest, "1234", optionsRef), KERN_SUCCESS, "Set variable %s successfully\n", varToTest); 67 T_ASSERT_NE(DeleteVariable(varToTest, optionsRef), KERN_SUCCESS, "Delete variable %s failed as expected\n", varToTest); 68 69 if (getopt(argc, argv, "r") == 'r') { 70 T_ASSERT_EQ(ResetNVram(optionsRef), KERN_SUCCESS, "Reset NVram successfully\n"); 71 } 72 T_ASSERT_EQ(GetVariable(varToTest, optionsRef), KERN_SUCCESS, "Read variable %s successfully\n", varToTest); 73 74 ReleaseOptions(optionsRef); 75 } 76 77 // Test that variables with ResetNVRAMOnlyDelete bit set can be deleted only by ResetNVram 78 // To reset nvram, call the test with -r argument: 79 // sudo ./tests/build/sym/nvram_nonentitled -n xnu.nvram.TestResetOnlyDel -- -r 80 T_DECL(TestResetOnlyDel, "Test variable with ResetNVRAMOnlyDelete bit set") 81 { 82 opterr = 0; 83 optind = 0; 84 const char * varToTest = "testResetOnlyDel"; 85 86 optionsRef = GetOptions(); 87 88 T_ASSERT_EQ(SetVariable(varToTest, "1234", optionsRef), KERN_SUCCESS, "Set variable %s successfully\n", varToTest); 89 T_ASSERT_NE(DeleteVariable(varToTest, optionsRef), KERN_SUCCESS, "Delete variable %s failed as expected\n", varToTest); 90 91 if (getopt(argc, argv, "r") == 'r') { 92 T_ASSERT_EQ(ResetNVram(optionsRef), KERN_SUCCESS, "Reset NVram successfully\n"); 93 T_ASSERT_NE(GetVariable(varToTest, optionsRef), KERN_SUCCESS, "Read variable %s failed as expected\n", varToTest); 94 } 95 96 ReleaseOptions(optionsRef); 97 } 98 99 // Test that writing of entitled variables without entitlement should fail 100 T_DECL(TestVarEnt, "Test variable specific entitlement") 101 { 102 const char * varToTest = "testEntitlement"; 103 104 optionsRef = GetOptions(); 105 106 T_ASSERT_NE(SetVariable(varToTest, "1234", optionsRef), KERN_SUCCESS, "Set variable %s failed as expected\n", varToTest); 107 108 ReleaseOptions(optionsRef); 109 } 110 #endif /* !(__x86_64__) */ 111