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

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. #ifndef _CERTDB_H_
  34. #define _CERTDB_H_
  35. #include "plarena.h"
  36. #include "prlong.h"
  37. /*
  38.  * Certificate Database related definitions and data structures
  39.  */
  40. /* version number of certificate database */
  41. #define CERT_DB_FILE_VERSION 7
  42. #ifdef USE_NS_ROOTS
  43. #define CERT_DB_CONTENT_VERSION 25
  44. #else
  45. #define CERT_DB_CONTENT_VERSION 2
  46. #endif
  47. #define SEC_DB_ENTRY_HEADER_LEN 3
  48. #define SEC_DB_KEY_HEADER_LEN 1
  49. /* All database entries have this form:
  50.  * 
  51.  * byte offset field
  52.  * ----------- -----
  53.  * 0 version
  54.  * 1 type
  55.  * 2 flags
  56.  */
  57. /* database entry types */
  58. typedef enum {
  59.     certDBEntryTypeVersion = 0,
  60.     certDBEntryTypeCert = 1,
  61.     certDBEntryTypeNickname = 2,
  62.     certDBEntryTypeSubject = 3,
  63.     certDBEntryTypeRevocation = 4,
  64.     certDBEntryTypeKeyRevocation = 5,
  65.     certDBEntryTypeSMimeProfile = 6,
  66.     certDBEntryTypeContentVersion = 7
  67. } certDBEntryType;
  68. typedef struct {
  69.     certDBEntryType type;
  70.     unsigned int version;
  71.     unsigned int flags;
  72.     PRArenaPool *arena;
  73. } certDBEntryCommon;
  74. /*
  75.  * Certificate entry:
  76.  *
  77.  * byte offset field
  78.  * ----------- -----
  79.  * 0 sslFlags-msb
  80.  * 1 sslFlags-lsb
  81.  * 2 emailFlags-msb
  82.  * 3 emailFlags-lsb
  83.  * 4 objectSigningFlags-msb
  84.  * 5 objectSigningFlags-lsb
  85.  * 6 derCert-len-msb
  86.  * 7 derCert-len-lsb
  87.  * 8 nickname-len-msb
  88.  * 9 nickname-len-lsb
  89.  * ... derCert
  90.  * ... nickname
  91.  *
  92.  * NOTE: the nickname string as stored in the database is null terminated,
  93.  * in other words, the last byte of the db entry is always 0
  94.  * if a nickname is present.
  95.  * NOTE: if nickname is not present, then nickname-len-msb and
  96.  * nickname-len-lsb will both be zero.
  97.  */
  98. struct _certDBEntryCert {
  99.     certDBEntryCommon common;
  100.     CERTCertTrust trust;
  101.     SECItem derCert;
  102.     char *nickname;
  103. };
  104. /*
  105.  * Certificate Nickname entry:
  106.  *
  107.  * byte offset field
  108.  * ----------- -----
  109.  * 0 subjectname-len-msb
  110.  * 1         subjectname-len-lsb
  111.  * 2... subjectname
  112.  *
  113.  * The database key for this type of entry is a nickname string
  114.  * The "subjectname" value is the DER encoded DN of the identity
  115.  *   that matches this nickname.
  116.  */
  117. typedef struct {
  118.     certDBEntryCommon common;
  119.     char *nickname;
  120.     SECItem subjectName;
  121. } certDBEntryNickname;
  122. #define DB_NICKNAME_ENTRY_HEADER_LEN 2
  123. /*
  124.  * Certificate Subject entry:
  125.  *
  126.  * byte offset field
  127.  * ----------- -----
  128.  * 0 ncerts-msb
  129.  * 1 ncerts-lsb
  130.  * 2 nickname-msb
  131.  * 3 nickname-lsb
  132.  * 4 emailAddr-msb
  133.  * 5 emailAddr-lsb
  134.  * ... nickname
  135.  * ... emailAddr
  136.  * ...+2*i certkey-len-msb
  137.  * ...+1+2*i       certkey-len-lsb
  138.  * ...+2*ncerts+2*i keyid-len-msb
  139.  * ...+1+2*ncerts+2*i keyid-len-lsb
  140.  * ... certkeys
  141.  * ... keyids
  142.  *
  143.  * The database key for this type of entry is the DER encoded subject name
  144.  * The "certkey" value is an array of  certificate database lookup keys that
  145.  *   points to the database entries for the certificates that matche
  146.  *   this subject.
  147.  *
  148.  */
  149. typedef struct _certDBEntrySubject {
  150.     certDBEntryCommon common;
  151.     SECItem derSubject;
  152.     unsigned int ncerts;
  153.     char *nickname;
  154.     char *emailAddr;
  155.     SECItem *certKeys;
  156.     SECItem *keyIDs;
  157. } certDBEntrySubject;
  158. #define DB_SUBJECT_ENTRY_HEADER_LEN 6
  159. /*
  160.  * Certificate SMIME profile entry:
  161.  *
  162.  * byte offset field
  163.  * ----------- -----
  164.  * 0 subjectname-len-msb
  165.  * 1         subjectname-len-lsb
  166.  * 2 smimeoptions-len-msb
  167.  * 3 smimeoptions-len-lsb
  168.  * 4 options-date-len-msb
  169.  * 5 options-date-len-lsb
  170.  * 6... subjectname
  171.  * ... smimeoptions
  172.  * ... options-date
  173.  *
  174.  * The database key for this type of entry is the email address string
  175.  * The "subjectname" value is the DER encoded DN of the identity
  176.  *   that matches this nickname.
  177.  * The "smimeoptions" value is a string that represents the algorithm
  178.  *   capabilities on the remote user.
  179.  * The "options-date" is the date that the smime options value was created.
  180.  *   This is generally the signing time of the signed message that contained
  181.  *   the options.  It is a UTCTime value.
  182.  */
  183. typedef struct {
  184.     certDBEntryCommon common;
  185.     char *emailAddr;
  186.     SECItem subjectName;
  187.     SECItem smimeOptions;
  188.     SECItem optionsDate;
  189. } certDBEntrySMime;
  190. #define DB_SMIME_ENTRY_HEADER_LEN 6
  191. /*
  192.  * Crl/krl entry:
  193.  *
  194.  * byte offset field
  195.  * ----------- -----
  196.  * 0 derCert-len-msb
  197.  * 1 derCert-len-lsb
  198.  * 2 url-len-msb
  199.  * 3 url-len-lsb
  200.  * ... derCert
  201.  * ... url
  202.  *
  203.  * NOTE: the url string as stored in the database is null terminated,
  204.  * in other words, the last byte of the db entry is always 0
  205.  * if a nickname is present. 
  206.  * NOTE: if url is not present, then url-len-msb and
  207.  * url-len-lsb will both be zero.
  208.  */
  209. #define DB_CRL_ENTRY_HEADER_LEN 4
  210. struct _certDBEntryRevocation {
  211.     certDBEntryCommon common;
  212.     SECItem derCrl;
  213.     char *url; /* where to load the crl from */
  214. };
  215. /*
  216.  * Database Version Entry:
  217.  *
  218.  * byte offset field
  219.  * ----------- -----
  220.  * only the low level header...
  221.  *
  222.  * The database key for this type of entry is the string "Version"
  223.  */
  224. typedef struct {
  225.     certDBEntryCommon common;
  226. } certDBEntryVersion;
  227. #define SEC_DB_VERSION_KEY "Version"
  228. #define SEC_DB_VERSION_KEY_LEN sizeof(SEC_DB_VERSION_KEY)
  229. /*
  230.  * Database Content Version Entry:
  231.  *
  232.  * byte offset field
  233.  * ----------- -----
  234.  * 0 contentVersion
  235.  *
  236.  * The database key for this type of entry is the string "ContentVersion"
  237.  */
  238. typedef struct {
  239.     certDBEntryCommon common;
  240.     char contentVersion;
  241. } certDBEntryContentVersion;
  242. #define SEC_DB_CONTENT_VERSION_KEY "ContentVersion"
  243. #define SEC_DB_CONTENT_VERSION_KEY_LEN sizeof(SEC_DB_CONTENT_VERSION_KEY)
  244. typedef union {
  245.     certDBEntryCommon common;
  246.     certDBEntryVersion version;
  247.     certDBEntryCert cert;
  248.     certDBEntryNickname nickname;
  249.     certDBEntrySubject subject;
  250.     certDBEntryRevocation revocation;
  251. } certDBEntry;
  252. /* length of the fixed part of a database entry */
  253. #define DBCERT_V4_HEADER_LEN 7
  254. #define DB_CERT_V5_ENTRY_HEADER_LEN 7
  255. #define DB_CERT_V6_ENTRY_HEADER_LEN 7
  256. #define DB_CERT_ENTRY_HEADER_LEN 10
  257. /* common flags for all types of certificates */
  258. #define CERTDB_VALID_PEER (1<<0)
  259. #define CERTDB_TRUSTED (1<<1)
  260. #define CERTDB_SEND_WARN (1<<2)
  261. #define CERTDB_VALID_CA (1<<3)
  262. #define CERTDB_TRUSTED_CA (1<<4) /* trusted for issuing server certs */
  263. #define CERTDB_NS_TRUSTED_CA (1<<5)
  264. #define CERTDB_USER (1<<6)
  265. #define CERTDB_TRUSTED_CLIENT_CA (1<<7) /* trusted for issuing client certs */
  266. #define CERTDB_INVISIBLE_CA (1<<8) /* don't show in UI */
  267. #define CERTDB_GOVT_APPROVED_CA (1<<9) /* can do strong crypto in export ver */
  268. SEC_BEGIN_PROTOS
  269. /*
  270. ** Add a DER encoded certificate to the permanent database.
  271. ** "derCert" is the DER encoded certificate.
  272. ** "nickname" is the nickname to use for the cert
  273. ** "trust" is the trust parameters for the cert
  274. */
  275. SECStatus SEC_AddPermCertificate(CERTCertDBHandle *handle, SECItem *derCert,
  276. char *nickname, CERTCertTrust *trust);
  277. certDBEntryCert *
  278. SEC_FindPermCertByKey(CERTCertDBHandle *handle, SECItem *certKey);
  279. certDBEntryCert
  280. *SEC_FindPermCertByName(CERTCertDBHandle *handle, SECItem *name);
  281. SECStatus SEC_OpenPermCertDB(CERTCertDBHandle *handle,
  282.      PRBool readOnly,
  283.      CERTDBNameFunc namecb,
  284.      void *cbarg);
  285. SECStatus SEC_DeletePermCertificate(CERTCertificate *cert);
  286. typedef SECStatus (* PermCertCallback)(CERTCertificate *cert, SECItem *k,
  287.       void *pdata);
  288. /*
  289. ** Traverse the entire permanent database, and pass the certs off to a
  290. ** user supplied function.
  291. ** "certfunc" is the user function to call for each certificate
  292. ** "udata" is the user's data, which is passed through to "certfunc"
  293. */
  294. SECStatus
  295. SEC_TraversePermCerts(CERTCertDBHandle *handle,
  296.       PermCertCallback certfunc,
  297.       void *udata );
  298. SECStatus
  299. SEC_AddTempNickname(CERTCertDBHandle *handle, char *nickname, SECItem *certKey);
  300. SECStatus
  301. SEC_DeleteTempNickname(CERTCertDBHandle *handle, char *nickname);
  302. PRBool
  303. SEC_CertNicknameConflict(char *nickname, SECItem *derSubject,
  304.  CERTCertDBHandle *handle);
  305. PRBool
  306. SEC_CertDBKeyConflict(SECItem *derCert, CERTCertDBHandle *handle);
  307. SECStatus
  308. SEC_GetCrlTimes(CERTCrl *dates, int64 *notBefore, int64 *notAfter);
  309. SECCertTimeValidity
  310. SEC_CheckCrlTimes(CERTCrl *crl, int64 t);
  311. PRBool
  312. SEC_CrlIsNewer(CERTCrl *inNew, CERTCrl *old);
  313. CERTSignedCrl *
  314. SEC_AddPermCrlToTemp(CERTCertDBHandle *handle, certDBEntryRevocation *entry);
  315. SECStatus
  316. SEC_DeleteTempCrl(CERTSignedCrl *crl);
  317. CERTSignedCrl *
  318. SEC_FindCrlByKey(CERTCertDBHandle *handle, SECItem *crlKey, int type);
  319. CERTSignedCrl *
  320. SEC_FindCrlByName(CERTCertDBHandle *handle, SECItem *crlKey, int type);
  321. CERTSignedCrl *
  322. SEC_FindCrlByDERCert(CERTCertDBHandle *handle, SECItem *derCrl, int type);
  323. SECStatus 
  324. SEC_DestroyCrl(CERTSignedCrl *crl);
  325. CERTSignedCrl *
  326. SEC_NewCrl(CERTCertDBHandle *handle, char *url, SECItem *derCrl, int type);
  327. CERTSignedCrl *
  328. cert_DBInsertCRL
  329.    (CERTCertDBHandle *handle, char *url,
  330.     CERTSignedCrl *newCrl, SECItem *derCrl, int type);
  331. SECStatus
  332. SEC_CheckKRL(CERTCertDBHandle *handle,SECKEYPublicKey *key,
  333.      CERTCertificate *rootCert, int64 t, void *wincx);
  334. SECStatus
  335. SEC_CheckCRL(CERTCertDBHandle *handle,CERTCertificate *cert,
  336.      CERTCertificate *caCert, int64 t, void *wincx);
  337. SECStatus
  338. SEC_DeletePermCRL(CERTSignedCrl *crl);
  339. SECStatus
  340. SEC_LookupCrls(CERTCertDBHandle *handle, CERTCrlHeadNode **nodes, int type);
  341. SECStatus
  342. SEC_CrlReplaceUrl(CERTSignedCrl *crl,char *url);
  343. SEC_END_PROTOS
  344. #endif /* _CERTDB_H_ */