You are viewing a plain text version of this content. The canonical link for it is here.
Posted to dev@serf.apache.org by br...@apache.org on 2016/12/11 19:44:10 UTC
svn commit: r1773602 - in /serf/branches/ocsp-verification: BRANCH-README
serf_bucket_types.h
Author: brane
Date: Sun Dec 11 19:44:10 2016
New Revision: 1773602
URL: http://svn.apache.org/viewvc?rev=1773602&view=rev
Log:
On the ocsp-verification branch: Follow up on r1773567, making the OCSP
verification API hopefully a bit easier and safer to use.
* BRANCH-README: Update branch documentation.
* serf_bucket_types.h
(serf_ssl_ocsp_request_create,
serf_ssl_ocsp_request_verify): Updated prototypes.
(serf_ssl_ocsp_request_t,
serf_ssl_ocsp_response_t): New opaque types.
(serf_ssl_ocsp_request_body,
serf_ssl_ocsp_request_body_size,
serf_ssl_ocsp_request_export,
serf_ssl_ocsp_request_import,
serf_ssl_ocsp_response_parse): New prototypes.
Modified:
serf/branches/ocsp-verification/BRANCH-README
serf/branches/ocsp-verification/serf_bucket_types.h
Modified: serf/branches/ocsp-verification/BRANCH-README
URL: http://svn.apache.org/viewvc/serf/branches/ocsp-verification/BRANCH-README?rev=1773602&r1=1773601&r2=1773602&view=diff
==============================================================================
--- serf/branches/ocsp-verification/BRANCH-README (original)
+++ serf/branches/ocsp-verification/BRANCH-README Sun Dec 11 19:44:10 2016
@@ -23,15 +23,14 @@ These are the proposed changes:
Add a new function that is the inverse of serf_ssl_cert_export():
- serf_ssl_certificate_t *serf_ssl_cert_import(
- const char *encoded_cert,
- apr_pool_t *pool);
-
- Docstring:
-
- Imports certificate from a base64-encoded, zero-terminated
- string. The returned certificate is allocated in @a pool.
- Returns NULL on failure.
+ /**
+ * Imports certificate from a base64-encoded, zero-terminated
+ * string. The returned certificate is allocated in @a pool.
+ * Returns NULL on failure.
+ */
+ serf_ssl_certificate_t *serf_ssl_cert_import(
+ const char *encoded_cert,
+ apr_pool_t *pool);
Discussion:
@@ -46,32 +45,10 @@ These are the proposed changes:
through serf_ssl_load_cert_file() is neither easy nor sane).
-3. serf_ssl_ocsp_request_create()
+3. OCSP requests
- Add a new function that can be used from within a request setup
- handler to create an OCSP request:
-
- apr_status_t serf_ssl_ocsp_request_create(
- const serf_ssl_certificate_t *server_cert,
- const serf_ssl_certificate_t *issuer_cert,
- const void **ocsp_request,
- apr_size_t *ocsp_request_size,
- const void **nonce,
- apr_size_t *nonce_size,
- apr_pool_t *pool);
-
- Docstring:
-
- Constructs an OCSP verification request for @a server_cert with
- issuer certificate @a issuer_cert, Retyurns the DER encoded
- request in @a ocsp_request and its size in @a ocsp_request_size.
-
- If @a nonce is not @c NULL, the request will contain a randomly
- generated nonce, which will be returned in @a *nonce and its
- size in @a nonce_size. If @a nonce is @c NULL, @a nonce_size
- is ignored.
-
- The request and nonce will be allocated from @a pool.
+ Add a new opaque type and accessor functions that can be used from
+ within a request setup handler to create an OCSP request.
Discussion:
@@ -81,44 +58,140 @@ These are the proposed changes:
don't provide a function to create the request body or set
request headers.
+ /**
+ * Internal representation of an OCSP request.
+ */
+ typedef struct serf_ssl_ocsp_request_t serf_ssl_ocsp_request_t;
+
+ /**
+ * Constructs an OCSP verification request for @a server_cert with
+ * issuer certificate @a issuer_cert. If @a generate_nonce is
+ * non-zero, the request will contain a random nonce.
+ *
+ * The request will be allocated from @a result_pool.
+ *
+ * Use @a scratch_pool for temporary allocations.
+ */
+ serf_ssl_ocsp_request_t *serf_ssl_ocsp_request_create(
+ const serf_ssl_certificate_t *server_cert,
+ const serf_ssl_certificate_t *issuer_cert,
+ int generate_nonce,
+ apr_pool_t *result_pool,
+ apr_pool_t *scratch_pool);
+
+ /**
+ * Returns an pointer to the DER-encoded OCSP request
+ * body within the @a ocsp_request structure.
+ *
+ * The application must decide whether to use this data as the body of
+ * an HTTP POST request or Base64-encoded as part of the URI for a GET
+ * request; see RFC 560, section A.1.1.
+ *
+ * @see serf_ssl_ocsp_request_body_size()
+ */
+ const void *serf_ssl_ocsp_request_body(
+ const serf_ssl_ocsp_request_t *ocsp_request);
+
+ /**
+ * Returns the size of the DER-encoded OCSP request body.
+ * @see serf_ssl_ocsp_request_body().
+ */
+ apr_size_t serf_ssl_ocsp_request_body_size(
+ const serf_ssl_ocsp_request_t *ocsp_request);
+
+ /**
+ * Export @a ocsp_request, including request, server and issuer
+ * certificates, to a zero-terminated string, allocated from
+ * @a result_pool.
+ *
+ * Use @a scratch_pool for temporary allocations.
+ *
+ * Returns @c NULL on failure.
+ */
+ const char *serf_ssl_ocsp_request_export(
+ const serf_ssl_ocsp_request_t *ocsp_request,
+ apr_pool_t *result_pool,
+ apr_pool_t *scratch_pool);
+
+ /**
+ * Create an OCSP request from a previously exported zero-terminated
+ * string @a encoded_ocsp_request. The returned request will be
+ * allocated from @a result_pool.
+ *
+ * Use @a scratch_pool for temporary allocations.
+ *
+ * Returns @c NULL on failure.
+ */
+ serf_ssl_ocsp_request_t *serf_ssl_ocsp_request_import(
+ const char *encoded_ocsp_request,
+ apr_pool_t *result_pool,
+ apr_pool_t *scratch_pool);
-4. serf_ssl_ocsp_response_verify()
- Add a new function that can be used from within a response handler
- to verify an OCSP response:
+4. OCSP responses
- apr_status_t serf_ssl_ocsp_response_verify(
- const void *ocsp_response,
- apr_size_t ocsp_response_size,
- const serf_ssl_certificate_t *server_cert,
- const serf_ssl_certificate_t *issuer_cert,
- const void *nonce,
- apr_size_t nonce_size,
- apr_time_t *this_update,
- apr_time_t *next_update,
- apr_time_t *produced_at,
- apr_pool_t *pool);
-
- Docstring:
-
- Check if the given @a ocsp_response of size @a ocsp_response_size
- is valid for the given @a server_cert, @a issuer_cert and @a nonce.
-
- If @a nonce is @c NULL, the response _must not_ contain a nonce.
- Otherwise, it must contain an identical nonce with size @a nonce_size.
-
- The @a this_update, @a next_update and @a produced_at output arguments
- are described in RFC 2560, section 2.4 and, when not @c NULL, will be
- set from the parsed response. Any of these times that are not present
- in the response will be set to the epoch, i.e., @c APR_TIME_C(0).
+ Add a new opaque type, response body parser and response validator.
- Uses @a pool for temporary allocations.
+ Add a new function that can be used from within a response handler
+ to verify an OCSP response:
Discussion:
Parses and verifies the OCSP response received in the HTTP response
body as per RFC 2560, section 3.2.
+ /**
+ * Internal representation of an OCSP response.
+ */
+ typedef struct serf_ssl_ocsp_response_t serf_ssl_ocsp_response_t;
+
+ /**
+ * Parse the body of an HTTP OCSP response, @a ocsp_response_body,
+ * of size @a ocsp_response_size, and construct an OCSP response,
+ * allocated from @a result pool.
+ *
+ * Use @a scratch_pool for temporary allocations.
+ *
+ * Returns @c NULL if the response body is not well-formed.
+ */
+ serf_ssl_ocsp_request_t *serf_ssl_ocsp_response_parse(
+ const void *ocsp_response_body,
+ apr_size_t ocsp_response_size,
+ apr_pool_t *result_pool,
+ apr_pool_t *scratch_pool);
+
+ /**
+ * Check if the given @a ocsp_response is valid for the given
+ * @a ocsp_request, per the algorighm documented in RFC 2560,
+ * section 3.5.
+ *
+ * The returned value will be:
+ *
+ * - APR_SUCCESS,
+ * if all steps of the verification succeeded;
+ * - SERF_ERROR_SSL_OCSP_RESPONSE_CERT_REVOKED,
+ * if the certificate was revoked;
+ * - SERF_ERROR_SSL_OCSP_RESPONSE_CERT_UNKNOWN,
+ * if the responder knows nothing about the certificate;
+ * - SERF_ERROR_SSL_OCSP_RESPONSE_INVALID,
+ * if the response itself is invalid or not well-formed.
+ *
+ * The @a this_update, @a next_update and @a produced_at output
+ * arguments are described in RFC 2560, section 2.4 and, when not
+ * @c NULL and if the verificateion succeeded, will be parsed from
+ * the response. Any of these times that are not present in the
+ * response will be set to the epoch, i.e., @c APR_TIME_C(0).
+ *
+ * Uses @a scratch_pool for temporary allocations.
+ */
+ apr_status_t serf_ssl_ocsp_response_verify(
+ const serf_ssl_ocsp_response_t *ocsp_response,
+ const serf_ssl_ocsp_request_t *ocsp_request,
+ apr_time_t *this_update,
+ apr_time_t *next_update,
+ apr_time_t *produced_at,
+ apr_pool_t *scratch_pool);
+
5. New error codes and macros
Modified: serf/branches/ocsp-verification/serf_bucket_types.h
URL: http://svn.apache.org/viewvc/serf/branches/ocsp-verification/serf_bucket_types.h?rev=1773602&r1=1773601&r2=1773602&view=diff
==============================================================================
--- serf/branches/ocsp-verification/serf_bucket_types.h (original)
+++ serf/branches/ocsp-verification/serf_bucket_types.h Sun Dec 11 19:44:10 2016
@@ -769,71 +769,146 @@ apr_status_t
serf_ssl_check_cert_status_request(serf_ssl_context_t *ssl_ctx, int enabled);
/**
+ * Enable or disable SSL compression on a SSL session.
+ * @a enabled = 1 to enable compression, 0 to disable compression.
+ * Default = disabled.
+ */
+apr_status_t serf_ssl_use_compression(
+ serf_ssl_context_t *ssl_ctx,
+ int enabled);
+
+serf_bucket_t *serf_bucket_ssl_encrypt_create(
+ serf_bucket_t *stream,
+ serf_ssl_context_t *ssl_context,
+ serf_bucket_alloc_t *allocator);
+
+serf_ssl_context_t *serf_bucket_ssl_encrypt_context_get(
+ serf_bucket_t *bucket);
+
+/* ==================================================================== */
+
+/**
+ * Internal representation of an OCSP request.
+ */
+typedef struct serf_ssl_ocsp_request_t serf_ssl_ocsp_request_t;
+
+/**
* Constructs an OCSP verification request for @a server_cert with
- * issuer certificate @a issuer_cert, Retyurns the DER encoded
- * request in @a ocsp_request and its size in @a ocsp_request_size.
+ * issuer certificate @a issuer_cert. If @a generate_nonce is
+ * non-zero, the request will contain a random nonce.
*
- * If @a nonce is not @c NULL, the request will contain a randomly
- * generated nonce, which will be returned in @a *nonce and its
- * size in @a nonce_size. If @a nonce is @c NULL, @a nonce_size
- * is ignored.
+ * The request will be allocated from @a result_pool.
*
- * The request and nonce will be allocated from @a pool.
+ * Use @a scratch_pool for temporary allocations.
*/
-apr_status_t serf_ssl_ocsp_request_create(
+serf_ssl_ocsp_request_t *serf_ssl_ocsp_request_create(
const serf_ssl_certificate_t *server_cert,
const serf_ssl_certificate_t *issuer_cert,
- const void **ocsp_request,
- apr_size_t *ocsp_request_size,
- const void **nonce,
- apr_size_t *nonce_size,
- apr_pool_t *pool);
+ int generate_nonce,
+ apr_pool_t *result_pool,
+ apr_pool_t *scratch_pool);
/**
- * Check if the given @a ocsp_response of size @a ocsp_response_size
- * is valid for the given @a server_cert, @a issuer_cert and @a nonce.
+ * Returns an pointer to the DER-encoded OCSP request
+ * body within the @a ocsp_request structure.
*
- * If @a nonce is @c NULL, the response _must not_ contain a nonce.
- * Otherwise, it must contain an identical nonce with size @a nonce_size.
+ * The application must decide whether to use this data as the body of
+ * an HTTP POST request or Base64-encoded as part of the URI for a GET
+ * request; see RFC 560, section A.1.1.
*
- * The @a this_update, @a next_update and @a produced_at output arguments
- * are described in RFC 2560, section 2.4 and, when not @c NULL, will be
- * set from the parsed response. Any of these times that are not present
- * in the response will be set to the epoch, i.e., @c APR_TIME_C(0).
+ * @see serf_ssl_ocsp_request_body_size()
+ */
+const void *serf_ssl_ocsp_request_body(
+ const serf_ssl_ocsp_request_t *ocsp_request);
+
+/**
+ * Returns the size of the DER-encoded OCSP request body.
+ * @see serf_ssl_ocsp_request_body().
+ */
+apr_size_t serf_ssl_ocsp_request_body_size(
+ const serf_ssl_ocsp_request_t *ocsp_request);
+
+/**
+ * Export @a ocsp_request, including request, server and issuer
+ * certificates, to a zero-terminated string, allocated from
+ * @a result_pool.
+ *
+ * Use @a scratch_pool for temporary allocations.
*
- * Uses @a pool for temporary allocations.
+ * Returns @c NULL on failure.
*/
-apr_status_t serf_ssl_ocsp_response_verify(
- const void *ocsp_response,
- apr_size_t ocsp_response_size,
- const serf_ssl_certificate_t *server_cert,
- const serf_ssl_certificate_t *issuer_cert,
- const void *nonce,
- apr_size_t nonce_size,
- apr_time_t *this_update,
- apr_time_t *next_update,
- apr_time_t *produced_at,
- apr_pool_t *pool);
+const char *serf_ssl_ocsp_request_export(
+ const serf_ssl_ocsp_request_t *ocsp_request,
+ apr_pool_t *result_pool,
+ apr_pool_t *scratch_pool);
/**
- * Enable or disable SSL compression on a SSL session.
- * @a enabled = 1 to enable compression, 0 to disable compression.
- * Default = disabled.
+ * Create an OCSP request from a previously exported zero-terminated
+ * string @a encoded_ocsp_request. The returned request will be
+ * allocated from @a result_pool.
+ *
+ * Use @a scratch_pool for temporary allocations.
+ *
+ * Returns @c NULL on failure.
*/
-apr_status_t serf_ssl_use_compression(
- serf_ssl_context_t *ssl_ctx,
- int enabled);
+serf_ssl_ocsp_request_t *serf_ssl_ocsp_request_import(
+ const char *encoded_ocsp_request,
+ apr_pool_t *result_pool,
+ apr_pool_t *scratch_pool);
-serf_bucket_t *serf_bucket_ssl_encrypt_create(
- serf_bucket_t *stream,
- serf_ssl_context_t *ssl_context,
- serf_bucket_alloc_t *allocator);
+/**
+ * Internal representation of an OCSP response.
+ */
+typedef struct serf_ssl_ocsp_response_t serf_ssl_ocsp_response_t;
-serf_ssl_context_t *serf_bucket_ssl_encrypt_context_get(
- serf_bucket_t *bucket);
+/**
+ * Parse the body of an HTTP OCSP response, @a ocsp_response_body,
+ * of size @a ocsp_response_size, and construct an OCSP response,
+ * allocated from @a result pool.
+ *
+ * Use @a scratch_pool for temporary allocations.
+ *
+ * Returns @c NULL if the response body is not well-formed.
+ */
+serf_ssl_ocsp_request_t *serf_ssl_ocsp_response_parse(
+ const void *ocsp_response_body,
+ apr_size_t ocsp_response_size,
+ apr_pool_t *result_pool,
+ apr_pool_t *scratch_pool);
-/* ==================================================================== */
+/**
+ * Check if the given @a ocsp_response is valid for the given
+ * @a ocsp_request, per the algorighm documented in RFC 2560,
+ * section 3.5.
+ *
+ * The returned value will be:
+ *
+ * - APR_SUCCESS,
+ * if all steps of the verification succeeded;
+ * - SERF_ERROR_SSL_OCSP_RESPONSE_CERT_REVOKED,
+ * if the certificate was revoked;
+ * - SERF_ERROR_SSL_OCSP_RESPONSE_CERT_UNKNOWN,
+ * if the responder knows nothing about the certificate;
+ * - SERF_ERROR_SSL_OCSP_RESPONSE_INVALID,
+ * if the response itself is invalid or not well-formed.
+ *
+ * The @a this_update, @a next_update and @a produced_at output
+ * arguments are described in RFC 2560, section 2.4 and, when not
+ * @c NULL and if the verificateion succeeded, will be parsed from
+ * the response. Any of these times that are not present in the
+ * response will be set to the epoch, i.e., @c APR_TIME_C(0).
+ *
+ * Uses @a scratch_pool for temporary allocations.
+ */
+apr_status_t serf_ssl_ocsp_response_verify(
+ const serf_ssl_ocsp_response_t *ocsp_response,
+ const serf_ssl_ocsp_request_t *ocsp_request,
+ apr_time_t *this_update,
+ apr_time_t *next_update,
+ apr_time_t *produced_at,
+ apr_pool_t *scratch_pool);
+/* ==================================================================== */
extern const serf_bucket_type_t serf_bucket_type_ssl_decrypt;
#define SERF_BUCKET_IS_SSL_DECRYPT(b) SERF_BUCKET_CHECK((b), ssl_decrypt)