ret = _gnutls_ext_get_resumed_session_data( session, GNUTLS_EXTENSION_SESSION_TICKET, &epriv);
if (ret >= 0)
priv = epriv.ptr;
-
+
/* no previous data. Just advertize it */
if (ret < 0)
return GNUTLS_E_INT_RET_0;
int ret;
BUFFER_APPEND_PFX(ps, priv->session_ticket, priv->session_ticket_len);
+ BUFFER_APPEND_NUM(ps, priv->session_ticket_enable);
return 0;
}
BUFFER_POP_DATUM(ps, &ticket);
priv->session_ticket = ticket.data;
priv->session_ticket_len = ticket.size;
+ BUFFER_POP_NUM(ps, priv->session_ticket_enable);
epriv.ptr = priv;
*_priv = epriv;
- ret = 0;
+ return 0;
error:
gnutls_free(priv);
if (!priv->session_ticket_renew)
return 0;
-
+
/* XXX: Temporarily set write algorithms to be used.
_gnutls_write_connection_state_init() does this job, but it also
triggers encryption, while NewSessionTicket should not be
data_size = p - data;
}
-
ret = _gnutls_send_handshake (session, data_size ? bufel : NULL,
GNUTLS_HANDSHAKE_NEW_SESSION_TICKET);
if (ret < 0)
{
gnutls_assert ();
- gnutls_free (data);
gnutls_free (priv->session_ticket);
priv->session_ticket = NULL;
return GNUTLS_E_INTERNAL_ERROR;
extension_priv_data_t data;
int cur_size;
int size_offset;
-void* total_exts_pos;
+int total_exts_pos;
int exts = 0;
- total_exts_pos = packed->data + packed->length;
-
+ total_exts_pos = packed->length;
BUFFER_APPEND_NUM(packed, 0);
for (i = 0; i < extfunc_size; i++)
}
}
- _gnutls_write_uint32(exts, total_exts_pos);
+ _gnutls_write_uint32(exts, packed->data+total_exts_pos);
return 0;
for (i=0;i<MAX_EXT_TYPES;i++)
{
- if (session->internals.resumed_extension_int_data[i].type == type)
+ if (session->internals.resumed_extension_int_data[i].type == type || session->internals.resumed_extension_int_data[i].set == 0)
{
if (session->internals.resumed_extension_int_data[i].set != 0)
uint16_t type;
int size_for_type, cur_pos;
+
BUFFER_POP_NUM(packed, max_exts);
for (i = 0; i < max_exts; i++)
{
gnutls_assert();
return GNUTLS_E_PARSING_ERROR;
}
-
+
ret = unpack(packed, &data);
if (ret < 0)
{
gnutls_assert();
return ret;
}
-
+
/* verify that unpack read the correct bytes */
cur_pos = cur_pos - packed->length;
if (cur_pos /* read length */ != size_for_type)
gnutls_assert();
return GNUTLS_E_PARSING_ERROR;
}
+
_gnutls_ext_set_resumed_session_data(session, type, data);
}