|
Packit |
aea12f |
/*
|
|
Packit |
aea12f |
* Copyright (C) 2007-2012 Free Software Foundation, Inc.
|
|
Packit |
aea12f |
*
|
|
Packit |
aea12f |
* Author: Simon Josefsson
|
|
Packit |
aea12f |
*
|
|
Packit |
aea12f |
* This file is part of GnuTLS.
|
|
Packit |
aea12f |
*
|
|
Packit |
aea12f |
* The GnuTLS is free software; you can redistribute it and/or
|
|
Packit |
aea12f |
* modify it under the terms of the GNU Lesser General Public License
|
|
Packit |
aea12f |
* as published by the Free Software Foundation; either version 2.1 of
|
|
Packit |
aea12f |
* the License, or (at your option) any later version.
|
|
Packit |
aea12f |
*
|
|
Packit |
aea12f |
* This library is distributed in the hope that it will be useful, but
|
|
Packit |
aea12f |
* WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
Packit |
aea12f |
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
|
Packit |
aea12f |
* Lesser General Public License for more details.
|
|
Packit |
aea12f |
*
|
|
Packit |
aea12f |
* You should have received a copy of the GNU Lesser General Public License
|
|
Packit |
aea12f |
* along with this program. If not, see <https://www.gnu.org/licenses/>
|
|
Packit |
aea12f |
*
|
|
Packit |
aea12f |
*/
|
|
Packit |
aea12f |
|
|
Packit |
aea12f |
/* This file contains support functions for 'TLS Handshake Message for
|
|
Packit |
aea12f |
* Supplemental Data' (RFC 4680).
|
|
Packit |
aea12f |
*
|
|
Packit |
aea12f |
* The idea here is simple. gnutls_handshake() in gnuts_handshake.c
|
|
Packit |
aea12f |
* will call _gnutls_gen_supplemental and _gnutls_parse_supplemental
|
|
Packit |
aea12f |
* when some extension requested that supplemental data be sent or
|
|
Packit |
aea12f |
* received. Extension request this by setting the flags
|
|
Packit |
aea12f |
* do_recv_supplemental or do_send_supplemental in the session.
|
|
Packit |
aea12f |
*
|
|
Packit |
aea12f |
* The functions in this file iterate through the _gnutls_supplemental
|
|
Packit |
aea12f |
* array, and calls the send/recv functions for each respective data
|
|
Packit |
aea12f |
* type.
|
|
Packit |
aea12f |
*
|
|
Packit |
aea12f |
* The receive function of each data type is responsible for decoding
|
|
Packit |
aea12f |
* its own data. If the extension did not expect to receive
|
|
Packit |
aea12f |
* supplemental data, it should return GNUTLS_E_UNEXPECTED_PACKET.
|
|
Packit |
aea12f |
* Otherwise, it just parse the data as normal.
|
|
Packit |
aea12f |
*
|
|
Packit |
aea12f |
* The send function needs to append the 2-byte data format type, and
|
|
Packit |
aea12f |
* append the 2-byte length of its data, and the data. If it doesn't
|
|
Packit |
aea12f |
* want to send any data, it is fine to return without doing anything.
|
|
Packit |
aea12f |
*/
|
|
Packit |
aea12f |
|
|
Packit |
aea12f |
#include "gnutls_int.h"
|
|
Packit |
aea12f |
#include <gnutls/gnutls.h>
|
|
Packit |
aea12f |
#include "supplemental.h"
|
|
Packit |
aea12f |
#include "errors.h"
|
|
Packit |
aea12f |
#include "num.h"
|
|
Packit |
aea12f |
|
|
Packit |
aea12f |
typedef struct gnutls_supplemental_entry_st {
|
|
Packit |
aea12f |
char *name;
|
|
Packit |
aea12f |
gnutls_supplemental_data_format_type_t type;
|
|
Packit |
aea12f |
gnutls_supp_recv_func supp_recv_func;
|
|
Packit |
aea12f |
gnutls_supp_send_func supp_send_func;
|
|
Packit |
aea12f |
} gnutls_supplemental_entry_st;
|
|
Packit |
aea12f |
|
|
Packit |
aea12f |
static size_t suppfunc_size = 0;
|
|
Packit |
aea12f |
static gnutls_supplemental_entry_st *suppfunc = NULL;
|
|
Packit |
aea12f |
|
|
Packit |
aea12f |
/**
|
|
Packit |
aea12f |
* gnutls_supplemental_get_name:
|
|
Packit |
aea12f |
* @type: is a supplemental data format type
|
|
Packit |
aea12f |
*
|
|
Packit |
aea12f |
* Convert a #gnutls_supplemental_data_format_type_t value to a
|
|
Packit |
aea12f |
* string.
|
|
Packit |
aea12f |
*
|
|
Packit |
aea12f |
* Returns: a string that contains the name of the specified
|
|
Packit |
aea12f |
* supplemental data format type, or %NULL for unknown types.
|
|
Packit |
aea12f |
**/
|
|
Packit |
aea12f |
const char
|
|
Packit |
aea12f |
*gnutls_supplemental_get_name(gnutls_supplemental_data_format_type_t
|
|
Packit |
aea12f |
type)
|
|
Packit |
aea12f |
{
|
|
Packit |
aea12f |
size_t i;
|
|
Packit |
aea12f |
|
|
Packit |
aea12f |
for (i = 0; i < suppfunc_size; i++) {
|
|
Packit |
aea12f |
if (suppfunc[i].type == type)
|
|
Packit |
aea12f |
return suppfunc[i].name;
|
|
Packit |
aea12f |
}
|
|
Packit |
aea12f |
|
|
Packit |
aea12f |
return NULL;
|
|
Packit |
aea12f |
}
|
|
Packit |
aea12f |
|
|
Packit |
aea12f |
void _gnutls_supplemental_deinit(void)
|
|
Packit |
aea12f |
{
|
|
Packit |
aea12f |
unsigned i;
|
|
Packit |
aea12f |
|
|
Packit |
aea12f |
for (i = 0; i < suppfunc_size; i++) {
|
|
Packit |
aea12f |
gnutls_free(suppfunc[i].name);
|
|
Packit |
aea12f |
}
|
|
Packit |
aea12f |
gnutls_free(suppfunc);
|
|
Packit |
aea12f |
|
|
Packit |
aea12f |
suppfunc = NULL;
|
|
Packit |
aea12f |
suppfunc_size = 0;
|
|
Packit |
aea12f |
}
|
|
Packit |
aea12f |
|
|
Packit |
aea12f |
static gnutls_supp_recv_func
|
|
Packit |
aea12f |
get_supp_func_recv(gnutls_session_t session, gnutls_supplemental_data_format_type_t type)
|
|
Packit |
aea12f |
{
|
|
Packit |
aea12f |
size_t i;
|
|
Packit |
aea12f |
|
|
Packit |
aea12f |
for (i = 0; i < session->internals.rsup_size; i++) {
|
|
Packit |
aea12f |
if (session->internals.rsup[i].type == type)
|
|
Packit |
aea12f |
return session->internals.rsup[i].supp_recv_func;
|
|
Packit |
aea12f |
}
|
|
Packit |
aea12f |
|
|
Packit |
aea12f |
for (i = 0; i < suppfunc_size; i++) {
|
|
Packit |
aea12f |
if (suppfunc[i].type == type)
|
|
Packit |
aea12f |
return suppfunc[i].supp_recv_func;
|
|
Packit |
aea12f |
}
|
|
Packit |
aea12f |
|
|
Packit |
aea12f |
return NULL;
|
|
Packit |
aea12f |
}
|
|
Packit |
aea12f |
|
|
Packit |
aea12f |
static int gen_supplemental(gnutls_session_t session, const gnutls_supplemental_entry_st *supp,
|
|
Packit |
aea12f |
gnutls_buffer_st * buf)
|
|
Packit |
aea12f |
{
|
|
Packit |
aea12f |
int ret;
|
|
Packit |
aea12f |
gnutls_supp_send_func supp_send = supp->supp_send_func;
|
|
Packit |
aea12f |
size_t sizepos = buf->length;
|
|
Packit |
aea12f |
|
|
Packit |
aea12f |
/* Make room for supplement type and length byte length field. */
|
|
Packit |
aea12f |
ret = _gnutls_buffer_append_data(buf, "\0\0\0\0", 4);
|
|
Packit |
aea12f |
if (ret < 0) {
|
|
Packit |
aea12f |
gnutls_assert();
|
|
Packit |
aea12f |
return ret;
|
|
Packit |
aea12f |
}
|
|
Packit |
aea12f |
|
|
Packit |
aea12f |
ret = supp_send(session, buf);
|
|
Packit |
aea12f |
if (ret < 0) {
|
|
Packit |
aea12f |
gnutls_assert();
|
|
Packit |
aea12f |
return ret;
|
|
Packit |
aea12f |
}
|
|
Packit |
aea12f |
|
|
Packit |
aea12f |
/* If data were added, store type+length, otherwise reset. */
|
|
Packit |
aea12f |
if (buf->length > sizepos + 4) {
|
|
Packit |
aea12f |
buf->data[sizepos] = (supp->type >> 8) & 0xFF;
|
|
Packit |
aea12f |
buf->data[sizepos + 1] = supp->type & 0xFF;
|
|
Packit |
aea12f |
buf->data[sizepos + 2] =
|
|
Packit |
aea12f |
((buf->length - sizepos - 4) >> 8) & 0xFF;
|
|
Packit |
aea12f |
buf->data[sizepos + 3] =
|
|
Packit |
aea12f |
(buf->length - sizepos - 4) & 0xFF;
|
|
Packit |
aea12f |
} else
|
|
Packit |
aea12f |
buf->length -= 4;
|
|
Packit |
aea12f |
|
|
Packit |
aea12f |
return 0;
|
|
Packit |
aea12f |
}
|
|
Packit |
aea12f |
|
|
Packit |
aea12f |
int
|
|
Packit |
aea12f |
_gnutls_gen_supplemental(gnutls_session_t session, gnutls_buffer_st * buf)
|
|
Packit |
aea12f |
{
|
|
Packit |
aea12f |
size_t i;
|
|
Packit |
aea12f |
int ret;
|
|
Packit |
aea12f |
unsigned init_pos = buf->length;
|
|
Packit |
aea12f |
|
|
Packit |
aea12f |
/* Make room for 3 byte length field. */
|
|
Packit |
aea12f |
ret = _gnutls_buffer_append_data(buf, "\0\0\0", 3);
|
|
Packit |
aea12f |
if (ret < 0) {
|
|
Packit |
aea12f |
gnutls_assert();
|
|
Packit |
aea12f |
return ret;
|
|
Packit |
aea12f |
}
|
|
Packit |
aea12f |
|
|
Packit |
aea12f |
for (i = 0; i < session->internals.rsup_size; i++) {
|
|
Packit |
aea12f |
ret = gen_supplemental(session, &session->internals.rsup[i], buf);
|
|
Packit |
aea12f |
if (ret < 0)
|
|
Packit |
aea12f |
return gnutls_assert_val(ret);
|
|
Packit |
aea12f |
}
|
|
Packit |
aea12f |
|
|
Packit |
aea12f |
for (i = 0; i < suppfunc_size; i++) {
|
|
Packit |
aea12f |
ret = gen_supplemental(session, &suppfunc[i], buf);
|
|
Packit |
aea12f |
if (ret < 0)
|
|
Packit |
aea12f |
return gnutls_assert_val(ret);
|
|
Packit |
aea12f |
}
|
|
Packit |
aea12f |
|
|
Packit |
aea12f |
i = buf->length - init_pos - 3;
|
|
Packit |
aea12f |
|
|
Packit |
aea12f |
buf->data[init_pos] = (i >> 16) & 0xFF;
|
|
Packit |
aea12f |
buf->data[init_pos+1] = (i >> 8) & 0xFF;
|
|
Packit |
aea12f |
buf->data[init_pos+2] = i & 0xFF;
|
|
Packit |
aea12f |
|
|
Packit |
aea12f |
_gnutls_debug_log
|
|
Packit |
aea12f |
("EXT[%p]: Sending %d bytes of supplemental data\n", session,
|
|
Packit |
aea12f |
(int) buf->length);
|
|
Packit |
aea12f |
|
|
Packit |
aea12f |
return buf->length - init_pos;
|
|
Packit |
aea12f |
}
|
|
Packit |
aea12f |
|
|
Packit |
aea12f |
int
|
|
Packit |
aea12f |
_gnutls_parse_supplemental(gnutls_session_t session,
|
|
Packit |
aea12f |
const uint8_t * data, int datalen)
|
|
Packit |
aea12f |
{
|
|
Packit |
aea12f |
const uint8_t *p = data;
|
|
Packit Service |
991b93 |
size_t dsize = datalen;
|
|
Packit |
aea12f |
size_t total_size;
|
|
Packit |
aea12f |
|
|
Packit |
aea12f |
DECR_LEN(dsize, 3);
|
|
Packit |
aea12f |
total_size = _gnutls_read_uint24(p);
|
|
Packit |
aea12f |
p += 3;
|
|
Packit |
aea12f |
|
|
Packit Service |
991b93 |
if (dsize != total_size) {
|
|
Packit |
aea12f |
gnutls_assert();
|
|
Packit |
aea12f |
return GNUTLS_E_RECEIVED_ILLEGAL_PARAMETER;
|
|
Packit |
aea12f |
}
|
|
Packit |
aea12f |
|
|
Packit |
aea12f |
do {
|
|
Packit |
aea12f |
uint16_t supp_data_type;
|
|
Packit |
aea12f |
uint16_t supp_data_length;
|
|
Packit |
aea12f |
gnutls_supp_recv_func recv_func;
|
|
Packit |
aea12f |
|
|
Packit |
aea12f |
DECR_LEN(dsize, 2);
|
|
Packit |
aea12f |
supp_data_type = _gnutls_read_uint16(p);
|
|
Packit |
aea12f |
p += 2;
|
|
Packit |
aea12f |
|
|
Packit |
aea12f |
DECR_LEN(dsize, 2);
|
|
Packit |
aea12f |
supp_data_length = _gnutls_read_uint16(p);
|
|
Packit |
aea12f |
p += 2;
|
|
Packit |
aea12f |
|
|
Packit |
aea12f |
_gnutls_debug_log
|
|
Packit |
aea12f |
("EXT[%p]: Got supplemental type=%02x length=%d\n",
|
|
Packit |
aea12f |
session, supp_data_type, supp_data_length);
|
|
Packit |
aea12f |
|
|
Packit |
aea12f |
recv_func = get_supp_func_recv(session, supp_data_type);
|
|
Packit |
aea12f |
if (recv_func) {
|
|
Packit |
aea12f |
int ret = recv_func(session, p, supp_data_length);
|
|
Packit |
aea12f |
if (ret < 0) {
|
|
Packit |
aea12f |
gnutls_assert();
|
|
Packit |
aea12f |
return ret;
|
|
Packit |
aea12f |
}
|
|
Packit |
aea12f |
} else {
|
|
Packit |
aea12f |
gnutls_assert();
|
|
Packit |
aea12f |
return GNUTLS_E_RECEIVED_ILLEGAL_PARAMETER;
|
|
Packit |
aea12f |
}
|
|
Packit |
aea12f |
|
|
Packit |
aea12f |
DECR_LEN(dsize, supp_data_length);
|
|
Packit |
aea12f |
p += supp_data_length;
|
|
Packit |
aea12f |
}
|
|
Packit |
aea12f |
while (dsize > 0);
|
|
Packit |
aea12f |
|
|
Packit |
aea12f |
return 0;
|
|
Packit |
aea12f |
}
|
|
Packit |
aea12f |
|
|
Packit |
aea12f |
static int
|
|
Packit |
aea12f |
_gnutls_supplemental_register(gnutls_supplemental_entry_st *entry)
|
|
Packit |
aea12f |
{
|
|
Packit |
aea12f |
gnutls_supplemental_entry_st *p;
|
|
Packit |
aea12f |
unsigned i;
|
|
Packit |
aea12f |
|
|
Packit |
aea12f |
for (i = 0; i < suppfunc_size; i++) {
|
|
Packit |
aea12f |
if (entry->type == suppfunc[i].type)
|
|
Packit |
aea12f |
return gnutls_assert_val(GNUTLS_E_ALREADY_REGISTERED);
|
|
Packit |
aea12f |
}
|
|
Packit |
aea12f |
|
|
Packit |
aea12f |
p = gnutls_realloc_fast(suppfunc,
|
|
Packit |
aea12f |
sizeof(*suppfunc) * (suppfunc_size + 1));
|
|
Packit |
aea12f |
if (!p) {
|
|
Packit |
aea12f |
gnutls_assert();
|
|
Packit |
aea12f |
return GNUTLS_E_MEMORY_ERROR;
|
|
Packit |
aea12f |
}
|
|
Packit |
aea12f |
|
|
Packit |
aea12f |
suppfunc = p;
|
|
Packit |
aea12f |
|
|
Packit |
aea12f |
memcpy(&suppfunc[suppfunc_size], entry, sizeof(*entry));
|
|
Packit |
aea12f |
|
|
Packit |
aea12f |
suppfunc_size++;
|
|
Packit |
aea12f |
|
|
Packit |
aea12f |
return GNUTLS_E_SUCCESS;
|
|
Packit |
aea12f |
}
|
|
Packit |
aea12f |
|
|
Packit |
aea12f |
/**
|
|
Packit |
aea12f |
* gnutls_supplemental_register:
|
|
Packit |
aea12f |
* @name: the name of the supplemental data to register
|
|
Packit |
aea12f |
* @type: the type of the supplemental data format
|
|
Packit |
aea12f |
* @recv_func: the function to receive the data
|
|
Packit |
aea12f |
* @send_func: the function to send the data
|
|
Packit |
aea12f |
*
|
|
Packit |
aea12f |
* This function will register a new supplemental data type (rfc4680).
|
|
Packit |
aea12f |
* The registered data will remain until gnutls_global_deinit()
|
|
Packit |
aea12f |
* is called. The provided @type must be an unassigned type in
|
|
Packit |
aea12f |
* %gnutls_supplemental_data_format_type_t. If the type is already
|
|
Packit |
aea12f |
* registered or handled by GnuTLS internally %GNUTLS_E_ALREADY_REGISTERED
|
|
Packit |
aea12f |
* will be returned.
|
|
Packit |
aea12f |
*
|
|
Packit |
aea12f |
* This function is not thread safe. As supplemental data are not defined under
|
|
Packit |
aea12f |
* TLS 1.3, this function will disable TLS 1.3 support globally.
|
|
Packit |
aea12f |
*
|
|
Packit |
aea12f |
* Returns: %GNUTLS_E_SUCCESS on success, otherwise a negative error code.
|
|
Packit |
aea12f |
*
|
|
Packit |
aea12f |
* Since: 3.4.0
|
|
Packit |
aea12f |
**/
|
|
Packit |
aea12f |
int
|
|
Packit |
aea12f |
gnutls_supplemental_register(const char *name, gnutls_supplemental_data_format_type_t type,
|
|
Packit |
aea12f |
gnutls_supp_recv_func recv_func, gnutls_supp_send_func send_func)
|
|
Packit |
aea12f |
{
|
|
Packit |
aea12f |
gnutls_supplemental_entry_st tmp_entry;
|
|
Packit |
aea12f |
int ret;
|
|
Packit |
aea12f |
|
|
Packit |
aea12f |
tmp_entry.name = gnutls_strdup(name);
|
|
Packit |
aea12f |
tmp_entry.type = type;
|
|
Packit |
aea12f |
tmp_entry.supp_recv_func = recv_func;
|
|
Packit |
aea12f |
tmp_entry.supp_send_func = send_func;
|
|
Packit |
aea12f |
|
|
Packit |
aea12f |
ret = _gnutls_supplemental_register(&tmp_entry);
|
|
Packit |
aea12f |
if (ret < 0) {
|
|
Packit |
aea12f |
gnutls_free(tmp_entry.name);
|
|
Packit |
aea12f |
}
|
|
Packit |
aea12f |
|
|
Packit |
aea12f |
_gnutls_disable_tls13 = 1;
|
|
Packit |
aea12f |
|
|
Packit |
aea12f |
return ret;
|
|
Packit |
aea12f |
}
|
|
Packit |
aea12f |
|
|
Packit |
aea12f |
/**
|
|
Packit |
aea12f |
* gnutls_session_supplemental_register:
|
|
Packit |
aea12f |
* @session: the session for which this will be registered
|
|
Packit |
aea12f |
* @name: the name of the supplemental data to register
|
|
Packit |
aea12f |
* @type: the type of the supplemental data format
|
|
Packit |
aea12f |
* @recv_func: the function to receive the data
|
|
Packit |
aea12f |
* @send_func: the function to send the data
|
|
Packit |
aea12f |
* @flags: must be zero
|
|
Packit |
aea12f |
*
|
|
Packit |
aea12f |
* This function will register a new supplemental data type (rfc4680).
|
|
Packit |
aea12f |
* The registered supplemental functions will be used for that specific
|
|
Packit |
aea12f |
* session. The provided @type must be an unassigned type in
|
|
Packit |
aea12f |
* %gnutls_supplemental_data_format_type_t.
|
|
Packit |
aea12f |
*
|
|
Packit |
aea12f |
* If the type is already registered or handled by GnuTLS internally
|
|
Packit |
aea12f |
* %GNUTLS_E_ALREADY_REGISTERED will be returned.
|
|
Packit |
aea12f |
*
|
|
Packit |
aea12f |
* As supplemental data are not defined under TLS 1.3, this function will
|
|
Packit |
aea12f |
* disable TLS 1.3 support for the given session.
|
|
Packit |
aea12f |
*
|
|
Packit |
aea12f |
* Returns: %GNUTLS_E_SUCCESS on success, otherwise a negative error code.
|
|
Packit |
aea12f |
*
|
|
Packit |
aea12f |
* Since: 3.5.5
|
|
Packit |
aea12f |
**/
|
|
Packit |
aea12f |
int
|
|
Packit |
aea12f |
gnutls_session_supplemental_register(gnutls_session_t session, const char *name,
|
|
Packit |
aea12f |
gnutls_supplemental_data_format_type_t type,
|
|
Packit |
aea12f |
gnutls_supp_recv_func recv_func,
|
|
Packit |
aea12f |
gnutls_supp_send_func send_func,
|
|
Packit |
aea12f |
unsigned flags)
|
|
Packit |
aea12f |
{
|
|
Packit |
aea12f |
gnutls_supplemental_entry_st tmp_entry;
|
|
Packit |
aea12f |
gnutls_supplemental_entry_st *p;
|
|
Packit |
aea12f |
unsigned i;
|
|
Packit |
aea12f |
|
|
Packit |
aea12f |
tmp_entry.name = NULL;
|
|
Packit |
aea12f |
tmp_entry.type = type;
|
|
Packit |
aea12f |
tmp_entry.supp_recv_func = recv_func;
|
|
Packit |
aea12f |
tmp_entry.supp_send_func = send_func;
|
|
Packit |
aea12f |
|
|
Packit |
aea12f |
for (i = 0; i < suppfunc_size; i++) {
|
|
Packit |
aea12f |
if (type == suppfunc[i].type)
|
|
Packit |
aea12f |
return gnutls_assert_val(GNUTLS_E_ALREADY_REGISTERED);
|
|
Packit |
aea12f |
}
|
|
Packit |
aea12f |
|
|
Packit |
aea12f |
p = gnutls_realloc(session->internals.rsup,
|
|
Packit |
aea12f |
sizeof(gnutls_supplemental_entry_st)*(session->internals.rsup_size + 1));
|
|
Packit |
aea12f |
if (!p)
|
|
Packit |
aea12f |
return gnutls_assert_val(GNUTLS_E_MEMORY_ERROR);
|
|
Packit |
aea12f |
|
|
Packit |
aea12f |
session->internals.rsup = p;
|
|
Packit |
aea12f |
|
|
Packit |
aea12f |
memcpy(&session->internals.rsup[session->internals.rsup_size], &tmp_entry, sizeof(tmp_entry));
|
|
Packit |
aea12f |
session->internals.rsup_size++;
|
|
Packit |
aea12f |
|
|
Packit |
aea12f |
session->internals.flags |= INT_FLAG_NO_TLS13;
|
|
Packit |
aea12f |
|
|
Packit |
aea12f |
return GNUTLS_E_SUCCESS;
|
|
Packit |
aea12f |
}
|
|
Packit |
aea12f |
|
|
Packit |
aea12f |
/**
|
|
Packit |
aea12f |
* gnutls_supplemental_recv:
|
|
Packit |
aea12f |
* @session: is a #gnutls_session_t type.
|
|
Packit |
aea12f |
* @do_recv_supplemental: non-zero in order to expect supplemental data
|
|
Packit |
aea12f |
*
|
|
Packit |
aea12f |
* This function is to be called by an extension handler to
|
|
Packit |
aea12f |
* instruct gnutls to attempt to receive supplemental data
|
|
Packit |
aea12f |
* during the handshake process.
|
|
Packit |
aea12f |
*
|
|
Packit |
aea12f |
* Since: 3.4.0
|
|
Packit |
aea12f |
**/
|
|
Packit |
aea12f |
void
|
|
Packit |
aea12f |
gnutls_supplemental_recv(gnutls_session_t session, unsigned do_recv_supplemental)
|
|
Packit |
aea12f |
{
|
|
Packit |
aea12f |
session->security_parameters.do_recv_supplemental = do_recv_supplemental;
|
|
Packit |
aea12f |
}
|
|
Packit |
aea12f |
|
|
Packit |
aea12f |
/**
|
|
Packit |
aea12f |
* gnutls_supplemental_send:
|
|
Packit |
aea12f |
* @session: is a #gnutls_session_t type.
|
|
Packit |
aea12f |
* @do_send_supplemental: non-zero in order to send supplemental data
|
|
Packit |
aea12f |
*
|
|
Packit |
aea12f |
* This function is to be called by an extension handler to
|
|
Packit |
aea12f |
* instruct gnutls to send supplemental data during the handshake process.
|
|
Packit |
aea12f |
*
|
|
Packit |
aea12f |
* Since: 3.4.0
|
|
Packit |
aea12f |
**/
|
|
Packit |
aea12f |
void
|
|
Packit |
aea12f |
gnutls_supplemental_send(gnutls_session_t session, unsigned do_send_supplemental)
|
|
Packit |
aea12f |
{
|
|
Packit |
aea12f |
session->security_parameters.do_send_supplemental = do_send_supplemental;
|
|
Packit |
aea12f |
}
|