summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDaiki Ueno <ueno@gnu.org>2020-04-24 17:47:06 +0000
committerDaiki Ueno <ueno@gnu.org>2020-04-24 17:47:06 +0000
commit7c0c1e7772a190fd601bdc033952b19864abc242 (patch)
treec2d1dc2fa57bc212775b757f6d3f6b4da1b86c24
parentd8292f24bff863ce3dc60b64e8320c532f46bd02 (diff)
parent5bba569b44b85b5aa126c1c56a549c9575856a9f (diff)
downloadgnutls-7c0c1e7772a190fd601bdc033952b19864abc242.tar.gz
Merge branch 'tmp-ext-name' into 'master'
gnutls_session_ext_register: keep track of extension name See merge request gnutls/gnutls!1224
-rw-r--r--devel/libgnutls-latest-x86_64.abi1
-rw-r--r--devel/symbols.last2
-rw-r--r--doc/Makefile.am2
-rw-r--r--doc/manpages/Makefile.am1
-rw-r--r--lib/hello_ext.c25
-rw-r--r--lib/includes/gnutls/gnutls.h.in2
-rw-r--r--lib/libgnutls.map6
-rw-r--r--lib/state.c2
-rw-r--r--tests/tls-session-ext-register.c9
9 files changed, 50 insertions, 0 deletions
diff --git a/devel/libgnutls-latest-x86_64.abi b/devel/libgnutls-latest-x86_64.abi
index 12d5f5b7af..8aa81a55dd 100644
--- a/devel/libgnutls-latest-x86_64.abi
+++ b/devel/libgnutls-latest-x86_64.abi
@@ -271,6 +271,7 @@
<elf-symbol name='gnutls_ext_get_current_msg' version='GNUTLS_3_6_3' is-default-version='yes' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
<elf-symbol name='gnutls_ext_get_data' version='GNUTLS_3_4' is-default-version='yes' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
<elf-symbol name='gnutls_ext_get_name' version='GNUTLS_3_4' is-default-version='yes' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+ <elf-symbol name='gnutls_ext_get_name2' version='GNUTLS_3_6_14' is-default-version='yes' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
<elf-symbol name='gnutls_ext_raw_parse' version='GNUTLS_3_6_3' is-default-version='yes' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
<elf-symbol name='gnutls_ext_register' version='GNUTLS_3_4' is-default-version='yes' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
<elf-symbol name='gnutls_ext_set_data' version='GNUTLS_3_4' is-default-version='yes' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
diff --git a/devel/symbols.last b/devel/symbols.last
index 5a8343a0f0..080f7f2954 100644
--- a/devel/symbols.last
+++ b/devel/symbols.last
@@ -3,6 +3,7 @@ GNUTLS_3_6_0@GNUTLS_3_6_0
GNUTLS_3_6_10@GNUTLS_3_6_10
GNUTLS_3_6_12@GNUTLS_3_6_12
GNUTLS_3_6_13@GNUTLS_3_6_13
+GNUTLS_3_6_14@GNUTLS_3_6_14
GNUTLS_3_6_2@GNUTLS_3_6_2
GNUTLS_3_6_3@GNUTLS_3_6_3
GNUTLS_3_6_4@GNUTLS_3_6_4
@@ -215,6 +216,7 @@ gnutls_error_to_alert@GNUTLS_3_4
gnutls_est_record_overhead_size@GNUTLS_3_4
gnutls_ext_get_current_msg@GNUTLS_3_6_3
gnutls_ext_get_data@GNUTLS_3_4
+gnutls_ext_get_name2@GNUTLS_3_6_14
gnutls_ext_get_name@GNUTLS_3_4
gnutls_ext_raw_parse@GNUTLS_3_6_3
gnutls_ext_register@GNUTLS_3_4
diff --git a/doc/Makefile.am b/doc/Makefile.am
index 0f16eeccc8..83d851220c 100644
--- a/doc/Makefile.am
+++ b/doc/Makefile.am
@@ -1023,6 +1023,8 @@ FUNCS += functions/gnutls_ext_get_data
FUNCS += functions/gnutls_ext_get_data.short
FUNCS += functions/gnutls_ext_get_name
FUNCS += functions/gnutls_ext_get_name.short
+FUNCS += functions/gnutls_ext_get_name2
+FUNCS += functions/gnutls_ext_get_name2.short
FUNCS += functions/gnutls_ext_raw_parse
FUNCS += functions/gnutls_ext_raw_parse.short
FUNCS += functions/gnutls_ext_register
diff --git a/doc/manpages/Makefile.am b/doc/manpages/Makefile.am
index 97cc80ed6e..18f382ee45 100644
--- a/doc/manpages/Makefile.am
+++ b/doc/manpages/Makefile.am
@@ -313,6 +313,7 @@ APIMANS += gnutls_est_record_overhead_size.3
APIMANS += gnutls_ext_get_current_msg.3
APIMANS += gnutls_ext_get_data.3
APIMANS += gnutls_ext_get_name.3
+APIMANS += gnutls_ext_get_name2.3
APIMANS += gnutls_ext_raw_parse.3
APIMANS += gnutls_ext_register.3
APIMANS += gnutls_ext_set_data.3
diff --git a/lib/hello_ext.c b/lib/hello_ext.c
index 1df1506e0b..dbe73fdeb3 100644
--- a/lib/hello_ext.c
+++ b/lib/hello_ext.c
@@ -898,6 +898,7 @@ gnutls_session_ext_register(gnutls_session_t session,
return gnutls_assert_val(GNUTLS_E_MEMORY_ERROR);
memset(&tmp_mod, 0, sizeof(hello_ext_entry_st));
+ tmp_mod.name = gnutls_strdup(name);
tmp_mod.free_struct = 1;
tmp_mod.tls_id = id;
tmp_mod.gid = gid;
@@ -1000,3 +1001,27 @@ unsigned gnutls_ext_get_current_msg(gnutls_session_t session)
{
return _gnutls_ext_get_msg(session);
}
+
+/**
+ * gnutls_ext_get_name2:
+ * @session: a #gnutls_session_t opaque pointer
+ * @tls_id: is a TLS extension numeric ID
+ * @parse_point: the parse type of the extension
+ *
+ * Convert a TLS extension numeric ID to a printable string.
+ *
+ * Returns: a pointer to a string that contains the name of the
+ * specified cipher, or %NULL.
+ **/
+const char *gnutls_ext_get_name2(gnutls_session_t session, unsigned int tls_id,
+ gnutls_ext_parse_type_t parse_point)
+{
+ const struct hello_ext_entry_st *ext;
+
+ ext = tls_id_to_ext_entry(session, tls_id, parse_point);
+ if (ext)
+ return ext->name;
+
+ return NULL;
+}
+
diff --git a/lib/includes/gnutls/gnutls.h.in b/lib/includes/gnutls/gnutls.h.in
index 517153634a..fdcf914f42 100644
--- a/lib/includes/gnutls/gnutls.h.in
+++ b/lib/includes/gnutls/gnutls.h.in
@@ -3130,6 +3130,8 @@ int gnutls_session_ext_register(gnutls_session_t, const char *name, int type, gn
gnutls_ext_unpack_func unpack_func, unsigned flags);
const char *gnutls_ext_get_name(unsigned int ext);
+const char *gnutls_ext_get_name2(gnutls_session_t session, unsigned int tls_id,
+ gnutls_ext_parse_type_t parse_point);
/* Public supplemental data related functions */
diff --git a/lib/libgnutls.map b/lib/libgnutls.map
index 5541e9caba..512e403bb6 100644
--- a/lib/libgnutls.map
+++ b/lib/libgnutls.map
@@ -1324,6 +1324,12 @@ GNUTLS_3_6_13
gnutls_psk_set_client_credentials_function2;
} GNUTLS_3_6_12;
+GNUTLS_3_6_14
+{
+ global:
+ gnutls_ext_get_name2;
+} GNUTLS_3_6_13;
+
GNUTLS_FIPS140_3_4 {
global:
gnutls_cipher_self_test;
diff --git a/lib/state.c b/lib/state.c
index 98900c171f..8ba2cc4a32 100644
--- a/lib/state.c
+++ b/lib/state.c
@@ -692,6 +692,8 @@ void gnutls_deinit(gnutls_session_t session)
_gnutls_free_datum(&session->internals.resumption_data);
_gnutls_free_datum(&session->internals.dtls.dcookie);
+ for (i = 0; i < session->internals.rexts_size; i++)
+ gnutls_free(session->internals.rexts[i].name);
gnutls_free(session->internals.rexts);
gnutls_free(session->internals.post_handshake_cr_context.data);
diff --git a/tests/tls-session-ext-register.c b/tests/tls-session-ext-register.c
index 7e907f5e96..6e44b9e60e 100644
--- a/tests/tls-session-ext-register.c
+++ b/tests/tls-session-ext-register.c
@@ -152,6 +152,7 @@ static void client(int sd, const char *name, const char *prio, unsigned flags, u
int ret;
gnutls_session_t session;
gnutls_certificate_credentials_t clientx509cred;
+ const char *ext_name;
void *p;
side = "client";
@@ -179,6 +180,14 @@ static void client(int sd, const char *name, const char *prio, unsigned flags, u
if (ret < 0)
myfail("client: register extension\n");
+ ext_name = gnutls_ext_get_name2(session, TLSEXT_TYPE_IGN, GNUTLS_EXT_ANY);
+ if (ext_name == NULL || strcmp(ext_name, "ext_ign"))
+ myfail("client: retrieve name of extension %u\n", TLSEXT_TYPE_IGN);
+
+ ext_name = gnutls_ext_get_name2(session, TLSEXT_TYPE_IGN, GNUTLS_EXT_APPLICATION);
+ if (ext_name)
+ myfail("client: retrieve name of extension %u (expected none)\n", TLSEXT_TYPE_IGN);
+
ret = gnutls_session_ext_register(session, "ext_client", TLSEXT_TYPE_SAMPLE, GNUTLS_EXT_TLS, ext_recv_client_params, ext_send_client_params, NULL, NULL, NULL, flags);
if (ret < 0)
myfail("client: register extension\n");