xref: /xnu-8796.121.2/tests/nvram_tests/nvram_nonentitled.c (revision c54f35ca767986246321eb901baf8f5ff7923f6a)
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