.id = GNUTLS_EXTENSION_ALPN,
/* this extension must be parsed even on resumption */
.parse_type = GNUTLS_EXT_MANDATORY,
+ .validity = GNUTLS_EXT_FLAG_CLIENT_HELLO|GNUTLS_EXT_FLAG_EE|GNUTLS_EXT_FLAG_TLS12_SERVER_HELLO,
.recv_func = _gnutls_alpn_recv_params,
.send_func = _gnutls_alpn_send_params,
.name = "ClientHello Padding",
.id = GNUTLS_EXTENSION_DUMBFW,
.parse_type = GNUTLS_EXT_APPLICATION,
+ .validity = GNUTLS_EXT_FLAG_CLIENT_HELLO|GNUTLS_EXT_FLAG_HRR,
.recv_func = NULL,
.send_func = _gnutls_dumbfw_send_params,
.name = "Negotiated Groups",
.id = GNUTLS_EXTENSION_SUPPORTED_ECC,
.parse_type = GNUTLS_EXT_TLS,
+ .validity = GNUTLS_EXT_FLAG_CLIENT_HELLO|GNUTLS_EXT_FLAG_EE|GNUTLS_EXT_FLAG_TLS12_SERVER_HELLO,
.recv_func = _gnutls_supported_ecc_recv_params,
.send_func = _gnutls_supported_ecc_send_params,
.name = "Supported ECC Point Formats",
.id = GNUTLS_EXTENSION_SUPPORTED_ECC_PF,
.parse_type = GNUTLS_EXT_TLS,
+ .validity = GNUTLS_EXT_FLAG_CLIENT_HELLO|GNUTLS_EXT_FLAG_TLS12_SERVER_HELLO,
.recv_func = _gnutls_supported_ecc_pf_recv_params,
.send_func = _gnutls_supported_ecc_pf_send_params,
.name = "Encrypt-then-MAC",
.id = GNUTLS_EXTENSION_ETM,
.parse_type = GNUTLS_EXT_MANDATORY,
+ .validity = GNUTLS_EXT_FLAG_CLIENT_HELLO|GNUTLS_EXT_FLAG_TLS12_SERVER_HELLO,
.recv_func = _gnutls_ext_etm_recv_params,
.send_func = _gnutls_ext_etm_send_params,
/*
- * Copyright (C) 2014 Red Hat, Inc.
+ * Copyright (C) 2014-2017 Red Hat, Inc.
*
* Author: Nikos Mavrogiannopoulos
*
*
*/
-/* This file contains the code for the Max Record Size TLS extension.
+/* This file contains the code for the RFC7627 (ext master secret) TLS extension.
*/
#include "gnutls_int.h"
.name = "Extended Master Secret",
.id = GNUTLS_EXTENSION_EXT_MASTER_SECRET,
.parse_type = GNUTLS_EXT_MANDATORY,
+ .validity = GNUTLS_EXT_FLAG_CLIENT_HELLO|GNUTLS_EXT_FLAG_TLS12_SERVER_HELLO,
.recv_func = _gnutls_ext_master_secret_recv_params,
.send_func = _gnutls_ext_master_secret_send_params,
.name = "Heartbeat",
.id = GNUTLS_EXTENSION_HEARTBEAT,
.parse_type = GNUTLS_EXT_TLS,
+ .validity = GNUTLS_EXT_FLAG_CLIENT_HELLO|GNUTLS_EXT_FLAG_EE|GNUTLS_EXT_FLAG_TLS12_SERVER_HELLO,
.recv_func = _gnutls_heartbeat_recv_params,
.send_func = _gnutls_heartbeat_send_params,
.name = "Key Share",
.id = GNUTLS_EXTENSION_KEY_SHARE,
.parse_type = _GNUTLS_EXT_TLS_POST_CS,
+ .validity = GNUTLS_EXT_FLAG_CLIENT_HELLO|GNUTLS_EXT_FLAG_TLS13_SERVER_HELLO|GNUTLS_EXT_FLAG_HRR,
.recv_func = key_share_recv_params,
.send_func = key_share_send_params,
.name = "Maximum Record Size",
.id = GNUTLS_EXTENSION_MAX_RECORD_SIZE,
.parse_type = GNUTLS_EXT_TLS,
+ .validity = GNUTLS_EXT_FLAG_CLIENT_HELLO|GNUTLS_EXT_FLAG_EE|GNUTLS_EXT_FLAG_TLS12_SERVER_HELLO,
.recv_func = _gnutls_max_record_recv_params,
.send_func = _gnutls_max_record_send_params,
.name = "Post Handshake Auth",
.id = GNUTLS_EXTENSION_POST_HANDSHAKE,
.parse_type = GNUTLS_EXT_TLS,
+ .validity = GNUTLS_EXT_FLAG_CLIENT_HELLO,
.recv_func = _gnutls_post_handshake_recv_params,
.send_func = _gnutls_post_handshake_send_params,
const extension_entry_st ext_mod_sr = {
.name = "Safe Renegotiation",
.id = GNUTLS_EXTENSION_SAFE_RENEGOTIATION,
+ .validity = GNUTLS_EXT_FLAG_CLIENT_HELLO|GNUTLS_EXT_FLAG_TLS12_SERVER_HELLO,
.parse_type = GNUTLS_EXT_MANDATORY,
.recv_func = _gnutls_sr_recv_params,
const extension_entry_st ext_mod_server_name = {
.name = "Server Name Indication",
.id = GNUTLS_EXTENSION_SERVER_NAME,
+
+ .validity = GNUTLS_EXT_FLAG_CLIENT_HELLO|GNUTLS_EXT_FLAG_EE|GNUTLS_EXT_FLAG_TLS12_SERVER_HELLO,
.parse_type = GNUTLS_EXT_MANDATORY,
.recv_func = _gnutls_server_name_recv_params,
const extension_entry_st ext_mod_session_ticket = {
.name = "Session Ticket",
.id = GNUTLS_EXTENSION_SESSION_TICKET,
+ .validity = GNUTLS_EXT_FLAG_CLIENT_HELLO|GNUTLS_EXT_FLAG_TLS12_SERVER_HELLO,
.parse_type = GNUTLS_EXT_TLS,
.recv_func = session_ticket_recv_params,
const extension_entry_st ext_mod_sig = {
.name = "Signature Algorithms",
.id = GNUTLS_EXTENSION_SIGNATURE_ALGORITHMS,
+ .validity = GNUTLS_EXT_FLAG_CLIENT_HELLO|GNUTLS_EXT_FLAG_CR,
.parse_type = GNUTLS_EXT_TLS,
.recv_func = _gnutls_signature_algorithm_recv_params,
.name = "SRP",
.id = GNUTLS_EXTENSION_SRP,
.parse_type = GNUTLS_EXT_TLS,
+ .validity = GNUTLS_EXT_FLAG_CLIENT_HELLO,
.recv_func = _gnutls_srp_recv_params,
.send_func = _gnutls_srp_send_params,
const extension_entry_st ext_mod_srtp = {
.name = "SRTP",
.id = GNUTLS_EXTENSION_SRTP,
+ .validity = GNUTLS_EXT_FLAG_CLIENT_HELLO|GNUTLS_EXT_FLAG_EE|GNUTLS_EXT_FLAG_TLS12_SERVER_HELLO,
.parse_type = GNUTLS_EXT_APPLICATION,
.recv_func = _gnutls_srtp_recv_params,
const extension_entry_st ext_mod_status_request = {
.name = "OCSP Status Request",
.id = GNUTLS_EXTENSION_STATUS_REQUEST,
+ .validity = GNUTLS_EXT_FLAG_CLIENT_HELLO|GNUTLS_EXT_FLAG_CT|GNUTLS_EXT_FLAG_CR|GNUTLS_EXT_FLAG_TLS12_SERVER_HELLO,
.parse_type = _GNUTLS_EXT_TLS_POST_CS,
.recv_func = _gnutls_status_request_recv_params,
.send_func = _gnutls_status_request_send_params,
const extension_entry_st ext_mod_supported_versions = {
.name = "Supported Versions",
.id = GNUTLS_EXTENSION_SUPPORTED_VERSIONS,
+ .validity = GNUTLS_EXT_FLAG_CLIENT_HELLO,
.parse_type = GNUTLS_EXT_MANDATORY, /* force parsing prior to EXT_TLS extensions */
.recv_func = supported_versions_recv_params,
uint16_t id;
gnutls_ext_parse_type_t parse_type;
+ unsigned validity; /* multiple items of gnutls_ext_flags_t */
/* this function must return 0 when Not Applicable
* size of extension data if ok
* @GNUTLS_EXT_TLS: TLS-internal extension.
* @GNUTLS_EXT_MANDATORY: Extension parsed even if resuming (or extensions are disabled).
*
- * Enumeration of different TLS extension types. This type is
+ * Enumeration of different TLS extension parsing types. This type is
* to indicate whether an extension is useful to application
- * level or TLS level only. This is used to parse the
- * application level extensions before the "client_hello" callback
- * is called.
+ * level or TLS level only. This is used to decide the appropriate time
+ * each extension is parsed at during the server or client hello parsing.
+ *
+ * This applies to TLS 1.2 and earlier versions.
*/
typedef enum {
GNUTLS_EXT_ANY = 0,
/**
* gnutls_ext_flags_t:
* @GNUTLS_EXT_FLAG_OVERRIDE_INTERNAL: If specified the extension registered will override the internal; this does not work with extensions existing prior to 3.6.0.
+ * @GNUTLS_EXT_FLAG_CLIENT_HELLO: This extension can be present in a client hello
+ * @GNUTLS_EXT_FLAG_TLS12_SERVER_HELLO: This extension can be present in a TLS1.2 or earlier server hello
+ * @GNUTLS_EXT_FLAG_TLS13_SERVER_HELLO: This extension can be present in a TLS1.3 server hello
+ * @GNUTLS_EXT_FLAG_EE: This extension can be present in encrypted extensions message
+ * @GNUTLS_EXT_FLAG_CT: This extension can be present in certificate message
+ * @GNUTLS_EXT_FLAG_CR: This extension can be present in certificate request message
+ * @GNUTLS_EXT_FLAG_NST: This extension can be present in new session ticket message
+ * @GNUTLS_EXT_FLAG_HRR: This extension can be present in hello retry request message
*
* Enumeration of different TLS extension registration flags.
*/
typedef enum {
- GNUTLS_EXT_FLAG_OVERRIDE_INTERNAL = 1
+ GNUTLS_EXT_FLAG_OVERRIDE_INTERNAL = 1,
+ GNUTLS_EXT_FLAG_CLIENT_HELLO = (1<<1),
+ GNUTLS_EXT_FLAG_TLS12_SERVER_HELLO = (1<<2),
+ GNUTLS_EXT_FLAG_TLS13_SERVER_HELLO = (1<<3),
+ GNUTLS_EXT_FLAG_EE = (1<<4), /* ENCRYPTED */
+ GNUTLS_EXT_FLAG_CT = (1<<5),
+ GNUTLS_EXT_FLAG_CR = (1<<6),
+ GNUTLS_EXT_FLAG_NST = (1<<7),
+ GNUTLS_EXT_FLAG_HRR = (1<<8)
} gnutls_ext_flags_t;
/* Register a custom tls extension