|
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 * pkix_crlselector.c |
|
6 * |
|
7 * CRLSelector Function Definitions |
|
8 * |
|
9 */ |
|
10 |
|
11 #include "pkix_crlselector.h" |
|
12 |
|
13 /* --CRLSelector Private-Functions-------------------------------------- */ |
|
14 |
|
15 /* |
|
16 * FUNCTION: pkix_CRLSelector_Destroy |
|
17 * (see comments for PKIX_PL_DestructorCallback in pkix_pl_system.h) |
|
18 */ |
|
19 static PKIX_Error * |
|
20 pkix_CRLSelector_Destroy( |
|
21 PKIX_PL_Object *object, |
|
22 void *plContext) |
|
23 { |
|
24 PKIX_CRLSelector *selector = NULL; |
|
25 |
|
26 PKIX_ENTER(CRLSELECTOR, "pkix_CRLSelector_Destroy"); |
|
27 PKIX_NULLCHECK_ONE(object); |
|
28 |
|
29 PKIX_CHECK(pkix_CheckType(object, PKIX_CRLSELECTOR_TYPE, plContext), |
|
30 PKIX_OBJECTNOTCRLSELECTOR); |
|
31 |
|
32 selector = (PKIX_CRLSelector *)object; |
|
33 |
|
34 selector->matchCallback = NULL; |
|
35 |
|
36 PKIX_DECREF(selector->params); |
|
37 PKIX_DECREF(selector->context); |
|
38 |
|
39 cleanup: |
|
40 |
|
41 PKIX_RETURN(CRLSELECTOR); |
|
42 } |
|
43 |
|
44 /* |
|
45 * FUNCTION: pkix_CRLSelector_ToString_Helper |
|
46 * |
|
47 * DESCRIPTION: |
|
48 * Helper function that creates a string representation of CRLSelector |
|
49 * pointed to by "crlParams" and stores its address in the object pointed to |
|
50 * by "pString". |
|
51 * |
|
52 * PARAMETERS |
|
53 * "list" |
|
54 * Address of CRLSelector whose string representation is desired. |
|
55 * Must be non-NULL. |
|
56 * "pString" |
|
57 * Address of object pointer's destination. Must be non-NULL. |
|
58 * "plContext" - Platform-specific context pointer. |
|
59 * |
|
60 * THREAD SAFETY: |
|
61 * Conditionally Thread Safe |
|
62 * (see Thread Safety Definitions in Programmer's Guide) |
|
63 * |
|
64 * RETURNS: |
|
65 * Returns NULL if the function succeeds. |
|
66 * Returns a CRLSelector Error if the function fails in a non-fatal way. |
|
67 * Returns a Fatal Error if the function fails in an unrecoverable way. |
|
68 */ |
|
69 static PKIX_Error * |
|
70 pkix_CRLSelector_ToString_Helper( |
|
71 PKIX_CRLSelector *crlSelector, |
|
72 PKIX_PL_String **pString, |
|
73 void *plContext) |
|
74 { |
|
75 PKIX_PL_String *crlSelectorString = NULL; |
|
76 PKIX_PL_String *formatString = NULL; |
|
77 PKIX_PL_String *crlParamsString = NULL; |
|
78 PKIX_PL_String *crlContextString = NULL; |
|
79 char *asciiFormat = NULL; |
|
80 |
|
81 PKIX_ENTER(CRLSELECTOR, "pkix_CRLSelector_ToString_Helper"); |
|
82 PKIX_NULLCHECK_TWO(crlSelector, pString); |
|
83 PKIX_NULLCHECK_ONE(crlSelector->params); |
|
84 |
|
85 asciiFormat = |
|
86 "\n\t[\n" |
|
87 "\tMatchCallback: 0x%x\n" |
|
88 "\tParams: %s\n" |
|
89 "\tContext: %s\n" |
|
90 "\t]\n"; |
|
91 |
|
92 PKIX_CHECK(PKIX_PL_String_Create |
|
93 (PKIX_ESCASCII, |
|
94 asciiFormat, |
|
95 0, |
|
96 &formatString, |
|
97 plContext), |
|
98 PKIX_STRINGCREATEFAILED); |
|
99 |
|
100 /* Params */ |
|
101 PKIX_TOSTRING |
|
102 ((PKIX_PL_Object *)crlSelector->params, |
|
103 &crlParamsString, |
|
104 plContext, |
|
105 PKIX_COMCRLSELPARAMSTOSTRINGFAILED); |
|
106 |
|
107 /* Context */ |
|
108 PKIX_TOSTRING(crlSelector->context, &crlContextString, plContext, |
|
109 PKIX_LISTTOSTRINGFAILED); |
|
110 |
|
111 PKIX_CHECK(PKIX_PL_Sprintf |
|
112 (&crlSelectorString, |
|
113 plContext, |
|
114 formatString, |
|
115 crlSelector->matchCallback, |
|
116 crlParamsString, |
|
117 crlContextString), |
|
118 PKIX_SPRINTFFAILED); |
|
119 |
|
120 *pString = crlSelectorString; |
|
121 |
|
122 cleanup: |
|
123 |
|
124 PKIX_DECREF(crlParamsString); |
|
125 PKIX_DECREF(crlContextString); |
|
126 PKIX_DECREF(formatString); |
|
127 |
|
128 PKIX_RETURN(CRLSELECTOR); |
|
129 } |
|
130 |
|
131 /* |
|
132 * FUNCTION: pkix_CRLSelector_ToString |
|
133 * (see comments for PKIX_PL_ToStringCallback in pkix_pl_system.h) |
|
134 */ |
|
135 static PKIX_Error * |
|
136 pkix_CRLSelector_ToString( |
|
137 PKIX_PL_Object *object, |
|
138 PKIX_PL_String **pString, |
|
139 void *plContext) |
|
140 { |
|
141 PKIX_PL_String *crlSelectorString = NULL; |
|
142 PKIX_CRLSelector *crlSelector = NULL; |
|
143 |
|
144 PKIX_ENTER(CRLSELECTOR, "pkix_CRLSelector_ToString"); |
|
145 PKIX_NULLCHECK_TWO(object, pString); |
|
146 |
|
147 PKIX_CHECK(pkix_CheckType(object, PKIX_CRLSELECTOR_TYPE, plContext), |
|
148 PKIX_OBJECTNOTCRLSELECTOR); |
|
149 |
|
150 crlSelector = (PKIX_CRLSelector *) object; |
|
151 |
|
152 PKIX_CHECK(pkix_CRLSelector_ToString_Helper |
|
153 (crlSelector, &crlSelectorString, plContext), |
|
154 PKIX_CRLSELECTORTOSTRINGHELPERFAILED); |
|
155 |
|
156 *pString = crlSelectorString; |
|
157 |
|
158 cleanup: |
|
159 |
|
160 PKIX_RETURN(CRLSELECTOR); |
|
161 } |
|
162 |
|
163 /* |
|
164 * FUNCTION: pkix_CRLSelector_Hashcode |
|
165 * (see comments for PKIX_PL_HashcodeCallback in pkix_pl_system.h) |
|
166 */ |
|
167 static PKIX_Error * |
|
168 pkix_CRLSelector_Hashcode( |
|
169 PKIX_PL_Object *object, |
|
170 PKIX_UInt32 *pHashcode, |
|
171 void *plContext) |
|
172 { |
|
173 PKIX_UInt32 paramsHash = 0; |
|
174 PKIX_UInt32 contextHash = 0; |
|
175 PKIX_UInt32 hash = 0; |
|
176 |
|
177 PKIX_CRLSelector *crlSelector = NULL; |
|
178 |
|
179 PKIX_ENTER(CRLSELECTOR, "pkix_CRLSelector_Hashcode"); |
|
180 PKIX_NULLCHECK_TWO(object, pHashcode); |
|
181 |
|
182 PKIX_CHECK(pkix_CheckType(object, PKIX_CRLSELECTOR_TYPE, plContext), |
|
183 PKIX_OBJECTNOTCRLSELECTOR); |
|
184 |
|
185 crlSelector = (PKIX_CRLSelector *)object; |
|
186 |
|
187 PKIX_HASHCODE(crlSelector->params, ¶msHash, plContext, |
|
188 PKIX_OBJECTHASHCODEFAILED); |
|
189 |
|
190 PKIX_HASHCODE(crlSelector->context, &contextHash, plContext, |
|
191 PKIX_OBJECTHASHCODEFAILED); |
|
192 |
|
193 hash = 31 * ((PKIX_UInt32)crlSelector->matchCallback + |
|
194 (contextHash << 3)) + paramsHash; |
|
195 |
|
196 *pHashcode = hash; |
|
197 |
|
198 cleanup: |
|
199 |
|
200 PKIX_RETURN(CRLSELECTOR); |
|
201 } |
|
202 |
|
203 /* |
|
204 * FUNCTION: pkix_CRLSelector_Equals |
|
205 * (see comments for PKIX_PL_Equals_Callback in pkix_pl_system.h) |
|
206 */ |
|
207 static PKIX_Error * |
|
208 pkix_CRLSelector_Equals( |
|
209 PKIX_PL_Object *firstObject, |
|
210 PKIX_PL_Object *secondObject, |
|
211 PKIX_Boolean *pResult, |
|
212 void *plContext) |
|
213 { |
|
214 PKIX_CRLSelector *firstCrlSelector = NULL; |
|
215 PKIX_CRLSelector *secondCrlSelector = NULL; |
|
216 PKIX_UInt32 secondType; |
|
217 PKIX_Boolean cmpResult = PKIX_FALSE; |
|
218 |
|
219 PKIX_ENTER(CRLSELECTOR, "pkix_CRLSelector_Equals"); |
|
220 PKIX_NULLCHECK_THREE(firstObject, secondObject, pResult); |
|
221 |
|
222 /* test that firstObject is a CRLSelector */ |
|
223 PKIX_CHECK(pkix_CheckType |
|
224 (firstObject, PKIX_CRLSELECTOR_TYPE, plContext), |
|
225 PKIX_FIRSTOBJECTNOTCRLSELECTOR); |
|
226 |
|
227 firstCrlSelector = (PKIX_CRLSelector *)firstObject; |
|
228 secondCrlSelector = (PKIX_CRLSelector *)secondObject; |
|
229 |
|
230 /* |
|
231 * Since we know firstObject is a CRLSelector, if both references are |
|
232 * identical, they must be equal |
|
233 */ |
|
234 if (firstCrlSelector == secondCrlSelector){ |
|
235 *pResult = PKIX_TRUE; |
|
236 goto cleanup; |
|
237 } |
|
238 |
|
239 /* |
|
240 * If secondCRLSelector isn't a CRLSelector, we don't throw an error. |
|
241 * We simply return a Boolean result of FALSE |
|
242 */ |
|
243 *pResult = PKIX_FALSE; |
|
244 PKIX_CHECK(PKIX_PL_Object_GetType |
|
245 ((PKIX_PL_Object *)secondCrlSelector, |
|
246 &secondType, |
|
247 plContext), |
|
248 PKIX_COULDNOTGETTYPEOFSECONDARGUMENT); |
|
249 |
|
250 if (secondType != PKIX_CRLSELECTOR_TYPE) { |
|
251 goto cleanup; |
|
252 } |
|
253 |
|
254 /* Compare MatchCallback address */ |
|
255 cmpResult = (firstCrlSelector->matchCallback == |
|
256 secondCrlSelector->matchCallback); |
|
257 |
|
258 if (cmpResult == PKIX_FALSE) { |
|
259 goto cleanup; |
|
260 } |
|
261 |
|
262 /* Compare Common CRL Selector Params */ |
|
263 PKIX_EQUALS |
|
264 (firstCrlSelector->params, |
|
265 secondCrlSelector->params, |
|
266 &cmpResult, |
|
267 plContext, |
|
268 PKIX_COMCRLSELPARAMSEQUALSFAILED); |
|
269 |
|
270 |
|
271 if (cmpResult == PKIX_FALSE) { |
|
272 goto cleanup; |
|
273 } |
|
274 |
|
275 /* Compare Context */ |
|
276 PKIX_EQUALS |
|
277 (firstCrlSelector->context, |
|
278 secondCrlSelector->context, |
|
279 &cmpResult, |
|
280 plContext, |
|
281 PKIX_COMCRLSELPARAMSEQUALSFAILED); |
|
282 |
|
283 *pResult = cmpResult; |
|
284 |
|
285 cleanup: |
|
286 |
|
287 PKIX_RETURN(CRLSELECTOR); |
|
288 } |
|
289 |
|
290 /* |
|
291 * FUNCTION: pkix_CRLSelector_Duplicate |
|
292 * (see comments for PKIX_PL_Duplicate_Callback in pkix_pl_system.h) |
|
293 */ |
|
294 static PKIX_Error * |
|
295 pkix_CRLSelector_Duplicate( |
|
296 PKIX_PL_Object *object, |
|
297 PKIX_PL_Object **pNewObject, |
|
298 void *plContext) |
|
299 { |
|
300 PKIX_CRLSelector *old; |
|
301 PKIX_CRLSelector *new = NULL; |
|
302 |
|
303 PKIX_ENTER(CRLSELECTOR, "pkix_CRLSelector_Duplicate"); |
|
304 PKIX_NULLCHECK_TWO(object, pNewObject); |
|
305 |
|
306 PKIX_CHECK(pkix_CheckType |
|
307 (object, PKIX_CRLSELECTOR_TYPE, plContext), |
|
308 PKIX_OBJECTNOTCRLSELECTOR); |
|
309 |
|
310 old = (PKIX_CRLSelector *)object; |
|
311 |
|
312 PKIX_CHECK(PKIX_PL_Object_Alloc |
|
313 (PKIX_CRLSELECTOR_TYPE, |
|
314 (PKIX_UInt32)(sizeof (PKIX_CRLSelector)), |
|
315 (PKIX_PL_Object **)&new, |
|
316 plContext), |
|
317 PKIX_CREATECRLSELECTORDUPLICATEOBJECTFAILED); |
|
318 |
|
319 new->matchCallback = old->matchCallback; |
|
320 |
|
321 PKIX_DUPLICATE(old->params, &new->params, plContext, |
|
322 PKIX_OBJECTDUPLICATEPARAMSFAILED); |
|
323 |
|
324 PKIX_DUPLICATE(old->context, &new->context, plContext, |
|
325 PKIX_OBJECTDUPLICATECONTEXTFAILED); |
|
326 |
|
327 *pNewObject = (PKIX_PL_Object *)new; |
|
328 |
|
329 cleanup: |
|
330 |
|
331 if (PKIX_ERROR_RECEIVED){ |
|
332 PKIX_DECREF(new); |
|
333 } |
|
334 |
|
335 PKIX_RETURN(CRLSELECTOR); |
|
336 } |
|
337 |
|
338 /* |
|
339 * FUNCTION: pkix_CRLSelector_DefaultMatch |
|
340 * |
|
341 * DESCRIPTION: |
|
342 * This function compares the parameter values (Issuer, date, and CRL number) |
|
343 * set in the ComCRLSelParams of the CRLSelector pointed to by "selector" with |
|
344 * the corresponding values in the CRL pointed to by "crl". When all the |
|
345 * criteria set in the parameter values match the values in "crl", PKIX_TRUE is |
|
346 * stored at "pMatch". If the CRL does not match the CRLSelector's criteria, |
|
347 * PKIX_FALSE is stored at "pMatch". |
|
348 * |
|
349 * PARAMETERS |
|
350 * "selector" |
|
351 * Address of CRLSelector which is verified for a match |
|
352 * Must be non-NULL. |
|
353 * "crl" |
|
354 * Address of the CRL object to be verified. Must be non-NULL. |
|
355 * "pMatch" |
|
356 * Address at which Boolean result is stored. Must be non-NULL. |
|
357 * "plContext" |
|
358 * Platform-specific context pointer. |
|
359 * |
|
360 * THREAD SAFETY: |
|
361 * Conditionally Thread Safe |
|
362 * (see Thread Safety Definitions in Programmer's Guide) |
|
363 * |
|
364 * RETURNS: |
|
365 * Returns NULL if the function succeeds. |
|
366 * Returns a CRLSelector Error if the function fails in a non-fatal way. |
|
367 * Returns a Fatal Error if the function fails in an unrecoverable way. |
|
368 */ |
|
369 static PKIX_Error * |
|
370 pkix_CRLSelector_DefaultMatch( |
|
371 PKIX_CRLSelector *selector, |
|
372 PKIX_PL_CRL *crl, |
|
373 PKIX_Boolean *pMatch, |
|
374 void *plContext) |
|
375 { |
|
376 PKIX_ComCRLSelParams *params = NULL; |
|
377 PKIX_PL_X500Name *crlIssuerName = NULL; |
|
378 PKIX_PL_X500Name *issuerName = NULL; |
|
379 PKIX_List *selIssuerNames = NULL; |
|
380 PKIX_PL_Date *selDate = NULL; |
|
381 PKIX_Boolean result = PKIX_TRUE; |
|
382 PKIX_UInt32 numIssuers = 0; |
|
383 PKIX_UInt32 i; |
|
384 PKIX_PL_BigInt *minCRLNumber = NULL; |
|
385 PKIX_PL_BigInt *maxCRLNumber = NULL; |
|
386 PKIX_PL_BigInt *crlNumber = NULL; |
|
387 PKIX_Boolean nistPolicyEnabled = PKIX_FALSE; |
|
388 |
|
389 PKIX_ENTER(CRLSELECTOR, "pkix_CRLSelector_DefaultMatch"); |
|
390 PKIX_NULLCHECK_TWO(selector, crl); |
|
391 |
|
392 *pMatch = PKIX_TRUE; |
|
393 params = selector->params; |
|
394 |
|
395 /* No matching parameter provided, just a match */ |
|
396 if (params == NULL) { |
|
397 goto cleanup; |
|
398 } |
|
399 |
|
400 PKIX_CHECK(PKIX_ComCRLSelParams_GetIssuerNames |
|
401 (params, &selIssuerNames, plContext), |
|
402 PKIX_COMCRLSELPARAMSGETISSUERNAMESFAILED); |
|
403 |
|
404 /* Check for Issuers */ |
|
405 if (selIssuerNames != NULL){ |
|
406 |
|
407 result = PKIX_FALSE; |
|
408 |
|
409 PKIX_CHECK(PKIX_PL_CRL_GetIssuer |
|
410 (crl, &crlIssuerName, plContext), |
|
411 PKIX_CRLGETISSUERFAILED); |
|
412 |
|
413 PKIX_CHECK(PKIX_List_GetLength |
|
414 (selIssuerNames, &numIssuers, plContext), |
|
415 PKIX_LISTGETLENGTHFAILED); |
|
416 |
|
417 for (i = 0; i < numIssuers; i++){ |
|
418 |
|
419 PKIX_CHECK(PKIX_List_GetItem |
|
420 (selIssuerNames, |
|
421 i, |
|
422 (PKIX_PL_Object **)&issuerName, |
|
423 plContext), |
|
424 PKIX_LISTGETITEMFAILED); |
|
425 |
|
426 PKIX_CHECK(PKIX_PL_X500Name_Match |
|
427 (crlIssuerName, |
|
428 issuerName, |
|
429 &result, |
|
430 plContext), |
|
431 PKIX_X500NAMEMATCHFAILED); |
|
432 |
|
433 PKIX_DECREF(issuerName); |
|
434 |
|
435 if (result == PKIX_TRUE) { |
|
436 break; |
|
437 } |
|
438 } |
|
439 |
|
440 if (result == PKIX_FALSE) { |
|
441 PKIX_CRLSELECTOR_DEBUG("Issuer Match Failed\N"); |
|
442 *pMatch = PKIX_FALSE; |
|
443 goto cleanup; |
|
444 } |
|
445 |
|
446 } |
|
447 |
|
448 PKIX_CHECK(PKIX_ComCRLSelParams_GetDateAndTime |
|
449 (params, &selDate, plContext), |
|
450 PKIX_COMCRLSELPARAMSGETDATEANDTIMEFAILED); |
|
451 |
|
452 /* Check for Date */ |
|
453 if (selDate != NULL){ |
|
454 |
|
455 PKIX_CHECK(PKIX_ComCRLSelParams_GetNISTPolicyEnabled |
|
456 (params, &nistPolicyEnabled, plContext), |
|
457 PKIX_COMCRLSELPARAMSGETNISTPOLICYENABLEDFAILED); |
|
458 |
|
459 /* check crl dates only for if NIST policies enforced */ |
|
460 if (nistPolicyEnabled) { |
|
461 result = PKIX_FALSE; |
|
462 |
|
463 PKIX_CHECK(PKIX_PL_CRL_VerifyUpdateTime |
|
464 (crl, selDate, &result, plContext), |
|
465 PKIX_CRLVERIFYUPDATETIMEFAILED); |
|
466 |
|
467 if (result == PKIX_FALSE) { |
|
468 *pMatch = PKIX_FALSE; |
|
469 goto cleanup; |
|
470 } |
|
471 } |
|
472 |
|
473 } |
|
474 |
|
475 /* Check for CRL number in range */ |
|
476 PKIX_CHECK(PKIX_PL_CRL_GetCRLNumber(crl, &crlNumber, plContext), |
|
477 PKIX_CRLGETCRLNUMBERFAILED); |
|
478 |
|
479 if (crlNumber != NULL) { |
|
480 result = PKIX_FALSE; |
|
481 |
|
482 PKIX_CHECK(PKIX_ComCRLSelParams_GetMinCRLNumber |
|
483 (params, &minCRLNumber, plContext), |
|
484 PKIX_COMCRLSELPARAMSGETMINCRLNUMBERFAILED); |
|
485 |
|
486 if (minCRLNumber != NULL) { |
|
487 |
|
488 PKIX_CHECK(PKIX_PL_Object_Compare |
|
489 ((PKIX_PL_Object *)minCRLNumber, |
|
490 (PKIX_PL_Object *)crlNumber, |
|
491 &result, |
|
492 plContext), |
|
493 PKIX_OBJECTCOMPARATORFAILED); |
|
494 |
|
495 if (result == 1) { |
|
496 PKIX_CRLSELECTOR_DEBUG |
|
497 ("CRL MinNumber Range Match Failed\n"); |
|
498 *pMatch = PKIX_FALSE; |
|
499 goto cleanup; |
|
500 } |
|
501 } |
|
502 |
|
503 PKIX_CHECK(PKIX_ComCRLSelParams_GetMaxCRLNumber |
|
504 (params, &maxCRLNumber, plContext), |
|
505 PKIX_COMCRLSELPARAMSGETMAXCRLNUMBERFAILED); |
|
506 |
|
507 if (maxCRLNumber != NULL) { |
|
508 |
|
509 PKIX_CHECK(PKIX_PL_Object_Compare |
|
510 ((PKIX_PL_Object *)crlNumber, |
|
511 (PKIX_PL_Object *)maxCRLNumber, |
|
512 &result, |
|
513 plContext), |
|
514 PKIX_OBJECTCOMPARATORFAILED); |
|
515 |
|
516 if (result == 1) { |
|
517 PKIX_CRLSELECTOR_DEBUG |
|
518 (PKIX_CRLMAXNUMBERRANGEMATCHFAILED); |
|
519 *pMatch = PKIX_FALSE; |
|
520 goto cleanup; |
|
521 } |
|
522 } |
|
523 } |
|
524 |
|
525 cleanup: |
|
526 |
|
527 PKIX_DECREF(selIssuerNames); |
|
528 PKIX_DECREF(selDate); |
|
529 PKIX_DECREF(crlIssuerName); |
|
530 PKIX_DECREF(issuerName); |
|
531 PKIX_DECREF(crlNumber); |
|
532 PKIX_DECREF(minCRLNumber); |
|
533 PKIX_DECREF(maxCRLNumber); |
|
534 |
|
535 PKIX_RETURN(CRLSELECTOR); |
|
536 } |
|
537 |
|
538 /* |
|
539 * FUNCTION: pkix_CRLSelector_RegisterSelf |
|
540 * DESCRIPTION: |
|
541 * Registers PKIX_CRLSELECTOR_TYPE and its related functions with |
|
542 * systemClasses[] |
|
543 * THREAD SAFETY: |
|
544 * Not Thread Safe - for performance and complexity reasons |
|
545 * |
|
546 * Since this function is only called by PKIX_PL_Initialize, which should |
|
547 * only be called once, it is acceptable that this function is not |
|
548 * thread-safe. |
|
549 */ |
|
550 PKIX_Error * |
|
551 pkix_CRLSelector_RegisterSelf(void *plContext) |
|
552 { |
|
553 extern pkix_ClassTable_Entry systemClasses[PKIX_NUMTYPES]; |
|
554 pkix_ClassTable_Entry entry; |
|
555 |
|
556 PKIX_ENTER(CRLSELECTOR, "pkix_CRLSelector_RegisterSelf"); |
|
557 |
|
558 entry.description = "CRLSelector"; |
|
559 entry.objCounter = 0; |
|
560 entry.typeObjectSize = sizeof(PKIX_CRLSelector); |
|
561 entry.destructor = pkix_CRLSelector_Destroy; |
|
562 entry.equalsFunction = pkix_CRLSelector_Equals; |
|
563 entry.hashcodeFunction = pkix_CRLSelector_Hashcode; |
|
564 entry.toStringFunction = pkix_CRLSelector_ToString; |
|
565 entry.comparator = NULL; |
|
566 entry.duplicateFunction = pkix_CRLSelector_Duplicate; |
|
567 |
|
568 systemClasses[PKIX_CRLSELECTOR_TYPE] = entry; |
|
569 |
|
570 PKIX_RETURN(CRLSELECTOR); |
|
571 } |
|
572 |
|
573 /* --CRLSelector-Public-Functions---------------------------------------- */ |
|
574 PKIX_Error * |
|
575 pkix_CRLSelector_Create( |
|
576 PKIX_CRLSelector_MatchCallback callback, |
|
577 PKIX_PL_Object *crlSelectorContext, |
|
578 PKIX_CRLSelector **pSelector, |
|
579 void *plContext) |
|
580 { |
|
581 PKIX_CRLSelector *selector = NULL; |
|
582 |
|
583 PKIX_ENTER(CRLSELECTOR, "PKIX_CRLSelector_Create"); |
|
584 PKIX_NULLCHECK_ONE(pSelector); |
|
585 |
|
586 PKIX_CHECK(PKIX_PL_Object_Alloc |
|
587 (PKIX_CRLSELECTOR_TYPE, |
|
588 sizeof (PKIX_CRLSelector), |
|
589 (PKIX_PL_Object **)&selector, |
|
590 plContext), |
|
591 PKIX_COULDNOTCREATECRLSELECTOROBJECT); |
|
592 |
|
593 /* |
|
594 * if user specified a particular match callback, we use that one. |
|
595 * otherwise, we use the default match provided. |
|
596 */ |
|
597 |
|
598 if (callback != NULL){ |
|
599 selector->matchCallback = callback; |
|
600 } else { |
|
601 selector->matchCallback = pkix_CRLSelector_DefaultMatch; |
|
602 } |
|
603 |
|
604 /* initialize other fields */ |
|
605 selector->params = NULL; |
|
606 |
|
607 PKIX_INCREF(crlSelectorContext); |
|
608 selector->context = crlSelectorContext; |
|
609 |
|
610 *pSelector = selector; |
|
611 selector = NULL; |
|
612 |
|
613 cleanup: |
|
614 |
|
615 PKIX_DECREF(selector); |
|
616 |
|
617 PKIX_RETURN(CRLSELECTOR); |
|
618 } |
|
619 |
|
620 /* |
|
621 * FUNCTION: PKIX_CRLSelector_Create (see comments in pkix_crlsel.h) |
|
622 */ |
|
623 PKIX_Error * |
|
624 PKIX_CRLSelector_Create( |
|
625 PKIX_PL_Cert *issuer, |
|
626 PKIX_List *crldpList, |
|
627 PKIX_PL_Date *date, |
|
628 PKIX_CRLSelector **pCrlSelector, |
|
629 void *plContext) |
|
630 { |
|
631 PKIX_PL_X500Name *issuerName = NULL; |
|
632 PKIX_PL_Date *nowDate = NULL; |
|
633 PKIX_ComCRLSelParams *comCrlSelParams = NULL; |
|
634 PKIX_CRLSelector *crlSelector = NULL; |
|
635 |
|
636 PKIX_ENTER(CERTCHAINCHECKER, "PKIX_CrlSelector_Create"); |
|
637 PKIX_NULLCHECK_ONE(issuer); |
|
638 |
|
639 PKIX_CHECK( |
|
640 PKIX_PL_Cert_GetSubject(issuer, &issuerName, plContext), |
|
641 PKIX_CERTGETISSUERFAILED); |
|
642 |
|
643 if (date != NULL) { |
|
644 PKIX_INCREF(date); |
|
645 nowDate = date; |
|
646 } else { |
|
647 PKIX_CHECK( |
|
648 PKIX_PL_Date_Create_UTCTime(NULL, &nowDate, plContext), |
|
649 PKIX_DATECREATEUTCTIMEFAILED); |
|
650 } |
|
651 |
|
652 PKIX_CHECK( |
|
653 PKIX_ComCRLSelParams_Create(&comCrlSelParams, plContext), |
|
654 PKIX_COMCRLSELPARAMSCREATEFAILED); |
|
655 |
|
656 PKIX_CHECK( |
|
657 PKIX_ComCRLSelParams_AddIssuerName(comCrlSelParams, issuerName, |
|
658 plContext), |
|
659 PKIX_COMCRLSELPARAMSADDISSUERNAMEFAILED); |
|
660 |
|
661 PKIX_CHECK( |
|
662 PKIX_ComCRLSelParams_SetCrlDp(comCrlSelParams, crldpList, |
|
663 plContext), |
|
664 PKIX_COMCRLSELPARAMSSETCERTFAILED); |
|
665 |
|
666 PKIX_CHECK( |
|
667 PKIX_ComCRLSelParams_SetDateAndTime(comCrlSelParams, nowDate, |
|
668 plContext), |
|
669 PKIX_COMCRLSELPARAMSSETDATEANDTIMEFAILED); |
|
670 |
|
671 PKIX_CHECK( |
|
672 pkix_CRLSelector_Create(NULL, NULL, &crlSelector, plContext), |
|
673 PKIX_CRLSELECTORCREATEFAILED); |
|
674 |
|
675 PKIX_CHECK( |
|
676 PKIX_CRLSelector_SetCommonCRLSelectorParams(crlSelector, |
|
677 comCrlSelParams, |
|
678 plContext), |
|
679 PKIX_CRLSELECTORSETCOMMONCRLSELECTORPARAMSFAILED); |
|
680 |
|
681 *pCrlSelector = crlSelector; |
|
682 crlSelector = NULL; |
|
683 |
|
684 cleanup: |
|
685 |
|
686 PKIX_DECREF(issuerName); |
|
687 PKIX_DECREF(nowDate); |
|
688 PKIX_DECREF(comCrlSelParams); |
|
689 PKIX_DECREF(crlSelector); |
|
690 |
|
691 PKIX_RETURN(CERTCHAINCHECKER); |
|
692 } |
|
693 |
|
694 /* |
|
695 * FUNCTION: PKIX_CRLSelector_GetMatchCallback (see comments in pkix_crlsel.h) |
|
696 */ |
|
697 PKIX_Error * |
|
698 PKIX_CRLSelector_GetMatchCallback( |
|
699 PKIX_CRLSelector *selector, |
|
700 PKIX_CRLSelector_MatchCallback *pCallback, |
|
701 void *plContext) |
|
702 { |
|
703 PKIX_ENTER(CRLSELECTOR, "PKIX_CRLSelector_GetMatchCallback"); |
|
704 PKIX_NULLCHECK_TWO(selector, pCallback); |
|
705 |
|
706 *pCallback = selector->matchCallback; |
|
707 |
|
708 PKIX_RETURN(CRLSELECTOR); |
|
709 } |
|
710 |
|
711 |
|
712 /* |
|
713 * FUNCTION: PKIX_CRLSelector_GetCRLSelectorContext |
|
714 * (see comments in pkix_crlsel.h) |
|
715 */ |
|
716 PKIX_Error * |
|
717 PKIX_CRLSelector_GetCRLSelectorContext( |
|
718 PKIX_CRLSelector *selector, |
|
719 void **pCrlSelectorContext, |
|
720 void *plContext) |
|
721 { |
|
722 PKIX_ENTER(CRLSELECTOR, "PKIX_CRLSelector_GetCRLSelectorContext"); |
|
723 PKIX_NULLCHECK_TWO(selector, pCrlSelectorContext); |
|
724 |
|
725 PKIX_INCREF(selector->context); |
|
726 |
|
727 *pCrlSelectorContext = selector->context; |
|
728 |
|
729 cleanup: |
|
730 PKIX_RETURN(CRLSELECTOR); |
|
731 } |
|
732 |
|
733 /* |
|
734 * FUNCTION: PKIX_CRLSelector_GetCommonCRLSelectorParams |
|
735 * (see comments in pkix_crlsel.h) |
|
736 */ |
|
737 PKIX_Error * |
|
738 PKIX_CRLSelector_GetCommonCRLSelectorParams( |
|
739 PKIX_CRLSelector *selector, |
|
740 PKIX_ComCRLSelParams **pParams, |
|
741 void *plContext) |
|
742 { |
|
743 PKIX_ENTER(CRLSELECTOR, "PKIX_CRLSelector_GetCommonCRLSelectorParams"); |
|
744 PKIX_NULLCHECK_TWO(selector, pParams); |
|
745 |
|
746 PKIX_INCREF(selector->params); |
|
747 |
|
748 *pParams = selector->params; |
|
749 |
|
750 cleanup: |
|
751 PKIX_RETURN(CRLSELECTOR); |
|
752 } |
|
753 |
|
754 /* |
|
755 * FUNCTION: PKIX_CRLSelector_SetCommonCRLSelectorParams |
|
756 * (see comments in pkix_crlsel.h) |
|
757 */ |
|
758 PKIX_Error * |
|
759 PKIX_CRLSelector_SetCommonCRLSelectorParams( |
|
760 PKIX_CRLSelector *selector, |
|
761 PKIX_ComCRLSelParams *params, |
|
762 void *plContext) |
|
763 { |
|
764 PKIX_ENTER(CRLSELECTOR, "PKIX_CRLSelector_SetCommonCRLSelectorParams"); |
|
765 PKIX_NULLCHECK_TWO(selector, params); |
|
766 |
|
767 PKIX_DECREF(selector->params); |
|
768 |
|
769 PKIX_INCREF(params); |
|
770 selector->params = params; |
|
771 |
|
772 PKIX_CHECK(PKIX_PL_Object_InvalidateCache |
|
773 ((PKIX_PL_Object *)selector, plContext), |
|
774 PKIX_OBJECTINVALIDATECACHEFAILED); |
|
775 |
|
776 cleanup: |
|
777 |
|
778 PKIX_RETURN(CRLSELECTOR); |
|
779 } |
|
780 |
|
781 /* |
|
782 * FUNCTION: pkix_CRLSelector_Select |
|
783 * DESCRIPTION: |
|
784 * |
|
785 * This function applies the selector pointed to by "selector" to each CRL, |
|
786 * in turn, in the List pointed to by "before", and creates a List containing |
|
787 * all the CRLs that matched, or passed the selection process, storing that |
|
788 * List at "pAfter". If no CRLs match, an empty List is stored at "pAfter". |
|
789 * |
|
790 * The List returned in "pAfter" is immutable. |
|
791 * |
|
792 * PARAMETERS: |
|
793 * "selector" |
|
794 * Address of CRLSelelector to be applied to the List. Must be non-NULL. |
|
795 * "before" |
|
796 * Address of List that is to be filtered. Must be non-NULL. |
|
797 * "pAfter" |
|
798 * Address at which resulting List, possibly empty, is stored. Must be |
|
799 * non-NULL. |
|
800 * "plContext" |
|
801 * Platform-specific context pointer. |
|
802 * THREAD SAFETY: |
|
803 * Thread Safe (see Thread Safety Definitions in Programmer's Guide) |
|
804 * RETURNS: |
|
805 * Returns NULL if the function succeeds. |
|
806 * Returns a CRLSelector Error if the function fails in a non-fatal way. |
|
807 * Returns a Fatal Error if the function fails in an unrecoverable way. |
|
808 */ |
|
809 PKIX_Error * |
|
810 pkix_CRLSelector_Select( |
|
811 PKIX_CRLSelector *selector, |
|
812 PKIX_List *before, |
|
813 PKIX_List **pAfter, |
|
814 void *plContext) |
|
815 { |
|
816 PKIX_Boolean match = PKIX_FALSE; |
|
817 PKIX_UInt32 numBefore = 0; |
|
818 PKIX_UInt32 i = 0; |
|
819 PKIX_List *filtered = NULL; |
|
820 PKIX_PL_CRL *candidate = NULL; |
|
821 |
|
822 PKIX_ENTER(CRLSELECTOR, "PKIX_CRLSelector_Select"); |
|
823 PKIX_NULLCHECK_THREE(selector, before, pAfter); |
|
824 |
|
825 PKIX_CHECK(PKIX_List_Create(&filtered, plContext), |
|
826 PKIX_LISTCREATEFAILED); |
|
827 |
|
828 PKIX_CHECK(PKIX_List_GetLength(before, &numBefore, plContext), |
|
829 PKIX_LISTGETLENGTHFAILED); |
|
830 |
|
831 for (i = 0; i < numBefore; i++) { |
|
832 |
|
833 PKIX_CHECK(PKIX_List_GetItem |
|
834 (before, i, (PKIX_PL_Object **)&candidate, plContext), |
|
835 PKIX_LISTGETITEMFAILED); |
|
836 |
|
837 PKIX_CHECK_ONLY_FATAL(selector->matchCallback |
|
838 (selector, candidate, &match, plContext), |
|
839 PKIX_CRLSELECTORMATCHCALLBACKFAILED); |
|
840 |
|
841 if (!(PKIX_ERROR_RECEIVED) && match == PKIX_TRUE) { |
|
842 |
|
843 PKIX_CHECK_ONLY_FATAL(PKIX_List_AppendItem |
|
844 (filtered, |
|
845 (PKIX_PL_Object *)candidate, |
|
846 plContext), |
|
847 PKIX_LISTAPPENDITEMFAILED); |
|
848 } |
|
849 |
|
850 pkixTempErrorReceived = PKIX_FALSE; |
|
851 PKIX_DECREF(candidate); |
|
852 } |
|
853 |
|
854 PKIX_CHECK(PKIX_List_SetImmutable(filtered, plContext), |
|
855 PKIX_LISTSETIMMUTABLEFAILED); |
|
856 |
|
857 /* Don't throw away the list if one CRL was bad! */ |
|
858 pkixTempErrorReceived = PKIX_FALSE; |
|
859 |
|
860 *pAfter = filtered; |
|
861 filtered = NULL; |
|
862 |
|
863 cleanup: |
|
864 |
|
865 PKIX_DECREF(filtered); |
|
866 PKIX_DECREF(candidate); |
|
867 |
|
868 PKIX_RETURN(CRLSELECTOR); |
|
869 |
|
870 } |