1 /* This Source Code Form is subject to the terms of the Mozilla Public
2  * License, v. 2.0. If a copy of the MPL was not distributed with this
3  * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
4 /*
5  * test_policynode.c
6  *
7  * Test PolicyNode Type
8  *
9  */
10 
11 #include "testutil.h"
12 #include "testutil_nss.h"
13 
14 static void *plContext = NULL;
15 
16 static void
test_GetChildren(PKIX_PolicyNode * goodNode,PKIX_PolicyNode * equalNode,PKIX_PolicyNode * diffNode)17 test_GetChildren(
18     PKIX_PolicyNode *goodNode,
19     PKIX_PolicyNode *equalNode,
20     PKIX_PolicyNode *diffNode)
21 {
22 
23     /*
24  * Caution: be careful where you insert this test. PKIX_PolicyNode_GetChildren
25  * is required by the API to return an immutable List, and it does it by setting
26  * the List immutable. We don't make a copy because the assumption is that
27  * certificate and policy processing have been completed before the user gets at
28  * the public API. So subsequent tests of functions that modify the policy tree,
29  * such as Prune, will fail if called after the execution of this test.
30  */
31 
32     PKIX_Boolean isImmutable = PKIX_FALSE;
33     PKIX_List *goodList = NULL;
34     PKIX_List *equalList = NULL;
35     PKIX_List *diffList = NULL;
36 
37     PKIX_TEST_STD_VARS();
38 
39     subTest("PKIX_PolicyNode_GetChildren");
40 
41     PKIX_TEST_EXPECT_NO_ERROR(PKIX_PolicyNode_GetChildren(goodNode, &goodList, plContext));
42     PKIX_TEST_EXPECT_NO_ERROR(PKIX_PolicyNode_GetChildren(equalNode, &equalList, plContext));
43     PKIX_TEST_EXPECT_NO_ERROR(PKIX_PolicyNode_GetChildren(diffNode, &diffList, plContext));
44 
45     PKIX_TEST_EQ_HASH_TOSTR_DUP(goodList, equalList, diffList, NULL, List, NULL);
46 
47     PKIX_TEST_EXPECT_NO_ERROR(PKIX_List_IsImmutable(goodList, &isImmutable, plContext));
48 
49     if (isImmutable != PKIX_TRUE) {
50         testError("PKIX_PolicyNode_GetChildren returned a mutable List");
51     }
52 
53 cleanup:
54     PKIX_TEST_DECREF_AC(goodList);
55     PKIX_TEST_DECREF_AC(equalList);
56     PKIX_TEST_DECREF_AC(diffList);
57 
58     PKIX_TEST_RETURN();
59 }
60 
61 static void
test_GetParent(PKIX_PolicyNode * goodNode,PKIX_PolicyNode * equalNode,PKIX_PolicyNode * diffNode,char * expectedAscii)62 test_GetParent(
63     PKIX_PolicyNode *goodNode,
64     PKIX_PolicyNode *equalNode,
65     PKIX_PolicyNode *diffNode,
66     char *expectedAscii)
67 {
68     PKIX_PolicyNode *goodParent = NULL;
69     PKIX_PolicyNode *equalParent = NULL;
70     PKIX_PolicyNode *diffParent = NULL;
71 
72     PKIX_TEST_STD_VARS();
73 
74     subTest("PKIX_PolicyNode_GetParent");
75 
76     PKIX_TEST_EXPECT_NO_ERROR(PKIX_PolicyNode_GetParent(goodNode, &goodParent, plContext));
77     PKIX_TEST_EXPECT_NO_ERROR(PKIX_PolicyNode_GetParent(equalNode, &equalParent, plContext));
78     PKIX_TEST_EXPECT_NO_ERROR(PKIX_PolicyNode_GetParent(diffNode, &diffParent, plContext));
79 
80     PKIX_TEST_EQ_HASH_TOSTR_DUP(goodParent,
81                                 equalParent,
82                                 diffParent,
83                                 expectedAscii,
84                                 CertPolicyNode,
85                                 NULL);
86 
87 cleanup:
88     PKIX_TEST_DECREF_AC(goodParent);
89     PKIX_TEST_DECREF_AC(equalParent);
90     PKIX_TEST_DECREF_AC(diffParent);
91 
92     PKIX_TEST_RETURN();
93 }
94 
95 /*
96  * This test is the same as testDuplicateHelper, except that it
97  * produces a more useful "Actual value" and "Expected value"
98  * in the case of an unexpected mismatch.
99  */
100 static void
test_DuplicateHelper(PKIX_PolicyNode * object,void * plContext)101 test_DuplicateHelper(PKIX_PolicyNode *object, void *plContext)
102 {
103     PKIX_PolicyNode *newObject = NULL;
104     PKIX_Boolean cmpResult;
105     PKIX_PL_String *original = NULL;
106     PKIX_PL_String *copy = NULL;
107 
108     PKIX_TEST_STD_VARS();
109 
110     subTest("testing pkix_PolicyNode_Duplicate");
111 
112     PKIX_TEST_EXPECT_NO_ERROR(PKIX_PL_Object_Duplicate((PKIX_PL_Object *)object,
113                                                        (PKIX_PL_Object **)&newObject,
114                                                        plContext));
115 
116     PKIX_TEST_EXPECT_NO_ERROR(PKIX_PL_Object_Equals((PKIX_PL_Object *)object,
117                                                     (PKIX_PL_Object *)newObject,
118                                                     &cmpResult,
119                                                     plContext));
120 
121     if (!cmpResult) {
122         PKIX_TEST_EXPECT_NO_ERROR(PKIX_PL_Object_ToString((PKIX_PL_Object *)object, &original, plContext));
123         testError("unexpected mismatch");
124         (void)printf("original value:\t%s\n", original->escAsciiString);
125 
126         if (newObject) {
127             PKIX_TEST_EXPECT_NO_ERROR(PKIX_PL_Object_ToString((PKIX_PL_Object *)newObject, &copy, plContext));
128             (void)printf("copy value:\t%s\n", copy->escAsciiString);
129         } else {
130             (void)printf("copy value:\t(NULL)\n");
131         }
132     }
133 
134 cleanup:
135 
136     PKIX_TEST_DECREF_AC(newObject);
137     PKIX_TEST_DECREF_AC(original);
138     PKIX_TEST_DECREF_AC(copy);
139 
140     PKIX_TEST_RETURN();
141 }
142 
143 static void
test_GetValidPolicy(PKIX_PolicyNode * goodNode,PKIX_PolicyNode * equalNode,PKIX_PolicyNode * diffNode,char * expectedAscii)144 test_GetValidPolicy(
145     PKIX_PolicyNode *goodNode,
146     PKIX_PolicyNode *equalNode,
147     PKIX_PolicyNode *diffNode,
148     char *expectedAscii)
149 {
150     PKIX_PL_OID *goodPolicy = NULL;
151     PKIX_PL_OID *equalPolicy = NULL;
152     PKIX_PL_OID *diffPolicy = NULL;
153 
154     PKIX_TEST_STD_VARS();
155 
156     subTest("PKIX_PolicyNode_GetValidPolicy");
157 
158     PKIX_TEST_EXPECT_NO_ERROR(PKIX_PolicyNode_GetValidPolicy(goodNode, &goodPolicy, plContext));
159     PKIX_TEST_EXPECT_NO_ERROR(PKIX_PolicyNode_GetValidPolicy(equalNode, &equalPolicy, plContext));
160     PKIX_TEST_EXPECT_NO_ERROR(PKIX_PolicyNode_GetValidPolicy(diffNode, &diffPolicy, plContext));
161 
162     PKIX_TEST_EQ_HASH_TOSTR_DUP(goodPolicy, equalPolicy, diffPolicy, expectedAscii, OID, NULL);
163 
164 cleanup:
165     PKIX_TEST_DECREF_AC(goodPolicy);
166     PKIX_TEST_DECREF_AC(equalPolicy);
167     PKIX_TEST_DECREF_AC(diffPolicy);
168 
169     PKIX_TEST_RETURN();
170 }
171 
172 static void
test_GetPolicyQualifiers(PKIX_PolicyNode * goodNode,PKIX_PolicyNode * equalNode,PKIX_PolicyNode * diffNode,char * expectedAscii)173 test_GetPolicyQualifiers(
174     PKIX_PolicyNode *goodNode,
175     PKIX_PolicyNode *equalNode,
176     PKIX_PolicyNode *diffNode,
177     char *expectedAscii)
178 {
179     PKIX_Boolean isImmutable = PKIX_FALSE;
180     PKIX_List *goodList = NULL;
181     PKIX_List *equalList = NULL;
182     PKIX_List *diffList = NULL;
183 
184     PKIX_TEST_STD_VARS();
185 
186     subTest("PKIX_PolicyNode_GetPolicyQualifiers");
187 
188     PKIX_TEST_EXPECT_NO_ERROR(PKIX_PolicyNode_GetPolicyQualifiers(goodNode, &goodList, plContext));
189     PKIX_TEST_EXPECT_NO_ERROR(PKIX_PolicyNode_GetPolicyQualifiers(equalNode, &equalList, plContext));
190     PKIX_TEST_EXPECT_NO_ERROR(PKIX_PolicyNode_GetPolicyQualifiers(diffNode, &diffList, plContext));
191 
192     PKIX_TEST_EQ_HASH_TOSTR_DUP(goodList, equalList, diffList, expectedAscii, List, plContext);
193 
194     PKIX_TEST_EXPECT_NO_ERROR(PKIX_List_IsImmutable(goodList, &isImmutable, plContext));
195 
196     if (isImmutable != PKIX_TRUE) {
197         testError("PKIX_PolicyNode_GetPolicyQualifiers returned a mutable List");
198     }
199 cleanup:
200     PKIX_TEST_DECREF_AC(goodList);
201     PKIX_TEST_DECREF_AC(equalList);
202     PKIX_TEST_DECREF_AC(diffList);
203 
204     PKIX_TEST_RETURN();
205 }
206 
207 static void
test_GetExpectedPolicies(PKIX_PolicyNode * goodNode,PKIX_PolicyNode * equalNode,PKIX_PolicyNode * diffNode,char * expectedAscii)208 test_GetExpectedPolicies(
209     PKIX_PolicyNode *goodNode,
210     PKIX_PolicyNode *equalNode,
211     PKIX_PolicyNode *diffNode,
212     char *expectedAscii)
213 {
214     PKIX_Boolean isImmutable = PKIX_FALSE;
215     PKIX_List *goodList = NULL;
216     PKIX_List *equalList = NULL;
217     PKIX_List *diffList = NULL;
218 
219     PKIX_TEST_STD_VARS();
220 
221     subTest("PKIX_PolicyNode_GetExpectedPolicies");
222 
223     PKIX_TEST_EXPECT_NO_ERROR(PKIX_PolicyNode_GetExpectedPolicies(goodNode, &goodList, plContext));
224     PKIX_TEST_EXPECT_NO_ERROR(PKIX_PolicyNode_GetExpectedPolicies(equalNode, &equalList, plContext));
225     PKIX_TEST_EXPECT_NO_ERROR(PKIX_PolicyNode_GetExpectedPolicies(diffNode, &diffList, plContext));
226 
227     PKIX_TEST_EQ_HASH_TOSTR_DUP(goodList, equalList, diffList, expectedAscii, List, plContext);
228 
229     PKIX_TEST_EXPECT_NO_ERROR(PKIX_List_IsImmutable(goodList, &isImmutable, plContext));
230 
231     if (isImmutable != PKIX_TRUE) {
232         testError("PKIX_PolicyNode_GetExpectedPolicies returned a mutable List");
233     }
234 cleanup:
235     PKIX_TEST_DECREF_AC(goodList);
236     PKIX_TEST_DECREF_AC(equalList);
237     PKIX_TEST_DECREF_AC(diffList);
238 
239     PKIX_TEST_RETURN();
240 }
241 
242 static void
test_IsCritical(PKIX_PolicyNode * goodNode,PKIX_PolicyNode * equalNode,PKIX_PolicyNode * diffNode)243 test_IsCritical(
244     PKIX_PolicyNode *goodNode,
245     PKIX_PolicyNode *equalNode,
246     PKIX_PolicyNode *diffNode)
247 {
248     PKIX_Boolean goodBool = PKIX_FALSE;
249     PKIX_Boolean equalBool = PKIX_FALSE;
250     PKIX_Boolean diffBool = PKIX_FALSE;
251     PKIX_TEST_STD_VARS();
252 
253     subTest("PKIX_PolicyNode_IsCritical");
254 
255     PKIX_TEST_EXPECT_NO_ERROR(PKIX_PolicyNode_IsCritical(goodNode, &goodBool, plContext));
256     PKIX_TEST_EXPECT_NO_ERROR(PKIX_PolicyNode_IsCritical(equalNode, &equalBool, plContext));
257     PKIX_TEST_EXPECT_NO_ERROR(PKIX_PolicyNode_IsCritical(diffNode, &diffBool, plContext));
258 
259     if ((!goodBool) || (!equalBool) || (diffBool)) {
260         testError("IsCritical returned unexpected value");
261     }
262 cleanup:
263 
264     PKIX_TEST_RETURN();
265 }
266 
267 static void
test_GetDepth(PKIX_PolicyNode * depth1Node,PKIX_PolicyNode * depth2Node,PKIX_PolicyNode * depth3Node)268 test_GetDepth(
269     PKIX_PolicyNode *depth1Node,
270     PKIX_PolicyNode *depth2Node,
271     PKIX_PolicyNode *depth3Node)
272 {
273     PKIX_UInt32 depth1 = 0;
274     PKIX_UInt32 depth2 = 0;
275     PKIX_UInt32 depth3 = 0;
276     PKIX_TEST_STD_VARS();
277 
278     subTest("PKIX_PolicyNode_GetDepth");
279 
280     PKIX_TEST_EXPECT_NO_ERROR(PKIX_PolicyNode_GetDepth(depth1Node, &depth1, plContext));
281     PKIX_TEST_EXPECT_NO_ERROR(PKIX_PolicyNode_GetDepth(depth2Node, &depth2, plContext));
282     PKIX_TEST_EXPECT_NO_ERROR(PKIX_PolicyNode_GetDepth(depth3Node, &depth3, plContext));
283 
284     if ((depth1 != 1) || (depth2 != 2) || (depth3 != 3)) {
285         testError("GetDepth returned unexpected value");
286     }
287 
288 cleanup:
289 
290     PKIX_TEST_RETURN();
291 }
292 
293 static void
printUsage(void)294 printUsage(void)
295 {
296     (void)printf("\nUSAGE:\ttest_policynode <NIST_FILES_DIR> \n\n");
297 }
298 
299 int
test_policynode(int argc,char * argv[])300 test_policynode(int argc, char *argv[])
301 {
302 
303     /*
304          * Create a tree with parent = anyPolicy,
305          * child1 with Nist1+Nist2, child2 with Nist1.
306          * Give each child another child, with policies Nist2
307          * and Nist1, respectively. Pruning with a depth of two
308          * should have no effect. Give one of the children
309          * another child. Then pruning with a depth of three
310          * should reduce the tree to a single strand, as child1
311          * and child3 are removed.
312          *
313          *              parent (anyPolicy)
314          *          /                   \
315          *      child1(Nist1+Nist2)     child2(Nist1)
316          *          |                       |
317          *      child3(Nist2)           child4(Nist1)
318          *                                  |
319          *                              child5(Nist1)
320          *
321          */
322     char *asciiAnyPolicy = "2.5.29.32.0";
323     PKIX_PL_Cert *cert = NULL;
324     PKIX_PL_CertPolicyInfo *nist1Policy = NULL;
325     PKIX_PL_CertPolicyInfo *nist2Policy = NULL;
326     PKIX_List *policyQualifierList = NULL;
327     PKIX_PL_OID *oidAnyPolicy = NULL;
328     PKIX_PL_OID *oidNist1Policy = NULL;
329     PKIX_PL_OID *oidNist2Policy = NULL;
330     PKIX_List *expectedAnyList = NULL;
331     PKIX_List *expectedNist1List = NULL;
332     PKIX_List *expectedNist2List = NULL;
333     PKIX_List *expectedNist1Nist2List = NULL;
334     PKIX_List *emptyList = NULL;
335     PKIX_PolicyNode *parentNode = NULL;
336     PKIX_PolicyNode *childNode1 = NULL;
337     PKIX_PolicyNode *childNode2 = NULL;
338     PKIX_PolicyNode *childNode3 = NULL;
339     PKIX_PolicyNode *childNode4 = NULL;
340     PKIX_PolicyNode *childNode5 = NULL;
341     PKIX_PL_String *parentString = NULL;
342     PKIX_Boolean pDelete = PKIX_FALSE;
343     char *expectedParentAscii =
344         "{2.16.840.1.101.3.2.1.48.2,(1.3.6.1.5.5.7.2.2:[30 5C "
345         "1A 5A 71 31 3A 20 20 54 68 69 73 20 69 73 20 74 68 65"
346         " 20 75 73 65 72 20 6E 6F 74 69 63 65 20 66 72 6F 6D 2"
347         "0 71 75 61 6C 69 66 69 65 72 20 31 2E 20 20 54 68 69 "
348         "73 20 63 65 72 74 69 66 69 63 61 74 65 20 69 73 20 66"
349         " 6F 72 20 74 65 73 74 20 70 75 72 70 6F 73 65 73 20 6"
350         "F 6E 6C 79]),Critical,(2.16.840.1.101.3.2.1.48.1[(1.3"
351         ".6.1.5.5.7.2.2:[30 5C 1A 5A 71 31 3A 20 20 54 68 69 7"
352         "3 20 69 73 20 74 68 65 20 75 73 65 72 20 6E 6F 74 69 "
353         "63 65 20 66 72 6F 6D 20 71 75 61 6C 69 66 69 65 72 20"
354         " 31 2E 20 20 54 68 69 73 20 63 65 72 74 69 66 69 63 6"
355         "1 74 65 20 69 73 20 66 6F 72 20 74 65 73 74 20 70 75 "
356         "72 70 6F 73 65 73 20 6F 6E 6C 79])], 2.16.840.1.101.3"
357         ".2.1.48.2[(1.3.6.1.5.5.7.2.2:[30 5A 1A 58 71 32 3A 20"
358         " 20 54 68 69 73 20 69 73 20 74 68 65 20 75 73 65 72 2"
359         "0 6E 6F 74 69 63 65 20 66 72 6F 6D 20 71 75 61 6C 69 "
360         "66 69 65 72 20 32 2E 20 20 54 68 69 73 20 75 73 65 72"
361         " 20 6E 6F 74 69 63 65 20 73 68 6F 75 6C 64 20 6E 6F 7"
362         "4 20 62 65 20 64 69 73 70 6C 61 79 65 64])]),1}\n"
363         ". {2.16.840.1.101.3.2.1.48.2,(1.3.6.1.5.5.7.2.2:[30 5"
364         "C 1A 5A 71 31 3A 20 20 54 68 69 73 20 69 73 20 74 68 "
365         "65 20 75 73 65 72 20 6E 6F 74 69 63 65 20 66 72 6F 6D"
366         " 20 71 75 61 6C 69 66 69 65 72 20 31 2E 20 20 54 68 6"
367         "9 73 20 63 65 72 74 69 66 69 63 61 74 65 20 69 73 20 "
368         "66 6F 72 20 74 65 73 74 20 70 75 72 70 6F 73 65 73 20"
369         " 6F 6E 6C 79]),Critical,(2.16.840.1.101.3.2.1.48.2),2}";
370     char *expectedValidAscii =
371         "2.16.840.1.101.3.2.1.48.2";
372     char *expectedQualifiersAscii =
373         /* "(1.3.6.1.5.5.7.2.2)"; */
374         "(1.3.6.1.5.5.7.2.2:[30 5C 1A 5A 71 31 3A 20 20 54 68 "
375         "69 73 20 69 73 20 74 68 65 20 75 73 65 72 20 6E 6F 74"
376         " 69 63 65 20 66 72 6F 6D 20 71 75 61 6C 69 66 69 65 7"
377         "2 20 31 2E 20 20 54 68 69 73 20 63 65 72 74 69 66 69 "
378         "63 61 74 65 20 69 73 20 66 6F 72 20 74 65 73 74 20 70"
379         " 75 72 70 6F 73 65 73 20 6F 6E 6C 79])";
380     char *expectedPoliciesAscii =
381         "(2.16.840.1.101.3.2.1.48.1)";
382     char *expectedTree =
383         "{2.5.29.32.0,{},Critical,(2.5.29.32.0),0}\n"
384         ". {2.16.840.1.101.3.2.1.48.2,(1.3.6.1.5.5.7.2.2:[30 5"
385         "C 1A 5A 71 31 3A 20 20 54 68 69 73 20 69 73 20 74 68 "
386         "65 20 75 73 65 72 20 6E 6F 74 69 63 65 20 66 72 6F 6D"
387         " 20 71 75 61 6C 69 66 69 65 72 20 31 2E 20 20 54 68 6"
388         "9 73 20 63 65 72 74 69 66 69 63 61 74 65 20 69 73 20 "
389         "66 6F 72 20 74 65 73 74 20 70 75 72 70 6F 73 65 73 20"
390         " 6F 6E 6C 79]),Critical,(2.16.840.1.101.3.2.1.48.1[(1"
391         ".3.6.1.5.5.7.2.2:[30 5C 1A 5A 71 31 3A 20 20 54 68 69"
392         " 73 20 69 73 20 74 68 65 20 75 73 65 72 20 6E 6F 74 6"
393         "9 63 65 20 66 72 6F 6D 20 71 75 61 6C 69 66 69 65 72 "
394         "20 31 2E 20 20 54 68 69 73 20 63 65 72 74 69 66 69 63"
395         " 61 74 65 20 69 73 20 66 6F 72 20 74 65 73 74 20 70 7"
396         "5 72 70 6F 73 65 73 20 6F 6E 6C 79])], 2.16.840.1.101"
397         ".3.2.1.48.2[(1.3.6.1.5.5.7.2.2:[30 5A 1A 58 71 32 3A "
398         "20 20 54 68 69 73 20 69 73 20 74 68 65 20 75 73 65 72"
399         " 20 6E 6F 74 69 63 65 20 66 72 6F 6D 20 71 75 61 6C 6"
400         "9 66 69 65 72 20 32 2E 20 20 54 68 69 73 20 75 73 65 "
401         "72 20 6E 6F 74 69 63 65 20 73 68 6F 75 6C 64 20 6E 6F"
402         " 74 20 62 65 20 64 69 73 70 6C 61 79 65 64])]"
403         "),1}\n"
404         ". . {2.16.840.1.101.3.2.1.48.2,(1.3.6.1.5.5.7.2.2:[30"
405         " 5C 1A 5A 71 31 3A 20 20 54 68 69 73 20 69 73 20 74 6"
406         "8 65 20 75 73 65 72 20 6E 6F 74 69 63 65 20 66 72 6F "
407         "6D 20 71 75 61 6C 69 66 69 65 72 20 31 2E 20 20 54 68"
408         " 69 73 20 63 65 72 74 69 66 69 63 61 74 65 20 69 73 2"
409         "0 66 6F 72 20 74 65 73 74 20 70 75 72 70 6F 73 65 73 "
410         "20 6F 6E 6C 79]),Critical,(2.16.840.1.101.3.2.1.48.2)"
411         ",2}\n"
412         ". {2.16.840.1.101.3.2.1.48.1,(1.3.6.1.5.5.7.2.2:[30 5"
413         "C 1A 5A 71 31 3A 20 20 54 68 69 73 20 69 73 20 74 68 "
414         "65 20 75 73 65 72 20 6E 6F 74 69 63 65 20 66 72 6F 6D"
415         " 20 71 75 61 6C 69 66 69 65 72 20 31 2E 20 20 54 68 6"
416         "9 73 20 63 65 72 74 69 66 69 63 61 74 65 20 69 73 20 "
417         "66 6F 72 20 74 65 73 74 20 70 75 72 70 6F 73 65 73 20"
418         " 6F 6E 6C 79]),Critical,(2.16.840.1.101.3.2.1.48.1),1}\n"
419         ". . {2.16.840.1.101.3.2.1.48.1,(EMPTY),Not Critical,"
420         "(2.16.840.1.101.3.2.1.48.1),2}\n"
421         ". . . {2.16.840.1.101.3.2.1.48.1,{},Critical,(2.16.84"
422         "0.1.101.3.2.1.48.1),3}";
423     char *expectedPrunedTree =
424         "{2.5.29.32.0,{},Critical,(2.5.29.32.0),0}\n"
425         ". {2.16.840.1.101.3.2.1.48.1,(1.3.6.1.5.5.7.2.2:[30 5"
426         "C 1A 5A 71 31 3A 20 20 54 68 69 73 20 69 73 20 74 68 "
427         "65 20 75 73 65 72 20 6E 6F 74 69 63 65 20 66 72 6F 6D"
428         " 20 71 75 61 6C 69 66 69 65 72 20 31 2E 20 20 54 68 6"
429         "9 73 20 63 65 72 74 69 66 69 63 61 74 65 20 69 73 20 "
430         "66 6F 72 20 74 65 73 74 20 70 75 72 70 6F 73 65 73 20"
431         " 6F 6E 6C 79]),Critical,(2.16.840.1.101.3.2.1.48.1),1}\n"
432         ". . {2.16.840.1.101.3.2.1.48.1,(EMPTY),Not Critical,"
433         "(2.16.840.1.101.3.2.1.48.1),2}\n"
434         ". . . {2.16.840.1.101.3.2.1.48.1,{},Critical,(2.16.84"
435         "0.1.101.3.2.1.48.1),3}";
436 
437     PKIX_UInt32 actualMinorVersion;
438     PKIX_UInt32 j = 0;
439     char *dirName = NULL;
440 
441     PKIX_TEST_STD_VARS();
442 
443     if (argc < 2) {
444         printUsage();
445         return (0);
446     }
447 
448     startTests("PolicyNode");
449 
450     PKIX_TEST_EXPECT_NO_ERROR(
451         PKIX_PL_NssContext_Create(0, PKIX_FALSE, NULL, &plContext));
452 
453     dirName = argv[j + 1];
454 
455     subTest("Creating OID objects");
456     PKIX_TEST_EXPECT_NO_ERROR(PKIX_PL_OID_Create(asciiAnyPolicy, &oidAnyPolicy, plContext));
457 
458     /* Read certificates to get real policies, qualifiers */
459 
460     cert = createCert(dirName, "UserNoticeQualifierTest16EE.crt", plContext);
461 
462     PKIX_TEST_EXPECT_NO_ERROR(PKIX_PL_Cert_GetPolicyInformation(cert, &expectedNist1Nist2List, plContext));
463     PKIX_TEST_EXPECT_NO_ERROR(PKIX_List_GetItem(expectedNist1Nist2List,
464                                                 0,
465                                                 (PKIX_PL_Object **)&nist1Policy,
466                                                 plContext));
467     PKIX_TEST_EXPECT_NO_ERROR(PKIX_List_GetItem(expectedNist1Nist2List,
468                                                 1,
469                                                 (PKIX_PL_Object **)&nist2Policy,
470                                                 plContext));
471 
472     PKIX_TEST_EXPECT_NO_ERROR(PKIX_PL_CertPolicyInfo_GetPolQualifiers(nist1Policy, &policyQualifierList, plContext));
473 
474     PKIX_TEST_EXPECT_NO_ERROR(PKIX_PL_CertPolicyInfo_GetPolicyId(nist1Policy, &oidNist1Policy, plContext));
475 
476     PKIX_TEST_EXPECT_NO_ERROR(PKIX_PL_CertPolicyInfo_GetPolicyId(nist2Policy, &oidNist2Policy, plContext));
477 
478     subTest("Creating expectedPolicy List objects");
479 
480     PKIX_TEST_EXPECT_NO_ERROR(PKIX_List_Create(&expectedAnyList, plContext));
481 
482     PKIX_TEST_EXPECT_NO_ERROR(PKIX_List_Create(&expectedNist1List, plContext));
483 
484     PKIX_TEST_EXPECT_NO_ERROR(PKIX_List_Create(&expectedNist2List, plContext));
485 
486     subTest("Populating expectedPolicy List objects");
487 
488     PKIX_TEST_EXPECT_NO_ERROR(PKIX_List_AppendItem(expectedAnyList, (PKIX_PL_Object *)oidAnyPolicy, plContext));
489 
490     PKIX_TEST_EXPECT_NO_ERROR(PKIX_List_AppendItem(expectedNist1List,
491                                                    (PKIX_PL_Object *)oidNist1Policy,
492                                                    plContext));
493 
494     PKIX_TEST_EXPECT_NO_ERROR(PKIX_List_AppendItem(expectedNist2List,
495                                                    (PKIX_PL_Object *)oidNist2Policy,
496                                                    plContext));
497 
498     subTest("Creating PolicyNode objects");
499 
500     PKIX_TEST_EXPECT_NO_ERROR(PKIX_List_Create(&emptyList, plContext));
501 
502     PKIX_TEST_EXPECT_NO_ERROR(pkix_PolicyNode_Create(oidAnyPolicy,
503                                                      NULL,
504                                                      PKIX_TRUE,
505                                                      expectedAnyList,
506                                                      &parentNode,
507                                                      plContext));
508 
509     PKIX_TEST_EXPECT_NO_ERROR(pkix_PolicyNode_Create(oidNist2Policy,
510                                                      policyQualifierList,
511                                                      PKIX_TRUE,
512                                                      expectedNist1Nist2List,
513                                                      &childNode1,
514                                                      plContext));
515 
516     PKIX_TEST_EXPECT_NO_ERROR(pkix_PolicyNode_Create(oidNist1Policy,
517                                                      policyQualifierList,
518                                                      PKIX_TRUE,
519                                                      expectedNist1List,
520                                                      &childNode2,
521                                                      plContext));
522 
523     PKIX_TEST_EXPECT_NO_ERROR(pkix_PolicyNode_Create(oidNist2Policy,
524                                                      policyQualifierList,
525                                                      PKIX_TRUE,
526                                                      expectedNist2List,
527                                                      &childNode3,
528                                                      plContext));
529 
530     PKIX_TEST_EXPECT_NO_ERROR(pkix_PolicyNode_Create(oidNist1Policy,
531                                                      emptyList,
532                                                      PKIX_FALSE,
533                                                      expectedNist1List,
534                                                      &childNode4,
535                                                      plContext));
536 
537     PKIX_TEST_EXPECT_NO_ERROR(pkix_PolicyNode_Create(oidNist1Policy,
538                                                      NULL,
539                                                      PKIX_TRUE,
540                                                      expectedNist1List,
541                                                      &childNode5,
542                                                      plContext));
543 
544     subTest("Creating the PolicyNode tree");
545 
546     PKIX_TEST_EXPECT_NO_ERROR(pkix_PolicyNode_AddToParent(parentNode, childNode1, plContext));
547     PKIX_TEST_EXPECT_NO_ERROR(pkix_PolicyNode_AddToParent(parentNode, childNode2, plContext));
548 
549     PKIX_TEST_EXPECT_NO_ERROR(pkix_PolicyNode_AddToParent(childNode1, childNode3, plContext));
550 
551     PKIX_TEST_EXPECT_NO_ERROR(pkix_PolicyNode_AddToParent(childNode2, childNode4, plContext));
552 
553     PKIX_TEST_EXPECT_NO_ERROR(pkix_PolicyNode_AddToParent(childNode4, childNode5, plContext));
554 
555     subTest("Displaying PolicyNode objects");
556 
557     PKIX_TEST_EXPECT_NO_ERROR(PKIX_PL_Object_ToString((PKIX_PL_Object *)parentNode, &parentString, plContext));
558     (void)printf("parentNode is\n\t%s\n", parentString->escAsciiString);
559 
560     testToStringHelper((PKIX_PL_Object *)parentNode, expectedTree, plContext);
561 
562     test_DuplicateHelper(parentNode, plContext);
563 
564     test_GetParent(childNode3, childNode3, childNode4, expectedParentAscii);
565     test_GetValidPolicy(childNode1, childNode3, parentNode, expectedValidAscii);
566     test_GetPolicyQualifiers(childNode1, childNode3, childNode4, expectedQualifiersAscii);
567     test_GetExpectedPolicies(childNode2, childNode4, childNode3, expectedPoliciesAscii);
568     test_IsCritical(childNode1, childNode2, childNode4);
569     test_GetDepth(childNode2, childNode4, childNode5);
570 
571     subTest("pkix_PolicyNode_Prune");
572 
573     PKIX_TEST_EXPECT_NO_ERROR(pkix_PolicyNode_Prune(parentNode, 2, &pDelete, plContext));
574 
575     testToStringHelper((PKIX_PL_Object *)parentNode, expectedTree, plContext);
576 
577     PKIX_TEST_EXPECT_NO_ERROR(pkix_PolicyNode_Prune(parentNode, 3, &pDelete, plContext));
578 
579     testToStringHelper((PKIX_PL_Object *)parentNode, expectedPrunedTree, plContext);
580 
581     test_GetChildren(parentNode, parentNode, childNode2);
582 
583 cleanup:
584 
585     PKIX_TEST_DECREF_AC(cert);
586     PKIX_TEST_DECREF_AC(nist1Policy);
587     PKIX_TEST_DECREF_AC(nist2Policy);
588     PKIX_TEST_DECREF_AC(policyQualifierList);
589     PKIX_TEST_DECREF_AC(oidAnyPolicy);
590     PKIX_TEST_DECREF_AC(oidNist1Policy);
591     PKIX_TEST_DECREF_AC(oidNist2Policy);
592     PKIX_TEST_DECREF_AC(expectedAnyList);
593     PKIX_TEST_DECREF_AC(expectedNist1List);
594     PKIX_TEST_DECREF_AC(expectedNist2List);
595     PKIX_TEST_DECREF_AC(expectedNist1Nist2List);
596     PKIX_TEST_DECREF_AC(emptyList);
597     PKIX_TEST_DECREF_AC(parentNode);
598     PKIX_TEST_DECREF_AC(childNode1);
599     PKIX_TEST_DECREF_AC(childNode2);
600     PKIX_TEST_DECREF_AC(childNode3);
601     PKIX_TEST_DECREF_AC(childNode4);
602     PKIX_TEST_DECREF_AC(childNode5);
603     PKIX_TEST_DECREF_AC(parentString);
604 
605     PKIX_Shutdown(plContext);
606 
607     PKIX_TEST_RETURN();
608 
609     endTests("PolicyNode");
610 
611     return (0);
612 }
613