tor-browser

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

ocspt.h (12511B)


      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 * Public header for exported OCSP types.
      7 */
      8 
      9 #ifndef _OCSPT_H_
     10 #define _OCSPT_H_
     11 
     12 /*
     13 * The following are all opaque types.  If someone needs to get at
     14 * a field within, then we need to fix the API.  Try very hard not
     15 * make the type available to them.
     16 */
     17 typedef struct CERTOCSPRequestStr CERTOCSPRequest;
     18 typedef struct CERTOCSPResponseStr CERTOCSPResponse;
     19 
     20 /*
     21 * XXX I think only those first two above should need to be exported,
     22 * but until I know for certain I am leaving the rest of these here, too.
     23 */
     24 typedef struct CERTOCSPCertIDStr CERTOCSPCertID;
     25 typedef struct CERTOCSPSingleResponseStr CERTOCSPSingleResponse;
     26 
     27 /*
     28 * This interface is described in terms of an HttpClient which
     29 * supports at least a specified set of functions. (An implementer may
     30 * provide HttpClients with additional functionality accessible only to
     31 * users with a particular implementation in mind.) The basic behavior
     32 * is provided by defining a set of functions, listed in an
     33 * SEC_HttpServerFcnStruct. If the implementor of a SpecificHttpClient
     34 * registers his SpecificHttpClient as the default HttpClient, then his
     35 * functions will be called by the user of an HttpClient, such as an
     36 * OCSPChecker.
     37 *
     38 * The implementer of a specific HttpClient (e.g., the NSS-provided
     39 * DefaultHttpClient), populates an SEC_HttpClientFcnStruct, uses it to
     40 * register his client, and waits for his functions to be called.
     41 *
     42 * For future expandability, the SEC_HttpClientFcnStruct is defined as a
     43 * union, with the version field acting as a selector. The proposed
     44 * initial version of the structure is given following the definition
     45 * of the union. The HttpClientState structure is implementation-
     46 * dependent, and should be opaque to the user.
     47 */
     48 
     49 typedef void *SEC_HTTP_SERVER_SESSION;
     50 typedef void *SEC_HTTP_REQUEST_SESSION;
     51 
     52 /*
     53 * This function creates a SEC_HTTP_SERVER_SESSION object. The implementer of a
     54 * specific HttpClient will allocate the necessary space, when this
     55 * function is called, and will free it when the corresponding FreeFcn
     56 * is called. The SEC_HTTP_SERVER_SESSION object is passed, as an opaque object,
     57 * to subsequent calls.
     58 *
     59 * If the function returns SECSuccess, the returned SEC_HTTP_SERVER_SESSION
     60 * must be cleaned up with a call to SEC_HttpServer_FreeSession,
     61 * after processing is finished.
     62 */
     63 typedef SECStatus (*SEC_HttpServer_CreateSessionFcn)(
     64    const char *host,
     65    PRUint16 portnum,
     66    SEC_HTTP_SERVER_SESSION *pSession);
     67 
     68 /*
     69 * This function is called to allow the implementation to attempt to keep
     70 * the connection alive. Depending on the underlying platform, it might
     71 * immediately return SECSuccess without having performed any operations.
     72 * (If a connection has not been kept alive, a subsequent call to
     73 * SEC_HttpRequest_TrySendAndReceiveFcn should reopen the connection
     74 * automatically.)
     75 *
     76 * If the connection uses nonblocking I/O, this function may return
     77 * SECWouldBlock and store a nonzero value at "pPollDesc". In that case
     78 * the caller may wait on the poll descriptor, and should call this function
     79 * again until SECSuccess (and a zero value at "pPollDesc") is obtained.
     80 */
     81 typedef SECStatus (*SEC_HttpServer_KeepAliveSessionFcn)(
     82    SEC_HTTP_SERVER_SESSION session,
     83    PRPollDesc **pPollDesc);
     84 
     85 /*
     86 * This function frees the client SEC_HTTP_SERVER_SESSION object, closes all
     87 * SEC_HTTP_REQUEST_SESSIONs created for that server, discards all partial results,
     88 * frees any memory that was allocated by the client, and invalidates any
     89 * response pointers that might have been returned by prior server or request
     90 * functions.
     91 */
     92 typedef SECStatus (*SEC_HttpServer_FreeSessionFcn)(
     93    SEC_HTTP_SERVER_SESSION session);
     94 
     95 /*
     96 * This function creates a SEC_HTTP_REQUEST_SESSION object. The implementer of a
     97 * specific HttpClient will allocate the necessary space, when this
     98 * function is called, and will free it when the corresponding FreeFcn
     99 * is called. The SEC_HTTP_REQUEST_SESSION object is passed, as an opaque object,
    100 * to subsequent calls.
    101 *
    102 * An implementation that does not support the requested protocol variant
    103 * (usually "http", but could eventually allow "https") or request method
    104 * should return SECFailure.
    105 *
    106 * Timeout values may include the constants PR_INTERVAL_NO_TIMEOUT (wait
    107 * forever) or PR_INTERVAL_NO_WAIT (nonblocking I/O).
    108 *
    109 * If the function returns SECSuccess, the returned SEC_HTTP_REQUEST_SESSION
    110 * must be cleaned up with a call to SEC_HttpRequest_FreeSession,
    111 * after processing is finished.
    112 */
    113 typedef SECStatus (*SEC_HttpRequest_CreateFcn)(
    114    SEC_HTTP_SERVER_SESSION session,
    115    const char *http_protocol_variant, /* usually "http" */
    116    const char *path_and_query_string,
    117    const char *http_request_method,
    118    const PRIntervalTime timeout,
    119    SEC_HTTP_REQUEST_SESSION *pRequest);
    120 
    121 /*
    122 * This function sets data to be sent to the server for an HTTP request
    123 * of http_request_method == POST. If a particular implementation
    124 * supports it, the details for the POST request can be set by calling
    125 * this function, prior to activating the request with TrySendAndReceiveFcn.
    126 *
    127 * An implementation that does not support the POST method should
    128 * implement a SetPostDataFcn function that returns immediately.
    129 *
    130 * Setting http_content_type is optional, the parameter may
    131 * by NULL or the empty string.
    132 */
    133 typedef SECStatus (*SEC_HttpRequest_SetPostDataFcn)(
    134    SEC_HTTP_REQUEST_SESSION request,
    135    const char *http_data,
    136    const PRUint32 http_data_len,
    137    const char *http_content_type);
    138 
    139 /*
    140 * This function sets an additional HTTP protocol request header.
    141 * If a particular implementation supports it, one or multiple headers
    142 * can be added to the request by calling this function once or multiple
    143 * times, prior to activating the request with TryFcn.
    144 *
    145 * An implementation that does not support setting additional headers
    146 * should implement an AddRequestHeaderFcn function that returns immediately.
    147 */
    148 typedef SECStatus (*SEC_HttpRequest_AddHeaderFcn)(
    149    SEC_HTTP_REQUEST_SESSION request,
    150    const char *http_header_name,
    151    const char *http_header_value);
    152 
    153 /*
    154 * This function initiates or continues an HTTP request. After
    155 * parameters have been set with the Create function and, optionally,
    156 * modified or enhanced with the AddParams function, this call creates
    157 * the socket connection and initiates the communication.
    158 *
    159 * If a timeout value of zero is specified, indicating non-blocking
    160 * I/O, the client creates a non-blocking socket, and returns a status
    161 * of SECWouldBlock and a non-NULL PRPollDesc if the operation is not
    162 * complete. In that case all other return parameters are undefined.
    163 * The caller is expected to repeat the call, possibly after using
    164 * PRPoll to determine that a completion has occurred, until a return
    165 * value of SECSuccess (and a NULL value for pPollDesc) or a return
    166 * value of SECFailure (indicating failure on the network level)
    167 * is obtained.
    168 *
    169 * http_response_data_len is both input and output parameter.
    170 * If a pointer to a PRUint32 is supplied, the http client is
    171 * expected to check the given integer value and always set an out
    172 * value, even on failure.
    173 * An input value of zero means, the caller will accept any response len.
    174 * A different input value indicates the maximum response value acceptable
    175 * to the caller.
    176 * If data is successfully read and the size is acceptable to the caller,
    177 * the function will return SECSuccess and set http_response_data_len to
    178 * the size of the block returned in http_response_data.
    179 * If the data read from the http server is larger than the acceptable
    180 * size, the function will return SECFailure.
    181 * http_response_data_len will be set to a value different from zero to
    182 * indicate the reason of the failure.
    183 * An out value of "0" means, the failure was unrelated to the
    184 * acceptable size.
    185 * An out value of "1" means, the result data is larger than the
    186 * accpeptable size, but the real size is not yet known to the http client
    187 * implementation and it stopped retrieving it,
    188 * Any other out value combined with a return value of SECFailure
    189 * will indicate the actual size of the server data.
    190 *
    191 * The caller is permitted to provide NULL values for any of the
    192 * http_response arguments, indicating the caller is not interested in
    193 * those values. If the caller does provide an address, the HttpClient
    194 * stores at that address a pointer to the corresponding argument, at
    195 * the completion of the operation.
    196 *
    197 * All returned pointers will be owned by the the HttpClient
    198 * implementation and will remain valid until the call to
    199 * SEC_HttpRequest_FreeFcn.
    200 */
    201 typedef SECStatus (*SEC_HttpRequest_TrySendAndReceiveFcn)(
    202    SEC_HTTP_REQUEST_SESSION request,
    203    PRPollDesc **pPollDesc,
    204    PRUint16 *http_response_code,
    205    const char **http_response_content_type,
    206    const char **http_response_headers,
    207    const char **http_response_data,
    208    PRUint32 *http_response_data_len);
    209 
    210 /*
    211 * Calling CancelFcn asks for premature termination of the request.
    212 *
    213 * Future calls to SEC_HttpRequest_TrySendAndReceive should
    214 * by avoided, but in this case the HttpClient implementation
    215 * is expected to return immediately with SECFailure.
    216 *
    217 * After calling CancelFcn, a separate call to SEC_HttpRequest_FreeFcn
    218 * is still necessary to free resources.
    219 */
    220 typedef SECStatus (*SEC_HttpRequest_CancelFcn)(
    221    SEC_HTTP_REQUEST_SESSION request);
    222 
    223 /*
    224 * Before calling this function, it must be assured the request
    225 * has been completed, i.e. either SEC_HttpRequest_TrySendAndReceiveFcn has
    226 * returned SECSuccess, or the request has been canceled with
    227 * a call to SEC_HttpRequest_CancelFcn.
    228 *
    229 * This function frees the client state object, closes all sockets,
    230 * discards all partial results, frees any memory that was allocated
    231 * by the client, and invalidates all response pointers that might
    232 * have been returned by SEC_HttpRequest_TrySendAndReceiveFcn
    233 */
    234 typedef SECStatus (*SEC_HttpRequest_FreeFcn)(
    235    SEC_HTTP_REQUEST_SESSION request);
    236 
    237 typedef struct SEC_HttpClientFcnV1Struct {
    238    SEC_HttpServer_CreateSessionFcn createSessionFcn;
    239    SEC_HttpServer_KeepAliveSessionFcn keepAliveSessionFcn;
    240    SEC_HttpServer_FreeSessionFcn freeSessionFcn;
    241    SEC_HttpRequest_CreateFcn createFcn;
    242    SEC_HttpRequest_SetPostDataFcn setPostDataFcn;
    243    SEC_HttpRequest_AddHeaderFcn addHeaderFcn;
    244    SEC_HttpRequest_TrySendAndReceiveFcn trySendAndReceiveFcn;
    245    SEC_HttpRequest_CancelFcn cancelFcn;
    246    SEC_HttpRequest_FreeFcn freeFcn;
    247 } SEC_HttpClientFcnV1;
    248 
    249 typedef struct SEC_HttpClientFcnStruct {
    250    PRInt16 version;
    251    union {
    252        SEC_HttpClientFcnV1 ftable1;
    253        /* SEC_HttpClientFcnV2 ftable2; */
    254        /* ...                      */
    255    } fcnTable;
    256 } SEC_HttpClientFcn;
    257 
    258 /*
    259 * ocspMode_FailureIsVerificationFailure:
    260 * This is the classic behaviour of NSS.
    261 * Any OCSP failure is a verification failure (classic mode, default).
    262 * Without a good response, OCSP networking will be retried each time
    263 * it is required for verifying a cert.
    264 *
    265 * ocspMode_FailureIsNotAVerificationFailure:
    266 * If we fail to obtain a valid OCSP response, consider the
    267 * cert as good.
    268 * Failed OCSP attempts might get cached and not retried until
    269 * minimumSecondsToNextFetchAttempt.
    270 * If we are able to obtain a valid response, the cert
    271 * will be considered good, if either status is "good"
    272 * or the cert was not yet revoked at verification time.
    273 *
    274 * Additional failure modes might be added in the future.
    275 */
    276 typedef enum {
    277    ocspMode_FailureIsVerificationFailure = 0,
    278    ocspMode_FailureIsNotAVerificationFailure = 1
    279 } SEC_OcspFailureMode;
    280 
    281 /*
    282 * A ResponderID identifies the responder -- or more correctly, the
    283 * signer of the response.  The ASN.1 definition of a ResponderID is:
    284 *
    285 * ResponderID	::=	CHOICE {
    286 *	byName			[1] EXPLICIT Name,
    287 *	byKey			[2] EXPLICIT KeyHash }
    288 *
    289 * Because it is CHOICE, the type of identification used and the
    290 * identification itself are actually encoded together.  To represent
    291 * this same information internally, we explicitly define a type and
    292 * save it, along with the value, into a data structure.
    293 */
    294 
    295 typedef enum {
    296    ocspResponderID_other = -1, /* unknown kind of responderID */
    297    ocspResponderID_byName = 1,
    298    ocspResponderID_byKey = 2
    299 } CERTOCSPResponderIDType;
    300 
    301 #endif /* _OCSPT_H_ */