const extension_entry_st ext_mod_alpn = {
.name = "ALPN",
- .id = GNUTLS_EXTENSION_ALPN,
+ .tls_id = 16,
+ .gid = 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,
const extension_entry_st ext_mod_dumbfw = {
.name = "ClientHello Padding",
- .id = GNUTLS_EXTENSION_DUMBFW,
+ .tls_id = 21,
+ .gid = GNUTLS_EXTENSION_DUMBFW,
.parse_type = GNUTLS_EXT_APPLICATION,
.validity = GNUTLS_EXT_FLAG_CLIENT_HELLO|GNUTLS_EXT_FLAG_HRR,
const extension_entry_st ext_mod_supported_ecc = {
.name = "Negotiated Groups",
- .id = GNUTLS_EXTENSION_SUPPORTED_ECC,
+ .tls_id = 10,
+ .gid = 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,
const extension_entry_st ext_mod_supported_ecc_pf = {
.name = "Supported ECC Point Formats",
- .id = GNUTLS_EXTENSION_SUPPORTED_ECC_PF,
+ .tls_id = 11,
+ .gid = GNUTLS_EXTENSION_SUPPORTED_ECC_PF,
.parse_type = GNUTLS_EXT_TLS,
.validity = GNUTLS_EXT_FLAG_CLIENT_HELLO|GNUTLS_EXT_FLAG_TLS12_SERVER_HELLO,
const extension_entry_st ext_mod_etm = {
.name = "Encrypt-then-MAC",
- .id = GNUTLS_EXTENSION_ETM,
+ .tls_id = 22,
+ .gid = GNUTLS_EXTENSION_ETM,
.parse_type = GNUTLS_EXT_MANDATORY,
.validity = GNUTLS_EXT_FLAG_CLIENT_HELLO|GNUTLS_EXT_FLAG_TLS12_SERVER_HELLO,
const extension_entry_st ext_mod_ext_master_secret = {
.name = "Extended Master Secret",
- .id = GNUTLS_EXTENSION_EXT_MASTER_SECRET,
+ .tls_id = 23,
+ .gid = GNUTLS_EXTENSION_EXT_MASTER_SECRET,
.parse_type = GNUTLS_EXT_MANDATORY,
.validity = GNUTLS_EXT_FLAG_CLIENT_HELLO|GNUTLS_EXT_FLAG_TLS12_SERVER_HELLO,
const extension_entry_st ext_mod_heartbeat = {
.name = "Heartbeat",
- .id = GNUTLS_EXTENSION_HEARTBEAT,
+ .tls_id = 15,
+ .gid = GNUTLS_EXTENSION_HEARTBEAT,
.parse_type = GNUTLS_EXT_TLS,
.validity = GNUTLS_EXT_FLAG_CLIENT_HELLO|GNUTLS_EXT_FLAG_EE|GNUTLS_EXT_FLAG_TLS12_SERVER_HELLO,
const extension_entry_st ext_mod_key_share = {
.name = "Key Share",
- .id = GNUTLS_EXTENSION_KEY_SHARE,
+ .tls_id = 40,
+ .gid = 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,
const extension_entry_st ext_mod_max_record_size = {
.name = "Maximum Record Size",
- .id = GNUTLS_EXTENSION_MAX_RECORD_SIZE,
+ .tls_id = 1,
+ .gid = 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,
const extension_entry_st ext_mod_post_handshake = {
.name = "Post Handshake Auth",
- .id = GNUTLS_EXTENSION_POST_HANDSHAKE,
+ .tls_id = 49,
+ .gid = GNUTLS_EXTENSION_POST_HANDSHAKE,
.parse_type = GNUTLS_EXT_TLS,
.validity = GNUTLS_EXT_FLAG_CLIENT_HELLO,
const extension_entry_st ext_mod_sr = {
.name = "Safe Renegotiation",
- .id = GNUTLS_EXTENSION_SAFE_RENEGOTIATION,
+ .tls_id = 65281,
+ .gid = GNUTLS_EXTENSION_SAFE_RENEGOTIATION,
.validity = GNUTLS_EXT_FLAG_CLIENT_HELLO|GNUTLS_EXT_FLAG_TLS12_SERVER_HELLO,
.parse_type = GNUTLS_EXT_MANDATORY,
const extension_entry_st ext_mod_server_name = {
.name = "Server Name Indication",
- .id = GNUTLS_EXTENSION_SERVER_NAME,
-
+ .tls_id = 0,
+ .gid = 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,
const extension_entry_st ext_mod_session_ticket = {
.name = "Session Ticket",
- .id = GNUTLS_EXTENSION_SESSION_TICKET,
+ .tls_id = 35,
+ .gid = GNUTLS_EXTENSION_SESSION_TICKET,
.validity = GNUTLS_EXT_FLAG_CLIENT_HELLO|GNUTLS_EXT_FLAG_TLS12_SERVER_HELLO,
.parse_type = GNUTLS_EXT_TLS,
const extension_entry_st ext_mod_sig = {
.name = "Signature Algorithms",
- .id = GNUTLS_EXTENSION_SIGNATURE_ALGORITHMS,
+ .tls_id = 13,
+ .gid = GNUTLS_EXTENSION_SIGNATURE_ALGORITHMS,
.validity = GNUTLS_EXT_FLAG_CLIENT_HELLO|GNUTLS_EXT_FLAG_CR,
.parse_type = GNUTLS_EXT_TLS,
const extension_entry_st ext_mod_srp = {
.name = "SRP",
- .id = GNUTLS_EXTENSION_SRP,
+ .tls_id = 12,
+ .gid = GNUTLS_EXTENSION_SRP,
.parse_type = GNUTLS_EXT_TLS,
.validity = GNUTLS_EXT_FLAG_CLIENT_HELLO,
const extension_entry_st ext_mod_srtp = {
.name = "SRTP",
- .id = GNUTLS_EXTENSION_SRTP,
+ .tls_id = 14,
+ .gid = GNUTLS_EXTENSION_SRTP,
.validity = GNUTLS_EXT_FLAG_CLIENT_HELLO|GNUTLS_EXT_FLAG_EE|GNUTLS_EXT_FLAG_TLS12_SERVER_HELLO,
.parse_type = GNUTLS_EXT_APPLICATION,
const extension_entry_st ext_mod_status_request = {
.name = "OCSP Status Request",
- .id = GNUTLS_EXTENSION_STATUS_REQUEST,
+ .tls_id = 5,
+ .gid = 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,
const extension_entry_st ext_mod_supported_versions = {
.name = "Supported Versions",
- .id = GNUTLS_EXTENSION_SUPPORTED_VERSIONS,
+ .tls_id = 43,
+ .gid = GNUTLS_EXTENSION_SUPPORTED_VERSIONS,
.validity = GNUTLS_EXT_FLAG_CLIENT_HELLO,
.parse_type = GNUTLS_EXT_MANDATORY, /* force parsing prior to EXT_TLS extensions */
};
static const extension_entry_st *
-_gnutls_ext_ptr(gnutls_session_t session, uint16_t id, gnutls_ext_parse_type_t parse_type)
+_gnutls_ext_ptr(gnutls_session_t session, extensions_t id, gnutls_ext_parse_type_t parse_type)
{
unsigned i;
const extension_entry_st *e;
for (i=0;i<session->internals.rexts_size;i++) {
- if (session->internals.rexts[i].id == id) {
+ if (session->internals.rexts[i].gid == id) {
e = &session->internals.rexts[i];
goto done;
}
}
for (i = 0; extfunc[i] != NULL; i++) {
- if (extfunc[i]->id == id) {
+ if (extfunc[i]->gid == id) {
e = extfunc[i];
goto done;
}
size_t i;
for (i = 0; extfunc[i] != NULL; i++)
- if (extfunc[i]->id == ext)
+ if (extfunc[i]->tls_id == ext)
return extfunc[i]->name;
return NULL;
* otherwise a negative error value.
*/
int
-_gnutls_extension_list_check(gnutls_session_t session, uint16_t id)
+_gnutls_extension_list_check(gnutls_session_t session, extensions_t id)
{
unsigned i;
for (i = 0; i < session->internals.used_exts_size; i++) {
- if (id == session->internals.used_exts[i]->id)
+ if (id == session->internals.used_exts[i]->gid)
return 0;
}
if (check_dup) {
for (i=0;i<session->internals.used_exts_size;i++) {
- if (session->internals.used_exts[i]->id == e->id)
+ if (session->internals.used_exts[i]->gid == e->gid)
return 0;
}
}
}
}
+static unsigned tls_id_to_gid(gnutls_session_t session, unsigned tls_id)
+{
+ unsigned i;
+
+ for (i=0; i < session->internals.rexts_size; i++) {
+ if (session->internals.rexts[i].tls_id == tls_id)
+ return session->internals.rexts[i].gid;
+ }
+
+ for (i = 0; extfunc[i] != NULL; i++) {
+ if (extfunc[i]->tls_id == tls_id)
+ return extfunc[i]->gid;
+ }
+
+ return 0;
+}
+
+
void _gnutls_extension_list_add_sr(gnutls_session_t session)
{
_gnutls_extension_list_add(session, &ext_mod_sr, 1);
{
int next, ret;
int pos = 0;
- uint16_t id;
+ uint16_t tls_id;
+ extensions_t id;
const uint8_t *sdata;
const extension_entry_st *ext;
uint16_t size;
do {
DECR_LENGTH_RET(next, 2, GNUTLS_E_UNEXPECTED_EXTENSIONS_LENGTH);
- id = _gnutls_read_uint16(&data[pos]);
+ tls_id = _gnutls_read_uint16(&data[pos]);
pos += 2;
+ id = tls_id_to_gid(session, tls_id);
+ if (id == 0) {
+ goto skip;
+ }
+
if (session->security_parameters.entity == GNUTLS_CLIENT) {
if ((ret =
_gnutls_extension_list_check(session, id)) < 0) {
_gnutls_debug_log("EXT[%p]: Received unexpected extension '%s/%d'\n", session,
- gnutls_ext_get_name(id), (int)id);
+ gnutls_ext_get_name(tls_id), (int)tls_id);
gnutls_assert();
return ret;
}
}
+ skip:
DECR_LENGTH_RET(next, 2, GNUTLS_E_UNEXPECTED_EXTENSIONS_LENGTH);
size = _gnutls_read_uint16(&data[pos]);
pos += 2;
if (ext == NULL || ext->recv_func == NULL) {
_gnutls_handshake_log
("EXT[%p]: Ignoring extension '%s/%d'\n", session,
- gnutls_ext_get_name(id), id);
+ gnutls_ext_get_name(tls_id), tls_id);
continue;
}
if ((ext->validity & msg) == 0) {
_gnutls_debug_log("EXT[%p]: Received unexpected extension (%s/%d) for '%s'\n", session,
- gnutls_ext_get_name(id), (int)id,
+ gnutls_ext_get_name(tls_id), (int)tls_id,
ext_msg_validity_to_str(msg));
return gnutls_assert_val(GNUTLS_E_RECEIVED_ILLEGAL_EXTENSION);
}
_gnutls_handshake_log
("EXT[%p]: Parsing extension '%s/%d' (%d bytes)\n",
- session, gnutls_ext_get_name(id), id,
+ session, gnutls_ext_get_name(tls_id), tls_id,
size);
if ((ret = ext->recv_func(session, sdata, size)) < 0) {
if ((msg & p->validity) == 0) {
_gnutls_handshake_log("EXT[%p]: Not sending extension (%s/%d) for '%s'\n", session,
- gnutls_ext_get_name(p->id), (int)p->id,
+ gnutls_ext_get_name(p->tls_id), (int)p->tls_id,
ext_msg_validity_to_str(msg));
return 0;
}
/* ensure we don't send something twice (i.e, overriden extensions in
* client), and ensure we are sending only what we received in server. */
- ret = _gnutls_extension_list_check(session, p->id);
+ ret = _gnutls_extension_list_check(session, p->gid);
if (session->security_parameters.entity == GNUTLS_SERVER) {
if (ret < 0) /* not advertized */
return 0;
}
- ret = _gnutls_buffer_append_prefix(extdata, 16, p->id);
+ ret = _gnutls_buffer_append_prefix(extdata, 16, p->tls_id);
if (ret < 0)
return gnutls_assert_val(ret);
_gnutls_handshake_log
("EXT[%p]: Sending extension %s/%d (%d bytes)\n",
- session, p->name, p->id, appended);
+ session, p->name, (int)p->tls_id, appended);
} else if (appended == 0)
extdata->length -= 4; /* reset type and size */
int rval = 0;
ret =
- _gnutls_ext_get_session_data(session, extp->id,
+ _gnutls_ext_get_session_data(session, extp->gid,
&data);
if (ret >= 0 && extp->pack_func != NULL) {
- BUFFER_APPEND_NUM(packed, extp->id);
+ BUFFER_APPEND_NUM(packed, extp->gid);
size_offset = packed->length;
BUFFER_APPEND_NUM(packed, 0);
static void
_gnutls_ext_set_resumed_session_data(gnutls_session_t session,
- uint16_t id,
+ extensions_t id,
gnutls_ext_priv_data_t data)
{
int i;
int i, ret;
gnutls_ext_priv_data_t data;
int max_exts = 0;
- uint16_t id;
+ extensions_t id;
int size_for_id, cur_pos;
const struct extension_entry_st *ext;
void
_gnutls_ext_unset_session_data(gnutls_session_t session,
- uint16_t id)
+ extensions_t id)
{
int i;
const struct extension_entry_st *ext;
* private pointer, to allow API additions by individual extensions.
*/
void
-_gnutls_ext_set_session_data(gnutls_session_t session, uint16_t id,
+_gnutls_ext_set_session_data(gnutls_session_t session, extensions_t id,
gnutls_ext_priv_data_t data)
{
unsigned int i;
int
_gnutls_ext_get_session_data(gnutls_session_t session,
- uint16_t id, gnutls_ext_priv_data_t * data)
+ extensions_t id, gnutls_ext_priv_data_t * data)
{
int i;
int
_gnutls_ext_get_resumed_session_data(gnutls_session_t session,
- uint16_t id,
+ extensions_t id,
gnutls_ext_priv_data_t * data)
{
int i;
/**
* gnutls_ext_register:
* @name: the name of the extension to register
- * @id: the numeric id of the extension
+ * @id: the numeric TLS id of the extension
* @parse_type: the parse type of the extension (see gnutls_ext_parse_type_t)
* @recv_func: a function to receive the data
* @send_func: a function to send the data
extension_entry_st *tmp_mod;
int ret;
unsigned i;
+ unsigned gid = GNUTLS_EXTENSION_MAX+1;
for (i = 0; extfunc[i] != NULL; i++) {
- if (extfunc[i]->id == id)
+ if (extfunc[i]->tls_id == id)
return gnutls_assert_val(GNUTLS_E_ALREADY_REGISTERED);
+
+ if (extfunc[i]->gid >= gid)
+ gid = extfunc[i]->gid + 1;
}
+ if (gid > GNUTLS_EXTENSION_MAX_VALUE)
+ return gnutls_assert_val(GNUTLS_E_MEMORY_ERROR);
+
tmp_mod = gnutls_calloc(1, sizeof(*tmp_mod));
if (tmp_mod == NULL)
return gnutls_assert_val(GNUTLS_E_MEMORY_ERROR);
tmp_mod->name = gnutls_strdup(name);
tmp_mod->free_struct = 1;
- tmp_mod->id = id;
+ tmp_mod->tls_id = id;
+ tmp_mod->gid = gid;
tmp_mod->parse_type = parse_type;
tmp_mod->recv_func = recv_func;
tmp_mod->send_func = send_func;
extension_entry_st tmp_mod;
extension_entry_st *exts;
unsigned i;
+ unsigned gid = GNUTLS_EXTENSION_MAX+1;
/* reject handling any extensions which modify the TLS handshake
* in any way, or are mapped to an exported API. */
for (i = 0; extfunc[i] != NULL; i++) {
- if (extfunc[i]->id == id) {
+ if (extfunc[i]->tls_id == id) {
if (!(flags & GNUTLS_EXT_FLAG_OVERRIDE_INTERNAL)) {
return gnutls_assert_val(GNUTLS_E_ALREADY_REGISTERED);
} else if (extfunc[i]->cannot_be_overriden) {
}
break;
}
+
+ if (extfunc[i]->gid >= gid)
+ gid = extfunc[i]->gid + 1;
+ }
+
+ for (i=0;i<session->internals.rexts_size;i++) {
+ if (session->internals.rexts[i].tls_id == id) {
+ return gnutls_assert_val(GNUTLS_E_ALREADY_REGISTERED);
+ }
+
+ if (session->internals.rexts[i].gid >= gid)
+ gid = session->internals.rexts[i].gid + 1;
}
+ if (gid > GNUTLS_EXTENSION_MAX_VALUE)
+ return gnutls_assert_val(GNUTLS_E_MEMORY_ERROR);
+
memset(&tmp_mod, 0, sizeof(extension_entry_st));
tmp_mod.free_struct = 1;
- tmp_mod.id = id;
+ tmp_mod.tls_id = id;
+ tmp_mod.gid = gid;
tmp_mod.parse_type = parse_type;
tmp_mod.recv_func = recv_func;
tmp_mod.send_func = send_func;
/**
* gnutls_ext_set_data:
* @session: a #gnutls_session_t opaque pointer
- * @id: the numeric id of the extension
+ * @tls_id: the numeric id of the extension
* @data: the private data to set
*
* This function allows an extension handler to store data in the current session
* Since: 3.4.0
**/
void
-gnutls_ext_set_data(gnutls_session_t session, unsigned id,
+gnutls_ext_set_data(gnutls_session_t session, unsigned tls_id,
gnutls_ext_priv_data_t data)
{
+ unsigned id = tls_id_to_gid(session, tls_id);
+ if (id == 0)
+ return;
+
_gnutls_ext_set_session_data(session, id, data);
}
/**
* gnutls_ext_get_data:
* @session: a #gnutls_session_t opaque pointer
- * @id: the numeric id of the extension
+ * @tls_id: the numeric id of the extension
* @data: a pointer to the private data to retrieve
*
* This function retrieves any data previously stored with gnutls_ext_set_data().
**/
int
gnutls_ext_get_data(gnutls_session_t session,
- unsigned id, gnutls_ext_priv_data_t *data)
+ unsigned tls_id, gnutls_ext_priv_data_t *data)
{
+ unsigned id = tls_id_to_gid(session, tls_id);
+ if (id == 0)
+ return gnutls_assert_val(GNUTLS_E_REQUESTED_DATA_NOT_AVAILABLE);
+
return _gnutls_ext_get_session_data(session, id, data);
}
void _gnutls_ext_deinit(void);
void _gnutls_extension_list_add_sr(gnutls_session_t session);
-int _gnutls_extension_list_check(gnutls_session_t session, uint16_t type);
+int _gnutls_extension_list_check(gnutls_session_t session, extensions_t type);
void _gnutls_ext_free_session_data(gnutls_session_t session);
/* functions to be used by extensions internally
*/
void _gnutls_ext_unset_session_data(gnutls_session_t session,
- uint16_t type);
-void _gnutls_ext_set_session_data(gnutls_session_t session, uint16_t type,
+ extensions_t ext);
+void _gnutls_ext_set_session_data(gnutls_session_t session, extensions_t ext,
gnutls_ext_priv_data_t);
-int _gnutls_ext_get_session_data(gnutls_session_t session, uint16_t type,
+int _gnutls_ext_get_session_data(gnutls_session_t session, extensions_t ext,
gnutls_ext_priv_data_t *);
int _gnutls_ext_get_resumed_session_data(gnutls_session_t session,
- uint16_t type,
+ extensions_t ext,
gnutls_ext_priv_data_t * data);
/* for session packing */
const char *name; /* const overriden when free_struct is set */
unsigned free_struct;
- uint16_t id;
+ uint16_t tls_id;
+ unsigned gid; /* gnutls internal ID */
+
gnutls_ext_parse_type_t parse_type;
unsigned validity; /* multiple items of gnutls_ext_flags_t */
*/
#define MAX_ALGOS GNUTLS_MAX_ALGORITHM_NUM
-/* http://www.iana.org/assignments/tls-extensiontype-values/tls-extensiontype-values.xhtml
- */
+/* IDs are non-zero and allocated in a way that all values fit in 64-bit integer as (1<<val) */
typedef enum extensions_t {
- GNUTLS_EXTENSION_SERVER_NAME = 0,
GNUTLS_EXTENSION_MAX_RECORD_SIZE = 1,
- GNUTLS_EXTENSION_STATUS_REQUEST = 5,
- GNUTLS_EXTENSION_CERT_TYPE = 9,
- GNUTLS_EXTENSION_SUPPORTED_ECC = 10,
- GNUTLS_EXTENSION_SUPPORTED_ECC_PF = 11,
- GNUTLS_EXTENSION_SRP = 12,
- GNUTLS_EXTENSION_SIGNATURE_ALGORITHMS = 13,
- GNUTLS_EXTENSION_SRTP = 14,
- GNUTLS_EXTENSION_HEARTBEAT = 15,
- GNUTLS_EXTENSION_ALPN = 16,
- GNUTLS_EXTENSION_DUMBFW = 21,
- GNUTLS_EXTENSION_ETM = 22,
- GNUTLS_EXTENSION_EXT_MASTER_SECRET = 23,
- GNUTLS_EXTENSION_SESSION_TICKET = 35,
- GNUTLS_EXTENSION_KEY_SHARE = 40,
- GNUTLS_EXTENSION_SUPPORTED_VERSIONS = 43,
- GNUTLS_EXTENSION_POST_HANDSHAKE = 49,
- GNUTLS_EXTENSION_SAFE_RENEGOTIATION = 65281 /* aka: 0xff01 */
+ GNUTLS_EXTENSION_STATUS_REQUEST,
+ GNUTLS_EXTENSION_CERT_TYPE,
+ GNUTLS_EXTENSION_SUPPORTED_ECC,
+ GNUTLS_EXTENSION_SUPPORTED_ECC_PF,
+ GNUTLS_EXTENSION_SRP,
+ GNUTLS_EXTENSION_SIGNATURE_ALGORITHMS,
+ GNUTLS_EXTENSION_SRTP,
+ GNUTLS_EXTENSION_HEARTBEAT,
+ GNUTLS_EXTENSION_ALPN,
+ GNUTLS_EXTENSION_DUMBFW,
+ GNUTLS_EXTENSION_ETM,
+ GNUTLS_EXTENSION_EXT_MASTER_SECRET,
+ GNUTLS_EXTENSION_SESSION_TICKET,
+ GNUTLS_EXTENSION_KEY_SHARE,
+ GNUTLS_EXTENSION_SUPPORTED_VERSIONS,
+ GNUTLS_EXTENSION_POST_HANDSHAKE,
+ GNUTLS_EXTENSION_SAFE_RENEGOTIATION,
+ GNUTLS_EXTENSION_SERVER_NAME,
+ GNUTLS_EXTENSION_MAX = GNUTLS_EXTENSION_SERVER_NAME
} extensions_t;
+#define GNUTLS_EXTENSION_MAX_VALUE 63
+#if GNUTLS_EXTENSION_MAX >= GNUTLS_EXTENSION_MAX_VALUE
+# error over limit
+#endif
+
typedef enum { CIPHER_STREAM, CIPHER_BLOCK, CIPHER_AEAD } cipher_type_t;
#define RESUME_TRUE 1
unsigned rexts_size;
struct {
- uint16_t id;
+ extensions_t id;
gnutls_ext_priv_data_t priv;
gnutls_ext_priv_data_t resumed_priv;
uint8_t set;
gnutls_assert();
goto cleanup;
}
- if (feature == GNUTLS_EXTENSION_STATUS_REQUEST) {
+
+ if (feature == 5 /* TLS ID for status request */) {
/* We sent a status request, the certificate mandates a reply, but we did not get any. */
*ocsp_status |= GNUTLS_CERT_MISSING_OCSP_STATUS;
break;