LCOV - code coverage report
Current view: top level - tls - s2n_tls_parameters.h (source / functions) Hit Total Coverage
Test: unit_test_coverage.info Lines: 25 27 92.6 %
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 "crypto/s2n_hash.h"
      19                 :            : 
      20                 :            : /* Codes from http://www.iana.org/assignments/tls-parameters/tls-parameters.xhtml#tls-parameters-5 */
      21                 :            : #define TLS_NULL_WITH_NULL_NULL         0x00, 0x00
      22                 :            : #define TLS_RSA_WITH_AES_256_CBC_SHA256 0x00, 0x3D
      23                 :            : #define TLS_RSA_WITH_AES_256_CBC_SHA    0x00, 0x35
      24                 :            : #define TLS_RSA_WITH_AES_128_CBC_SHA256 0x00, 0x3C
      25                 :            : #define TLS_RSA_WITH_AES_128_CBC_SHA    0x00, 0x2F
      26                 :            : #define TLS_RSA_WITH_3DES_EDE_CBC_SHA   0x00, 0x0A
      27                 :            : #define TLS_RSA_WITH_RC4_128_MD5        0x00, 0x04
      28                 :            : #define TLS_RSA_WITH_RC4_128_SHA        0x00, 0x05
      29                 :            : 
      30                 :            : #define TLS_DHE_RSA_WITH_AES_128_CBC_SHA    0x00, 0x33
      31                 :            : #define TLS_DHE_RSA_WITH_AES_128_CBC_SHA256 0x00, 0x67
      32                 :            : #define TLS_DHE_RSA_WITH_AES_256_CBC_SHA    0x00, 0x39
      33                 :            : #define TLS_DHE_RSA_WITH_AES_256_CBC_SHA256 0x00, 0x6B
      34                 :            : #define TLS_DHE_RSA_WITH_3DES_EDE_CBC_SHA   0x00, 0x16
      35                 :            : 
      36                 :            : #define TLS_ECDHE_ECDSA_WITH_AES_128_CBC_SHA    0xC0, 0x09
      37                 :            : #define TLS_ECDHE_ECDSA_WITH_AES_128_CBC_SHA256 0xC0, 0x23
      38                 :            : #define TLS_ECDHE_ECDSA_WITH_AES_256_CBC_SHA    0xC0, 0x0A
      39                 :            : #define TLS_ECDHE_ECDSA_WITH_AES_256_CBC_SHA384 0xC0, 0x24
      40                 :            : 
      41                 :            : #define TLS_ECDHE_RSA_WITH_RC4_128_SHA        0xC0, 0x11
      42                 :            : #define TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA    0xC0, 0x13
      43                 :            : #define TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA256 0xC0, 0x27
      44                 :            : #define TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA    0xC0, 0x14
      45                 :            : #define TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA384 0xC0, 0x28
      46                 :            : #define TLS_ECDHE_RSA_WITH_3DES_EDE_CBC_SHA   0xC0, 0x12
      47                 :            : 
      48                 :            : #define TLS_RSA_WITH_AES_128_GCM_SHA256         0x00, 0x9C
      49                 :            : #define TLS_RSA_WITH_AES_256_GCM_SHA384         0x00, 0x9D
      50                 :            : #define TLS_DHE_RSA_WITH_AES_128_GCM_SHA256     0x00, 0x9E
      51                 :            : #define TLS_DHE_RSA_WITH_AES_256_GCM_SHA384     0x00, 0x9F
      52                 :            : #define TLS_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256 0xC0, 0x2B
      53                 :            : #define TLS_ECDHE_ECDSA_WITH_AES_256_GCM_SHA384 0xC0, 0x2C
      54                 :            : #define TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256   0xC0, 0x2F
      55                 :            : #define TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384   0xC0, 0x30
      56                 :            : 
      57                 :            : #define TLS_ECDHE_RSA_WITH_CHACHA20_POLY1305_SHA256   0xCC, 0xA8
      58                 :            : #define TLS_ECDHE_ECDSA_WITH_CHACHA20_POLY1305_SHA256 0xCC, 0xA9
      59                 :            : #define TLS_DHE_RSA_WITH_CHACHA20_POLY1305_SHA256     0xCC, 0xAA
      60                 :            : 
      61                 :            : /* TLS 1.2 hybrid post-quantum definitions from https://tools.ietf.org/html/draft-campagna-tls-bike-sike-hybrid */
      62                 :            : #define TLS_ECDHE_KYBER_RSA_WITH_AES_256_GCM_SHA384 0xFF, 0x0C
      63                 :            : #define TLS_EXTENSION_PQ_KEM_PARAMETERS             0xFE01
      64                 :            : #define TLS_PQ_KEM_EXTENSION_ID_KYBER_512_R3        28
      65                 :            : 
      66                 :            : /* TLS 1.3 hybrid post-quantum definitions are from the proposed reserved range defined
      67                 :            :  * in https://tools.ietf.org/html/draft-stebila-tls-hybrid-design. Values for interoperability are defined in
      68                 :            :  * https://github.com/open-quantum-safe/oqs-provider/blob/main/oqs-template/oqs-kem-info.md and
      69                 :            :  * https://www.iana.org/assignments/tls-parameters/tls-parameters.xhtml
      70                 :            :  */
      71                 :            : #define TLS_PQ_KEM_GROUP_ID_SECP256R1_MLKEM_768     0x11EB
      72                 :            : #define TLS_PQ_KEM_GROUP_ID_X25519_MLKEM_768        0x11EC
      73                 :            : #define TLS_PQ_KEM_GROUP_ID_SECP384R1_MLKEM_1024    0x11ED
      74                 :            : #define TLS_PQ_KEM_GROUP_ID_X25519_KYBER_512_R3     0x2F39
      75                 :            : #define TLS_PQ_KEM_GROUP_ID_SECP256R1_KYBER_512_R3  0x2F3A
      76                 :            : #define TLS_PQ_KEM_GROUP_ID_SECP384R1_KYBER_768_R3  0x2F3C
      77                 :            : #define TLS_PQ_KEM_GROUP_ID_SECP521R1_KYBER_1024_R3 0x2F3D
      78                 :            : #define TLS_PQ_KEM_GROUP_ID_X25519_KYBER_768_R3     0x6399
      79                 :            : #define TLS_PQ_KEM_GROUP_ID_SECP256R1_KYBER_768_R3  0x639A
      80                 :            : 
      81                 :            : /* From https://tools.ietf.org/html/rfc7507 */
      82                 :        146 : #define TLS_FALLBACK_SCSV                 0x56, 0x00
      83                 :      14445 : #define TLS_EMPTY_RENEGOTIATION_INFO_SCSV 0x00, 0xff
      84                 :            : 
      85                 :            : /* TLS 1.3 cipher suites from https://tools.ietf.org/html/rfc8446#appendix-B.4 */
      86                 :            : #define TLS_AES_128_GCM_SHA256       0x13, 0x01
      87                 :            : #define TLS_AES_256_GCM_SHA384       0x13, 0x02
      88                 :            : #define TLS_CHACHA20_POLY1305_SHA256 0x13, 0x03
      89                 :            : #define TLS_AES_128_CCM_SHA256       0x13, 0x04
      90                 :            : #define TLS_AES_128_CCM_8_SHA256     0x13, 0x05
      91                 :            : 
      92                 :            : /* TLS extensions from https://www.iana.org/assignments/tls-extensiontype-values/tls-extensiontype-values.xhtml */
      93                 :       1230 : #define TLS_EXTENSION_SERVER_NAME          0
      94                 :            : #define TLS_EXTENSION_MAX_FRAG_LEN         1
      95                 :            : #define TLS_EXTENSION_STATUS_REQUEST       5
      96                 :            : #define TLS_EXTENSION_SUPPORTED_GROUPS     10
      97                 :            : #define TLS_EXTENSION_EC_POINT_FORMATS     11
      98                 :            : #define TLS_EXTENSION_SIGNATURE_ALGORITHMS 13
      99                 :            : #define TLS_EXTENSION_ALPN                 16
     100                 :            : #define TLS_EXTENSION_SCT_LIST             18
     101                 :            : #define TLS_EXTENSION_EMS                  23
     102                 :            : #define TLS_EXTENSION_SESSION_TICKET       35
     103                 :        462 : #define TLS_EXTENSION_PRE_SHARED_KEY       41
     104                 :            : #define TLS_EXTENSION_CERT_AUTHORITIES     47
     105                 :            : #define TLS_EXTENSION_RENEGOTIATION_INFO   65281
     106                 :            : 
     107                 :            : /* The NPN extension was never standardized, therefore there is no official
     108                 :            :  * iana value. However, Openssl does have a chosen value for this extension 
     109                 :            :  * and that is what is used here.
     110                 :            : */
     111                 :            : #define TLS_EXTENSION_NPN 13172
     112                 :            : 
     113                 :            : /* TLS 1.3 extensions from https://tools.ietf.org/html/rfc8446#section-4.2 */
     114                 :          0 : #define TLS_EXTENSION_EARLY_DATA             42
     115                 :        631 : #define TLS_EXTENSION_SUPPORTED_VERSIONS     43
     116                 :         37 : #define TLS_EXTENSION_COOKIE                 44
     117                 :            : #define TLS_EXTENSION_PSK_KEY_EXCHANGE_MODES 45
     118                 :        631 : #define TLS_EXTENSION_KEY_SHARE              51
     119                 :            : 
     120                 :            : /* TLS 1.3 pre-shared key exchange modes from https://tools.ietf.org/html/rfc8446#section-4.2.9 */
     121                 :            : #define TLS_PSK_KE_MODE     0
     122                 :       1151 : #define TLS_PSK_DHE_KE_MODE 1
     123                 :            : 
     124                 :            : /**
     125                 :            :  *= https://www.rfc-editor.org/rfc/rfc9001#8.2
     126                 :            :  *#   enum {
     127                 :            :  *#      quic_transport_parameters(0x39), (65535)
     128                 :            :  *#   } ExtensionType;
     129                 :            :  */
     130                 :            : #define TLS_EXTENSION_QUIC_TRANSPORT_PARAMETERS 0x39
     131                 :            : 
     132                 :            : /* TLS SignatureScheme (Backwards compatible with SigHash and SigAlg values above) */
     133                 :            : /* Defined here: https://www.iana.org/assignments/tls-parameters/tls-parameters.xhtml#tls-signaturescheme */
     134                 :            : #define TLS_SIGNATURE_SCHEME_RSA_PKCS1_SHA1   0x0201
     135                 :            : #define TLS_SIGNATURE_SCHEME_RSA_PKCS1_SHA224 0x0301
     136                 :            : #define TLS_SIGNATURE_SCHEME_RSA_PKCS1_SHA256 0x0401
     137                 :            : #define TLS_SIGNATURE_SCHEME_RSA_PKCS1_SHA384 0x0501
     138                 :            : #define TLS_SIGNATURE_SCHEME_RSA_PKCS1_SHA512 0x0601
     139                 :            : 
     140                 :            : /* In TLS 1.0 and 1.1 the hard-coded default scheme was RSA_PKCS1_MD5_SHA1, but there's no IANA defined backwards
     141                 :            :  * compatible value for that Scheme for TLS 1.2 and 1.3. So we define an internal value in the private range that won't
     142                 :            :  * match anything in the valid range so that all TLS Versions can use the same SignatureScheme negotiation abstraction
     143                 :            :  * layer. This scheme isn't in any preference list, so it can't be negotiated even if a client sent it in its pref list. */
     144                 :            : #define TLS_SIGNATURE_SCHEME_PRIVATE_INTERNAL_RSA_PKCS1_MD5_SHA1 0xFFFF
     145                 :            : 
     146                 :            : /* TLS 1.2 Backwards Compatible ECDSA Schemes */
     147                 :            : #define TLS_SIGNATURE_SCHEME_ECDSA_SHA1   0x0203
     148                 :            : #define TLS_SIGNATURE_SCHEME_ECDSA_SHA224 0x0303
     149                 :            : #define TLS_SIGNATURE_SCHEME_ECDSA_SHA256 0x0403
     150                 :            : #define TLS_SIGNATURE_SCHEME_ECDSA_SHA384 0x0503
     151                 :            : #define TLS_SIGNATURE_SCHEME_ECDSA_SHA512 0x0603
     152                 :            : 
     153                 :            : #define TLS_SIGNATURE_SCHEME_RSA_PSS_RSAE_SHA256 0x0804
     154                 :            : #define TLS_SIGNATURE_SCHEME_RSA_PSS_RSAE_SHA384 0x0805
     155                 :            : #define TLS_SIGNATURE_SCHEME_RSA_PSS_RSAE_SHA512 0x0806
     156                 :            : #define TLS_SIGNATURE_SCHEME_ED25519             0x0807
     157                 :            : #define TLS_SIGNATURE_SCHEME_ED448               0x0808
     158                 :            : #define TLS_SIGNATURE_SCHEME_RSA_PSS_PSS_SHA256  0x0809
     159                 :            : #define TLS_SIGNATURE_SCHEME_RSA_PSS_PSS_SHA384  0x080A
     160                 :            : #define TLS_SIGNATURE_SCHEME_RSA_PSS_PSS_SHA512  0x080B
     161                 :            : 
     162                 :            : /* ML-DSA: post-quantum signature schemes */
     163                 :            : #define TLS_SIGNATURE_SCHEME_MLDSA44 0x0904
     164                 :            : #define TLS_SIGNATURE_SCHEME_MLDSA65 0x0905
     165                 :            : #define TLS_SIGNATURE_SCHEME_MLDSA87 0x0906
     166                 :            : 
     167                 :            : #define TLS_SIGNATURE_SCHEME_LEN          2
     168                 :       7388 : #define TLS_SIGNATURE_SCHEME_LIST_MAX_LEN 128
     169                 :            : 
     170                 :            : /* The TLS record types we support */
     171                 :            : #define SSLv2_CLIENT_HELLO     1
     172                 :     647268 : #define TLS_CHANGE_CIPHER_SPEC 20
     173                 :     343865 : #define TLS_ALERT              21
     174                 :     461143 : #define TLS_HANDSHAKE          22
     175                 :    1089397 : #define TLS_APPLICATION_DATA   23
     176                 :            : 
     177                 :            : /* Elliptic curve formats from http://www.iana.org/assignments/tls-parameters/tls-parameters.xhtml#tls-parameters-9
     178                 :            :  * Only uncompressed is supported.
     179                 :            :  */
     180                 :            : #define TLS_EC_FORMAT_UNCOMPRESSED              0
     181                 :            : #define TLS_EC_FORMAT_ANSIX962_COMPRESSED_PRIME 1
     182                 :            : #define TLS_EC_FORMAT_ANSIX962_COMPRESSED_CHAR2 2
     183                 :            : 
     184                 :            : /* Elliptic curves from https://www.iana.org/assignments/tls-parameters/tls-parameters.xhtml#tls-parameters-8 */
     185                 :       7378 : #define TLS_EC_CURVE_SECP_256_R1 23
     186                 :            : #define TLS_EC_CURVE_SECP_384_R1 24
     187                 :            : #define TLS_EC_CURVE_SECP_521_R1 25
     188                 :      20860 : #define TLS_EC_CURVE_ECDH_X25519 29
     189                 :       9185 : #define TLS_EC_CURVE_ECDH_X448   30
     190                 :            : 
     191                 :            : /* Ethernet maximum transmission unit (MTU)
     192                 :            :  * MTU is usually associated with the Ethernet protocol,
     193                 :            :  * where a 1500-byte packet is the largest allowed in it
     194                 :            :  */
     195                 :        325 : #define ETH_MTU 1500
     196                 :            : 
     197                 :        325 : #define IP_V4_HEADER_LENGTH 20
     198                 :          0 : #define IP_V6_HEADER_LENGTH 40
     199                 :            : 
     200                 :        325 : #define TCP_HEADER_LENGTH  20
     201                 :        325 : #define TCP_OPTIONS_LENGTH 40
     202                 :            : 
     203                 :      10807 : #define S2N_TLS_MAX_FRAG_LEN_EXT_NONE 0
     204                 :            : 
     205                 :            : /* The maximum size of an SSL2 message is 2^14 - 1, as neither of the first two
     206                 :            :  * bits in the length field are usable. Per;
     207                 :            :  * http://www-archive.mozilla.org/projects/security/pki/nss/ssl/draft02.html
     208                 :            :  * section 1.1
     209                 :            :  */
     210                 :            : #define S2N_SSL2_RECORD_HEADER_LENGTH   2
     211                 :            : #define S2N_SSL2_MAXIMUM_MESSAGE_LENGTH 16383
     212                 :            : #define S2N_SSL2_MAXIMUM_RECORD_LENGTH  (S2N_SSL2_MAXIMUM_MESSAGE_LENGTH + S2N_SSL2_RECORD_HEADER_LENGTH)
     213                 :            : 
     214                 :            : /* s2n can use a "small" record length that is aligned to the dominant internet MTU;
     215                 :            :  * 1500 bytes, minus 20 bytes for an IP header, minus 20 bytes for a tcp
     216                 :            :  * header and 20 bytes for tcp/ip options (timestamp, sack etc) and a "large" record
     217                 :            :  * length that is designed to maximize throughput (fewer MACs per byte transferred
     218                 :            :  * and better efficiency of crypto engines).
     219                 :            :  */
     220                 :            : #define S2N_SMALL_RECORD_LENGTH   (1500 - 20 - 20 - 20)
     221                 :            : #define S2N_SMALL_FRAGMENT_LENGTH (S2N_SMALL_RECORD_LENGTH - S2N_TLS_RECORD_HEADER_LENGTH)
     222                 :            : 
     223                 :            : /* Testing in the wild has found 8k max record sizes give a good balance of low latency
     224                 :            :  * and throughput.
     225                 :            :  */
     226                 :    3420586 : #define S2N_DEFAULT_RECORD_LENGTH   8092
     227                 :    3420586 : #define S2N_DEFAULT_FRAGMENT_LENGTH (S2N_DEFAULT_RECORD_LENGTH - S2N_TLS_RECORD_HEADER_LENGTH)
     228                 :            : 
     229                 :            : /* S2N_LARGE_RECORD_LENGTH is used for initializing output buffers, we use the largest
     230                 :            :  * possible value of all supported protocols to avoid branching at runtime
     231                 :            :  */
     232                 :            : #define S2N_LARGE_RECORD_LENGTH   S2N_TLS_MAXIMUM_RECORD_LENGTH
     233                 :            : #define S2N_LARGE_FRAGMENT_LENGTH S2N_TLS_MAXIMUM_FRAGMENT_LENGTH
     234                 :            : 
     235                 :            : /* Cap dynamic record resize threshold to 8M */
     236                 :            : #define S2N_TLS_MAX_RESIZE_THRESHOLD (1024 * 1024 * 8)
     237                 :            : 
     238                 :            : /* Put a 64k cap on the size of any handshake message */
     239                 :            : #define S2N_MAXIMUM_HANDSHAKE_MESSAGE_LENGTH (64 * 1024)
     240                 :            : 
     241                 :            : /* Maximum size for full encoded TLSInnerPlaintext (https://tools.ietf.org/html/rfc8446#section-5.4) */
     242                 :            : #define S2N_MAXIMUM_INNER_PLAINTEXT_LENGTH ((1 << 14) + 1)
     243                 :            : 
     244                 :            : /* Alert messages are always 2 bytes long */
     245                 :            : #define S2N_ALERT_LENGTH 2
     246                 :            : 
     247                 :            : /* Handshake messages have their own header too */
     248                 :     181294 : #define TLS_HANDSHAKE_HEADER_LENGTH 4
     249                 :            : 
     250                 :        105 : #define S2N_MAX_SERVER_NAME 255

Generated by: LCOV version 1.14