diff options
author | Nikos Mavrogiannopoulos <nmav@redhat.com> | 2017-10-03 08:58:59 +0200 |
---|---|---|
committer | Nikos Mavrogiannopoulos <nmav@redhat.com> | 2018-02-19 15:29:35 +0100 |
commit | cf21486df489f2c3e1e68037a93274a8603081f8 (patch) | |
tree | ca9ef13e47045b88005b58be3e73e4fb9ff64974 /lib/hello_ext_lib.c | |
parent | a3b27e5b78d37d0e8b10ce1e3be41bd8d7631a08 (diff) | |
download | gnutls-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.c | 48 |
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; +} |