certt.h
上传用户:lyxiangda
上传日期:2007-01-12
资源大小:3042k
文件大小:23k
源码类别:

CA认证

开发平台:

WINDOWS

  1. /*
  2.  * The contents of this file are subject to the Mozilla Public
  3.  * License Version 1.1 (the "License"); you may not use this file
  4.  * except in compliance with the License. You may obtain a copy of
  5.  * the License at http://www.mozilla.org/MPL/
  6.  * 
  7.  * Software distributed under the License is distributed on an "AS
  8.  * IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or
  9.  * implied. See the License for the specific language governing
  10.  * rights and limitations under the License.
  11.  * 
  12.  * The Original Code is the Netscape security libraries.
  13.  * 
  14.  * The Initial Developer of the Original Code is Netscape
  15.  * Communications Corporation.  Portions created by Netscape are 
  16.  * Copyright (C) 1994-2000 Netscape Communications Corporation.  All
  17.  * Rights Reserved.
  18.  * 
  19.  * Contributor(s):
  20.  * 
  21.  * Alternatively, the contents of this file may be used under the
  22.  * terms of the GNU General Public License Version 2 or later (the
  23.  * "GPL"), in which case the provisions of the GPL are applicable 
  24.  * instead of those above.  If you wish to allow use of your 
  25.  * version of this file only under the terms of the GPL and not to
  26.  * allow others to use your version of this file under the MPL,
  27.  * indicate your decision by deleting the provisions above and
  28.  * replace them with the notice and other provisions required by
  29.  * the GPL.  If you do not delete the provisions above, a recipient
  30.  * may use your version of this file under either the MPL or the
  31.  * GPL.
  32.  */
  33. /*
  34.  * certt.h - public data structures for the certificate library
  35.  *
  36.  * $Id: certt.h,v 1.1 2000/03/31 19:42:35 relyea%netscape.com Exp $
  37.  */
  38. #ifndef _CERTT_H_
  39. #define _CERTT_H_
  40. #include "prclist.h"
  41. #include "pkcs11t.h"
  42. #include "seccomon.h"
  43. #include "secmodt.h"
  44. #include "secoidt.h"
  45. #include "plarena.h"
  46. #include "prcvar.h"
  47. #include "prlock.h"
  48. #include "prio.h"
  49. #include "prmon.h"
  50. /* Non-opaque objects */
  51. typedef struct CERTAVAStr                        CERTAVA;
  52. typedef struct CERTAttributeStr                  CERTAttribute;
  53. typedef struct CERTAuthInfoAccessStr             CERTAuthInfoAccess;
  54. typedef struct CERTAuthKeyIDStr                  CERTAuthKeyID;
  55. typedef struct CERTBasicConstraintsStr           CERTBasicConstraints;
  56. typedef struct CERTCertDBHandleStr               CERTCertDBHandle;
  57. typedef struct CERTCertExtensionStr              CERTCertExtension;
  58. typedef struct CERTCertKeyStr                    CERTCertKey;
  59. typedef struct CERTCertListStr                   CERTCertList;
  60. typedef struct CERTCertListNodeStr               CERTCertListNode;
  61. typedef struct CERTCertNicknamesStr              CERTCertNicknames;
  62. typedef struct CERTCertTrustStr                  CERTCertTrust;
  63. typedef struct CERTCertificateStr                CERTCertificate;
  64. typedef struct CERTCertificateListStr            CERTCertificateList;
  65. typedef struct CERTCertificateRequestStr         CERTCertificateRequest;
  66. typedef struct CERTCrlStr                        CERTCrl;
  67. typedef struct CERTCrlDistributionPointsStr      CERTCrlDistributionPoints; 
  68. typedef struct CERTCrlEntryStr                   CERTCrlEntry;
  69. typedef struct CERTCrlHeadNodeStr                CERTCrlHeadNode;
  70. typedef struct CERTCrlKeyStr                     CERTCrlKey;
  71. typedef struct CERTCrlNodeStr                    CERTCrlNode;
  72. typedef struct CERTDERCertsStr                   CERTDERCerts;
  73. typedef struct CERTDistNamesStr                  CERTDistNames;
  74. typedef struct CERTGeneralNameStr                CERTGeneralName;
  75. typedef struct CERTGeneralNameListStr            CERTGeneralNameList;
  76. typedef struct CERTIssuerAndSNStr                CERTIssuerAndSN;
  77. typedef struct CERTNameStr                       CERTName;
  78. typedef struct CERTNameConstraintStr             CERTNameConstraint;
  79. typedef struct CERTNameConstraintsStr            CERTNameConstraints;
  80. typedef struct CERTOKDomainNameStr               CERTOKDomainName;
  81. typedef struct CERTPublicKeyAndChallengeStr      CERTPublicKeyAndChallenge;
  82. typedef struct CERTRDNStr                        CERTRDN;
  83. typedef struct CERTSignedCrlStr                  CERTSignedCrl;
  84. typedef struct CERTSignedDataStr                 CERTSignedData;
  85. typedef struct CERTStatusConfigStr               CERTStatusConfig;
  86. typedef struct CERTSubjectListStr                CERTSubjectList;
  87. typedef struct CERTSubjectNodeStr                CERTSubjectNode;
  88. typedef struct CERTSubjectPublicKeyInfoStr       CERTSubjectPublicKeyInfo;
  89. typedef struct CERTValidityStr                   CERTValidity;
  90. typedef struct CERTVerifyLogStr                  CERTVerifyLog;
  91. typedef struct CERTVerifyLogNodeStr              CERTVerifyLogNode;
  92. typedef struct CRLDistributionPointStr           CRLDistributionPoint;
  93. /* CRL extensions type */
  94. typedef unsigned long CERTCrlNumber;
  95. /*
  96. ** An X.500 AVA object
  97. */
  98. struct CERTAVAStr {
  99.     SECItem type;
  100.     SECItem value;
  101. };
  102. /*
  103. ** An X.500 RDN object
  104. */
  105. struct CERTRDNStr {
  106.     CERTAVA **avas;
  107. };
  108. /*
  109. ** An X.500 name object
  110. */
  111. struct CERTNameStr {
  112.     PRArenaPool *arena;
  113.     CERTRDN **rdns;
  114. };
  115. /*
  116. ** An X.509 validity object
  117. */
  118. struct CERTValidityStr {
  119.     PRArenaPool *arena;
  120.     SECItem notBefore;
  121.     SECItem notAfter;
  122. };
  123. /*
  124.  * A serial number and issuer name, which is used as a database key
  125.  */
  126. struct CERTCertKeyStr {
  127.     SECItem serialNumber;
  128.     SECItem derIssuer;
  129. };
  130. /*
  131. ** A signed data object. Used to implement the "signed" macro used
  132. ** in the X.500 specs.
  133. */
  134. struct CERTSignedDataStr {
  135.     SECItem data;
  136.     SECAlgorithmID signatureAlgorithm;
  137.     SECItem signature;
  138. };
  139. /*
  140. ** An X.509 subject-public-key-info object
  141. */
  142. struct CERTSubjectPublicKeyInfoStr {
  143.     PRArenaPool *arena;
  144.     SECAlgorithmID algorithm;
  145.     SECItem subjectPublicKey;
  146. };
  147. struct CERTPublicKeyAndChallengeStr {
  148.     SECItem spki;
  149.     SECItem challenge;
  150. };
  151. typedef struct _certDBEntryCert certDBEntryCert;
  152. typedef struct _certDBEntryRevocation certDBEntryRevocation;
  153. struct CERTCertTrustStr {
  154.     unsigned int sslFlags;
  155.     unsigned int emailFlags;
  156.     unsigned int objectSigningFlags;
  157. };
  158. /*
  159.  * defined the types of trust that exist
  160.  */
  161. typedef enum {
  162.     trustSSL,
  163.     trustEmail,
  164.     trustObjectSigning,
  165.     trustTypeNone
  166. } SECTrustType;
  167. #define SEC_GET_TRUST_FLAGS(trust,type) 
  168.         (((type)==trustSSL)?((trust)->sslFlags): 
  169.  (((type)==trustEmail)?((trust)->emailFlags): 
  170.   (((type)==trustObjectSigning)?((trust)->objectSigningFlags):0)))
  171. /*
  172. ** An X.509.3 certificate extension
  173. */
  174. struct CERTCertExtensionStr {
  175.     SECItem id;
  176.     SECItem critical;
  177.     SECItem value;
  178. };
  179. struct CERTSubjectNodeStr {
  180.     struct CERTSubjectNodeStr *next;
  181.     struct CERTSubjectNodeStr *prev;
  182.     SECItem certKey;
  183.     SECItem keyID;
  184. };
  185. struct CERTSubjectListStr {
  186.     PRArenaPool *arena;
  187.     int ncerts;
  188.     char *emailAddr;
  189.     CERTSubjectNode *head;
  190.     CERTSubjectNode *tail; /* do we need tail? */
  191.     struct _certDBEntrySubject *entry;
  192. };
  193. /*
  194. ** An X.509 certificate object (the unsigned form)
  195. */
  196. struct CERTCertificateStr {
  197.     /* the arena is used to allocate any data structures that have the same
  198.      * lifetime as the cert.  This is all stuff that hangs off of the cert
  199.      * structure, and is all freed at the same time.  I is used when the
  200.      * cert is decoded, destroyed, and at some times when it changes
  201.      * state
  202.      */
  203.     PRArenaPool *arena;
  204.     /* The following fields are static after the cert has been decoded */
  205.     char *subjectName;
  206.     char *issuerName;
  207.     CERTSignedData signatureWrap; /* XXX */
  208.     SECItem derCert; /* original DER for the cert */
  209.     SECItem derIssuer; /* DER for issuer name */
  210.     SECItem derSubject; /* DER for subject name */
  211.     SECItem derPublicKey; /* DER for the public key */
  212.     SECItem certKey; /* database key for this cert */
  213.     SECItem version;
  214.     SECItem serialNumber;
  215.     SECAlgorithmID signature;
  216.     CERTName issuer;
  217.     CERTValidity validity;
  218.     CERTName subject;
  219.     CERTSubjectPublicKeyInfo subjectPublicKeyInfo;
  220.     SECItem issuerID;
  221.     SECItem subjectID;
  222.     CERTCertExtension **extensions;
  223.     char *emailAddr;
  224.     CERTCertDBHandle *dbhandle;
  225.     SECItem subjectKeyID; /* x509v3 subject key identifier */
  226.     PRBool keyIDGenerated; /* was the keyid generated? */
  227.     unsigned int keyUsage; /* what uses are allowed for this cert */
  228.     unsigned int rawKeyUsage; /* value of the key usage extension */
  229.     PRBool keyUsagePresent; /* was the key usage extension present */
  230.     unsigned int nsCertType; /* value of the ns cert type extension */
  231.     /* these values can be set by the application to bypass certain checks
  232.      * or to keep the cert in memory for an entire session.
  233.      * XXX - need an api to set these
  234.      */
  235.     PRBool keepSession; /* keep this cert for entire session*/
  236.     PRBool timeOK; /* is the bad validity time ok? */
  237.     CERTOKDomainName *domainOK; /* these domain names are ok */
  238.     /*
  239.      * these values can change when the cert changes state.  These state
  240.      * changes include transitions from temp to perm or vice-versa, and
  241.      * changes of trust flags
  242.      */
  243.     PRBool isperm;
  244.     PRBool istemp;
  245.     char *nickname;
  246.     char *dbnickname;
  247.     certDBEntryCert *dbEntry; /* database entry struct */
  248.     CERTCertTrust *trust;
  249.     /* the reference count is modified whenever someone looks up, dups
  250.      * or destroys a certificate
  251.      */
  252.     int referenceCount;
  253.     /* The subject list is a list of all certs with the same subject name.
  254.      * It can be modified any time a cert is added or deleted from either
  255.      * the in-memory(temporary) or on-disk(permanent) database.
  256.      */
  257.     CERTSubjectList *subjectList;
  258.     /* these fields are used by client GUI code to keep track of ssl sockets
  259.      * that are blocked waiting on GUI feedback related to this cert.
  260.      * XXX - these should be moved into some sort of application specific
  261.      *       data structure.  They are only used by the browser right now.
  262.      */
  263.     struct SECSocketNode *socketlist;
  264.     int socketcount;
  265.     struct SECSocketNode *authsocketlist;
  266.     int authsocketcount;
  267.     /* This is PKCS #11 stuff. */
  268.     PK11SlotInfo *slot; /*if this cert came of a token, which is it*/
  269.     CK_OBJECT_HANDLE pkcs11ID; /*and which object on that token is it */
  270.     PRBool ownSlot; /*true if the cert owns the slot reference */
  271. };
  272. #define SEC_CERTIFICATE_VERSION_1 0 /* default created */
  273. #define SEC_CERTIFICATE_VERSION_2 1 /* v2 */
  274. #define SEC_CERTIFICATE_VERSION_3 2 /* v3 extensions */
  275. #define SEC_CRL_VERSION_1 0 /* default */
  276. #define SEC_CRL_VERSION_2 1 /* v2 extensions */
  277. /*
  278.  * used to identify class of cert in mime stream code
  279.  */
  280. #define SEC_CERT_CLASS_CA 1
  281. #define SEC_CERT_CLASS_SERVER 2
  282. #define SEC_CERT_CLASS_USER 3
  283. #define SEC_CERT_CLASS_EMAIL 4
  284. struct CERTDERCertsStr {
  285.     PRArenaPool *arena;
  286.     int numcerts;
  287.     SECItem *rawCerts;
  288. };
  289. /*
  290. ** A PKCS ? Attribute
  291. ** XXX this is duplicated through out the code, it *should* be moved
  292. ** to a central location.  Where would be appropriate?
  293. */
  294. struct CERTAttributeStr {
  295.     SECItem attrType;
  296.     SECItem **attrValue;
  297. };
  298. /*
  299. ** A PKCS#10 certificate-request object (the unsigned form)
  300. */
  301. struct CERTCertificateRequestStr {
  302.     PRArenaPool *arena;
  303.     SECItem version;
  304.     CERTName subject;
  305.     CERTSubjectPublicKeyInfo subjectPublicKeyInfo;
  306.     SECItem **attributes;
  307. };
  308. #define SEC_CERTIFICATE_REQUEST_VERSION 0 /* what we *create* */
  309. /*
  310. ** A certificate list object.
  311. */
  312. struct CERTCertificateListStr {
  313.     SECItem *certs;
  314.     int len; /* number of certs */
  315.     PRArenaPool *arena;
  316. };
  317. struct CERTCertListNodeStr {
  318.     PRCList links;
  319.     CERTCertificate *cert;
  320.     void *appData;
  321. };
  322. struct CERTCertListStr {
  323.     PRCList list;
  324.     PRArenaPool *arena;
  325. };
  326. #define CERT_LIST_HEAD(l) ((CERTCertListNode *)PR_LIST_HEAD(&l->list))
  327. #define CERT_LIST_NEXT(n) ((CERTCertListNode *)n->links.next)
  328. #define CERT_LIST_END(n,l) (((void *)n) == ((void *)&l->list))
  329. struct CERTCrlEntryStr {
  330.     SECItem serialNumber;
  331.     SECItem revocationDate;
  332.     CERTCertExtension **extensions;    
  333. };
  334. struct CERTCrlStr {
  335.     PRArenaPool *arena;
  336.     SECItem version;
  337.     SECAlgorithmID signatureAlg;
  338.     SECItem derName;
  339.     CERTName name;
  340.     SECItem lastUpdate;
  341.     SECItem nextUpdate; /* optional for x.509 CRL  */
  342.     CERTCrlEntry **entries;
  343.     CERTCertExtension **extensions;    
  344. };
  345. struct CERTCrlKeyStr {
  346.     SECItem derName;
  347.     SECItem dummy; /* The decoder can not skip a primitive,
  348.    this serves as a place holder for the
  349.    decoder to finish its task only
  350. */
  351. };
  352. struct CERTSignedCrlStr {
  353.     PRArenaPool *arena;
  354.     CERTCrl crl;
  355.     certDBEntryRevocation *dbEntry; /* database entry struct */
  356.     PRBool keep; /* keep this crl in the cache for the  session*/
  357.     PRBool isperm;
  358.     PRBool istemp;
  359.     int referenceCount;
  360.     CERTCertDBHandle *dbhandle;
  361.     CERTSignedData signatureWrap; /* XXX */
  362.     char *url;
  363. };
  364. struct CERTCrlHeadNodeStr {
  365.     PRArenaPool *arena;
  366.     CERTCertDBHandle *dbhandle;
  367.     CERTCrlNode *first;
  368.     CERTCrlNode *last;
  369. };
  370. struct CERTCrlNodeStr {
  371.     CERTCrlNode *next;
  372.     int  type;
  373.     CERTSignedCrl *crl;
  374. };
  375. /*
  376.  * Array of X.500 Distinguished Names
  377.  */
  378. struct CERTDistNamesStr {
  379.     PRArenaPool *arena;
  380.     int nnames;
  381.     SECItem  *names;
  382.     void *head; /* private */
  383. };
  384. #define NS_CERT_TYPE_SSL_CLIENT (0x80) /* bit 0 */
  385. #define NS_CERT_TYPE_SSL_SERVER (0x40)  /* bit 1 */
  386. #define NS_CERT_TYPE_EMAIL (0x20)  /* bit 2 */
  387. #define NS_CERT_TYPE_OBJECT_SIGNING (0x10)  /* bit 3 */
  388. #define NS_CERT_TYPE_RESERVED (0x08)  /* bit 4 */
  389. #define NS_CERT_TYPE_SSL_CA (0x04)  /* bit 5 */
  390. #define NS_CERT_TYPE_EMAIL_CA (0x02)  /* bit 6 */
  391. #define NS_CERT_TYPE_OBJECT_SIGNING_CA (0x01)  /* bit 7 */
  392. #define EXT_KEY_USAGE_TIME_STAMP        (0x8000)
  393. #define EXT_KEY_USAGE_STATUS_RESPONDER (0x4000)
  394. #define NS_CERT_TYPE_APP ( NS_CERT_TYPE_SSL_CLIENT | 
  395.   NS_CERT_TYPE_SSL_SERVER | 
  396.   NS_CERT_TYPE_EMAIL | 
  397.   NS_CERT_TYPE_OBJECT_SIGNING )
  398. #define NS_CERT_TYPE_CA ( NS_CERT_TYPE_SSL_CA | 
  399.  NS_CERT_TYPE_EMAIL_CA | 
  400.  NS_CERT_TYPE_OBJECT_SIGNING_CA | 
  401.  EXT_KEY_USAGE_STATUS_RESPONDER )
  402. typedef enum {
  403.     certUsageSSLClient,
  404.     certUsageSSLServer,
  405.     certUsageSSLServerWithStepUp,
  406.     certUsageSSLCA,
  407.     certUsageEmailSigner,
  408.     certUsageEmailRecipient,
  409.     certUsageObjectSigner,
  410.     certUsageUserCertImport,
  411.     certUsageVerifyCA,
  412.     certUsageProtectedObjectSigner,
  413.     certUsageStatusResponder,
  414.     certUsageAnyCA
  415. } SECCertUsage;
  416. /*
  417.  * Does the cert belong to the user, a peer, or a CA.
  418.  */
  419. typedef enum {
  420.     certOwnerUser,
  421.     certOwnerPeer,
  422.     certOwnerCA
  423. } CERTCertOwner;
  424. /*
  425.  * This enum represents the state of validity times of a certificate
  426.  */
  427. typedef enum {
  428.     secCertTimeValid,
  429.     secCertTimeExpired,
  430.     secCertTimeNotValidYet
  431. } SECCertTimeValidity;
  432. /*
  433.  * Interface for getting certificate nickname strings out of the database
  434.  */
  435. /* these are values for the what argument below */
  436. #define SEC_CERT_NICKNAMES_ALL 1
  437. #define SEC_CERT_NICKNAMES_USER 2
  438. #define SEC_CERT_NICKNAMES_SERVER 3
  439. #define SEC_CERT_NICKNAMES_CA 4
  440. struct CERTCertNicknamesStr {
  441.     PRArenaPool *arena;
  442.     void *head;
  443.     int numnicknames;
  444.     char **nicknames;
  445.     int what;
  446.     int totallen;
  447. };
  448. struct CERTIssuerAndSNStr {
  449.     SECItem derIssuer;
  450.     CERTName issuer;
  451.     SECItem serialNumber;
  452. };
  453. /* X.509 v3 Key Usage Extension flags */
  454. #define KU_DIGITAL_SIGNATURE (0x80) /* bit 0 */
  455. #define KU_NON_REPUDIATION (0x40)  /* bit 1 */
  456. #define KU_KEY_ENCIPHERMENT (0x20)  /* bit 2 */
  457. #define KU_DATA_ENCIPHERMENT (0x10)  /* bit 3 */
  458. #define KU_KEY_AGREEMENT (0x08)  /* bit 4 */
  459. #define KU_KEY_CERT_SIGN (0x04)  /* bit 5 */
  460. #define KU_CRL_SIGN (0x02)  /* bit 6 */
  461. #define KU_ALL (KU_DIGITAL_SIGNATURE | 
  462.  KU_NON_REPUDIATION | 
  463.  KU_KEY_ENCIPHERMENT | 
  464.  KU_DATA_ENCIPHERMENT | 
  465.  KU_KEY_AGREEMENT | 
  466.  KU_KEY_CERT_SIGN | 
  467.  KU_CRL_SIGN)
  468. /* This value will not occur in certs.  It is used internally for the case
  469.  * when the key type is not know ahead of time and either key agreement or
  470.  * key encipherment are the correct value based on key type
  471.  */
  472. #define KU_KEY_AGREEMENT_OR_ENCIPHERMENT (0x4000)
  473. /* internal bits that do not match bits in the x509v3 spec, but are used
  474.  * for similar purposes
  475.  */
  476. #define KU_NS_GOVT_APPROVED (0x8000) /*don't make part of KU_ALL!*/
  477. /*
  478.  * x.509 v3 Basic Constraints Extension
  479.  * If isCA is false, the pathLenConstraint is ignored.
  480.  * Otherwise, the following pathLenConstraint values will apply:
  481.  * < 0 - there is no limit to the certificate path
  482.  * 0   - CA can issues end-entity certificates only
  483.  * > 0 - the number of certificates in the certificate path is
  484.  *       limited to this number
  485.  */
  486. #define CERT_UNLIMITED_PATH_CONSTRAINT -2
  487. struct CERTBasicConstraintsStr {
  488.     PRBool isCA; /* on if is CA */
  489.     int pathLenConstraint; /* maximum number of certificates that can be
  490.    in the cert path.  Only applies to a CA
  491.    certificate; otherwise, it's ignored.
  492.  */
  493. };
  494. /* Maximum length of a certificate chain */
  495. #define CERT_MAX_CERT_CHAIN 20
  496. /* x.509 v3 Reason Falgs, used in CRLDistributionPoint Extension */
  497. #define RF_UNUSED (0x80) /* bit 0 */
  498. #define RF_KEY_COMPROMISE (0x40)  /* bit 1 */
  499. #define RF_CA_COMPROMISE (0x20)  /* bit 2 */
  500. #define RF_AFFILIATION_CHANGED (0x10)  /* bit 3 */
  501. #define RF_SUPERSEDED (0x08)  /* bit 4 */
  502. #define RF_CESSATION_OF_OPERATION (0x04)  /* bit 5 */
  503. #define RF_CERTIFICATE_HOLD (0x02)  /* bit 6 */
  504. /* If we needed to extract the general name field, use this */
  505. /* General Name types */
  506. typedef enum {
  507.     certOtherName = 1,
  508.     certRFC822Name = 2,
  509.     certDNSName = 3,
  510.     certX400Address = 4,
  511.     certDirectoryName = 5,
  512.     certEDIPartyName = 6,
  513.     certURI = 7,
  514.     certIPAddress = 8,
  515.     certRegisterID = 9
  516. } CERTGeneralNameType;
  517. typedef struct OtherNameStr {
  518.     SECItem          name;
  519.     SECItem          oid;
  520. }OtherName;
  521. struct CERTGeneralNameStr {
  522.     CERTGeneralNameType type; /* name type */
  523.     union {
  524. CERTName directoryName;         /* distinguish name */
  525. OtherName  OthName; /* Other Name */
  526. SECItem other;                  /* the rest of the name forms */
  527.     }name;
  528.     SECItem derDirectoryName; /* this is saved to simplify directory name
  529.    comparison */
  530.     PRCList l;
  531. };
  532. struct CERTGeneralNameListStr {
  533.     PRArenaPool *arena;
  534.     CERTGeneralName *name;
  535.     int refCount;
  536.     int len;
  537.     PRLock *lock;
  538. };
  539. struct CERTNameConstraintStr {
  540.     CERTGeneralName  name;
  541.     SECItem          DERName;
  542.     SECItem          min;
  543.     SECItem          max;
  544.     PRCList          l;
  545. };
  546. struct CERTNameConstraintsStr {
  547.     CERTNameConstraint  *permited;
  548.     CERTNameConstraint  *excluded;
  549.     SECItem             **DERPermited;
  550.     SECItem             **DERExcluded;
  551. };
  552. /* X.509 v3 Authority Key Identifier extension.  For the authority certificate
  553.    issuer field, we only support URI now.
  554.  */
  555. struct CERTAuthKeyIDStr {
  556.     SECItem keyID; /* unique key identifier */
  557.     CERTGeneralName *authCertIssuer; /* CA's issuer name.  End with a NULL */
  558.     SECItem authCertSerialNumber; /* CA's certificate serial number */
  559.     SECItem **DERAuthCertIssuer; /* This holds the DER encoded format of
  560.    the authCertIssuer field. It is used
  561.    by the encoding engine. It should be
  562.    used as a read only field by the caller.
  563. */
  564. };
  565. /* x.509 v3 CRL Distributeion Point */
  566. /*
  567.  * defined the types of CRL Distribution points
  568.  */
  569. typedef enum {
  570.     generalName = 1, /* only support this for now */
  571.     relativeDistinguishedName = 2
  572. } DistributionPointTypes;
  573. struct CRLDistributionPointStr {
  574.     DistributionPointTypes distPointType;
  575.     union {
  576. CERTGeneralName *fullName;
  577. CERTRDN relativeName;
  578.     } distPoint;
  579.     SECItem reasons;
  580.     CERTGeneralName *crlIssuer;
  581.     
  582.     /* Reserved for internal use only*/
  583.     SECItem derDistPoint;
  584.     SECItem derRelativeName;
  585.     SECItem **derCrlIssuer;
  586.     SECItem **derFullName;
  587.     SECItem bitsmap;
  588. };
  589. struct CERTCrlDistributionPointsStr {
  590.     CRLDistributionPoint **distPoints;
  591. };
  592. /*
  593.  * This structure is used to keep a log of errors when verifying
  594.  * a cert chain.  This allows multiple errors to be reported all at
  595.  * once.
  596.  */
  597. struct CERTVerifyLogNodeStr {
  598.     CERTCertificate *cert; /* what cert had the error */
  599.     long error; /* what error was it? */
  600.     unsigned int depth; /* how far up the chain are we */
  601.     void *arg; /* error specific argument */
  602.     struct CERTVerifyLogNodeStr *next; /* next in the list */
  603.     struct CERTVerifyLogNodeStr *prev; /* next in the list */
  604. };
  605. struct CERTVerifyLogStr {
  606.     PRArenaPool *arena;
  607.     unsigned int count;
  608.     struct CERTVerifyLogNodeStr *head;
  609.     struct CERTVerifyLogNodeStr *tail;
  610. };
  611. struct CERTOKDomainNameStr {
  612.     CERTOKDomainName *next;
  613.     char              name[1]; /* actual length may be longer. */
  614. };
  615. typedef SECStatus PR_CALLBACK (*CERTStatusChecker) (CERTCertDBHandle *handle,
  616.     CERTCertificate *cert,
  617.     int64 time,
  618.     void *pwArg);
  619. typedef SECStatus PR_CALLBACK (*CERTStatusDestroy) (CERTStatusConfig *handle);
  620. struct CERTStatusConfigStr {
  621.     CERTStatusChecker statusChecker; /* NULL means no checking enabled */
  622.     CERTStatusDestroy statusDestroy; /* enabled or no, will clean up */
  623.     void *statusContext; /* cx specific to checking protocol */
  624. };
  625. struct CERTAuthInfoAccessStr {
  626.     SECItem method;
  627.     SECItem derLocation;
  628.     CERTGeneralName *location; /* decoded location */
  629. };
  630. /* This is the typedef for the callback passed to CERT_OpenCertDB() */
  631. /* callback to return database name based on version number */
  632. typedef char * (*CERTDBNameFunc)(void *arg, int dbVersion);
  633. /*
  634.  * types of cert packages that we can decode
  635.  */
  636. typedef enum {
  637.     certPackageNone,
  638.     certPackageCert,
  639.     certPackagePKCS7,
  640.     certPackageNSCertSeq,
  641.     certPackageNSCertWrap
  642. } CERTPackageType;
  643. /*
  644.  * these types are for the PKIX Certificate Policies extension
  645.  */
  646. typedef struct {
  647.     SECOidTag oid;
  648.     SECItem qualifierID;
  649.     SECItem qualifierValue;
  650. } CERTPolicyQualifier;
  651. typedef struct {
  652.     SECOidTag oid;
  653.     SECItem policyID;
  654.     CERTPolicyQualifier **policyQualifiers;
  655. } CERTPolicyInfo;
  656. typedef struct {
  657.     PRArenaPool *arena;
  658.     CERTPolicyInfo **policyInfos;
  659. } CERTCertificatePolicies;
  660. typedef struct {
  661.     SECItem organization;
  662.     SECItem **noticeNumbers;
  663. } CERTNoticeReference;
  664. typedef struct {
  665.     PRArenaPool *arena;
  666.     CERTNoticeReference noticeReference;
  667.     SECItem derNoticeReference;
  668.     SECItem displayText;
  669. } CERTUserNotice;
  670. typedef struct {
  671.     PRArenaPool *arena;
  672.     SECItem **oids;
  673. } CERTOidSequence;
  674. /* XXX Lisa thinks the template declarations belong in cert.h, not here? */
  675. #include "secasn1t.h" /* way down here because I expect template stuff to
  676.  * move out of here anyway */
  677. extern const SEC_ASN1Template CERT_CertificateRequestTemplate[];
  678. extern const SEC_ASN1Template CERT_CertificateTemplate[];
  679. extern const SEC_ASN1Template SEC_SignedCertificateTemplate[];
  680. extern const SEC_ASN1Template CERT_CertExtensionTemplate[];
  681. extern const SEC_ASN1Template CERT_SequenceOfCertExtensionTemplate[];
  682. extern const SEC_ASN1Template SECKEY_PublicKeyTemplate[];
  683. extern const SEC_ASN1Template CERT_SubjectPublicKeyInfoTemplate[];
  684. extern const SEC_ASN1Template CERT_ValidityTemplate[];
  685. extern const SEC_ASN1Template CERT_PublicKeyAndChallengeTemplate[];
  686. extern const SEC_ASN1Template SEC_CertSequenceTemplate[];
  687. extern const SEC_ASN1Template CERT_IssuerAndSNTemplate[];
  688. extern const SEC_ASN1Template CERT_NameTemplate[];
  689. extern const SEC_ASN1Template CERT_SetOfSignedCrlTemplate[];
  690. extern const SEC_ASN1Template CERT_RDNTemplate[];
  691. extern const SEC_ASN1Template CERT_SignedDataTemplate[];
  692. extern const SEC_ASN1Template CERT_CrlTemplate[];
  693. /*
  694. ** XXX should the attribute stuff be centralized for all of ns/security?
  695. */
  696. extern const SEC_ASN1Template CERT_AttributeTemplate[];
  697. extern const SEC_ASN1Template CERT_SetOfAttributeTemplate[];
  698. #endif /* _CERTT_H_ */