blob: ad1592357b2c573be391711578cb8e10d549b4ca [file] [log] [blame]
Manuel Pégourié-Gonnardfd6d8972015-05-15 12:09:00 +02001/**
2 * \file ssl_ticket.h
3 *
4 * \brief TLS server ticket callbacks implementation
Darryl Greena40a1012018-01-05 15:33:17 +00005 */
6/*
Bence Szépkúti1e148272020-08-07 13:07:28 +02007 * Copyright The Mbed TLS Contributors
Dave Rodgman7ff79652023-11-03 12:04:52 +00008 * SPDX-License-Identifier: Apache-2.0 OR GPL-2.0-or-later
Manuel Pégourié-Gonnardfd6d8972015-05-15 12:09:00 +02009 */
10#ifndef MBEDTLS_SSL_TICKET_H
11#define MBEDTLS_SSL_TICKET_H
12
Ron Eldor8b0cf2e2018-02-14 16:02:41 +020013#if !defined(MBEDTLS_CONFIG_FILE)
Jaeden Amero6609aef2019-07-04 20:01:14 +010014#include "mbedtls/config.h"
Ron Eldor8b0cf2e2018-02-14 16:02:41 +020015#else
16#include MBEDTLS_CONFIG_FILE
17#endif
18
Manuel Pégourié-Gonnard4214e3a2015-05-25 19:34:49 +020019/*
20 * This implementation of the session ticket callbacks includes key
21 * management, rotating the keys periodically in order to preserve forward
22 * secrecy, when MBEDTLS_HAVE_TIME is defined.
23 */
24
Jaeden Amero6609aef2019-07-04 20:01:14 +010025#include "mbedtls/ssl.h"
26#include "mbedtls/cipher.h"
Manuel Pégourié-Gonnardfd6d8972015-05-15 12:09:00 +020027
Manuel Pégourié-Gonnard0849a0a2015-05-20 11:34:54 +020028#if defined(MBEDTLS_THREADING_C)
Jaeden Amero6609aef2019-07-04 20:01:14 +010029#include "mbedtls/threading.h"
Manuel Pégourié-Gonnard0849a0a2015-05-20 11:34:54 +020030#endif
31
Manuel Pégourié-Gonnardfd6d8972015-05-15 12:09:00 +020032#ifdef __cplusplus
33extern "C" {
34#endif
35
Manuel Pégourié-Gonnardd59675d2015-05-19 15:28:00 +020036/**
Manuel Pégourié-Gonnard887674a2015-05-25 11:00:19 +020037 * \brief Information for session ticket protection
38 */
Gilles Peskine1b6c09a2023-01-11 14:52:35 +010039typedef struct mbedtls_ssl_ticket_key {
Manuel Pégourié-Gonnard887674a2015-05-25 11:00:19 +020040 unsigned char name[4]; /*!< random key identifier */
41 uint32_t generation_time; /*!< key generation timestamp (seconds) */
42 mbedtls_cipher_context_t ctx; /*!< context for auth enc/decryption */
43}
44mbedtls_ssl_ticket_key;
45
46/**
Manuel Pégourié-Gonnardd59675d2015-05-19 15:28:00 +020047 * \brief Context for session ticket handling functions
48 */
Gilles Peskine1b6c09a2023-01-11 14:52:35 +010049typedef struct mbedtls_ssl_ticket_context {
Manuel Pégourié-Gonnard887674a2015-05-25 11:00:19 +020050 mbedtls_ssl_ticket_key keys[2]; /*!< ticket protection keys */
Manuel Pégourié-Gonnard1e9c4db2015-05-25 14:07:08 +020051 unsigned char active; /*!< index of the currently active key */
Manuel Pégourié-Gonnardd59675d2015-05-19 15:28:00 +020052
53 uint32_t ticket_lifetime; /*!< lifetime of tickets in seconds */
54
55 /** Callback for getting (pseudo-)random numbers */
56 int (*f_rng)(void *, unsigned char *, size_t);
57 void *p_rng; /*!< context for the RNG function */
Manuel Pégourié-Gonnard0849a0a2015-05-20 11:34:54 +020058
59#if defined(MBEDTLS_THREADING_C)
60 mbedtls_threading_mutex_t mutex;
61#endif
Manuel Pégourié-Gonnardd59675d2015-05-19 15:28:00 +020062}
63mbedtls_ssl_ticket_context;
64
65/**
66 * \brief Initialize a ticket context.
67 * (Just make it ready for mbedtls_ssl_ticket_setup()
68 * or mbedtls_ssl_ticket_free().)
69 *
70 * \param ctx Context to be initialized
71 */
Gilles Peskine1b6c09a2023-01-11 14:52:35 +010072void mbedtls_ssl_ticket_init(mbedtls_ssl_ticket_context *ctx);
Manuel Pégourié-Gonnardd59675d2015-05-19 15:28:00 +020073
74/**
75 * \brief Prepare context to be actually used
76 *
77 * \param ctx Context to be set up
78 * \param f_rng RNG callback function
79 * \param p_rng RNG callback context
Manuel Pégourié-Gonnarddc54ff82015-06-25 12:44:46 +020080 * \param cipher AEAD cipher to use for ticket protection.
81 * Recommended value: MBEDTLS_CIPHER_AES_256_GCM.
Manuel Pégourié-Gonnardd59675d2015-05-19 15:28:00 +020082 * \param lifetime Tickets lifetime in seconds
Manuel Pégourié-Gonnarddc54ff82015-06-25 12:44:46 +020083 * Recommended value: 86400 (one day).
Manuel Pégourié-Gonnardd59675d2015-05-19 15:28:00 +020084 *
Manuel Pégourié-Gonnarda0adc1b2015-05-25 10:35:16 +020085 * \note It is highly recommended to select a cipher that is at
Tobias Nießen02b6fba2021-05-10 19:53:15 +020086 * least as strong as the strongest ciphersuite
Manuel Pégourié-Gonnarda0adc1b2015-05-25 10:35:16 +020087 * supported. Usually that means a 256-bit key.
88 *
Manuel Pégourié-Gonnarddc54ff82015-06-25 12:44:46 +020089 * \note The lifetime of the keys is twice the lifetime of tickets.
Adam Wolfef30d902019-09-10 09:53:08 -050090 * It is recommended to pick a reasonable lifetime so as not
Manuel Pégourié-Gonnarddc54ff82015-06-25 12:44:46 +020091 * to negate the benefits of forward secrecy.
92 *
Manuel Pégourié-Gonnard81abefd2015-05-29 12:53:47 +020093 * \return 0 if successful,
Manuel Pégourié-Gonnardd59675d2015-05-19 15:28:00 +020094 * or a specific MBEDTLS_ERR_XXX error code
95 */
Gilles Peskine1b6c09a2023-01-11 14:52:35 +010096int mbedtls_ssl_ticket_setup(mbedtls_ssl_ticket_context *ctx,
97 int (*f_rng)(void *, unsigned char *, size_t), void *p_rng,
98 mbedtls_cipher_type_t cipher,
99 uint32_t lifetime);
Manuel Pégourié-Gonnardd59675d2015-05-19 15:28:00 +0200100
101/**
102 * \brief Implementation of the ticket write callback
103 *
Antonin Décimo36e89b52019-01-23 15:24:37 +0100104 * \note See \c mbedtls_ssl_ticket_write_t for description
Manuel Pégourié-Gonnardd59675d2015-05-19 15:28:00 +0200105 */
106mbedtls_ssl_ticket_write_t mbedtls_ssl_ticket_write;
107
108/**
109 * \brief Implementation of the ticket parse callback
110 *
Antonin Décimo36e89b52019-01-23 15:24:37 +0100111 * \note See \c mbedtls_ssl_ticket_parse_t for description
Manuel Pégourié-Gonnardd59675d2015-05-19 15:28:00 +0200112 */
113mbedtls_ssl_ticket_parse_t mbedtls_ssl_ticket_parse;
114
115/**
116 * \brief Free a context's content and zeroize it.
117 *
118 * \param ctx Context to be cleaned up
119 */
Gilles Peskine1b6c09a2023-01-11 14:52:35 +0100120void mbedtls_ssl_ticket_free(mbedtls_ssl_ticket_context *ctx);
Manuel Pégourié-Gonnardfd6d8972015-05-15 12:09:00 +0200121
122#ifdef __cplusplus
123}
124#endif
125
126#endif /* ssl_ticket.h */