2 * Copyright (c) 2000-2001 Apple Computer, Inc. All Rights Reserved.
4 * The contents of this file constitute Original Code as defined in and are
5 * subject to the Apple Public Source License Version 1.2 (the 'License').
6 * You may not use this file except in compliance with the License. Please obtain
7 * a copy of the License at http://www.apple.com/publicsource and read it before
10 * This Original Code and all software distributed under the License are
11 * distributed on an 'AS IS' basis, WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESS
12 * OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES, INCLUDING WITHOUT
13 * LIMITATION, ANY WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR
14 * PURPOSE, QUIET ENJOYMENT OR NON-INFRINGEMENT. Please see the License for the
15 * specific language governing rights and limitations under the License.
20 * CLCertExtensions.cpp - extensions support. A major component of DecodedCert.
22 * Created 9/8/2000 by Doug Mitchell.
23 * Copyright (c) 2000 by Apple Computer.
27 #include "DecodedCert.h"
28 #include "cldebugging.h"
29 #include "CLCertExtensions.h"
30 #include "CLFieldsCommon.h"
31 #include "clNssUtils.h"
32 #include "clNameUtils.h"
33 #include <Security/utilities.h>
34 #include <Security/oidscert.h>
35 #include <Security/oidsattr.h>
36 #include <Security/cssmerr.h>
37 #include <Security/x509defs.h>
38 #include <Security/certextensions.h>
39 #include <Security/globalizer.h>
40 #include <SecurityNssAsn1/certExtensionTemplates.h>
44 *** get/set/free functions called out from CertFields.cpp
49 *** CDSA format CE_KeyUsage
50 *** NSS format CSSM_DATA, length 2
51 *** OID CSSMOID_KeyUsage
54 void setFieldKeyUsage(
56 const CssmData
&fieldValue
)
58 CSSM_X509_EXTENSION_PTR cssmExt
= verifySetFreeExtension(fieldValue
,
60 CE_KeyUsage
*cdsaObj
= (CE_KeyUsage
*)cssmExt
->value
.parsedValue
;
62 /* Alloc an NSS-style key usage in cert.coder's memory */
63 SecNssCoder
&coder
= cert
.coder();
64 CSSM_DATA
*nssObj
= (CSSM_DATA
*)coder
.malloc(sizeof(CSSM_DATA
));
65 coder
.allocItem(*nssObj
, 2);
67 /* cdsaObj --> nssObj */
68 nssObj
->Data
[0] = (*cdsaObj
) >> 8;
69 nssObj
->Data
[1] = *cdsaObj
;
71 /* Adjust length for BIT STRING encoding */
72 clCssmBitStringToNss(*nssObj
);
74 /* add to mExtensions */
75 cert
.addExtension(nssObj
, cssmExt
->extnId
, cssmExt
->critical
, false,
76 NSS_KeyUsageTemplate
);
80 bool getFieldKeyUsage(
82 unsigned index
, // which occurrence (0 = first)
83 uint32
&numFields
, // RETURNED
84 CssmOwnedData
&fieldValue
)
86 const DecodedExten
*decodedExt
;
91 brtn
= cert
.GetExtenTop
<CSSM_DATA
, CE_KeyUsage
>(
103 /* make a copy - can't modify length in place */
104 CSSM_DATA bitString
= *nssObj
;
105 clNssBitStringToCssm(bitString
);
106 unsigned toCopy
= bitString
.Length
;
108 /* I hope I never see this... */
109 clErrorLog("getFieldKeyUsage: KeyUsage larger than 2 bytes!");
112 unsigned char bits
[2] = {0, 0};
113 memmove(bits
, bitString
.Data
, toCopy
);
114 *cdsaObj
= (((unsigned)bits
[0]) << 8) | bits
[1];
116 /* pass back to caller */
117 getFieldExtenCommon(cdsaObj
, *decodedExt
, fieldValue
);
122 *** Basic Constraints
123 *** CDSA format: CE_BasicConstraints
124 *** NSS format CE_BasicConstraints
125 *** OID CSSMOID_BasicConstraints
128 void setFieldBasicConstraints(
130 const CssmData
&fieldValue
)
132 CSSM_X509_EXTENSION_PTR cssmExt
=
133 verifySetFreeExtension(fieldValue
, false);
134 CE_BasicConstraints
*cdsaObj
=
135 (CE_BasicConstraints
*)cssmExt
->value
.parsedValue
;
137 /* Alloc an NSS-style BasicConstraints in cert.coder's memory */
138 SecNssCoder
&coder
= cert
.coder();
139 NSS_BasicConstraints
*nssObj
=
140 (NSS_BasicConstraints
*)coder
.malloc(sizeof(NSS_BasicConstraints
));
141 memset(nssObj
, 0, sizeof(*nssObj
));
143 /* cdsaObj --> nssObj */
144 ArenaAllocator
arenaAlloc(coder
);
145 clCssmBoolToNss(cdsaObj
->cA
, nssObj
->cA
, arenaAlloc
);
146 if(cdsaObj
->pathLenConstraintPresent
) {
147 clIntToData(cdsaObj
->pathLenConstraint
,
148 nssObj
->pathLenConstraint
, arenaAlloc
);
151 /* add to mExtensions */
152 cert
.addExtension(nssObj
, cssmExt
->extnId
, cssmExt
->critical
, false,
153 NSS_BasicConstraintsTemplate
);
157 bool getFieldBasicConstraints(
159 unsigned index
, // which occurrence (0 = first)
160 uint32
&numFields
, // RETURNED
161 CssmOwnedData
&fieldValue
)
163 const DecodedExten
*decodedExt
;
164 NSS_BasicConstraints
*nssObj
;
165 CE_BasicConstraints
*cdsaObj
;
168 brtn
= cert
.GetExtenTop
<NSS_BasicConstraints
, CE_BasicConstraints
>(
171 fieldValue
.allocator
,
172 CSSMOID_BasicConstraints
,
180 if(nssObj
->cA
.Data
== NULL
) {
182 cdsaObj
->cA
= CSSM_FALSE
;
185 cdsaObj
->cA
= clNssBoolToCssm(nssObj
->cA
);
187 if(nssObj
->pathLenConstraint
.Data
== NULL
) {
189 cdsaObj
->pathLenConstraintPresent
= CSSM_FALSE
;
190 cdsaObj
->pathLenConstraint
= 0;
193 cdsaObj
->pathLenConstraintPresent
= CSSM_TRUE
;
194 cdsaObj
->pathLenConstraint
= clDataToInt(nssObj
->pathLenConstraint
);
197 /* pass back to caller */
198 getFieldExtenCommon(cdsaObj
, *decodedExt
, fieldValue
);
203 *** Extended Key Usage
204 *** CDSA format: CE_ExtendedKeyUsage
205 *** NSS format: NSS_ExtKeyUsage
206 *** OID CSSMOID_ExtendedKeyUsage
208 void setFieldExtKeyUsage(
210 const CssmData
&fieldValue
)
212 CSSM_X509_EXTENSION_PTR cssmExt
= verifySetFreeExtension(fieldValue
,
214 CE_ExtendedKeyUsage
*cdsaObj
=
215 (CE_ExtendedKeyUsage
*)cssmExt
->value
.parsedValue
;
217 SecNssCoder
&coder
= cert
.coder();
218 NSS_ExtKeyUsage
*nssObj
=
219 (NSS_ExtKeyUsage
*)coder
.malloc(sizeof(NSS_ExtKeyUsage
));
220 memset(nssObj
, 0, sizeof(*nssObj
));
221 if(cdsaObj
->numPurposes
!= 0) {
223 (CSSM_OID
**)clNssNullArray(cdsaObj
->numPurposes
, coder
);
226 /* cdsaObj --> nssObj, one 'purpose' (OID) at a time */
227 for(unsigned dex
=0; dex
<cdsaObj
->numPurposes
; dex
++) {
228 nssObj
->purposes
[dex
] = (CSSM_OID
*)coder
.malloc(sizeof(CSSM_OID
));
229 coder
.allocCopyItem(cdsaObj
->purposes
[dex
],
230 *nssObj
->purposes
[dex
]);
233 /* add to mExtensions */
234 cert
.addExtension(nssObj
, cssmExt
->extnId
, cssmExt
->critical
, false,
235 NSS_ExtKeyUsageTemplate
);
238 bool getFieldExtKeyUsage(
240 unsigned index
, // which occurrence (0 = first)
241 uint32
&numFields
, // RETURNED
242 CssmOwnedData
&fieldValue
)
244 const DecodedExten
*decodedExt
;
245 NSS_ExtKeyUsage
*nssObj
;
246 CE_ExtendedKeyUsage
*cdsaObj
;
248 CssmAllocator
&alloc
= fieldValue
.allocator
;
250 brtn
= cert
.GetExtenTop
<NSS_ExtKeyUsage
, CE_ExtendedKeyUsage
>(
254 CSSMOID_ExtendedKeyUsage
,
262 /* nssObj --> cdsaObj, one purpose at a time */
263 unsigned numPurposes
= clNssArraySize((const void **)nssObj
->purposes
);
264 cdsaObj
->numPurposes
= numPurposes
;
266 unsigned len
= numPurposes
* sizeof(CSSM_OID
);
267 cdsaObj
->purposes
= (CSSM_OID_PTR
)alloc
.malloc(len
);
268 memset(cdsaObj
->purposes
, 0, len
);
270 for(unsigned dex
=0; dex
<numPurposes
; dex
++) {
271 clAllocCopyData(alloc
, *nssObj
->purposes
[dex
], cdsaObj
->purposes
[dex
]);
274 getFieldExtenCommon(cdsaObj
, *decodedExt
, fieldValue
);
278 void freeFieldExtKeyUsage(
279 CssmOwnedData
&fieldValue
)
281 CSSM_X509_EXTENSION_PTR cssmExt
= verifySetFreeExtension(fieldValue
, false);
282 CssmAllocator
&alloc
= fieldValue
.allocator
;
283 CE_ExtendedKeyUsage
*cdsaObj
=
284 (CE_ExtendedKeyUsage
*)cssmExt
->value
.parsedValue
;
286 for(oidDex
=0; oidDex
<cdsaObj
->numPurposes
; oidDex
++) {
287 alloc
.free(cdsaObj
->purposes
[oidDex
].Data
);
289 alloc
.free(cdsaObj
->purposes
);
290 freeFieldExtenCommon(cssmExt
, alloc
); // frees extnId, parsedValue, BERvalue
294 *** Subject Key Identifier
295 *** CDSA format: CE_SubjectKeyID, which is just a CSSM_DATA
296 *** OID CSSMOID_SubjectKeyIdentifier
299 void setFieldSubjectKeyId(
301 const CssmData
&fieldValue
)
303 CSSM_X509_EXTENSION_PTR cssmExt
= verifySetFreeExtension(fieldValue
,
305 CE_SubjectKeyID
*cdsaObj
= (CE_SubjectKeyID
*)cssmExt
->value
.parsedValue
;
306 SecNssCoder
&coder
= cert
.coder();
307 CSSM_DATA
*nssObj
= (CSSM_DATA
*)coder
.malloc(sizeof(CSSM_DATA
));
308 coder
.allocCopyItem(*cdsaObj
, *nssObj
);
310 /* add to mExtensions */
311 cert
.addExtension(nssObj
, cssmExt
->extnId
, cssmExt
->critical
, false,
312 NSS_SubjectKeyIdTemplate
);
315 bool getFieldSubjectKeyId(
317 unsigned index
, // which occurrence (0 = first)
318 uint32
&numFields
, // RETURNED
319 CssmOwnedData
&fieldValue
)
321 const DecodedExten
*decodedExt
;
323 CE_SubjectKeyID
*cdsaObj
;
325 CssmAllocator
&alloc
= fieldValue
.allocator
;
327 brtn
= cert
.GetExtenTop
<CSSM_DATA
, CE_SubjectKeyID
>(
331 CSSMOID_SubjectKeyIdentifier
,
339 /* if this fails, we're out of sync with nssExtenInfo[] in
340 * CLFieldsCommon.cpp */
341 assert(nssObj
!= NULL
);
342 clAllocCopyData(alloc
, *nssObj
, *cdsaObj
);
343 getFieldExtenCommon(cdsaObj
, *decodedExt
, fieldValue
);
347 void freeFieldSubjectKeyId (
348 CssmOwnedData
&fieldValue
)
350 CSSM_X509_EXTENSION_PTR cssmExt
= verifySetFreeExtension(fieldValue
, false);
351 CssmAllocator
&alloc
= fieldValue
.allocator
;
352 CE_SubjectKeyID
*cdsaObj
= (CE_SubjectKeyID
*)cssmExt
->value
.parsedValue
;
353 alloc
.free(cdsaObj
->Data
);
354 freeFieldExtenCommon(cssmExt
, alloc
); // frees extnId, parsedValue, BERvalue
358 *** Authority Key Identifier
359 *** CDSA format: CE_AuthorityKeyID
360 *** NSS format: NSS_AuthorityKeyId
361 *** OID CSSMOID_AuthorityKeyIdentifier
364 void setFieldAuthorityKeyId(
366 const CssmData
&fieldValue
)
368 CSSM_X509_EXTENSION_PTR cssmExt
= verifySetFreeExtension(fieldValue
,
370 CE_AuthorityKeyID
*cdsaObj
=
371 (CE_AuthorityKeyID
*)cssmExt
->value
.parsedValue
;
373 /* Alloc an NSS-style AuthorityKeyId in cert.coder's memory */
374 SecNssCoder
&coder
= cert
.coder();
375 NSS_AuthorityKeyId
*nssObj
=
376 (NSS_AuthorityKeyId
*)coder
.malloc(sizeof(NSS_AuthorityKeyId
));
377 memset(nssObj
, 0, sizeof(*nssObj
));
379 /* convert caller's CDSA-style CE_AuthorityKeyID to NSS */
380 CL_cssmAuthorityKeyIdToNss(*cdsaObj
, *nssObj
, coder
);
382 /* add to mExtensions */
383 cert
.addExtension(nssObj
, cssmExt
->extnId
, cssmExt
->critical
, false,
384 NSS_AuthorityKeyIdTemplate
);
387 bool getFieldAuthorityKeyId(
389 unsigned index
, // which occurrence (0 = first)
390 uint32
&numFields
, // RETURNED
391 CssmOwnedData
&fieldValue
)
393 const DecodedExten
*decodedExt
;
394 NSS_AuthorityKeyId
*nssObj
;
395 CE_AuthorityKeyID
*cdsaObj
;
397 CssmAllocator
&alloc
= fieldValue
.allocator
;
399 brtn
= cert
.GetExtenTop
<NSS_AuthorityKeyId
, CE_AuthorityKeyID
>(
403 CSSMOID_AuthorityKeyIdentifier
,
410 assert(nssObj
!= NULL
);
412 /* nssObj --> cdsaObj */
413 CL_nssAuthorityKeyIdToCssm(*nssObj
, *cdsaObj
, cert
.coder(), alloc
);
415 getFieldExtenCommon(cdsaObj
, *decodedExt
, fieldValue
);
419 void freeFieldAuthorityKeyId (
420 CssmOwnedData
&fieldValue
)
422 CSSM_X509_EXTENSION_PTR cssmExt
= verifySetFreeExtension(fieldValue
, false);
423 CssmAllocator
&alloc
= fieldValue
.allocator
;
424 CE_AuthorityKeyID
*cdsaObj
= (CE_AuthorityKeyID
*)cssmExt
->value
.parsedValue
;
425 CL_freeAuthorityKeyId(*cdsaObj
, alloc
);
426 freeFieldExtenCommon(cssmExt
, alloc
); // frees extnId, parsedValue, BERvalue
430 *** Subject/Issuer alternate name
431 *** CDSA Format: CE_GeneralNames
432 *** NSS format: NSS_GeneralNames
433 *** OID: CSSMOID_SubjectAltName, CSSMOID_IssuerAltName
435 void setFieldSubjIssuerAltName(
437 const CssmData
&fieldValue
)
439 CSSM_X509_EXTENSION_PTR cssmExt
=
440 verifySetFreeExtension(fieldValue
, false);
441 CE_GeneralNames
*cdsaObj
= (CE_GeneralNames
*)cssmExt
->value
.parsedValue
;
443 /* Alloc an NSS-style GeneralNames in cert.coder's memory */
444 SecNssCoder
&coder
= cert
.coder();
445 NSS_GeneralNames
*nssObj
=
446 (NSS_GeneralNames
*)coder
.malloc(sizeof(NSS_GeneralNames
));
447 memset(nssObj
, 0, sizeof(*nssObj
));
449 /* cdsaObj --> nssObj */
450 CL_cssmGeneralNamesToNss(*cdsaObj
, *nssObj
, coder
);
452 /* add to mExtensions */
453 cert
.addExtension(nssObj
, cssmExt
->extnId
, cssmExt
->critical
, false,
454 NSS_GeneralNamesTemplate
);
457 bool getFieldSubjAltName(
459 unsigned index
, // which occurrence (0 = first)
460 uint32
&numFields
, // RETURNED
461 CssmOwnedData
&fieldValue
)
463 const DecodedExten
*decodedExt
;
464 NSS_GeneralNames
*nssObj
;
465 CE_GeneralNames
*cdsaObj
;
468 brtn
= cert
.GetExtenTop
<NSS_GeneralNames
, CE_GeneralNames
>(
471 fieldValue
.allocator
,
472 CSSMOID_SubjectAltName
,
479 CL_nssGeneralNamesToCssm(*nssObj
, *cdsaObj
,
480 cert
.coder(), fieldValue
.allocator
);
481 getFieldExtenCommon(cdsaObj
, *decodedExt
, fieldValue
);
485 bool getFieldIssuerAltName(
487 unsigned index
, // which occurrence (0 = first)
488 uint32
&numFields
, // RETURNED
489 CssmOwnedData
&fieldValue
)
491 const DecodedExten
*decodedExt
;
492 NSS_GeneralNames
*nssObj
;
493 CE_GeneralNames
*cdsaObj
;
496 brtn
= cert
.GetExtenTop
<NSS_GeneralNames
, CE_GeneralNames
>(
499 fieldValue
.allocator
,
500 CSSMOID_IssuerAltName
,
507 CL_nssGeneralNamesToCssm(*nssObj
, *cdsaObj
,
508 cert
.coder(), fieldValue
.allocator
);
509 getFieldExtenCommon(cdsaObj
, *decodedExt
, fieldValue
);
513 void freeFieldSubjIssuerAltName (
514 CssmOwnedData
&fieldValue
)
516 CSSM_X509_EXTENSION_PTR cssmExt
= verifySetFreeExtension(fieldValue
, false);
517 CssmAllocator
&alloc
= fieldValue
.allocator
;
518 CE_GeneralNames
*cdsaObj
= (CE_GeneralNames
*)cssmExt
->value
.parsedValue
;
519 CL_freeCssmGeneralNames(cdsaObj
, alloc
);
520 freeFieldExtenCommon(cssmExt
, alloc
); // frees extnId, parsedValue, BERvalue
524 *** Certificate Policies
525 *** CDSA Format: CE_CertPolicies
526 *** NSS format : NSS_CertPolicies
527 *** OID: CSSMOID_CertificatePolicies
530 #define MAX_IA5_NAME_SIZE 1024
532 void setFieldCertPolicies(
534 const CssmData
&fieldValue
)
536 CSSM_X509_EXTENSION_PTR cssmExt
=
537 verifySetFreeExtension(fieldValue
, false);
538 SecNssCoder
&coder
= cert
.coder();
539 NSS_CertPolicies
*nssObj
=
540 (NSS_CertPolicies
*)coder
.malloc(sizeof(NSS_CertPolicies
));
541 memset(nssObj
, 0, sizeof(NSS_CertPolicies
));
542 CE_CertPolicies
*cdsaObj
=
543 (CE_CertPolicies
*)cssmExt
->value
.parsedValue
;
545 if(cdsaObj
->numPolicies
) {
547 (NSS_PolicyInformation
**)clNssNullArray(
548 cdsaObj
->numPolicies
, coder
);
550 for(unsigned polDex
=0; polDex
<cdsaObj
->numPolicies
; polDex
++) {
551 CE_PolicyInformation
*cPolInfo
= &cdsaObj
->policies
[polDex
];
552 NSS_PolicyInformation
*nPolInfo
= (NSS_PolicyInformation
*)
553 coder
.malloc(sizeof(NSS_PolicyInformation
));
554 memset(nPolInfo
, 0, sizeof(*nPolInfo
));
555 nssObj
->policies
[polDex
] = nPolInfo
;
557 coder
.allocCopyItem(cPolInfo
->certPolicyId
, nPolInfo
->certPolicyId
);
559 unsigned numQual
= cPolInfo
->numPolicyQualifiers
;
561 nPolInfo
->policyQualifiers
=
562 (NSS_PolicyQualifierInfo
**)clNssNullArray(numQual
,
565 for(unsigned qualDex
=0; qualDex
<numQual
; qualDex
++) {
566 CE_PolicyQualifierInfo
*cQualInfo
=
567 &cPolInfo
->policyQualifiers
[qualDex
];
568 NSS_PolicyQualifierInfo
*nQualInfo
=
569 (NSS_PolicyQualifierInfo
*)coder
.malloc(
570 sizeof(NSS_PolicyQualifierInfo
));
571 memset(nQualInfo
, 0, sizeof(NSS_PolicyQualifierInfo
));
572 nPolInfo
->policyQualifiers
[qualDex
] = nQualInfo
;
575 * OK we're at the lowest level.
576 * policyQualifierId == id_qt_cps: qualifier is
577 * an IA5 string, incoming data is its contents.
578 * Else incoming data is an encoded blob we pass on directly.
580 coder
.allocCopyItem(cQualInfo
->policyQualifierId
,
581 nQualInfo
->policyQualifierId
);
583 if(clCompareCssmData(&cQualInfo
->policyQualifierId
,
585 if(coder
.encodeItem(&cQualInfo
->qualifier
,
586 SEC_IA5StringTemplate
,
587 nQualInfo
->qualifier
)) {
588 clErrorLog("setFieldCertPOlicies: IA5 encode error\n");
589 CssmError::throwMe(CSSMERR_CL_MEMORY_ERROR
);
593 /* uninterpreted, copy over directly */
594 coder
.allocCopyItem(cQualInfo
->qualifier
,
595 nQualInfo
->qualifier
);
597 } /* for each qualifier */
598 } /* for each policy */
600 /* add to mExtensions */
601 cert
.addExtension(nssObj
, cssmExt
->extnId
, cssmExt
->critical
, false,
602 NSS_CertPoliciesTemplate
);
605 bool getFieldCertPolicies(
607 unsigned index
, // which occurrence (0 = first)
608 uint32
&numFields
, // RETURNED
609 CssmOwnedData
&fieldValue
)
611 const DecodedExten
*decodedExt
;
612 NSS_CertPolicies
*nssObj
;
613 CE_CertPolicies
*cdsaObj
;
615 CssmAllocator
&alloc
= fieldValue
.allocator
;
616 brtn
= cert
.GetExtenTop
<NSS_CertPolicies
, CE_CertPolicies
>(
619 fieldValue
.allocator
,
620 CSSMOID_CertificatePolicies
,
627 assert(nssObj
!= NULL
);
629 memset(cdsaObj
, 0, sizeof(*cdsaObj
));
630 cdsaObj
->numPolicies
=
631 clNssArraySize((const void **)nssObj
->policies
);
632 unsigned sz
= cdsaObj
->numPolicies
* sizeof(CE_PolicyInformation
);
634 cdsaObj
->policies
= (CE_PolicyInformation
*)alloc
.malloc(sz
);
635 memset(cdsaObj
->policies
, 0, sz
);
638 for(unsigned polDex
=0; polDex
<cdsaObj
->numPolicies
; polDex
++) {
639 CE_PolicyInformation
*cPolInfo
= &cdsaObj
->policies
[polDex
];
640 NSS_PolicyInformation
*nPolInfo
= nssObj
->policies
[polDex
];
641 clAllocCopyData(alloc
, nPolInfo
->certPolicyId
,
642 cPolInfo
->certPolicyId
);
643 if(nPolInfo
->policyQualifiers
== NULL
) {
647 cPolInfo
->numPolicyQualifiers
=
648 clNssArraySize((const void **)nPolInfo
->policyQualifiers
);
649 sz
= cPolInfo
->numPolicyQualifiers
*
650 sizeof(CE_PolicyQualifierInfo
);
651 cPolInfo
->policyQualifiers
= (CE_PolicyQualifierInfo
*)
653 memset(cPolInfo
->policyQualifiers
, 0, sz
);
655 for(unsigned qualDex
=0; qualDex
<cPolInfo
->numPolicyQualifiers
;
657 NSS_PolicyQualifierInfo
*nQualInfo
=
658 nPolInfo
->policyQualifiers
[qualDex
];
659 CE_PolicyQualifierInfo
*cQualInfo
=
660 &cPolInfo
->policyQualifiers
[qualDex
];
664 * policyQualifierId == CSSMOID_QT_CPS :
665 * IA5String - decode and return contents.
666 * Else return whole thing.
668 clAllocCopyData(alloc
, nQualInfo
->policyQualifierId
,
669 cQualInfo
->policyQualifierId
);
670 CSSM_DATA toCopy
= nQualInfo
->qualifier
;
671 if(clCompareCssmData(&nQualInfo
->policyQualifierId
,
673 /* decode as IA5String to temp memory */
676 if(cert
.coder().decodeItem(nQualInfo
->qualifier
,
677 SEC_IA5StringTemplate
,
679 clErrorLog("***getCertPolicies: bad IA5String!\n");
680 CssmError::throwMe(CSSMERR_CL_UNKNOWN_FORMAT
);
683 /* else copy out nQualInfo->qualifier */
684 clAllocCopyData(alloc
, toCopy
, cQualInfo
->qualifier
);
685 } /* for each qualifier */
686 } /* for each policy info */
687 getFieldExtenCommon(cdsaObj
, *decodedExt
, fieldValue
);
691 void freeFieldCertPolicies (
692 CssmOwnedData
&fieldValue
)
694 CSSM_X509_EXTENSION_PTR cssmExt
= verifySetFreeExtension(fieldValue
, false);
695 CssmAllocator
&alloc
= fieldValue
.allocator
;
696 CE_CertPolicies
*cdsaObj
= (CE_CertPolicies
*)cssmExt
->value
.parsedValue
;
697 for(unsigned polDex
=0; polDex
<cdsaObj
->numPolicies
; polDex
++) {
698 CE_PolicyInformation
*cPolInfo
= &cdsaObj
->policies
[polDex
];
699 alloc
.free(cPolInfo
->certPolicyId
.Data
);
700 for(unsigned qualDex
=0;
701 qualDex
<cPolInfo
->numPolicyQualifiers
;
703 CE_PolicyQualifierInfo
*cQualInfo
=
704 &cPolInfo
->policyQualifiers
[qualDex
];
705 alloc
.free(cQualInfo
->policyQualifierId
.Data
);
706 alloc
.free(cQualInfo
->qualifier
.Data
);
708 alloc
.free(cPolInfo
->policyQualifiers
);
710 alloc
.free(cdsaObj
->policies
);
711 freeFieldExtenCommon(cssmExt
, alloc
); // frees extnId, parsedValue,
716 *** Netscape cert type
717 *** CDSA Format: CE_NetscapeCertType (a uint16)
718 *** NSS format CSSM_DATA, length 2
719 *** OID: CSSMOID_NetscapeCertType
721 void setFieldNetscapeCertType(
723 const CssmData
&fieldValue
)
725 CSSM_X509_EXTENSION_PTR cssmExt
= verifySetFreeExtension(fieldValue
,
727 CE_NetscapeCertType
*cdsaObj
=
728 (CE_NetscapeCertType
*)cssmExt
->value
.parsedValue
;
730 /* Alloc an NSS-style key usage in cert.coder's memory */
731 SecNssCoder
&coder
= cert
.coder();
732 CSSM_DATA
*nssObj
= (CSSM_DATA
*)coder
.malloc(sizeof(CSSM_DATA
));
733 coder
.allocItem(*nssObj
, 2);
735 /* cdsaObj --> nssObj */
736 nssObj
->Data
[0] = (*cdsaObj
) >> 8;
737 nssObj
->Data
[1] = *cdsaObj
;
739 /* Adjust length for BIT STRING encoding */
740 clCssmBitStringToNss(*nssObj
);
742 /* add to mExtensions */
743 cert
.addExtension(nssObj
, cssmExt
->extnId
, cssmExt
->critical
, false,
744 NSS_NetscapeCertTypeTemplate
);
747 bool getFieldNetscapeCertType(
749 unsigned index
, // which occurrence (0 = first)
750 uint32
&numFields
, // RETURNED
751 CssmOwnedData
&fieldValue
)
753 const DecodedExten
*decodedExt
;
755 CE_NetscapeCertType
*cdsaObj
;
758 brtn
= cert
.GetExtenTop
<CSSM_DATA
, CE_NetscapeCertType
>(
761 fieldValue
.allocator
,
762 CSSMOID_NetscapeCertType
,
770 /* make a copy - can't modify length in place */
771 CSSM_DATA bitString
= *nssObj
;
772 clNssBitStringToCssm(bitString
);
773 unsigned toCopy
= bitString
.Length
;
775 /* I hope I never see this... */
776 clErrorLog("getFieldKeyUsage: CertType larger than 2 bytes!");
779 unsigned char bits
[2] = {0, 0};
780 memmove(bits
, bitString
.Data
, toCopy
);
781 *cdsaObj
= (((unsigned)bits
[0]) << 8) | bits
[1];
783 /* pass back to caller */
784 getFieldExtenCommon(cdsaObj
, *decodedExt
, fieldValue
);
789 *** CRL Distribution points
790 *** CDSA Format: CE_CRLDistPointsSyntax
791 *** NSS format: NSS_CRLDistributionPoints
792 *** OID: CSSMOID_CrlDistributionPoints
794 void setFieldCrlDistPoints(
796 const CssmData
&fieldValue
)
798 CSSM_X509_EXTENSION_PTR cssmExt
=
799 verifySetFreeExtension(fieldValue
, false);
800 CE_CRLDistPointsSyntax
*cdsaObj
=
801 (CE_CRLDistPointsSyntax
*)cssmExt
->value
.parsedValue
;
802 SecNssCoder
&coder
= cert
.coder();
803 NSS_CRLDistributionPoints
*nssObj
=
804 (NSS_CRLDistributionPoints
*)coder
.malloc(
805 sizeof(NSS_CRLDistributionPoints
));
807 CL_cssmDistPointsToNss(*cdsaObj
, *nssObj
, coder
);
808 cert
.addExtension(nssObj
, cssmExt
->extnId
, cssmExt
->critical
, false,
809 NSS_CRLDistributionPointsTemplate
);
812 bool getFieldCrlDistPoints(
814 unsigned index
, // which occurrence (0 = first)
815 uint32
&numFields
, // RETURNED
816 CssmOwnedData
&fieldValue
)
818 const DecodedExten
*decodedExt
;
819 NSS_CRLDistributionPoints
*nssObj
;
820 CE_CRLDistPointsSyntax
*cdsaObj
;
822 CssmAllocator
&alloc
= fieldValue
.allocator
;
824 brtn
= cert
.GetExtenTop
<NSS_CRLDistributionPoints
,
825 CE_CRLDistPointsSyntax
>(
829 CSSMOID_CrlDistributionPoints
,
836 assert(nssObj
!= NULL
);
837 CL_nssDistPointsToCssm(*nssObj
, *cdsaObj
, cert
.coder(), alloc
);
838 getFieldExtenCommon(cdsaObj
, *decodedExt
, fieldValue
);
842 void freeFieldCrlDistPoints (
843 CssmOwnedData
&fieldValue
)
845 CSSM_X509_EXTENSION_PTR cssmExt
= verifySetFreeExtension(fieldValue
, false);
846 CssmAllocator
&alloc
= fieldValue
.allocator
;
847 CE_CRLDistPointsSyntax
*cdsaObj
=
848 (CE_CRLDistPointsSyntax
*)cssmExt
->value
.parsedValue
;
849 CL_freeCssmDistPoints(cdsaObj
, alloc
);
850 freeFieldExtenCommon(cssmExt
, alloc
); // frees extnId, parsedValue, BERvalue