#include "sslDecode.h"
#include "sslUtils.h"
#include "sslDebug.h"
#include "sslMemory.h"
#include "tls_handshake_priv.h"
size_t SSLEncodedBufferListSize(const tls_buffer_list_t *list, int itemLenSize)
{
size_t len = 0;
while(list) {
len += itemLenSize;
len += list->buffer.length;
list = list->next;
}
return len;
}
uint8_t *
SSLEncodeBufferList(const tls_buffer_list_t *list, int itemLenSize, uint8_t *p)
{
while(list) {
p = SSLEncodeSize(p, list->buffer.length, itemLenSize);
memcpy(p, list->buffer.data, list->buffer.length); p += list->buffer.length;
list = list->next;
}
return p;
}
int
SSLDecodeBufferList(uint8_t *p, size_t listLen, int itemLenSize, tls_buffer_list_t **list)
{
int err = 0;
tls_buffer_list_t *first = NULL;
tls_buffer_list_t *last = NULL;
while (listLen > 0)
{
size_t itemLen;
tls_buffer_list_t *item;
if (listLen < itemLenSize) {
sslErrorLog("SSLDecodeBufferList: length decode error 2\n");
err = errSSLProtocol;
goto errOut;
}
itemLen = SSLDecodeInt(p,itemLenSize);
p += itemLenSize;
if (listLen < itemLen + itemLenSize) {
sslErrorLog("SSLDecodeBufferList: length decode error 3\n");
err = errSSLProtocol;
goto errOut;
}
if(itemLen==0) {
sslErrorLog("SSLDecodeBufferList: lenght decode error 4 (empty item)\n");
err = errSSLProtocol;
goto errOut;
}
item = (tls_buffer_list_t *)sslMalloc(sizeof(tls_buffer_list_t));
if(item == NULL) {
err = errSSLAllocate;
goto errOut;
}
if ((err = SSLAllocBuffer(&item->buffer, itemLen))) {
sslFree(item);
goto errOut;
}
item->next = NULL;
memcpy(item->buffer.data, p, itemLen);
p += itemLen;
if(first==NULL) {
first=item;
last=item;
} else {
last->next=item;
last=item;
}
listLen -= itemLenSize+itemLen;
}
*list = first;
return 0;
errOut:
tls_free_buffer_list(first);
return err;
}