LCOV - code coverage report
Current view: top level - tls - s2n_aead.c (source / functions) Hit Total Coverage
Test: unit_test_coverage.info Lines: 34 34 100.0 %
Date: 2025-08-15 07:28:39 Functions: 2 2 100.0 %
Branches: 18 38 47.4 %

           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                 :            : #include "error/s2n_errno.h"
      17                 :            : #include "tls/s2n_connection.h"
      18                 :            : #include "tls/s2n_record.h"
      19                 :            : #include "utils/s2n_mem.h"
      20                 :            : #include "utils/s2n_safety.h"
      21                 :            : 
      22                 :            : /* Derive the AAD for an AEAD mode cipher suite from the connection state, per
      23                 :            :  * RFC 5246 section 6.2.3.3 */
      24                 :            : S2N_RESULT s2n_aead_aad_init(const struct s2n_connection *conn, uint8_t *sequence_number, uint8_t content_type, uint16_t record_length, struct s2n_blob *ad)
      25                 :    6565146 : {
      26 [ -  + ][ #  # ]:    6565146 :     RESULT_ENSURE_REF(ad);
      27 [ -  + ][ #  # ]:    6565146 :     RESULT_ENSURE_GTE(ad->size, S2N_TLS_MAX_AAD_LEN);
      28                 :            : 
      29                 :    6565146 :     uint8_t *data = ad->data;
      30         [ -  + ]:    6565146 :     RESULT_GUARD_PTR(data);
      31                 :            : 
      32                 :            :     /* ad = seq_num || record_type || version || length */
      33                 :            : 
      34                 :    6565146 :     size_t idx = 0;
      35         [ +  + ]:   59086314 :     for (; idx < S2N_TLS_SEQUENCE_NUM_LEN; idx++) {
      36                 :   52521168 :         data[idx] = sequence_number[idx];
      37                 :   52521168 :     }
      38                 :            : 
      39                 :    6565146 :     data[idx++] = content_type;
      40                 :    6565146 :     data[idx++] = conn->actual_protocol_version / 10;
      41                 :    6565146 :     data[idx++] = conn->actual_protocol_version % 10;
      42                 :    6565146 :     data[idx++] = record_length >> 8;
      43                 :    6565146 :     data[idx++] = record_length & UINT8_MAX;
      44                 :            : 
      45                 :            :     /* Double check no overflow */
      46 [ -  + ][ #  # ]:    6565146 :     RESULT_ENSURE_LTE(idx, ad->size);
      47                 :    6565146 :     return S2N_RESULT_OK;
      48                 :    6565146 : }
      49                 :            : 
      50                 :            : /* Prepares an AAD (additional authentication data) for a TLS 1.3 AEAD record */
      51                 :            : S2N_RESULT s2n_tls13_aead_aad_init(uint16_t record_length, uint8_t tag_length, struct s2n_blob *additional_data)
      52                 :     175803 : {
      53 [ +  + ][ +  - ]:     175803 :     RESULT_ENSURE_GT(tag_length, 0);
      54 [ +  - ][ +  + ]:     175801 :     RESULT_ENSURE_REF(additional_data);
      55 [ -  + ][ #  # ]:     175800 :     RESULT_ENSURE_GTE(additional_data->size, S2N_TLS13_AAD_LEN);
      56                 :            : 
      57                 :     175800 :     uint8_t *data = additional_data->data;
      58         [ -  + ]:     175800 :     RESULT_GUARD_PTR(data);
      59                 :            : 
      60                 :     175800 :     size_t idx = 0;
      61                 :            : 
      62                 :            :     /**
      63                 :            :      *= https://www.rfc-editor.org/rfc/rfc8446#section-5.2
      64                 :            :      *# opaque_type:  The outer opaque_type field of a TLSCiphertext record
      65                 :            :      *#    is always set to the value 23 (application_data) for outward
      66                 :            :      *#    compatibility with middleboxes accustomed to parsing previous
      67                 :            :      *#    versions of TLS.  The actual content type of the record is found
      68                 :            :      *#    in TLSInnerPlaintext.type after decryption.
      69                 :            :      **/
      70                 :     175800 :     data[idx++] = TLS_APPLICATION_DATA;
      71                 :            : 
      72                 :            :     /**
      73                 :            :      *= https://www.rfc-editor.org/rfc/rfc8446#section-5.2
      74                 :            :      *# legacy_record_version:  The legacy_record_version field is always
      75                 :            :      *#    0x0303.  TLS 1.3 TLSCiphertexts are not generated until after
      76                 :            :      *#    TLS 1.3 has been negotiated, so there are no historical
      77                 :            :      *#    compatibility concerns where other values might be received.  Note
      78                 :            :      *#    that the handshake protocol, including the ClientHello and
      79                 :            :      *#    ServerHello messages, authenticates the protocol version, so this
      80                 :            :      *#    value is redundant.
      81                 :            :      */
      82                 :     175800 :     data[idx++] = 0x03;
      83                 :     175800 :     data[idx++] = 0x03;
      84                 :            : 
      85                 :            :     /**
      86                 :            :      *= https://www.rfc-editor.org/rfc/rfc8446#section-5.2
      87                 :            :      *# length:  The length (in bytes) of the following
      88                 :            :      *#    TLSCiphertext.encrypted_record, which is the sum of the lengths of
      89                 :            :      *#    the content and the padding, plus one for the inner content type,
      90                 :            :      *#    plus any expansion added by the AEAD algorithm.  The length
      91                 :            :      *#    MUST NOT exceed 2^14 + 256 bytes.  An endpoint that receives a
      92                 :            :      *#    record that exceeds this length MUST terminate the connection with
      93                 :            :      *#    a "record_overflow" alert.
      94                 :            :      */
      95                 :     175800 :     uint16_t length = record_length + tag_length;
      96 [ +  + ][ +  - ]:     175800 :     RESULT_ENSURE(length <= (1 << 14) + 256, S2N_ERR_RECORD_LIMIT);
      97                 :     175799 :     data[idx++] = length >> 8;
      98                 :     175799 :     data[idx++] = length & UINT8_MAX;
      99                 :            : 
     100                 :            :     /* Double check no overflow */
     101 [ -  + ][ #  # ]:     175799 :     RESULT_ENSURE_LTE(idx, additional_data->size);
     102                 :     175799 :     return S2N_RESULT_OK;
     103                 :     175799 : }

Generated by: LCOV version 1.14