| Manuel Pégourié-Gonnard | fd6d897 | 2015-05-15 12:09:00 +0200 | [diff] [blame] | 1 | /** | 
|  | 2 | * \file ssl_ticket.h | 
|  | 3 | * | 
|  | 4 | * \brief TLS server ticket callbacks implementation | 
| Darryl Green | a40a101 | 2018-01-05 15:33:17 +0000 | [diff] [blame] | 5 | */ | 
|  | 6 | /* | 
| Bence Szépkúti | 1e14827 | 2020-08-07 13:07:28 +0200 | [diff] [blame] | 7 | *  Copyright The Mbed TLS Contributors | 
| Manuel Pégourié-Gonnard | 37ff140 | 2015-09-04 14:21:07 +0200 | [diff] [blame] | 8 | *  SPDX-License-Identifier: Apache-2.0 | 
|  | 9 | * | 
|  | 10 | *  Licensed under the Apache License, Version 2.0 (the "License"); you may | 
|  | 11 | *  not use this file except in compliance with the License. | 
|  | 12 | *  You may obtain a copy of the License at | 
|  | 13 | * | 
|  | 14 | *  http://www.apache.org/licenses/LICENSE-2.0 | 
|  | 15 | * | 
|  | 16 | *  Unless required by applicable law or agreed to in writing, software | 
|  | 17 | *  distributed under the License is distributed on an "AS IS" BASIS, WITHOUT | 
|  | 18 | *  WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. | 
|  | 19 | *  See the License for the specific language governing permissions and | 
|  | 20 | *  limitations under the License. | 
| Manuel Pégourié-Gonnard | fd6d897 | 2015-05-15 12:09:00 +0200 | [diff] [blame] | 21 | */ | 
|  | 22 | #ifndef MBEDTLS_SSL_TICKET_H | 
|  | 23 | #define MBEDTLS_SSL_TICKET_H | 
| Mateusz Starzyk | 846f021 | 2021-05-19 19:44:07 +0200 | [diff] [blame] | 24 | #include "mbedtls/private_access.h" | 
| Manuel Pégourié-Gonnard | fd6d897 | 2015-05-15 12:09:00 +0200 | [diff] [blame] | 25 |  | 
| Bence Szépkúti | c662b36 | 2021-05-27 11:25:03 +0200 | [diff] [blame] | 26 | #include "mbedtls/build_info.h" | 
| Ron Eldor | 8b0cf2e | 2018-02-14 16:02:41 +0200 | [diff] [blame] | 27 |  | 
| Manuel Pégourié-Gonnard | 4214e3a | 2015-05-25 19:34:49 +0200 | [diff] [blame] | 28 | /* | 
|  | 29 | * This implementation of the session ticket callbacks includes key | 
|  | 30 | * management, rotating the keys periodically in order to preserve forward | 
|  | 31 | * secrecy, when MBEDTLS_HAVE_TIME is defined. | 
|  | 32 | */ | 
|  | 33 |  | 
| Jaeden Amero | 6609aef | 2019-07-04 20:01:14 +0100 | [diff] [blame] | 34 | #include "mbedtls/ssl.h" | 
|  | 35 | #include "mbedtls/cipher.h" | 
| Dave Rodgman | 536f28c | 2022-08-17 14:20:36 +0100 | [diff] [blame] | 36 |  | 
|  | 37 | #if defined(MBEDTLS_HAVE_TIME) | 
| Dave Rodgman | 392f714 | 2022-08-17 11:19:41 +0100 | [diff] [blame] | 38 | #include "mbedtls/platform_time.h" | 
| Dave Rodgman | 536f28c | 2022-08-17 14:20:36 +0100 | [diff] [blame] | 39 | #endif | 
| Manuel Pégourié-Gonnard | fd6d897 | 2015-05-15 12:09:00 +0200 | [diff] [blame] | 40 |  | 
| Gabor Mezei | 2a02051 | 2022-03-10 15:15:46 +0100 | [diff] [blame] | 41 | #if defined(MBEDTLS_USE_PSA_CRYPTO) | 
|  | 42 | #include "psa/crypto.h" | 
|  | 43 | #endif | 
|  | 44 |  | 
| Manuel Pégourié-Gonnard | 0849a0a | 2015-05-20 11:34:54 +0200 | [diff] [blame] | 45 | #if defined(MBEDTLS_THREADING_C) | 
| Jaeden Amero | 6609aef | 2019-07-04 20:01:14 +0100 | [diff] [blame] | 46 | #include "mbedtls/threading.h" | 
| Manuel Pégourié-Gonnard | 0849a0a | 2015-05-20 11:34:54 +0200 | [diff] [blame] | 47 | #endif | 
|  | 48 |  | 
| Manuel Pégourié-Gonnard | fd6d897 | 2015-05-15 12:09:00 +0200 | [diff] [blame] | 49 | #ifdef __cplusplus | 
|  | 50 | extern "C" { | 
|  | 51 | #endif | 
|  | 52 |  | 
| Glenn Strauss | a941b62 | 2022-02-09 15:24:56 -0500 | [diff] [blame] | 53 | #define MBEDTLS_SSL_TICKET_MAX_KEY_BYTES 32          /*!< Max supported key length in bytes */ | 
|  | 54 | #define MBEDTLS_SSL_TICKET_KEY_NAME_BYTES 4          /*!< key name length in bytes */ | 
|  | 55 |  | 
| Manuel Pégourié-Gonnard | d59675d | 2015-05-19 15:28:00 +0200 | [diff] [blame] | 56 | /** | 
| Manuel Pégourié-Gonnard | 887674a | 2015-05-25 11:00:19 +0200 | [diff] [blame] | 57 | * \brief   Information for session ticket protection | 
|  | 58 | */ | 
| Gilles Peskine | 449bd83 | 2023-01-11 14:50:10 +0100 | [diff] [blame] | 59 | typedef struct mbedtls_ssl_ticket_key { | 
| Glenn Strauss | a941b62 | 2022-02-09 15:24:56 -0500 | [diff] [blame] | 60 | unsigned char MBEDTLS_PRIVATE(name)[MBEDTLS_SSL_TICKET_KEY_NAME_BYTES]; | 
| Gilles Peskine | 449bd83 | 2023-01-11 14:50:10 +0100 | [diff] [blame] | 61 | /*!< random key identifier              */ | 
| Dave Rodgman | 536f28c | 2022-08-17 14:20:36 +0100 | [diff] [blame] | 62 | #if defined(MBEDTLS_HAVE_TIME) | 
| Dave Rodgman | 392f714 | 2022-08-17 11:19:41 +0100 | [diff] [blame] | 63 | mbedtls_time_t MBEDTLS_PRIVATE(generation_time); /*!< key generation timestamp (seconds) */ | 
| Dave Rodgman | 536f28c | 2022-08-17 14:20:36 +0100 | [diff] [blame] | 64 | #endif | 
| Gabor Mezei | 2a02051 | 2022-03-10 15:15:46 +0100 | [diff] [blame] | 65 | #if !defined(MBEDTLS_USE_PSA_CRYPTO) | 
| Mateusz Starzyk | 846f021 | 2021-05-19 19:44:07 +0200 | [diff] [blame] | 66 | mbedtls_cipher_context_t MBEDTLS_PRIVATE(ctx);   /*!< context for auth enc/decryption    */ | 
| Gabor Mezei | 2a02051 | 2022-03-10 15:15:46 +0100 | [diff] [blame] | 67 | #else | 
|  | 68 | mbedtls_svc_key_id_t MBEDTLS_PRIVATE(key);       /*!< key used for auth enc/decryption   */ | 
|  | 69 | psa_algorithm_t MBEDTLS_PRIVATE(alg);            /*!< algorithm of auth enc/decryption   */ | 
|  | 70 | psa_key_type_t MBEDTLS_PRIVATE(key_type);        /*!< key type                           */ | 
|  | 71 | size_t MBEDTLS_PRIVATE(key_bits);                /*!< key length in bits                 */ | 
|  | 72 | #endif | 
| Manuel Pégourié-Gonnard | 887674a | 2015-05-25 11:00:19 +0200 | [diff] [blame] | 73 | } | 
|  | 74 | mbedtls_ssl_ticket_key; | 
|  | 75 |  | 
|  | 76 | /** | 
| Manuel Pégourié-Gonnard | d59675d | 2015-05-19 15:28:00 +0200 | [diff] [blame] | 77 | * \brief   Context for session ticket handling functions | 
|  | 78 | */ | 
| Gilles Peskine | 449bd83 | 2023-01-11 14:50:10 +0100 | [diff] [blame] | 79 | typedef struct mbedtls_ssl_ticket_context { | 
| Mateusz Starzyk | 846f021 | 2021-05-19 19:44:07 +0200 | [diff] [blame] | 80 | mbedtls_ssl_ticket_key MBEDTLS_PRIVATE(keys)[2]; /*!< ticket protection keys             */ | 
|  | 81 | unsigned char MBEDTLS_PRIVATE(active);           /*!< index of the currently active key  */ | 
| Manuel Pégourié-Gonnard | d59675d | 2015-05-19 15:28:00 +0200 | [diff] [blame] | 82 |  | 
| Mateusz Starzyk | 846f021 | 2021-05-19 19:44:07 +0200 | [diff] [blame] | 83 | uint32_t MBEDTLS_PRIVATE(ticket_lifetime);       /*!< lifetime of tickets in seconds     */ | 
| Manuel Pégourié-Gonnard | d59675d | 2015-05-19 15:28:00 +0200 | [diff] [blame] | 84 |  | 
|  | 85 | /** Callback for getting (pseudo-)random numbers                        */ | 
| Gilles Peskine | 449bd83 | 2023-01-11 14:50:10 +0100 | [diff] [blame] | 86 | int(*MBEDTLS_PRIVATE(f_rng))(void *, unsigned char *, size_t); | 
| Mateusz Starzyk | 846f021 | 2021-05-19 19:44:07 +0200 | [diff] [blame] | 87 | void *MBEDTLS_PRIVATE(p_rng);                    /*!< context for the RNG function       */ | 
| Manuel Pégourié-Gonnard | 0849a0a | 2015-05-20 11:34:54 +0200 | [diff] [blame] | 88 |  | 
|  | 89 | #if defined(MBEDTLS_THREADING_C) | 
| Mateusz Starzyk | 846f021 | 2021-05-19 19:44:07 +0200 | [diff] [blame] | 90 | mbedtls_threading_mutex_t MBEDTLS_PRIVATE(mutex); | 
| Manuel Pégourié-Gonnard | 0849a0a | 2015-05-20 11:34:54 +0200 | [diff] [blame] | 91 | #endif | 
| Manuel Pégourié-Gonnard | d59675d | 2015-05-19 15:28:00 +0200 | [diff] [blame] | 92 | } | 
|  | 93 | mbedtls_ssl_ticket_context; | 
|  | 94 |  | 
|  | 95 | /** | 
|  | 96 | * \brief           Initialize a ticket context. | 
|  | 97 | *                  (Just make it ready for mbedtls_ssl_ticket_setup() | 
|  | 98 | *                  or mbedtls_ssl_ticket_free().) | 
|  | 99 | * | 
|  | 100 | * \param ctx       Context to be initialized | 
|  | 101 | */ | 
| Gilles Peskine | 449bd83 | 2023-01-11 14:50:10 +0100 | [diff] [blame] | 102 | void mbedtls_ssl_ticket_init(mbedtls_ssl_ticket_context *ctx); | 
| Manuel Pégourié-Gonnard | d59675d | 2015-05-19 15:28:00 +0200 | [diff] [blame] | 103 |  | 
|  | 104 | /** | 
|  | 105 | * \brief           Prepare context to be actually used | 
|  | 106 | * | 
|  | 107 | * \param ctx       Context to be set up | 
| Manuel Pégourié-Gonnard | ad5390f | 2021-06-15 11:29:26 +0200 | [diff] [blame] | 108 | * \param f_rng     RNG callback function (mandatory) | 
| Manuel Pégourié-Gonnard | d59675d | 2015-05-19 15:28:00 +0200 | [diff] [blame] | 109 | * \param p_rng     RNG callback context | 
| Manuel Pégourié-Gonnard | dc54ff8 | 2015-06-25 12:44:46 +0200 | [diff] [blame] | 110 | * \param cipher    AEAD cipher to use for ticket protection. | 
|  | 111 | *                  Recommended value: MBEDTLS_CIPHER_AES_256_GCM. | 
| Manuel Pégourié-Gonnard | d59675d | 2015-05-19 15:28:00 +0200 | [diff] [blame] | 112 | * \param lifetime  Tickets lifetime in seconds | 
| Manuel Pégourié-Gonnard | dc54ff8 | 2015-06-25 12:44:46 +0200 | [diff] [blame] | 113 | *                  Recommended value: 86400 (one day). | 
| Manuel Pégourié-Gonnard | d59675d | 2015-05-19 15:28:00 +0200 | [diff] [blame] | 114 | * | 
| Manuel Pégourié-Gonnard | a0adc1b | 2015-05-25 10:35:16 +0200 | [diff] [blame] | 115 | * \note            It is highly recommended to select a cipher that is at | 
| Tobias Nießen | 1e8ca12 | 2021-05-10 19:53:15 +0200 | [diff] [blame] | 116 | *                  least as strong as the strongest ciphersuite | 
| Manuel Pégourié-Gonnard | a0adc1b | 2015-05-25 10:35:16 +0200 | [diff] [blame] | 117 | *                  supported. Usually that means a 256-bit key. | 
|  | 118 | * | 
| Manuel Pégourié-Gonnard | dc54ff8 | 2015-06-25 12:44:46 +0200 | [diff] [blame] | 119 | * \note            The lifetime of the keys is twice the lifetime of tickets. | 
| Glenn Strauss | a950938 | 2022-02-02 23:32:18 -0500 | [diff] [blame] | 120 | *                  It is recommended to pick a reasonable lifetime so as not | 
| Manuel Pégourié-Gonnard | dc54ff8 | 2015-06-25 12:44:46 +0200 | [diff] [blame] | 121 | *                  to negate the benefits of forward secrecy. | 
|  | 122 | * | 
| Manuel Pégourié-Gonnard | 81abefd | 2015-05-29 12:53:47 +0200 | [diff] [blame] | 123 | * \return          0 if successful, | 
| Manuel Pégourié-Gonnard | d59675d | 2015-05-19 15:28:00 +0200 | [diff] [blame] | 124 | *                  or a specific MBEDTLS_ERR_XXX error code | 
|  | 125 | */ | 
| Gilles Peskine | 449bd83 | 2023-01-11 14:50:10 +0100 | [diff] [blame] | 126 | int mbedtls_ssl_ticket_setup(mbedtls_ssl_ticket_context *ctx, | 
|  | 127 | int (*f_rng)(void *, unsigned char *, size_t), void *p_rng, | 
|  | 128 | mbedtls_cipher_type_t cipher, | 
|  | 129 | uint32_t lifetime); | 
| Manuel Pégourié-Gonnard | d59675d | 2015-05-19 15:28:00 +0200 | [diff] [blame] | 130 |  | 
|  | 131 | /** | 
| Glenn Strauss | a950938 | 2022-02-02 23:32:18 -0500 | [diff] [blame] | 132 | * \brief           Rotate session ticket encryption key to new specified key. | 
|  | 133 | *                  Provides for external control of session ticket encryption | 
|  | 134 | *                  key rotation, e.g. for synchronization between different | 
|  | 135 | *                  machines.  If this function is not used, or if not called | 
|  | 136 | *                  before ticket lifetime expires, then a new session ticket | 
|  | 137 | *                  encryption key is generated internally in order to avoid | 
|  | 138 | *                  unbounded session ticket encryption key lifetimes. | 
|  | 139 | * | 
|  | 140 | * \param ctx       Context to be set up | 
|  | 141 | * \param name      Session ticket encryption key name | 
|  | 142 | * \param nlength   Session ticket encryption key name length in bytes | 
|  | 143 | * \param k         Session ticket encryption key | 
|  | 144 | * \param klength   Session ticket encryption key length in bytes | 
|  | 145 | * \param lifetime  Tickets lifetime in seconds | 
|  | 146 | *                  Recommended value: 86400 (one day). | 
|  | 147 | * | 
|  | 148 | * \note            \c name and \c k are recommended to be cryptographically | 
|  | 149 | *                  random data. | 
|  | 150 | * | 
|  | 151 | * \note            \c nlength must match sizeof( ctx->name ) | 
|  | 152 | * | 
|  | 153 | * \note            \c klength must be sufficient for use by cipher specified | 
|  | 154 | *                  to \c mbedtls_ssl_ticket_setup | 
|  | 155 | * | 
|  | 156 | * \note            The lifetime of the keys is twice the lifetime of tickets. | 
|  | 157 | *                  It is recommended to pick a reasonable lifetime so as not | 
|  | 158 | *                  to negate the benefits of forward secrecy. | 
|  | 159 | * | 
|  | 160 | * \return          0 if successful, | 
|  | 161 | *                  or a specific MBEDTLS_ERR_XXX error code | 
|  | 162 | */ | 
| Gilles Peskine | 449bd83 | 2023-01-11 14:50:10 +0100 | [diff] [blame] | 163 | int mbedtls_ssl_ticket_rotate(mbedtls_ssl_ticket_context *ctx, | 
|  | 164 | const unsigned char *name, size_t nlength, | 
|  | 165 | const unsigned char *k, size_t klength, | 
|  | 166 | uint32_t lifetime); | 
| Glenn Strauss | a950938 | 2022-02-02 23:32:18 -0500 | [diff] [blame] | 167 |  | 
|  | 168 | /** | 
| Manuel Pégourié-Gonnard | d59675d | 2015-05-19 15:28:00 +0200 | [diff] [blame] | 169 | * \brief           Implementation of the ticket write callback | 
|  | 170 | * | 
| Antonin Décimo | 36e89b5 | 2019-01-23 15:24:37 +0100 | [diff] [blame] | 171 | * \note            See \c mbedtls_ssl_ticket_write_t for description | 
| Manuel Pégourié-Gonnard | d59675d | 2015-05-19 15:28:00 +0200 | [diff] [blame] | 172 | */ | 
|  | 173 | mbedtls_ssl_ticket_write_t mbedtls_ssl_ticket_write; | 
|  | 174 |  | 
|  | 175 | /** | 
|  | 176 | * \brief           Implementation of the ticket parse callback | 
|  | 177 | * | 
| Antonin Décimo | 36e89b5 | 2019-01-23 15:24:37 +0100 | [diff] [blame] | 178 | * \note            See \c mbedtls_ssl_ticket_parse_t for description | 
| Manuel Pégourié-Gonnard | d59675d | 2015-05-19 15:28:00 +0200 | [diff] [blame] | 179 | */ | 
|  | 180 | mbedtls_ssl_ticket_parse_t mbedtls_ssl_ticket_parse; | 
|  | 181 |  | 
|  | 182 | /** | 
|  | 183 | * \brief           Free a context's content and zeroize it. | 
|  | 184 | * | 
|  | 185 | * \param ctx       Context to be cleaned up | 
|  | 186 | */ | 
| Gilles Peskine | 449bd83 | 2023-01-11 14:50:10 +0100 | [diff] [blame] | 187 | void mbedtls_ssl_ticket_free(mbedtls_ssl_ticket_context *ctx); | 
| Manuel Pégourié-Gonnard | fd6d897 | 2015-05-15 12:09:00 +0200 | [diff] [blame] | 188 |  | 
|  | 189 | #ifdef __cplusplus | 
|  | 190 | } | 
|  | 191 | #endif | 
|  | 192 |  | 
|  | 193 | #endif /* ssl_ticket.h */ |