buffertest.c revision 1.1
1/* 2 * Copyright (c) 2019 Joel Sing <jsing@openbsd.org> 3 * 4 * Permission to use, copy, modify, and distribute this software for any 5 * purpose with or without fee is hereby granted, provided that the above 6 * copyright notice and this permission notice appear in all copies. 7 * 8 * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES 9 * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF 10 * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR 11 * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES 12 * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN 13 * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF 14 * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. 15 */ 16 17#include <err.h> 18#include <string.h> 19 20#include "tls13_internal.h" 21 22uint8_t testdata[] = { 23 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 24 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f, 25}; 26 27struct read_state { 28 uint8_t *buf; 29 size_t len; 30 size_t offset; 31}; 32 33static ssize_t 34read_cb(void *buf, size_t buflen, void *cb_arg) 35{ 36 struct read_state *rs = cb_arg; 37 ssize_t n; 38 39 if (rs->offset > rs->len) 40 return TLS13_IO_EOF; 41 42 if ((size_t)(n = buflen) > (rs->len - rs->offset)) 43 n = rs->len - rs->offset; 44 45 if (n == 0) 46 return TLS13_IO_WANT_POLLIN; 47 48 memcpy(buf, &rs->buf[rs->offset], n); 49 rs->offset += n; 50 51 return n; 52} 53 54struct extend_test { 55 size_t extend_len; 56 size_t read_len; 57 uint8_t want_buf[128]; 58 size_t want_len; 59 ssize_t want_ret; 60}; 61 62struct extend_test extend_tests[] = { 63 { 64 .extend_len = 4, 65 .read_len = 0, 66 .want_ret = TLS13_IO_WANT_POLLIN, 67 }, 68 { 69 .extend_len = 4, 70 .read_len = 8, 71 .want_ret = 4, 72 }, 73 { 74 .extend_len = 12, 75 .read_len = 8, 76 .want_ret = TLS13_IO_WANT_POLLIN, 77 }, 78 { 79 .extend_len = 12, 80 .read_len = 10, 81 .want_ret = TLS13_IO_WANT_POLLIN, 82 }, 83 { 84 .extend_len = 12, 85 .read_len = 12, 86 .want_ret = 12, 87 }, 88 { 89 .extend_len = 16, 90 .read_len = 16, 91 .want_ret = 16, 92 }, 93 { 94 .extend_len = 20, 95 .read_len = 1, 96 .want_ret = TLS13_IO_EOF, 97 }, 98}; 99 100#define N_EXTEND_TESTS (sizeof(extend_tests) / sizeof(extend_tests[0])) 101 102int 103main(int argc, char **argv) 104{ 105 struct tls13_buffer *buf; 106 struct extend_test *et; 107 struct read_state rs; 108 uint8_t *data; 109 size_t i, data_len; 110 ssize_t ret; 111 CBS cbs; 112 113 rs.buf = testdata; 114 115 if ((buf = tls13_buffer_new(0)) == NULL) 116 errx(1, "tls13_buffer_new"); 117 118 for (i = 0; i < N_EXTEND_TESTS; i++) { 119 et = &extend_tests[i]; 120 rs.len = et->read_len; 121 122 ret = tls13_buffer_extend(buf, et->extend_len, read_cb, &rs); 123 if (ret != extend_tests[i].want_ret) { 124 fprintf(stderr, "FAIL: Test %zi - extend returned %zi, " 125 "want %zi\n", i, ret, et->want_ret); 126 return 1; 127 } 128 129 tls13_buffer_cbs(buf, &cbs); 130 131 if (!CBS_mem_equal(&cbs, testdata, CBS_len(&cbs))) { 132 fprintf(stderr, "FAIL: Test %zi - extend buffer " 133 "mismatch", i); 134 return 1; 135 } 136 } 137 138 if (!tls13_buffer_finish(buf, &data, &data_len)) { 139 fprintf(stderr, "FAIL: failed to finish\n"); 140 return 1; 141 } 142 143 tls13_buffer_free(buf); 144 145 if (data_len != sizeof(testdata)) { 146 fprintf(stderr, "FAIL: got data length %zu, want %zu\n", 147 data_len, sizeof(testdata)); 148 return 1; 149 } 150 if (memcmp(data, testdata, data_len) != 0) { 151 fprintf(stderr, "FAIL: data mismatch\n"); 152 return 1; 153 } 154 free(data); 155 156 return 0; 157} 158