{
int ret;
uint8_t *data;
- uint32_t datasize;
+ uint32_t datasize, i_datasize;
int pos = 0;
if (bufel == NULL)
/* first run */
data = _mbuffer_get_uhead_ptr (bufel);
- datasize =
- _mbuffer_get_udata_size (bufel) + _mbuffer_get_uhead_size (bufel);
+ i_datasize = _mbuffer_get_udata_size(bufel);
+ datasize = i_datasize + _mbuffer_get_uhead_size (bufel);
data[pos++] = (uint8_t) type;
_gnutls_write_uint24 (_mbuffer_get_udata_size (bufel), &data[pos]);
pos += 3;
+ /* Add DTLS handshake fragment headers. The message will be
+ * fragmented later by the fragmentation sub-layer. All fields must
+ * be set properly for HMAC. The HMAC requires we pretend that the
+ * message was sent in a single fragment. */
+ if (_gnutls_is_dtls(session))
+ {
+ /* FIXME: dummy sequence number */
+ _gnutls_write_uint16 (0, &data[pos]);
+ pos += 2;
+
+ /* Fragment offset */
+ _gnutls_write_uint24 (0, &data[pos]);
+ pos += 3;
+
+ /* Fragment length */
+ _gnutls_write_uint24 (i_datasize, &data[pos]);
+ pos += 3;
+ }
+
_gnutls_handshake_log ("HSK[%p]: %s was sent [%ld bytes]\n",
session, _gnutls_handshake2str (type),
(long) datasize);
int rehandshake = 0;
uint8_t session_id_len =
session->internals.resumed_security_parameters.session_id_size;
+ uint8_t cookie_len;
_gnutls_buffer_init(&extdata);
if (again == 0)
{
+ if(_gnutls_is_dtls(session))
+ {
+ cookie_len = session->internals.dtls.cookie_len + 1;
+ }
+ else
+ {
+ cookie_len = 0;
+ }
- datalen = 2 + (session_id_len + 1) + GNUTLS_RANDOM_SIZE;
+ datalen = 2 + (session_id_len + 1) + GNUTLS_RANDOM_SIZE + cookie_len;
/* 2 for version, (4 for unix time + 28 for random bytes==GNUTLS_RANDOM_SIZE)
*/
pos += session_id_len;
}
+ /* Copy the DTLS cookie
+ */
+ if (_gnutls_is_dtls(session))
+ {
+ data[pos++] = session->internals.dtls.cookie_len;
+ memcpy(&data[pos], &session->internals.dtls.cookie, session->internals.dtls.cookie_len);
+ pos += session->internals.dtls.cookie_len;
+ }
/* Copy the ciphersuites.
*
GNUTLS_HANDSHAKE_HELLO_REQUEST = 0,
GNUTLS_HANDSHAKE_CLIENT_HELLO = 1,
GNUTLS_HANDSHAKE_SERVER_HELLO = 2,
+ GNUTLS_HANDSHAKE_HELLO_VERIFY_REQUEST = 3,
GNUTLS_HANDSHAKE_NEW_SESSION_TICKET = 4,
GNUTLS_HANDSHAKE_CERTIFICATE_PKT = 11,
GNUTLS_HANDSHAKE_SERVER_KEY_EXCHANGE = 12,