summaryrefslogtreecommitdiff
path: root/lib/hello_ext_lib.c
diff options
context:
space:
mode:
authorNikos Mavrogiannopoulos <nmav@redhat.com>2017-10-03 08:58:59 +0200
committerNikos Mavrogiannopoulos <nmav@redhat.com>2018-02-19 15:29:35 +0100
commitcf21486df489f2c3e1e68037a93274a8603081f8 (patch)
treeca9ef13e47045b88005b58be3e73e4fb9ff64974 /lib/hello_ext_lib.c
parenta3b27e5b78d37d0e8b10ce1e3be41bd8d7631a08 (diff)
downloadgnutls-cf21486df489f2c3e1e68037a93274a8603081f8.tar.gz
extensions: enhanced extension lib with pack and unpack functions
That allows the functionality to be used for the majority of extensions. Signed-off-by: Nikos Mavrogiannopoulos <nmav@redhat.com>
Diffstat (limited to 'lib/hello_ext_lib.c')
-rw-r--r--lib/hello_ext_lib.c48
1 files changed, 48 insertions, 0 deletions
diff --git a/lib/hello_ext_lib.c b/lib/hello_ext_lib.c
index a9ae28caed..547f63a391 100644
--- a/lib/hello_ext_lib.c
+++ b/lib/hello_ext_lib.c
@@ -78,3 +78,51 @@ _gnutls_hello_ext_get_datum(gnutls_session_t session,
return 0;
}
+int
+_gnutls_hello_ext_get_resumed_datum(gnutls_session_t session,
+ extensions_t id, gnutls_datum_t *data /* constant contents */)
+{
+ gnutls_ext_priv_data_t epriv;
+ int ret;
+
+ ret = _gnutls_hello_ext_get_resumed_sdata(session, id, &epriv);
+ if (ret < 0 || epriv == NULL)
+ return GNUTLS_E_REQUESTED_DATA_NOT_AVAILABLE;
+
+ data->size = _gnutls_read_uint16(epriv);
+ data->data = ((uint8_t*)epriv)+2;
+
+ return 0;
+}
+
+int
+_gnutls_hello_ext_default_pack(gnutls_ext_priv_data_t epriv, gnutls_buffer_st *ps)
+{
+ size_t size;
+
+ size = _gnutls_read_uint16(epriv);
+
+ return _gnutls_buffer_append_data(ps, epriv, size+2);
+}
+
+int
+_gnutls_hello_ext_default_unpack(gnutls_buffer_st *ps, gnutls_ext_priv_data_t *epriv)
+{
+ gnutls_datum_t data;
+ uint8_t *store;
+ int ret;
+
+ ret = _gnutls_buffer_pop_datum_prefix16(ps, &data);
+ if (ret < 0)
+ return gnutls_assert_val(ret);
+
+ store = gnutls_calloc(1, data.size+2);
+ if (store == NULL)
+ return gnutls_assert_val(GNUTLS_E_MEMORY_ERROR);
+
+ _gnutls_write_uint16(data.size, store);
+ memcpy(store+2, data.data, data.size);
+
+ *epriv = store;
+ return 0;
+}