LCOV - code coverage report
Current view: top level - tls - s2n_x509_validator.h (source / functions) Hit Total Coverage
Test: unit_test_coverage.info Lines: 1 1 100.0 %
Date: 2025-08-15 07:28:39 Functions: 0 0 -
Branches: 0 0 -

           Branch data     Line data    Source code
       1                 :            : /*
       2                 :            :  * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.
       3                 :            :  *
       4                 :            :  * Licensed under the Apache License, Version 2.0 (the "License").
       5                 :            :  * You may not use this file except in compliance with the License.
       6                 :            :  * A copy of the License is located at
       7                 :            :  *
       8                 :            :  *  http://aws.amazon.com/apache2.0
       9                 :            :  *
      10                 :            :  * or in the "license" file accompanying this file. This file is distributed
      11                 :            :  * on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either
      12                 :            :  * express or implied. See the License for the specific language governing
      13                 :            :  * permissions and limitations under the License.
      14                 :            :  */
      15                 :            : 
      16                 :            : #pragma once
      17                 :            : 
      18                 :            : #include <openssl/x509v3.h>
      19                 :            : 
      20                 :            : #include "api/s2n.h"
      21                 :            : #include "tls/s2n_signature_scheme.h"
      22                 :            : 
      23                 :            : /* one day, BoringSSL may add ocsp stapling support. Let's future proof this a bit by grabbing a definition
      24                 :            :  * that would have to be there when they add support */
      25                 :            : #if defined(OPENSSL_IS_BORINGSSL) && !defined(OCSP_RESPONSE_STATUS_SUCCESSFUL)
      26                 :            :     #define S2N_OCSP_STAPLING_SUPPORTED 0
      27                 :            : #else
      28                 :        156 :     #define S2N_OCSP_STAPLING_SUPPORTED 1
      29                 :            : #endif /* defined(OPENSSL_IS_BORINGSSL) && !defined(OCSP_RESPONSE_STATUS_SUCCESSFUL) */
      30                 :            : 
      31                 :            : typedef enum {
      32                 :            :     UNINIT,
      33                 :            :     INIT,
      34                 :            :     READY_TO_VERIFY,
      35                 :            :     AWAITING_CRL_CALLBACK,
      36                 :            :     VALIDATED,
      37                 :            :     OCSP_VALIDATED,
      38                 :            : } validator_state;
      39                 :            : 
      40                 :            : /** Return TRUE for trusted, FALSE for untrusted **/
      41                 :            : typedef uint8_t (*verify_host)(const char *host_name, size_t host_name_len, void *data);
      42                 :            : struct s2n_connection;
      43                 :            : 
      44                 :            : /**
      45                 :            :  * Trust store simply contains the trust store each connection should validate certs against.
      46                 :            :  * For most use cases, you only need one of these per application.
      47                 :            :  */
      48                 :            : struct s2n_x509_trust_store {
      49                 :            :     X509_STORE *trust_store;
      50                 :            : 
      51                 :            :     /* Indicates whether system default certs have been loaded into the trust store */
      52                 :            :     unsigned loaded_system_certs : 1;
      53                 :            : };
      54                 :            : 
      55                 :            : struct s2n_cert_validation_info {
      56                 :            :     unsigned finished : 1;
      57                 :            :     unsigned accepted : 1;
      58                 :            : };
      59                 :            : 
      60                 :            : /**
      61                 :            :  * You should have one instance of this per connection.
      62                 :            :  */
      63                 :            : struct s2n_x509_validator {
      64                 :            :     struct s2n_x509_trust_store *trust_store;
      65                 :            :     X509_STORE_CTX *store_ctx;
      66                 :            :     uint8_t skip_cert_validation;
      67                 :            :     uint8_t check_stapled_ocsp;
      68                 :            :     uint16_t max_chain_depth;
      69                 :            :     STACK_OF(X509) *cert_chain_from_wire;
      70                 :            :     int state;
      71                 :            :     struct s2n_array *crl_lookup_list;
      72                 :            :     struct s2n_cert_validation_info cert_validation_info;
      73                 :            :     bool cert_validation_cb_invoked;
      74                 :            : };
      75                 :            : 
      76                 :            : /** Some libcrypto implementations do not support OCSP validation. Returns 1 if supported, 0 otherwise. */
      77                 :            : uint8_t s2n_x509_ocsp_stapling_supported(void);
      78                 :            : 
      79                 :            : /** Initialize the trust store to empty defaults (no allocations happen here) */
      80                 :            : void s2n_x509_trust_store_init_empty(struct s2n_x509_trust_store *store);
      81                 :            : 
      82                 :            : /** Returns TRUE if the trust store has certificates installed, FALSE otherwise */
      83                 :            : uint8_t s2n_x509_trust_store_has_certs(struct s2n_x509_trust_store *store);
      84                 :            : 
      85                 :            : /** Initialize trust store from a PEM. This will allocate memory, and load PEM into the Trust Store **/
      86                 :            : int s2n_x509_trust_store_add_pem(struct s2n_x509_trust_store *store, const char *pem);
      87                 :            : 
      88                 :            : /** Initialize trust store from a CA file. This will allocate memory, and load each cert in the file into the trust store
      89                 :            :  *  Returns 0 on success, or S2N error codes on failure. */
      90                 :            : int s2n_x509_trust_store_from_ca_file(struct s2n_x509_trust_store *store, const char *ca_pem_filename, const char *ca_dir);
      91                 :            : 
      92                 :            : /** Cleans up, and frees any underlying memory in the trust store. */
      93                 :            : void s2n_x509_trust_store_wipe(struct s2n_x509_trust_store *store);
      94                 :            : 
      95                 :            : /** Initialize the validator in unsafe mode. No validity checks for OCSP, host checks, or X.509 will be performed. */
      96                 :            : int s2n_x509_validator_init_no_x509_validation(struct s2n_x509_validator *validator);
      97                 :            : 
      98                 :            : /** Initialize the validator in safe mode. Will use trust store to validate x.509 certificates, ocsp responses, and will call
      99                 :            :  *  the verify host callback to determine if a subject name or alternative name from the cert should be trusted.
     100                 :            :  *  Returns 0 on success, and an S2N_ERR_* on failure.
     101                 :            :  */
     102                 :            : int s2n_x509_validator_init(struct s2n_x509_validator *validator, struct s2n_x509_trust_store *trust_store, uint8_t check_ocsp);
     103                 :            : 
     104                 :            : /**
     105                 :            :  * Sets the maximum depth for a cert chain that can be used at validation.
     106                 :            :  */
     107                 :            : int s2n_x509_validator_set_max_chain_depth(struct s2n_x509_validator *validator, uint16_t max_depth);
     108                 :            : 
     109                 :            : /** Cleans up underlying memory and data members. Struct can be reused afterwards. */
     110                 :            : int s2n_x509_validator_wipe(struct s2n_x509_validator *validator);
     111                 :            : 
     112                 :            : /**
     113                 :            :  * Validates a certificate chain against the configured trust store in safe mode. In unsafe mode, it will find the public key
     114                 :            :  * and return it but not validate the certificates. Alternative Names and Subject Name will be passed to the host verification callback.
     115                 :            :  * The verification callback will be possibly called multiple times depending on how many names are found.
     116                 :            :  * If any of those calls return TRUE, that stage of the validation will continue, otherwise once all names are tried and none matched as
     117                 :            :  * trusted, the chain will be considered UNTRUSTED.
     118                 :            :  *
     119                 :            :  * This function can only be called once per instance of an s2n_x509_validator. If must be called prior to calling
     120                 :            :  * s2n_x509_validator_validate_cert_stapled_ocsp_response().
     121                 :            :  */
     122                 :            : S2N_RESULT s2n_x509_validator_validate_cert_chain(struct s2n_x509_validator *validator, struct s2n_connection *conn,
     123                 :            :         uint8_t *cert_chain_in, uint32_t cert_chain_len, s2n_pkey_type *pkey_type,
     124                 :            :         struct s2n_pkey *public_key_out);
     125                 :            : 
     126                 :            : /**
     127                 :            :  * Validates an ocsp response against the most recent certificate chain. Also verifies the timestamps on the response. This function can only be
     128                 :            :  * called once per instance of an s2n_x509_validator and only after a successful call to s2n_x509_validator_validate_cert_chain().
     129                 :            :  */
     130                 :            : S2N_RESULT s2n_x509_validator_validate_cert_stapled_ocsp_response(struct s2n_x509_validator *validator, struct s2n_connection *conn,
     131                 :            :         const uint8_t *ocsp_response, uint32_t size);
     132                 :            : 
     133                 :            : /**
     134                 :            :  * Checks whether the peer's certificate chain has been received and validated.
     135                 :            :  * Should be verified before any use of the peer's certificate data.
     136                 :            :  */
     137                 :            : bool s2n_x509_validator_is_cert_chain_validated(const struct s2n_x509_validator *validator);

Generated by: LCOV version 1.14