Mercurial > trustbridge > nss-cmake-static
comparison nss/lib/libpkix/pkix_pl_nss/pki/pkix_pl_basicconstraints.c @ 0:1e5118fa0cb1
This is NSS with a Cmake Buildsyste
To compile a static NSS library for Windows we've used the
Chromium-NSS fork and added a Cmake buildsystem to compile
it statically for Windows. See README.chromium for chromium
changes and README.trustbridge for our modifications.
author | Andre Heinecke <andre.heinecke@intevation.de> |
---|---|
date | Mon, 28 Jul 2014 10:47:06 +0200 |
parents | |
children |
comparison
equal
deleted
inserted
replaced
-1:000000000000 | 0:1e5118fa0cb1 |
---|---|
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_pl_basicconstraints.c | |
6 * | |
7 * BasicConstraints Object Functions | |
8 * | |
9 */ | |
10 | |
11 #include "pkix_pl_basicconstraints.h" | |
12 | |
13 /* | |
14 * FUNCTION: pkix_pl_CertBasicConstraints_Create | |
15 * DESCRIPTION: | |
16 * | |
17 * Creates a new CertBasicConstraints object whose CA Flag has the value | |
18 * given by the Boolean value of "isCA" and whose path length field has the | |
19 * value given by the "pathLen" argument and stores it at "pObject". | |
20 * | |
21 * PARAMETERS | |
22 * "isCA" | |
23 * Boolean value with the desired value of CA Flag. | |
24 * "pathLen" | |
25 * a PKIX_Int32 with the desired value of path length | |
26 * "pObject" | |
27 * Address of object pointer's destination. Must be non-NULL. | |
28 * "plContext" - Platform-specific context pointer. | |
29 * THREAD SAFETY: | |
30 * Thread Safe (see Thread Safety Definitions in Programmer's Guide) | |
31 * RETURNS: | |
32 * Returns NULL if the function succeeds. | |
33 * Returns a CertBasicConstraints Error if the function fails | |
34 * in a non-fatal way. | |
35 * Returns a Fatal Error if the function fails in an unrecoverable way. | |
36 */ | |
37 PKIX_Error * | |
38 pkix_pl_CertBasicConstraints_Create( | |
39 PKIX_Boolean isCA, | |
40 PKIX_Int32 pathLen, | |
41 PKIX_PL_CertBasicConstraints **pObject, | |
42 void *plContext) | |
43 { | |
44 PKIX_PL_CertBasicConstraints *basic = NULL; | |
45 | |
46 PKIX_ENTER(CERTBASICCONSTRAINTS, | |
47 "pkix_pl_CertBasicConstraints_Create"); | |
48 PKIX_NULLCHECK_ONE(pObject); | |
49 | |
50 PKIX_CHECK(PKIX_PL_Object_Alloc | |
51 (PKIX_CERTBASICCONSTRAINTS_TYPE, | |
52 sizeof (PKIX_PL_CertBasicConstraints), | |
53 (PKIX_PL_Object **)&basic, | |
54 plContext), | |
55 PKIX_COULDNOTCREATECERTBASICCONSTRAINTSOBJECT); | |
56 | |
57 basic->isCA = isCA; | |
58 | |
59 /* pathLen has meaning only for CAs, but it's not worth checking */ | |
60 basic->pathLen = pathLen; | |
61 | |
62 *pObject = basic; | |
63 | |
64 cleanup: | |
65 | |
66 PKIX_RETURN(CERTBASICCONSTRAINTS); | |
67 } | |
68 | |
69 /* | |
70 * FUNCTION: pkix_pl_CertBasicConstraints_Destroy | |
71 * (see comments for PKIX_PL_DestructorCallback in pkix_pl_system.h) | |
72 */ | |
73 static PKIX_Error * | |
74 pkix_pl_CertBasicConstraints_Destroy( | |
75 PKIX_PL_Object *object, | |
76 void *plContext) | |
77 { | |
78 PKIX_PL_CertBasicConstraints *certB = NULL; | |
79 | |
80 PKIX_ENTER(CERTBASICCONSTRAINTS, | |
81 "pkix_pl_CertBasicConstraints_Destroy"); | |
82 PKIX_NULLCHECK_ONE(object); | |
83 | |
84 PKIX_CHECK(pkix_CheckType | |
85 (object, PKIX_CERTBASICCONSTRAINTS_TYPE, plContext), | |
86 PKIX_OBJECTNOTCERTBASICCONSTRAINTS); | |
87 | |
88 certB = (PKIX_PL_CertBasicConstraints*)object; | |
89 | |
90 certB->isCA = PKIX_FALSE; | |
91 certB->pathLen = 0; | |
92 | |
93 cleanup: | |
94 | |
95 PKIX_RETURN(CERTBASICCONSTRAINTS); | |
96 } | |
97 | |
98 /* | |
99 * FUNCTION: pkix_pl_CertBasicConstraints_ToString | |
100 * (see comments for PKIX_PL_ToStringCallback in pkix_pl_system.h) | |
101 */ | |
102 static PKIX_Error * | |
103 pkix_pl_CertBasicConstraints_ToString( | |
104 PKIX_PL_Object *object, | |
105 PKIX_PL_String **pString, | |
106 void *plContext) | |
107 { | |
108 PKIX_PL_String *certBasicConstraintsString = NULL; | |
109 PKIX_PL_CertBasicConstraints *certB = NULL; | |
110 PKIX_Boolean isCA = PKIX_FALSE; | |
111 PKIX_Int32 pathLen = 0; | |
112 PKIX_PL_String *outString = NULL; | |
113 char *fmtString = NULL; | |
114 PKIX_Boolean pathlenArg = PKIX_FALSE; | |
115 | |
116 PKIX_ENTER(CERTBASICCONSTRAINTS, | |
117 "pkix_pl_CertBasicConstraints_toString"); | |
118 PKIX_NULLCHECK_TWO(object, pString); | |
119 | |
120 PKIX_CHECK(pkix_CheckType | |
121 (object, PKIX_CERTBASICCONSTRAINTS_TYPE, plContext), | |
122 PKIX_FIRSTARGUMENTNOTCERTBASICCONSTRAINTSOBJECT); | |
123 | |
124 certB = (PKIX_PL_CertBasicConstraints *)object; | |
125 | |
126 /* | |
127 * if CA == TRUE | |
128 * if pathLen == CERT_UNLIMITED_PATH_CONSTRAINT | |
129 * print "CA(-1)" | |
130 * else print "CA(nnn)" | |
131 * if CA == FALSE, print "~CA" | |
132 */ | |
133 | |
134 isCA = certB->isCA; | |
135 | |
136 if (isCA) { | |
137 pathLen = certB->pathLen; | |
138 | |
139 if (pathLen == CERT_UNLIMITED_PATH_CONSTRAINT) { | |
140 /* print "CA(-1)" */ | |
141 fmtString = "CA(-1)"; | |
142 pathlenArg = PKIX_FALSE; | |
143 } else { | |
144 /* print "CA(pathLen)" */ | |
145 fmtString = "CA(%d)"; | |
146 pathlenArg = PKIX_TRUE; | |
147 } | |
148 } else { | |
149 /* print "~CA" */ | |
150 fmtString = "~CA"; | |
151 pathlenArg = PKIX_FALSE; | |
152 } | |
153 | |
154 PKIX_CHECK(PKIX_PL_String_Create | |
155 (PKIX_ESCASCII, | |
156 fmtString, | |
157 0, | |
158 &certBasicConstraintsString, | |
159 plContext), | |
160 PKIX_STRINGCREATEFAILED); | |
161 | |
162 if (pathlenArg) { | |
163 PKIX_CHECK(PKIX_PL_Sprintf | |
164 (&outString, | |
165 plContext, | |
166 certBasicConstraintsString, | |
167 pathLen), | |
168 PKIX_SPRINTFFAILED); | |
169 } else { | |
170 PKIX_CHECK(PKIX_PL_Sprintf | |
171 (&outString, | |
172 plContext, | |
173 certBasicConstraintsString), | |
174 PKIX_SPRINTFFAILED); | |
175 } | |
176 | |
177 *pString = outString; | |
178 | |
179 cleanup: | |
180 | |
181 PKIX_DECREF(certBasicConstraintsString); | |
182 | |
183 PKIX_RETURN(CERTBASICCONSTRAINTS); | |
184 } | |
185 | |
186 /* | |
187 * FUNCTION: pkix_pl_CertBasicConstraints_Hashcode | |
188 * (see comments for PKIX_PL_HashcodeCallback in pkix_pl_system.h) | |
189 */ | |
190 static PKIX_Error * | |
191 pkix_pl_CertBasicConstraints_Hashcode( | |
192 PKIX_PL_Object *object, | |
193 PKIX_UInt32 *pHashcode, | |
194 void *plContext) | |
195 { | |
196 PKIX_PL_CertBasicConstraints *certB = NULL; | |
197 PKIX_Boolean isCA = PKIX_FALSE; | |
198 PKIX_Int32 pathLen = 0; | |
199 PKIX_Int32 hashInput = 0; | |
200 PKIX_UInt32 cbcHash = 0; | |
201 | |
202 PKIX_ENTER(CERTBASICCONSTRAINTS, | |
203 "pkix_pl_CertBasicConstraints_Hashcode"); | |
204 PKIX_NULLCHECK_TWO(object, pHashcode); | |
205 | |
206 PKIX_CHECK(pkix_CheckType | |
207 (object, PKIX_CERTBASICCONSTRAINTS_TYPE, plContext), | |
208 PKIX_OBJECTNOTCERTBASICCONSTRAINTS); | |
209 | |
210 certB = (PKIX_PL_CertBasicConstraints *)object; | |
211 | |
212 /* | |
213 * if CA == TRUE | |
214 * hash(pathLen + 1 - PKIX_UNLIMITED_PATH_CONSTRAINT) | |
215 * if CA == FALSE, hash(0) | |
216 */ | |
217 | |
218 isCA = certB->isCA; | |
219 | |
220 if (isCA) { | |
221 pathLen = certB->pathLen; | |
222 | |
223 hashInput = pathLen + 1 - PKIX_UNLIMITED_PATH_CONSTRAINT; | |
224 } | |
225 | |
226 PKIX_CHECK(pkix_hash | |
227 ((const unsigned char *)&hashInput, | |
228 sizeof (hashInput), | |
229 &cbcHash, | |
230 plContext), | |
231 PKIX_HASHFAILED); | |
232 | |
233 *pHashcode = cbcHash; | |
234 | |
235 cleanup: | |
236 | |
237 PKIX_RETURN(CERTBASICCONSTRAINTS); | |
238 } | |
239 | |
240 | |
241 /* | |
242 * FUNCTION: pkix_pl_CertBasicConstraints_Equals | |
243 * (see comments for PKIX_PL_Equals_Callback in pkix_pl_system.h) | |
244 */ | |
245 static PKIX_Error * | |
246 pkix_pl_CertBasicConstraints_Equals( | |
247 PKIX_PL_Object *firstObject, | |
248 PKIX_PL_Object *secondObject, | |
249 PKIX_Boolean *pResult, | |
250 void *plContext) | |
251 { | |
252 PKIX_PL_CertBasicConstraints *firstCBC = NULL; | |
253 PKIX_PL_CertBasicConstraints *secondCBC = NULL; | |
254 PKIX_UInt32 secondType; | |
255 PKIX_Boolean firstIsCA = PKIX_FALSE; | |
256 PKIX_Boolean secondIsCA = PKIX_FALSE; | |
257 PKIX_Int32 firstPathLen = 0; | |
258 PKIX_Int32 secondPathLen = 0; | |
259 | |
260 PKIX_ENTER(CERTBASICCONSTRAINTS, | |
261 "pkix_pl_CertBasicConstraints_Equals"); | |
262 PKIX_NULLCHECK_THREE(firstObject, secondObject, pResult); | |
263 | |
264 /* test that firstObject is a CertBasicConstraints */ | |
265 PKIX_CHECK(pkix_CheckType | |
266 (firstObject, PKIX_CERTBASICCONSTRAINTS_TYPE, plContext), | |
267 PKIX_FIRSTOBJECTNOTCERTBASICCONSTRAINTS); | |
268 | |
269 /* | |
270 * Since we know firstObject is a CertBasicConstraints, | |
271 * if both references are identical, they must be equal | |
272 */ | |
273 if (firstObject == secondObject){ | |
274 *pResult = PKIX_TRUE; | |
275 goto cleanup; | |
276 } | |
277 | |
278 /* | |
279 * If secondObject isn't a CertBasicConstraints, we | |
280 * don't throw an error. We simply return FALSE. | |
281 */ | |
282 PKIX_CHECK(PKIX_PL_Object_GetType | |
283 (secondObject, &secondType, plContext), | |
284 PKIX_COULDNOTGETTYPEOFSECONDARGUMENT); | |
285 if (secondType != PKIX_CERTBASICCONSTRAINTS_TYPE) { | |
286 *pResult = PKIX_FALSE; | |
287 goto cleanup; | |
288 } | |
289 | |
290 firstCBC = (PKIX_PL_CertBasicConstraints *)firstObject; | |
291 secondCBC = (PKIX_PL_CertBasicConstraints *)secondObject; | |
292 | |
293 /* | |
294 * Compare the value of the CAFlag components | |
295 */ | |
296 | |
297 firstIsCA = firstCBC->isCA; | |
298 | |
299 /* | |
300 * Failure here would be an error, not merely a miscompare, | |
301 * since we know second is a CertBasicConstraints. | |
302 */ | |
303 secondIsCA = secondCBC->isCA; | |
304 | |
305 /* | |
306 * If isCA flags differ, the objects are not equal. | |
307 */ | |
308 if (secondIsCA != firstIsCA) { | |
309 *pResult = PKIX_FALSE; | |
310 goto cleanup; | |
311 } | |
312 | |
313 /* | |
314 * If isCA was FALSE, the objects are equal, because | |
315 * pathLen is meaningless in that case. | |
316 */ | |
317 if (!firstIsCA) { | |
318 *pResult = PKIX_TRUE; | |
319 goto cleanup; | |
320 } | |
321 | |
322 firstPathLen = firstCBC->pathLen; | |
323 secondPathLen = secondCBC->pathLen; | |
324 | |
325 *pResult = (secondPathLen == firstPathLen); | |
326 | |
327 cleanup: | |
328 | |
329 PKIX_RETURN(CERTBASICCONSTRAINTS); | |
330 } | |
331 | |
332 /* | |
333 * FUNCTION: pkix_pl_CertBasicConstraints_RegisterSelf | |
334 * DESCRIPTION: | |
335 * Registers PKIX_CERTBASICCONSTRAINTS_TYPE and its related | |
336 * functions with systemClasses[] | |
337 * THREAD SAFETY: | |
338 * Not Thread Safe - for performance and complexity reasons | |
339 * | |
340 * Since this function is only called by PKIX_PL_Initialize, | |
341 * which should only be called once, it is acceptable that | |
342 * this function is not thread-safe. | |
343 */ | |
344 PKIX_Error * | |
345 pkix_pl_CertBasicConstraints_RegisterSelf(void *plContext) | |
346 { | |
347 | |
348 extern pkix_ClassTable_Entry systemClasses[PKIX_NUMTYPES]; | |
349 pkix_ClassTable_Entry entry; | |
350 | |
351 PKIX_ENTER(CERTBASICCONSTRAINTS, | |
352 "pkix_pl_CertBasicConstraints_RegisterSelf"); | |
353 | |
354 entry.description = "CertBasicConstraints"; | |
355 entry.objCounter = 0; | |
356 entry.typeObjectSize = sizeof(PKIX_PL_CertBasicConstraints); | |
357 entry.destructor = pkix_pl_CertBasicConstraints_Destroy; | |
358 entry.equalsFunction = pkix_pl_CertBasicConstraints_Equals; | |
359 entry.hashcodeFunction = pkix_pl_CertBasicConstraints_Hashcode; | |
360 entry.toStringFunction = pkix_pl_CertBasicConstraints_ToString; | |
361 entry.comparator = NULL; | |
362 entry.duplicateFunction = pkix_duplicateImmutable; | |
363 | |
364 systemClasses[PKIX_CERTBASICCONSTRAINTS_TYPE] = entry; | |
365 | |
366 PKIX_RETURN(CERTBASICCONSTRAINTS); | |
367 } | |
368 | |
369 /* --Public-Functions------------------------------------------------------- */ | |
370 | |
371 /* | |
372 * FUNCTION: PKIX_PL_BasicConstraints_GetCAFlag | |
373 * (see comments in pkix_pl_pki.h) | |
374 */ | |
375 PKIX_Error * | |
376 PKIX_PL_BasicConstraints_GetCAFlag( | |
377 PKIX_PL_CertBasicConstraints *basicConstraints, | |
378 PKIX_Boolean *pResult, | |
379 void *plContext) | |
380 { | |
381 PKIX_ENTER(CERTBASICCONSTRAINTS, | |
382 "PKIX_PL_BasicConstraintsGetCAFlag"); | |
383 PKIX_NULLCHECK_TWO(basicConstraints, pResult); | |
384 | |
385 *pResult = basicConstraints->isCA; | |
386 | |
387 PKIX_RETURN(CERTBASICCONSTRAINTS); | |
388 } | |
389 | |
390 /* | |
391 * FUNCTION: PKIX_PL_BasicConstraints_GetPathLenConstraint | |
392 * (see comments in pkix_pl_pki.h) | |
393 */ | |
394 PKIX_Error * | |
395 PKIX_PL_BasicConstraints_GetPathLenConstraint( | |
396 PKIX_PL_CertBasicConstraints *basicConstraints, | |
397 PKIX_Int32 *pPathLenConstraint, | |
398 void *plContext) | |
399 { | |
400 PKIX_ENTER(CERTBASICCONSTRAINTS, | |
401 "PKIX_PL_BasicConstraintsGetPathLenConstraint"); | |
402 PKIX_NULLCHECK_TWO(basicConstraints, pPathLenConstraint); | |
403 | |
404 *pPathLenConstraint = basicConstraints->pathLen; | |
405 | |
406 PKIX_RETURN(CERTBASICCONSTRAINTS); | |
407 } |