cert.h
上传用户:lyxiangda
上传日期:2007-01-12
资源大小:3042k
文件大小:43k
- /*
- * The contents of this file are subject to the Mozilla Public
- * License Version 1.1 (the "License"); you may not use this file
- * except in compliance with the License. You may obtain a copy of
- * the License at http://www.mozilla.org/MPL/
- *
- * Software distributed under the License is distributed on an "AS
- * IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or
- * implied. See the License for the specific language governing
- * rights and limitations under the License.
- *
- * The Original Code is the Netscape security libraries.
- *
- * The Initial Developer of the Original Code is Netscape
- * Communications Corporation. Portions created by Netscape are
- * Copyright (C) 1994-2000 Netscape Communications Corporation. All
- * Rights Reserved.
- *
- * Contributor(s):
- *
- * Alternatively, the contents of this file may be used under the
- * terms of the GNU General Public License Version 2 or later (the
- * "GPL"), in which case the provisions of the GPL are applicable
- * instead of those above. If you wish to allow use of your
- * version of this file only under the terms of the GPL and not to
- * allow others to use your version of this file under the MPL,
- * indicate your decision by deleting the provisions above and
- * replace them with the notice and other provisions required by
- * the GPL. If you do not delete the provisions above, a recipient
- * may use your version of this file under either the MPL or the
- * GPL.
- */
- /*
- * cert.h - public data structures and prototypes for the certificate library
- *
- * $Id: cert.h,v 1.3 2000/09/09 06:08:43 nelsonb%netscape.com Exp $
- */
- #ifndef _CERT_H_
- #define _CERT_H_
- #include "plarena.h"
- #include "plhash.h"
- #include "prlong.h"
- #include "prlog.h"
- #include "seccomon.h"
- #include "secdert.h"
- #include "secoidt.h"
- #include "keyt.h"
- #include "certt.h"
- SEC_BEGIN_PROTOS
-
- /****************************************************************************
- *
- * RFC1485 ascii to/from X.? RelativeDistinguishedName (aka CERTName)
- *
- ****************************************************************************/
- /*
- ** Convert an ascii RFC1485 encoded name into its CERTName equivalent.
- */
- extern CERTName *CERT_AsciiToName(char *string);
- /*
- ** Convert an CERTName into its RFC1485 encoded equivalent.
- */
- extern char *CERT_NameToAscii(CERTName *name);
- extern CERTAVA *CERT_CopyAVA(PRArenaPool *arena, CERTAVA *src);
- /*
- ** Examine an AVA and return the tag that refers to it. The AVA tags are
- ** defined as SEC_OID_AVA*.
- */
- extern SECOidTag CERT_GetAVATag(CERTAVA *ava);
- /*
- ** Compare two AVA's, returning the difference between them.
- */
- extern SECComparison CERT_CompareAVA(CERTAVA *a, CERTAVA *b);
- /*
- ** Create an RDN (relative-distinguished-name). The argument list is a
- ** NULL terminated list of AVA's.
- */
- extern CERTRDN *CERT_CreateRDN(PRArenaPool *arena, CERTAVA *avas, ...);
- /*
- ** Make a copy of "src" storing it in "dest".
- */
- extern SECStatus CERT_CopyRDN(PRArenaPool *arena, CERTRDN *dest, CERTRDN *src);
- /*
- ** Destory an RDN object.
- ** "rdn" the RDN to destroy
- ** "freeit" if PR_TRUE then free the object as well as its sub-objects
- */
- extern void CERT_DestroyRDN(CERTRDN *rdn, PRBool freeit);
- /*
- ** Add an AVA to an RDN.
- ** "rdn" the RDN to add to
- ** "ava" the AVA to add
- */
- extern SECStatus CERT_AddAVA(PRArenaPool *arena, CERTRDN *rdn, CERTAVA *ava);
- /*
- ** Compare two RDN's, returning the difference between them.
- */
- extern SECComparison CERT_CompareRDN(CERTRDN *a, CERTRDN *b);
- /*
- ** Create an X.500 style name using a NULL terminated list of RDN's.
- */
- extern CERTName *CERT_CreateName(CERTRDN *rdn, ...);
- /*
- ** Make a copy of "src" storing it in "dest". Memory is allocated in
- ** "dest" for each of the appropriate sub objects. Memory is not freed in
- ** "dest" before allocation is done (use CERT_DestroyName(dest, PR_FALSE) to
- ** do that).
- */
- extern SECStatus CERT_CopyName(PRArenaPool *arena, CERTName *dest, CERTName *src);
- /*
- ** Destroy a Name object.
- ** "name" the CERTName to destroy
- ** "freeit" if PR_TRUE then free the object as well as its sub-objects
- */
- extern void CERT_DestroyName(CERTName *name);
- /*
- ** Add an RDN to a name.
- ** "name" the name to add the RDN to
- ** "rdn" the RDN to add to name
- */
- extern SECStatus CERT_AddRDN(CERTName *name, CERTRDN *rdn);
- /*
- ** Compare two names, returning the difference between them.
- */
- extern SECComparison CERT_CompareName(CERTName *a, CERTName *b);
- /*
- ** Convert a CERTName into something readable
- */
- extern char *CERT_FormatName (CERTName *name);
- /*
- ** Convert a der-encoded integer to a hex printable string form.
- ** Perhaps this should be a SEC function but it's only used for certs.
- */
- extern char *CERT_Hexify (SECItem *i, int do_colon);
- /**************************************************************************************
- *
- * Certificate handling operations
- *
- **************************************************************************************/
- /*
- ** Create a new validity object given two unix time values.
- ** "notBefore" the time before which the validity is not valid
- ** "notAfter" the time after which the validity is not valid
- */
- extern CERTValidity *CERT_CreateValidity(int64 notBefore, int64 notAfter);
- /*
- ** Destroy a validity object.
- ** "v" the validity to destroy
- ** "freeit" if PR_TRUE then free the object as well as its sub-objects
- */
- extern void CERT_DestroyValidity(CERTValidity *v);
- /*
- ** Copy the "src" object to "dest". Memory is allocated in "dest" for
- ** each of the appropriate sub-objects. Memory in "dest" is not freed
- ** before memory is allocated (use CERT_DestroyValidity(v, PR_FALSE) to do
- ** that).
- */
- extern SECStatus CERT_CopyValidity
- (PRArenaPool *arena, CERTValidity *dest, CERTValidity *src);
- /*
- ** Create a new certificate object. The result must be wrapped with an
- ** CERTSignedData to create a signed certificate.
- ** "serialNumber" the serial number
- ** "issuer" the name of the certificate issuer
- ** "validity" the validity period of the certificate
- ** "req" the certificate request that prompted the certificate issuance
- */
- extern CERTCertificate *
- CERT_CreateCertificate (unsigned long serialNumber, CERTName *issuer,
- CERTValidity *validity, CERTCertificateRequest *req);
- /*
- ** Destroy a certificate object
- ** "cert" the certificate to destroy
- ** NOTE: certificate's are reference counted. This call decrements the
- ** reference count, and if the result is zero, then the object is destroyed
- ** and optionally freed.
- */
- extern void CERT_DestroyCertificate(CERTCertificate *cert);
- /*
- ** Make a shallow copy of a certificate "c". Just increments the
- ** reference count on "c".
- */
- extern CERTCertificate *CERT_DupCertificate(CERTCertificate *c);
- /*
- ** Create a new certificate request. This result must be wrapped with an
- ** CERTSignedData to create a signed certificate request.
- ** "name" the subject name (who the certificate request is from)
- ** "spki" describes/defines the public key the certificate is for
- ** "attributes" if non-zero, some optional attribute data
- */
- extern CERTCertificateRequest *
- CERT_CreateCertificateRequest (CERTName *name, CERTSubjectPublicKeyInfo *spki,
- SECItem **attributes);
- /*
- ** Destroy a certificate-request object
- ** "r" the certificate-request to destroy
- ** "freeit" if PR_TRUE then free the object as well as its sub-objects
- */
- extern void CERT_DestroyCertificateRequest(CERTCertificateRequest *r);
- /*
- ** Extract a public key object from a SubjectPublicKeyInfo
- */
- extern SECKEYPublicKey *CERT_ExtractPublicKey(CERTCertificate *cert);
- /*
- * used to get a public key with Key Material ID. Only used for fortezza V1
- * certificates.
- */
- extern SECKEYPublicKey *CERT_KMIDPublicKey(CERTCertificate *cert);
- /*
- ** Retrieve the Key Type associated with the cert we're dealing with
- */
- extern KeyType CERT_GetCertKeyType (CERTSubjectPublicKeyInfo *spki);
- /*
- ** Initialize the certificate database. This is called to create
- ** the initial list of certificates in the database.
- */
- extern SECStatus CERT_InitCertDB(CERTCertDBHandle *handle);
- /*
- ** Default certificate database routines
- */
- extern void CERT_SetDefaultCertDB(CERTCertDBHandle *handle);
- extern CERTCertDBHandle *CERT_GetDefaultCertDB(void);
- extern CERTCertList *CERT_GetCertChainFromCert(CERTCertificate *cert,
- int64 time,
- SECCertUsage usage);
- /************************************************************************************
- *
- * X.500 Name handling operations
- *
- ************************************************************************************/
- /*
- ** Create an AVA (attribute-value-assertion)
- ** "arena" the memory arena to alloc from
- ** "kind" is one of SEC_OID_AVA_*
- ** "valueType" is one of DER_PRINTABLE_STRING, DER_IA5_STRING, or
- ** DER_T61_STRING
- ** "value" is the null terminated string containing the value
- */
- extern CERTAVA *CERT_CreateAVA
- (PRArenaPool *arena, SECOidTag kind, int valueType, char *value);
- /*
- ** Extract the Distinguished Name from a DER encoded certificate
- ** "derCert" is the DER encoded certificate
- ** "derName" is the SECItem that the name is returned in
- */
- extern SECStatus CERT_NameFromDERCert(SECItem *derCert, SECItem *derName);
- /*
- ** Extract the Issuers Distinguished Name from a DER encoded certificate
- ** "derCert" is the DER encoded certificate
- ** "derName" is the SECItem that the name is returned in
- */
- extern SECStatus CERT_IssuerNameFromDERCert(SECItem *derCert,
- SECItem *derName);
- /*
- ** Generate a database search key for a certificate, based on the
- ** issuer and serial number.
- ** "arena" the memory arena to alloc from
- ** "derCert" the DER encoded certificate
- ** "key" the returned key
- */
- extern SECStatus CERT_KeyFromDERCert(PRArenaPool *arena, SECItem *derCert, SECItem *key);
- extern SECStatus CERT_KeyFromIssuerAndSN(PRArenaPool *arena, SECItem *issuer,
- SECItem *sn, SECItem *key);
- /*
- ** Generate a database search key for a crl, based on the
- ** issuer.
- ** "arena" the memory arena to alloc from
- ** "derCrl" the DER encoded crl
- ** "key" the returned key
- */
- extern SECStatus CERT_KeyFromDERCrl(PRArenaPool *arena, SECItem *derCrl, SECItem *key);
- /*
- ** Open the certificate database. Use callback to get name of database.
- */
- extern SECStatus CERT_OpenCertDB(CERTCertDBHandle *handle, PRBool readOnly,
- CERTDBNameFunc namecb, void *cbarg);
- /* Open the certificate database. Use given filename for database. */
- extern SECStatus CERT_OpenCertDBFilename(CERTCertDBHandle *handle,
- char *certdbname, PRBool readOnly);
- /*
- ** Open and initialize a cert database that is entirely in memory. This
- ** can be used when the permanent database can not be opened or created.
- */
- extern SECStatus CERT_OpenVolatileCertDB(CERTCertDBHandle *handle);
- /*
- ** Check the hostname to make sure that it matches the shexp that
- ** is given in the common name of the certificate.
- */
- extern SECStatus CERT_VerifyCertName(CERTCertificate *cert, const char *hostname);
- /*
- ** Add a domain name to the list of names that the user has explicitly
- ** allowed (despite cert name mismatches) for use with a server cert.
- */
- extern SECStatus CERT_AddOKDomainName(CERTCertificate *cert, const char *hostname);
- /*
- ** Decode a DER encoded certificate into an CERTCertificate structure
- ** "derSignedCert" is the DER encoded signed certificate
- ** "copyDER" is true if the DER should be copied, false if the
- ** existing copy should be referenced
- ** "nickname" is the nickname to use in the database. If it is NULL
- ** then a temporary nickname is generated.
- */
- extern CERTCertificate *
- CERT_DecodeDERCertificate (SECItem *derSignedCert, PRBool copyDER, char *nickname);
- /*
- ** Decode a DER encoded CRL/KRL into an CERTSignedCrl structure
- ** "derSignedCrl" is the DER encoded signed crl/krl.
- ** "type" is this a CRL or KRL.
- */
- #define SEC_CRL_TYPE 1
- #define SEC_KRL_TYPE 0
- extern CERTSignedCrl *
- CERT_DecodeDERCrl (PRArenaPool *arena, SECItem *derSignedCrl,int type);
- /* Validate CRL then import it to the dbase. If there is already a CRL with the
- * same CA in the dbase, it will be replaced if derCRL is more up to date.
- * If the process successes, a CRL will be returned. Otherwise, a NULL will
- * be returned. The caller should call PORT_GetError() for the exactly error
- * code.
- */
- extern CERTSignedCrl *
- CERT_ImportCRL (CERTCertDBHandle *handle, SECItem *derCRL, char *url,
- int type, void * wincx);
- extern void CERT_DestroyCrl (CERTSignedCrl *crl);
- /*
- ** Decode a certificate and put it into the temporary certificate database
- */
- extern CERTCertificate *
- CERT_NewTempCertificate (CERTCertDBHandle *handle, SECItem *derCert,
- char *nickname, PRBool isperm, PRBool copyDER);
- /*
- ** Add a certificate to the temporary database.
- ** "dbCert" is the certificate from the perm database.
- ** "isperm" indicates if the cert is in the permanent database.
- */
- extern CERTCertificate *
- CERT_AddTempCertificate (CERTCertDBHandle *handle, certDBEntryCert *entry,
- PRBool isperm);
- /*
- ** Add a temporary certificate to the permanent database.
- ** "cert" is the temporary cert
- ** "nickname" is the permanent nickname to use
- ** "trust" is the certificate trust parameters to assign to the cert
- */
- extern SECStatus
- CERT_AddTempCertToPerm (CERTCertificate *cert, char *nickname, CERTCertTrust *trust);
- /*
- ** Find a certificate in the database
- ** "key" is the database key to look for
- */
- extern CERTCertificate *CERT_FindCertByKey(CERTCertDBHandle *handle, SECItem *key);
- /*
- * Lookup a certificate in the databases without locking
- * "certKey" is the database key to look for
- *
- * XXX - this should be internal, but pkcs 11 needs to call it during a
- * traversal.
- */
- CERTCertificate *
- CERT_FindCertByKeyNoLocking(CERTCertDBHandle *handle, SECItem *certKey);
- /*
- ** Find a certificate in the database by name
- ** "name" is the distinguished name to look up
- */
- extern CERTCertificate *
- CERT_FindCertByName (CERTCertDBHandle *handle, SECItem *name);
- /*
- ** Find a certificate in the database by name
- ** "name" is the distinguished name to look up (in ascii)
- */
- extern CERTCertificate *
- CERT_FindCertByNameString (CERTCertDBHandle *handle, char *name);
- /*
- ** Find a certificate in the database by name and keyid
- ** "name" is the distinguished name to look up
- ** "keyID" is the value of the subjectKeyID to match
- */
- extern CERTCertificate *
- CERT_FindCertByKeyID (CERTCertDBHandle *handle, SECItem *name, SECItem *keyID);
- /*
- ** Generate a certificate key from the issuer and serialnumber, then look it
- ** up in the database. Return the cert if found.
- ** "issuerAndSN" is the issuer and serial number to look for
- */
- extern CERTCertificate *
- CERT_FindCertByIssuerAndSN (CERTCertDBHandle *handle, CERTIssuerAndSN *issuerAndSN);
- /*
- ** Find a certificate in the database by a nickname
- ** "nickname" is the ascii string nickname to look for
- */
- extern CERTCertificate *
- CERT_FindCertByNickname (CERTCertDBHandle *handle, char *nickname);
- /*
- ** Find a certificate in the database by a DER encoded certificate
- ** "derCert" is the DER encoded certificate
- */
- extern CERTCertificate *
- CERT_FindCertByDERCert(CERTCertDBHandle *handle, SECItem *derCert);
- /*
- ** Find a certificate in the database by a email address
- ** "emailAddr" is the email address to look up
- */
- CERTCertificate *
- CERT_FindCertByEmailAddr(CERTCertDBHandle *handle, char *emailAddr);
- /*
- ** Find a certificate in the database by a email address or nickname
- ** "name" is the email address or nickname to look up
- */
- CERTCertificate *
- CERT_FindCertByNicknameOrEmailAddr(CERTCertDBHandle *handle, char *name);
- /*
- ** Find a certificate in the database by a digest of a subject public key
- ** "spkDigest" is the digest to look up
- */
- extern CERTCertificate *
- CERT_FindCertBySPKDigest(CERTCertDBHandle *handle, SECItem *spkDigest);
- /*
- * Find the issuer of a cert
- */
- CERTCertificate *
- CERT_FindCertIssuer(CERTCertificate *cert, int64 validTime, SECCertUsage usage);
- /*
- ** Delete a certificate from the temporary database
- ** "cert" is the certificate to be deleted
- */
- extern SECStatus CERT_DeleteTempCertificate(CERTCertificate *cert);
- /*
- ** Flush and close the permanent database.
- */
- extern void CERT_ClosePermCertDB(CERTCertDBHandle *handle);
- /*
- ** Check the validity times of a certificate vs. time 't', allowing
- ** some slop for broken clocks and stuff.
- ** "cert" is the certificate to be checked
- ** "t" is the time to check against
- ** "allowOverride" if true then check to see if the invalidity has
- ** been overridden by the user.
- */
- extern SECCertTimeValidity CERT_CheckCertValidTimes(CERTCertificate *cert,
- int64 t,
- PRBool allowOverride);
- /*
- ** WARNING - this function is depricated, and will either go away or have
- ** a new API in the near future.
- **
- ** Check the validity times of a certificate vs. the current time, allowing
- ** some slop for broken clocks and stuff.
- ** "cert" is the certificate to be checked
- */
- extern SECStatus CERT_CertTimesValid(CERTCertificate *cert);
- /*
- ** Extract the validity times from a certificate
- ** "c" is the certificate
- ** "notBefore" is the start of the validity period
- ** "notAfter" is the end of the validity period
- */
- extern SECStatus
- CERT_GetCertTimes (CERTCertificate *c, int64 *notBefore, int64 *notAfter);
- /*
- ** Extract the issuer and serial number from a certificate
- */
- extern CERTIssuerAndSN *CERT_GetCertIssuerAndSN(PRArenaPool *,
- CERTCertificate *);
- /*
- ** verify the signature of a signed data object with a given certificate
- ** "sd" the signed data object to be verified
- ** "cert" the certificate to use to check the signature
- */
- extern SECStatus CERT_VerifySignedData(CERTSignedData *sd,
- CERTCertificate *cert,
- int64 t,
- void *wincx);
- /*
- ** verify a certificate by checking validity times against a certain time,
- ** that we trust the issuer, and that the signature on the certificate is
- ** valid.
- ** "cert" the certificate to verify
- ** "checkSig" only check signatures if true
- */
- extern SECStatus
- CERT_VerifyCert(CERTCertDBHandle *handle, CERTCertificate *cert,
- PRBool checkSig, SECCertUsage certUsage, int64 t,
- void *wincx, CERTVerifyLog *log);
- /* same as above, but uses current time */
- extern SECStatus
- CERT_VerifyCertNow(CERTCertDBHandle *handle, CERTCertificate *cert,
- PRBool checkSig, SECCertUsage certUsage, void *wincx);
- /*
- ** This must only be called on a cert that is known to have an issuer
- ** with an invalid time
- */
- extern CERTCertificate *
- CERT_FindExpiredIssuer (CERTCertDBHandle *handle, CERTCertificate *cert);
- /*
- ** Read a base64 ascii encoded DER certificate and convert it to our
- ** internal format.
- ** "certstr" is a null-terminated string containing the certificate
- */
- extern CERTCertificate *CERT_ConvertAndDecodeCertificate(char *certstr);
- /*
- ** Read a certificate in some foreign format, and convert it to our
- ** internal format.
- ** "certbuf" is the buffer containing the certificate
- ** "certlen" is the length of the buffer
- ** NOTE - currently supports netscape base64 ascii encoded raw certs
- ** and netscape binary DER typed files.
- */
- extern CERTCertificate *CERT_DecodeCertFromPackage(char *certbuf, int certlen);
- extern SECStatus
- CERT_ImportCAChain (SECItem *certs, int numcerts, SECCertUsage certUsage);
- /*
- ** Read a certificate chain in some foreign format, and pass it to a
- ** callback function.
- ** "certbuf" is the buffer containing the certificate
- ** "certlen" is the length of the buffer
- ** "f" is the callback function
- ** "arg" is the callback argument
- */
- typedef SECStatus (*CERTImportCertificateFunc)
- (void *arg, SECItem **certs, int numcerts);
- extern SECStatus
- CERT_DecodeCertPackage(char *certbuf, int certlen, CERTImportCertificateFunc f,
- void *arg);
- /*
- ** Pretty print a certificate in HTML
- ** "cert" is the certificate to print
- ** "showImages" controls whether or not to use about:security URLs
- ** for subject and issuer images. This should only be true
- ** in the browser.
- */
- extern char *CERT_HTMLCertInfo(CERTCertificate *cert, PRBool showImages,
- PRBool showIssuer);
- /*
- ** Returns the value of an AVA. This was a formerly static
- ** function that has been exposed due to the need to decode
- ** and convert unicode strings to UTF8.
- **
- ** XXX This function resides in certhtml.c, should it be
- ** moved elsewhere?
- */
- extern SECItem *CERT_DecodeAVAValue(SECItem *derAVAValue);
- /*
- ** extract various element strings from a distinguished name.
- ** "name" the distinguished name
- */
- extern char *CERT_GetCommonName(CERTName *name);
- extern char *CERT_GetCertificateEmailAddress(CERTCertificate *cert);
- extern char *CERT_GetCertEmailAddress(CERTName *name);
- extern char *CERT_GetCommonName(CERTName *name);
- extern char *CERT_GetCountryName(CERTName *name);
- extern char *CERT_GetLocalityName(CERTName *name);
- extern char *CERT_GetStateName(CERTName *name);
- extern char *CERT_GetOrgName(CERTName *name);
- extern char *CERT_GetOrgUnitName(CERTName *name);
- extern char *CERT_GetDomainComponentName(CERTName *name);
- extern char *CERT_GetCertUid(CERTName *name);
- /* manipulate the trust parameters of a certificate */
- extern SECStatus CERT_GetCertTrust(CERTCertificate *cert, CERTCertTrust *trust);
- extern SECStatus
- CERT_ChangeCertTrust (CERTCertDBHandle *handle, CERTCertificate *cert,
- CERTCertTrust *trust);
- extern SECStatus
- CERT_ChangeCertTrustByUsage(CERTCertDBHandle *certdb, CERTCertificate *cert,
- SECCertUsage usage);
- /*************************************************************************
- *
- * manipulate the extensions of a certificate
- *
- ************************************************************************/
- /*
- ** Set up a cert for adding X509v3 extensions. Returns an opaque handle
- ** used by the next two routines.
- ** "cert" is the certificate we are adding extensions to
- */
- extern void *CERT_StartCertExtensions(CERTCertificate *cert);
- /*
- ** Add an extension to a certificate.
- ** "exthandle" is the handle returned by the previous function
- ** "idtag" is the integer tag for the OID that should ID this extension
- ** "value" is the value of the extension
- ** "critical" is the critical extension flag
- ** "copyData" is a flag indicating whether the value data should be
- ** copied.
- */
- extern SECStatus CERT_AddExtension (void *exthandle, int idtag,
- SECItem *value, PRBool critical, PRBool copyData);
- extern SECStatus CERT_AddExtensionByOID (void *exthandle, SECItem *oid,
- SECItem *value, PRBool critical, PRBool copyData);
- extern SECStatus CERT_EncodeAndAddExtension
- (void *exthandle, int idtag, void *value, PRBool critical,
- const SEC_ASN1Template *atemplate);
- extern SECStatus CERT_EncodeAndAddBitStrExtension
- (void *exthandle, int idtag, SECItem *value, PRBool critical);
- /*
- ** Finish adding cert extensions. Does final processing on extension
- ** data, putting it in the right format, and freeing any temporary
- ** storage.
- ** "exthandle" is the handle used to add extensions to a certificate
- */
- extern SECStatus CERT_FinishExtensions(void *exthandle);
- /* If the extension is found, return its criticality and value.
- ** This allocate storage for the returning extension value.
- */
- extern SECStatus CERT_GetExtenCriticality
- (CERTCertExtension **extensions, int tag, PRBool *isCritical);
- extern void
- CERT_DestroyOidSequence(CERTOidSequence *oidSeq);
- /****************************************************************************
- *
- * DER encode and decode extension values
- *
- ****************************************************************************/
- /* Encode the value of the basicConstraint extension.
- ** arena - where to allocate memory for the encoded value.
- ** value - extension value to encode
- ** encodedValue - output encoded value
- */
- extern SECStatus CERT_EncodeBasicConstraintValue
- (PRArenaPool *arena, CERTBasicConstraints *value, SECItem *encodedValue);
- /*
- ** Encode the value of the authorityKeyIdentifier extension.
- */
- extern SECStatus CERT_EncodeAuthKeyID
- (PRArenaPool *arena, CERTAuthKeyID *value, SECItem *encodedValue);
- /*
- ** Encode the value of the crlDistributionPoints extension.
- */
- extern SECStatus CERT_EncodeCRLDistributionPoints
- (PRArenaPool *arena, CERTCrlDistributionPoints *value,SECItem *derValue);
- /*
- ** Decodes a DER encoded basicConstaint extension value into a readable format
- ** value - decoded value
- ** encodedValue - value to decoded
- */
- extern SECStatus CERT_DecodeBasicConstraintValue
- (CERTBasicConstraints *value, SECItem *encodedValue);
- /* Decodes a DER encoded authorityKeyIdentifier extension value into a
- ** readable format.
- ** arena - where to allocate memory for the decoded value
- ** encodedValue - value to be decoded
- ** Returns a CERTAuthKeyID structure which contains the decoded value
- */
- extern CERTAuthKeyID *CERT_DecodeAuthKeyID
- (PRArenaPool *arena, SECItem *encodedValue);
- /* Decodes a DER encoded crlDistributionPoints extension value into a
- ** readable format.
- ** arena - where to allocate memory for the decoded value
- ** der - value to be decoded
- ** Returns a CERTCrlDistributionPoints structure which contains the
- ** decoded value
- */
- extern CERTCrlDistributionPoints * CERT_DecodeCRLDistributionPoints
- (PRArenaPool *arena, SECItem *der);
- /* Extract certain name type from a generalName */
- extern void *CERT_GetGeneralNameByType
- (CERTGeneralName *genNames, CERTGeneralNameType type, PRBool derFormat);
- extern CERTOidSequence *
- CERT_DecodeOidSequence(SECItem *seqItem);
- /****************************************************************************
- *
- * Find extension values of a certificate
- *
- ***************************************************************************/
- extern SECStatus CERT_FindCertExtension
- (CERTCertificate *cert, int tag, SECItem *value);
- extern SECStatus CERT_FindNSCertTypeExtension
- (CERTCertificate *cert, SECItem *value);
- extern char * CERT_FindNSStringExtension (CERTCertificate *cert, int oidtag);
- extern SECStatus CERT_FindIssuerCertExtension
- (CERTCertificate *cert, int tag, SECItem *value);
- extern SECStatus CERT_FindCertExtensionByOID
- (CERTCertificate *cert, SECItem *oid, SECItem *value);
- extern char *CERT_FindCertURLExtension (CERTCertificate *cert, int tag,
- int catag);
- /* Returns the decoded value of the authKeyID extension.
- ** Note that this uses passed in the arena to allocate storage for the result
- */
- extern CERTAuthKeyID * CERT_FindAuthKeyIDExten (PRArenaPool *arena,CERTCertificate *cert);
- /* Returns the decoded value of the basicConstraint extension.
- */
- extern SECStatus CERT_FindBasicConstraintExten
- (CERTCertificate *cert, CERTBasicConstraints *value);
- /* Returns the decoded value of the crlDistributionPoints extension.
- ** Note that the arena in cert is used to allocate storage for the result
- */
- extern CERTCrlDistributionPoints * CERT_FindCRLDistributionPoints
- (CERTCertificate *cert);
- /* Returns value of the keyUsage extension. This uses PR_Alloc to allocate
- ** buffer for the decoded value, The caller should free up the storage
- ** allocated in value->data.
- */
- extern SECStatus CERT_FindKeyUsageExtension (CERTCertificate *cert,
- SECItem *value);
- /* Return the decoded value of the subjectKeyID extension. The caller should
- ** free up the storage allocated in retItem->data.
- */
- extern SECStatus CERT_FindSubjectKeyIDExten (CERTCertificate *cert,
- SECItem *retItem);
- /*
- ** If cert is a v3 certificate, and a critical keyUsage extension is included,
- ** then check the usage against the extension value. If a non-critical
- ** keyUsage extension is included, this will return SECSuccess without
- ** checking, since the extension is an advisory field, not a restriction.
- ** If cert is not a v3 certificate, this will return SECSuccess.
- ** cert - certificate
- ** usage - one of the x.509 v3 the Key Usage Extension flags
- */
- extern SECStatus CERT_CheckCertUsage (CERTCertificate *cert,
- unsigned char usage);
- /****************************************************************************
- *
- * CRL v2 Extensions supported routines
- *
- ****************************************************************************/
- extern SECStatus CERT_FindCRLExtensionByOID
- (CERTCrl *crl, SECItem *oid, SECItem *value);
- extern SECStatus CERT_FindCRLExtension
- (CERTCrl *crl, int tag, SECItem *value);
- extern SECStatus
- CERT_FindInvalidDateExten (CERTCrl *crl, int64 *value);
- extern void *CERT_StartCRLExtensions (CERTCrl *crl);
- extern CERTCertNicknames *CERT_GetCertNicknames (CERTCertDBHandle *handle,
- int what, void *wincx);
- /*
- ** Finds the crlNumber extension and decodes its value into 'value'
- */
- extern SECStatus CERT_FindCRLNumberExten (CERTCrl *crl, CERTCrlNumber *value);
- extern void CERT_FreeNicknames(CERTCertNicknames *nicknames);
- extern PRBool CERT_CompareCerts(CERTCertificate *c1, CERTCertificate *c2);
- extern PRBool CERT_CompareCertsForRedirection(CERTCertificate *c1,
- CERTCertificate *c2);
- /*
- ** Generate an array of the Distinguished Names that the given cert database
- ** "trusts"
- */
- extern CERTDistNames *CERT_GetSSLCACerts(CERTCertDBHandle *handle);
- extern void CERT_FreeDistNames(CERTDistNames *names);
- /*
- ** Generate an array of Distinguished names from an array of nicknames
- */
- extern CERTDistNames *CERT_DistNamesFromNicknames
- (CERTCertDBHandle *handle, char **nicknames, int nnames);
- /*
- ** Generate a certificate chain from a certificate.
- */
- extern CERTCertificateList *
- CERT_CertChainFromCert(CERTCertificate *cert, SECCertUsage usage,
- PRBool includeRoot);
- extern CERTCertificateList *
- CERT_CertListFromCert(CERTCertificate *cert);
- extern CERTCertificateList *
- CERT_DupCertList(CERTCertificateList * oldList);
- extern void CERT_DestroyCertificateList(CERTCertificateList *list);
- /* is cert a newer than cert b? */
- PRBool CERT_IsNewer(CERTCertificate *certa, CERTCertificate *certb);
- typedef SECStatus (* CERTCertCallback)(CERTCertificate *cert, void *arg);
- SECStatus
- CERT_TraversePermCertsForSubject(CERTCertDBHandle *handle, SECItem *derSubject,
- CERTCertCallback cb, void *cbarg);
- int
- CERT_NumPermCertsForSubject(CERTCertDBHandle *handle, SECItem *derSubject);
- SECStatus
- CERT_TraversePermCertsForNickname(CERTCertDBHandle *handle, char *nickname,
- CERTCertCallback cb, void *cbarg);
- int
- CERT_NumPermCertsForNickname(CERTCertDBHandle *handle, char *nickname);
- int
- CERT_NumCertsForCertSubject(CERTCertificate *cert);
- int
- CERT_NumPermCertsForCertSubject(CERTCertificate *cert);
- SECStatus
- CERT_TraverseCertsForSubject(CERTCertDBHandle *handle,
- CERTSubjectList *subjectList,
- CERTCertCallback cb, void *cbarg);
- /* currently a stub for address book */
- PRBool
- CERT_IsCertRevoked(CERTCertificate *cert);
- void
- CERT_DestroyCertArray(CERTCertificate **certs, unsigned int ncerts);
- /* convert an email address to lower case */
- char *CERT_FixupEmailAddr(char *emailAddr);
- /* decode string representation of trust flags into trust struct */
- SECStatus
- CERT_DecodeTrustString(CERTCertTrust *trust, char *trusts);
- /* encode trust struct into string representation of trust flags */
- char *
- CERT_EncodeTrustString(CERTCertTrust *trust);
- /* find the next or prev cert in a subject list */
- CERTCertificate *
- CERT_PrevSubjectCert(CERTCertificate *cert);
- CERTCertificate *
- CERT_NextSubjectCert(CERTCertificate *cert);
- /*
- * import a collection of certs into the temporary or permanent cert
- * database
- */
- SECStatus
- CERT_ImportCerts(CERTCertDBHandle *certdb, SECCertUsage usage,
- unsigned int ncerts, SECItem **derCerts,
- CERTCertificate ***retCerts, PRBool keepCerts,
- PRBool caOnly, char *nickname);
- SECStatus
- CERT_SaveImportedCert(CERTCertificate *cert, SECCertUsage usage,
- PRBool caOnly, char *nickname);
- char *
- CERT_MakeCANickname(CERTCertificate *cert);
- PRBool
- CERT_IsCACert(CERTCertificate *cert, unsigned int *rettype);
- SECStatus
- CERT_SaveSMimeProfile(CERTCertificate *cert, SECItem *emailProfile,
- SECItem *profileTime);
- /*
- * find the smime symmetric capabilities profile for a given cert
- */
- SECItem *
- CERT_FindSMimeProfile(CERTCertificate *cert);
- int
- CERT_GetDBContentVersion(CERTCertDBHandle *handle);
- void
- CERT_SetDBContentVersion(int version, CERTCertDBHandle *handle);
- SECStatus
- CERT_AddNewCerts(CERTCertDBHandle *handle);
- CERTPackageType
- CERT_CertPackageType(SECItem *package, SECItem *certitem);
- CERTCertificatePolicies *
- CERT_DecodeCertificatePoliciesExtension(SECItem *extnValue);
- void
- CERT_DestroyCertificatePoliciesExtension(CERTCertificatePolicies *policies);
- CERTUserNotice *
- CERT_DecodeUserNotice(SECItem *noticeItem);
- void
- CERT_DestroyUserNotice(CERTUserNotice *userNotice);
- typedef char * (* CERTPolicyStringCallback)(char *org,
- unsigned long noticeNumber,
- void *arg);
- void
- CERT_SetCAPolicyStringCallback(CERTPolicyStringCallback cb, void *cbarg);
- char *
- CERT_GetCertCommentString(CERTCertificate *cert);
- PRBool
- CERT_GovtApprovedBitSet(CERTCertificate *cert);
- SECStatus
- CERT_AddPermNickname(CERTCertificate *cert, char *nickname);
- /*
- * Given a cert, find the cert with the same subject name that
- * has the given key usage. If the given cert has the correct keyUsage, then
- * return it, otherwise search the list in order.
- */
- CERTCertificate *
- CERT_FindCertByUsage(CERTCertificate *basecert, unsigned int requiredKeyUsage);
- CERTCertList *
- CERT_MatchUserCert(CERTCertDBHandle *handle,
- SECCertUsage usage,
- int nCANames, char **caNames,
- void *proto_win);
- CERTCertList *
- CERT_NewCertList(void);
- void
- CERT_DestroyCertList(CERTCertList *certs);
- /* remove the node and free the cert */
- void
- CERT_RemoveCertListNode(CERTCertListNode *node);
- SECStatus
- CERT_AddCertToListTail(CERTCertList *certs, CERTCertificate *cert);
- typedef PRBool (* CERTSortCallback)(CERTCertificate *certa,
- CERTCertificate *certb,
- void *arg);
- SECStatus
- CERT_AddCertToListSorted(CERTCertList *certs, CERTCertificate *cert,
- CERTSortCallback f, void *arg);
- /* callback for CERT_AddCertToListSorted that sorts based on validity
- * period and a given time.
- */
- PRBool
- CERT_SortCBValidity(CERTCertificate *certa,
- CERTCertificate *certb,
- void *arg);
- SECStatus
- CERT_CheckForEvilCert(CERTCertificate *cert);
- CERTGeneralName *
- CERT_GetCertificateNames(CERTCertificate *cert, PRArenaPool *arena);
- int
- CERT_GetNamesLength(CERTGeneralName *names);
- CERTCertificate *
- CERT_CompareNameSpace(CERTCertificate *cert,
- CERTGeneralName *namesList,
- SECItem *namesListIndex,
- PRArenaPool *arena,
- CERTCertDBHandle *handle);
- SECStatus
- CERT_EncodeSubjectKeyID(PRArenaPool *arena, char *value, int len, SECItem *encodedValue);
- char *
- CERT_GetNickName(CERTCertificate *cert, CERTCertDBHandle *handle, PRArenaPool *nicknameArena);
- /*
- * Creates or adds to a list of all certs with a give subject name, sorted by
- * validity time, newest first. Invalid certs are considered older than
- * valid certs. If validOnly is set, do not include invalid certs on list.
- */
- CERTCertList *
- CERT_CreateSubjectCertList(CERTCertList *certList, CERTCertDBHandle *handle,
- SECItem *name, int64 sorttime, PRBool validOnly);
- /*
- * Creates or adds to a list of all certs with a give nickname, sorted by
- * validity time, newest first. Invalid certs are considered older than valid
- * certs. If validOnly is set, do not include invalid certs on list.
- */
- CERTCertList *
- CERT_CreateNicknameCertList(CERTCertList *certList, CERTCertDBHandle *handle,
- char *nickname, int64 sorttime, PRBool validOnly);
- /*
- * Creates or adds to a list of all certs with a give email addr, sorted by
- * validity time, newest first. Invalid certs are considered older than valid
- * certs. If validOnly is set, do not include invalid certs on list.
- */
- CERTCertList *
- CERT_CreateEmailAddrCertList(CERTCertList *certList, CERTCertDBHandle *handle,
- char *emailAddr, int64 sorttime, PRBool validOnly);
- /*
- * remove certs from a list that don't have keyUsage and certType
- * that match the given usage.
- */
- SECStatus
- CERT_FilterCertListByUsage(CERTCertList *certList, SECCertUsage usage,
- PRBool ca);
- /*
- * check the key usage of a cert against a set of required values
- */
- SECStatus
- CERT_CheckKeyUsage(CERTCertificate *cert, unsigned int requiredUsage);
- /*
- * return required key usage and cert type based on cert usage
- */
- SECStatus
- CERT_KeyUsageAndTypeForCertUsage(SECCertUsage usage,
- PRBool ca,
- unsigned int *retKeyUsage,
- unsigned int *retCertType);
- /*
- * return required trust flags for various cert usages for CAs
- */
- SECStatus
- CERT_TrustFlagsForCACertUsage(SECCertUsage usage,
- unsigned int *retFlags,
- SECTrustType *retTrustType);
- /*
- * Find all user certificates that match the given criteria.
- *
- * "handle" - database to search
- * "usage" - certificate usage to match
- * "oneCertPerName" - if set then only return the "best" cert per
- * name
- * "validOnly" - only return certs that are curently valid
- * "proto_win" - window handle passed to pkcs11
- */
- CERTCertList *
- CERT_FindUserCertsByUsage(CERTCertDBHandle *handle,
- SECCertUsage usage,
- PRBool oneCertPerName,
- PRBool validOnly,
- void *proto_win);
- /*
- * Find a user certificate that matchs the given criteria.
- *
- * "handle" - database to search
- * "nickname" - nickname to match
- * "usage" - certificate usage to match
- * "validOnly" - only return certs that are curently valid
- * "proto_win" - window handle passed to pkcs11
- */
- CERTCertificate *
- CERT_FindUserCertByUsage(CERTCertDBHandle *handle,
- char *nickname,
- SECCertUsage usage,
- PRBool validOnly,
- void *proto_win);
- /*
- * Filter a list of certificates, removing those certs that do not have
- * one of the named CA certs somewhere in their cert chain.
- *
- * "certList" - the list of certificates to filter
- * "nCANames" - number of CA names
- * "caNames" - array of CA names in string(rfc 1485) form
- * "usage" - what use the certs are for, this is used when
- * selecting CA certs
- */
- SECStatus
- CERT_FilterCertListByCANames(CERTCertList *certList, int nCANames,
- char **caNames, SECCertUsage usage);
- /*
- * Collect the nicknames from all certs in a CertList. If the cert is not
- * valid, append a string to that nickname.
- *
- * "certList" - the list of certificates
- * "expiredString" - the string to append to the nickname of any expired cert
- * "notYetGoodString" - the string to append to the nickname of any cert
- * that is not yet valid
- */
- CERTCertNicknames *
- CERT_NicknameStringsFromCertList(CERTCertList *certList, char *expiredString,
- char *notYetGoodString);
- /*
- * Extract the nickname from a nickmake string that may have either
- * expiredString or notYetGoodString appended.
- *
- * Args:
- * "namestring" - the string containing the nickname, and possibly
- * one of the validity label strings
- * "expiredString" - the expired validity label string
- * "notYetGoodString" - the not yet good validity label string
- *
- * Returns the raw nickname
- */
- char *
- CERT_ExtractNicknameString(char *namestring, char *expiredString,
- char *notYetGoodString);
- /*
- * Given a certificate, return a string containing the nickname, and possibly
- * one of the validity strings, based on the current validity state of the
- * certificate.
- *
- * "arena" - arena to allocate returned string from. If NULL, then heap
- * is used.
- * "cert" - the cert to get nickname from
- * "expiredString" - the string to append to the nickname if the cert is
- * expired.
- * "notYetGoodString" - the string to append to the nickname if the cert is
- * not yet good.
- */
- char *
- CERT_GetCertNicknameWithValidity(PRArenaPool *arena, CERTCertificate *cert,
- char *expiredString, char *notYetGoodString);
- /*
- * Return the string representation of a DER encoded distinguished name
- * "dername" - The DER encoded name to convert
- */
- char *
- CERT_DerNameToAscii(SECItem *dername);
- /*
- * Supported usage values and types:
- * certUsageSSLClient
- * certUsageSSLServer
- * certUsageSSLServerWithStepUp
- * certUsageEmailSigner
- * certUsageEmailRecipient
- * certUsageObjectSigner
- */
- CERTCertificate *
- CERT_FindMatchingCert(CERTCertDBHandle *handle, SECItem *derName,
- CERTCertOwner owner, SECCertUsage usage,
- PRBool preferTrusted, int64 validTime, PRBool validOnly);
- /*********************************************************************/
- /* A thread safe implementation of General Names */
- /*********************************************************************/
- /* Destroy a Single CERTGeneralName */
- void
- CERT_DestroyGeneralName(CERTGeneralName *name);
- /* Destroys a CERTGeneralNameList */
- void
- CERT_DestroyGeneralNameList(CERTGeneralNameList *list);
- /* Creates a CERTGeneralNameList */
- CERTGeneralNameList *
- CERT_CreateGeneralNameList(CERTGeneralName *name);
- /* Compares two CERTGeneralNameList */
- SECStatus
- CERT_CompareGeneralNameLists(CERTGeneralNameList *a, CERTGeneralNameList *b);
- /* returns a copy of the first name of the type requested */
- void *
- CERT_GetGeneralNameFromListByType(CERTGeneralNameList *list,
- CERTGeneralNameType type,
- PRArenaPool *arena);
- /* Adds a name to the tail of the list */
- void
- CERT_AddGeneralNameToList(CERTGeneralNameList *list,
- CERTGeneralNameType type,
- void *data, SECItem *oid);
- /* returns a duplicate of the CERTGeneralNameList */
- CERTGeneralNameList *
- CERT_DupGeneralNameList(CERTGeneralNameList *list);
- /* returns the length of a CERTGeneralName */
- int
- CERT_GetNamesLength(CERTGeneralName *names);
- /*
- * Acquire the global lock on the cert database.
- * This lock is currently used for the following operations:
- * adding or deleting a cert to either the temp or perm databases
- * converting a temp to perm or perm to temp
- * changing(maybe just adding?) the trust of a cert
- * adjusting the reference count of a cert
- */
- void
- CERT_LockDB(CERTCertDBHandle *handle);
- /*
- * Free the global cert database lock.
- */
- void
- CERT_UnlockDB(CERTCertDBHandle *handle);
- /*
- * Get the certificate status checking configuratino data for
- * the certificate database
- */
- CERTStatusConfig *
- CERT_GetStatusConfig(CERTCertDBHandle *handle);
- /*
- * Set the certificate status checking information for the
- * database. The input structure becomes part of the certificate
- * database and will be freed by calling the 'Destroy' function in
- * the configuration object.
- */
- void
- CERT_SetStatusConfig(CERTCertDBHandle *handle, CERTStatusConfig *config);
- /*
- * Acquire the cert reference count lock
- * There is currently one global lock for all certs, but I'm putting a cert
- * arg here so that it will be easy to make it per-cert in the future if
- * that turns out to be necessary.
- */
- void
- CERT_LockCertRefCount(CERTCertificate *cert);
- /*
- * Free the cert reference count lock
- */
- void
- CERT_UnlockCertRefCount(CERTCertificate *cert);
- /*
- * Acquire the cert trust lock
- * There is currently one global lock for all certs, but I'm putting a cert
- * arg here so that it will be easy to make it per-cert in the future if
- * that turns out to be necessary.
- */
- void
- CERT_LockCertTrust(CERTCertificate *cert);
- /*
- * Free the cert trust lock
- */
- void
- CERT_UnlockCertTrust(CERTCertificate *cert);
- /*
- * Digest the cert's subject public key using the specified algorithm.
- * The necessary storage for the digest data is allocated. If "fill" is
- * non-null, the data is put there, otherwise a SECItem is allocated.
- * Allocation from "arena" if it is non-null, heap otherwise. Any problem
- * results in a NULL being returned (and an appropriate error set).
- */
- extern SECItem *
- CERT_SPKDigestValueForCert(PRArenaPool *arena, CERTCertificate *cert,
- SECOidTag digestAlg, SECItem *fill);
- SEC_END_PROTOS
- #endif /* _CERT_H_ */