|
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_store.c |
|
6 * |
|
7 * CertStore Function Definitions |
|
8 * |
|
9 */ |
|
10 |
|
11 #include "pkix_store.h" |
|
12 |
|
13 /* --CertStore-Private-Functions----------------------------------------- */ |
|
14 |
|
15 /* |
|
16 * FUNCTION: pkix_CertStore_Destroy |
|
17 * (see comments for PKIX_PL_DestructorCallback in pkix_pl_system.h) |
|
18 */ |
|
19 static PKIX_Error * |
|
20 pkix_CertStore_Destroy( |
|
21 PKIX_PL_Object *object, |
|
22 void *plContext) |
|
23 { |
|
24 PKIX_CertStore *certStore = NULL; |
|
25 |
|
26 PKIX_ENTER(CERTSTORE, "pkix_CertStore_Destroy"); |
|
27 PKIX_NULLCHECK_ONE(object); |
|
28 |
|
29 /* Check that this object is a CertStore object */ |
|
30 PKIX_CHECK(pkix_CheckType(object, PKIX_CERTSTORE_TYPE, plContext), |
|
31 PKIX_OBJECTNOTCERTSTORE); |
|
32 |
|
33 certStore = (PKIX_CertStore *)object; |
|
34 |
|
35 certStore->certCallback = NULL; |
|
36 certStore->crlCallback = NULL; |
|
37 certStore->certContinue = NULL; |
|
38 certStore->crlContinue = NULL; |
|
39 certStore->trustCallback = NULL; |
|
40 |
|
41 PKIX_DECREF(certStore->certStoreContext); |
|
42 |
|
43 cleanup: |
|
44 |
|
45 PKIX_RETURN(CERTSTORE); |
|
46 } |
|
47 |
|
48 /* |
|
49 * FUNCTION: pkix_CertStore_Hashcode |
|
50 * (see comments for PKIX_PL_HashcodeCallback in pkix_pl_system.h) |
|
51 */ |
|
52 static PKIX_Error * |
|
53 pkix_CertStore_Hashcode( |
|
54 PKIX_PL_Object *object, |
|
55 PKIX_UInt32 *pHashcode, |
|
56 void *plContext) |
|
57 { |
|
58 PKIX_CertStore *certStore = NULL; |
|
59 PKIX_UInt32 tempHash = 0; |
|
60 |
|
61 PKIX_ENTER(CERTSTORE, "pkix_CertStore_Hashcode"); |
|
62 PKIX_NULLCHECK_TWO(object, pHashcode); |
|
63 |
|
64 PKIX_CHECK(pkix_CheckType(object, PKIX_CERTSTORE_TYPE, plContext), |
|
65 PKIX_OBJECTNOTCERTSTORE); |
|
66 |
|
67 certStore = (PKIX_CertStore *)object; |
|
68 |
|
69 if (certStore->certStoreContext) { |
|
70 PKIX_CHECK(PKIX_PL_Object_Hashcode |
|
71 ((PKIX_PL_Object *) certStore->certStoreContext, |
|
72 &tempHash, |
|
73 plContext), |
|
74 PKIX_CERTSTOREHASHCODEFAILED); |
|
75 } |
|
76 |
|
77 *pHashcode = (PKIX_UInt32) certStore->certCallback + |
|
78 (PKIX_UInt32) certStore->crlCallback + |
|
79 (PKIX_UInt32) certStore->certContinue + |
|
80 (PKIX_UInt32) certStore->crlContinue + |
|
81 (PKIX_UInt32) certStore->trustCallback + |
|
82 (tempHash << 7); |
|
83 |
|
84 cleanup: |
|
85 |
|
86 PKIX_RETURN(CERTSTORE); |
|
87 } |
|
88 |
|
89 /* |
|
90 * FUNCTION: pkix_CertStore_Equals |
|
91 * (see comments for PKIX_PL_EqualsCallback in pkix_pl_system.h) |
|
92 */ |
|
93 static PKIX_Error * |
|
94 pkix_CertStore_Equals( |
|
95 PKIX_PL_Object *firstObject, |
|
96 PKIX_PL_Object *secondObject, |
|
97 PKIX_Int32 *pResult, |
|
98 void *plContext) |
|
99 { |
|
100 PKIX_CertStore *firstCS = NULL; |
|
101 PKIX_CertStore *secondCS = NULL; |
|
102 PKIX_Boolean cmpResult = PKIX_FALSE; |
|
103 |
|
104 PKIX_ENTER(CERTSTORE, "pkix_CertStore_Equals"); |
|
105 PKIX_NULLCHECK_THREE(firstObject, secondObject, pResult); |
|
106 |
|
107 PKIX_CHECK(pkix_CheckTypes |
|
108 (firstObject, secondObject, PKIX_CERTSTORE_TYPE, plContext), |
|
109 PKIX_ARGUMENTSNOTDATES); |
|
110 |
|
111 firstCS = (PKIX_CertStore *)firstObject; |
|
112 secondCS = (PKIX_CertStore *)secondObject; |
|
113 |
|
114 cmpResult = (firstCS->certCallback == secondCS->certCallback) && |
|
115 (firstCS->crlCallback == secondCS->crlCallback) && |
|
116 (firstCS->certContinue == secondCS->certContinue) && |
|
117 (firstCS->crlContinue == secondCS->crlContinue) && |
|
118 (firstCS->trustCallback == secondCS->trustCallback); |
|
119 |
|
120 if (cmpResult && |
|
121 (firstCS->certStoreContext != secondCS->certStoreContext)) { |
|
122 |
|
123 PKIX_CHECK(PKIX_PL_Object_Equals |
|
124 ((PKIX_PL_Object *) firstCS->certStoreContext, |
|
125 (PKIX_PL_Object *) secondCS->certStoreContext, |
|
126 &cmpResult, |
|
127 plContext), |
|
128 PKIX_CERTSTOREEQUALSFAILED); |
|
129 } |
|
130 |
|
131 *pResult = cmpResult; |
|
132 |
|
133 cleanup: |
|
134 |
|
135 PKIX_RETURN(CERTSTORE); |
|
136 } |
|
137 |
|
138 /* |
|
139 * FUNCTION: pkix_CertStore_RegisterSelf |
|
140 * DESCRIPTION: |
|
141 * Registers PKIX_CERTSTORE_TYPE and its related functions with |
|
142 * systemClasses[] |
|
143 * THREAD SAFETY: |
|
144 * Not Thread Safe - for performance and complexity reasons |
|
145 * |
|
146 * Since this function is only called by PKIX_PL_Initialize, which should |
|
147 * only be called once, it is acceptable that this function is not |
|
148 * thread-safe. |
|
149 */ |
|
150 PKIX_Error * |
|
151 pkix_CertStore_RegisterSelf(void *plContext) |
|
152 { |
|
153 extern pkix_ClassTable_Entry systemClasses[PKIX_NUMTYPES]; |
|
154 pkix_ClassTable_Entry entry; |
|
155 |
|
156 PKIX_ENTER(CERTSTORE, "pkix_CertStore_RegisterSelf"); |
|
157 |
|
158 entry.description = "CertStore"; |
|
159 entry.objCounter = 0; |
|
160 entry.typeObjectSize = sizeof(PKIX_CertStore); |
|
161 entry.destructor = pkix_CertStore_Destroy; |
|
162 entry.equalsFunction = pkix_CertStore_Equals; |
|
163 entry.hashcodeFunction = pkix_CertStore_Hashcode; |
|
164 entry.toStringFunction = NULL; |
|
165 entry.comparator = NULL; |
|
166 entry.duplicateFunction = pkix_duplicateImmutable; |
|
167 |
|
168 systemClasses[PKIX_CERTSTORE_TYPE] = entry; |
|
169 |
|
170 PKIX_RETURN(CERTSTORE); |
|
171 } |
|
172 |
|
173 /* --CertStore-Public-Functions------------------------------------------ */ |
|
174 |
|
175 /* |
|
176 * FUNCTION: PKIX_CertStore_Create (see comments in pkix_certstore.h) |
|
177 */ |
|
178 PKIX_Error * |
|
179 PKIX_CertStore_Create( |
|
180 PKIX_CertStore_CertCallback certCallback, |
|
181 PKIX_CertStore_CRLCallback crlCallback, |
|
182 PKIX_CertStore_CertContinueFunction certContinue, |
|
183 PKIX_CertStore_CrlContinueFunction crlContinue, |
|
184 PKIX_CertStore_CheckTrustCallback trustCallback, |
|
185 PKIX_CertStore_ImportCrlCallback importCrlCallback, |
|
186 PKIX_CertStore_CheckRevokationByCrlCallback checkRevByCrlCallback, |
|
187 PKIX_PL_Object *certStoreContext, |
|
188 PKIX_Boolean cacheFlag, |
|
189 PKIX_Boolean localFlag, |
|
190 PKIX_CertStore **pStore, |
|
191 void *plContext) |
|
192 { |
|
193 PKIX_CertStore *certStore = NULL; |
|
194 |
|
195 PKIX_ENTER(CERTSTORE, "PKIX_CertStore_Create"); |
|
196 PKIX_NULLCHECK_THREE(certCallback, crlCallback, pStore); |
|
197 |
|
198 PKIX_CHECK(PKIX_PL_Object_Alloc |
|
199 (PKIX_CERTSTORE_TYPE, |
|
200 sizeof (PKIX_CertStore), |
|
201 (PKIX_PL_Object **)&certStore, |
|
202 plContext), |
|
203 PKIX_COULDNOTCREATECERTSTOREOBJECT); |
|
204 |
|
205 certStore->certCallback = certCallback; |
|
206 certStore->crlCallback = crlCallback; |
|
207 certStore->certContinue = certContinue; |
|
208 certStore->crlContinue = crlContinue; |
|
209 certStore->trustCallback = trustCallback; |
|
210 certStore->importCrlCallback = importCrlCallback; |
|
211 certStore->checkRevByCrlCallback = checkRevByCrlCallback; |
|
212 certStore->cacheFlag = cacheFlag; |
|
213 certStore->localFlag = localFlag; |
|
214 |
|
215 PKIX_INCREF(certStoreContext); |
|
216 certStore->certStoreContext = certStoreContext; |
|
217 |
|
218 *pStore = certStore; |
|
219 certStore = NULL; |
|
220 |
|
221 cleanup: |
|
222 |
|
223 PKIX_DECREF(certStore); |
|
224 |
|
225 PKIX_RETURN(CERTSTORE); |
|
226 } |
|
227 |
|
228 /* |
|
229 * FUNCTION: PKIX_CertStore_GetCertCallback (see comments in pkix_certstore.h) |
|
230 */ |
|
231 PKIX_Error * |
|
232 PKIX_CertStore_GetCertCallback( |
|
233 PKIX_CertStore *store, |
|
234 PKIX_CertStore_CertCallback *pCallback, |
|
235 void *plContext) |
|
236 { |
|
237 PKIX_ENTER(CERTSTORE, "PKIX_CertStore_GetCertCallback"); |
|
238 PKIX_NULLCHECK_TWO(store, pCallback); |
|
239 |
|
240 *pCallback = store->certCallback; |
|
241 |
|
242 PKIX_RETURN(CERTSTORE); |
|
243 } |
|
244 |
|
245 /* |
|
246 * FUNCTION: PKIX_CertStore_GetCRLCallback (see comments in pkix_certstore.h) |
|
247 */ |
|
248 PKIX_Error * |
|
249 PKIX_CertStore_GetCRLCallback( |
|
250 PKIX_CertStore *store, |
|
251 PKIX_CertStore_CRLCallback *pCallback, |
|
252 void *plContext) |
|
253 { |
|
254 PKIX_ENTER(CERTSTORE, "PKIX_CertStore_GetCRLCallback"); |
|
255 PKIX_NULLCHECK_TWO(store, pCallback); |
|
256 |
|
257 *pCallback = store->crlCallback; |
|
258 |
|
259 PKIX_RETURN(CERTSTORE); |
|
260 } |
|
261 |
|
262 /* |
|
263 * FUNCTION: PKIX_CertStore_CertContinue (see comments in pkix_certstore.h) |
|
264 */ |
|
265 PKIX_Error * |
|
266 PKIX_CertStore_CertContinue( |
|
267 PKIX_CertStore *store, |
|
268 PKIX_CertSelector *selector, |
|
269 PKIX_VerifyNode *verifyNode, |
|
270 void **pNBIOContext, |
|
271 PKIX_List **pCertList, |
|
272 void *plContext) |
|
273 { |
|
274 PKIX_ENTER(CERTSTORE, "PKIX_CertStore_CertContinue"); |
|
275 PKIX_NULLCHECK_FOUR(store, selector, pNBIOContext, pCertList); |
|
276 |
|
277 PKIX_CHECK(store->certContinue |
|
278 (store, selector, verifyNode, |
|
279 pNBIOContext, pCertList, plContext), |
|
280 PKIX_CERTSTORECERTCONTINUEFUNCTIONFAILED); |
|
281 |
|
282 cleanup: |
|
283 |
|
284 PKIX_RETURN(CERTSTORE); |
|
285 } |
|
286 |
|
287 /* |
|
288 * FUNCTION: PKIX_CertStore_CrlContinue (see comments in pkix_certstore.h) |
|
289 */ |
|
290 PKIX_Error * |
|
291 PKIX_CertStore_CrlContinue( |
|
292 PKIX_CertStore *store, |
|
293 PKIX_CRLSelector *selector, |
|
294 void **pNBIOContext, |
|
295 PKIX_List **pCrlList, |
|
296 void *plContext) |
|
297 { |
|
298 PKIX_ENTER(CERTSTORE, "PKIX_CertStore_CrlContinue"); |
|
299 PKIX_NULLCHECK_FOUR(store, selector, pNBIOContext, pCrlList); |
|
300 |
|
301 PKIX_CHECK(store->crlContinue |
|
302 (store, selector, pNBIOContext, pCrlList, plContext), |
|
303 PKIX_CERTSTORECRLCONTINUEFAILED); |
|
304 |
|
305 cleanup: |
|
306 |
|
307 PKIX_RETURN(CERTSTORE); |
|
308 } |
|
309 |
|
310 /* |
|
311 * FUNCTION: PKIX_CertStore_GetTrustCallback (see comments in pkix_certstore.h) |
|
312 */ |
|
313 PKIX_Error * |
|
314 PKIX_CertStore_GetTrustCallback( |
|
315 PKIX_CertStore *store, |
|
316 PKIX_CertStore_CheckTrustCallback *pCallback, |
|
317 void *plContext) |
|
318 { |
|
319 PKIX_ENTER(CERTSTORE, "PKIX_CertStore_GetTrustCallback"); |
|
320 PKIX_NULLCHECK_TWO(store, pCallback); |
|
321 |
|
322 *pCallback = store->trustCallback; |
|
323 |
|
324 PKIX_RETURN(CERTSTORE); |
|
325 } |
|
326 |
|
327 /* |
|
328 * FUNCTION: PKIX_CertStore_GetImportCrlCallback (see comments in pkix_certstore.h) |
|
329 */ |
|
330 PKIX_Error * |
|
331 PKIX_CertStore_GetImportCrlCallback( |
|
332 PKIX_CertStore *store, |
|
333 PKIX_CertStore_ImportCrlCallback *pCallback, |
|
334 void *plContext) |
|
335 { |
|
336 PKIX_ENTER(CERTSTORE, "PKIX_CertStore_GetTrustCallback"); |
|
337 PKIX_NULLCHECK_TWO(store, pCallback); |
|
338 |
|
339 *pCallback = store->importCrlCallback; |
|
340 |
|
341 PKIX_RETURN(CERTSTORE); |
|
342 } |
|
343 |
|
344 /* |
|
345 * FUNCTION: PKIX_CertStore_GetCheckRevByCrl (see comments in pkix_certstore.h) |
|
346 */ |
|
347 PKIX_Error * |
|
348 PKIX_CertStore_GetCrlCheckerFn( |
|
349 PKIX_CertStore *store, |
|
350 PKIX_CertStore_CheckRevokationByCrlCallback *pCallback, |
|
351 void *plContext) |
|
352 { |
|
353 PKIX_ENTER(CERTSTORE, "PKIX_CertStore_GetTrustCallback"); |
|
354 PKIX_NULLCHECK_TWO(store, pCallback); |
|
355 |
|
356 *pCallback = store->checkRevByCrlCallback; |
|
357 |
|
358 PKIX_RETURN(CERTSTORE); |
|
359 } |
|
360 |
|
361 /* |
|
362 * FUNCTION: PKIX_CertStore_GetCertStoreContext |
|
363 * (see comments in pkix_certstore.h) |
|
364 */ |
|
365 PKIX_Error * |
|
366 PKIX_CertStore_GetCertStoreContext( |
|
367 PKIX_CertStore *store, |
|
368 PKIX_PL_Object **pCertStoreContext, |
|
369 void *plContext) |
|
370 { |
|
371 PKIX_ENTER(CERTSTORE, "PKIX_CertStore_GetCertStoreContext"); |
|
372 PKIX_NULLCHECK_TWO(store, pCertStoreContext); |
|
373 |
|
374 PKIX_INCREF(store->certStoreContext); |
|
375 *pCertStoreContext = store->certStoreContext; |
|
376 |
|
377 cleanup: |
|
378 PKIX_RETURN(CERTSTORE); |
|
379 } |
|
380 |
|
381 /* |
|
382 * FUNCTION: PKIX_CertStore_GetCertStoreCacheFlag |
|
383 * (see comments in pkix_certstore.h) |
|
384 */ |
|
385 PKIX_Error * |
|
386 PKIX_CertStore_GetCertStoreCacheFlag( |
|
387 PKIX_CertStore *store, |
|
388 PKIX_Boolean *pCacheFlag, |
|
389 void *plContext) |
|
390 { |
|
391 PKIX_ENTER(CERTSTORE, "PKIX_CertStore_GetCertStoreCacheFlag"); |
|
392 PKIX_NULLCHECK_TWO(store, pCacheFlag); |
|
393 |
|
394 *pCacheFlag = store->cacheFlag; |
|
395 |
|
396 PKIX_RETURN(CERTSTORE); |
|
397 } |
|
398 |
|
399 /* |
|
400 * FUNCTION: PKIX_CertStore_GetLocalFlag |
|
401 * (see comments in pkix_certstore.h) |
|
402 */ |
|
403 PKIX_Error * |
|
404 PKIX_CertStore_GetLocalFlag( |
|
405 PKIX_CertStore *store, |
|
406 PKIX_Boolean *pLocalFlag, |
|
407 void *plContext) |
|
408 { |
|
409 PKIX_ENTER(CERTSTORE, "PKIX_CertStore_GetLocalFlag"); |
|
410 PKIX_NULLCHECK_TWO(store, pLocalFlag); |
|
411 |
|
412 *pLocalFlag = store->localFlag; |
|
413 |
|
414 PKIX_RETURN(CERTSTORE); |
|
415 } |