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

CA认证

开发平台:

WINDOWS

  1. /*
  2.  * The contents of this file are subject to the Mozilla Public
  3.  * License Version 1.1 (the "License"); you may not use this file
  4.  * except in compliance with the License. You may obtain a copy of
  5.  * the License at http://www.mozilla.org/MPL/
  6.  * 
  7.  * Software distributed under the License is distributed on an "AS
  8.  * IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or
  9.  * implied. See the License for the specific language governing
  10.  * rights and limitations under the License.
  11.  * 
  12.  * The Original Code is the Netscape security libraries.
  13.  * 
  14.  * The Initial Developer of the Original Code is Netscape
  15.  * Communications Corporation.  Portions created by Netscape are 
  16.  * Copyright (C) 1994-2000 Netscape Communications Corporation.  All
  17.  * Rights Reserved.
  18.  * 
  19.  * Contributor(s):
  20.  * 
  21.  * Alternatively, the contents of this file may be used under the
  22.  * terms of the GNU General Public License Version 2 or later (the
  23.  * "GPL"), in which case the provisions of the GPL are applicable 
  24.  * instead of those above.  If you wish to allow use of your 
  25.  * version of this file only under the terms of the GPL and not to
  26.  * allow others to use your version of this file under the MPL,
  27.  * indicate your decision by deleting the provisions above and
  28.  * replace them with the notice and other provisions required by
  29.  * the GPL.  If you do not delete the provisions above, a recipient
  30.  * may use your version of this file under either the MPL or the
  31.  * GPL.
  32.  */
  33. /*
  34.  * cert.h - public data structures and prototypes for the certificate library
  35.  *
  36.  * $Id: cert.h,v 1.3 2000/09/09 06:08:43 nelsonb%netscape.com Exp $
  37.  */
  38. #ifndef _CERT_H_
  39. #define _CERT_H_
  40. #include "plarena.h"
  41. #include "plhash.h"
  42. #include "prlong.h"
  43. #include "prlog.h"
  44. #include "seccomon.h"
  45. #include "secdert.h"
  46. #include "secoidt.h"
  47. #include "keyt.h"
  48. #include "certt.h"
  49. SEC_BEGIN_PROTOS
  50.    
  51. /****************************************************************************
  52.  *
  53.  * RFC1485 ascii to/from X.? RelativeDistinguishedName (aka CERTName)
  54.  *
  55.  ****************************************************************************/
  56. /*
  57. ** Convert an ascii RFC1485 encoded name into its CERTName equivalent.
  58. */
  59. extern CERTName *CERT_AsciiToName(char *string);
  60. /*
  61. ** Convert an CERTName into its RFC1485 encoded equivalent.
  62. */
  63. extern char *CERT_NameToAscii(CERTName *name);
  64. extern CERTAVA *CERT_CopyAVA(PRArenaPool *arena, CERTAVA *src);
  65. /*
  66. ** Examine an AVA and return the tag that refers to it. The AVA tags are
  67. ** defined as SEC_OID_AVA*.
  68. */
  69. extern SECOidTag CERT_GetAVATag(CERTAVA *ava);
  70. /*
  71. ** Compare two AVA's, returning the difference between them.
  72. */
  73. extern SECComparison CERT_CompareAVA(CERTAVA *a, CERTAVA *b);
  74. /*
  75. ** Create an RDN (relative-distinguished-name). The argument list is a
  76. ** NULL terminated list of AVA's.
  77. */
  78. extern CERTRDN *CERT_CreateRDN(PRArenaPool *arena, CERTAVA *avas, ...);
  79. /*
  80. ** Make a copy of "src" storing it in "dest".
  81. */
  82. extern SECStatus CERT_CopyRDN(PRArenaPool *arena, CERTRDN *dest, CERTRDN *src);
  83. /*
  84. ** Destory an RDN object.
  85. ** "rdn" the RDN to destroy
  86. ** "freeit" if PR_TRUE then free the object as well as its sub-objects
  87. */
  88. extern void CERT_DestroyRDN(CERTRDN *rdn, PRBool freeit);
  89. /*
  90. ** Add an AVA to an RDN.
  91. ** "rdn" the RDN to add to
  92. ** "ava" the AVA to add
  93. */
  94. extern SECStatus CERT_AddAVA(PRArenaPool *arena, CERTRDN *rdn, CERTAVA *ava);
  95. /*
  96. ** Compare two RDN's, returning the difference between them.
  97. */
  98. extern SECComparison CERT_CompareRDN(CERTRDN *a, CERTRDN *b);
  99. /*
  100. ** Create an X.500 style name using a NULL terminated list of RDN's.
  101. */
  102. extern CERTName *CERT_CreateName(CERTRDN *rdn, ...);
  103. /*
  104. ** Make a copy of "src" storing it in "dest". Memory is allocated in
  105. ** "dest" for each of the appropriate sub objects. Memory is not freed in
  106. ** "dest" before allocation is done (use CERT_DestroyName(dest, PR_FALSE) to
  107. ** do that).
  108. */
  109. extern SECStatus CERT_CopyName(PRArenaPool *arena, CERTName *dest, CERTName *src);
  110. /*
  111. ** Destroy a Name object.
  112. ** "name" the CERTName to destroy
  113. ** "freeit" if PR_TRUE then free the object as well as its sub-objects
  114. */
  115. extern void CERT_DestroyName(CERTName *name);
  116. /*
  117. ** Add an RDN to a name.
  118. ** "name" the name to add the RDN to
  119. ** "rdn" the RDN to add to name
  120. */
  121. extern SECStatus CERT_AddRDN(CERTName *name, CERTRDN *rdn);
  122. /*
  123. ** Compare two names, returning the difference between them.
  124. */
  125. extern SECComparison CERT_CompareName(CERTName *a, CERTName *b);
  126. /*
  127. ** Convert a CERTName into something readable
  128. */
  129. extern char *CERT_FormatName (CERTName *name);
  130. /*
  131. ** Convert a der-encoded integer to a hex printable string form.
  132. ** Perhaps this should be a SEC function but it's only used for certs.
  133. */
  134. extern char *CERT_Hexify (SECItem *i, int do_colon);
  135. /**************************************************************************************
  136.  *
  137.  * Certificate handling operations
  138.  *
  139.  **************************************************************************************/
  140. /*
  141. ** Create a new validity object given two unix time values.
  142. ** "notBefore" the time before which the validity is not valid
  143. ** "notAfter" the time after which the validity is not valid
  144. */
  145. extern CERTValidity *CERT_CreateValidity(int64 notBefore, int64 notAfter);
  146. /*
  147. ** Destroy a validity object.
  148. ** "v" the validity to destroy
  149. ** "freeit" if PR_TRUE then free the object as well as its sub-objects
  150. */
  151. extern void CERT_DestroyValidity(CERTValidity *v);
  152. /*
  153. ** Copy the "src" object to "dest". Memory is allocated in "dest" for
  154. ** each of the appropriate sub-objects. Memory in "dest" is not freed
  155. ** before memory is allocated (use CERT_DestroyValidity(v, PR_FALSE) to do
  156. ** that).
  157. */
  158. extern SECStatus CERT_CopyValidity
  159.    (PRArenaPool *arena, CERTValidity *dest, CERTValidity *src);
  160. /*
  161. ** Create a new certificate object. The result must be wrapped with an
  162. ** CERTSignedData to create a signed certificate.
  163. ** "serialNumber" the serial number
  164. ** "issuer" the name of the certificate issuer
  165. ** "validity" the validity period of the certificate
  166. ** "req" the certificate request that prompted the certificate issuance
  167. */
  168. extern CERTCertificate *
  169. CERT_CreateCertificate (unsigned long serialNumber, CERTName *issuer,
  170. CERTValidity *validity, CERTCertificateRequest *req);
  171. /*
  172. ** Destroy a certificate object
  173. ** "cert" the certificate to destroy
  174. ** NOTE: certificate's are reference counted. This call decrements the
  175. ** reference count, and if the result is zero, then the object is destroyed
  176. ** and optionally freed.
  177. */
  178. extern void CERT_DestroyCertificate(CERTCertificate *cert);
  179. /*
  180. ** Make a shallow copy of a certificate "c". Just increments the
  181. ** reference count on "c".
  182. */
  183. extern CERTCertificate *CERT_DupCertificate(CERTCertificate *c);
  184. /*
  185. ** Create a new certificate request. This result must be wrapped with an
  186. ** CERTSignedData to create a signed certificate request.
  187. ** "name" the subject name (who the certificate request is from)
  188. ** "spki" describes/defines the public key the certificate is for
  189. ** "attributes" if non-zero, some optional attribute data
  190. */
  191. extern CERTCertificateRequest *
  192. CERT_CreateCertificateRequest (CERTName *name, CERTSubjectPublicKeyInfo *spki,
  193.        SECItem **attributes);
  194. /*
  195. ** Destroy a certificate-request object
  196. ** "r" the certificate-request to destroy
  197. ** "freeit" if PR_TRUE then free the object as well as its sub-objects
  198. */
  199. extern void CERT_DestroyCertificateRequest(CERTCertificateRequest *r);
  200. /*
  201. ** Extract a public key object from a SubjectPublicKeyInfo
  202. */
  203. extern SECKEYPublicKey *CERT_ExtractPublicKey(CERTCertificate *cert);
  204. /*
  205.  * used to get a public key with Key Material ID. Only used for fortezza V1
  206.  * certificates.
  207.  */
  208. extern SECKEYPublicKey *CERT_KMIDPublicKey(CERTCertificate *cert);
  209. /*
  210. ** Retrieve the Key Type associated with the cert we're dealing with
  211. */
  212. extern KeyType CERT_GetCertKeyType (CERTSubjectPublicKeyInfo *spki);
  213. /*
  214. ** Initialize the certificate database.  This is called to create
  215. **  the initial list of certificates in the database.
  216. */
  217. extern SECStatus CERT_InitCertDB(CERTCertDBHandle *handle);
  218. /*
  219. ** Default certificate database routines
  220. */
  221. extern void CERT_SetDefaultCertDB(CERTCertDBHandle *handle);
  222. extern CERTCertDBHandle *CERT_GetDefaultCertDB(void);
  223. extern CERTCertList *CERT_GetCertChainFromCert(CERTCertificate *cert, 
  224.        int64 time, 
  225.        SECCertUsage usage);
  226. /************************************************************************************
  227.  *
  228.  * X.500 Name handling operations
  229.  *
  230.  ************************************************************************************/
  231. /*
  232. ** Create an AVA (attribute-value-assertion)
  233. ** "arena" the memory arena to alloc from
  234. ** "kind" is one of SEC_OID_AVA_*
  235. ** "valueType" is one of DER_PRINTABLE_STRING, DER_IA5_STRING, or
  236. **    DER_T61_STRING
  237. ** "value" is the null terminated string containing the value
  238. */
  239. extern CERTAVA *CERT_CreateAVA
  240.    (PRArenaPool *arena, SECOidTag kind, int valueType, char *value);
  241. /*
  242. ** Extract the Distinguished Name from a DER encoded certificate
  243. ** "derCert" is the DER encoded certificate
  244. ** "derName" is the SECItem that the name is returned in
  245. */
  246. extern SECStatus CERT_NameFromDERCert(SECItem *derCert, SECItem *derName);
  247. /*
  248. ** Extract the Issuers Distinguished Name from a DER encoded certificate
  249. ** "derCert" is the DER encoded certificate
  250. ** "derName" is the SECItem that the name is returned in
  251. */
  252. extern SECStatus CERT_IssuerNameFromDERCert(SECItem *derCert, 
  253.     SECItem *derName);
  254. /*
  255. ** Generate a database search key for a certificate, based on the
  256. ** issuer and serial number.
  257. ** "arena" the memory arena to alloc from
  258. ** "derCert" the DER encoded certificate
  259. ** "key" the returned key
  260. */
  261. extern SECStatus CERT_KeyFromDERCert(PRArenaPool *arena, SECItem *derCert, SECItem *key);
  262. extern SECStatus CERT_KeyFromIssuerAndSN(PRArenaPool *arena, SECItem *issuer,
  263.  SECItem *sn, SECItem *key);
  264. /*
  265. ** Generate a database search key for a crl, based on the
  266. ** issuer.
  267. ** "arena" the memory arena to alloc from
  268. ** "derCrl" the DER encoded crl
  269. ** "key" the returned key
  270. */
  271. extern SECStatus CERT_KeyFromDERCrl(PRArenaPool *arena, SECItem *derCrl, SECItem *key);
  272. /*
  273. ** Open the certificate database.  Use callback to get name of database.
  274. */
  275. extern SECStatus CERT_OpenCertDB(CERTCertDBHandle *handle, PRBool readOnly,
  276.  CERTDBNameFunc namecb, void *cbarg);
  277. /* Open the certificate database.  Use given filename for database. */
  278. extern SECStatus CERT_OpenCertDBFilename(CERTCertDBHandle *handle,
  279.  char *certdbname, PRBool readOnly);
  280. /*
  281. ** Open and initialize a cert database that is entirely in memory.  This
  282. ** can be used when the permanent database can not be opened or created.
  283. */
  284. extern SECStatus CERT_OpenVolatileCertDB(CERTCertDBHandle *handle);
  285. /*
  286. ** Check the hostname to make sure that it matches the shexp that
  287. ** is given in the common name of the certificate.
  288. */
  289. extern SECStatus CERT_VerifyCertName(CERTCertificate *cert, const char *hostname);
  290. /*
  291. ** Add a domain name to the list of names that the user has explicitly
  292. ** allowed (despite cert name mismatches) for use with a server cert.
  293. */
  294. extern SECStatus CERT_AddOKDomainName(CERTCertificate *cert, const char *hostname);
  295. /*
  296. ** Decode a DER encoded certificate into an CERTCertificate structure
  297. ** "derSignedCert" is the DER encoded signed certificate
  298. ** "copyDER" is true if the DER should be copied, false if the
  299. ** existing copy should be referenced
  300. ** "nickname" is the nickname to use in the database.  If it is NULL
  301. ** then a temporary nickname is generated.
  302. */
  303. extern CERTCertificate *
  304. CERT_DecodeDERCertificate (SECItem *derSignedCert, PRBool copyDER, char *nickname);
  305. /*
  306. ** Decode a DER encoded CRL/KRL into an CERTSignedCrl structure
  307. ** "derSignedCrl" is the DER encoded signed crl/krl.
  308. ** "type" is this a CRL or KRL.
  309. */
  310. #define SEC_CRL_TYPE 1
  311. #define SEC_KRL_TYPE 0
  312. extern CERTSignedCrl *
  313. CERT_DecodeDERCrl (PRArenaPool *arena, SECItem *derSignedCrl,int type);
  314. /* Validate CRL then import it to the dbase.  If there is already a CRL with the
  315.  * same CA in the dbase, it will be replaced if derCRL is more up to date.  
  316.  * If the process successes, a CRL will be returned.  Otherwise, a NULL will 
  317.  * be returned. The caller should call PORT_GetError() for the exactly error 
  318.  * code.
  319.  */
  320. extern CERTSignedCrl *
  321. CERT_ImportCRL (CERTCertDBHandle *handle, SECItem *derCRL, char *url, 
  322. int type, void * wincx);
  323. extern void CERT_DestroyCrl (CERTSignedCrl *crl);
  324. /*
  325. ** Decode a certificate and put it into the temporary certificate database
  326. */
  327. extern CERTCertificate *
  328. CERT_NewTempCertificate (CERTCertDBHandle *handle, SECItem *derCert,
  329.  char *nickname, PRBool isperm, PRBool copyDER);
  330. /*
  331. ** Add a certificate to the temporary database.
  332. ** "dbCert" is the certificate from the perm database.
  333. ** "isperm" indicates if the cert is in the permanent database.
  334. */
  335. extern CERTCertificate *
  336. CERT_AddTempCertificate (CERTCertDBHandle *handle, certDBEntryCert *entry,
  337.  PRBool isperm);
  338. /*
  339. ** Add a temporary certificate to the permanent database.
  340. **  "cert" is the temporary cert
  341. ** "nickname" is the permanent nickname to use
  342. ** "trust" is the certificate trust parameters to assign to the cert
  343. */
  344. extern SECStatus
  345. CERT_AddTempCertToPerm (CERTCertificate *cert, char *nickname, CERTCertTrust *trust);
  346. /*
  347. ** Find a certificate in the database
  348. ** "key" is the database key to look for
  349. */
  350. extern CERTCertificate *CERT_FindCertByKey(CERTCertDBHandle *handle, SECItem *key);
  351. /*
  352.  * Lookup a certificate in the databases without locking
  353.  * "certKey" is the database key to look for
  354.  *
  355.  * XXX - this should be internal, but pkcs 11 needs to call it during a
  356.  * traversal.
  357.  */
  358. CERTCertificate *
  359. CERT_FindCertByKeyNoLocking(CERTCertDBHandle *handle, SECItem *certKey);
  360. /*
  361. ** Find a certificate in the database by name
  362. ** "name" is the distinguished name to look up
  363. */
  364. extern CERTCertificate *
  365. CERT_FindCertByName (CERTCertDBHandle *handle, SECItem *name);
  366. /*
  367. ** Find a certificate in the database by name
  368. ** "name" is the distinguished name to look up (in ascii)
  369. */
  370. extern CERTCertificate *
  371. CERT_FindCertByNameString (CERTCertDBHandle *handle, char *name);
  372. /*
  373. ** Find a certificate in the database by name and keyid
  374. ** "name" is the distinguished name to look up
  375. ** "keyID" is the value of the subjectKeyID to match
  376. */
  377. extern CERTCertificate *
  378. CERT_FindCertByKeyID (CERTCertDBHandle *handle, SECItem *name, SECItem *keyID);
  379. /*
  380. ** Generate a certificate key from the issuer and serialnumber, then look it
  381. ** up in the database.  Return the cert if found.
  382. ** "issuerAndSN" is the issuer and serial number to look for
  383. */
  384. extern CERTCertificate *
  385. CERT_FindCertByIssuerAndSN (CERTCertDBHandle *handle, CERTIssuerAndSN *issuerAndSN);
  386. /*
  387. ** Find a certificate in the database by a nickname
  388. ** "nickname" is the ascii string nickname to look for
  389. */
  390. extern CERTCertificate *
  391. CERT_FindCertByNickname (CERTCertDBHandle *handle, char *nickname);
  392. /*
  393. ** Find a certificate in the database by a DER encoded certificate
  394. ** "derCert" is the DER encoded certificate
  395. */
  396. extern CERTCertificate *
  397. CERT_FindCertByDERCert(CERTCertDBHandle *handle, SECItem *derCert);
  398. /*
  399. ** Find a certificate in the database by a email address
  400. ** "emailAddr" is the email address to look up
  401. */
  402. CERTCertificate *
  403. CERT_FindCertByEmailAddr(CERTCertDBHandle *handle, char *emailAddr);
  404. /*
  405. ** Find a certificate in the database by a email address or nickname
  406. ** "name" is the email address or nickname to look up
  407. */
  408. CERTCertificate *
  409. CERT_FindCertByNicknameOrEmailAddr(CERTCertDBHandle *handle, char *name);
  410. /*
  411. ** Find a certificate in the database by a digest of a subject public key
  412. ** "spkDigest" is the digest to look up
  413. */
  414. extern CERTCertificate *
  415. CERT_FindCertBySPKDigest(CERTCertDBHandle *handle, SECItem *spkDigest);
  416. /*
  417.  * Find the issuer of a cert
  418.  */
  419. CERTCertificate *
  420. CERT_FindCertIssuer(CERTCertificate *cert, int64 validTime, SECCertUsage usage);
  421. /*
  422. ** Delete a certificate from the temporary database
  423. ** "cert" is the certificate to be deleted
  424. */
  425. extern SECStatus CERT_DeleteTempCertificate(CERTCertificate *cert);
  426. /*
  427. ** Flush and close the permanent database.
  428. */
  429. extern void CERT_ClosePermCertDB(CERTCertDBHandle *handle);
  430. /*
  431. ** Check the validity times of a certificate vs. time 't', allowing
  432. ** some slop for broken clocks and stuff.
  433. ** "cert" is the certificate to be checked
  434. ** "t" is the time to check against
  435. ** "allowOverride" if true then check to see if the invalidity has
  436. ** been overridden by the user.
  437. */
  438. extern SECCertTimeValidity CERT_CheckCertValidTimes(CERTCertificate *cert,
  439.     int64 t,
  440.     PRBool allowOverride);
  441. /*
  442. ** WARNING - this function is depricated, and will either go away or have
  443. ** a new API in the near future.
  444. **
  445. ** Check the validity times of a certificate vs. the current time, allowing
  446. ** some slop for broken clocks and stuff.
  447. ** "cert" is the certificate to be checked
  448. */
  449. extern SECStatus CERT_CertTimesValid(CERTCertificate *cert);
  450. /*
  451. ** Extract the validity times from a certificate
  452. ** "c" is the certificate
  453. ** "notBefore" is the start of the validity period
  454. ** "notAfter" is the end of the validity period
  455. */
  456. extern SECStatus
  457. CERT_GetCertTimes (CERTCertificate *c, int64 *notBefore, int64 *notAfter);
  458. /*
  459. ** Extract the issuer and serial number from a certificate
  460. */
  461. extern CERTIssuerAndSN *CERT_GetCertIssuerAndSN(PRArenaPool *, 
  462. CERTCertificate *);
  463. /*
  464. ** verify the signature of a signed data object with a given certificate
  465. ** "sd" the signed data object to be verified
  466. ** "cert" the certificate to use to check the signature
  467. */
  468. extern SECStatus CERT_VerifySignedData(CERTSignedData *sd,
  469.        CERTCertificate *cert,
  470.        int64 t,
  471.        void *wincx);
  472. /*
  473. ** verify a certificate by checking validity times against a certain time,
  474. ** that we trust the issuer, and that the signature on the certificate is
  475. ** valid.
  476. ** "cert" the certificate to verify
  477. ** "checkSig" only check signatures if true
  478. */
  479. extern SECStatus
  480. CERT_VerifyCert(CERTCertDBHandle *handle, CERTCertificate *cert,
  481. PRBool checkSig, SECCertUsage certUsage, int64 t,
  482. void *wincx, CERTVerifyLog *log);
  483. /* same as above, but uses current time */
  484. extern SECStatus
  485. CERT_VerifyCertNow(CERTCertDBHandle *handle, CERTCertificate *cert,
  486.    PRBool checkSig, SECCertUsage certUsage, void *wincx);
  487. /*
  488. ** This must only be called on a cert that is known to have an issuer
  489. ** with an invalid time
  490. */
  491. extern CERTCertificate *
  492. CERT_FindExpiredIssuer (CERTCertDBHandle *handle, CERTCertificate *cert);
  493. /*
  494. ** Read a base64 ascii encoded DER certificate and convert it to our
  495. ** internal format.
  496. ** "certstr" is a null-terminated string containing the certificate
  497. */
  498. extern CERTCertificate *CERT_ConvertAndDecodeCertificate(char *certstr);
  499. /*
  500. ** Read a certificate in some foreign format, and convert it to our
  501. ** internal format.
  502. ** "certbuf" is the buffer containing the certificate
  503. ** "certlen" is the length of the buffer
  504. ** NOTE - currently supports netscape base64 ascii encoded raw certs
  505. **  and netscape binary DER typed files.
  506. */
  507. extern CERTCertificate *CERT_DecodeCertFromPackage(char *certbuf, int certlen);
  508. extern SECStatus
  509. CERT_ImportCAChain (SECItem *certs, int numcerts, SECCertUsage certUsage);
  510. /*
  511. ** Read a certificate chain in some foreign format, and pass it to a 
  512. ** callback function.
  513. ** "certbuf" is the buffer containing the certificate
  514. ** "certlen" is the length of the buffer
  515. ** "f" is the callback function
  516. ** "arg" is the callback argument
  517. */
  518. typedef SECStatus (*CERTImportCertificateFunc)
  519.    (void *arg, SECItem **certs, int numcerts);
  520. extern SECStatus
  521. CERT_DecodeCertPackage(char *certbuf, int certlen, CERTImportCertificateFunc f,
  522.        void *arg);
  523. /*
  524. ** Pretty print a certificate in HTML
  525. ** "cert" is the certificate to print
  526. ** "showImages" controls whether or not to use about:security URLs
  527. ** for subject and issuer images.  This should only be true
  528. ** in the browser.
  529. */
  530. extern char *CERT_HTMLCertInfo(CERTCertificate *cert, PRBool showImages,
  531.        PRBool showIssuer);
  532. /* 
  533. ** Returns the value of an AVA.  This was a formerly static 
  534. ** function that has been exposed due to the need to decode
  535. ** and convert unicode strings to UTF8.  
  536. **
  537. ** XXX This function resides in certhtml.c, should it be
  538. ** moved elsewhere?
  539. */
  540. extern SECItem *CERT_DecodeAVAValue(SECItem *derAVAValue);
  541. /*
  542. ** extract various element strings from a distinguished name.
  543. ** "name" the distinguished name
  544. */
  545. extern char *CERT_GetCommonName(CERTName *name);
  546. extern char *CERT_GetCertificateEmailAddress(CERTCertificate *cert);
  547. extern char *CERT_GetCertEmailAddress(CERTName *name);
  548. extern char *CERT_GetCommonName(CERTName *name);
  549. extern char *CERT_GetCountryName(CERTName *name);
  550. extern char *CERT_GetLocalityName(CERTName *name);
  551. extern char *CERT_GetStateName(CERTName *name);
  552. extern char *CERT_GetOrgName(CERTName *name);
  553. extern char *CERT_GetOrgUnitName(CERTName *name);
  554. extern char *CERT_GetDomainComponentName(CERTName *name);
  555. extern char *CERT_GetCertUid(CERTName *name);
  556. /* manipulate the trust parameters of a certificate */
  557. extern SECStatus CERT_GetCertTrust(CERTCertificate *cert, CERTCertTrust *trust);
  558. extern SECStatus
  559. CERT_ChangeCertTrust (CERTCertDBHandle *handle, CERTCertificate *cert,
  560.       CERTCertTrust *trust);
  561. extern SECStatus
  562. CERT_ChangeCertTrustByUsage(CERTCertDBHandle *certdb, CERTCertificate *cert,
  563.     SECCertUsage usage);
  564. /*************************************************************************
  565.  *
  566.  * manipulate the extensions of a certificate
  567.  *
  568.  ************************************************************************/
  569. /*
  570. ** Set up a cert for adding X509v3 extensions.  Returns an opaque handle
  571. ** used by the next two routines.
  572. ** "cert" is the certificate we are adding extensions to
  573. */
  574. extern void *CERT_StartCertExtensions(CERTCertificate *cert);
  575. /*
  576. ** Add an extension to a certificate.
  577. ** "exthandle" is the handle returned by the previous function
  578. ** "idtag" is the integer tag for the OID that should ID this extension
  579. ** "value" is the value of the extension
  580. ** "critical" is the critical extension flag
  581. ** "copyData" is a flag indicating whether the value data should be
  582. ** copied.
  583. */
  584. extern SECStatus CERT_AddExtension (void *exthandle, int idtag, 
  585. SECItem *value, PRBool critical, PRBool copyData);
  586. extern SECStatus CERT_AddExtensionByOID (void *exthandle, SECItem *oid,
  587.  SECItem *value, PRBool critical, PRBool copyData);
  588. extern SECStatus CERT_EncodeAndAddExtension
  589.    (void *exthandle, int idtag, void *value, PRBool critical,
  590.     const SEC_ASN1Template *atemplate);
  591. extern SECStatus CERT_EncodeAndAddBitStrExtension
  592.    (void *exthandle, int idtag, SECItem *value, PRBool critical);
  593. /*
  594. ** Finish adding cert extensions.  Does final processing on extension
  595. ** data, putting it in the right format, and freeing any temporary
  596. ** storage.
  597. ** "exthandle" is the handle used to add extensions to a certificate
  598. */
  599. extern SECStatus CERT_FinishExtensions(void *exthandle);
  600. /* If the extension is found, return its criticality and value.
  601. ** This allocate storage for the returning extension value.
  602. */
  603. extern SECStatus CERT_GetExtenCriticality
  604.    (CERTCertExtension **extensions, int tag, PRBool *isCritical);
  605. extern void
  606. CERT_DestroyOidSequence(CERTOidSequence *oidSeq);
  607. /****************************************************************************
  608.  *
  609.  * DER encode and decode extension values
  610.  *
  611.  ****************************************************************************/
  612. /* Encode the value of the basicConstraint extension.
  613. ** arena - where to allocate memory for the encoded value.
  614. ** value - extension value to encode
  615. ** encodedValue - output encoded value
  616. */
  617. extern SECStatus CERT_EncodeBasicConstraintValue
  618.    (PRArenaPool *arena, CERTBasicConstraints *value, SECItem *encodedValue);
  619. /*
  620. ** Encode the value of the authorityKeyIdentifier extension.
  621. */
  622. extern SECStatus CERT_EncodeAuthKeyID
  623.    (PRArenaPool *arena, CERTAuthKeyID *value, SECItem *encodedValue);
  624. /*
  625. ** Encode the value of the crlDistributionPoints extension.
  626. */
  627. extern SECStatus CERT_EncodeCRLDistributionPoints
  628.    (PRArenaPool *arena, CERTCrlDistributionPoints *value,SECItem *derValue);
  629. /*
  630. ** Decodes a DER encoded basicConstaint extension value into a readable format
  631. ** value - decoded value
  632. ** encodedValue - value to decoded
  633. */
  634. extern SECStatus CERT_DecodeBasicConstraintValue
  635.    (CERTBasicConstraints *value, SECItem *encodedValue);
  636. /* Decodes a DER encoded authorityKeyIdentifier extension value into a
  637. ** readable format.
  638. ** arena - where to allocate memory for the decoded value
  639. ** encodedValue - value to be decoded
  640. ** Returns a CERTAuthKeyID structure which contains the decoded value
  641. */
  642. extern CERTAuthKeyID *CERT_DecodeAuthKeyID 
  643. (PRArenaPool *arena, SECItem *encodedValue);
  644. /* Decodes a DER encoded crlDistributionPoints extension value into a 
  645. ** readable format.
  646. ** arena - where to allocate memory for the decoded value
  647. ** der - value to be decoded
  648. ** Returns a CERTCrlDistributionPoints structure which contains the 
  649. **          decoded value
  650. */
  651. extern CERTCrlDistributionPoints * CERT_DecodeCRLDistributionPoints
  652.    (PRArenaPool *arena, SECItem *der);
  653. /* Extract certain name type from a generalName */
  654. extern void *CERT_GetGeneralNameByType
  655.    (CERTGeneralName *genNames, CERTGeneralNameType type, PRBool derFormat);
  656. extern CERTOidSequence *
  657. CERT_DecodeOidSequence(SECItem *seqItem);
  658. /****************************************************************************
  659.  *
  660.  * Find extension values of a certificate 
  661.  *
  662.  ***************************************************************************/
  663. extern SECStatus CERT_FindCertExtension
  664.    (CERTCertificate *cert, int tag, SECItem *value);
  665. extern SECStatus CERT_FindNSCertTypeExtension
  666.    (CERTCertificate *cert, SECItem *value);
  667. extern char * CERT_FindNSStringExtension (CERTCertificate *cert, int oidtag);
  668. extern SECStatus CERT_FindIssuerCertExtension
  669.    (CERTCertificate *cert, int tag, SECItem *value);
  670. extern SECStatus CERT_FindCertExtensionByOID
  671.    (CERTCertificate *cert, SECItem *oid, SECItem *value);
  672. extern char *CERT_FindCertURLExtension (CERTCertificate *cert, int tag, 
  673. int catag);
  674. /* Returns the decoded value of the authKeyID extension.
  675. **   Note that this uses passed in the arena to allocate storage for the result
  676. */
  677. extern CERTAuthKeyID * CERT_FindAuthKeyIDExten (PRArenaPool *arena,CERTCertificate *cert);
  678. /* Returns the decoded value of the basicConstraint extension.
  679.  */
  680. extern SECStatus CERT_FindBasicConstraintExten
  681.    (CERTCertificate *cert, CERTBasicConstraints *value);
  682. /* Returns the decoded value of the crlDistributionPoints extension.
  683. **  Note that the arena in cert is used to allocate storage for the result
  684. */
  685. extern CERTCrlDistributionPoints * CERT_FindCRLDistributionPoints
  686.    (CERTCertificate *cert);
  687. /* Returns value of the keyUsage extension.  This uses PR_Alloc to allocate 
  688. ** buffer for the decoded value, The caller should free up the storage 
  689. ** allocated in value->data.
  690. */
  691. extern SECStatus CERT_FindKeyUsageExtension (CERTCertificate *cert, 
  692. SECItem *value);
  693. /* Return the decoded value of the subjectKeyID extension. The caller should 
  694. ** free up the storage allocated in retItem->data.
  695. */
  696. extern SECStatus CERT_FindSubjectKeyIDExten (CERTCertificate *cert, 
  697.    SECItem *retItem);
  698. /*
  699. ** If cert is a v3 certificate, and a critical keyUsage extension is included,
  700. ** then check the usage against the extension value.  If a non-critical 
  701. ** keyUsage extension is included, this will return SECSuccess without 
  702. ** checking, since the extension is an advisory field, not a restriction.  
  703. ** If cert is not a v3 certificate, this will return SECSuccess.
  704. ** cert - certificate
  705. ** usage - one of the x.509 v3 the Key Usage Extension flags
  706. */
  707. extern SECStatus CERT_CheckCertUsage (CERTCertificate *cert, 
  708. unsigned char usage);
  709. /****************************************************************************
  710.  *
  711.  *  CRL v2 Extensions supported routines
  712.  *
  713.  ****************************************************************************/
  714. extern SECStatus CERT_FindCRLExtensionByOID
  715.    (CERTCrl *crl, SECItem *oid, SECItem *value);
  716. extern SECStatus CERT_FindCRLExtension
  717.    (CERTCrl *crl, int tag, SECItem *value);
  718. extern SECStatus
  719.    CERT_FindInvalidDateExten (CERTCrl *crl, int64 *value);
  720. extern void *CERT_StartCRLExtensions (CERTCrl *crl);
  721. extern CERTCertNicknames *CERT_GetCertNicknames (CERTCertDBHandle *handle,
  722.  int what, void *wincx);
  723. /*
  724. ** Finds the crlNumber extension and decodes its value into 'value'
  725. */
  726. extern SECStatus CERT_FindCRLNumberExten (CERTCrl *crl, CERTCrlNumber *value);
  727. extern void CERT_FreeNicknames(CERTCertNicknames *nicknames);
  728. extern PRBool CERT_CompareCerts(CERTCertificate *c1, CERTCertificate *c2);
  729. extern PRBool CERT_CompareCertsForRedirection(CERTCertificate *c1,
  730.  CERTCertificate *c2);
  731. /*
  732. ** Generate an array of the Distinguished Names that the given cert database
  733. ** "trusts"
  734. */
  735. extern CERTDistNames *CERT_GetSSLCACerts(CERTCertDBHandle *handle);
  736. extern void CERT_FreeDistNames(CERTDistNames *names);
  737. /*
  738. ** Generate an array of Distinguished names from an array of nicknames
  739. */
  740. extern CERTDistNames *CERT_DistNamesFromNicknames
  741.    (CERTCertDBHandle *handle, char **nicknames, int nnames);
  742. /*
  743. ** Generate a certificate chain from a certificate.
  744. */
  745. extern CERTCertificateList *
  746. CERT_CertChainFromCert(CERTCertificate *cert, SECCertUsage usage,
  747.        PRBool includeRoot);
  748. extern CERTCertificateList *
  749. CERT_CertListFromCert(CERTCertificate *cert);
  750. extern CERTCertificateList *
  751. CERT_DupCertList(CERTCertificateList * oldList);
  752. extern void CERT_DestroyCertificateList(CERTCertificateList *list);
  753. /* is cert a newer than cert b? */
  754. PRBool CERT_IsNewer(CERTCertificate *certa, CERTCertificate *certb);
  755. typedef SECStatus (* CERTCertCallback)(CERTCertificate *cert, void *arg);
  756. SECStatus
  757. CERT_TraversePermCertsForSubject(CERTCertDBHandle *handle, SECItem *derSubject,
  758.  CERTCertCallback cb, void *cbarg);
  759. int
  760. CERT_NumPermCertsForSubject(CERTCertDBHandle *handle, SECItem *derSubject);
  761. SECStatus
  762. CERT_TraversePermCertsForNickname(CERTCertDBHandle *handle, char *nickname,
  763.   CERTCertCallback cb, void *cbarg);
  764. int
  765. CERT_NumPermCertsForNickname(CERTCertDBHandle *handle, char *nickname);
  766. int
  767. CERT_NumCertsForCertSubject(CERTCertificate *cert);
  768. int
  769. CERT_NumPermCertsForCertSubject(CERTCertificate *cert);
  770. SECStatus
  771. CERT_TraverseCertsForSubject(CERTCertDBHandle *handle,
  772.      CERTSubjectList *subjectList,
  773.      CERTCertCallback cb, void *cbarg);
  774. /* currently a stub for address book */
  775. PRBool
  776. CERT_IsCertRevoked(CERTCertificate *cert);
  777. void
  778. CERT_DestroyCertArray(CERTCertificate **certs, unsigned int ncerts);
  779. /* convert an email address to lower case */
  780. char *CERT_FixupEmailAddr(char *emailAddr);
  781. /* decode string representation of trust flags into trust struct */
  782. SECStatus
  783. CERT_DecodeTrustString(CERTCertTrust *trust, char *trusts);
  784. /* encode trust struct into string representation of trust flags */
  785. char *
  786. CERT_EncodeTrustString(CERTCertTrust *trust);
  787. /* find the next or prev cert in a subject list */
  788. CERTCertificate *
  789. CERT_PrevSubjectCert(CERTCertificate *cert);
  790. CERTCertificate *
  791. CERT_NextSubjectCert(CERTCertificate *cert);
  792. /*
  793.  * import a collection of certs into the temporary or permanent cert
  794.  * database
  795.  */
  796. SECStatus
  797. CERT_ImportCerts(CERTCertDBHandle *certdb, SECCertUsage usage,
  798.  unsigned int ncerts, SECItem **derCerts,
  799.  CERTCertificate ***retCerts, PRBool keepCerts,
  800.  PRBool caOnly, char *nickname);
  801. SECStatus
  802. CERT_SaveImportedCert(CERTCertificate *cert, SECCertUsage usage,
  803.       PRBool caOnly, char *nickname);
  804. char *
  805. CERT_MakeCANickname(CERTCertificate *cert);
  806. PRBool
  807. CERT_IsCACert(CERTCertificate *cert, unsigned int *rettype);
  808. SECStatus
  809. CERT_SaveSMimeProfile(CERTCertificate *cert, SECItem *emailProfile,
  810.       SECItem *profileTime);
  811. /*
  812.  * find the smime symmetric capabilities profile for a given cert
  813.  */
  814. SECItem *
  815. CERT_FindSMimeProfile(CERTCertificate *cert);
  816. int
  817. CERT_GetDBContentVersion(CERTCertDBHandle *handle);
  818. void
  819. CERT_SetDBContentVersion(int version, CERTCertDBHandle *handle);
  820. SECStatus
  821. CERT_AddNewCerts(CERTCertDBHandle *handle);
  822. CERTPackageType
  823. CERT_CertPackageType(SECItem *package, SECItem *certitem);
  824. CERTCertificatePolicies *
  825. CERT_DecodeCertificatePoliciesExtension(SECItem *extnValue);
  826. void
  827. CERT_DestroyCertificatePoliciesExtension(CERTCertificatePolicies *policies);
  828. CERTUserNotice *
  829. CERT_DecodeUserNotice(SECItem *noticeItem);
  830. void
  831. CERT_DestroyUserNotice(CERTUserNotice *userNotice);
  832. typedef char * (* CERTPolicyStringCallback)(char *org,
  833.        unsigned long noticeNumber,
  834.        void *arg);
  835. void
  836. CERT_SetCAPolicyStringCallback(CERTPolicyStringCallback cb, void *cbarg);
  837. char *
  838. CERT_GetCertCommentString(CERTCertificate *cert);
  839. PRBool
  840. CERT_GovtApprovedBitSet(CERTCertificate *cert);
  841. SECStatus
  842. CERT_AddPermNickname(CERTCertificate *cert, char *nickname);
  843. /*
  844.  * Given a cert, find the cert with the same subject name that
  845.  * has the given key usage.  If the given cert has the correct keyUsage, then
  846.  * return it, otherwise search the list in order.
  847.  */
  848. CERTCertificate *
  849. CERT_FindCertByUsage(CERTCertificate *basecert, unsigned int requiredKeyUsage);
  850. CERTCertList *
  851. CERT_MatchUserCert(CERTCertDBHandle *handle,
  852.    SECCertUsage usage,
  853.    int nCANames, char **caNames,
  854.    void *proto_win);
  855. CERTCertList *
  856. CERT_NewCertList(void);
  857. void
  858. CERT_DestroyCertList(CERTCertList *certs);
  859. /* remove the node and free the cert */
  860. void
  861. CERT_RemoveCertListNode(CERTCertListNode *node);
  862. SECStatus
  863. CERT_AddCertToListTail(CERTCertList *certs, CERTCertificate *cert);
  864. typedef PRBool (* CERTSortCallback)(CERTCertificate *certa,
  865.     CERTCertificate *certb,
  866.     void *arg);
  867. SECStatus
  868. CERT_AddCertToListSorted(CERTCertList *certs, CERTCertificate *cert,
  869.  CERTSortCallback f, void *arg);
  870. /* callback for CERT_AddCertToListSorted that sorts based on validity
  871.  * period and a given time.
  872.  */
  873. PRBool
  874. CERT_SortCBValidity(CERTCertificate *certa,
  875.     CERTCertificate *certb,
  876.     void *arg);
  877. SECStatus
  878. CERT_CheckForEvilCert(CERTCertificate *cert);
  879. CERTGeneralName *
  880. CERT_GetCertificateNames(CERTCertificate *cert, PRArenaPool *arena);
  881. int
  882. CERT_GetNamesLength(CERTGeneralName *names);
  883. CERTCertificate *
  884. CERT_CompareNameSpace(CERTCertificate  *cert,
  885.       CERTGeneralName  *namesList,
  886.       SECItem          *namesListIndex,
  887.       PRArenaPool      *arena,
  888.       CERTCertDBHandle *handle);
  889. SECStatus 
  890. CERT_EncodeSubjectKeyID(PRArenaPool *arena, char *value, int len, SECItem *encodedValue);
  891. char *
  892. CERT_GetNickName(CERTCertificate   *cert, CERTCertDBHandle *handle, PRArenaPool *nicknameArena);
  893. /*
  894.  * Creates or adds to a list of all certs with a give subject name, sorted by
  895.  * validity time, newest first.  Invalid certs are considered older than
  896.  * valid certs. If validOnly is set, do not include invalid certs on list.
  897.  */
  898. CERTCertList *
  899. CERT_CreateSubjectCertList(CERTCertList *certList, CERTCertDBHandle *handle,
  900.    SECItem *name, int64 sorttime, PRBool validOnly);
  901. /*
  902.  * Creates or adds to a list of all certs with a give nickname, sorted by
  903.  * validity time, newest first.  Invalid certs are considered older than valid
  904.  * certs. If validOnly is set, do not include invalid certs on list.
  905.  */
  906. CERTCertList *
  907. CERT_CreateNicknameCertList(CERTCertList *certList, CERTCertDBHandle *handle,
  908.     char *nickname, int64 sorttime, PRBool validOnly);
  909. /*
  910.  * Creates or adds to a list of all certs with a give email addr, sorted by
  911.  * validity time, newest first.  Invalid certs are considered older than valid
  912.  * certs. If validOnly is set, do not include invalid certs on list.
  913.  */
  914. CERTCertList *
  915. CERT_CreateEmailAddrCertList(CERTCertList *certList, CERTCertDBHandle *handle,
  916.      char *emailAddr, int64 sorttime, PRBool validOnly);
  917. /*
  918.  * remove certs from a list that don't have keyUsage and certType
  919.  * that match the given usage.
  920.  */
  921. SECStatus
  922. CERT_FilterCertListByUsage(CERTCertList *certList, SECCertUsage usage,
  923.    PRBool ca);
  924. /*
  925.  * check the key usage of a cert against a set of required values
  926.  */
  927. SECStatus
  928. CERT_CheckKeyUsage(CERTCertificate *cert, unsigned int requiredUsage);
  929. /*
  930.  * return required key usage and cert type based on cert usage
  931.  */
  932. SECStatus
  933. CERT_KeyUsageAndTypeForCertUsage(SECCertUsage usage,
  934.  PRBool ca,
  935.  unsigned int *retKeyUsage,
  936.  unsigned int *retCertType);
  937. /*
  938.  * return required trust flags for various cert usages for CAs
  939.  */
  940. SECStatus
  941. CERT_TrustFlagsForCACertUsage(SECCertUsage usage,
  942.       unsigned int *retFlags,
  943.       SECTrustType *retTrustType);
  944. /*
  945.  * Find all user certificates that match the given criteria.
  946.  * 
  947.  * "handle" - database to search
  948.  * "usage" - certificate usage to match
  949.  * "oneCertPerName" - if set then only return the "best" cert per
  950.  * name
  951.  * "validOnly" - only return certs that are curently valid
  952.  * "proto_win" - window handle passed to pkcs11
  953.  */
  954. CERTCertList *
  955. CERT_FindUserCertsByUsage(CERTCertDBHandle *handle,
  956.   SECCertUsage usage,
  957.   PRBool oneCertPerName,
  958.   PRBool validOnly,
  959.   void *proto_win);
  960. /*
  961.  * Find a user certificate that matchs the given criteria.
  962.  * 
  963.  * "handle" - database to search
  964.  * "nickname" - nickname to match
  965.  * "usage" - certificate usage to match
  966.  * "validOnly" - only return certs that are curently valid
  967.  * "proto_win" - window handle passed to pkcs11
  968.  */
  969. CERTCertificate *
  970. CERT_FindUserCertByUsage(CERTCertDBHandle *handle,
  971.  char *nickname,
  972.  SECCertUsage usage,
  973.  PRBool validOnly,
  974.  void *proto_win);
  975. /*
  976.  * Filter a list of certificates, removing those certs that do not have
  977.  * one of the named CA certs somewhere in their cert chain.
  978.  *
  979.  * "certList" - the list of certificates to filter
  980.  * "nCANames" - number of CA names
  981.  * "caNames" - array of CA names in string(rfc 1485) form
  982.  * "usage" - what use the certs are for, this is used when
  983.  * selecting CA certs
  984.  */
  985. SECStatus
  986. CERT_FilterCertListByCANames(CERTCertList *certList, int nCANames,
  987.      char **caNames, SECCertUsage usage);
  988. /*
  989.  * Collect the nicknames from all certs in a CertList.  If the cert is not
  990.  * valid, append a string to that nickname.
  991.  *
  992.  * "certList" - the list of certificates
  993.  * "expiredString" - the string to append to the nickname of any expired cert
  994.  * "notYetGoodString" - the string to append to the nickname of any cert
  995.  * that is not yet valid
  996.  */
  997. CERTCertNicknames *
  998. CERT_NicknameStringsFromCertList(CERTCertList *certList, char *expiredString,
  999.  char *notYetGoodString);
  1000. /*
  1001.  * Extract the nickname from a nickmake string that may have either
  1002.  * expiredString or notYetGoodString appended.
  1003.  *
  1004.  * Args:
  1005.  * "namestring" - the string containing the nickname, and possibly
  1006.  * one of the validity label strings
  1007.  * "expiredString" - the expired validity label string
  1008.  * "notYetGoodString" - the not yet good validity label string
  1009.  *
  1010.  * Returns the raw nickname
  1011.  */
  1012. char *
  1013. CERT_ExtractNicknameString(char *namestring, char *expiredString,
  1014.    char *notYetGoodString);
  1015. /*
  1016.  * Given a certificate, return a string containing the nickname, and possibly
  1017.  * one of the validity strings, based on the current validity state of the
  1018.  * certificate.
  1019.  *
  1020.  * "arena" - arena to allocate returned string from.  If NULL, then heap
  1021.  * is used.
  1022.  * "cert" - the cert to get nickname from
  1023.  * "expiredString" - the string to append to the nickname if the cert is
  1024.  * expired.
  1025.  * "notYetGoodString" - the string to append to the nickname if the cert is
  1026.  * not yet good.
  1027.  */
  1028. char *
  1029. CERT_GetCertNicknameWithValidity(PRArenaPool *arena, CERTCertificate *cert,
  1030.  char *expiredString, char *notYetGoodString);
  1031. /*
  1032.  * Return the string representation of a DER encoded distinguished name
  1033.  * "dername" - The DER encoded name to convert
  1034.  */
  1035. char *
  1036. CERT_DerNameToAscii(SECItem *dername);
  1037. /*
  1038.  * Supported usage values and types:
  1039.  * certUsageSSLClient
  1040.  * certUsageSSLServer
  1041.  * certUsageSSLServerWithStepUp
  1042.  * certUsageEmailSigner
  1043.  * certUsageEmailRecipient
  1044.  * certUsageObjectSigner
  1045.  */
  1046. CERTCertificate *
  1047. CERT_FindMatchingCert(CERTCertDBHandle *handle, SECItem *derName,
  1048.       CERTCertOwner owner, SECCertUsage usage,
  1049.       PRBool preferTrusted, int64 validTime, PRBool validOnly);
  1050. /*********************************************************************/
  1051. /* A thread safe implementation of General Names                     */
  1052. /*********************************************************************/
  1053. /* Destroy a Single CERTGeneralName */
  1054. void
  1055. CERT_DestroyGeneralName(CERTGeneralName *name);
  1056. /* Destroys a CERTGeneralNameList */
  1057. void
  1058. CERT_DestroyGeneralNameList(CERTGeneralNameList *list);
  1059. /* Creates a CERTGeneralNameList */
  1060. CERTGeneralNameList *
  1061. CERT_CreateGeneralNameList(CERTGeneralName *name);
  1062. /* Compares two CERTGeneralNameList */
  1063. SECStatus
  1064. CERT_CompareGeneralNameLists(CERTGeneralNameList *a, CERTGeneralNameList *b);
  1065. /* returns a copy of the first name of the type requested */
  1066. void *
  1067. CERT_GetGeneralNameFromListByType(CERTGeneralNameList *list,
  1068.   CERTGeneralNameType type,
  1069.   PRArenaPool *arena);
  1070. /* Adds a name to the tail of the list */
  1071. void
  1072. CERT_AddGeneralNameToList(CERTGeneralNameList *list, 
  1073.   CERTGeneralNameType type,
  1074.   void *data, SECItem *oid);
  1075. /* returns a duplicate of the CERTGeneralNameList */
  1076. CERTGeneralNameList *
  1077. CERT_DupGeneralNameList(CERTGeneralNameList *list);
  1078. /* returns the length of a CERTGeneralName */
  1079. int
  1080. CERT_GetNamesLength(CERTGeneralName *names);
  1081. /*
  1082.  * Acquire the global lock on the cert database.
  1083.  * This lock is currently used for the following operations:
  1084.  * adding or deleting a cert to either the temp or perm databases
  1085.  * converting a temp to perm or perm to temp
  1086.  * changing(maybe just adding?) the trust of a cert
  1087.  * adjusting the reference count of a cert
  1088.  */
  1089. void
  1090. CERT_LockDB(CERTCertDBHandle *handle);
  1091. /*
  1092.  * Free the global cert database lock.
  1093.  */
  1094. void
  1095. CERT_UnlockDB(CERTCertDBHandle *handle);
  1096. /*
  1097.  * Get the certificate status checking configuratino data for
  1098.  * the certificate database
  1099.  */
  1100. CERTStatusConfig *
  1101. CERT_GetStatusConfig(CERTCertDBHandle *handle);
  1102. /*
  1103.  * Set the certificate status checking information for the
  1104.  * database.  The input structure becomes part of the certificate
  1105.  * database and will be freed by calling the 'Destroy' function in
  1106.  * the configuration object.
  1107.  */
  1108. void
  1109. CERT_SetStatusConfig(CERTCertDBHandle *handle, CERTStatusConfig *config);
  1110. /*
  1111.  * Acquire the cert reference count lock
  1112.  * There is currently one global lock for all certs, but I'm putting a cert
  1113.  * arg here so that it will be easy to make it per-cert in the future if
  1114.  * that turns out to be necessary.
  1115.  */
  1116. void
  1117. CERT_LockCertRefCount(CERTCertificate *cert);
  1118. /*
  1119.  * Free the cert reference count lock
  1120.  */
  1121. void
  1122. CERT_UnlockCertRefCount(CERTCertificate *cert);
  1123. /*
  1124.  * Acquire the cert trust lock
  1125.  * There is currently one global lock for all certs, but I'm putting a cert
  1126.  * arg here so that it will be easy to make it per-cert in the future if
  1127.  * that turns out to be necessary.
  1128.  */
  1129. void
  1130. CERT_LockCertTrust(CERTCertificate *cert);
  1131. /*
  1132.  * Free the cert trust lock
  1133.  */
  1134. void
  1135. CERT_UnlockCertTrust(CERTCertificate *cert);
  1136. /*
  1137.  * Digest the cert's subject public key using the specified algorithm.
  1138.  * The necessary storage for the digest data is allocated.  If "fill" is
  1139.  * non-null, the data is put there, otherwise a SECItem is allocated.
  1140.  * Allocation from "arena" if it is non-null, heap otherwise.  Any problem
  1141.  * results in a NULL being returned (and an appropriate error set).
  1142.  */ 
  1143. extern SECItem *
  1144. CERT_SPKDigestValueForCert(PRArenaPool *arena, CERTCertificate *cert,
  1145.    SECOidTag digestAlg, SECItem *fill);
  1146. SEC_END_PROTOS
  1147. #endif /* _CERT_H_ */