1c7da899bSchristos /*
221497c5cSchristos * Copyright 2015-2021 The OpenSSL Project Authors. All Rights Reserved.
3c7da899bSchristos *
4*b0d17251Schristos * Licensed under the Apache License 2.0 (the "License"). You may not use
5c7da899bSchristos * this file except in compliance with the License. You can obtain a copy
6c7da899bSchristos * in the file LICENSE in the source distribution or at
7c7da899bSchristos * https://www.openssl.org/source/license.html
8c7da899bSchristos */
9c7da899bSchristos
10*b0d17251Schristos #include "internal/packet.h"
1113d40330Schristos #include "testutil.h"
12c7da899bSchristos
13c7da899bSchristos #define BUF_LEN 255
14c7da899bSchristos
15*b0d17251Schristos static unsigned char smbuf[BUF_LEN + 1];
1613d40330Schristos
test_PACKET_remaining(void)1713d40330Schristos static int test_PACKET_remaining(void)
18c7da899bSchristos {
19c7da899bSchristos PACKET pkt;
20c7da899bSchristos
21*b0d17251Schristos if (!TEST_true(PACKET_buf_init(&pkt, smbuf, BUF_LEN))
2213d40330Schristos || !TEST_size_t_eq(PACKET_remaining(&pkt), BUF_LEN)
2313d40330Schristos || !TEST_true(PACKET_forward(&pkt, BUF_LEN - 1))
2413d40330Schristos || !TEST_size_t_eq(PACKET_remaining(&pkt), 1)
2513d40330Schristos || !TEST_true(PACKET_forward(&pkt, 1))
2613d40330Schristos || !TEST_size_t_eq(PACKET_remaining(&pkt), 0))
27c7da899bSchristos return 0;
28c7da899bSchristos
29c7da899bSchristos return 1;
30c7da899bSchristos }
31c7da899bSchristos
test_PACKET_end(void)3213d40330Schristos static int test_PACKET_end(void)
33c7da899bSchristos {
34c7da899bSchristos PACKET pkt;
35c7da899bSchristos
36*b0d17251Schristos if (!TEST_true(PACKET_buf_init(&pkt, smbuf, BUF_LEN))
3713d40330Schristos || !TEST_size_t_eq(PACKET_remaining(&pkt), BUF_LEN)
3813d40330Schristos || !TEST_ptr_eq(PACKET_end(&pkt), smbuf + BUF_LEN)
3913d40330Schristos || !TEST_true(PACKET_forward(&pkt, BUF_LEN - 1))
4013d40330Schristos || !TEST_ptr_eq(PACKET_end(&pkt), smbuf + BUF_LEN)
4113d40330Schristos || !TEST_true(PACKET_forward(&pkt, 1))
4213d40330Schristos || !TEST_ptr_eq(PACKET_end(&pkt), smbuf + BUF_LEN))
43c7da899bSchristos return 0;
44c7da899bSchristos
45c7da899bSchristos return 1;
46c7da899bSchristos }
47c7da899bSchristos
test_PACKET_get_1(void)4813d40330Schristos static int test_PACKET_get_1(void)
49c7da899bSchristos {
5013d40330Schristos unsigned int i = 0;
51c7da899bSchristos PACKET pkt;
52c7da899bSchristos
5313d40330Schristos if (!TEST_true(PACKET_buf_init(&pkt, smbuf, BUF_LEN))
5413d40330Schristos || !TEST_true(PACKET_get_1(&pkt, &i))
5513d40330Schristos || !TEST_uint_eq(i, 0x02)
5613d40330Schristos || !TEST_true(PACKET_forward(&pkt, BUF_LEN - 2))
5713d40330Schristos || !TEST_true(PACKET_get_1(&pkt, &i))
5813d40330Schristos || !TEST_uint_eq(i, 0xfe)
5913d40330Schristos || !TEST_false(PACKET_get_1(&pkt, &i)))
60c7da899bSchristos return 0;
61c7da899bSchristos
62c7da899bSchristos return 1;
63c7da899bSchristos }
64c7da899bSchristos
test_PACKET_get_4(void)6513d40330Schristos static int test_PACKET_get_4(void)
66c7da899bSchristos {
6713d40330Schristos unsigned long i = 0;
68c7da899bSchristos PACKET pkt;
69c7da899bSchristos
7013d40330Schristos if (!TEST_true(PACKET_buf_init(&pkt, smbuf, BUF_LEN))
7113d40330Schristos || !TEST_true(PACKET_get_4(&pkt, &i))
7213d40330Schristos || !TEST_ulong_eq(i, 0x08060402UL)
7313d40330Schristos || !TEST_true(PACKET_forward(&pkt, BUF_LEN - 8))
7413d40330Schristos || !TEST_true(PACKET_get_4(&pkt, &i))
7513d40330Schristos || !TEST_ulong_eq(i, 0xfefcfaf8UL)
7613d40330Schristos || !TEST_false(PACKET_get_4(&pkt, &i)))
77c7da899bSchristos return 0;
78c7da899bSchristos
79c7da899bSchristos return 1;
80c7da899bSchristos }
81c7da899bSchristos
test_PACKET_get_net_2(void)8213d40330Schristos static int test_PACKET_get_net_2(void)
83c7da899bSchristos {
8413d40330Schristos unsigned int i = 0;
85c7da899bSchristos PACKET pkt;
86c7da899bSchristos
8713d40330Schristos if (!TEST_true(PACKET_buf_init(&pkt, smbuf, BUF_LEN))
8813d40330Schristos || !TEST_true(PACKET_get_net_2(&pkt, &i))
8913d40330Schristos || !TEST_uint_eq(i, 0x0204)
9013d40330Schristos || !TEST_true(PACKET_forward(&pkt, BUF_LEN - 4))
9113d40330Schristos || !TEST_true(PACKET_get_net_2(&pkt, &i))
9213d40330Schristos || !TEST_uint_eq(i, 0xfcfe)
9313d40330Schristos || !TEST_false(PACKET_get_net_2(&pkt, &i)))
94c7da899bSchristos return 0;
95c7da899bSchristos
96c7da899bSchristos return 1;
97c7da899bSchristos }
98c7da899bSchristos
test_PACKET_get_net_3(void)9913d40330Schristos static int test_PACKET_get_net_3(void)
100c7da899bSchristos {
10113d40330Schristos unsigned long i = 0;
102c7da899bSchristos PACKET pkt;
103c7da899bSchristos
10413d40330Schristos if (!TEST_true(PACKET_buf_init(&pkt, smbuf, BUF_LEN))
10513d40330Schristos || !TEST_true(PACKET_get_net_3(&pkt, &i))
10613d40330Schristos || !TEST_ulong_eq(i, 0x020406UL)
10713d40330Schristos || !TEST_true(PACKET_forward(&pkt, BUF_LEN - 6))
10813d40330Schristos || !TEST_true(PACKET_get_net_3(&pkt, &i))
10913d40330Schristos || !TEST_ulong_eq(i, 0xfafcfeUL)
11013d40330Schristos || !TEST_false(PACKET_get_net_3(&pkt, &i)))
111c7da899bSchristos return 0;
112c7da899bSchristos
113c7da899bSchristos return 1;
114c7da899bSchristos }
115c7da899bSchristos
test_PACKET_get_net_4(void)11613d40330Schristos static int test_PACKET_get_net_4(void)
117c7da899bSchristos {
11813d40330Schristos unsigned long i = 0;
119c7da899bSchristos PACKET pkt;
120c7da899bSchristos
12113d40330Schristos if (!TEST_true(PACKET_buf_init(&pkt, smbuf, BUF_LEN))
12213d40330Schristos || !TEST_true(PACKET_get_net_4(&pkt, &i))
12313d40330Schristos || !TEST_ulong_eq(i, 0x02040608UL)
12413d40330Schristos || !TEST_true(PACKET_forward(&pkt, BUF_LEN - 8))
12513d40330Schristos || !TEST_true(PACKET_get_net_4(&pkt, &i))
12613d40330Schristos || !TEST_ulong_eq(i, 0xf8fafcfeUL)
12713d40330Schristos || !TEST_false(PACKET_get_net_4(&pkt, &i)))
128c7da899bSchristos return 0;
129c7da899bSchristos
130c7da899bSchristos return 1;
131c7da899bSchristos }
132c7da899bSchristos
test_PACKET_get_sub_packet(void)13313d40330Schristos static int test_PACKET_get_sub_packet(void)
134c7da899bSchristos {
135c7da899bSchristos PACKET pkt, subpkt;
13613d40330Schristos unsigned long i = 0;
137c7da899bSchristos
13813d40330Schristos if (!TEST_true(PACKET_buf_init(&pkt, smbuf, BUF_LEN))
13913d40330Schristos || !TEST_true(PACKET_get_sub_packet(&pkt, &subpkt, 4))
14013d40330Schristos || !TEST_true(PACKET_get_net_4(&subpkt, &i))
14113d40330Schristos || !TEST_ulong_eq(i, 0x02040608UL)
14213d40330Schristos || !TEST_size_t_eq(PACKET_remaining(&subpkt), 0)
14313d40330Schristos || !TEST_true(PACKET_forward(&pkt, BUF_LEN - 8))
14413d40330Schristos || !TEST_true(PACKET_get_sub_packet(&pkt, &subpkt, 4))
14513d40330Schristos || !TEST_true(PACKET_get_net_4(&subpkt, &i))
14613d40330Schristos || !TEST_ulong_eq(i, 0xf8fafcfeUL)
14713d40330Schristos || !TEST_size_t_eq(PACKET_remaining(&subpkt), 0)
14813d40330Schristos || !TEST_false(PACKET_get_sub_packet(&pkt, &subpkt, 4)))
149c7da899bSchristos return 0;
150c7da899bSchristos
151c7da899bSchristos return 1;
152c7da899bSchristos }
153c7da899bSchristos
test_PACKET_get_bytes(void)15413d40330Schristos static int test_PACKET_get_bytes(void)
155c7da899bSchristos {
15613d40330Schristos const unsigned char *bytes = NULL;
157c7da899bSchristos PACKET pkt;
158c7da899bSchristos
15913d40330Schristos if (!TEST_true(PACKET_buf_init(&pkt, smbuf, BUF_LEN))
16013d40330Schristos || !TEST_true(PACKET_get_bytes(&pkt, &bytes, 4))
16113d40330Schristos || !TEST_uchar_eq(bytes[0], 2)
16213d40330Schristos || !TEST_uchar_eq(bytes[1], 4)
16313d40330Schristos || !TEST_uchar_eq(bytes[2], 6)
16413d40330Schristos || !TEST_uchar_eq(bytes[3], 8)
16513d40330Schristos || !TEST_size_t_eq(PACKET_remaining(&pkt), BUF_LEN -4)
16613d40330Schristos || !TEST_true(PACKET_forward(&pkt, BUF_LEN - 8))
16713d40330Schristos || !TEST_true(PACKET_get_bytes(&pkt, &bytes, 4))
16813d40330Schristos || !TEST_uchar_eq(bytes[0], 0xf8)
16913d40330Schristos || !TEST_uchar_eq(bytes[1], 0xfa)
17013d40330Schristos || !TEST_uchar_eq(bytes[2], 0xfc)
17113d40330Schristos || !TEST_uchar_eq(bytes[3], 0xfe)
17213d40330Schristos || !TEST_false(PACKET_remaining(&pkt)))
173c7da899bSchristos return 0;
174c7da899bSchristos
175c7da899bSchristos return 1;
176c7da899bSchristos }
177c7da899bSchristos
test_PACKET_copy_bytes(void)17813d40330Schristos static int test_PACKET_copy_bytes(void)
179c7da899bSchristos {
180c7da899bSchristos unsigned char bytes[4];
181c7da899bSchristos PACKET pkt;
182c7da899bSchristos
18313d40330Schristos if (!TEST_true(PACKET_buf_init(&pkt, smbuf, BUF_LEN))
18413d40330Schristos || !TEST_true(PACKET_copy_bytes(&pkt, bytes, 4))
18513d40330Schristos || !TEST_char_eq(bytes[0], 2)
18613d40330Schristos || !TEST_char_eq(bytes[1], 4)
18713d40330Schristos || !TEST_char_eq(bytes[2], 6)
18813d40330Schristos || !TEST_char_eq(bytes[3], 8)
18913d40330Schristos || !TEST_size_t_eq(PACKET_remaining(&pkt), BUF_LEN - 4)
19013d40330Schristos || !TEST_true(PACKET_forward(&pkt, BUF_LEN - 8))
19113d40330Schristos || !TEST_true(PACKET_copy_bytes(&pkt, bytes, 4))
19213d40330Schristos || !TEST_uchar_eq(bytes[0], 0xf8)
19313d40330Schristos || !TEST_uchar_eq(bytes[1], 0xfa)
19413d40330Schristos || !TEST_uchar_eq(bytes[2], 0xfc)
19513d40330Schristos || !TEST_uchar_eq(bytes[3], 0xfe)
19613d40330Schristos || !TEST_false(PACKET_remaining(&pkt)))
197c7da899bSchristos return 0;
198c7da899bSchristos
199c7da899bSchristos return 1;
200c7da899bSchristos }
201c7da899bSchristos
test_PACKET_copy_all(void)20213d40330Schristos static int test_PACKET_copy_all(void)
203c7da899bSchristos {
204c7da899bSchristos unsigned char tmp[BUF_LEN];
205c7da899bSchristos PACKET pkt;
206c7da899bSchristos size_t len;
207c7da899bSchristos
20813d40330Schristos if (!TEST_true(PACKET_buf_init(&pkt, smbuf, BUF_LEN))
20913d40330Schristos || !TEST_true(PACKET_copy_all(&pkt, tmp, BUF_LEN, &len))
21013d40330Schristos || !TEST_size_t_eq(len, BUF_LEN)
21113d40330Schristos || !TEST_mem_eq(smbuf, BUF_LEN, tmp, BUF_LEN)
21213d40330Schristos || !TEST_size_t_eq(PACKET_remaining(&pkt), BUF_LEN)
21313d40330Schristos || !TEST_false(PACKET_copy_all(&pkt, tmp, BUF_LEN - 1, &len)))
214c7da899bSchristos return 0;
215c7da899bSchristos
216c7da899bSchristos return 1;
217c7da899bSchristos }
218c7da899bSchristos
test_PACKET_memdup(void)21913d40330Schristos static int test_PACKET_memdup(void)
220c7da899bSchristos {
221c7da899bSchristos unsigned char *data = NULL;
222c7da899bSchristos size_t len;
223c7da899bSchristos PACKET pkt;
22413d40330Schristos int result = 0;
225c7da899bSchristos
22613d40330Schristos if (!TEST_true(PACKET_buf_init(&pkt, smbuf, BUF_LEN))
22713d40330Schristos || !TEST_true(PACKET_memdup(&pkt, &data, &len))
22813d40330Schristos || !TEST_size_t_eq(len, BUF_LEN)
22913d40330Schristos || !TEST_mem_eq(data, len, PACKET_data(&pkt), len)
23013d40330Schristos || !TEST_true(PACKET_forward(&pkt, 10))
23113d40330Schristos || !TEST_true(PACKET_memdup(&pkt, &data, &len))
23213d40330Schristos || !TEST_size_t_eq(len, BUF_LEN - 10)
23313d40330Schristos || !TEST_mem_eq(data, len, PACKET_data(&pkt), len))
23413d40330Schristos goto end;
23513d40330Schristos result = 1;
23613d40330Schristos end:
237c7da899bSchristos OPENSSL_free(data);
23813d40330Schristos return result;
239c7da899bSchristos }
240c7da899bSchristos
test_PACKET_strndup(void)24113d40330Schristos static int test_PACKET_strndup(void)
242c7da899bSchristos {
24313d40330Schristos char buf1[10], buf2[10];
244c7da899bSchristos char *data = NULL;
245c7da899bSchristos PACKET pkt;
24613d40330Schristos int result = 0;
247c7da899bSchristos
24813d40330Schristos memset(buf1, 'x', 10);
249c7da899bSchristos memset(buf2, 'y', 10);
250c7da899bSchristos buf2[5] = '\0';
251c7da899bSchristos
25213d40330Schristos if (!TEST_true(PACKET_buf_init(&pkt, (unsigned char*)buf1, 10))
25313d40330Schristos || !TEST_true(PACKET_strndup(&pkt, &data))
25413d40330Schristos || !TEST_size_t_eq(strlen(data), 10)
25513d40330Schristos || !TEST_strn_eq(data, buf1, 10)
25613d40330Schristos || !TEST_true(PACKET_buf_init(&pkt, (unsigned char*)buf2, 10))
25713d40330Schristos || !TEST_true(PACKET_strndup(&pkt, &data))
25813d40330Schristos || !TEST_size_t_eq(strlen(data), 5)
25913d40330Schristos || !TEST_str_eq(data, buf2))
26013d40330Schristos goto end;
26113d40330Schristos
26213d40330Schristos result = 1;
26313d40330Schristos end:
264c7da899bSchristos OPENSSL_free(data);
26513d40330Schristos return result;
266c7da899bSchristos }
267c7da899bSchristos
test_PACKET_contains_zero_byte(void)26813d40330Schristos static int test_PACKET_contains_zero_byte(void)
269c7da899bSchristos {
27013d40330Schristos char buf1[10], buf2[10];
271c7da899bSchristos PACKET pkt;
272c7da899bSchristos
27313d40330Schristos memset(buf1, 'x', 10);
274c7da899bSchristos memset(buf2, 'y', 10);
275c7da899bSchristos buf2[5] = '\0';
276c7da899bSchristos
27713d40330Schristos if (!TEST_true(PACKET_buf_init(&pkt, (unsigned char*)buf1, 10))
27813d40330Schristos || !TEST_false(PACKET_contains_zero_byte(&pkt))
27913d40330Schristos || !TEST_true(PACKET_buf_init(&pkt, (unsigned char*)buf2, 10))
28013d40330Schristos || !TEST_true(PACKET_contains_zero_byte(&pkt)))
281c7da899bSchristos return 0;
282c7da899bSchristos
283c7da899bSchristos return 1;
284c7da899bSchristos }
285c7da899bSchristos
test_PACKET_forward(void)28613d40330Schristos static int test_PACKET_forward(void)
287c7da899bSchristos {
28813d40330Schristos const unsigned char *byte = NULL;
289c7da899bSchristos PACKET pkt;
290c7da899bSchristos
29113d40330Schristos if (!TEST_true(PACKET_buf_init(&pkt, smbuf, BUF_LEN))
29213d40330Schristos || !TEST_true(PACKET_forward(&pkt, 1))
29313d40330Schristos || !TEST_true(PACKET_get_bytes(&pkt, &byte, 1))
29413d40330Schristos || !TEST_uchar_eq(byte[0], 4)
29513d40330Schristos || !TEST_true(PACKET_forward(&pkt, BUF_LEN - 3))
29613d40330Schristos || !TEST_true(PACKET_get_bytes(&pkt, &byte, 1))
29713d40330Schristos || !TEST_uchar_eq(byte[0], 0xfe))
298c7da899bSchristos return 0;
299c7da899bSchristos
300c7da899bSchristos return 1;
301c7da899bSchristos }
302c7da899bSchristos
test_PACKET_buf_init(void)30313d40330Schristos static int test_PACKET_buf_init(void)
304c7da899bSchristos {
30521497c5cSchristos unsigned char buf1[BUF_LEN] = { 0 };
306c7da899bSchristos PACKET pkt;
307c7da899bSchristos
308c7da899bSchristos /* Also tests PACKET_remaining() */
30913d40330Schristos if (!TEST_true(PACKET_buf_init(&pkt, buf1, 4))
31013d40330Schristos || !TEST_size_t_eq(PACKET_remaining(&pkt), 4)
31113d40330Schristos || !TEST_true(PACKET_buf_init(&pkt, buf1, BUF_LEN))
31213d40330Schristos || !TEST_size_t_eq(PACKET_remaining(&pkt), BUF_LEN)
31313d40330Schristos || !TEST_false(PACKET_buf_init(&pkt, buf1, -1)))
314c7da899bSchristos return 0;
315c7da899bSchristos
316c7da899bSchristos return 1;
317c7da899bSchristos }
318c7da899bSchristos
test_PACKET_null_init(void)31913d40330Schristos static int test_PACKET_null_init(void)
320c7da899bSchristos {
321c7da899bSchristos PACKET pkt;
322c7da899bSchristos
323c7da899bSchristos PACKET_null_init(&pkt);
32413d40330Schristos if (!TEST_size_t_eq(PACKET_remaining(&pkt), 0)
32513d40330Schristos || !TEST_false(PACKET_forward(&pkt, 1)))
326c7da899bSchristos return 0;
327c7da899bSchristos
328c7da899bSchristos return 1;
329c7da899bSchristos }
330c7da899bSchristos
test_PACKET_equal(void)33113d40330Schristos static int test_PACKET_equal(void)
332c7da899bSchristos {
333c7da899bSchristos PACKET pkt;
334c7da899bSchristos
33513d40330Schristos if (!TEST_true(PACKET_buf_init(&pkt, smbuf, 4))
33613d40330Schristos || !TEST_true(PACKET_equal(&pkt, smbuf, 4))
33713d40330Schristos || !TEST_false(PACKET_equal(&pkt, smbuf + 1, 4))
33813d40330Schristos || !TEST_true(PACKET_buf_init(&pkt, smbuf, BUF_LEN))
33913d40330Schristos || !TEST_true(PACKET_equal(&pkt, smbuf, BUF_LEN))
34013d40330Schristos || !TEST_false(PACKET_equal(&pkt, smbuf, BUF_LEN - 1))
34113d40330Schristos || !TEST_false(PACKET_equal(&pkt, smbuf, BUF_LEN + 1))
34213d40330Schristos || !TEST_false(PACKET_equal(&pkt, smbuf, 0)))
343c7da899bSchristos return 0;
344c7da899bSchristos
345c7da899bSchristos return 1;
346c7da899bSchristos }
347c7da899bSchristos
test_PACKET_get_length_prefixed_1(void)34813d40330Schristos static int test_PACKET_get_length_prefixed_1(void)
349c7da899bSchristos {
35013d40330Schristos unsigned char buf1[BUF_LEN];
351c7da899bSchristos const size_t len = 16;
352c7da899bSchristos unsigned int i;
353*b0d17251Schristos PACKET pkt, short_pkt, subpkt;
354c7da899bSchristos
355*b0d17251Schristos memset(&subpkt, 0, sizeof(subpkt));
35613d40330Schristos buf1[0] = (unsigned char)len;
35713d40330Schristos for (i = 1; i < BUF_LEN; i++)
35813d40330Schristos buf1[i] = (i * 2) & 0xff;
359c7da899bSchristos
36013d40330Schristos if (!TEST_true(PACKET_buf_init(&pkt, buf1, BUF_LEN))
36113d40330Schristos || !TEST_true(PACKET_buf_init(&short_pkt, buf1, len))
36213d40330Schristos || !TEST_true(PACKET_get_length_prefixed_1(&pkt, &subpkt))
36313d40330Schristos || !TEST_size_t_eq(PACKET_remaining(&subpkt), len)
36413d40330Schristos || !TEST_true(PACKET_get_net_2(&subpkt, &i))
36513d40330Schristos || !TEST_uint_eq(i, 0x0204)
36613d40330Schristos || !TEST_false(PACKET_get_length_prefixed_1(&short_pkt, &subpkt))
36713d40330Schristos || !TEST_size_t_eq(PACKET_remaining(&short_pkt), len))
368c7da899bSchristos return 0;
369c7da899bSchristos
370c7da899bSchristos return 1;
371c7da899bSchristos }
372c7da899bSchristos
test_PACKET_get_length_prefixed_2(void)37313d40330Schristos static int test_PACKET_get_length_prefixed_2(void)
374c7da899bSchristos {
37513d40330Schristos unsigned char buf1[1024];
376c7da899bSchristos const size_t len = 516; /* 0x0204 */
377c7da899bSchristos unsigned int i;
378*b0d17251Schristos PACKET pkt, short_pkt, subpkt;
379c7da899bSchristos
380*b0d17251Schristos memset(&subpkt, 0, sizeof(subpkt));
38113d40330Schristos for (i = 1; i <= 1024; i++)
38213d40330Schristos buf1[i - 1] = (i * 2) & 0xff;
383c7da899bSchristos
38413d40330Schristos if (!TEST_true(PACKET_buf_init(&pkt, buf1, 1024))
38513d40330Schristos || !TEST_true(PACKET_buf_init(&short_pkt, buf1, len))
38613d40330Schristos || !TEST_true(PACKET_get_length_prefixed_2(&pkt, &subpkt))
38713d40330Schristos || !TEST_size_t_eq(PACKET_remaining(&subpkt), len)
38813d40330Schristos || !TEST_true(PACKET_get_net_2(&subpkt, &i))
38913d40330Schristos || !TEST_uint_eq(i, 0x0608)
39013d40330Schristos || !TEST_false(PACKET_get_length_prefixed_2(&short_pkt, &subpkt))
39113d40330Schristos || !TEST_size_t_eq(PACKET_remaining(&short_pkt), len))
392c7da899bSchristos return 0;
393c7da899bSchristos
394c7da899bSchristos return 1;
395c7da899bSchristos }
396c7da899bSchristos
test_PACKET_get_length_prefixed_3(void)39713d40330Schristos static int test_PACKET_get_length_prefixed_3(void)
398c7da899bSchristos {
39913d40330Schristos unsigned char buf1[1024];
400c7da899bSchristos const size_t len = 516; /* 0x000204 */
401c7da899bSchristos unsigned int i;
402*b0d17251Schristos PACKET pkt, short_pkt, subpkt;
403c7da899bSchristos
404*b0d17251Schristos memset(&subpkt, 0, sizeof(subpkt));
40513d40330Schristos for (i = 0; i < 1024; i++)
40613d40330Schristos buf1[i] = (i * 2) & 0xff;
407c7da899bSchristos
40813d40330Schristos if (!TEST_true(PACKET_buf_init(&pkt, buf1, 1024))
40913d40330Schristos || !TEST_true(PACKET_buf_init(&short_pkt, buf1, len))
41013d40330Schristos || !TEST_true(PACKET_get_length_prefixed_3(&pkt, &subpkt))
41113d40330Schristos || !TEST_size_t_eq(PACKET_remaining(&subpkt), len)
41213d40330Schristos || !TEST_true(PACKET_get_net_2(&subpkt, &i))
41313d40330Schristos || !TEST_uint_eq(i, 0x0608)
41413d40330Schristos || !TEST_false(PACKET_get_length_prefixed_3(&short_pkt, &subpkt))
41513d40330Schristos || !TEST_size_t_eq(PACKET_remaining(&short_pkt), len))
416c7da899bSchristos return 0;
417c7da899bSchristos
418c7da899bSchristos return 1;
419c7da899bSchristos }
420c7da899bSchristos
test_PACKET_as_length_prefixed_1(void)42113d40330Schristos static int test_PACKET_as_length_prefixed_1(void)
422c7da899bSchristos {
42313d40330Schristos unsigned char buf1[BUF_LEN];
424c7da899bSchristos const size_t len = 16;
425c7da899bSchristos unsigned int i;
426*b0d17251Schristos PACKET pkt, exact_pkt, subpkt;
427c7da899bSchristos
428*b0d17251Schristos memset(&subpkt, 0, sizeof(subpkt));
42913d40330Schristos buf1[0] = (unsigned char)len;
43013d40330Schristos for (i = 1; i < BUF_LEN; i++)
43113d40330Schristos buf1[i] = (i * 2) & 0xff;
432c7da899bSchristos
43313d40330Schristos if (!TEST_true(PACKET_buf_init(&pkt, buf1, BUF_LEN))
43413d40330Schristos || !TEST_true(PACKET_buf_init(&exact_pkt, buf1, len + 1))
43513d40330Schristos || !TEST_false(PACKET_as_length_prefixed_1(&pkt, &subpkt))
43613d40330Schristos || !TEST_size_t_eq(PACKET_remaining(&pkt), BUF_LEN)
43713d40330Schristos || !TEST_true(PACKET_as_length_prefixed_1(&exact_pkt, &subpkt))
43813d40330Schristos || !TEST_size_t_eq(PACKET_remaining(&exact_pkt), 0)
43913d40330Schristos || !TEST_size_t_eq(PACKET_remaining(&subpkt), len))
440c7da899bSchristos return 0;
441c7da899bSchristos
442c7da899bSchristos return 1;
443c7da899bSchristos }
444c7da899bSchristos
test_PACKET_as_length_prefixed_2(void)44513d40330Schristos static int test_PACKET_as_length_prefixed_2(void)
446c7da899bSchristos {
447c7da899bSchristos unsigned char buf[1024];
448c7da899bSchristos const size_t len = 516; /* 0x0204 */
449c7da899bSchristos unsigned int i;
450*b0d17251Schristos PACKET pkt, exact_pkt, subpkt;
451c7da899bSchristos
452*b0d17251Schristos memset(&subpkt, 0, sizeof(subpkt));
45313d40330Schristos for (i = 1; i <= 1024; i++)
454c7da899bSchristos buf[i-1] = (i * 2) & 0xff;
455c7da899bSchristos
45613d40330Schristos if (!TEST_true(PACKET_buf_init(&pkt, buf, 1024))
45713d40330Schristos || !TEST_true(PACKET_buf_init(&exact_pkt, buf, len + 2))
45813d40330Schristos || !TEST_false(PACKET_as_length_prefixed_2(&pkt, &subpkt))
45913d40330Schristos || !TEST_size_t_eq(PACKET_remaining(&pkt), 1024)
46013d40330Schristos || !TEST_true(PACKET_as_length_prefixed_2(&exact_pkt, &subpkt))
46113d40330Schristos || !TEST_size_t_eq(PACKET_remaining(&exact_pkt), 0)
46213d40330Schristos || !TEST_size_t_eq(PACKET_remaining(&subpkt), len))
463c7da899bSchristos return 0;
464c7da899bSchristos
465c7da899bSchristos return 1;
466c7da899bSchristos }
467c7da899bSchristos
setup_tests(void)46813d40330Schristos int setup_tests(void)
469c7da899bSchristos {
470c7da899bSchristos unsigned int i;
471c7da899bSchristos
47213d40330Schristos for (i = 1; i <= BUF_LEN; i++)
47313d40330Schristos smbuf[i - 1] = (i * 2) & 0xff;
474c7da899bSchristos
47513d40330Schristos ADD_TEST(test_PACKET_buf_init);
47613d40330Schristos ADD_TEST(test_PACKET_null_init);
47713d40330Schristos ADD_TEST(test_PACKET_remaining);
47813d40330Schristos ADD_TEST(test_PACKET_end);
47913d40330Schristos ADD_TEST(test_PACKET_equal);
48013d40330Schristos ADD_TEST(test_PACKET_get_1);
48113d40330Schristos ADD_TEST(test_PACKET_get_4);
48213d40330Schristos ADD_TEST(test_PACKET_get_net_2);
48313d40330Schristos ADD_TEST(test_PACKET_get_net_3);
48413d40330Schristos ADD_TEST(test_PACKET_get_net_4);
48513d40330Schristos ADD_TEST(test_PACKET_get_sub_packet);
48613d40330Schristos ADD_TEST(test_PACKET_get_bytes);
48713d40330Schristos ADD_TEST(test_PACKET_copy_bytes);
48813d40330Schristos ADD_TEST(test_PACKET_copy_all);
48913d40330Schristos ADD_TEST(test_PACKET_memdup);
49013d40330Schristos ADD_TEST(test_PACKET_strndup);
49113d40330Schristos ADD_TEST(test_PACKET_contains_zero_byte);
49213d40330Schristos ADD_TEST(test_PACKET_forward);
49313d40330Schristos ADD_TEST(test_PACKET_get_length_prefixed_1);
49413d40330Schristos ADD_TEST(test_PACKET_get_length_prefixed_2);
49513d40330Schristos ADD_TEST(test_PACKET_get_length_prefixed_3);
49613d40330Schristos ADD_TEST(test_PACKET_as_length_prefixed_1);
49713d40330Schristos ADD_TEST(test_PACKET_as_length_prefixed_2);
498c7da899bSchristos return 1;
499c7da899bSchristos }
500