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 *
pkix_CRLSelector_Destroy(PKIX_PL_Object * object,void * plContext)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 *
pkix_CRLSelector_ToString_Helper(PKIX_CRLSelector * crlSelector,PKIX_PL_String ** pString,void * plContext)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 *
pkix_CRLSelector_ToString(PKIX_PL_Object * object,PKIX_PL_String ** pString,void * plContext)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 *
pkix_CRLSelector_Hashcode(PKIX_PL_Object * object,PKIX_UInt32 * pHashcode,void * plContext)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, &paramsHash, plContext,
188                 PKIX_OBJECTHASHCODEFAILED);
189 
190         PKIX_HASHCODE(crlSelector->context, &contextHash, plContext,
191                 PKIX_OBJECTHASHCODEFAILED);
192 
193         hash = 31 * ((PKIX_UInt32)((char *)crlSelector->matchCallback - (char *)NULL) +
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 *
pkix_CRLSelector_Equals(PKIX_PL_Object * firstObject,PKIX_PL_Object * secondObject,PKIX_Boolean * pResult,void * plContext)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 *
pkix_CRLSelector_Duplicate(PKIX_PL_Object * object,PKIX_PL_Object ** pNewObject,void * plContext)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 *
pkix_CRLSelector_DefaultMatch(PKIX_CRLSelector * selector,PKIX_PL_CRL * crl,PKIX_Boolean * pMatch,void * plContext)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 *
pkix_CRLSelector_RegisterSelf(void * plContext)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 *
pkix_CRLSelector_Create(PKIX_CRLSelector_MatchCallback callback,PKIX_PL_Object * crlSelectorContext,PKIX_CRLSelector ** pSelector,void * plContext)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 *
PKIX_CRLSelector_Create(PKIX_PL_Cert * issuer,PKIX_List * crldpList,PKIX_PL_Date * date,PKIX_CRLSelector ** pCrlSelector,void * plContext)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 *
PKIX_CRLSelector_GetMatchCallback(PKIX_CRLSelector * selector,PKIX_CRLSelector_MatchCallback * pCallback,void * plContext)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 *
PKIX_CRLSelector_GetCRLSelectorContext(PKIX_CRLSelector * selector,void ** pCrlSelectorContext,void * plContext)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 *
PKIX_CRLSelector_GetCommonCRLSelectorParams(PKIX_CRLSelector * selector,PKIX_ComCRLSelParams ** pParams,void * plContext)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 *
PKIX_CRLSelector_SetCommonCRLSelectorParams(PKIX_CRLSelector * selector,PKIX_ComCRLSelParams * params,void * plContext)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 *
pkix_CRLSelector_Select(PKIX_CRLSelector * selector,PKIX_List * before,PKIX_List ** pAfter,void * plContext)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 }
871