1 #define _POSIX_C_SOURCE 200809L
9 void tls_buffer_init(struct tls_buffer *buffer, size_t initial) {
16 buffer->buffer = malloc(initial);
18 memset(buffer->buffer, 0, initial);
19 buffer->size = initial;
21 buffer->error = errno;
26 void tls_buffer_compact(struct tls_buffer *b) {
29 if (b->error || b->size == b->len) {
34 new = realloc(b->buffer, b->len);
45 /* makes sure there's at least need bytes free */
46 void tls_buffer_expand(struct tls_buffer *buf, size_t need) {
53 want = buf->len + need;
55 if (want <= buf->size) {
60 char *new = realloc(buf->buffer, want);
64 memset(buf->buffer + buf->len, 0, buf->size - buf->len);
70 void tls_buffer_free(struct tls_buffer *buffer) {
71 /* TODO only zero out memory if it's "secure" buffer */
72 if (buffer->buffer && buffer->len) {
73 memset(buffer->buffer, 0, buffer->len);
76 tls_buffer_init(buffer, 0);
79 void tls_buffer_set(struct tls_buffer *buffer, int ch) {
80 /* TODO only zero out memory if it's "secure" buffer */
81 if (buffer->buffer && buffer->size) {
82 memset(buffer->buffer, ch, buffer->size);
86 void tls_buffer_append(struct tls_buffer *buffer, const unsigned char *bytes, size_t n) {
87 tls_buffer_expand(buffer, n);
89 if (buffer->error || !bytes) {
93 memcpy(buffer->buffer + buffer->len, bytes, n);
97 void tls_buffer_append_str(struct tls_buffer *buf, const unsigned char *s) {
98 tls_buffer_append(buf, s, strlen(s));
101 void tls_buffer_append16(struct tls_buffer *buffer, uint16_t n) {
102 tls_buffer_expand(buffer, 2);
108 buffer->buffer[buffer->len++] = (n >> 8) & 0xff;
109 buffer->buffer[buffer->len++] = n & 0xff;
112 void tls_buffer_append24(struct tls_buffer *buffer, uint32_t n) {
113 tls_buffer_expand(buffer, 3);
119 buffer->buffer[buffer->len++] = (n >> 16) & 0xff;
120 buffer->buffer[buffer->len++] = (n >> 8) & 0xff;
121 buffer->buffer[buffer->len++] = n & 0xff;
124 void tls_buffer_append_byte(struct tls_buffer *buffer, uint8_t n) {
125 tls_buffer_expand(buffer, 1);
131 buffer->buffer[buffer->len++] = n & 0xff;
134 void tls_buffer_write16(struct tls_buffer *buffer, uint16_t n, size_t at) {
135 if (at+2 > buffer->size) {
136 tls_buffer_expand(buffer, at+2 - buffer->size);
143 buffer->buffer[at] = (n >> 8) & 0xff;
144 buffer->buffer[at+1] = n & 0xff;
146 if (at+2 > buffer->len) {
147 buffer->len = at + 2;
151 uint16_t tls_buffer_read16(struct tls_buffer *buffer, size_t at) {
154 if (buffer->error || at+2 < buffer->len) {
158 res = (buffer->buffer[at] << 8) + buffer->buffer[at+1];
162 uint64_t tls_buffer_readbe(struct tls_buffer *buffer, int bytes, size_t at) {
166 if (buffer->error || at+bytes < buffer->len) {
170 for (i=0; i<bytes; i++) {
172 res += buffer->buffer[at+i];
178 void tls_buffer_writebe(struct tls_buffer *buffer, int bytes, size_t at, uint64_t val) {
180 if (at+bytes > buffer->size) {
181 tls_buffer_expand(buffer, at+bytes - buffer->size);
188 for (i=bytes-1; i>=0; i--) {
189 buffer->buffer[at+i] = val & 0xff;
197 void tls_buffer_shift(struct tls_buffer *buffer, size_t n) {
202 if (buffer->len < n) {
207 memmove(buffer->buffer, buffer->buffer + n, buffer->len - n);
208 memset(buffer->buffer + buffer->len - n, 0, n);
210 fprintf(stderr, "memmove(%p, %p, %zu)\n", buffer->buffer,
211 buffer->buffer+n, buffer->len - n);
212 fprintf(stderr, "memset(%p, %d, %zu)\n", buffer->buffer+n,
220 /* make room at the beginning */
221 void tls_buffer_unshift(struct tls_buffer *buffer, size_t n) {
222 tls_buffer_expand(buffer, n);
228 memmove(buffer->buffer + n, buffer->buffer, n);
229 memset(buffer->buffer, 0, n);
233 uint32_t tls_buffer_next3(struct tls_buffer_reader *rb) {
236 r = tls_buffer_readbe(rb, 3, rb->cursor);
241 uint16_t tls_buffer_next2(struct tls_buffer_reader *rb) {
244 r = tls_buffer_readbe(rb, 2, rb->cursor);
249 uint8_t tls_buffer_next(struct tls_buffer_reader *rb) {
252 r = tls_buffer_readbe(rb, 2, rb->cursor);
257 void tls_buffer_nextn(struct tls_buffer_reader *rb, unsigned char *b, size_t n) {
258 tls_buffer_read(rb, b, n, rb->cursor);