tor-browser

The Tor Browser
git clone https://git.dasho.dev/tor-browser.git
Log | Files | Refs | README | LICENSE

ocsp.h (28871B)


      1 /* This Source Code Form is subject to the terms of the Mozilla Public
      2 * License, v. 2.0. If a copy of the MPL was not distributed with this
      3 * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
      4 
      5 /*
      6 * Interface to the OCSP implementation.
      7 */
      8 
      9 #ifndef _OCSP_H_
     10 #define _OCSP_H_
     11 
     12 #include "plarena.h"
     13 #include "seccomon.h"
     14 #include "secoidt.h"
     15 #include "keythi.h"
     16 #include "certt.h"
     17 #include "ocspt.h"
     18 
     19 /************************************************************************/
     20 SEC_BEGIN_PROTOS
     21 
     22 /*
     23 * This function registers the HttpClient with whose functions the
     24 * HttpClientFcn structure has been populated as the default Http
     25 * client.
     26 *
     27 * The function table must be a global object.
     28 * The caller must ensure that NSS will be able to call
     29 * the registered functions for the lifetime of the process.
     30 */
     31 extern SECStatus
     32 SEC_RegisterDefaultHttpClient(const SEC_HttpClientFcn *fcnTable);
     33 
     34 /*
     35 * This function obtains the HttpClient which has been registered
     36 * by an earlier call to SEC_RegisterDefaultHttpClient.
     37 */
     38 extern const SEC_HttpClientFcn *
     39 SEC_GetRegisteredHttpClient(void);
     40 
     41 /*
     42 * Sets parameters that control NSS' internal OCSP cache.
     43 * maxCacheEntries, special varlues are:
     44 *   -1 disable cache
     45 *   0 unlimited cache entries
     46 * minimumSecondsToNextFetchAttempt:
     47 *   whenever an OCSP request was attempted or completed over the network,
     48 *   wait at least this number of seconds before trying to fetch again.
     49 * maximumSecondsToNextFetchAttempt:
     50 *   this is the maximum age of a cached response we allow, until we try
     51 *   to fetch an updated response, even if the OCSP responder expects
     52 *   that newer information update will not be available yet.
     53 */
     54 extern SECStatus
     55 CERT_OCSPCacheSettings(PRInt32 maxCacheEntries,
     56                       PRUint32 minimumSecondsToNextFetchAttempt,
     57                       PRUint32 maximumSecondsToNextFetchAttempt);
     58 
     59 /*
     60 * Set the desired behaviour on OCSP failures.
     61 * See definition of ocspFailureMode for allowed choices.
     62 */
     63 extern SECStatus
     64 CERT_SetOCSPFailureMode(SEC_OcspFailureMode ocspFailureMode);
     65 
     66 /*
     67 * Configure the maximum time NSS will wait for an OCSP response.
     68 */
     69 extern SECStatus
     70 CERT_SetOCSPTimeout(PRUint32 seconds);
     71 
     72 /*
     73 * Removes all items currently stored in the OCSP cache.
     74 */
     75 extern SECStatus
     76 CERT_ClearOCSPCache(void);
     77 
     78 /*
     79 * FUNCTION: CERT_EnableOCSPChecking
     80 *   Turns on OCSP checking for the given certificate database.
     81 * INPUTS:
     82 *   CERTCertDBHandle *handle
     83 *     Certificate database for which OCSP checking will be enabled.
     84 * RETURN:
     85 *   Returns SECFailure if an error occurred (likely only problem
     86 *   allocating memory); SECSuccess otherwise.
     87 */
     88 extern SECStatus
     89 CERT_EnableOCSPChecking(CERTCertDBHandle *handle);
     90 
     91 /*
     92 * FUNCTION: CERT_DisableOCSPChecking
     93 *   Turns off OCSP checking for the given certificate database.
     94 *   This routine disables OCSP checking.  Though it will return
     95 *   SECFailure if OCSP checking is not enabled, it is "safe" to
     96 *   call it that way and just ignore the return value, if it is
     97 *   easier to just call it than to "remember" whether it is enabled.
     98 * INPUTS:
     99 *   CERTCertDBHandle *handle
    100 *     Certificate database for which OCSP checking will be disabled.
    101 * RETURN:
    102 *   Returns SECFailure if an error occurred (usually means that OCSP
    103 *   checking was not enabled or status contexts were not initialized --
    104 *   error set will be SEC_ERROR_OCSP_NOT_ENABLED); SECSuccess otherwise.
    105 */
    106 extern SECStatus
    107 CERT_DisableOCSPChecking(CERTCertDBHandle *handle);
    108 
    109 /*
    110 * FUNCTION: CERT_SetOCSPDefaultResponder
    111 *   Specify the location and cert of the default responder.
    112 *   If OCSP checking is already enabled *and* use of a default responder
    113 *   is also already enabled, all OCSP checking from now on will go directly
    114 *   to the specified responder.  If OCSP checking is not enabled, or if
    115 *   it is but use of a default responder is not enabled, the information
    116 *   will be recorded and take effect whenever both are enabled.
    117 * INPUTS:
    118 *   CERTCertDBHandle *handle
    119 *     Cert database on which OCSP checking should use the default responder.
    120 *   const char *url
    121 *     The location of the default responder (e.g. "http://foo.com:80/ocsp")
    122 *     Note that the location will not be tested until the first attempt
    123 *     to send a request there.
    124 *   const char *name
    125 *     The nickname of the cert to trust (expected) to sign the OCSP responses.
    126 *     If the corresponding cert cannot be found, SECFailure is returned.
    127 * RETURN:
    128 *   Returns SECFailure if an error occurred; SECSuccess otherwise.
    129 *   The most likely error is that the cert for "name" could not be found
    130 *   (probably SEC_ERROR_UNKNOWN_CERT).  Other errors are low-level (no memory,
    131 *   bad database, etc.).
    132 */
    133 extern SECStatus
    134 CERT_SetOCSPDefaultResponder(CERTCertDBHandle *handle,
    135                             const char *url, const char *name);
    136 
    137 /*
    138 * FUNCTION: CERT_EnableOCSPDefaultResponder
    139 *   Turns on use of a default responder when OCSP checking.
    140 *   If OCSP checking is already enabled, this will make subsequent checks
    141 *   go directly to the default responder.  (The location of the responder
    142 *   and the nickname of the responder cert must already be specified.)
    143 *   If OCSP checking is not enabled, this will be recorded and take effect
    144 *   whenever it is enabled.
    145 * INPUTS:
    146 *   CERTCertDBHandle *handle
    147 *     Cert database on which OCSP checking should use the default responder.
    148 * RETURN:
    149 *   Returns SECFailure if an error occurred; SECSuccess otherwise.
    150 *   No errors are especially likely unless the caller did not previously
    151 *   perform a successful call to SetOCSPDefaultResponder (in which case
    152 *   the error set will be SEC_ERROR_OCSP_NO_DEFAULT_RESPONDER).
    153 */
    154 extern SECStatus
    155 CERT_EnableOCSPDefaultResponder(CERTCertDBHandle *handle);
    156 
    157 /*
    158 * FUNCTION: CERT_DisableOCSPDefaultResponder
    159 *   Turns off use of a default responder when OCSP checking.
    160 *   (Does nothing if use of a default responder is not enabled.)
    161 * INPUTS:
    162 *   CERTCertDBHandle *handle
    163 *     Cert database on which OCSP checking should stop using a default
    164 *     responder.
    165 * RETURN:
    166 *   Returns SECFailure if an error occurred; SECSuccess otherwise.
    167 *   Errors very unlikely (like random memory corruption...).
    168 */
    169 extern SECStatus
    170 CERT_DisableOCSPDefaultResponder(CERTCertDBHandle *handle);
    171 
    172 /* If forcePost is set, OCSP requests will only be sent using the HTTP POST
    173 * method. When forcePost is not set, OCSP requests will be sent using the
    174 * HTTP GET method, with a fallback to POST when we fail to receive a response
    175 * and/or when we receive an uncacheable response like "Unknown."
    176 *
    177 * The default is to use GET and fallback to POST.
    178 */
    179 extern SECStatus CERT_ForcePostMethodForOCSP(PRBool forcePost);
    180 
    181 /*
    182 * -------------------------------------------------------
    183 * The Functions above are those expected to be used by a client
    184 * providing OCSP status checking along with every cert verification.
    185 * The functions below are for OCSP testing, debugging, or clients
    186 * or servers performing more specialized OCSP tasks.
    187 * -------------------------------------------------------
    188 */
    189 
    190 /*
    191 * FUNCTION: CERT_CreateOCSPRequest
    192 *   Creates a CERTOCSPRequest, requesting the status of the certs in
    193 *   the given list.
    194 * INPUTS:
    195 *   CERTCertList *certList
    196 *     A list of certs for which status will be requested.
    197 *     Note that all of these certificates should have the same issuer,
    198 *     or it's expected the response will be signed by a trusted responder.
    199 *     If the certs need to be broken up into multiple requests, that
    200 *     must be handled by the caller (and thus by having multiple calls
    201 *     to this routine), who knows about where the request(s) are being
    202 *     sent and whether there are any trusted responders in place.
    203 *   PRTime time
    204 *     Indicates the time for which the certificate status is to be
    205 *     determined -- this may be used in the search for the cert's issuer
    206 *     but has no effect on the request itself.
    207 *   PRBool addServiceLocator
    208 *     If true, the Service Locator extension should be added to the
    209 *     single request(s) for each cert.
    210 *   CERTCertificate *signerCert
    211 *     If non-NULL, means sign the request using this cert.  Otherwise,
    212 *     do not sign.
    213 *     XXX note that request signing is not yet supported; see comment in code
    214 * RETURN:
    215 *   A pointer to a CERTOCSPRequest structure containing an OCSP request
    216 *   for the cert list.  On error, null is returned, with an error set
    217 *   indicating the reason.  This is likely SEC_ERROR_UNKNOWN_ISSUER.
    218 *   (The issuer is needed to create a request for the certificate.)
    219 *   Other errors are low-level problems (no memory, bad database, etc.).
    220 */
    221 extern CERTOCSPRequest *
    222 CERT_CreateOCSPRequest(CERTCertList *certList, PRTime time,
    223                       PRBool addServiceLocator,
    224                       CERTCertificate *signerCert);
    225 
    226 /*
    227 * FUNCTION: CERT_AddOCSPAcceptableResponses
    228 *   Add the AcceptableResponses extension to an OCSP Request.
    229 * INPUTS:
    230 *   CERTOCSPRequest *request
    231 *     The request to which the extension should be added.
    232 *   SECOidTag responseType0, ...
    233 *     A list (of one or more) of SECOidTag -- each of the response types
    234 *     to be added.  The last OID *must* be SEC_OID_PKIX_OCSP_BASIC_RESPONSE.
    235 *     (This marks the end of the list, and it must be specified because a
    236 *     client conforming to the OCSP standard is required to handle the basic
    237 *     response type.)  The OIDs are not checked in any way.
    238 * RETURN:
    239 *   SECSuccess if the extension is added; SECFailure if anything goes wrong.
    240 *   All errors are internal or low-level problems (e.g. no memory).
    241 */
    242 extern SECStatus
    243 CERT_AddOCSPAcceptableResponses(CERTOCSPRequest *request,
    244                                SECOidTag responseType0, ...);
    245 
    246 /*
    247 * FUNCTION: CERT_EncodeOCSPRequest
    248 *   DER encodes an OCSP Request, possibly adding a signature as well.
    249 *   XXX Signing is not yet supported, however; see comments in code.
    250 * INPUTS:
    251 *   PLArenaPool *arena
    252 *     The return value is allocated from here.
    253 *     If a NULL is passed in, allocation is done from the heap instead.
    254 *   CERTOCSPRequest *request
    255 *     The request to be encoded.
    256 *   void *pwArg
    257 *     Pointer to argument for password prompting, if needed.  (Definitely
    258 *     not needed if not signing.)
    259 * RETURN:
    260 *   Returns a NULL on error and a pointer to the SECItem with the
    261 *   encoded value otherwise.  Any error is likely to be low-level
    262 *   (e.g. no memory).
    263 */
    264 extern SECItem *
    265 CERT_EncodeOCSPRequest(PLArenaPool *arena, CERTOCSPRequest *request,
    266                       void *pwArg);
    267 
    268 /*
    269 * FUNCTION: CERT_DecodeOCSPRequest
    270 *   Decode a DER encoded OCSP Request.
    271 * INPUTS:
    272 *   SECItem *src
    273 *     Pointer to a SECItem holding DER encoded OCSP Request.
    274 * RETURN:
    275 *   Returns a pointer to a CERTOCSPRequest containing the decoded request.
    276 *   On error, returns NULL.  Most likely error is trouble decoding
    277 *   (SEC_ERROR_OCSP_MALFORMED_REQUEST), or low-level problem (no memory).
    278 */
    279 extern CERTOCSPRequest *
    280 CERT_DecodeOCSPRequest(const SECItem *src);
    281 
    282 /*
    283 * FUNCTION: CERT_DestroyOCSPRequest
    284 *   Frees an OCSP Request structure.
    285 * INPUTS:
    286 *   CERTOCSPRequest *request
    287 *     Pointer to CERTOCSPRequest to be freed.
    288 * RETURN:
    289 *   No return value; no errors.
    290 */
    291 extern void
    292 CERT_DestroyOCSPRequest(CERTOCSPRequest *request);
    293 
    294 /*
    295 * FUNCTION: CERT_DecodeOCSPResponse
    296 *   Decode a DER encoded OCSP Response.
    297 * INPUTS:
    298 *   SECItem *src
    299 *     Pointer to a SECItem holding DER encoded OCSP Response.
    300 * RETURN:
    301 *   Returns a pointer to a CERTOCSPResponse (the decoded OCSP Response);
    302 *   the caller is responsible for destroying it.  Or NULL if error (either
    303 *   response could not be decoded (SEC_ERROR_OCSP_MALFORMED_RESPONSE),
    304 *   it was of an unexpected type (SEC_ERROR_OCSP_UNKNOWN_RESPONSE_TYPE),
    305 *   or a low-level or internal error occurred).
    306 */
    307 extern CERTOCSPResponse *
    308 CERT_DecodeOCSPResponse(const SECItem *src);
    309 
    310 /*
    311 * FUNCTION: CERT_DestroyOCSPResponse
    312 *   Frees an OCSP Response structure.
    313 * INPUTS:
    314 *   CERTOCSPResponse *request
    315 *     Pointer to CERTOCSPResponse to be freed.
    316 * RETURN:
    317 *   No return value; no errors.
    318 */
    319 extern void
    320 CERT_DestroyOCSPResponse(CERTOCSPResponse *response);
    321 
    322 /*
    323 * FUNCTION: CERT_GetEncodedOCSPResponse
    324 *   Creates and sends a request to an OCSP responder, then reads and
    325 *   returns the (encoded) response.
    326 * INPUTS:
    327 *   PLArenaPool *arena
    328 *     Pointer to arena from which return value will be allocated.
    329 *     If NULL, result will be allocated from the heap (and thus should
    330 *     be freed via SECITEM_FreeItem).
    331 *   CERTCertList *certList
    332 *     A list of certs for which status will be requested.
    333 *     Note that all of these certificates should have the same issuer,
    334 *     or it's expected the response will be signed by a trusted responder.
    335 *     If the certs need to be broken up into multiple requests, that
    336 *     must be handled by the caller (and thus by having multiple calls
    337 *     to this routine), who knows about where the request(s) are being
    338 *     sent and whether there are any trusted responders in place.
    339 *   const char *location
    340 *     The location of the OCSP responder (a URL).
    341 *   PRTime time
    342 *     Indicates the time for which the certificate status is to be
    343 *     determined -- this may be used in the search for the cert's issuer
    344 *     but has no other bearing on the operation.
    345 *   PRBool addServiceLocator
    346 *     If true, the Service Locator extension should be added to the
    347 *     single request(s) for each cert.
    348 *   CERTCertificate *signerCert
    349 *     If non-NULL, means sign the request using this cert.  Otherwise,
    350 *     do not sign.
    351 *   void *pwArg
    352 *     Pointer to argument for password prompting, if needed.  (Definitely
    353 *     not needed if not signing.)
    354 * OUTPUTS:
    355 *   CERTOCSPRequest **pRequest
    356 *     Pointer in which to store the OCSP request created for the given
    357 *     list of certificates.  It is only filled in if the entire operation
    358 *     is successful and the pointer is not null -- and in that case the
    359 *     caller is then reponsible for destroying it.
    360 * RETURN:
    361 *   Returns a pointer to the SECItem holding the response.
    362 *   On error, returns null with error set describing the reason:
    363 *	SEC_ERROR_UNKNOWN_ISSUER
    364 *	SEC_ERROR_CERT_BAD_ACCESS_LOCATION
    365 *	SEC_ERROR_OCSP_BAD_HTTP_RESPONSE
    366 *   Other errors are low-level problems (no memory, bad database, etc.).
    367 */
    368 extern SECItem *
    369 CERT_GetEncodedOCSPResponse(PLArenaPool *arena, CERTCertList *certList,
    370                            const char *location, PRTime time,
    371                            PRBool addServiceLocator,
    372                            CERTCertificate *signerCert, void *pwArg,
    373                            CERTOCSPRequest **pRequest);
    374 
    375 /*
    376 * FUNCTION: CERT_VerifyOCSPResponseSignature
    377 *   Check the signature on an OCSP Response.  Will also perform a
    378 *   verification of the signer's certificate.  Note, however, that a
    379 *   successful verification does not make any statement about the
    380 *   signer's *authority* to provide status for the certificate(s),
    381 *   that must be checked individually for each certificate.
    382 * INPUTS:
    383 *   CERTOCSPResponse *response
    384 *     Pointer to response structure with signature to be checked.
    385 *   CERTCertDBHandle *handle
    386 *     Pointer to CERTCertDBHandle for certificate DB to use for verification.
    387 *   void *pwArg
    388 *     Pointer to argument for password prompting, if needed.
    389 *   CERTCertificate *issuerCert
    390 *     Issuer of the certificate that generated the OCSP request.
    391 * OUTPUTS:
    392 *   CERTCertificate **pSignerCert
    393 *     Pointer in which to store signer's certificate; only filled-in if
    394 *     non-null.
    395 * RETURN:
    396 *   Returns SECSuccess when signature is valid, anything else means invalid.
    397 *   Possible errors set:
    398 *	SEC_ERROR_OCSP_MALFORMED_RESPONSE - unknown type of ResponderID
    399 *	SEC_ERROR_INVALID_TIME - bad format of "ProducedAt" time
    400 *	SEC_ERROR_UNKNOWN_SIGNER - signer's cert could not be found
    401 *	SEC_ERROR_BAD_SIGNATURE - the signature did not verify
    402 *   Other errors are any of the many possible failures in cert verification
    403 *   (e.g. SEC_ERROR_REVOKED_CERTIFICATE, SEC_ERROR_UNTRUSTED_ISSUER) when
    404 *   verifying the signer's cert, or low-level problems (no memory, etc.)
    405 */
    406 extern SECStatus
    407 CERT_VerifyOCSPResponseSignature(CERTOCSPResponse *response,
    408                                 CERTCertDBHandle *handle, void *pwArg,
    409                                 CERTCertificate **pSignerCert,
    410                                 CERTCertificate *issuerCert);
    411 
    412 /*
    413 * FUNCTION: CERT_GetOCSPAuthorityInfoAccessLocation
    414 *   Get the value of the URI of the OCSP responder for the given cert.
    415 *   This is found in the (optional) Authority Information Access extension
    416 *   in the cert.
    417 * INPUTS:
    418 *   CERTCertificate *cert
    419 *     The certificate being examined.
    420 * RETURN:
    421 *   char *
    422 *     A copy of the URI for the OCSP method, if found.  If either the
    423 *     extension is not present or it does not contain an entry for OCSP,
    424 *     SEC_ERROR_EXTENSION_NOT_FOUND will be set and a NULL returned.
    425 *     Any other error will also result in a NULL being returned.
    426 *
    427 *     This result should be freed (via PORT_Free) when no longer in use.
    428 */
    429 extern char *
    430 CERT_GetOCSPAuthorityInfoAccessLocation(const CERTCertificate *cert);
    431 
    432 /*
    433 * FUNCTION: CERT_RegisterAlternateOCSPAIAInfoCallBack
    434 *   This function serves two purposes.
    435 *   1) It registers the address of a callback function that will be
    436 *   called for certs that have no OCSP AIA extension, to see if the
    437 *   callback wishes to supply an alternative URL for such an OCSP inquiry.
    438 *   2) It outputs the previously registered function's address to the
    439 *   address supplied by the caller, unless that is NULL.
    440 *   The registered callback function returns NULL, or an allocated string
    441 *   that may be subsequently freed by calling PORT_Free().
    442 * RETURN:
    443 *   SECSuccess or SECFailure (if the library is not yet intialized)
    444 */
    445 extern SECStatus
    446 CERT_RegisterAlternateOCSPAIAInfoCallBack(
    447    CERT_StringFromCertFcn newCallback,
    448    CERT_StringFromCertFcn *oldCallback);
    449 
    450 /*
    451 * FUNCTION: CERT_ParseURL
    452 *   Parse a URI into hostname, port, and path.  The scheme in the URI must
    453 *   be "http".
    454 * INPUTS:
    455 *   const char *url
    456 *     The URI to be parsed
    457 * OUTPUTS:
    458 *   char **pHostname
    459 *     Pointer to store the hostname obtained from the URI.
    460 *     This result should be freed (via PORT_Free) when no longer in use.
    461 *   PRUint16 *pPort
    462 *     Pointer to store the port number obtained from the URI.
    463 *   char **pPath
    464 *     Pointer to store the path obtained from the URI.
    465 *     This result should be freed (via PORT_Free) when no longer in use.
    466 * RETURN:
    467 *   Returns SECSuccess when parsing was successful. Returns SECFailure when
    468 *   problems were encountered.
    469 */
    470 extern SECStatus
    471 CERT_ParseURL(const char *url, char **pHostname, PRUint16 *pPort, char **pPath);
    472 
    473 /*
    474 * FUNCTION: CERT_CheckOCSPStatus
    475 *   Checks the status of a certificate via OCSP.  Will only check status for
    476 *   a certificate that has an AIA (Authority Information Access) extension
    477 *   for OCSP *or* when a "default responder" is specified and enabled.
    478 *   (If no AIA extension for OCSP and no default responder in place, the
    479 *   cert is considered to have a good status and SECSuccess is returned.)
    480 * INPUTS:
    481 *   CERTCertDBHandle *handle
    482 *     certificate DB of the cert that is being checked
    483 *   CERTCertificate *cert
    484 *     the certificate being checked
    485 *   XXX in the long term also need a boolean parameter that specifies
    486 *	whether to check the cert chain, as well; for now we check only
    487 *	the leaf (the specified certificate)
    488 *   PRTime time
    489 *     time for which status is to be determined
    490 *   void *pwArg
    491 *     argument for password prompting, if needed
    492 * RETURN:
    493 *   Returns SECSuccess if an approved OCSP responder "knows" the cert
    494 *   *and* returns a non-revoked status for it; SECFailure otherwise,
    495 *   with an error set describing the reason:
    496 *
    497 *	SEC_ERROR_OCSP_BAD_HTTP_RESPONSE
    498 *	SEC_ERROR_OCSP_FUTURE_RESPONSE
    499 *	SEC_ERROR_OCSP_MALFORMED_REQUEST
    500 *	SEC_ERROR_OCSP_MALFORMED_RESPONSE
    501 *	SEC_ERROR_OCSP_OLD_RESPONSE
    502 *	SEC_ERROR_OCSP_REQUEST_NEEDS_SIG
    503 *	SEC_ERROR_OCSP_SERVER_ERROR
    504 *	SEC_ERROR_OCSP_TRY_SERVER_LATER
    505 *	SEC_ERROR_OCSP_UNAUTHORIZED_REQUEST
    506 *	SEC_ERROR_OCSP_UNAUTHORIZED_RESPONSE
    507 *	SEC_ERROR_OCSP_UNKNOWN_CERT
    508 *	SEC_ERROR_OCSP_UNKNOWN_RESPONSE_STATUS
    509 *	SEC_ERROR_OCSP_UNKNOWN_RESPONSE_TYPE
    510 *
    511 *	SEC_ERROR_BAD_SIGNATURE
    512 *	SEC_ERROR_CERT_BAD_ACCESS_LOCATION
    513 *	SEC_ERROR_INVALID_TIME
    514 *	SEC_ERROR_REVOKED_CERTIFICATE
    515 *	SEC_ERROR_UNKNOWN_ISSUER
    516 *	SEC_ERROR_UNKNOWN_SIGNER
    517 *
    518 *   Other errors are any of the many possible failures in cert verification
    519 *   (e.g. SEC_ERROR_REVOKED_CERTIFICATE, SEC_ERROR_UNTRUSTED_ISSUER) when
    520 *   verifying the signer's cert, or low-level problems (error allocating
    521 *   memory, error performing ASN.1 decoding, etc.).
    522 */
    523 extern SECStatus
    524 CERT_CheckOCSPStatus(CERTCertDBHandle *handle, CERTCertificate *cert,
    525                     PRTime time, void *pwArg);
    526 
    527 /*
    528 * FUNCTION: CERT_CacheOCSPResponseFromSideChannel
    529 *   First, this function checks the OCSP cache to see if a good response
    530 *   for the given certificate already exists. If it does, then the function
    531 *   returns successfully.
    532 *
    533 *   If not, then it validates that the given OCSP response is a valid,
    534 *   good response for the given certificate and inserts it into the
    535 *   cache.
    536 *
    537 *   This function is intended for use when OCSP responses are provided via a
    538 *   side-channel, i.e. TLS OCSP stapling (a.k.a. the status_request extension).
    539 *
    540 * INPUTS:
    541 *   CERTCertDBHandle *handle
    542 *     certificate DB of the cert that is being checked
    543 *   CERTCertificate *cert
    544 *     the certificate being checked
    545 *   PRTime time
    546 *     time for which status is to be determined
    547 *   SECItem *encodedResponse
    548 *     the DER encoded bytes of the OCSP response
    549 *   void *pwArg
    550 *     argument for password prompting, if needed
    551 * RETURN:
    552 *   SECSuccess if the cert was found in the cache, or if the OCSP response was
    553 *   found to be valid and inserted into the cache. SECFailure otherwise.
    554 */
    555 extern SECStatus
    556 CERT_CacheOCSPResponseFromSideChannel(CERTCertDBHandle *handle,
    557                                      CERTCertificate *cert,
    558                                      PRTime time,
    559                                      const SECItem *encodedResponse,
    560                                      void *pwArg);
    561 
    562 /*
    563 * FUNCTION: CERT_GetOCSPStatusForCertID
    564 *  Returns the OCSP status contained in the passed in parameter response
    565 *  that corresponds to the certID passed in.
    566 * INPUTS:
    567 *  CERTCertDBHandle *handle
    568 *    certificate DB of the cert that is being checked
    569 *  CERTOCSPResponse *response
    570 *    the OCSP response we want to retrieve status from.
    571 *  CERTOCSPCertID *certID
    572 *    the ID we want to look for from the response.
    573 *  CERTCertificate *signerCert
    574 *    the certificate that was used to sign the OCSP response.
    575 *    must be obtained via a call to CERT_VerifyOCSPResponseSignature.
    576 *  PRTime time
    577 *    The time at which we're checking the status for.
    578 *  RETURN:
    579 *    Return values are the same as those for CERT_CheckOCSPStatus
    580 */
    581 extern SECStatus
    582 CERT_GetOCSPStatusForCertID(CERTCertDBHandle *handle,
    583                            CERTOCSPResponse *response,
    584                            CERTOCSPCertID *certID,
    585                            CERTCertificate *signerCert,
    586                            PRTime time);
    587 
    588 /*
    589 * FUNCTION CERT_GetOCSPResponseStatus
    590 *   Returns the response status for the response passed.
    591 * INPUTS:
    592 *   CERTOCSPResponse *response
    593 *     The response to query for status
    594 *  RETURN:
    595 *    Returns SECSuccess if the response has a successful status value.
    596 *    Otherwise it returns SECFailure and sets one of the following error
    597 *    codes via PORT_SetError
    598 *        SEC_ERROR_OCSP_MALFORMED_REQUEST
    599 *        SEC_ERROR_OCSP_SERVER_ERROR
    600 *        SEC_ERROR_OCSP_TRY_SERVER_LATER
    601 *        SEC_ERROR_OCSP_REQUEST_NEEDS_SIG
    602 *        SEC_ERROR_OCSP_UNAUTHORIZED_REQUEST
    603 *        SEC_ERROR_OCSP_UNKNOWN_RESPONSE_STATUS
    604 */
    605 extern SECStatus
    606 CERT_GetOCSPResponseStatus(CERTOCSPResponse *response);
    607 
    608 /*
    609 * FUNCTION CERT_CreateOCSPCertID
    610 *  Returns the OCSP certID for the certificate passed in.
    611 * INPUTS:
    612 *  CERTCertificate *cert
    613 *    The certificate for which to create the certID for.
    614 *  PRTime time
    615 *    The time at which the id is requested for.  This is used
    616 *    to determine the appropriate issuer for the cert since
    617 *    the issuing CA may be an older expired certificate.
    618 *  RETURN:
    619 *    A new copy of a CERTOCSPCertID*.  The memory for this certID
    620 *    should be freed by calling CERT_DestroyOCSPCertID when the
    621 *    certID is no longer necessary.
    622 */
    623 extern CERTOCSPCertID *
    624 CERT_CreateOCSPCertID(CERTCertificate *cert, PRTime time);
    625 
    626 /*
    627 * FUNCTION: CERT_DestroyOCSPCertID
    628 *  Frees the memory associated with the certID passed in.
    629 * INPUTS:
    630 *  CERTOCSPCertID* certID
    631 *    The certID that the caller no longer needs and wants to
    632 *    free the associated memory.
    633 * RETURN:
    634 *  SECSuccess if freeing the memory was successful.  Returns
    635 *  SECFailure if the memory passed in was not allocated with
    636 *  a call to CERT_CreateOCSPCertID.
    637 */
    638 extern SECStatus
    639 CERT_DestroyOCSPCertID(CERTOCSPCertID *certID);
    640 
    641 extern CERTOCSPSingleResponse *
    642 CERT_CreateOCSPSingleResponseGood(PLArenaPool *arena,
    643                                  CERTOCSPCertID *id,
    644                                  PRTime thisUpdate,
    645                                  const PRTime *nextUpdate);
    646 
    647 extern CERTOCSPSingleResponse *
    648 CERT_CreateOCSPSingleResponseUnknown(PLArenaPool *arena,
    649                                     CERTOCSPCertID *id,
    650                                     PRTime thisUpdate,
    651                                     const PRTime *nextUpdate);
    652 
    653 extern CERTOCSPSingleResponse *
    654 CERT_CreateOCSPSingleResponseRevoked(
    655    PLArenaPool *arena,
    656    CERTOCSPCertID *id,
    657    PRTime thisUpdate,
    658    const PRTime *nextUpdate,
    659    PRTime revocationTime,
    660    const CERTCRLEntryReasonCode *revocationReason);
    661 
    662 extern SECItem *
    663 CERT_CreateEncodedOCSPSuccessResponse(
    664    PLArenaPool *arena,
    665    CERTCertificate *responderCert,
    666    CERTOCSPResponderIDType responderIDType,
    667    PRTime producedAt,
    668    CERTOCSPSingleResponse **responses,
    669    void *wincx);
    670 
    671 /*
    672 * FUNCTION: CERT_CreateEncodedOCSPErrorResponse
    673 *  Creates an encoded OCSP response with an error response status.
    674 * INPUTS:
    675 *  PLArenaPool *arena
    676 *    The return value is allocated from here.
    677 *    If a NULL is passed in, allocation is done from the heap instead.
    678 *  int error
    679 *    An NSS error code indicating an error response status. The error
    680 *    code is mapped to an OCSP response status as follows:
    681 *        SEC_ERROR_OCSP_MALFORMED_REQUEST -> malformedRequest
    682 *        SEC_ERROR_OCSP_SERVER_ERROR -> internalError
    683 *        SEC_ERROR_OCSP_TRY_SERVER_LATER -> tryLater
    684 *        SEC_ERROR_OCSP_REQUEST_NEEDS_SIG -> sigRequired
    685 *        SEC_ERROR_OCSP_UNAUTHORIZED_REQUEST -> unauthorized
    686 *    where the OCSP response status is an enumerated type defined in
    687 *    RFC 2560:
    688 *    OCSPResponseStatus ::= ENUMERATED {
    689 *        successful           (0),     --Response has valid confirmations
    690 *        malformedRequest     (1),     --Illegal confirmation request
    691 *        internalError        (2),     --Internal error in issuer
    692 *        tryLater             (3),     --Try again later
    693 *                                      --(4) is not used
    694 *        sigRequired          (5),     --Must sign the request
    695 *        unauthorized         (6)      --Request unauthorized
    696 *    }
    697 * RETURN:
    698 *   Returns a pointer to the SECItem holding the response.
    699 *   On error, returns null with error set describing the reason:
    700 *	SEC_ERROR_INVALID_ARGS
    701 *   Other errors are low-level problems (no memory, bad database, etc.).
    702 */
    703 extern SECItem *
    704 CERT_CreateEncodedOCSPErrorResponse(PLArenaPool *arena, int error);
    705 
    706 /* Sends an OCSP request using the HTTP POST method to the location addressed
    707 * by the URL in |location| parameter. The request body will be
    708 * |encodedRequest|, which must be a valid encoded OCSP request. On success,
    709 * the server's response is returned and the caller must free it using
    710 * SECITEM_FreeItem. On failure, NULL is returned. No parsing or validation of
    711 * the HTTP response is done.
    712 *
    713 * If a default HTTP client has been registered with
    714 * SEC_RegisterDefaultHttpClient then that client is used. Otherwise, an
    715 * internal HTTP client is used.
    716 */
    717 SECItem *CERT_PostOCSPRequest(PLArenaPool *arena, const char *location,
    718                              const SECItem *encodedRequest);
    719 
    720 /************************************************************************/
    721 SEC_END_PROTOS
    722 
    723 #endif /* _OCSP_H_ */