25RCSID(
"$Id: 2024e63690676be1101c2b4bc5e3dfcca370311c $")
29#define LOG_PREFIX "tls"
31#include <openssl/hmac.h>
32#include <openssl/rand.h>
33#include <freeradius-devel/protocol/tls/freeradius.h>
46static uint8_t dtls_cookie_key[32];
70static int dtls_cookie_hmac(SSL *ssl,
uint8_t *
out,
unsigned int *out_len)
72 fr_tls_session_t *tls_session = fr_tls_session(ssl);
79 if (!tls_session->cookie) {
89 memset(
out, 0, EVP_MAX_MD_SIZE);
97 if (!HMAC(EVP_sha256(), dtls_cookie_key,
sizeof(dtls_cookie_key),
98 (
uint8_t const *) tls_session->cookie,
sizeof(*tls_session->cookie),
100 fr_tls_strerror_printf(NULL);
116int fr_dtls_cookie_generate_cb(SSL *ssl,
unsigned char *cookie,
unsigned int *cookie_len)
119 unsigned int hmac_len;
121 static_assert(EVP_MAX_MD_SIZE <= DTLS1_COOKIE_LENGTH,
122 "A SHA256 digest has to fit in a DTLS cookie");
124 if (dtls_cookie_hmac(ssl, hmac, &hmac_len) < 0)
return 0;
126 memcpy(cookie, hmac, hmac_len);
127 *cookie_len = hmac_len;
141int fr_dtls_cookie_verify_cb(SSL *ssl,
unsigned char const *cookie,
unsigned int cookie_len)
144 unsigned int hmac_len;
146 if (dtls_cookie_hmac(ssl, hmac, &hmac_len) < 0)
return 0;
148 if (cookie_len != hmac_len)
return 0;
154 return CRYPTO_memcmp(cookie, hmac, hmac_len) == 0;
165int fr_dtls_cookie_init(
void)
167 if (RAND_bytes(dtls_cookie_key,
sizeof(dtls_cookie_key)) != 1) {
168 fr_tls_strerror_printf(NULL);
186int fr_dtls_session_init(fr_tls_session_t *tls_session, fr_tls_conf_t
const *
conf)
188 fr_assert(tls_session->socket_type == SOCK_DGRAM);
198 SSL_set_options(tls_session->ssl, SSL_OP_NO_QUERY_MTU);
208 tls_session->mtu =
conf->fragment_size;
209 SSL_set_mtu(tls_session->ssl, tls_session->mtu);
218 if (fr_tls_bio_dbuff_datagram_init(tls_session->from_ssl) < 0) {
238 fr_tls_connection_t *conn = talloc_get_type_abort(uctx, fr_tls_connection_t);
244 RDEBUG2(
"(TLS) %s - DTLS retransmission timer fired", conn->name);
255 fr_tls_session_request_bind(conn->tls_session->ssl,
request);
256 ret = DTLSv1_handle_timeout(conn->tls_session->ssl);
257 fr_tls_session_request_unbind(conn->tls_session->ssl);
260 fr_tls_log_perror(
request,
"DTLS handshake timed out");
261 fr_tls_session_error_add(
request, FR_ERROR_VALUE_DTLS_HANDSHAKE_TIMEOUT);
262 fr_tls_connection_failed(conn, TLS_CONNECTION_FAIL_TLS);
266 if (fr_tls_connection_write(conn) < 0) {
267 fr_tls_connection_failed(conn, TLS_CONNECTION_FAIL_APPLICATION);
275 fr_dtls_timer_update(conn);
285void fr_dtls_timer_update(fr_tls_connection_t *conn)
293 if (!conn->tl)
return;
298 if (DTLSv1_get_timeout(conn->tls_session->ssl, &tv) != 1) {
306 false, _fr_dtls_timer_expired, conn) < 0) {
307 REDEBUG(
"(TLS) %s - Failed arming the DTLS retransmission timer", conn->name);
308 fr_tls_connection_failed(conn, TLS_CONNECTION_FAIL_APPLICATION);
static uint8_t request[4]
#define USES_APPLE_DEPRECATED_API
static fr_time_delta_t fr_time_delta_from_timeval(struct timeval const *tv)
#define FR_TIMER_DELETE(_ev_p)
#define fr_strerror_const(_msg)
static fr_sbuff_err_t char ** out