LCOV - code coverage report
Current view: top level - tls - s2n_handshake.h (source / functions) Hit Total Coverage
Test: unit_test_coverage.info Lines: 6 6 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 <stdint.h>
      19                 :            : 
      20                 :            : #include "api/s2n.h"
      21                 :            : #include "crypto/s2n_certificate.h"
      22                 :            : #include "crypto/s2n_hash.h"
      23                 :            : #include "stuffer/s2n_stuffer.h"
      24                 :            : #include "tls/s2n_crypto.h"
      25                 :            : #include "tls/s2n_handshake_hashes.h"
      26                 :            : #include "tls/s2n_handshake_type.h"
      27                 :            : #include "tls/s2n_signature_algorithms.h"
      28                 :            : #include "tls/s2n_tls_parameters.h"
      29                 :            : 
      30                 :            : /* From RFC 8446: https://tools.ietf.org/html/rfc8446#appendix-B.3 */
      31                 :      38170 : #define TLS_HELLO_REQUEST             0
      32                 :            : #define TLS_CLIENT_HELLO              1
      33                 :            : #define TLS_SERVER_HELLO              2
      34                 :        460 : #define TLS_SERVER_NEW_SESSION_TICKET 4
      35                 :            : #define TLS_END_OF_EARLY_DATA         5
      36                 :            : #define TLS_ENCRYPTED_EXTENSIONS      8
      37                 :            : #define TLS_CERTIFICATE               11
      38                 :            : #define TLS_SERVER_KEY                12
      39                 :      62204 : #define TLS_CERT_REQ                  13
      40                 :            : #define TLS_SERVER_HELLO_DONE         14
      41                 :            : #define TLS_CERT_VERIFY               15
      42                 :            : #define TLS_CLIENT_KEY                16
      43                 :            : #define TLS_FINISHED                  20
      44                 :      48984 : #define TLS_SERVER_CERT_STATUS        22
      45                 :            : #define TLS_SERVER_SESSION_LOOKUP     23
      46                 :        894 : #define TLS_KEY_UPDATE                24
      47                 :            : #define TLS_NPN                       67
      48                 :       1300 : #define TLS_MESSAGE_HASH              254
      49                 :            : 
      50                 :            : /* Maximum number of messages in a handshake */
      51                 :            : #define S2N_MAX_HANDSHAKE_LENGTH 32
      52                 :            : 
      53                 :            : /* This is the list of message types that we support */
      54                 :            : typedef enum {
      55                 :            :     CLIENT_HELLO = 0,
      56                 :            :     SERVER_HELLO,
      57                 :            :     SERVER_CERT,
      58                 :            :     SERVER_NEW_SESSION_TICKET,
      59                 :            :     SERVER_CERT_STATUS,
      60                 :            :     SERVER_KEY,
      61                 :            :     SERVER_CERT_REQ,
      62                 :            :     SERVER_HELLO_DONE,
      63                 :            :     CLIENT_CERT,
      64                 :            :     CLIENT_KEY,
      65                 :            :     CLIENT_CERT_VERIFY,
      66                 :            :     CLIENT_CHANGE_CIPHER_SPEC,
      67                 :            :     /* Not a standardized message. Defined: https://datatracker.ietf.org/doc/html/draft-agl-tls-nextprotoneg-04 */
      68                 :            :     CLIENT_NPN,
      69                 :            :     CLIENT_FINISHED,
      70                 :            :     SERVER_CHANGE_CIPHER_SPEC,
      71                 :            :     SERVER_FINISHED,
      72                 :            : 
      73                 :            :     /* TLS1.3 message types. Defined: https://tools.ietf.org/html/rfc8446#appendix-B.3 */
      74                 :            :     ENCRYPTED_EXTENSIONS,
      75                 :            :     SERVER_CERT_VERIFY,
      76                 :            :     HELLO_RETRY_MSG,
      77                 :            :     END_OF_EARLY_DATA,
      78                 :            : 
      79                 :            :     APPLICATION_DATA,
      80                 :            : } message_type_t;
      81                 :            : 
      82                 :            : typedef enum {
      83                 :            :     S2N_ASYNC_NOT_INVOKED = 0,
      84                 :            :     S2N_ASYNC_INVOKED,
      85                 :            :     S2N_ASYNC_COMPLETE,
      86                 :            : } s2n_async_state;
      87                 :            : 
      88                 :            : /* Indicates which state machine is being used. The handshake
      89                 :            :  * starts off on the initial enum, which indicates we're using
      90                 :            :  * the TLS12 state machine. Once the handshake version is determined
      91                 :            :  * the enum is set to either the TLS12 or TLS13 state machine.
      92                 :            :  * This works because the initial entries in both the TLS12 and 
      93                 :            :  * TLS13 state machines are the same. */
      94                 :            : typedef enum {
      95                 :            :     S2N_STATE_MACHINE_INITIAL = 0,
      96                 :            :     S2N_STATE_MACHINE_TLS12,
      97                 :            :     S2N_STATE_MACHINE_TLS13,
      98                 :            : } s2n_state_machine;
      99                 :            : 
     100                 :            : struct s2n_handshake_parameters {
     101                 :            :     /* Public keys for server / client */
     102                 :            :     struct s2n_pkey server_public_key;
     103                 :            :     struct s2n_pkey client_public_key;
     104                 :            :     struct s2n_blob client_cert_chain;
     105                 :            :     s2n_pkey_type client_cert_pkey_type;
     106                 :            : 
     107                 :            :     /* Signature/hash algorithm pairs offered by the peer.
     108                 :            :      *
     109                 :            :      * In the case of server connections, this list contains the client's supported signature
     110                 :            :      * schemes offered in the ClientHello. In the case of client connections, this list contains
     111                 :            :      * the server's supported signature schemes offered in the CertificateRequest.
     112                 :            :      */
     113                 :            :     struct s2n_sig_scheme_list peer_sig_scheme_list;
     114                 :            :     /* Signature scheme chosen by the server */
     115                 :            :     const struct s2n_signature_scheme *server_cert_sig_scheme;
     116                 :            :     /* Signature scheme chosen by the client */
     117                 :            :     const struct s2n_signature_scheme *client_cert_sig_scheme;
     118                 :            : 
     119                 :            :     /* The cert chain we will send the peer. */
     120                 :            :     struct s2n_cert_chain_and_key *our_chain_and_key;
     121                 :            : 
     122                 :            :     /* The subset of certificates that match the server_name presented in the ClientHello.
     123                 :            :      * In the case of multiple certificates matching a server_name, s2n will prefer certificates
     124                 :            :      * in FIFO order based on calls to s2n_config_add_cert_chain_and_key_to_store
     125                 :            :      *
     126                 :            :      * Note that in addition to domain matching, the key type for the certificate must also be
     127                 :            :      * suitable for a negotiation in order to be selected. The set of matching certs here are indexed
     128                 :            :      * by s2n_authentication_method.
     129                 :            :      *
     130                 :            :      * Example:
     131                 :            :      *    - Assume certA is added to s2n_config via s2n_config_add_cert_chain_and_key_to_store
     132                 :            :      *    - Next certB is added.
     133                 :            :      *    - if certA matches www.foo.com and certB matches www.foo.com, s2n will prefer certA
     134                 :            :      *
     135                 :            :      * Note that in addition to domain matching, the key type for the certificate must also be
     136                 :            :      * suitable for a negotiation in order to be selected.
     137                 :            :      *
     138                 :            :      * Example:
     139                 :            :      *    - Assume certA and certB match server_name www.foo.com
     140                 :            :      *    - certA is ECDSA and certB is RSA.
     141                 :            :      *    - Client only supports RSA ciphers
     142                 :            :      *    - certB will be selected.
     143                 :            :      */
     144                 :            :     struct s2n_cert_chain_and_key *exact_sni_matches[S2N_CERT_TYPE_COUNT];
     145                 :            :     struct s2n_cert_chain_and_key *wc_sni_matches[S2N_CERT_TYPE_COUNT];
     146                 :            :     uint8_t exact_sni_match_exists;
     147                 :            :     uint8_t wc_sni_match_exists;
     148                 :            : 
     149                 :            :     uint8_t client_random[S2N_TLS_RANDOM_DATA_LEN];
     150                 :            :     uint8_t server_random[S2N_TLS_RANDOM_DATA_LEN];
     151                 :            : };
     152                 :            : 
     153                 :            : struct s2n_handshake {
     154                 :            :     struct s2n_stuffer io;
     155                 :            : 
     156                 :            :     struct s2n_handshake_hashes *hashes;
     157                 :            : 
     158                 :            :     /* Hash algorithms required for this handshake. The set of required hashes can be reduced as session parameters are
     159                 :            :      * negotiated, i.e. cipher suite and protocol version.
     160                 :            :      */
     161                 :            :     uint8_t required_hash_algs[S2N_HASH_ALGS_COUNT];
     162                 :            : 
     163                 :            :     /*
     164                 :            :      * Data required by the Finished messages.
     165                 :            :      * In TLS1.2 and earlier, the data is the verify_data.
     166                 :            :      * In TLS1.3, the data is the finished_key used to calculate the verify_data.
     167                 :            :      *
     168                 :            :      * The data will be different for the client and server.
     169                 :            :      * The length of the data will be the same for the client and server.
     170                 :            :      * The length of the data depends on protocol version and cipher suite.
     171                 :            :      */
     172                 :            :     uint8_t server_finished[S2N_TLS_SECRET_LEN];
     173                 :            :     uint8_t client_finished[S2N_TLS_SECRET_LEN];
     174                 :            :     uint8_t finished_len;
     175                 :            : 
     176                 :            :     /* Which message-order affecting features are enabled */
     177                 :            :     uint32_t handshake_type;
     178                 :            : 
     179                 :            :     /* Which handshake message number are we processing */
     180                 :            :     int message_number;
     181                 :            : 
     182                 :            :     /* Last message in the handshake. Unless using early data or testing,
     183                 :            :      * should always be APPLICATION_DATA. */
     184                 :            :     message_type_t end_of_messages;
     185                 :            : 
     186                 :            :     /* State of the async pkey operation during handshake */
     187                 :            :     s2n_async_state async_state;
     188                 :            : 
     189                 :            :     /* State of the async early data callback.
     190                 :            :      * If not initialized, then the callback has not been triggered yet. */
     191                 :            :     struct s2n_offered_early_data early_data_async_state;
     192                 :            : 
     193                 :            :     /* Indicates the CLIENT_HELLO message has been completely received */
     194                 :            :     unsigned client_hello_received : 1;
     195                 :            : 
     196                 :            :     /* Indicates the handshake blocked while trying to read or write data, and has been paused */
     197                 :            :     unsigned paused : 1;
     198                 :            : 
     199                 :            :     /* Set to 1 if the RSA verification failed */
     200                 :            :     unsigned rsa_failed : 1;
     201                 :            : 
     202                 :            :     /* Indicates that this is a renegotiation handshake */
     203                 :            :     unsigned renegotiation : 1;
     204                 :            : 
     205                 :            :     s2n_state_machine state_machine;
     206                 :            : };
     207                 :            : 
     208                 :            : /* Only used in our test cases. */
     209                 :            : message_type_t s2n_conn_get_current_message_type(const struct s2n_connection *conn);
     210                 :            : 
     211                 :            : /* s2n_handshake */
     212                 :            : int s2n_handshake_require_all_hashes(struct s2n_handshake *handshake);
     213                 :            : uint8_t s2n_handshake_is_hash_required(struct s2n_handshake *handshake, s2n_hash_algorithm hash_alg);
     214                 :            : int s2n_conn_update_required_handshake_hashes(struct s2n_connection *conn);
     215                 :            : S2N_RESULT s2n_handshake_copy_hash_state(struct s2n_connection *conn, s2n_hash_algorithm hash_alg, struct s2n_hash_state *hash_state);
     216                 :            : S2N_RESULT s2n_handshake_reset_hash_state(struct s2n_connection *conn, s2n_hash_algorithm hash_alg);
     217                 :            : int s2n_conn_find_name_matching_certs(struct s2n_connection *conn);
     218                 :            : int s2n_create_wildcard_hostname(struct s2n_stuffer *hostname, struct s2n_stuffer *output);
     219                 :            : struct s2n_cert_chain_and_key *s2n_get_compatible_cert_chain_and_key(struct s2n_connection *conn, const s2n_pkey_type cert_type);
     220                 :            : S2N_RESULT s2n_negotiate_until_message(struct s2n_connection *conn, s2n_blocked_status *blocked, message_type_t end_message);
     221                 :            : S2N_RESULT s2n_handshake_validate(const struct s2n_handshake *s2n_handshake);
     222                 :            : S2N_RESULT s2n_handshake_set_finished_len(struct s2n_connection *conn, uint8_t len);
     223                 :            : bool s2n_handshake_is_renegotiation(struct s2n_connection *conn);
     224                 :            : S2N_RESULT s2n_handshake_message_send(struct s2n_connection *conn, uint8_t content_type, s2n_blocked_status *blocked);
     225                 :            : 
     226                 :            : /* s2n_handshake_io */
     227                 :            : int s2n_conn_set_handshake_type(struct s2n_connection *conn);
     228                 :            : int s2n_conn_set_handshake_no_client_cert(struct s2n_connection *conn);
     229                 :            : S2N_RESULT s2n_conn_choose_state_machine(struct s2n_connection *conn, uint8_t protocol_version);
     230                 :            : bool s2n_handshake_is_complete(struct s2n_connection *conn);
     231                 :            : 
     232                 :            : /* s2n_handshake_transcript */
     233                 :            : S2N_RESULT s2n_handshake_transcript_update(struct s2n_connection *conn);
     234                 :            : int s2n_conn_update_handshake_hashes(struct s2n_connection *conn, struct s2n_blob *data);
     235                 :            : 
     236                 :            : /* s2n_quic_support */
     237                 :            : S2N_RESULT s2n_quic_read_handshake_message(struct s2n_connection *conn, uint8_t *message_type);
     238                 :            : S2N_RESULT s2n_quic_write_handshake_message(struct s2n_connection *conn);

Generated by: LCOV version 1.14