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 }
This site is hosted by Intevation GmbH (Datenschutzerklärung und Impressum | Privacy Policy and Imprint)