| 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 | |