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  * certt.h - public data structures for the certificate library
6  */
7 #ifndef _CERTT_H_
8 #define _CERTT_H_
9 
10 #include "prclist.h"
11 #include "pkcs11t.h"
12 #include "seccomon.h"
13 #include "secmodt.h"
14 #include "secoidt.h"
15 #include "plarena.h"
16 #include "prcvar.h"
17 #include "nssilock.h"
18 #include "prio.h"
19 #include "prmon.h"
20 
21 /* Stan data types */
22 struct NSSCertificateStr;
23 struct NSSTrustDomainStr;
24 
25 /* Non-opaque objects */
26 typedef struct CERTAVAStr CERTAVA;
27 typedef struct CERTAttributeStr CERTAttribute;
28 typedef struct CERTAuthInfoAccessStr CERTAuthInfoAccess;
29 typedef struct CERTAuthKeyIDStr CERTAuthKeyID;
30 typedef struct CERTBasicConstraintsStr CERTBasicConstraints;
31 typedef struct NSSTrustDomainStr CERTCertDBHandle;
32 typedef struct CERTCertExtensionStr CERTCertExtension;
33 typedef struct CERTCertKeyStr CERTCertKey;
34 typedef struct CERTCertListStr CERTCertList;
35 typedef struct CERTCertListNodeStr CERTCertListNode;
36 typedef struct CERTCertNicknamesStr CERTCertNicknames;
37 typedef struct CERTCertTrustStr CERTCertTrust;
38 typedef struct CERTCertDistrustStr CERTCertDistrust;
39 typedef struct CERTCertificateStr CERTCertificate;
40 typedef struct CERTCertificateListStr CERTCertificateList;
41 typedef struct CERTCertificateRequestStr CERTCertificateRequest;
42 typedef struct CERTCrlStr CERTCrl;
43 typedef struct CERTCrlDistributionPointsStr CERTCrlDistributionPoints;
44 typedef struct CERTCrlEntryStr CERTCrlEntry;
45 typedef struct CERTCrlHeadNodeStr CERTCrlHeadNode;
46 typedef struct CERTCrlKeyStr CERTCrlKey;
47 typedef struct CERTCrlNodeStr CERTCrlNode;
48 typedef struct CERTDERCertsStr CERTDERCerts;
49 typedef struct CERTDistNamesStr CERTDistNames;
50 typedef struct CERTGeneralNameStr CERTGeneralName;
51 typedef struct CERTGeneralNameListStr CERTGeneralNameList;
52 typedef struct CERTIssuerAndSNStr CERTIssuerAndSN;
53 typedef struct CERTNameStr CERTName;
54 typedef struct CERTNameConstraintStr CERTNameConstraint;
55 typedef struct CERTNameConstraintsStr CERTNameConstraints;
56 typedef struct CERTOKDomainNameStr CERTOKDomainName;
57 typedef struct CERTPrivKeyUsagePeriodStr CERTPrivKeyUsagePeriod;
58 typedef struct CERTPublicKeyAndChallengeStr CERTPublicKeyAndChallenge;
59 typedef struct CERTRDNStr CERTRDN;
60 typedef struct CERTSignedCrlStr CERTSignedCrl;
61 typedef struct CERTSignedDataStr CERTSignedData;
62 typedef struct CERTStatusConfigStr CERTStatusConfig;
63 typedef struct CERTSubjectListStr CERTSubjectList;
64 typedef struct CERTSubjectNodeStr CERTSubjectNode;
65 typedef struct CERTSubjectPublicKeyInfoStr CERTSubjectPublicKeyInfo;
66 typedef struct CERTValidityStr CERTValidity;
67 typedef struct CERTVerifyLogStr CERTVerifyLog;
68 typedef struct CERTVerifyLogNodeStr CERTVerifyLogNode;
69 typedef struct CRLDistributionPointStr CRLDistributionPoint;
70 
71 /* CRL extensions type */
72 typedef unsigned long CERTCrlNumber;
73 
74 /*
75 ** An X.500 AVA object
76 */
77 struct CERTAVAStr {
78     SECItem type;
79     SECItem value;
80 };
81 
82 /*
83 ** An X.500 RDN object
84 */
85 struct CERTRDNStr {
86     CERTAVA **avas;
87 };
88 
89 /*
90 ** An X.500 name object
91 */
92 struct CERTNameStr {
93     PLArenaPool *arena;
94     CERTRDN **rdns;
95 };
96 
97 /*
98 ** An X.509 validity object
99 */
100 struct CERTValidityStr {
101     PLArenaPool *arena;
102     SECItem notBefore;
103     SECItem notAfter;
104 };
105 
106 /*
107  * A serial number and issuer name, which is used as a database key
108  */
109 struct CERTCertKeyStr {
110     SECItem serialNumber;
111     SECItem derIssuer;
112 };
113 
114 /*
115 ** A signed data object. Used to implement the "signed" macro used
116 ** in the X.500 specs.
117 */
118 struct CERTSignedDataStr {
119     SECItem data;
120     SECAlgorithmID signatureAlgorithm;
121     SECItem signature;
122 };
123 
124 /*
125 ** An X.509 subject-public-key-info object
126 */
127 struct CERTSubjectPublicKeyInfoStr {
128     PLArenaPool *arena;
129     SECAlgorithmID algorithm;
130     SECItem subjectPublicKey;
131 };
132 
133 struct CERTPublicKeyAndChallengeStr {
134     SECItem spki;
135     SECItem challenge;
136 };
137 
138 struct CERTCertTrustStr {
139     unsigned int sslFlags;
140     unsigned int emailFlags;
141     unsigned int objectSigningFlags;
142 };
143 
144 /*
145  * Distrust dates for specific certificate usages.
146  * These dates are hardcoded in nssckbi/builtins. They are DER encoded to be
147  * compatible with the format of certdata.txt, other date fields in certs and
148  * existing functions to read these dates. Clients should check the distrust
149  * date in certificates to avoid trusting a CA for service they have ceased to
150  * support */
151 struct CERTCertDistrustStr {
152     SECItem serverDistrustAfter;
153     SECItem emailDistrustAfter;
154 };
155 
156 /*
157  * defined the types of trust that exist
158  */
159 typedef enum SECTrustTypeEnum {
160     trustSSL = 0,
161     trustEmail = 1,
162     trustObjectSigning = 2,
163     trustTypeNone = 3
164 } SECTrustType;
165 
166 #define SEC_GET_TRUST_FLAGS(trust, type)                                  \
167     (((type) == trustSSL)                                                 \
168          ? ((trust)->sslFlags)                                            \
169          : (((type) == trustEmail) ? ((trust)->emailFlags)                \
170                                    : (((type) == trustObjectSigning)      \
171                                           ? ((trust)->objectSigningFlags) \
172                                           : 0)))
173 
174 /*
175 ** An X.509.3 certificate extension
176 */
177 struct CERTCertExtensionStr {
178     SECItem id;
179     SECItem critical;
180     SECItem value;
181 };
182 
183 struct CERTSubjectNodeStr {
184     struct CERTSubjectNodeStr *next;
185     struct CERTSubjectNodeStr *prev;
186     SECItem certKey;
187     SECItem keyID;
188 };
189 
190 struct CERTSubjectListStr {
191     PLArenaPool *arena;
192     int ncerts;
193     char *emailAddr;
194     CERTSubjectNode *head;
195     CERTSubjectNode *tail; /* do we need tail? */
196     void *entry;
197 };
198 
199 /*
200 ** An X.509 certificate object (the unsigned form)
201 */
202 struct CERTCertificateStr {
203     /* the arena is used to allocate any data structures that have the same
204      * lifetime as the cert.  This is all stuff that hangs off of the cert
205      * structure, and is all freed at the same time.  It is used when the
206      * cert is decoded, destroyed, and at some times when it changes
207      * state
208      */
209     PLArenaPool *arena;
210 
211     /* The following fields are static after the cert has been decoded */
212     char *subjectName;
213     char *issuerName;
214     CERTSignedData signatureWrap; /* XXX */
215     SECItem derCert;              /* original DER for the cert */
216     SECItem derIssuer;            /* DER for issuer name */
217     SECItem derSubject;           /* DER for subject name */
218     SECItem derPublicKey;         /* DER for the public key */
219     SECItem certKey;              /* database key for this cert */
220     SECItem version;
221     SECItem serialNumber;
222     SECAlgorithmID signature;
223     CERTName issuer;
224     CERTValidity validity;
225     CERTName subject;
226     CERTSubjectPublicKeyInfo subjectPublicKeyInfo;
227     SECItem issuerID;
228     SECItem subjectID;
229     CERTCertExtension **extensions;
230     char *emailAddr;
231     CERTCertDBHandle *dbhandle;
232     SECItem subjectKeyID;     /* x509v3 subject key identifier */
233     PRBool keyIDGenerated;    /* was the keyid generated? */
234     unsigned int keyUsage;    /* what uses are allowed for this cert */
235     unsigned int rawKeyUsage; /* value of the key usage extension */
236     PRBool keyUsagePresent;   /* was the key usage extension present */
237     PRUint32 nsCertType;      /* value of the ns cert type extension */
238                               /* must be 32-bit for PR_ATOMIC_SET */
239 
240     /* these values can be set by the application to bypass certain checks
241      * or to keep the cert in memory for an entire session.
242      * XXX - need an api to set these
243      */
244     PRBool keepSession;         /* keep this cert for entire session*/
245     PRBool timeOK;              /* is the bad validity time ok? */
246     CERTOKDomainName *domainOK; /* these domain names are ok */
247 
248     /*
249      * these values can change when the cert changes state.  These state
250      * changes include transitions from temp to perm or vice-versa, and
251      * changes of trust flags
252      */
253     PRBool isperm;
254     PRBool istemp;
255     char *nickname;
256     char *dbnickname;
257     struct NSSCertificateStr *nssCertificate; /* This is Stan stuff. */
258     CERTCertTrust *trust;
259 
260     /* the reference count is modified whenever someone looks up, dups
261      * or destroys a certificate
262      */
263     int referenceCount;
264 
265     /* The subject list is a list of all certs with the same subject name.
266      * It can be modified any time a cert is added or deleted from either
267      * the in-memory(temporary) or on-disk(permanent) database.
268      */
269     CERTSubjectList *subjectList;
270 
271     /* these belong in the static section, but are here to maintain
272      * the structure's integrity
273      */
274     CERTAuthKeyID *authKeyID; /* x509v3 authority key identifier */
275     PRBool isRoot;            /* cert is the end of a chain */
276 
277     /* these fields are used by client GUI code to keep track of ssl sockets
278      * that are blocked waiting on GUI feedback related to this cert.
279      * XXX - these should be moved into some sort of application specific
280      *       data structure.  They are only used by the browser right now.
281      */
282     union {
283         void *apointer; /* was struct SECSocketNode* authsocketlist */
284         struct {
285             unsigned int hasUnsupportedCriticalExt : 1;
286             /* add any new option bits needed here */
287         } bits;
288     } options;
289     int series; /* was int authsocketcount; record the series of the pkcs11ID */
290 
291     /* This is PKCS #11 stuff. */
292     PK11SlotInfo *slot;        /*if this cert came of a token, which is it*/
293     CK_OBJECT_HANDLE pkcs11ID; /*and which object on that token is it */
294     PRBool ownSlot;            /*true if the cert owns the slot reference */
295     /* These fields are used in nssckbi/builtins CAs. */
296     CERTCertDistrust *distrust;
297 };
298 #define SEC_CERTIFICATE_VERSION_1 0 /* default created */
299 #define SEC_CERTIFICATE_VERSION_2 1 /* v2 */
300 #define SEC_CERTIFICATE_VERSION_3 2 /* v3 extensions */
301 
302 #define SEC_CRL_VERSION_1 0 /* default */
303 #define SEC_CRL_VERSION_2 1 /* v2 extensions */
304 
305 /*
306  * used to identify class of cert in mime stream code
307  */
308 #define SEC_CERT_CLASS_CA 1
309 #define SEC_CERT_CLASS_SERVER 2
310 #define SEC_CERT_CLASS_USER 3
311 #define SEC_CERT_CLASS_EMAIL 4
312 
313 struct CERTDERCertsStr {
314     PLArenaPool *arena;
315     int numcerts;
316     SECItem *rawCerts;
317 };
318 
319 /*
320 ** A PKCS ? Attribute
321 ** XXX this is duplicated through out the code, it *should* be moved
322 ** to a central location.  Where would be appropriate?
323 */
324 struct CERTAttributeStr {
325     SECItem attrType;
326     SECItem **attrValue;
327 };
328 
329 /*
330 ** A PKCS#10 certificate-request object (the unsigned form)
331 */
332 struct CERTCertificateRequestStr {
333     PLArenaPool *arena;
334     SECItem version;
335     CERTName subject;
336     CERTSubjectPublicKeyInfo subjectPublicKeyInfo;
337     CERTAttribute **attributes;
338 };
339 #define SEC_CERTIFICATE_REQUEST_VERSION 0 /* what we *create* */
340 
341 /*
342 ** A certificate list object.
343 */
344 struct CERTCertificateListStr {
345     SECItem *certs;
346     int len; /* number of certs */
347     PLArenaPool *arena;
348 };
349 
350 struct CERTCertListNodeStr {
351     PRCList links;
352     CERTCertificate *cert;
353     void *appData;
354 };
355 
356 struct CERTCertListStr {
357     PRCList list;
358     PLArenaPool *arena;
359 };
360 
361 #define CERT_LIST_HEAD(l) ((CERTCertListNode *)PR_LIST_HEAD(&l->list))
362 #define CERT_LIST_TAIL(l) ((CERTCertListNode *)PR_LIST_TAIL(&l->list))
363 #define CERT_LIST_NEXT(n) ((CERTCertListNode *)n->links.next)
364 #define CERT_LIST_END(n, l) (((void *)n) == ((void *)&l->list))
365 #define CERT_LIST_EMPTY(l) CERT_LIST_END(CERT_LIST_HEAD(l), l)
366 
367 struct CERTCrlEntryStr {
368     SECItem serialNumber;
369     SECItem revocationDate;
370     CERTCertExtension **extensions;
371 };
372 
373 struct CERTCrlStr {
374     PLArenaPool *arena;
375     SECItem version;
376     SECAlgorithmID signatureAlg;
377     SECItem derName;
378     CERTName name;
379     SECItem lastUpdate;
380     SECItem nextUpdate; /* optional for x.509 CRL  */
381     CERTCrlEntry **entries;
382     CERTCertExtension **extensions;
383     /* can't add anything there for binary backwards compatibility reasons */
384 };
385 
386 struct CERTCrlKeyStr {
387     SECItem derName;
388     SECItem dummy; /* The decoder can not skip a primitive,
389                       this serves as a place holder for the
390                       decoder to finish its task only
391                    */
392 };
393 
394 struct CERTSignedCrlStr {
395     PLArenaPool *arena;
396     CERTCrl crl;
397     void *reserved1;
398     PRBool reserved2;
399     PRBool isperm;
400     PRBool istemp;
401     int referenceCount;
402     CERTCertDBHandle *dbhandle;
403     CERTSignedData signatureWrap; /* XXX */
404     char *url;
405     SECItem *derCrl;
406     PK11SlotInfo *slot;
407     CK_OBJECT_HANDLE pkcs11ID;
408     void *opaque; /* do not touch */
409 };
410 
411 struct CERTCrlHeadNodeStr {
412     PLArenaPool *arena;
413     CERTCertDBHandle *dbhandle;
414     CERTCrlNode *first;
415     CERTCrlNode *last;
416 };
417 
418 struct CERTCrlNodeStr {
419     CERTCrlNode *next;
420     int type;
421     CERTSignedCrl *crl;
422 };
423 
424 /*
425  * Array of X.500 Distinguished Names
426  */
427 struct CERTDistNamesStr {
428     PLArenaPool *arena;
429     int nnames;
430     SECItem *names;
431     void *head; /* private */
432 };
433 
434 /*
435  * NS_CERT_TYPE defines are used in two areas:
436  * 1) The old NSS Cert Type Extension, which is a certificate extension in the
437  * actual cert. It was created before the x509 Extended Key Usage Extension,
438  * which has now taken over it's function. This field is only 8 bits wide
439  * 2) The nsCertType entry in the CERTCertificate structure. This field is
440  * 32 bits wide.
441  * Any entries in this table greater than 0x80 will not be able to be encoded
442  * in an NSS Cert Type Extension, but can still be represented internally in
443  * the nsCertType field.
444  */
445 #define NS_CERT_TYPE_IPSEC_CA (0x200)         /* outside the NS Cert Type Extenstion */
446 #define NS_CERT_TYPE_IPSEC (0x100)            /* outside the NS Cert Type Extenstion */
447 #define NS_CERT_TYPE_SSL_CLIENT (0x80)        /* bit 0 */
448 #define NS_CERT_TYPE_SSL_SERVER (0x40)        /* bit 1 */
449 #define NS_CERT_TYPE_EMAIL (0x20)             /* bit 2 */
450 #define NS_CERT_TYPE_OBJECT_SIGNING (0x10)    /* bit 3 */
451 #define NS_CERT_TYPE_RESERVED (0x08)          /* bit 4 */
452 #define NS_CERT_TYPE_SSL_CA (0x04)            /* bit 5 */
453 #define NS_CERT_TYPE_EMAIL_CA (0x02)          /* bit 6 */
454 #define NS_CERT_TYPE_OBJECT_SIGNING_CA (0x01) /* bit 7 */
455 
456 #define EXT_KEY_USAGE_TIME_STAMP (0x8000)
457 #define EXT_KEY_USAGE_STATUS_RESPONDER (0x4000)
458 
459 #define NS_CERT_TYPE_APP                                                      \
460     (NS_CERT_TYPE_SSL_CLIENT | NS_CERT_TYPE_SSL_SERVER | NS_CERT_TYPE_EMAIL | \
461      NS_CERT_TYPE_IPSEC | NS_CERT_TYPE_OBJECT_SIGNING)
462 
463 #define NS_CERT_TYPE_CA                                                \
464     (NS_CERT_TYPE_SSL_CA | NS_CERT_TYPE_EMAIL_CA |                     \
465      NS_CERT_TYPE_OBJECT_SIGNING_CA | EXT_KEY_USAGE_STATUS_RESPONDER | \
466      NS_CERT_TYPE_IPSEC_CA)
467 typedef enum SECCertUsageEnum {
468     certUsageSSLClient = 0,
469     certUsageSSLServer = 1,
470     certUsageSSLServerWithStepUp = 2,
471     certUsageSSLCA = 3,
472     certUsageEmailSigner = 4,
473     certUsageEmailRecipient = 5,
474     certUsageObjectSigner = 6,
475     certUsageUserCertImport = 7,
476     certUsageVerifyCA = 8,
477     certUsageProtectedObjectSigner = 9,
478     certUsageStatusResponder = 10,
479     certUsageAnyCA = 11,
480     certUsageIPsec = 12
481 } SECCertUsage;
482 
483 typedef PRInt64 SECCertificateUsage;
484 
485 #define certificateUsageCheckAllUsages (0x0000)
486 #define certificateUsageSSLClient (0x0001)
487 #define certificateUsageSSLServer (0x0002)
488 #define certificateUsageSSLServerWithStepUp (0x0004)
489 #define certificateUsageSSLCA (0x0008)
490 #define certificateUsageEmailSigner (0x0010)
491 #define certificateUsageEmailRecipient (0x0020)
492 #define certificateUsageObjectSigner (0x0040)
493 #define certificateUsageUserCertImport (0x0080)
494 #define certificateUsageVerifyCA (0x0100)
495 #define certificateUsageProtectedObjectSigner (0x0200)
496 #define certificateUsageStatusResponder (0x0400)
497 #define certificateUsageAnyCA (0x0800)
498 #define certificateUsageIPsec (0x1000)
499 
500 #define certificateUsageHighest certificateUsageIPsec
501 
502 /*
503  * Does the cert belong to the user, a peer, or a CA.
504  */
505 typedef enum CERTCertOwnerEnum {
506     certOwnerUser = 0,
507     certOwnerPeer = 1,
508     certOwnerCA = 2
509 } CERTCertOwner;
510 
511 /*
512  * This enum represents the state of validity times of a certificate
513  */
514 typedef enum SECCertTimeValidityEnum {
515     secCertTimeValid = 0,
516     secCertTimeExpired = 1,
517     secCertTimeNotValidYet = 2,
518     secCertTimeUndetermined = 3 /* validity could not be decoded from the
519                                    cert, most likely because it was NULL */
520 } SECCertTimeValidity;
521 
522 /*
523  * This is used as return status in functions that compare the validity
524  * periods of two certificates A and B, currently only
525  * CERT_CompareValidityTimes.
526  */
527 
528 typedef enum CERTCompareValidityStatusEnum {
529     certValidityUndetermined = 0, /* the function is unable to select one cert
530                                      over another */
531     certValidityChooseB = 1,      /* cert B should be preferred */
532     certValidityEqual = 2,        /* both certs have the same validity period */
533     certValidityChooseA = 3       /* cert A should be preferred */
534 } CERTCompareValidityStatus;
535 
536 /*
537  * Interface for getting certificate nickname strings out of the database
538  */
539 
540 /* these are values for the what argument below */
541 #define SEC_CERT_NICKNAMES_ALL 1
542 #define SEC_CERT_NICKNAMES_USER 2
543 #define SEC_CERT_NICKNAMES_SERVER 3
544 #define SEC_CERT_NICKNAMES_CA 4
545 
546 struct CERTCertNicknamesStr {
547     PLArenaPool *arena;
548     void *head;
549     int numnicknames;
550     char **nicknames;
551     int what;
552     int totallen;
553 };
554 
555 struct CERTIssuerAndSNStr {
556     SECItem derIssuer;
557     CERTName issuer;
558     SECItem serialNumber;
559 };
560 
561 /* X.509 v3 Key Usage Extension flags */
562 #define KU_DIGITAL_SIGNATURE (0x80) /* bit 0 */
563 #define KU_NON_REPUDIATION (0x40)   /* bit 1 */
564 #define KU_KEY_ENCIPHERMENT (0x20)  /* bit 2 */
565 #define KU_DATA_ENCIPHERMENT (0x10) /* bit 3 */
566 #define KU_KEY_AGREEMENT (0x08)     /* bit 4 */
567 #define KU_KEY_CERT_SIGN (0x04)     /* bit 5 */
568 #define KU_CRL_SIGN (0x02)          /* bit 6 */
569 #define KU_ENCIPHER_ONLY (0x01)     /* bit 7 */
570 #define KU_ALL                                                         \
571     (KU_DIGITAL_SIGNATURE | KU_NON_REPUDIATION | KU_KEY_ENCIPHERMENT | \
572      KU_DATA_ENCIPHERMENT | KU_KEY_AGREEMENT | KU_KEY_CERT_SIGN |      \
573      KU_CRL_SIGN | KU_ENCIPHER_ONLY)
574 
575 /* This value will not occur in certs.  It is used internally for the case
576  * when either digital signature or non-repudiation is the correct value.
577  */
578 #define KU_DIGITAL_SIGNATURE_OR_NON_REPUDIATION (0x2000)
579 
580 /* This value will not occur in certs.  It is used internally for the case
581  * when the key type is not know ahead of time and either key agreement or
582  * key encipherment are the correct value based on key type
583  */
584 #define KU_KEY_AGREEMENT_OR_ENCIPHERMENT (0x4000)
585 
586 /* internal bits that do not match bits in the x509v3 spec, but are used
587  * for similar purposes
588  */
589 #define KU_NS_GOVT_APPROVED (0x8000) /*don't make part of KU_ALL!*/
590 /*
591 * x.509 v3 Basic Constraints Extension
592 * If isCA is false, the pathLenConstraint is ignored.
593 * Otherwise, the following pathLenConstraint values will apply:
594 *	< 0 - there is no limit to the certificate path
595 *	0   - CA can issues end-entity certificates only
596 *	> 0 - the number of certificates in the certificate path is
597 *	      limited to this number
598 */
599 #define CERT_UNLIMITED_PATH_CONSTRAINT -2
600 
601 struct CERTBasicConstraintsStr {
602     PRBool isCA;           /* on if is CA */
603     int pathLenConstraint; /* maximum number of certificates that can be
604                               in the cert path.  Only applies to a CA
605                               certificate; otherwise, it's ignored.
606                             */
607 };
608 
609 /* Maximum length of a certificate chain */
610 #define CERT_MAX_CERT_CHAIN 20
611 
612 #define CERT_MAX_SERIAL_NUMBER_BYTES 20 /* from RFC 3280 */
613 #define CERT_MAX_DN_BYTES 4096          /* arbitrary */
614 
615 /* x.509 v3 Reason Flags, used in CRLDistributionPoint Extension */
616 #define RF_UNUSED (0x80)                 /* bit 0 */
617 #define RF_KEY_COMPROMISE (0x40)         /* bit 1 */
618 #define RF_CA_COMPROMISE (0x20)          /* bit 2 */
619 #define RF_AFFILIATION_CHANGED (0x10)    /* bit 3 */
620 #define RF_SUPERSEDED (0x08)             /* bit 4 */
621 #define RF_CESSATION_OF_OPERATION (0x04) /* bit 5 */
622 #define RF_CERTIFICATE_HOLD (0x02)       /* bit 6 */
623 
624 /* enum for CRL Entry Reason Code */
625 typedef enum CERTCRLEntryReasonCodeEnum {
626     crlEntryReasonUnspecified = 0,
627     crlEntryReasonKeyCompromise = 1,
628     crlEntryReasonCaCompromise = 2,
629     crlEntryReasonAffiliationChanged = 3,
630     crlEntryReasonSuperseded = 4,
631     crlEntryReasonCessationOfOperation = 5,
632     crlEntryReasoncertificatedHold = 6,
633     crlEntryReasonRemoveFromCRL = 8,
634     crlEntryReasonPrivilegeWithdrawn = 9,
635     crlEntryReasonAaCompromise = 10
636 } CERTCRLEntryReasonCode;
637 
638 /* If we needed to extract the general name field, use this */
639 /* General Name types */
640 typedef enum CERTGeneralNameTypeEnum {
641     certOtherName = 1,
642     certRFC822Name = 2,
643     certDNSName = 3,
644     certX400Address = 4,
645     certDirectoryName = 5,
646     certEDIPartyName = 6,
647     certURI = 7,
648     certIPAddress = 8,
649     certRegisterID = 9
650 } CERTGeneralNameType;
651 
652 typedef struct OtherNameStr {
653     SECItem name;
654     SECItem oid;
655 } OtherName;
656 
657 struct CERTGeneralNameStr {
658     CERTGeneralNameType type; /* name type */
659     union {
660         CERTName directoryName; /* distinguish name */
661         OtherName OthName;      /* Other Name */
662         SECItem other;          /* the rest of the name forms */
663     } name;
664     SECItem derDirectoryName; /* this is saved to simplify directory name
665                                  comparison */
666     PRCList l;
667 };
668 
669 struct CERTGeneralNameListStr {
670     PLArenaPool *arena;
671     CERTGeneralName *name;
672     int refCount;
673     int len;
674     PZLock *lock;
675 };
676 
677 struct CERTNameConstraintStr {
678     CERTGeneralName name;
679     SECItem DERName;
680     SECItem min;
681     SECItem max;
682     PRCList l;
683 };
684 
685 struct CERTNameConstraintsStr {
686     CERTNameConstraint *permited;
687     CERTNameConstraint *excluded;
688     SECItem **DERPermited;
689     SECItem **DERExcluded;
690 };
691 
692 /* Private Key Usage Period extension struct. */
693 struct CERTPrivKeyUsagePeriodStr {
694     SECItem notBefore;
695     SECItem notAfter;
696     PLArenaPool *arena;
697 };
698 
699 /* X.509 v3 Authority Key Identifier extension.  For the authority certificate
700    issuer field, we only support URI now.
701  */
702 struct CERTAuthKeyIDStr {
703     SECItem keyID;                   /* unique key identifier */
704     CERTGeneralName *authCertIssuer; /* CA's issuer name.  End with a NULL */
705     SECItem authCertSerialNumber;    /* CA's certificate serial number */
706     SECItem **DERAuthCertIssuer;     /* This holds the DER encoded format of
707                                         the authCertIssuer field. It is used
708                                         by the encoding engine. It should be
709                                         used as a read only field by the caller.
710                                      */
711 };
712 
713 /* x.509 v3 CRL Distributeion Point */
714 
715 /*
716  * defined the types of CRL Distribution points
717  */
718 typedef enum DistributionPointTypesEnum {
719     generalName = 1, /* only support this for now */
720     relativeDistinguishedName = 2
721 } DistributionPointTypes;
722 
723 struct CRLDistributionPointStr {
724     DistributionPointTypes distPointType;
725     union {
726         CERTGeneralName *fullName;
727         CERTRDN relativeName;
728     } distPoint;
729     SECItem reasons;
730     CERTGeneralName *crlIssuer;
731 
732     /* Reserved for internal use only*/
733     SECItem derDistPoint;
734     SECItem derRelativeName;
735     SECItem **derCrlIssuer;
736     SECItem **derFullName;
737     SECItem bitsmap;
738 };
739 
740 struct CERTCrlDistributionPointsStr {
741     CRLDistributionPoint **distPoints;
742 };
743 
744 /*
745  * This structure is used to keep a log of errors when verifying
746  * a cert chain.  This allows multiple errors to be reported all at
747  * once.
748  */
749 struct CERTVerifyLogNodeStr {
750     CERTCertificate *cert;             /* what cert had the error */
751     long error;                        /* what error was it? */
752     unsigned int depth;                /* how far up the chain are we */
753     void *arg;                         /* error specific argument */
754     struct CERTVerifyLogNodeStr *next; /* next in the list */
755     struct CERTVerifyLogNodeStr *prev; /* next in the list */
756 };
757 
758 struct CERTVerifyLogStr {
759     PLArenaPool *arena;
760     unsigned int count;
761     struct CERTVerifyLogNodeStr *head;
762     struct CERTVerifyLogNodeStr *tail;
763 };
764 
765 struct CERTOKDomainNameStr {
766     CERTOKDomainName *next;
767     char *name;
768 };
769 
770 typedef SECStatus(PR_CALLBACK *CERTStatusChecker)(CERTCertDBHandle *handle,
771                                                   CERTCertificate *cert,
772                                                   PRTime time, void *pwArg);
773 
774 typedef SECStatus(PR_CALLBACK *CERTStatusDestroy)(CERTStatusConfig *handle);
775 
776 struct CERTStatusConfigStr {
777     CERTStatusChecker statusChecker; /* NULL means no checking enabled */
778     CERTStatusDestroy statusDestroy; /* enabled or no, will clean up */
779     void *statusContext;             /* cx specific to checking protocol */
780 };
781 
782 struct CERTAuthInfoAccessStr {
783     SECItem method;
784     SECItem derLocation;
785     CERTGeneralName *location; /* decoded location */
786 };
787 
788 /* This is the typedef for the callback passed to CERT_OpenCertDB() */
789 /* callback to return database name based on version number */
790 typedef char *(*CERTDBNameFunc)(void *arg, int dbVersion);
791 
792 /*
793  * types of cert packages that we can decode
794  */
795 typedef enum CERTPackageTypeEnum {
796     certPackageNone = 0,
797     certPackageCert = 1,
798     certPackagePKCS7 = 2,
799     certPackageNSCertSeq = 3,
800     certPackageNSCertWrap = 4
801 } CERTPackageType;
802 
803 /*
804  * these types are for the PKIX Certificate Policies extension
805  */
806 typedef struct {
807     SECOidTag oid;
808     SECItem qualifierID;
809     SECItem qualifierValue;
810 } CERTPolicyQualifier;
811 
812 typedef struct {
813     SECOidTag oid;
814     SECItem policyID;
815     CERTPolicyQualifier **policyQualifiers;
816 } CERTPolicyInfo;
817 
818 typedef struct {
819     PLArenaPool *arena;
820     CERTPolicyInfo **policyInfos;
821 } CERTCertificatePolicies;
822 
823 typedef struct {
824     SECItem organization;
825     SECItem **noticeNumbers;
826 } CERTNoticeReference;
827 
828 typedef struct {
829     PLArenaPool *arena;
830     CERTNoticeReference noticeReference;
831     SECItem derNoticeReference;
832     SECItem displayText;
833 } CERTUserNotice;
834 
835 typedef struct {
836     PLArenaPool *arena;
837     SECItem **oids;
838 } CERTOidSequence;
839 
840 /*
841  * these types are for the PKIX Policy Mappings extension
842  */
843 typedef struct {
844     SECItem issuerDomainPolicy;
845     SECItem subjectDomainPolicy;
846 } CERTPolicyMap;
847 
848 typedef struct {
849     PLArenaPool *arena;
850     CERTPolicyMap **policyMaps;
851 } CERTCertificatePolicyMappings;
852 
853 /*
854  * these types are for the PKIX inhibitAnyPolicy extension
855  */
856 typedef struct {
857     SECItem inhibitAnySkipCerts;
858 } CERTCertificateInhibitAny;
859 
860 /*
861  * these types are for the PKIX Policy Constraints extension
862  */
863 typedef struct {
864     SECItem explicitPolicySkipCerts;
865     SECItem inhibitMappingSkipCerts;
866 } CERTCertificatePolicyConstraints;
867 
868 /*
869  * These types are for the validate chain callback param.
870  *
871  * CERTChainVerifyCallback is an application-supplied callback that can be used
872  * to augment libpkix's certificate chain validation with additional
873  * application-specific checks. It may be called multiple times if there are
874  * multiple potentially-valid paths for the certificate being validated. This
875  * callback is called before revocation checking is done on the certificates in
876  * the given chain.
877  *
878  * - isValidChainArg contains the application-provided opaque argument
879  * - currentChain is the currently validated chain. It is ordered with the leaf
880  *   certificate at the head and the trust anchor at the tail.
881  *
882  * The callback should set *chainOK = PR_TRUE and return SECSuccess if the
883  * certificate chain is acceptable. It should set *chainOK = PR_FALSE and
884  * return SECSuccess if the chain is unacceptable, to indicate that the given
885  * chain is bad and path building should continue. It should return SECFailure
886  * to indicate an fatal error that will cause path validation to fail
887  * immediately.
888  */
889 typedef SECStatus (*CERTChainVerifyCallbackFunc)(
890     void *isChainValidArg, const CERTCertList *currentChain, PRBool *chainOK);
891 
892 /*
893  * Note: If extending this structure, it will be necessary to change the
894  * associated CERTValParamInType
895  */
896 typedef struct {
897     CERTChainVerifyCallbackFunc isChainValid;
898     void *isChainValidArg;
899 } CERTChainVerifyCallback;
900 
901 /*
902  * these types are for the CERT_PKIX* Verification functions
903  * These are all optional parameters.
904  */
905 
906 typedef enum {
907     cert_pi_end = 0,              /* SPECIAL: signifies end of array of
908                               * CERTValParam* */
909     cert_pi_nbioContext = 1,      /* specify a non-blocking IO context used to
910                               * resume a session. If this argument is
911                               * specified, no other arguments should be.
912                               * Specified in value.pointer.p. If the
913                               * operation completes the context will be
914                               * freed. */
915     cert_pi_nbioAbort = 2,        /* specify a non-blocking IO context for an
916                               * existing operation which the caller wants
917                               * to abort. If this argument is
918                               * specified, no other arguments should be.
919                               * Specified in value.pointer.p. If the
920                               * operation succeeds the context will be
921                               * freed. */
922     cert_pi_certList = 3,         /* specify the chain to validate against. If
923                               * this value is given, then the path
924                               * construction step in the validation is
925                               * skipped. Specified in value.pointer.chain */
926     cert_pi_policyOID = 4,        /* validate certificate for policy OID.
927                               * Specified in value.array.oids. Cert must
928                               * be good for at least one OID in order
929                               * to validate. Default is that the user is not
930                               * concerned about certificate policy. */
931     cert_pi_policyFlags = 5,      /* flags for each policy specified in policyOID.
932                               * Specified in value.scalar.ul. Policy flags
933                               * apply to all specified oids.
934                               * Use CERT_POLICY_FLAG_* macros below. If not
935                               * specified policy flags default to 0 */
936     cert_pi_keyusage = 6,         /* specify what the keyusages the certificate
937                               * will be evaluated against, specified in
938                               * value.scalar.ui. The cert must validate for
939                               * at least one of the specified key usages.
940                               * Values match the KU_  bit flags defined
941                               * in this file. Default is derived from
942                               * the 'usages' function argument */
943     cert_pi_extendedKeyusage = 7, /* specify what the required extended key
944                                    * usage of the certificate. Specified as
945                                    * an array of oidTags in value.array.oids.
946                                    * The cert must validate for at least one
947                                    * of the specified extended key usages.
948                                    * If not specified, no extended key usages
949                                    * will be checked. */
950     cert_pi_date = 8,             /* validate certificate is valid as of date
951                                    * specified in value.scalar.time. A special
952                                    * value '0' indicates 'now'. default is '0' */
953     cert_pi_revocationFlags = 9,  /* Specify what revocation checking to do.
954                                    * See CERT_REV_FLAG_* macros below
955                                    * Set in value.pointer.revocation */
956     cert_pi_certStores = 10,      /* Bitmask of Cert Store flags (see below)
957                                    * Set in value.scalar.ui */
958     cert_pi_trustAnchors =
959         11,                       /* Specify the list of trusted roots to
960                                    * validate against.
961                                    * The default set of trusted roots, these are
962                                    * root CA certs from libnssckbi.so or CA
963                                    * certs trusted by user, are used in any of
964                                    * the following cases:
965                                    *      * when the parameter is not set.
966                                    *      * when the list of trust anchors is
967                                    *        empty.
968                                    * Note that this handling can be further
969                                    * altered by altering the
970                                    * cert_pi_useOnlyTrustAnchors flag
971                                    * Specified in value.pointer.chain */
972     cert_pi_useAIACertFetch = 12, /* Enables cert fetching using AIA extension.
973                                   * In NSS 3.12.1 or later. Default is off.
974                                   * Value is in value.scalar.b */
975     cert_pi_chainVerifyCallback = 13,
976     /* The callback container for doing extra
977      * validation on the currently calculated chain.
978      * Value is in value.pointer.chainVerifyCallback */
979     cert_pi_useOnlyTrustAnchors = 14,
980     /* If true, disables trusting any
981         * certificates other than the ones passed in via cert_pi_trustAnchors.
982         * If false, then the certificates specified via cert_pi_trustAnchors
983         * will be combined with the pre-existing trusted roots, but only
984         * for the certificate validation being performed.
985         * If no value has been supplied via cert_pi_trustAnchors, this has
986         * no effect.
987         * The default value is true, meaning if this is not supplied, only
988         * trust anchors supplied via cert_pi_trustAnchors are trusted.
989         * Specified in value.scalar.b */
990     cert_pi_max /* SPECIAL: signifies maximum allowed value,
991                  *  can increase in future releases */
992 } CERTValParamInType;
993 
994 /*
995  * for all out parameters:
996  *  out parameters are only returned if the caller asks for them in
997  *  the CERTValOutParam array. Caller is responsible for the CERTValOutParam
998  *  array itself. The pkix verify function will allocate and other arrays
999  *  pointers, or objects. The Caller is responsible for freeing those results.
1000  * If SECWouldBlock is returned, only cert_pi_nbioContext is returned.
1001  */
1002 typedef enum {
1003     cert_po_end = 0,              /* SPECIAL: signifies end of array of
1004                                    * CERTValParam* */
1005     cert_po_nbioContext = 1,      /* Return a nonblocking context. If no
1006                                    * non-blocking context is specified, then
1007                                    * blocking IO will be used.
1008                                    * Returned in value.pointer.p. The context is
1009                                    * freed after an abort or a complete operation.
1010                                    * This value is only returned on SECWouldBlock.
1011                                    */
1012     cert_po_trustAnchor = 2,      /* Return the trust anchor for the chain that
1013                                    * was validated. Returned in
1014                                    * value.pointer.cert, this value is only
1015                                    * returned on SECSuccess. */
1016     cert_po_certList = 3,         /* Return the entire chain that was validated.
1017                                    * Returned in value.pointer.certList. If no
1018                                    * chain could be constructed, this value
1019                                    * would be NULL. */
1020     cert_po_policyOID = 4,        /* Return the policies that were found to be
1021                                    * valid. Returned in value.array.oids as an
1022                                    * array. This is only returned on
1023                                    * SECSuccess. */
1024     cert_po_errorLog = 5,         /* Return a log of problems with the chain.
1025                                    * Returned in value.pointer.log  */
1026     cert_po_usages = 6,           /* Return what usages the certificate is valid
1027                                      for. Returned in value.scalar.usages */
1028     cert_po_keyUsage = 7,         /* Return what key usages the certificate
1029                                    * is valid for.
1030                                    * Returned in value.scalar.usage */
1031     cert_po_extendedKeyusage = 8, /* Return what extended key usages the
1032                                    * certificate is valid for.
1033                                    * Returned in value.array.oids */
1034     cert_po_max                   /* SPECIAL: signifies maximum allowed value,
1035                                    *  can increase in future releases */
1036 
1037 } CERTValParamOutType;
1038 
1039 typedef enum {
1040     cert_revocation_method_crl = 0,
1041     cert_revocation_method_ocsp,
1042     cert_revocation_method_count
1043 } CERTRevocationMethodIndex;
1044 
1045 /*
1046  * The following flags are supposed to be used to control bits in
1047  * each integer contained in the array pointed to be:
1048  *     CERTRevocationTests.cert_rev_flags_per_method
1049  * All Flags are prefixed by CERT_REV_M_, where _M_ indicates
1050  * this is a method dependent flag.
1051  */
1052 
1053 /*
1054  * Whether or not to use a method for revocation testing.
1055  * If set to "do not test", then all other flags are ignored.
1056  */
1057 #define CERT_REV_M_DO_NOT_TEST_USING_THIS_METHOD 0UL
1058 #define CERT_REV_M_TEST_USING_THIS_METHOD 1UL
1059 
1060 /*
1061  * Whether or not NSS is allowed to attempt to fetch fresh information
1062  *         from the network.
1063  * (Although fetching will never happen if fresh information for the
1064  *           method is already locally available.)
1065  */
1066 #define CERT_REV_M_ALLOW_NETWORK_FETCHING 0UL
1067 #define CERT_REV_M_FORBID_NETWORK_FETCHING 2UL
1068 
1069 /*
1070  * Example for an implicit default source:
1071  *         The globally configured default OCSP responder.
1072  * IGNORE means:
1073  *        ignore the implicit default source, whether it's configured or not.
1074  * ALLOW means:
1075  *       if an implicit default source is configured,
1076  *          then it overrides any available or missing source in the cert.
1077  *       if no implicit default source is configured,
1078  *          then we continue to use what's available (or not available)
1079  *          in the certs.
1080  */
1081 #define CERT_REV_M_ALLOW_IMPLICIT_DEFAULT_SOURCE 0UL
1082 #define CERT_REV_M_IGNORE_IMPLICIT_DEFAULT_SOURCE 4UL
1083 
1084 /*
1085  * Defines the behavior if no fresh information is available,
1086  *   fetching from the network is allowed, but the source of revocation
1087  *   information is unknown (even after considering implicit sources,
1088  *   if allowed by other flags).
1089  * SKIPT_TEST means:
1090  *          We ignore that no fresh information is available and
1091  *          skip this test.
1092  * REQUIRE_INFO means:
1093  *          We still require that fresh information is available.
1094  *          Other flags define what happens on missing fresh info.
1095  */
1096 #define CERT_REV_M_SKIP_TEST_ON_MISSING_SOURCE 0UL
1097 #define CERT_REV_M_REQUIRE_INFO_ON_MISSING_SOURCE 8UL
1098 
1099 /*
1100  * Defines the behavior if we are unable to obtain fresh information.
1101  * INGORE means:
1102  *      Return "cert status unknown"
1103  * FAIL means:
1104  *      Return "cert revoked".
1105  */
1106 #define CERT_REV_M_IGNORE_MISSING_FRESH_INFO 0UL
1107 #define CERT_REV_M_FAIL_ON_MISSING_FRESH_INFO 16UL
1108 
1109 /*
1110  * What should happen if we were able to find fresh information using
1111  * this method, and the data indicated the cert is good?
1112  * STOP_TESTING means:
1113  *              Our success is sufficient, do not continue testing
1114  *              other methods.
1115  * CONTINUE_TESTING means:
1116  *                  We will continue and test the next allowed
1117  *                  specified method.
1118  */
1119 #define CERT_REV_M_STOP_TESTING_ON_FRESH_INFO 0UL
1120 #define CERT_REV_M_CONTINUE_TESTING_ON_FRESH_INFO 32UL
1121 
1122 /* When this flag is used, libpkix will never attempt to use the GET HTTP
1123  * method for OCSP requests; it will always use POST.
1124  */
1125 #define CERT_REV_M_FORCE_POST_METHOD_FOR_OCSP 64UL
1126 
1127 /*
1128  * The following flags are supposed to be used to control bits in
1129  *     CERTRevocationTests.cert_rev_method_independent_flags
1130  * All Flags are prefixed by CERT_REV_M_, where _M_ indicates
1131  * this is a method independent flag.
1132  */
1133 
1134 /*
1135  * This defines the order to checking.
1136  * EACH_METHOD_SEPARATELY means:
1137  *      Do all tests related to a particular allowed method
1138  *      (both local information and network fetching) in a single step.
1139  *      Only after testing for a particular method is done,
1140  *      then switching to the next method will happen.
1141  * ALL_LOCAL_INFORMATION_FIRST means:
1142  *      Start by testing the information for all allowed methods
1143  *      which are already locally available. Only after that is done
1144  *      consider to fetch from the network (as allowed by other flags).
1145  */
1146 #define CERT_REV_MI_TEST_EACH_METHOD_SEPARATELY 0UL
1147 #define CERT_REV_MI_TEST_ALL_LOCAL_INFORMATION_FIRST 1UL
1148 
1149 /*
1150  * Use this flag to specify that it's necessary that fresh information
1151  * is available for at least one of the allowed methods, but it's
1152  * irrelevant which of the mechanisms succeeded.
1153  * NO_OVERALL_INFO_REQUIREMENT means:
1154  *     We strictly follow the requirements for each individual method.
1155  * REQUIRE_SOME_FRESH_INFO_AVAILABLE means:
1156  *     After the individual tests have been executed, we must have
1157  *     been able to find fresh information using at least one method.
1158  *     If we were unable to find fresh info, it's a failure.
1159  *     This setting overrides the CERT_REV_M_FAIL_ON_MISSING_FRESH_INFO
1160  *     flag on all methods.
1161  */
1162 #define CERT_REV_MI_NO_OVERALL_INFO_REQUIREMENT 0UL
1163 #define CERT_REV_MI_REQUIRE_SOME_FRESH_INFO_AVAILABLE 2UL
1164 
1165 typedef struct {
1166     /*
1167      * The size of the array that cert_rev_flags_per_method points to,
1168      * meaning, the number of methods that are known and defined
1169      * by the caller.
1170      */
1171     PRUint32 number_of_defined_methods;
1172 
1173     /*
1174      * A pointer to an array of integers.
1175      * Each integer defines revocation checking for a single method,
1176      *      by having individual CERT_REV_M_* bits set or not set.
1177      * The meaning of index numbers into this array are defined by
1178      *     enum CERTRevocationMethodIndex
1179      * The size of the array must be specified by the caller in the separate
1180      *     variable number_of_defined_methods.
1181      * The size of the array may be smaller than
1182      *     cert_revocation_method_count, it can happen if a caller
1183      *     is not yet aware of the latest revocation methods
1184      *     (or does not want to use them).
1185      */
1186     PRUint64 *cert_rev_flags_per_method;
1187 
1188     /*
1189      * How many preferred methods are specified?
1190      * This is equivalent to the size of the array that
1191      *      preferred_methods points to.
1192      * It's allowed to set this value to zero,
1193      *      then NSS will decide which methods to prefer.
1194      */
1195     PRUint32 number_of_preferred_methods;
1196 
1197     /* Array that may specify an optional order of preferred methods.
1198      * Each array entry shall contain a method identifier as defined
1199      *   by CERTRevocationMethodIndex.
1200      * The entry at index [0] specifies the method with highest preference.
1201      * These methods will be tested first for locally available information.
1202      * Methods allowed for downloading will be attempted in the same order.
1203      */
1204     CERTRevocationMethodIndex *preferred_methods;
1205 
1206     /*
1207      * An integer which defines certain aspects of revocation checking
1208      * (independent of individual methods) by having individual
1209      * CERT_REV_MI_* bits set or not set.
1210      */
1211     PRUint64 cert_rev_method_independent_flags;
1212 } CERTRevocationTests;
1213 
1214 typedef struct {
1215     CERTRevocationTests leafTests;
1216     CERTRevocationTests chainTests;
1217 } CERTRevocationFlags;
1218 
1219 typedef struct CERTValParamInValueStr {
1220     union {
1221         PRBool b;
1222         PRInt32 i;
1223         PRUint32 ui;
1224         PRInt64 l;
1225         PRUint64 ul;
1226         PRTime time;
1227     } scalar;
1228     union {
1229         const void *p;
1230         const char *s;
1231         const CERTCertificate *cert;
1232         const CERTCertList *chain;
1233         const CERTRevocationFlags *revocation;
1234         const CERTChainVerifyCallback *chainVerifyCallback;
1235     } pointer;
1236     union {
1237         const PRInt32 *pi;
1238         const PRUint32 *pui;
1239         const PRInt64 *pl;
1240         const PRUint64 *pul;
1241         const SECOidTag *oids;
1242     } array;
1243     int arraySize;
1244 } CERTValParamInValue;
1245 
1246 typedef struct CERTValParamOutValueStr {
1247     union {
1248         PRBool b;
1249         PRInt32 i;
1250         PRUint32 ui;
1251         PRInt64 l;
1252         PRUint64 ul;
1253         SECCertificateUsage usages;
1254     } scalar;
1255     union {
1256         void *p;
1257         char *s;
1258         CERTVerifyLog *log;
1259         CERTCertificate *cert;
1260         CERTCertList *chain;
1261     } pointer;
1262     union {
1263         void *p;
1264         SECOidTag *oids;
1265     } array;
1266     int arraySize;
1267 } CERTValParamOutValue;
1268 
1269 typedef struct {
1270     CERTValParamInType type;
1271     CERTValParamInValue value;
1272 } CERTValInParam;
1273 
1274 typedef struct {
1275     CERTValParamOutType type;
1276     CERTValParamOutValue value;
1277 } CERTValOutParam;
1278 
1279 /*
1280  * Levels of standards conformance strictness for CERT_NameToAsciiInvertible
1281  */
1282 typedef enum CertStrictnessLevels {
1283     CERT_N2A_READABLE = 0,   /* maximum human readability */
1284     CERT_N2A_STRICT = 10,    /* strict RFC compliance    */
1285     CERT_N2A_INVERTIBLE = 20 /* maximum invertibility,
1286                                 all DirectoryStrings encoded in hex */
1287 } CertStrictnessLevel;
1288 
1289 /*
1290  * policy flag defines
1291  */
1292 #define CERT_POLICY_FLAG_NO_MAPPING 1
1293 #define CERT_POLICY_FLAG_EXPLICIT 2
1294 #define CERT_POLICY_FLAG_NO_ANY 4
1295 
1296 /*
1297  * CertStore flags
1298  */
1299 #define CERT_ENABLE_LDAP_FETCH 1
1300 #define CERT_ENABLE_HTTP_FETCH 2
1301 
1302 /* This functin pointer type may be used for any function that takes
1303  * a CERTCertificate * and returns an allocated string, which must be
1304  * freed by a call to PORT_Free.
1305  */
1306 typedef char *(*CERT_StringFromCertFcn)(CERTCertificate *cert);
1307 
1308 /* XXX Lisa thinks the template declarations belong in cert.h, not here? */
1309 
1310 #include "secasn1t.h" /* way down here because I expect template stuff to
1311                        * move out of here anyway */
1312 
1313 SEC_BEGIN_PROTOS
1314 
1315 extern const SEC_ASN1Template CERT_CertificateRequestTemplate[];
1316 extern const SEC_ASN1Template CERT_CertificateTemplate[];
1317 extern const SEC_ASN1Template SEC_SignedCertificateTemplate[];
1318 extern const SEC_ASN1Template CERT_CertExtensionTemplate[];
1319 extern const SEC_ASN1Template CERT_SequenceOfCertExtensionTemplate[];
1320 extern const SEC_ASN1Template SECKEY_PublicKeyTemplate[];
1321 extern const SEC_ASN1Template CERT_SubjectPublicKeyInfoTemplate[];
1322 extern const SEC_ASN1Template CERT_TimeChoiceTemplate[];
1323 extern const SEC_ASN1Template CERT_ValidityTemplate[];
1324 extern const SEC_ASN1Template CERT_PublicKeyAndChallengeTemplate[];
1325 extern const SEC_ASN1Template SEC_CertSequenceTemplate[];
1326 
1327 extern const SEC_ASN1Template CERT_IssuerAndSNTemplate[];
1328 extern const SEC_ASN1Template CERT_NameTemplate[];
1329 extern const SEC_ASN1Template CERT_SetOfSignedCrlTemplate[];
1330 extern const SEC_ASN1Template CERT_RDNTemplate[];
1331 extern const SEC_ASN1Template CERT_SignedDataTemplate[];
1332 extern const SEC_ASN1Template CERT_CrlTemplate[];
1333 extern const SEC_ASN1Template CERT_SignedCrlTemplate[];
1334 
1335 /*
1336 ** XXX should the attribute stuff be centralized for all of ns/security?
1337 */
1338 extern const SEC_ASN1Template CERT_AttributeTemplate[];
1339 extern const SEC_ASN1Template CERT_SetOfAttributeTemplate[];
1340 
1341 /* These functions simply return the address of the above-declared templates.
1342 ** This is necessary for Windows DLLs.  Sigh.
1343 */
1344 SEC_ASN1_CHOOSER_DECLARE(CERT_CertificateRequestTemplate)
1345 SEC_ASN1_CHOOSER_DECLARE(CERT_CertificateTemplate)
1346 SEC_ASN1_CHOOSER_DECLARE(CERT_CrlTemplate)
1347 SEC_ASN1_CHOOSER_DECLARE(CERT_IssuerAndSNTemplate)
1348 SEC_ASN1_CHOOSER_DECLARE(CERT_NameTemplate)
1349 SEC_ASN1_CHOOSER_DECLARE(CERT_SequenceOfCertExtensionTemplate)
1350 SEC_ASN1_CHOOSER_DECLARE(CERT_SetOfSignedCrlTemplate)
1351 SEC_ASN1_CHOOSER_DECLARE(CERT_SignedDataTemplate)
1352 SEC_ASN1_CHOOSER_DECLARE(CERT_SubjectPublicKeyInfoTemplate)
1353 SEC_ASN1_CHOOSER_DECLARE(SEC_SignedCertificateTemplate)
1354 SEC_ASN1_CHOOSER_DECLARE(CERT_SignedCrlTemplate)
1355 SEC_ASN1_CHOOSER_DECLARE(CERT_TimeChoiceTemplate)
1356 
1357 SEC_END_PROTOS
1358 
1359 #endif /* _CERTT_H_ */
1360