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

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.  * Interface to the OCSP implementation.
  35.  *
  36.  * $Id: ocsp.h,v 1.1 2000/03/31 19:43:02 relyea%netscape.com Exp $
  37.  */
  38. #ifndef _OCSP_H_
  39. #define _OCSP_H_
  40. #include "plarena.h"
  41. #include "seccomon.h"
  42. #include "secoidt.h"
  43. #include "keyt.h"
  44. #include "certt.h"
  45. #include "ocspt.h"
  46. /************************************************************************/
  47. SEC_BEGIN_PROTOS
  48. /*
  49.  * FUNCTION: CERT_EnableOCSPChecking
  50.  *   Turns on OCSP checking for the given certificate database.
  51.  * INPUTS:
  52.  *   CERTCertDBHandle *handle
  53.  *     Certificate database for which OCSP checking will be enabled.
  54.  * RETURN:
  55.  *   Returns SECFailure if an error occurred (likely only problem
  56.  *   allocating memory); SECSuccess otherwise.
  57.  */
  58. extern SECStatus
  59. CERT_EnableOCSPChecking(CERTCertDBHandle *handle);
  60. /*
  61.  * FUNCTION: CERT_DisableOCSPChecking
  62.  *   Turns off OCSP checking for the given certificate database.
  63.  *   This routine disables OCSP checking.  Though it will return
  64.  *   SECFailure if OCSP checking is not enabled, it is "safe" to
  65.  *   call it that way and just ignore the return value, if it is
  66.  *   easier to just call it than to "remember" whether it is enabled.
  67.  * INPUTS:
  68.  *   CERTCertDBHandle *handle
  69.  *     Certificate database for which OCSP checking will be disabled.
  70.  * RETURN:
  71.  *   Returns SECFailure if an error occurred (usually means that OCSP
  72.  *   checking was not enabled or status contexts were not initialized --
  73.  *   error set will be SEC_ERROR_OCSP_NOT_ENABLED); SECSuccess otherwise.
  74.  */
  75. extern SECStatus
  76. CERT_DisableOCSPChecking(CERTCertDBHandle *handle);
  77. /*
  78.  * FUNCTION: CERT_SetOCSPDefaultResponder
  79.  *   Specify the location and cert of the default responder.
  80.  *   If OCSP checking is already enabled *and* use of a default responder
  81.  *   is also already enabled, all OCSP checking from now on will go directly
  82.  *   to the specified responder.  If OCSP checking is not enabled, or if
  83.  *   it is but use of a default responder is not enabled, the information
  84.  *   will be recorded and take effect whenever both are enabled.
  85.  * INPUTS:
  86.  *   CERTCertDBHandle *handle
  87.  *     Cert database on which OCSP checking should use the default responder.
  88.  *   char *url
  89.  *     The location of the default responder (e.g. "http://foo.com:80/ocsp")
  90.  *     Note that the location will not be tested until the first attempt
  91.  *     to send a request there.
  92.  *   char *name
  93.  *     The nickname of the cert to trust (expected) to sign the OCSP responses.
  94.  *     If the corresponding cert cannot be found, SECFailure is returned.
  95.  * RETURN:
  96.  *   Returns SECFailure if an error occurred; SECSuccess otherwise.
  97.  *   The most likely error is that the cert for "name" could not be found
  98.  *   (probably SEC_ERROR_UNKNOWN_CERT).  Other errors are low-level (no memory,
  99.  *   bad database, etc.).
  100.  */
  101. extern SECStatus
  102. CERT_SetOCSPDefaultResponder(CERTCertDBHandle *handle,
  103.      const char *url, const char *name);
  104. /*
  105.  * FUNCTION: CERT_EnableOCSPDefaultResponder
  106.  *   Turns on use of a default responder when OCSP checking.
  107.  *   If OCSP checking is already enabled, this will make subsequent checks
  108.  *   go directly to the default responder.  (The location of the responder
  109.  *   and the nickname of the responder cert must already be specified.)
  110.  *   If OCSP checking is not enabled, this will be recorded and take effect
  111.  *   whenever it is enabled.
  112.  * INPUTS:
  113.  *   CERTCertDBHandle *handle
  114.  *     Cert database on which OCSP checking should use the default responder.
  115.  * RETURN:
  116.  *   Returns SECFailure if an error occurred; SECSuccess otherwise.
  117.  *   No errors are especially likely unless the caller did not previously
  118.  *   perform a successful call to SetOCSPDefaultResponder (in which case
  119.  *   the error set will be SEC_ERROR_OCSP_NO_DEFAULT_RESPONDER).
  120.  */
  121. extern SECStatus
  122. CERT_EnableOCSPDefaultResponder(CERTCertDBHandle *handle);
  123. /*
  124.  * FUNCTION: CERT_DisableOCSPDefaultResponder
  125.  *   Turns off use of a default responder when OCSP checking.
  126.  *   (Does nothing if use of a default responder is not enabled.)
  127.  * INPUTS:
  128.  *   CERTCertDBHandle *handle
  129.  *     Cert database on which OCSP checking should stop using a default
  130.  *     responder.
  131.  * RETURN:
  132.  *   Returns SECFailure if an error occurred; SECSuccess otherwise.
  133.  *   Errors very unlikely (like random memory corruption...).
  134.  */
  135. extern SECStatus
  136. CERT_DisableOCSPDefaultResponder(CERTCertDBHandle *handle);
  137. /*
  138.  * -------------------------------------------------------
  139.  * The Functions above are those expected to be used by a client
  140.  * providing OCSP status checking along with every cert verification.
  141.  * The functions below are for OCSP testing, debugging, or clients
  142.  * or servers performing more specialized OCSP tasks.
  143.  * -------------------------------------------------------
  144.  */
  145. /*
  146.  * FUNCTION: CERT_CreateOCSPRequest
  147.  *   Creates a CERTOCSPRequest, requesting the status of the certs in 
  148.  *   the given list.
  149.  * INPUTS:
  150.  *   CERTCertList *certList
  151.  *     A list of certs for which status will be requested.
  152.  *     Note that all of these certificates should have the same issuer,
  153.  *     or it's expected the response will be signed by a trusted responder.
  154.  *     If the certs need to be broken up into multiple requests, that
  155.  *     must be handled by the caller (and thus by having multiple calls
  156.  *     to this routine), who knows about where the request(s) are being
  157.  *     sent and whether there are any trusted responders in place.
  158.  *   int64 time
  159.  *     Indicates the time for which the certificate status is to be 
  160.  *     determined -- this may be used in the search for the cert's issuer
  161.  *     but has no effect on the request itself.
  162.  *   PRBool addServiceLocator
  163.  *     If true, the Service Locator extension should be added to the
  164.  *     single request(s) for each cert.
  165.  *   CERTCertificate *signerCert
  166.  *     If non-NULL, means sign the request using this cert.  Otherwise,
  167.  *     do not sign.
  168.  *     XXX note that request signing is not yet supported; see comment in code
  169.  * RETURN:
  170.  *   A pointer to a CERTOCSPRequest structure containing an OCSP request
  171.  *   for the cert list.  On error, null is returned, with an error set
  172.  *   indicating the reason.  This is likely SEC_ERROR_UNKNOWN_ISSUER.
  173.  *   (The issuer is needed to create a request for the certificate.)
  174.  *   Other errors are low-level problems (no memory, bad database, etc.).
  175.  */
  176. extern CERTOCSPRequest *
  177. CERT_CreateOCSPRequest(CERTCertList *certList, int64 time, 
  178.        PRBool addServiceLocator,
  179.        CERTCertificate *signerCert);
  180. /*
  181.  * FUNCTION: CERT_AddOCSPAcceptableResponses
  182.  *   Add the AcceptableResponses extension to an OCSP Request.
  183.  * INPUTS:
  184.  *   CERTOCSPRequest *request
  185.  *     The request to which the extension should be added.
  186.  *   ...
  187.  *     A list (of one or more) of SECOidTag -- each of the response types
  188.  *     to be added.  The last OID *must* be SEC_OID_PKIX_OCSP_BASIC_RESPONSE.
  189.  *     (This marks the end of the list, and it must be specified because a
  190.  *     client conforming to the OCSP standard is required to handle the basic
  191.  *     response type.)  The OIDs are not checked in any way.
  192.  * RETURN:
  193.  *   SECSuccess if the extension is added; SECFailure if anything goes wrong.
  194.  *   All errors are internal or low-level problems (e.g. no memory).
  195.  */
  196. extern SECStatus
  197. CERT_AddOCSPAcceptableResponses(CERTOCSPRequest *request, ...);
  198. /* 
  199.  * FUNCTION: CERT_EncodeOCSPRequest
  200.  *   DER encodes an OCSP Request, possibly adding a signature as well.
  201.  *   XXX Signing is not yet supported, however; see comments in code.
  202.  * INPUTS: 
  203.  *   PRArenaPool *arena
  204.  *     The return value is allocated from here.
  205.  *     If a NULL is passed in, allocation is done from the heap instead.
  206.  *   CERTOCSPRequest *request
  207.  *     The request to be encoded.
  208.  *   void *pwArg
  209.  *     Pointer to argument for password prompting, if needed.  (Definitely
  210.  *     not needed if not signing.)
  211.  * RETURN:
  212.  *   Returns a NULL on error and a pointer to the SECItem with the
  213.  *   encoded value otherwise.  Any error is likely to be low-level
  214.  *   (e.g. no memory).
  215.  */
  216. extern SECItem *
  217. CERT_EncodeOCSPRequest(PRArenaPool *arena, CERTOCSPRequest *request, 
  218.        void *pwArg);
  219. /*
  220.  * FUNCTION: CERT_DecodeOCSPRequest
  221.  *   Decode a DER encoded OCSP Request.
  222.  * INPUTS:
  223.  *   SECItem *src
  224.  *     Pointer to a SECItem holding DER encoded OCSP Request.
  225.  * RETURN:
  226.  *   Returns a pointer to a CERTOCSPRequest containing the decoded request.
  227.  *   On error, returns NULL.  Most likely error is trouble decoding
  228.  *   (SEC_ERROR_OCSP_MALFORMED_REQUEST), or low-level problem (no memory).
  229.  */
  230. extern CERTOCSPRequest *
  231. CERT_DecodeOCSPRequest(SECItem *src);
  232. /*
  233.  * FUNCTION: CERT_DestroyOCSPRequest
  234.  *   Frees an OCSP Request structure.
  235.  * INPUTS:
  236.  *   CERTOCSPRequest *request
  237.  *     Pointer to CERTOCSPRequest to be freed.
  238.  * RETURN:
  239.  *   No return value; no errors.
  240.  */
  241. extern void
  242. CERT_DestroyOCSPRequest(CERTOCSPRequest *request);
  243. /*
  244.  * FUNCTION: CERT_DecodeOCSPResponse
  245.  *   Decode a DER encoded OCSP Response.
  246.  * INPUTS:
  247.  *   SECItem *src
  248.  *     Pointer to a SECItem holding DER encoded OCSP Response.
  249.  * RETURN:
  250.  *   Returns a pointer to a CERTOCSPResponse (the decoded OCSP Response);
  251.  *   the caller is responsible for destroying it.  Or NULL if error (either
  252.  *   response could not be decoded (SEC_ERROR_OCSP_MALFORMED_RESPONSE),
  253.  *   it was of an unexpected type (SEC_ERROR_OCSP_UNKNOWN_RESPONSE_TYPE),
  254.  *   or a low-level or internal error occurred).
  255.  */
  256. extern CERTOCSPResponse *
  257. CERT_DecodeOCSPResponse(SECItem *src);
  258. /*
  259.  * FUNCTION: CERT_DestroyOCSPResponse
  260.  *   Frees an OCSP Response structure.
  261.  * INPUTS:
  262.  *   CERTOCSPResponse *request
  263.  *     Pointer to CERTOCSPResponse to be freed.
  264.  * RETURN:
  265.  *   No return value; no errors.
  266.  */
  267. extern void
  268. CERT_DestroyOCSPResponse(CERTOCSPResponse *response);
  269. /*
  270.  * FUNCTION: CERT_GetEncodedOCSPResponse
  271.  *   Creates and sends a request to an OCSP responder, then reads and
  272.  *   returns the (encoded) response.
  273.  * INPUTS:
  274.  *   PRArenaPool *arena
  275.  *     Pointer to arena from which return value will be allocated.
  276.  *     If NULL, result will be allocated from the heap (and thus should
  277.  *     be freed via SECITEM_FreeItem).
  278.  *   CERTCertList *certList
  279.  *     A list of certs for which status will be requested.
  280.  *     Note that all of these certificates should have the same issuer,
  281.  *     or it's expected the response will be signed by a trusted responder.
  282.  *     If the certs need to be broken up into multiple requests, that
  283.  *     must be handled by the caller (and thus by having multiple calls
  284.  *     to this routine), who knows about where the request(s) are being
  285.  *     sent and whether there are any trusted responders in place.
  286.  *   char *location
  287.  *     The location of the OCSP responder (a URL).
  288.  *   int64 time
  289.  *     Indicates the time for which the certificate status is to be 
  290.  *     determined -- this may be used in the search for the cert's issuer
  291.  *     but has no other bearing on the operation.
  292.  *   PRBool addServiceLocator
  293.  *     If true, the Service Locator extension should be added to the
  294.  *     single request(s) for each cert.
  295.  *   CERTCertificate *signerCert
  296.  *     If non-NULL, means sign the request using this cert.  Otherwise,
  297.  *     do not sign.
  298.  *   void *pwArg
  299.  *     Pointer to argument for password prompting, if needed.  (Definitely
  300.  *     not needed if not signing.)
  301.  * OUTPUTS:
  302.  *   CERTOCSPRequest **pRequest
  303.  *     Pointer in which to store the OCSP request created for the given
  304.  *     list of certificates.  It is only filled in if the entire operation
  305.  *     is successful and the pointer is not null -- and in that case the
  306.  *     caller is then reponsible for destroying it.
  307.  * RETURN:
  308.  *   Returns a pointer to the SECItem holding the response.
  309.  *   On error, returns null with error set describing the reason:
  310.  * SEC_ERROR_UNKNOWN_ISSUER
  311.  * SEC_ERROR_CERT_BAD_ACCESS_LOCATION
  312.  * SEC_ERROR_OCSP_BAD_HTTP_RESPONSE
  313.  *   Other errors are low-level problems (no memory, bad database, etc.).
  314.  */
  315. extern SECItem *
  316. CERT_GetEncodedOCSPResponse(PRArenaPool *arena, CERTCertList *certList,
  317.     char *location, int64 time,
  318.     PRBool addServiceLocator,
  319.     CERTCertificate *signerCert, void *pwArg,
  320.     CERTOCSPRequest **pRequest);
  321. /*
  322.  * FUNCTION: CERT_VerifyOCSPResponseSignature
  323.  *   Check the signature on an OCSP Response.  Will also perform a
  324.  *   verification of the signer's certificate.  Note, however, that a
  325.  *   successful verification does not make any statement about the
  326.  *   signer's *authority* to provide status for the certificate(s),
  327.  *   that must be checked individually for each certificate.
  328.  * INPUTS:
  329.  *   CERTOCSPResponse *response
  330.  *     Pointer to response structure with signature to be checked.
  331.  *   CERTCertDBHandle *handle
  332.  *     Pointer to CERTCertDBHandle for certificate DB to use for verification.
  333.  *   void *pwArg
  334.  *     Pointer to argument for password prompting, if needed.
  335.  * OUTPUTS:
  336.  *   CERTCertificate **pSignerCert
  337.  *     Pointer in which to store signer's certificate; only filled-in if
  338.  *     non-null.
  339.  * RETURN:
  340.  *   Returns SECSuccess when signature is valid, anything else means invalid.
  341.  *   Possible errors set:
  342.  * SEC_ERROR_OCSP_MALFORMED_RESPONSE - unknown type of ResponderID
  343.  * SEC_ERROR_INVALID_TIME - bad format of "ProducedAt" time
  344.  * SEC_ERROR_UNKNOWN_SIGNER - signer's cert could not be found
  345.  * SEC_ERROR_BAD_SIGNATURE - the signature did not verify
  346.  *   Other errors are any of the many possible failures in cert verification
  347.  *   (e.g. SEC_ERROR_REVOKED_CERTIFICATE, SEC_ERROR_UNTRUSTED_ISSUER) when
  348.  *   verifying the signer's cert, or low-level problems (no memory, etc.)
  349.  */
  350. extern SECStatus
  351. CERT_VerifyOCSPResponseSignature(CERTOCSPResponse *response,
  352.  CERTCertDBHandle *handle, void *pwArg,
  353.  CERTCertificate **pSignerCert);
  354. /*
  355.  * FUNCTION: CERT_GetOCSPAuthorityInfoAccessLocation
  356.  *   Get the value of the URI of the OCSP responder for the given cert.
  357.  *   This is found in the (optional) Authority Information Access extension
  358.  *   in the cert.
  359.  * INPUTS:
  360.  *   CERTCertificate *cert
  361.  *     The certificate being examined.
  362.  * RETURN:
  363.  *   char *
  364.  *     A copy of the URI for the OCSP method, if found.  If either the
  365.  *     extension is not present or it does not contain an entry for OCSP,
  366.  *     SEC_ERROR_EXTENSION_NOT_FOUND will be set and a NULL returned.
  367.  *     Any other error will also result in a NULL being returned.
  368.  *     
  369.  *     This result should be freed (via PORT_Free) when no longer in use.
  370.  */
  371. extern char *
  372. CERT_GetOCSPAuthorityInfoAccessLocation(CERTCertificate *cert);
  373. /*
  374.  * FUNCTION: CERT_CheckOCSPStatus
  375.  *   Checks the status of a certificate via OCSP.  Will only check status for
  376.  *   a certificate that has an AIA (Authority Information Access) extension
  377.  *   for OCSP *or* when a "default responder" is specified and enabled.
  378.  *   (If no AIA extension for OCSP and no default responder in place, the
  379.  *   cert is considered to have a good status and SECSuccess is returned.)
  380.  * INPUTS:
  381.  *   CERTCertDBHandle *handle
  382.  *     certificate DB of the cert that is being checked
  383.  *   CERTCertificate *cert
  384.  *     the certificate being checked
  385.  *   XXX in the long term also need a boolean parameter that specifies
  386.  * whether to check the cert chain, as well; for now we check only
  387.  * the leaf (the specified certificate)
  388.  *   int64 time
  389.  *     time for which status is to be determined
  390.  *   void *pwArg
  391.  *     argument for password prompting, if needed
  392.  * RETURN:
  393.  *   Returns SECSuccess if an approved OCSP responder "knows" the cert
  394.  *   *and* returns a non-revoked status for it; SECFailure otherwise,
  395.  *   with an error set describing the reason:
  396.  *
  397.  * SEC_ERROR_OCSP_BAD_HTTP_RESPONSE
  398.  * SEC_ERROR_OCSP_FUTURE_RESPONSE
  399.  * SEC_ERROR_OCSP_MALFORMED_REQUEST
  400.  * SEC_ERROR_OCSP_MALFORMED_RESPONSE
  401.  * SEC_ERROR_OCSP_OLD_RESPONSE
  402.  * SEC_ERROR_OCSP_REQUEST_NEEDS_SIG
  403.  * SEC_ERROR_OCSP_SERVER_ERROR
  404.  * SEC_ERROR_OCSP_TRY_SERVER_LATER
  405.  * SEC_ERROR_OCSP_UNAUTHORIZED_REQUEST
  406.  * SEC_ERROR_OCSP_UNAUTHORIZED_RESPONSE
  407.  * SEC_ERROR_OCSP_UNKNOWN_CERT
  408.  * SEC_ERROR_OCSP_UNKNOWN_RESPONSE_STATUS
  409.  * SEC_ERROR_OCSP_UNKNOWN_RESPONSE_TYPE
  410.  *
  411.  * SEC_ERROR_BAD_SIGNATURE
  412.  * SEC_ERROR_CERT_BAD_ACCESS_LOCATION
  413.  * SEC_ERROR_INVALID_TIME
  414.  * SEC_ERROR_REVOKED_CERTIFICATE
  415.  * SEC_ERROR_UNKNOWN_ISSUER
  416.  * SEC_ERROR_UNKNOWN_SIGNER
  417.  *
  418.  *   Other errors are any of the many possible failures in cert verification
  419.  *   (e.g. SEC_ERROR_REVOKED_CERTIFICATE, SEC_ERROR_UNTRUSTED_ISSUER) when
  420.  *   verifying the signer's cert, or low-level problems (error allocating
  421.  *   memory, error performing ASN.1 decoding, etc.).
  422.  */    
  423. extern SECStatus 
  424. CERT_CheckOCSPStatus(CERTCertDBHandle *handle, CERTCertificate *cert,
  425.      int64 time, void *pwArg);
  426. /************************************************************************/
  427. SEC_END_PROTOS
  428. #endif /* _OCSP_H_ */