26#define LOG_PREFIX "tls"
29#include <freeradius-devel/server/pair.h>
30#include <freeradius-devel/server/log.h>
32#include <freeradius-devel/util/debug.h>
33#include <freeradius-devel/util/math.h>
34#include <freeradius-devel/util/base16.h>
35#include <freeradius-devel/util/skip.h>
36#include <freeradius-devel/util/pair_legacy.h>
38#include <freeradius-devel/protocol/freeradius/freeradius.internal.h>
40#include <freeradius-devel/unlang/action.h>
41#include <freeradius-devel/unlang/call.h>
42#include <freeradius-devel/unlang/interpret.h>
43#include <freeradius-devel/unlang/subrequest.h>
48#include <freeradius-devel/protocol/tls/freeradius.h>
55#include <openssl/x509v3.h>
56#include <openssl/ssl.h>
58static char const *tls_version_str[] = {
59 [SSL2_VERSION] =
"SSL 2.0",
60 [SSL3_VERSION] =
"SSL 3.0",
61 [TLS1_VERSION] =
"TLS 1.0",
62 [TLS1_1_VERSION] =
"TLS 1.1",
63 [TLS1_2_VERSION] =
"TLS 1.2",
64 [TLS1_3_VERSION] =
"TLS 1.3",
66 [TLS1_4_VERSION] =
"TLS 1.4",
70static char const *tls_content_type_str[] = {
71 [SSL3_RT_CHANGE_CIPHER_SPEC] =
"change_cipher_spec",
72 [SSL3_RT_ALERT] =
"alert",
73 [SSL3_RT_HANDSHAKE] =
"handshake",
74 [SSL3_RT_APPLICATION_DATA] =
"application_data",
76 [SSL3_RT_HEADER] =
"header",
78#ifdef SSL3_RT_INNER_CONTENT_TYPE
79 [SSL3_RT_INNER_CONTENT_TYPE] =
"inner_content_type",
83static char const *tls_alert_description_str[] = {
84 [SSL3_AD_CLOSE_NOTIFY] =
"close_notify",
85 [SSL3_AD_UNEXPECTED_MESSAGE] =
"unexpected_message",
86 [SSL3_AD_BAD_RECORD_MAC] =
"bad_record_mac",
87 [TLS1_AD_DECRYPTION_FAILED] =
"decryption_failed",
88 [TLS1_AD_RECORD_OVERFLOW] =
"record_overflow",
89 [SSL3_AD_DECOMPRESSION_FAILURE] =
"decompression_failure",
90 [SSL3_AD_HANDSHAKE_FAILURE] =
"handshake_failure",
91 [SSL3_AD_BAD_CERTIFICATE] =
"bad_certificate",
92 [SSL3_AD_UNSUPPORTED_CERTIFICATE] =
"unsupported_certificate",
93 [SSL3_AD_CERTIFICATE_REVOKED] =
"certificate_revoked",
94 [SSL3_AD_CERTIFICATE_EXPIRED] =
"certificate_expired",
95 [SSL3_AD_CERTIFICATE_UNKNOWN] =
"certificate_unknown",
96 [SSL3_AD_ILLEGAL_PARAMETER] =
"illegal_parameter",
97 [TLS1_AD_UNKNOWN_CA] =
"unknown_ca",
98 [TLS1_AD_ACCESS_DENIED] =
"access_denied",
99 [TLS1_AD_DECODE_ERROR] =
"decode_error",
100 [TLS1_AD_DECRYPT_ERROR] =
"decrypt_error",
101 [TLS1_AD_EXPORT_RESTRICTION] =
"export_restriction",
102 [TLS1_AD_PROTOCOL_VERSION] =
"protocol_version",
103 [TLS1_AD_INSUFFICIENT_SECURITY] =
"insufficient_security",
104 [TLS1_AD_INTERNAL_ERROR] =
"internal_error",
105 [TLS1_AD_USER_CANCELLED] =
"user_cancelled",
106 [TLS1_AD_NO_RENEGOTIATION] =
"no_renegotiation",
107#ifdef TLS13_AD_MISSING_EXTENSION
108 [TLS13_AD_MISSING_EXTENSION] =
"missing_extension",
110#ifdef TLS13_AD_CERTIFICATE_REQUIRED
111 [TLS13_AD_CERTIFICATE_REQUIRED] =
"certificate_required",
113#ifdef TLS1_AD_UNSUPPORTED_EXTENSION
114 [TLS1_AD_UNSUPPORTED_EXTENSION] =
"unsupported_extension",
116#ifdef TLS1_AD_CERTIFICATE_UNOBTAINABLE
117 [TLS1_AD_CERTIFICATE_UNOBTAINABLE] =
"certificate_unobtainable",
119#ifdef TLS1_AD_UNRECOGNIZED_NAME
120 [TLS1_AD_UNRECOGNIZED_NAME] =
"unrecognised_name",
122#ifdef TLS1_AD_BAD_CERTIFICATE_STATUS_RESPONSE
123 [TLS1_AD_BAD_CERTIFICATE_STATUS_RESPONSE] =
"bad_certificate_status_response",
125#ifdef TLS1_AD_BAD_CERTIFICATE_HASH_VALUE
126 [TLS1_AD_BAD_CERTIFICATE_HASH_VALUE] =
"bad_certificate_hash_value",
128#ifdef TLS1_AD_UNKNOWN_PSK_IDENTITY
129 [TLS1_AD_UNKNOWN_PSK_IDENTITY] =
"unknown_psk_identity",
131#ifdef TLS1_AD_NO_APPLICATION_PROTOCOL
132 [TLS1_AD_NO_APPLICATION_PROTOCOL] =
"no_application_protocol",
136static char const *tls_handshake_type_str[] = {
137 [SSL3_MT_HELLO_REQUEST] =
"hello_request",
138 [SSL3_MT_CLIENT_HELLO] =
"client_hello",
139 [SSL3_MT_SERVER_HELLO] =
"server_hello",
140#ifdef SSL3_MT_NEWSESSION_TICKET
141 [SSL3_MT_NEWSESSION_TICKET] =
"new_session_ticket",
143#ifdef SSL3_MT_END_OF_EARLY_DATA
144 [SSL3_MT_END_OF_EARLY_DATA] =
"end_of_early_data",
146#ifdef SSL3_MT_ENCRYPTED_EXTENSIONS
147 [SSL3_MT_ENCRYPTED_EXTENSIONS] =
"encrypted_extensions",
149 [SSL3_MT_CERTIFICATE] =
"certificate",
150 [SSL3_MT_SERVER_KEY_EXCHANGE] =
"server_key_exchange",
151 [SSL3_MT_CERTIFICATE_REQUEST] =
"certificate_request",
152 [SSL3_MT_SERVER_DONE] =
"server_hello_done",
153 [SSL3_MT_CERTIFICATE_VERIFY] =
"certificate_verify",
154 [SSL3_MT_CLIENT_KEY_EXCHANGE] =
"client_key_exchange",
155 [SSL3_MT_FINISHED] =
"finished",
156#ifdef SSL3_MT_CERTIFICATE_URL
157 [SSL3_MT_CERTIFICATE_URL] =
"certificate_url",
159#ifdef SSL3_MT_CERTIFICATE_STATUS
160 [SSL3_MT_CERTIFICATE_STATUS] =
"certificate_status",
162#ifdef SSL3_MT_SUPPLEMENTAL_DATA
163 [SSL3_MT_SUPPLEMENTAL_DATA] =
"supplemental_data",
165#ifdef SSL3_MT_KEY_UPDATE
166 [SSL3_MT_KEY_UPDATE] =
"key_update",
168#ifdef SSL3_MT_NEXT_PROTO
169 [SSL3_MT_NEXT_PROTO] =
"next_proto",
171#ifdef SSL3_MT_MESSAGE_HASH
172 [SSL3_MT_MESSAGE_HASH] =
"message_hash",
174#ifdef DTLS1_MT_HELLO_VERIFY_REQUEST
175 [DTLS1_MT_HELLO_VERIFY_REQUEST] =
"hello_verify_request",
177#ifdef SSL3_MT_CHANGE_CIPHER_SPEC
178 [SSL3_MT_CHANGE_CIPHER_SPEC] =
"change_cipher_spec",
194int fr_tls_session_password_cb(
char *buf,
int size,
int rwflag
UNUSED,
void *u)
204 ERROR(
"Private key encrypted but no private_key_password configured");
209 if (
len >= (
size_t)size) {
210 ERROR(
"Password too long. Maximum length is %i bytes", size - 1);
217#ifdef PSK_MAX_IDENTITY_LEN
225static bool session_psk_identity_is_safe(
const char *identity)
229 if (!identity)
return true;
231 while ((c = *(identity++)) !=
'\0') {
233 (c ==
'@') || (c ==
'-') || (c ==
'_') || (c ==
'.')) {
253unsigned int fr_tls_session_psk_client_cb(SSL *ssl,
UNUSED char const *hint,
254 char *identity,
unsigned int max_identity_len,
255 unsigned char *psk,
unsigned int max_psk_len)
257 unsigned int psk_len;
260 conf = (fr_tls_conf_t *)SSL_get_ex_data(ssl, FR_TLS_EX_INDEX_CONF);
263 psk_len = talloc_array_length(
conf->psk.key);
264 if (psk_len > max_psk_len)
return 0;
266 strlcpy(identity,
conf->psk.identity, max_identity_len);
267 memcpy(psk,
conf->psk.key, psk_len);
276static void tls_session_psk_reset(fr_tls_session_t *tls_session)
278 TALLOC_FREE(tls_session->psk.key);
279 tls_session->psk.key_len = 0;
280 tls_session->psk.state = FR_TLS_PSK_INIT;
299unsigned int fr_tls_session_psk_server_cb(SSL *ssl,
const char *identity,
300 unsigned char *psk,
unsigned int max_psk_len)
306 conf = (fr_tls_conf_t *)SSL_get_ex_data(ssl, FR_TLS_EX_INDEX_CONF);
309 request = fr_tls_session_request(ssl);
311 fr_tls_session_t *tls_session = fr_tls_session(ssl);
317 if (!session_psk_identity_is_safe(identity)) {
318 RWDEBUG(
"(TLS) Invalid characters in PSK identity %s", identity);
319 fr_tls_session_error_add(
request, FR_ERROR_VALUE_PSK_IDENTITY_INVALID);
330 RPWDEBUG2(
"Failed parsing TLS PSK Identity");
352 "Unexpected call to %s. tls_session_async_handshake_cont must be in call stack",
353 __FUNCTION__))
return 0;
355 fr_assert(tls_session->psk.state == FR_TLS_PSK_INIT);
356 tls_session->psk.state = FR_TLS_PSK_REQUESTED;
357 TLS_PENDING_SET(tls_session, FR_TLS_PENDING_PSK);
358 tls_session->psk.max_psk_len = max_psk_len;
367 tls_session_psk_reset(tls_session);
371 switch (tls_session->psk.state) {
372 case FR_TLS_PSK_SUCCESS:
375 case FR_TLS_PSK_FAILED:
376 tls_session_psk_reset(tls_session);
379 case FR_TLS_PSK_INIT:
380 case FR_TLS_PSK_REQUESTED:
381 fr_assert_msg(0,
"Handshake resumed with `load psk` in state %u",
382 tls_session->psk.state);
383 tls_session_psk_reset(tls_session);
392 psk_len = tls_session->psk.key_len;
393 memcpy(psk, tls_session->psk.key, psk_len);
394 tls_session_psk_reset(tls_session);
396 return (
unsigned int)psk_len;
399 if (!
conf->psk.identity) {
400 DEBUG(
"Rejecting the client, no fixed psk.identity set");
409 if (strcmp(identity,
conf->psk.identity) != 0) {
410 fr_tls_log_error(
"Supplied PSK identity %s does not match configuration. Rejecting.",
412 fr_tls_session_error_add(
request, FR_ERROR_VALUE_PSK_IDENTITY_UNKNOWN);
416 psk_len = talloc_array_length(
conf->psk.key);
417 if (psk_len > max_psk_len)
return 0;
419 memcpy(psk,
conf->psk.key, psk_len);
421 return (
unsigned int)psk_len;
439 fr_tls_session_t *tls_session = talloc_get_type_abort(uctx, fr_tls_session_t);
442 fr_assert(tls_session->psk.state == FR_TLS_PSK_REQUESTED);
446 RWDEBUG(
"(TLS) Failed loading the pre-shared key, `load psk` did not return success");
453 fr_tls_session_error_add(
request->parent,
455 FR_ERROR_VALUE_PSK_IDENTITY_UNKNOWN :
456 FR_ERROR_VALUE_LOAD_PSK_FAILED);
458 tls_session->psk.state = FR_TLS_PSK_FAILED;
463 if (!
vp || (
vp->vp_length == 0)) {
464 RWDEBUG(
"(TLS) `load psk` returned success, but reply.TLS-PSK-Key is missing or empty");
465 fr_tls_session_error_add(
request->parent, FR_ERROR_VALUE_PSK_EMPTY);
469 if (
vp->vp_length > tls_session->psk.max_psk_len) {
470 RWDEBUG(
"(TLS) Rejecting reply.TLS-PSK-Key of %zu bytes, OpenSSL accepts at most %u bytes",
vp->vp_length,
471 tls_session->psk.max_psk_len);
472 fr_tls_session_error_add(
request->parent, FR_ERROR_VALUE_PSK_TOO_LONG);
476 MEM(tls_session->psk.key = talloc_memdup(tls_session,
vp->vp_octets,
vp->vp_length));
477 tls_session->psk.key_len =
vp->vp_length;
478 tls_session->psk.state = FR_TLS_PSK_SUCCESS;
480 RDEBUG2(
"(TLS) Loaded a %zu-byte pre-shared key",
vp->vp_length);
501 fr_tls_conf_t *
conf = tls_session->conf;
517 RDEBUG2(
"(TLS) Loading the pre-shared key for identity \"%pV\"", &identity->data);
520 &tls_session->session_id));
525 fr_tls_session_extra_pairs_copy_to_child(child, tls_session);
532 ua = fr_tls_call_push(child, _tls_session_psk_load_resume,
conf, tls_session,
false);
534 REDEBUG(
"(TLS) Failed calling TLS virtual server");
577 vp->vp_uint8 = level;
580 vp->vp_uint8 = description;
582 RDEBUG2(
"(TLS) Adding %s%pP", prefix, alert);
597void fr_tls_session_info_cb(SSL
const *ssl,
int where,
int ret)
599 char const *role, *state;
608 if ((where & ~SSL_ST_MASK) & SSL_ST_CONNECT) {
610 }
else if (((where & ~SSL_ST_MASK)) & SSL_ST_ACCEPT) {
616 state = SSL_state_string_long(ssl);
617 state = state ? state :
"<INVALID>";
619 if ((where & SSL_CB_LOOP) || (where & SSL_CB_HANDSHAKE_START) || (where & SSL_CB_HANDSHAKE_DONE)) {
621 char const *abbrv = SSL_state_string(ssl);
628 if ((
len > 1) && (abbrv[
len - 1] ==
' '))
len--;
630 RDEBUG3(
"(TLS) Handshake state [%.*s] - %s%s", (
int)
len, abbrv, role, state);
632#ifdef OPENSSL_NO_SSL_TRACE
634 STACK_OF(SSL_CIPHER) *server_ciphers;
635 STACK_OF(SSL_CIPHER) *client_ciphers;
645 if (SSL_get_state(ssl) == TLS_ST_SR_CLNT_HELLO &&
646 (client_ciphers = SSL_get_client_ciphers(ssl))) {
649 const SSL_CIPHER *this_cipher;
651 server_ciphers = SSL_get_ciphers(ssl);
656 RDEBUG4(
"(TLS) Our preferred ciphers (by priority)");
659 num_ciphers = sk_SSL_CIPHER_num(server_ciphers);
660 for (i = 0; i < num_ciphers; i++) {
661 this_cipher = sk_SSL_CIPHER_value(server_ciphers, i);
662 RDEBUG4(
"(TLS) [%i] %s", i, SSL_CIPHER_get_name(this_cipher));
672 RDEBUG3(
"(TLS) Client's preferred ciphers (by priority)");
674 num_ciphers = sk_SSL_CIPHER_num(client_ciphers);
675 for (i = 0; i < num_ciphers; i++) {
676 this_cipher = sk_SSL_CIPHER_value(client_ciphers, i);
677 RDEBUG3(
"(TLS) [%i] %s", i, SSL_CIPHER_get_name(this_cipher));
685 RDEBUG2(
"(TLS) Handshake state - %s%s (%u)", role, state, SSL_get_state(ssl));
690 if (where & SSL_CB_ALERT) {
691 if ((ret & 0xff) == SSL_AD_CLOSE_NOTIFY)
return;
696 if (where & SSL_CB_READ) {
697 REDEBUG(
"(TLS) Client sent %s TLS alert (%i) - %s", SSL_alert_type_string_long(ret),
698 ret & 0xff, SSL_alert_desc_string_long(ret));
703 switch (ret & 0xff) {
704 case TLS1_AD_UNKNOWN_CA:
705 REDEBUG(
"(TLS) Verify the client has a copy of the server's Certificate "
706 "Authority (CA) installed, and trusts that CA");
724 (ret >> 8) & 0xff, ret & 0xff);
725 fr_tls_session_error_add(
request, FR_ERROR_VALUE_RECEIVED_ALERT);
730 REDEBUG(
"(TLS) Sending client %s TLS alert (%i) - %s",
731 SSL_alert_type_string_long(ret), ret & 0xff, SSL_alert_desc_string_long(ret));
736 switch (ret & 0xff) {
737 case TLS1_AD_PROTOCOL_VERSION:
738 REDEBUG(
"(TLS) Client requested a TLS protocol version that is not "
739 "enabled or not supported. Upgrade FreeRADIUS + OpenSSL to their latest "
740 "versions and/or adjust 'tls_max_version'/'tls_min_version' if you want "
741 "authentication to succeed");
754 (ret >> 8) & 0xff, ret & 0xff);
755 fr_tls_session_error_add(
request, FR_ERROR_VALUE_SENT_ALERT);
760 if (where & SSL_CB_EXIT) {
762 REDEBUG(
"(TLS) Handshake exit state %s%s", role, state);
767 if (SSL_want_read(ssl)) {
768 RDEBUG2(
"(TLS) Need more data from client");
771 REDEBUG(
"(TLS) Handshake exit state %s%s", role, state);
784 char const *version, *content_type;
785 char const *str_details1 = NULL;
786 char const *str_details2 = NULL;
787 char unknown_version[32];
788 char unknown_content_type[32];
789 char unknown_alert_level[32];
790 char unknown_alert_description[32];
791 char unknown_handshake_type[32];
805 if (((
size_t)tls_session->info.version >=
NUM_ELEMENTS(tls_version_str)) ||
806 !tls_version_str[tls_session->info.version]) {
807 snprintf(unknown_version,
sizeof(unknown_version),
"unknown_tls_version_0x%04x",
808 (
unsigned int) tls_session->info.version);
809 version = unknown_version;
811 version = tls_version_str[tls_session->info.version];
817 if (((
size_t)tls_session->info.content_type >=
NUM_ELEMENTS(tls_content_type_str)) ||
818 !tls_content_type_str[tls_session->info.content_type]) {
819 snprintf(unknown_content_type,
sizeof(unknown_content_type),
820 "unknown_content_type_0x%04x", (
unsigned int) tls_session->info.content_type);
821 content_type = unknown_content_type;
823 content_type = tls_content_type_str[tls_session->info.content_type];
826 if (tls_session->info.content_type == SSL3_RT_ALERT) {
827 if (tls_session->info.record_len == 2) {
828 switch (tls_session->info.alert_level) {
829 case SSL3_AL_WARNING:
830 str_details1 =
"warning";
833 str_details1 =
"fatal";
837 snprintf(unknown_alert_level,
sizeof(unknown_alert_level),
838 "unknown_alert_level_0x%04x", tls_session->info.alert_level);
839 str_details1 = unknown_alert_level;
843 if (((
size_t)tls_session->info.alert_description >=
NUM_ELEMENTS(tls_alert_description_str)) ||
844 !tls_alert_description_str[tls_session->info.alert_description]) {
845 snprintf(unknown_alert_description,
sizeof(unknown_alert_description),
846 "unknown_alert_0x%04x", tls_session->info.alert_description);
847 str_details2 = unknown_alert_description;
849 str_details2 = tls_alert_description_str[tls_session->info.alert_description];
852 str_details1 =
"unknown_alert_level";
853 str_details2 =
"unknown_alert";
857 if ((
size_t)tls_session->info.content_type == SSL3_RT_HANDSHAKE) {
858 if (tls_session->info.record_len > 0) {
863 if (!tls_handshake_type_str[tls_session->info.handshake_type]) {
864 snprintf(unknown_handshake_type,
sizeof(unknown_handshake_type),
865 "unknown_handshake_type_0x%02x", tls_session->info.handshake_type);
866 str_details1 = unknown_handshake_type;
868 str_details1 = tls_handshake_type_str[tls_session->info.handshake_type];
873 snprintf(tls_session->info.info_description,
sizeof(tls_session->info.info_description),
874 "%s %s, %s[length %lu]%s%s%s%s",
875 tls_session->info.origin ?
">>> send" :
"<<< recv",
878 (unsigned long)tls_session->info.record_len,
879 str_details1 ?
", " :
"",
880 str_details1 ? str_details1 :
"",
881 str_details2 ?
", " :
"",
882 str_details2 ? str_details2 :
"");
889 RHEXDUMP4(
data, data_len,
"(TLS) %s", tls_session->info.info_description);
891 RDEBUG2(
"(TLS) %s", tls_session->info.info_description);
924void fr_tls_session_msg_cb(
int write_p,
int msg_version,
int content_type,
925 void const *inbuf,
size_t len,
929 fr_tls_session_t *tls_session = talloc_get_type_abort(arg, fr_tls_session_t);
944 REDEBUG(
"(TLS) fr_tls_session_t and ssl arg do not match in fr_tls_session_msg_cb");
945 fr_tls_session_error_alert(
request, tls_session,
946 FR_ERROR_VALUE_SESSION_MISMATCH, SSL_AD_INTERNAL_ERROR);
947 tls_session->invalid =
true;
958 REDEBUG(
"(TLS) Invalid version (SSLv2) in handshake");
959 fr_tls_session_error_alert(
request, tls_session,
960 FR_ERROR_VALUE_INVALID_VERSION_SSLV2, SSL_AD_PROTOCOL_VERSION);
961 tls_session->invalid =
true;
968 REDEBUG(
"(TLS) Invalid version (SSLv3) in handshake");
969 fr_tls_session_error_alert(
request, tls_session,
970 FR_ERROR_VALUE_INVALID_VERSION_SSLV3, SSL_AD_PROTOCOL_VERSION);
971 tls_session->invalid =
true;
981 if ((msg_version == 0) && (content_type >
UINT8_MAX)) {
982 REDEBUG4(
"(TLS) Ignoring fr_tls_session_msg_cb call with pseudo content type %i, version %i",
983 content_type, msg_version);
987 if ((write_p != 0) && (write_p != 1)) {
988 REDEBUG4(
"(TLS) Ignoring fr_tls_session_msg_cb call with invalid write_p %d", write_p);
996 tls_session->info.origin = write_p;
997 tls_session->info.content_type = content_type;
998 tls_session->info.record_len =
len;
999 tls_session->info.version = msg_version;
1000 tls_session->info.initialized =
true;
1002 switch (content_type) {
1006 REDEBUG(
"(TLS) Invalid TLS Alert. Closing connection");
1007 fr_tls_session_error_alert(
request, tls_session,
1008 FR_ERROR_VALUE_INVALID_RECORD_LENGTH, SSL_AD_DECODE_ERROR);
1009 tls_session->invalid =
true;
1013 tls_session->info.alert_level = buf[0];
1014 tls_session->info.alert_description = buf[1];
1015 tls_session->info.handshake_type = 0x00;
1018 case SSL3_RT_HANDSHAKE:
1019 if (!
len)
goto invalid_alert;
1021 tls_session->info.handshake_type = buf[0];
1022 tls_session->info.alert_level = 0x00;
1023 tls_session->info.alert_description = 0x00;
1026#ifdef SSL3_RT_HEARTBEAT
1027 case TLS1_RT_HEARTBEAT:
1030 if ((
len >= 3) && (p[0] == 1)) {
1034 if ((payload_len + 3) >
len) {
1035 tls_session->invalid =
true;
1036 REDEBUG(
"(TLS) OpenSSL Heartbeat attack detected. Closing connection");
1037 fr_tls_session_error_alert(
request, tls_session,
1038 FR_ERROR_VALUE_HEARTBEAT_OVERFLOW, SSL_AD_DECODE_ERROR);
1053 switch (content_type) {
1057 case SSL3_RT_CHANGE_CIPHER_SPEC:
1058 if (write_p != TLS_INFO_ORIGIN_RECORD_SENT)
break;
1059 if (tls_session->write_encrypted)
break;
1061 tls_session->write_encrypted =
true;
1062 RDEBUG3(
"(TLS) The records we write are encrypted, from the ChangeCipherSpec onwards");
1070 case SSL3_RT_HANDSHAKE:
1071 if (tls_session->info.handshake_type != SSL3_MT_SERVER_HELLO)
break;
1072 if (SSL_version(ssl) < TLS1_3_VERSION)
break;
1073 if (tls_session->write_encrypted)
break;
1075 tls_session->write_encrypted =
true;
1076 RDEBUG3(
"(TLS) The records we write are encrypted, from the ServerHello onwards");
1085#ifndef OPENSSL_NO_SSL_TRACE
1087 SSL_trace(tls_session->info.origin,
1088 tls_session->info.version,
1089 tls_session->info.content_type,
1115void fr_tls_session_keylog_cb(
const SSL *ssl,
const char *
line)
1119 const char *filename;
1120 char buffer[64 + 2*SSL3_RANDOM_SIZE + 2*SSL_MAX_MASTER_KEY_LENGTH];
1128 filename = getenv(
"SSLKEYLOGFILE");
1130 fr_tls_conf_t *
conf;
1132 conf = (fr_tls_conf_t *)SSL_get_ex_data(ssl, FR_TLS_EX_INDEX_CONF);
1133 if (!
conf || !
conf->keylog_file || !*
conf->keylog_file)
return;
1135 filename =
conf->keylog_file;
1144 DEBUG(
"SSLKEYLOGFILE buffer not large enough, max %lu, required %lu",
sizeof(
buffer),
len + 1);
1156 fd = open(filename, O_WRONLY | O_CREAT | O_APPEND, S_IRUSR | S_IWUSR);
1158 DEBUG(
"Failed to open file %s: %s", filename, strerror(errno));
1166 DEBUG(
"Failed to write to file %s: %s", filename, strerror(errno));
1193bool fr_tls_session_is_init_finished(fr_tls_session_t *tls_session)
1195 fr_tls_conf_t *
conf;
1197 if (!SSL_is_init_finished(tls_session->ssl))
return false;
1204 if (tls_session->info.version != TLS1_3_VERSION)
return true;
1206 if (!tls_session->cache)
return true;
1208 conf = tls_session->conf;
1209 if (!(
conf->cache.mode & FR_TLS_TICKET_STATELESS))
return true;
1222 if (!SSL_is_server(tls_session->ssl)) {
1223 return tls_session->session_ticket_received || tls_session->seen_application_data;
1232 return (tls_session->cache->load.state != FR_TLS_TICKET_STATEFUL_REQUESTED);
1252 if (!tls_session->seen_application_data) {
1253 if (!SSL_is_init_finished(tls_session->ssl)) {
1254 REDEBUG(
"(TLS) Attempted to read application data before handshake completed");
1255 fr_tls_session_error_add(
request, FR_ERROR_VALUE_APPLICATION_DATA_TOO_EARLY);
1265 tls_session->seen_application_data =
true;
1268 fr_tls_session_request_bind(tls_session->ssl,
request);
1278 fr_tls_record_init(&tls_session->clean_out);
1292 ret = SSL_read(tls_session->ssl,
fr_dbuff_current(&tls_session->clean_out),
1297 code = SSL_get_error(tls_session->ssl, ret);
1299 case SSL_ERROR_WANT_READ:
1300 RWDEBUG(
"(TLS) Peer indicated record was complete, but OpenSSL returned SSL_WANT_READ. "
1301 "Attempting to continue");
1305 case SSL_ERROR_WANT_WRITE:
1306 REDEBUG(
"(TLS) Error in fragmentation logic: SSL_WANT_WRITE");
1311 case SSL_ERROR_NONE:
1312 RDEBUG2(
"(TLS) No application data received. Assuming handshake is continuing...");
1317 REDEBUG(
"(TLS) Error in fragmentation logic");
1318 fr_tls_log_io_error(
request, code,
"SSL_read (%s)", __FUNCTION__);
1331 "(TLS) Decrypted TLS application data (%zu bytes)",
fr_dbuff_used(&tls_session->clean_out));
1333 RDEBUG2(
"(TLS) Decrypted TLS application data (%zu bytes)",
fr_dbuff_used(&tls_session->clean_out));
1336 fr_tls_session_request_unbind(tls_session->ssl);
1358 if (!tls_session->seen_application_data) {
1359 if (!SSL_is_init_finished(tls_session->ssl)) {
1360 REDEBUG(
"(TLS) Attempted to write application data before handshake completed");
1361 fr_tls_session_error_add(
request, FR_ERROR_VALUE_APPLICATION_DATA_TOO_EARLY);
1365 tls_session->seen_application_data =
true;
1368 fr_tls_session_request_bind(tls_session->ssl,
request);
1389 "(TLS) TLS application data to encrypt (%zu bytes)",
used);
1391 RDEBUG2(
"(TLS) TLS application data to encrypt (%zu bytes)",
used);
1401 ret = fr_tls_log_io_error(
request, SSL_get_error(tls_session->ssl, ret),
1402 "SSL_write (%s)", __FUNCTION__);
1412 fr_tls_record_init(&tls_session->clean_in);
1424 fr_tls_session_request_unbind(tls_session->ssl);
1453 vp->vp_uint32 = error;
1465 if (session->alerts_sent > 3)
return -1;
1475 if (session->pending_alert && (level <= session->pending_alert_level))
return 0;
1487 if (session->write_encrypted) {
1488 RDEBUG2(
"(TLS) Not sending TLS alert (%u), the records we write are already encrypted",
1493 session->pending_alert =
true;
1494 session->pending_alert_level = level;
1495 session->pending_alert_description = description;
1518void fr_tls_session_error_alert(
request_t *
request, fr_tls_session_t *session,
1521 fr_tls_session_error_add(
request, error);
1523 (void) fr_tls_session_alert(
request, session, SSL3_AL_FATAL, description);
1526static void fr_tls_session_alert_send(
request_t *
request, fr_tls_session_t *session)
1535 session->info.origin = TLS_INFO_ORIGIN_RECORD_SENT;
1536 session->info.content_type = SSL3_RT_ALERT;
1537 session->info.alert_level = session->pending_alert_level;
1538 session->info.alert_description = session->pending_alert_description;
1548 session->info.version = TLS1_VERSION;
1549 session->info.record_len = 2;
1559 fr_tls_bio_dbuff_clear(session->from_ssl);
1565 (
uint8_t) session->info.content_type,
1567 session->pending_alert_level,
1568 session->pending_alert_description);
1575 tls_session_alert_pair_add(
request,
request->reply_ctx,
"reply.",
1576 session->pending_alert_level, session->pending_alert_description);
1577 fr_tls_session_error_add(
request, FR_ERROR_VALUE_SENT_ALERT);
1579 session->pending_alert =
false;
1580 session->alerts_sent++;
1582 SSL_clear(session->ssl);
1609void fr_tls_session_close_send(
request_t *
request, fr_tls_session_t *session)
1614 if (session->pending_alert) {
1615 fr_tls_session_alert_send(
request, session);
1624 if (session->alerts_sent > 0)
return;
1626 if (!SSL_is_init_finished(session->ssl))
return;
1633 if (SSL_get_shutdown(session->ssl) & SSL_SENT_SHUTDOWN)
return;
1639 bound = (fr_tls_session_request(session->ssl) != NULL);
1640 if (!bound) fr_tls_session_request_bind(session->ssl,
request);
1649 SSL_set_quiet_shutdown(session->ssl, 0);
1651 ret = SSL_shutdown(session->ssl);
1658 RDEBUG2(
"(TLS) Failed sending close_notify");
1661 RDEBUG2(
"(TLS) Sending close_notify");
1664 if (!bound) fr_tls_session_request_unbind(session->ssl);
1676static inline CC_HINT(always_inline)
1685 &tls_session->session_id));
1691 ua = fr_tls_call_push(child, NULL,
conf, tls_session,
false);
1705 fr_tls_session_t *tls_session = talloc_get_type_abort(uctx, fr_tls_session_t);
1707 return fr_tls_ticket_stateful_clear_session(
request, tls_session);
1733 fr_tls_conf_t *
conf = tls_session->conf;
1737 if (!
conf->fail_session)
return tls_session_fail_clear(
request, tls_session);
1741 tls_session_fail_clear,
1751 &tls_session->session_id));
1753 ua = fr_tls_call_push(child, NULL,
conf, tls_session,
false);
1768 fr_tls_session_t *tls_session = talloc_get_type_abort(uctx, fr_tls_session_t);
1770 RDEBUG3(
"(TLS) entered state %s", __FUNCTION__);
1781 if (SSL_is_init_finished(tls_session->ssl)) {
1782 SSL_CIPHER
const *cipher;
1784 char const *version;
1786 char cipher_desc[256], cipher_desc_clean[256];
1787 char *p = cipher_desc, *q = cipher_desc_clean;
1794 if (fr_tls_session_alpn_check(
request, tls_session) < 0) {
1795 fr_tls_session_close_send(
request, tls_session);
1796 tls_session->result = FR_TLS_RESULT_ERROR;
1797 fr_tls_session_request_unbind(tls_session->ssl);
1801 cipher = SSL_get_current_cipher(tls_session->ssl);
1802 SSL_CIPHER_description(cipher, cipher_desc,
sizeof(cipher_desc));
1808 while (*p !=
'\0') {
1817 RDEBUG2(
"(TLS) Cipher suite: %s", cipher_desc_clean);
1819 RDEBUG2(
"(TLS) Adding TLS session information to request");
1825 if (((
size_t)tls_session->info.version >=
NUM_ELEMENTS(tls_version_str)) ||
1826 !tls_version_str[tls_session->info.version]) {
1827 version =
"UNKNOWN";
1829 version = tls_version_str[tls_session->info.version];
1842 if (!tls_session->session) {
1843 tls_session->session = SSL_get_session(tls_session->ssl);
1844 if (tls_session->session) {
1845 tls_session_id_cache(tls_session, tls_session->session);
1847 if (!tls_session->session) {
1848 REDEBUG(
"(TLS) Failed getting TLS session");
1849 fr_tls_session_error_alert(
request, tls_session,
1850 FR_ERROR_VALUE_SESSION_MISSING, SSL_AD_INTERNAL_ERROR);
1851 fr_tls_session_close_send(
request, tls_session);
1852 tls_session->result = FR_TLS_RESULT_ERROR;
1853 fr_tls_session_request_unbind(tls_session->ssl);
1860 tls_session->session) != 1) {
1861 RDEBUG3(
"(TLS) Failed retrieving session data");
1868 if (SSL_session_reused(tls_session->ssl)) {
1886 fr_tls_record_init(&tls_session->clean_out);
1897 if (tls_session->pending_alert) fr_tls_session_alert_send(
request, tls_session);
1899 tls_session->result = FR_TLS_RESULT_SUCCESS;
1900 fr_tls_session_request_unbind(tls_session->ssl);
1901 if (SSL_is_init_finished(tls_session->ssl)) {
1902 fr_tls_conf_t *
conf = tls_session->conf;
1903 if (
conf->establish_session)
return tls_establish_session_push(
request,
conf, tls_session);
1918 fr_tls_session_t *tls_session = talloc_get_type_abort(uctx, fr_tls_session_t);
1939 for (ret = tls_session->last_ret;
1940 SSL_get_error(tls_session->ssl, ret) == SSL_ERROR_WANT_ASYNC;
1941 ret = SSL_read(tls_session->ssl,
fr_dbuff_current(&tls_session->clean_out),
1947 fr_tls_session_request_unbind(tls_session->ssl);
1971 static fr_tls_pending_push_t
const push[] = {
1972 [0] = fr_tls_ticket_stateful_pending_push,
1973 [1] = fr_tls_ticket_stateless_pending_push,
1974#ifdef PSK_MAX_IDENTITY_LEN
1975 [2] = fr_tls_session_psk_pending_push,
1977 [3] = fr_tls_verify_cert_pending_push,
1979 fr_tls_session_t *tls_session = talloc_get_type_abort(uctx, fr_tls_session_t);
1982 RDEBUG3(
"(TLS) (re-)entered state %s", __FUNCTION__);
1985 while (tls_session->pending) {
1987 fr_tls_pending_t bit = (fr_tls_pending_t)(UINT64_C(1) << idx);
1997 TLS_PENDING_CLEAR(tls_session, bit);
2005 tls_session->result = FR_TLS_RESULT_ERROR;
2009 ua = push[idx](
request, tls_session);
2068 tls_session->can_pause =
true;
2069 tls_session->last_ret = SSL_read(tls_session->ssl,
fr_dbuff_current(&tls_session->clean_out),
2071 tls_session->can_pause =
false;
2072 if (tls_session->last_ret > 0) {
2080 tls_session->seen_application_data =
true;
2086 tls_session->result = FR_TLS_RESULT_SUCCESS;
2091 fr_tls_session_request_unbind(tls_session->ssl);
2114 if (SSL_get_error(tls_session->ssl, tls_session->last_ret) == SSL_ERROR_SSL) {
2115 unsigned long ssl_err;
2123 while ((ssl_err = ERR_peek_error()) && (ERR_GET_REASON(ssl_err) == BIO_R_UNSUPPORTED_METHOD)) {
2124 (void) ERR_get_error();
2136 switch (err = SSL_get_error(tls_session->ssl, tls_session->last_ret)) {
2137 case SSL_ERROR_WANT_ASYNC:
2140 case SSL_ERROR_WANT_ASYNC_JOB:
2141 REDEBUG(
"(TLS) No async jobs available in pool, increase thread.openssl_async_pool_max");
2149 if (fr_tls_log_io_error(
request,
2150 err,
"SSL_read (%s)", __FUNCTION__) < 0)
goto error;
2151 return tls_session_async_handshake_done_round(
request, uctx);
2172 fr_tls_session_t *tls_session = talloc_get_type_abort(uctx, fr_tls_session_t);
2174 RDEBUG3(
"(TLS) entered state %s", __FUNCTION__);
2176 tls_session->result = FR_TLS_RESULT_IN_PROGRESS;
2178 fr_tls_session_request_bind(tls_session->ssl,
request);
2190 if (fr_tls_session_is_init_finished(tls_session)) {
2191 REDEBUG(
"(TLS) Attempted to continue TLS handshake, but handshake has completed");
2192 fr_tls_session_error_alert(
request, tls_session,
2193 FR_ERROR_VALUE_HANDSHAKE_FINISHED, SSL_AD_INTERNAL_ERROR);
2201 fr_tls_session_close_send(
request, tls_session);
2202 tls_session->result = FR_TLS_RESULT_ERROR;
2203 fr_tls_session_request_unbind(tls_session->ssl);
2207 if (tls_session->invalid) {
2208 REDEBUG(
"(TLS) Preventing invalid session from continuing");
2209 fr_tls_session_error_alert(
request, tls_session,
2210 FR_ERROR_VALUE_SESSION_INVALID, SSL_AD_INTERNAL_ERROR);
2220 tls_session->rounds++;
2221 if (tls_session->rounds >= FR_TLS_MAX_ROUNDS) {
2222 REDEBUG(
"(TLS) Failing TLS session due to too many handshake rounds (limit %u)", FR_TLS_MAX_ROUNDS);
2223 fr_tls_session_error_alert(
request, tls_session,
2224 FR_ERROR_VALUE_TOO_MANY_ROUNDS, SSL_AD_INTERNAL_ERROR);
2232 return tls_session_async_handshake_cont(
request, uctx);
2247 fr_tls_session_t *tls_session = talloc_get_type_abort(uctx, fr_tls_session_t);
2258 tls_session->result = FR_TLS_RESULT_ERROR;
2262 ua = fr_tls_ticket_stateful_load_client_push(
request, tls_session);
2266 return tls_session_handshake_round(
request, uctx);
2284 fr_tls_session_t *tls_session = talloc_get_type_abort(uctx, fr_tls_session_t);
2286 if ((tls_session->rounds == 0) && !SSL_is_server(tls_session->ssl)) {
2287 return tls_session_load_session(
request, uctx);
2290 return tls_session_handshake_round(
request, uctx);
2311 tls_session_async_handshake,
2313 tls_session_async_handshake_signal,
2323static int fr_tls_session_client_hello_cb(SSL *ssl,
UNUSED int *al,
UNUSED void *arg)
2325 fr_tls_conf_t *
conf = fr_tls_session_conf(ssl);
2332 if (
conf->cache.mode != FR_TLS_TICKET_DISABLED) {
2333 if (SSL_client_hello_get0_ext(ssl, TLSEXT_TYPE_session_ticket, NULL, NULL) == 1) {
2334 fr_tls_session_t *tls_session = fr_tls_session(ssl);
2335 tls_session->session_ticket_supported =
true;
2337 long ssl_options = SSL_get_options(ssl);
2338 RDEBUG2(
"(TLS) Session ticket extension not found in ClientHello");
2339 ssl_options |= SSL_OP_NO_TICKET;
2340 SSL_set_options(ssl, ssl_options);
2344 if (
conf->client_hello_parse)
return fr_tls_session_client_hello_pairs(ssl,
request);
2346 return SSL_CLIENT_HELLO_SUCCESS;
2354static int _fr_tls_session_free(fr_tls_session_t *session)
2363 fr_assert_msg(!fr_tls_ticket_stateful_pending(session->cache),
2364 "Session freed with cache work outstanding, the caller called neither "
2365 "fr_tls_ticket_stateful_store_session() nor fr_tls_ticket_stateful_clear_session()");
2383 SSL_set_quiet_shutdown(session->ssl, 1);
2389 if (SSL_shutdown(session->ssl) != 1) ERR_clear_error();
2391 SSL_free(session->ssl);
2392 session->ssl = NULL;
2401static fr_tls_session_t *tls_session_alloc(TALLOC_CTX *ctx,
request_t *
request, SSL_CTX *ssl_ctx)
2403 fr_tls_session_t *tls_session;
2405 tls_session = talloc_zero(ctx, fr_tls_session_t);
2406 if (!tls_session)
return NULL;
2411 tls_session->socket_type = (SSL_CTX_get_ssl_method(ssl_ctx) == DTLS_method()) ? SOCK_DGRAM : SOCK_STREAM;
2417 tls_session->conf = fr_tls_ctx_conf(ssl_ctx);
2419 tls_session->ctx = ssl_ctx;
2421 tls_session->ssl = SSL_new(ssl_ctx);
2422 if (!tls_session->ssl) {
2424 fr_tls_log_perror(
request,
"Error creating new TLS session");
2428 talloc_set_destructor(tls_session, _fr_tls_session_free);
2437 SSL_set_msg_callback(tls_session->ssl, fr_tls_session_msg_cb);
2438 SSL_set_msg_callback_arg(tls_session->ssl, tls_session);
2439 SSL_set_info_callback(tls_session->ssl, fr_tls_session_info_cb);
2441 SSL_set_ex_data(tls_session->ssl, FR_TLS_EX_INDEX_TLS_SESSION, (
void *)tls_session);
2446 if (!
request)
return tls_session;
2455 fr_dbuff_t *record[] = { &tls_session->clean_in, &tls_session->clean_out };
2461 MEM(
buff = talloc_array(tls_session,
uint8_t, SSL3_RT_MAX_PLAIN_LENGTH));
2512 MEM(rbio = fr_tls_bio_dbuff_alloc(&tls_session->into_ssl, tls_session, tls_session,
2513 FR_TLS_MAX_PACKET_SIZE, FR_TLS_MAX_PACKET_SIZE,
false));
2514 MEM(wbio = fr_tls_bio_dbuff_alloc(&tls_session->from_ssl, tls_session, tls_session,
2515 SSL3_RT_MAX_PLAIN_LENGTH, 0,
false));
2517 tls_session->dirty_in = fr_tls_bio_dbuff_in(tls_session->into_ssl);
2518 tls_session->dirty_out = fr_tls_bio_dbuff_out(tls_session->from_ssl);
2527 SSL_set_bio(tls_session->ssl, rbio, wbio);
2557fr_tls_session_t *fr_tls_session_alloc_client(TALLOC_CTX *ctx, SSL_CTX *ssl_ctx,
request_t *
request)
2560 fr_tls_session_t *tls_session;
2561 fr_tls_conf_t *
conf = fr_tls_ctx_conf(ssl_ctx);
2563 tls_session = tls_session_alloc(ctx,
request, ssl_ctx);
2564 if (!tls_session)
return NULL;
2572 SSL_set_connect_state(tls_session->ssl);
2581 verify_mode = SSL_VERIFY_PEER;
2582 if (!
conf->psk.identity) {
2584 verify_mode |= SSL_VERIFY_FAIL_IF_NO_PEER_CERT;
2594 tls_session->verify_peer_cert =
true;
2595 SSL_set_verify(tls_session->ssl, verify_mode, fr_tls_verify_cert_cb);
2603 SSL_set_verify(tls_session->ssl, verify_mode, NULL);
2606 SSL_set_ex_data(tls_session->ssl, FR_TLS_EX_INDEX_CONF, (
void *)
conf);
2612 if ((tls_session->socket_type == SOCK_DGRAM) && (fr_dtls_session_init(tls_session,
conf) < 0)) {
2622 if (
request && (
conf->cache.mode != FR_TLS_TICKET_DISABLED)) {
2623 tls_session->allow_session_resumption =
true;
2624 fr_tls_ticket_stateful_session_alloc(tls_session);
2644fr_tls_session_t *fr_tls_session_alloc_server(TALLOC_CTX *ctx, SSL_CTX *ssl_ctx,
request_t *
request,
bool client_cert)
2646 fr_tls_session_t *tls_session;
2647 int verify_mode = 0;
2649 fr_tls_conf_t *
conf = fr_tls_ctx_conf(ssl_ctx);
2651 RDEBUG2(
"(TLS) Initiating new TLS session");
2653 tls_session = tls_session_alloc(ctx,
request, ssl_ctx);
2654 if (!tls_session)
return NULL;
2656 fr_tls_session_request_bind(tls_session->ssl,
request);
2674 if (
conf->cache.mode != FR_TLS_TICKET_DISABLED) {
2677 uint8_t digest[SHA256_DIGEST_LENGTH];
2679 static_assert(
sizeof(digest) <= SSL_MAX_SSL_SESSION_ID_LENGTH,
2680 "SSL_MAX_SSL_SESSION_ID_LENGTH must be >= SHA256_DIGEST_LENGTH");
2684 RPEDEBUG(
"(TLS) Failed expanding session ID");
2686 fr_tls_session_request_unbind(tls_session->ssl);
2691 MEM(md_ctx = EVP_MD_CTX_create());
2692 EVP_DigestInit_ex(md_ctx, EVP_sha256(), NULL);
2693 EVP_DigestUpdate(md_ctx, context_id,
talloc_strlen(context_id));
2694 EVP_DigestFinal_ex(md_ctx, digest, NULL);
2695 EVP_MD_CTX_destroy(md_ctx);
2699 digest,
sizeof(digest)) == 1))
goto error;
2707 RDEBUG2(
"(TLS) Loading TLS session certificate \"%pV\"", &
vp->data);
2709 if (SSL_use_certificate_file(tls_session->ssl,
vp->vp_strvalue, SSL_FILETYPE_PEM) != 1) {
2710 fr_tls_log_perror(
request,
"Failed loading TLS session certificate \"%s\"",
2715 if (SSL_use_PrivateKey_file(tls_session->ssl,
vp->vp_strvalue, SSL_FILETYPE_PEM) != 1) {
2716 fr_tls_log_perror(
request,
"Failed loading TLS session certificate \"%s\"",
2721 if (SSL_check_private_key(tls_session->ssl) != 1) {
2722 fr_tls_log_perror(
request,
"Failed validating TLS session certificate \"%s\"",
2731 if (!
conf->chains || !
conf->chains[0]->private_key_file) {
2732 REDEBUG(
"(TLS) Server requires a private key file");
2733 fr_tls_session_error_add(
request, FR_ERROR_VALUE_NO_SERVER_PRIVATE_KEY);
2737 if (!
conf->chains || !
conf->chains[0]->certificate_file) {
2738 REDEBUG(
"(TLS) Server requires a certificate file");
2739 fr_tls_session_error_add(
request, FR_ERROR_VALUE_NO_SERVER_CERTIFICATE);
2750 if (
vp) client_cert =
vp->vp_bool;
2758 SSL_set_accept_state(tls_session->ssl);
2764 RDEBUG2(
"(TLS) Setting verify mode to require certificate from client");
2765 verify_mode = SSL_VERIFY_PEER;
2766 verify_mode |= SSL_VERIFY_FAIL_IF_NO_PEER_CERT;
2767 verify_mode |= SSL_VERIFY_CLIENT_ONCE;
2769 tls_session->verify_peer_cert = client_cert;
2771 SSL_set_verify(tls_session->ssl, verify_mode, fr_tls_verify_cert_cb);
2772 SSL_set_ex_data(tls_session->ssl, FR_TLS_EX_INDEX_CONF, (
void *)
conf);
2778 if ((tls_session->socket_type == SOCK_DGRAM) && (fr_dtls_session_init(tls_session,
conf) < 0)) {
2782 SSL_CTX_set_client_hello_cb(ssl_ctx, fr_tls_session_client_hello_cb, NULL);
2784 if (
conf->cache.mode != FR_TLS_TICKET_DISABLED) {
2785 tls_session->allow_session_resumption =
true;
2786 if (
conf->cache.mode & FR_TLS_TICKET_STATEFUL) fr_tls_ticket_stateful_session_alloc(tls_session);
2789 fr_tls_session_request_unbind(tls_session->ssl);
2832 tls_new_session_result,
unlang_action_t
Returned by unlang_op_t calls, determine the next action of the interpreter.
@ UNLANG_ACTION_PUSHED_CHILD
unlang_t pushed a new child onto the stack, execute it instead of continuing.
@ UNLANG_ACTION_FAIL
Encountered an unexpected error.
@ UNLANG_ACTION_CALCULATE_RESULT
Calculate a new section rlm_rcode_t value.
static int const char char buffer[256]
static uint8_t request[4]
#define IGNORE(_expr, _type)
#define DIAG_OFF_OPTIONAL(_x)
#define DIAG_ON_OPTIONAL(_x)
unlang_action_t unlang_call_push(unlang_result_t *p_result, request_t *request, CONF_SECTION *server_cs, bool top_frame)
Push a virtual server CONF_SECTION as a call frame onto the stack.
#define fr_dbuff_advance(_dbuff_or_marker, _len)
Advance 'current' position in dbuff or marker by _len bytes.
#define fr_dbuff_used(_dbuff_or_marker)
Return the number of bytes remaining between the start of the dbuff or marker and the current positio...
#define fr_dbuff_current(_dbuff_or_marker)
Return the 'current' position of a dbuff or marker.
#define fr_dbuff_init(_out, _start, _len_or_end)
Initialise an dbuff for encoding or decoding.
#define fr_dbuff_start(_dbuff_or_marker)
Return the 'start' position of a dbuff or marker.
#define fr_dbuff_remaining(_dbuff_or_marker)
Return the number of bytes remaining between the dbuff or marker and the end of the buffer.
#define fr_dbuff_in_bytes(_dbuff_or_marker,...)
Copy a byte sequence into a dbuff or marker.
#define fr_cond_assert(_x)
Calls panic_action ifndef NDEBUG, else logs error and evaluates to value of _x.
#define fr_assert_msg(_x, _msg,...)
Calls panic_action ifndef NDEBUG, else logs error and causes the server to exit immediately with code...
#define fr_cond_assert_msg(_x, _fmt,...)
Calls panic_action ifndef NDEBUG, else logs error and evaluates to value of _x.
int unlang_function_clear(request_t *request)
Clear pending repeat function calls, and remove the signal handler.
int unlang_function_repeat_clear(request_t *request)
Clear the pending repeat function, and keep the signal handler.
#define unlang_function_repeat_set(_request, _repeat)
Set a new repeat function for an existing function frame.
#define unlang_function_push(_request, _func, _repeat, _signal, _sigmask, _top_frame, _uctx)
Push a generic function onto the unlang stack.
void unlang_interpet_frame_discard(request_t *request)
Discard the bottom most frame on the request's stack.
bool unlang_request_is_cancelled(request_t const *request)
Return whether a request has been cancelled.
#define REXDENT()
Exdent (unindent) R* messages by one level.
#define ROPTIONAL(_l_request, _l_global, _fmt,...)
Use different logging functions depending on whether request is NULL or not.
#define RDEBUG_ENABLED3
True if request debug level 1-3 messages are enabled.
#define RHEXDUMP4(_data, _len, _fmt,...)
#define RPEDEBUG(fmt,...)
#define RHEXDUMP3(_data, _len, _fmt,...)
#define RDEBUG_ENABLED4
True if request debug level 1-4 messages are enabled.
#define RPWDEBUG2(fmt,...)
#define REDEBUG4(fmt,...)
#define RINDENT()
Indent R* messages by one level.
fr_value_box_t const * enum_tls_packet_type_load_psk
HIDDEN fr_dict_attr_t const * attr_tls_packet_type
HIDDEN fr_dict_attr_t const * attr_session_resumed
HIDDEN fr_dict_attr_t const * attr_tls_session_version
HIDDEN fr_dict_attr_t const * attr_tls_alert_level
fr_value_box_t const * enum_tls_packet_type_success
HIDDEN fr_dict_attr_t const * attr_tls_psk_key
HIDDEN fr_dict_attr_t const * attr_tls_session_require_client_cert
fr_value_box_t const * enum_tls_packet_type_new_session
fr_value_box_t const * enum_tls_packet_type_establish_session
HIDDEN fr_dict_attr_t const * attr_tls_error
fr_value_box_t const * enum_tls_packet_type_fail_session
HIDDEN fr_dict_attr_t const * attr_tls_session_cipher_suite
HIDDEN fr_dict_attr_t const * attr_tls_psk_identity
HIDDEN fr_dict_attr_t const * attr_tls_alert_description
fr_value_box_t const * enum_tls_packet_type_notfound
HIDDEN fr_dict_attr_t const * attr_tls_alert
HIDDEN fr_dict_attr_t const * attr_tls_session_cert_file
@ L_DBG_LVL_3
3rd highest priority debug messages (-xxx | -Xx).
@ L_DBG
Only displayed when debugging is enabled.
static uint8_t fr_low_bit_pos(uint64_t num)
Find the lowest order high bit in an unsigned 64 bit integer.
static uint16_t fr_nbo_to_uint16(uint8_t const data[static sizeof(uint16_t)])
Read an unsigned 16bit integer from wire format (big endian)
int fr_pair_append_by_da(TALLOC_CTX *ctx, fr_pair_t **out, fr_pair_list_t *list, fr_dict_attr_t const *da)
Alloc a new fr_pair_t (and append)
int fr_pair_list_copy(TALLOC_CTX *ctx, fr_pair_list_t *to, fr_pair_list_t const *from)
Duplicate a list of pairs.
int fr_pair_value_strdup(fr_pair_t *vp, char const *src, bool tainted)
Copy data into an "string" data type.
int fr_pair_value_from_str(fr_pair_t *vp, char const *value, size_t inlen, fr_sbuff_unescape_rules_t const *uerules, UNUSED bool tainted)
Convert string value to native attribute value.
fr_pair_t * fr_pair_find_by_da(fr_pair_list_t const *list, fr_pair_t const *prev, fr_dict_attr_t const *da)
Find the first pair with a matching da.
int fr_pair_append(fr_pair_list_t *list, fr_pair_t *to_add)
Add a VP to the end of the list.
int fr_pair_delete_by_da(fr_pair_list_t *list, fr_dict_attr_t const *da)
Delete matching pairs from the specified list.
void fr_pair_list_init(fr_pair_list_t *list)
Initialise a pair list header.
fr_pair_t * fr_pair_copy(TALLOC_CTX *ctx, fr_pair_t const *vp)
Copy a single valuepair.
#define pair_update_request(_attr, _da)
#define RDEBUG_ENABLED2()
#define request_is_detachable(_x)
#define pair_append_request(_attr, _da)
Allocate and append a fr_pair_t to the request list.
#define pair_update_session_state(_attr, _da)
Return or allocate a fr_pair_t in the session_state list.
#define tmpl_aexpand(_ctx, _out, _request, _vpt, _escape, _escape_ctx)
Expand a tmpl to a C type, allocing a new buffer to hold the string.
#define FR_SIGNAL_ALLOW(_signals)
Signal mask which blocks every signal except the ones in _signals.
fr_signal_t
Signals that can be generated/processed by request signal handlers.
@ FR_SIGNAL_NONE
No signals.
@ FR_SIGNAL_CANCEL
Request has been cancelled.
static char buff[sizeof("18446744073709551615")+3]
PUBLIC int snprintf(char *string, size_t length, char *format, va_alist)
size_t strlcpy(char *dst, char const *src, size_t siz)
Stores an attribute, a value and various bits of other data.
int unlang_subrequest_child_push(unlang_result_t *p_result, request_t *child, void const *unique_session_ptr, bool free_child, bool top_frame)
Push a pre-existing child back onto the stack as a subrequest.
static size_t talloc_strlen(char const *s)
Returns the length of a talloc array containing a string.
#define fr_value_box_init_null(_vb)
Initialise an empty/null box that will be filled later.
static fr_sbuff_err_t char size_t * len