if (again == 0)
{
- bufel = _gnutls_handshake_alloc (36);
+ bufel = _gnutls_handshake_alloc (MAX_VERIFY_DATA_SIZE);
if (bufel == NULL)
{
gnutls_assert ();
}
/* first run */
- data = bufel->msg.data;
- datasize = bufel->msg.size;
+ data = _mbuffer_get_uhead_ptr(bufel);
+ datasize = _mbuffer_get_udata_size(bufel) + _mbuffer_get_uhead_size(bufel);
data[pos++] = (uint8_t) type;
_gnutls_write_uint24 (bufel->msg.size - bufel->mark, &data[pos]);
#include "gnutls_int.h"
-void _gnutls_mbuffer_init (mbuffer_head_st *buf);
-void _gnutls_mbuffer_clear (mbuffer_head_st *buf);
-void _gnutls_mbuffer_enqueue (mbuffer_head_st *buf, mbuffer_st *bufel);
-void _gnutls_mbuffer_get_head (mbuffer_head_st *buf, gnutls_datum_t *msg);
-int _gnutls_mbuffer_remove_bytes (mbuffer_head_st *buf, size_t bytes);
-mbuffer_st* _gnutls_mbuffer_alloc (size_t payload_size);
-mbuffer_st* _gnutls_mbuffer_realloc (mbuffer_st *bufel, size_t payload_size);
+void _mbuffer_init (mbuffer_head_st *buf);
+void _mbuffer_clear (mbuffer_head_st *buf);
+void _mbuffer_enqueue (mbuffer_head_st *buf, mbuffer_st *bufel);
+void _mbuffer_get_head (mbuffer_head_st *buf, gnutls_datum_t *msg);
+int _mbuffer_remove_bytes (mbuffer_head_st *buf, size_t bytes);
+mbuffer_st* _mbuffer_alloc (size_t payload_size);
+
+/* This is dangerous since it will replace bufel with a new
+ * one.
+ */
+mbuffer_st* _mbuffer_append_data (mbuffer_st *bufel, void* newdata, size_t newdata_size);
+
+
+/* For "user" use. One can have buffer data and header.
+ */
+
+inline static void _mbuffer_set_udata(mbuffer_st *bufel, void* data, size_t data_size)
+{
+ memcpy(bufel->msg.data + bufel->user_mark, data, data_size);
+}
+
+inline static void* _mbuffer_get_uhead_ptr(mbuffer_st *bufel)
+{
+ return bufel->msg.data;
+}
+
+inline static void* _mbuffer_get_udata_ptr(mbuffer_st *bufel)
+{
+ return bufel->msg.data + bufel->user_mark;
+}
+
+inline static void _mbuffer_set_udata_size(mbuffer_st *bufel, size_t size)
+{
+ bufel->msg.size = size + bufel->user_mark;
+}
+
+inline static size_t _mbuffer_get_udata_size(mbuffer_st *bufel)
+{
+ return bufel->msg.size - bufel->user_mark;
+}
+
+inline static size_t _mbuffer_get_uhead_size(mbuffer_st *bufel)
+{
+ return bufel->user_mark;
+}
+
+inline static void _mbuffer_set_uhead_size(mbuffer_st *bufel, size_t size)
+{
+ bufel->user_mark = size;
+}
+
+
+
+inline static mbuffer_st* _gnutls_handshake_alloc(size_t size)
+{
+ mbuffer_st *ret = _mbuffer_alloc (HANDSHAKE_HEADER_SIZE + size);
+
+ if (!ret)
+ return NULL;
+
+ _mbuffer_set_uhead_size(ret, HANDSHAKE_HEADER_SIZE);
+
+ return ret;
+}
#endif
cipher_size =
_gnutls_encrypt (session, headers, RECORD_HEADER_SIZE, data,
- data2send_size, bufel->msg.data, cipher_size, type,
+ data2send_size, _mbuffer_get_udata_ptr(bufel), cipher_size, type,
(session->internals.priorities.no_padding ==
0) ? 1 : 0);
if (cipher_size <= 0)
return GNUTLS_E_RECORD_LIMIT_REACHED;
}
- bufel->msg.size = cipher_size;
+ _mbuffer_set_udata_size(bufel, cipher_size);
ret = _gnutls_io_write_buffered (session, bufel);
}