1*4724848cSchristos /*
2*4724848cSchristos * Copyright 2015-2021 The OpenSSL Project Authors. All Rights Reserved.
3*4724848cSchristos *
4*4724848cSchristos * Licensed under the OpenSSL license (the "License"). You may not use
5*4724848cSchristos * this file except in compliance with the License. You can obtain a copy
6*4724848cSchristos * in the file LICENSE in the source distribution or at
7*4724848cSchristos * https://www.openssl.org/source/license.html
8*4724848cSchristos */
9*4724848cSchristos
10*4724848cSchristos #include "../ssl/packet_local.h"
11*4724848cSchristos #include "testutil.h"
12*4724848cSchristos
13*4724848cSchristos #define BUF_LEN 255
14*4724848cSchristos
15*4724848cSchristos static unsigned char smbuf[BUF_LEN];
16*4724848cSchristos
test_PACKET_remaining(void)17*4724848cSchristos static int test_PACKET_remaining(void)
18*4724848cSchristos {
19*4724848cSchristos PACKET pkt;
20*4724848cSchristos
21*4724848cSchristos if (!TEST_true(PACKET_buf_init(&pkt, smbuf, sizeof(smbuf)))
22*4724848cSchristos || !TEST_size_t_eq(PACKET_remaining(&pkt), BUF_LEN)
23*4724848cSchristos || !TEST_true(PACKET_forward(&pkt, BUF_LEN - 1))
24*4724848cSchristos || !TEST_size_t_eq(PACKET_remaining(&pkt), 1)
25*4724848cSchristos || !TEST_true(PACKET_forward(&pkt, 1))
26*4724848cSchristos || !TEST_size_t_eq(PACKET_remaining(&pkt), 0))
27*4724848cSchristos return 0;
28*4724848cSchristos
29*4724848cSchristos return 1;
30*4724848cSchristos }
31*4724848cSchristos
test_PACKET_end(void)32*4724848cSchristos static int test_PACKET_end(void)
33*4724848cSchristos {
34*4724848cSchristos PACKET pkt;
35*4724848cSchristos
36*4724848cSchristos if (!TEST_true(PACKET_buf_init(&pkt, smbuf, sizeof(smbuf)))
37*4724848cSchristos || !TEST_size_t_eq(PACKET_remaining(&pkt), BUF_LEN)
38*4724848cSchristos || !TEST_ptr_eq(PACKET_end(&pkt), smbuf + BUF_LEN)
39*4724848cSchristos || !TEST_true(PACKET_forward(&pkt, BUF_LEN - 1))
40*4724848cSchristos || !TEST_ptr_eq(PACKET_end(&pkt), smbuf + BUF_LEN)
41*4724848cSchristos || !TEST_true(PACKET_forward(&pkt, 1))
42*4724848cSchristos || !TEST_ptr_eq(PACKET_end(&pkt), smbuf + BUF_LEN))
43*4724848cSchristos return 0;
44*4724848cSchristos
45*4724848cSchristos return 1;
46*4724848cSchristos }
47*4724848cSchristos
test_PACKET_get_1(void)48*4724848cSchristos static int test_PACKET_get_1(void)
49*4724848cSchristos {
50*4724848cSchristos unsigned int i = 0;
51*4724848cSchristos PACKET pkt;
52*4724848cSchristos
53*4724848cSchristos if (!TEST_true(PACKET_buf_init(&pkt, smbuf, BUF_LEN))
54*4724848cSchristos || !TEST_true(PACKET_get_1(&pkt, &i))
55*4724848cSchristos || !TEST_uint_eq(i, 0x02)
56*4724848cSchristos || !TEST_true(PACKET_forward(&pkt, BUF_LEN - 2))
57*4724848cSchristos || !TEST_true(PACKET_get_1(&pkt, &i))
58*4724848cSchristos || !TEST_uint_eq(i, 0xfe)
59*4724848cSchristos || !TEST_false(PACKET_get_1(&pkt, &i)))
60*4724848cSchristos return 0;
61*4724848cSchristos
62*4724848cSchristos return 1;
63*4724848cSchristos }
64*4724848cSchristos
test_PACKET_get_4(void)65*4724848cSchristos static int test_PACKET_get_4(void)
66*4724848cSchristos {
67*4724848cSchristos unsigned long i = 0;
68*4724848cSchristos PACKET pkt;
69*4724848cSchristos
70*4724848cSchristos if (!TEST_true(PACKET_buf_init(&pkt, smbuf, BUF_LEN))
71*4724848cSchristos || !TEST_true(PACKET_get_4(&pkt, &i))
72*4724848cSchristos || !TEST_ulong_eq(i, 0x08060402UL)
73*4724848cSchristos || !TEST_true(PACKET_forward(&pkt, BUF_LEN - 8))
74*4724848cSchristos || !TEST_true(PACKET_get_4(&pkt, &i))
75*4724848cSchristos || !TEST_ulong_eq(i, 0xfefcfaf8UL)
76*4724848cSchristos || !TEST_false(PACKET_get_4(&pkt, &i)))
77*4724848cSchristos return 0;
78*4724848cSchristos
79*4724848cSchristos return 1;
80*4724848cSchristos }
81*4724848cSchristos
test_PACKET_get_net_2(void)82*4724848cSchristos static int test_PACKET_get_net_2(void)
83*4724848cSchristos {
84*4724848cSchristos unsigned int i = 0;
85*4724848cSchristos PACKET pkt;
86*4724848cSchristos
87*4724848cSchristos if (!TEST_true(PACKET_buf_init(&pkt, smbuf, BUF_LEN))
88*4724848cSchristos || !TEST_true(PACKET_get_net_2(&pkt, &i))
89*4724848cSchristos || !TEST_uint_eq(i, 0x0204)
90*4724848cSchristos || !TEST_true(PACKET_forward(&pkt, BUF_LEN - 4))
91*4724848cSchristos || !TEST_true(PACKET_get_net_2(&pkt, &i))
92*4724848cSchristos || !TEST_uint_eq(i, 0xfcfe)
93*4724848cSchristos || !TEST_false(PACKET_get_net_2(&pkt, &i)))
94*4724848cSchristos return 0;
95*4724848cSchristos
96*4724848cSchristos return 1;
97*4724848cSchristos }
98*4724848cSchristos
test_PACKET_get_net_3(void)99*4724848cSchristos static int test_PACKET_get_net_3(void)
100*4724848cSchristos {
101*4724848cSchristos unsigned long i = 0;
102*4724848cSchristos PACKET pkt;
103*4724848cSchristos
104*4724848cSchristos if (!TEST_true(PACKET_buf_init(&pkt, smbuf, BUF_LEN))
105*4724848cSchristos || !TEST_true(PACKET_get_net_3(&pkt, &i))
106*4724848cSchristos || !TEST_ulong_eq(i, 0x020406UL)
107*4724848cSchristos || !TEST_true(PACKET_forward(&pkt, BUF_LEN - 6))
108*4724848cSchristos || !TEST_true(PACKET_get_net_3(&pkt, &i))
109*4724848cSchristos || !TEST_ulong_eq(i, 0xfafcfeUL)
110*4724848cSchristos || !TEST_false(PACKET_get_net_3(&pkt, &i)))
111*4724848cSchristos return 0;
112*4724848cSchristos
113*4724848cSchristos return 1;
114*4724848cSchristos }
115*4724848cSchristos
test_PACKET_get_net_4(void)116*4724848cSchristos static int test_PACKET_get_net_4(void)
117*4724848cSchristos {
118*4724848cSchristos unsigned long i = 0;
119*4724848cSchristos PACKET pkt;
120*4724848cSchristos
121*4724848cSchristos if (!TEST_true(PACKET_buf_init(&pkt, smbuf, BUF_LEN))
122*4724848cSchristos || !TEST_true(PACKET_get_net_4(&pkt, &i))
123*4724848cSchristos || !TEST_ulong_eq(i, 0x02040608UL)
124*4724848cSchristos || !TEST_true(PACKET_forward(&pkt, BUF_LEN - 8))
125*4724848cSchristos || !TEST_true(PACKET_get_net_4(&pkt, &i))
126*4724848cSchristos || !TEST_ulong_eq(i, 0xf8fafcfeUL)
127*4724848cSchristos || !TEST_false(PACKET_get_net_4(&pkt, &i)))
128*4724848cSchristos return 0;
129*4724848cSchristos
130*4724848cSchristos return 1;
131*4724848cSchristos }
132*4724848cSchristos
test_PACKET_get_sub_packet(void)133*4724848cSchristos static int test_PACKET_get_sub_packet(void)
134*4724848cSchristos {
135*4724848cSchristos PACKET pkt, subpkt;
136*4724848cSchristos unsigned long i = 0;
137*4724848cSchristos
138*4724848cSchristos if (!TEST_true(PACKET_buf_init(&pkt, smbuf, BUF_LEN))
139*4724848cSchristos || !TEST_true(PACKET_get_sub_packet(&pkt, &subpkt, 4))
140*4724848cSchristos || !TEST_true(PACKET_get_net_4(&subpkt, &i))
141*4724848cSchristos || !TEST_ulong_eq(i, 0x02040608UL)
142*4724848cSchristos || !TEST_size_t_eq(PACKET_remaining(&subpkt), 0)
143*4724848cSchristos || !TEST_true(PACKET_forward(&pkt, BUF_LEN - 8))
144*4724848cSchristos || !TEST_true(PACKET_get_sub_packet(&pkt, &subpkt, 4))
145*4724848cSchristos || !TEST_true(PACKET_get_net_4(&subpkt, &i))
146*4724848cSchristos || !TEST_ulong_eq(i, 0xf8fafcfeUL)
147*4724848cSchristos || !TEST_size_t_eq(PACKET_remaining(&subpkt), 0)
148*4724848cSchristos || !TEST_false(PACKET_get_sub_packet(&pkt, &subpkt, 4)))
149*4724848cSchristos return 0;
150*4724848cSchristos
151*4724848cSchristos return 1;
152*4724848cSchristos }
153*4724848cSchristos
test_PACKET_get_bytes(void)154*4724848cSchristos static int test_PACKET_get_bytes(void)
155*4724848cSchristos {
156*4724848cSchristos const unsigned char *bytes = NULL;
157*4724848cSchristos PACKET pkt;
158*4724848cSchristos
159*4724848cSchristos if (!TEST_true(PACKET_buf_init(&pkt, smbuf, BUF_LEN))
160*4724848cSchristos || !TEST_true(PACKET_get_bytes(&pkt, &bytes, 4))
161*4724848cSchristos || !TEST_uchar_eq(bytes[0], 2)
162*4724848cSchristos || !TEST_uchar_eq(bytes[1], 4)
163*4724848cSchristos || !TEST_uchar_eq(bytes[2], 6)
164*4724848cSchristos || !TEST_uchar_eq(bytes[3], 8)
165*4724848cSchristos || !TEST_size_t_eq(PACKET_remaining(&pkt), BUF_LEN -4)
166*4724848cSchristos || !TEST_true(PACKET_forward(&pkt, BUF_LEN - 8))
167*4724848cSchristos || !TEST_true(PACKET_get_bytes(&pkt, &bytes, 4))
168*4724848cSchristos || !TEST_uchar_eq(bytes[0], 0xf8)
169*4724848cSchristos || !TEST_uchar_eq(bytes[1], 0xfa)
170*4724848cSchristos || !TEST_uchar_eq(bytes[2], 0xfc)
171*4724848cSchristos || !TEST_uchar_eq(bytes[3], 0xfe)
172*4724848cSchristos || !TEST_false(PACKET_remaining(&pkt)))
173*4724848cSchristos return 0;
174*4724848cSchristos
175*4724848cSchristos return 1;
176*4724848cSchristos }
177*4724848cSchristos
test_PACKET_copy_bytes(void)178*4724848cSchristos static int test_PACKET_copy_bytes(void)
179*4724848cSchristos {
180*4724848cSchristos unsigned char bytes[4];
181*4724848cSchristos PACKET pkt;
182*4724848cSchristos
183*4724848cSchristos if (!TEST_true(PACKET_buf_init(&pkt, smbuf, BUF_LEN))
184*4724848cSchristos || !TEST_true(PACKET_copy_bytes(&pkt, bytes, 4))
185*4724848cSchristos || !TEST_char_eq(bytes[0], 2)
186*4724848cSchristos || !TEST_char_eq(bytes[1], 4)
187*4724848cSchristos || !TEST_char_eq(bytes[2], 6)
188*4724848cSchristos || !TEST_char_eq(bytes[3], 8)
189*4724848cSchristos || !TEST_size_t_eq(PACKET_remaining(&pkt), BUF_LEN - 4)
190*4724848cSchristos || !TEST_true(PACKET_forward(&pkt, BUF_LEN - 8))
191*4724848cSchristos || !TEST_true(PACKET_copy_bytes(&pkt, bytes, 4))
192*4724848cSchristos || !TEST_uchar_eq(bytes[0], 0xf8)
193*4724848cSchristos || !TEST_uchar_eq(bytes[1], 0xfa)
194*4724848cSchristos || !TEST_uchar_eq(bytes[2], 0xfc)
195*4724848cSchristos || !TEST_uchar_eq(bytes[3], 0xfe)
196*4724848cSchristos || !TEST_false(PACKET_remaining(&pkt)))
197*4724848cSchristos return 0;
198*4724848cSchristos
199*4724848cSchristos return 1;
200*4724848cSchristos }
201*4724848cSchristos
test_PACKET_copy_all(void)202*4724848cSchristos static int test_PACKET_copy_all(void)
203*4724848cSchristos {
204*4724848cSchristos unsigned char tmp[BUF_LEN];
205*4724848cSchristos PACKET pkt;
206*4724848cSchristos size_t len;
207*4724848cSchristos
208*4724848cSchristos if (!TEST_true(PACKET_buf_init(&pkt, smbuf, BUF_LEN))
209*4724848cSchristos || !TEST_true(PACKET_copy_all(&pkt, tmp, BUF_LEN, &len))
210*4724848cSchristos || !TEST_size_t_eq(len, BUF_LEN)
211*4724848cSchristos || !TEST_mem_eq(smbuf, BUF_LEN, tmp, BUF_LEN)
212*4724848cSchristos || !TEST_size_t_eq(PACKET_remaining(&pkt), BUF_LEN)
213*4724848cSchristos || !TEST_false(PACKET_copy_all(&pkt, tmp, BUF_LEN - 1, &len)))
214*4724848cSchristos return 0;
215*4724848cSchristos
216*4724848cSchristos return 1;
217*4724848cSchristos }
218*4724848cSchristos
test_PACKET_memdup(void)219*4724848cSchristos static int test_PACKET_memdup(void)
220*4724848cSchristos {
221*4724848cSchristos unsigned char *data = NULL;
222*4724848cSchristos size_t len;
223*4724848cSchristos PACKET pkt;
224*4724848cSchristos int result = 0;
225*4724848cSchristos
226*4724848cSchristos if (!TEST_true(PACKET_buf_init(&pkt, smbuf, BUF_LEN))
227*4724848cSchristos || !TEST_true(PACKET_memdup(&pkt, &data, &len))
228*4724848cSchristos || !TEST_size_t_eq(len, BUF_LEN)
229*4724848cSchristos || !TEST_mem_eq(data, len, PACKET_data(&pkt), len)
230*4724848cSchristos || !TEST_true(PACKET_forward(&pkt, 10))
231*4724848cSchristos || !TEST_true(PACKET_memdup(&pkt, &data, &len))
232*4724848cSchristos || !TEST_size_t_eq(len, BUF_LEN - 10)
233*4724848cSchristos || !TEST_mem_eq(data, len, PACKET_data(&pkt), len))
234*4724848cSchristos goto end;
235*4724848cSchristos result = 1;
236*4724848cSchristos end:
237*4724848cSchristos OPENSSL_free(data);
238*4724848cSchristos return result;
239*4724848cSchristos }
240*4724848cSchristos
test_PACKET_strndup(void)241*4724848cSchristos static int test_PACKET_strndup(void)
242*4724848cSchristos {
243*4724848cSchristos char buf1[10], buf2[10];
244*4724848cSchristos char *data = NULL;
245*4724848cSchristos PACKET pkt;
246*4724848cSchristos int result = 0;
247*4724848cSchristos
248*4724848cSchristos memset(buf1, 'x', 10);
249*4724848cSchristos memset(buf2, 'y', 10);
250*4724848cSchristos buf2[5] = '\0';
251*4724848cSchristos
252*4724848cSchristos if (!TEST_true(PACKET_buf_init(&pkt, (unsigned char*)buf1, 10))
253*4724848cSchristos || !TEST_true(PACKET_strndup(&pkt, &data))
254*4724848cSchristos || !TEST_size_t_eq(strlen(data), 10)
255*4724848cSchristos || !TEST_strn_eq(data, buf1, 10)
256*4724848cSchristos || !TEST_true(PACKET_buf_init(&pkt, (unsigned char*)buf2, 10))
257*4724848cSchristos || !TEST_true(PACKET_strndup(&pkt, &data))
258*4724848cSchristos || !TEST_size_t_eq(strlen(data), 5)
259*4724848cSchristos || !TEST_str_eq(data, buf2))
260*4724848cSchristos goto end;
261*4724848cSchristos
262*4724848cSchristos result = 1;
263*4724848cSchristos end:
264*4724848cSchristos OPENSSL_free(data);
265*4724848cSchristos return result;
266*4724848cSchristos }
267*4724848cSchristos
test_PACKET_contains_zero_byte(void)268*4724848cSchristos static int test_PACKET_contains_zero_byte(void)
269*4724848cSchristos {
270*4724848cSchristos char buf1[10], buf2[10];
271*4724848cSchristos PACKET pkt;
272*4724848cSchristos
273*4724848cSchristos memset(buf1, 'x', 10);
274*4724848cSchristos memset(buf2, 'y', 10);
275*4724848cSchristos buf2[5] = '\0';
276*4724848cSchristos
277*4724848cSchristos if (!TEST_true(PACKET_buf_init(&pkt, (unsigned char*)buf1, 10))
278*4724848cSchristos || !TEST_false(PACKET_contains_zero_byte(&pkt))
279*4724848cSchristos || !TEST_true(PACKET_buf_init(&pkt, (unsigned char*)buf2, 10))
280*4724848cSchristos || !TEST_true(PACKET_contains_zero_byte(&pkt)))
281*4724848cSchristos return 0;
282*4724848cSchristos
283*4724848cSchristos return 1;
284*4724848cSchristos }
285*4724848cSchristos
test_PACKET_forward(void)286*4724848cSchristos static int test_PACKET_forward(void)
287*4724848cSchristos {
288*4724848cSchristos const unsigned char *byte = NULL;
289*4724848cSchristos PACKET pkt;
290*4724848cSchristos
291*4724848cSchristos if (!TEST_true(PACKET_buf_init(&pkt, smbuf, BUF_LEN))
292*4724848cSchristos || !TEST_true(PACKET_forward(&pkt, 1))
293*4724848cSchristos || !TEST_true(PACKET_get_bytes(&pkt, &byte, 1))
294*4724848cSchristos || !TEST_uchar_eq(byte[0], 4)
295*4724848cSchristos || !TEST_true(PACKET_forward(&pkt, BUF_LEN - 3))
296*4724848cSchristos || !TEST_true(PACKET_get_bytes(&pkt, &byte, 1))
297*4724848cSchristos || !TEST_uchar_eq(byte[0], 0xfe))
298*4724848cSchristos return 0;
299*4724848cSchristos
300*4724848cSchristos return 1;
301*4724848cSchristos }
302*4724848cSchristos
test_PACKET_buf_init(void)303*4724848cSchristos static int test_PACKET_buf_init(void)
304*4724848cSchristos {
305*4724848cSchristos unsigned char buf1[BUF_LEN] = { 0 };
306*4724848cSchristos PACKET pkt;
307*4724848cSchristos
308*4724848cSchristos /* Also tests PACKET_remaining() */
309*4724848cSchristos if (!TEST_true(PACKET_buf_init(&pkt, buf1, 4))
310*4724848cSchristos || !TEST_size_t_eq(PACKET_remaining(&pkt), 4)
311*4724848cSchristos || !TEST_true(PACKET_buf_init(&pkt, buf1, BUF_LEN))
312*4724848cSchristos || !TEST_size_t_eq(PACKET_remaining(&pkt), BUF_LEN)
313*4724848cSchristos || !TEST_false(PACKET_buf_init(&pkt, buf1, -1)))
314*4724848cSchristos return 0;
315*4724848cSchristos
316*4724848cSchristos return 1;
317*4724848cSchristos }
318*4724848cSchristos
test_PACKET_null_init(void)319*4724848cSchristos static int test_PACKET_null_init(void)
320*4724848cSchristos {
321*4724848cSchristos PACKET pkt;
322*4724848cSchristos
323*4724848cSchristos PACKET_null_init(&pkt);
324*4724848cSchristos if (!TEST_size_t_eq(PACKET_remaining(&pkt), 0)
325*4724848cSchristos || !TEST_false(PACKET_forward(&pkt, 1)))
326*4724848cSchristos return 0;
327*4724848cSchristos
328*4724848cSchristos return 1;
329*4724848cSchristos }
330*4724848cSchristos
test_PACKET_equal(void)331*4724848cSchristos static int test_PACKET_equal(void)
332*4724848cSchristos {
333*4724848cSchristos PACKET pkt;
334*4724848cSchristos
335*4724848cSchristos if (!TEST_true(PACKET_buf_init(&pkt, smbuf, 4))
336*4724848cSchristos || !TEST_true(PACKET_equal(&pkt, smbuf, 4))
337*4724848cSchristos || !TEST_false(PACKET_equal(&pkt, smbuf + 1, 4))
338*4724848cSchristos || !TEST_true(PACKET_buf_init(&pkt, smbuf, BUF_LEN))
339*4724848cSchristos || !TEST_true(PACKET_equal(&pkt, smbuf, BUF_LEN))
340*4724848cSchristos || !TEST_false(PACKET_equal(&pkt, smbuf, BUF_LEN - 1))
341*4724848cSchristos || !TEST_false(PACKET_equal(&pkt, smbuf, BUF_LEN + 1))
342*4724848cSchristos || !TEST_false(PACKET_equal(&pkt, smbuf, 0)))
343*4724848cSchristos return 0;
344*4724848cSchristos
345*4724848cSchristos return 1;
346*4724848cSchristos }
347*4724848cSchristos
test_PACKET_get_length_prefixed_1(void)348*4724848cSchristos static int test_PACKET_get_length_prefixed_1(void)
349*4724848cSchristos {
350*4724848cSchristos unsigned char buf1[BUF_LEN];
351*4724848cSchristos const size_t len = 16;
352*4724848cSchristos unsigned int i;
353*4724848cSchristos PACKET pkt, short_pkt, subpkt = {0};
354*4724848cSchristos
355*4724848cSchristos buf1[0] = (unsigned char)len;
356*4724848cSchristos for (i = 1; i < BUF_LEN; i++)
357*4724848cSchristos buf1[i] = (i * 2) & 0xff;
358*4724848cSchristos
359*4724848cSchristos if (!TEST_true(PACKET_buf_init(&pkt, buf1, BUF_LEN))
360*4724848cSchristos || !TEST_true(PACKET_buf_init(&short_pkt, buf1, len))
361*4724848cSchristos || !TEST_true(PACKET_get_length_prefixed_1(&pkt, &subpkt))
362*4724848cSchristos || !TEST_size_t_eq(PACKET_remaining(&subpkt), len)
363*4724848cSchristos || !TEST_true(PACKET_get_net_2(&subpkt, &i))
364*4724848cSchristos || !TEST_uint_eq(i, 0x0204)
365*4724848cSchristos || !TEST_false(PACKET_get_length_prefixed_1(&short_pkt, &subpkt))
366*4724848cSchristos || !TEST_size_t_eq(PACKET_remaining(&short_pkt), len))
367*4724848cSchristos return 0;
368*4724848cSchristos
369*4724848cSchristos return 1;
370*4724848cSchristos }
371*4724848cSchristos
test_PACKET_get_length_prefixed_2(void)372*4724848cSchristos static int test_PACKET_get_length_prefixed_2(void)
373*4724848cSchristos {
374*4724848cSchristos unsigned char buf1[1024];
375*4724848cSchristos const size_t len = 516; /* 0x0204 */
376*4724848cSchristos unsigned int i;
377*4724848cSchristos PACKET pkt, short_pkt, subpkt = {0};
378*4724848cSchristos
379*4724848cSchristos for (i = 1; i <= 1024; i++)
380*4724848cSchristos buf1[i - 1] = (i * 2) & 0xff;
381*4724848cSchristos
382*4724848cSchristos if (!TEST_true(PACKET_buf_init(&pkt, buf1, 1024))
383*4724848cSchristos || !TEST_true(PACKET_buf_init(&short_pkt, buf1, len))
384*4724848cSchristos || !TEST_true(PACKET_get_length_prefixed_2(&pkt, &subpkt))
385*4724848cSchristos || !TEST_size_t_eq(PACKET_remaining(&subpkt), len)
386*4724848cSchristos || !TEST_true(PACKET_get_net_2(&subpkt, &i))
387*4724848cSchristos || !TEST_uint_eq(i, 0x0608)
388*4724848cSchristos || !TEST_false(PACKET_get_length_prefixed_2(&short_pkt, &subpkt))
389*4724848cSchristos || !TEST_size_t_eq(PACKET_remaining(&short_pkt), len))
390*4724848cSchristos return 0;
391*4724848cSchristos
392*4724848cSchristos return 1;
393*4724848cSchristos }
394*4724848cSchristos
test_PACKET_get_length_prefixed_3(void)395*4724848cSchristos static int test_PACKET_get_length_prefixed_3(void)
396*4724848cSchristos {
397*4724848cSchristos unsigned char buf1[1024];
398*4724848cSchristos const size_t len = 516; /* 0x000204 */
399*4724848cSchristos unsigned int i;
400*4724848cSchristos PACKET pkt, short_pkt, subpkt = {0};
401*4724848cSchristos
402*4724848cSchristos for (i = 0; i < 1024; i++)
403*4724848cSchristos buf1[i] = (i * 2) & 0xff;
404*4724848cSchristos
405*4724848cSchristos if (!TEST_true(PACKET_buf_init(&pkt, buf1, 1024))
406*4724848cSchristos || !TEST_true(PACKET_buf_init(&short_pkt, buf1, len))
407*4724848cSchristos || !TEST_true(PACKET_get_length_prefixed_3(&pkt, &subpkt))
408*4724848cSchristos || !TEST_size_t_eq(PACKET_remaining(&subpkt), len)
409*4724848cSchristos || !TEST_true(PACKET_get_net_2(&subpkt, &i))
410*4724848cSchristos || !TEST_uint_eq(i, 0x0608)
411*4724848cSchristos || !TEST_false(PACKET_get_length_prefixed_3(&short_pkt, &subpkt))
412*4724848cSchristos || !TEST_size_t_eq(PACKET_remaining(&short_pkt), len))
413*4724848cSchristos return 0;
414*4724848cSchristos
415*4724848cSchristos return 1;
416*4724848cSchristos }
417*4724848cSchristos
test_PACKET_as_length_prefixed_1(void)418*4724848cSchristos static int test_PACKET_as_length_prefixed_1(void)
419*4724848cSchristos {
420*4724848cSchristos unsigned char buf1[BUF_LEN];
421*4724848cSchristos const size_t len = 16;
422*4724848cSchristos unsigned int i;
423*4724848cSchristos PACKET pkt, exact_pkt, subpkt = {0};
424*4724848cSchristos
425*4724848cSchristos buf1[0] = (unsigned char)len;
426*4724848cSchristos for (i = 1; i < BUF_LEN; i++)
427*4724848cSchristos buf1[i] = (i * 2) & 0xff;
428*4724848cSchristos
429*4724848cSchristos if (!TEST_true(PACKET_buf_init(&pkt, buf1, BUF_LEN))
430*4724848cSchristos || !TEST_true(PACKET_buf_init(&exact_pkt, buf1, len + 1))
431*4724848cSchristos || !TEST_false(PACKET_as_length_prefixed_1(&pkt, &subpkt))
432*4724848cSchristos || !TEST_size_t_eq(PACKET_remaining(&pkt), BUF_LEN)
433*4724848cSchristos || !TEST_true(PACKET_as_length_prefixed_1(&exact_pkt, &subpkt))
434*4724848cSchristos || !TEST_size_t_eq(PACKET_remaining(&exact_pkt), 0)
435*4724848cSchristos || !TEST_size_t_eq(PACKET_remaining(&subpkt), len))
436*4724848cSchristos return 0;
437*4724848cSchristos
438*4724848cSchristos return 1;
439*4724848cSchristos }
440*4724848cSchristos
test_PACKET_as_length_prefixed_2(void)441*4724848cSchristos static int test_PACKET_as_length_prefixed_2(void)
442*4724848cSchristos {
443*4724848cSchristos unsigned char buf[1024];
444*4724848cSchristos const size_t len = 516; /* 0x0204 */
445*4724848cSchristos unsigned int i;
446*4724848cSchristos PACKET pkt, exact_pkt, subpkt = {0};
447*4724848cSchristos
448*4724848cSchristos for (i = 1; i <= 1024; i++)
449*4724848cSchristos buf[i-1] = (i * 2) & 0xff;
450*4724848cSchristos
451*4724848cSchristos if (!TEST_true(PACKET_buf_init(&pkt, buf, 1024))
452*4724848cSchristos || !TEST_true(PACKET_buf_init(&exact_pkt, buf, len + 2))
453*4724848cSchristos || !TEST_false(PACKET_as_length_prefixed_2(&pkt, &subpkt))
454*4724848cSchristos || !TEST_size_t_eq(PACKET_remaining(&pkt), 1024)
455*4724848cSchristos || !TEST_true(PACKET_as_length_prefixed_2(&exact_pkt, &subpkt))
456*4724848cSchristos || !TEST_size_t_eq(PACKET_remaining(&exact_pkt), 0)
457*4724848cSchristos || !TEST_size_t_eq(PACKET_remaining(&subpkt), len))
458*4724848cSchristos return 0;
459*4724848cSchristos
460*4724848cSchristos return 1;
461*4724848cSchristos }
462*4724848cSchristos
setup_tests(void)463*4724848cSchristos int setup_tests(void)
464*4724848cSchristos {
465*4724848cSchristos unsigned int i;
466*4724848cSchristos
467*4724848cSchristos for (i = 1; i <= BUF_LEN; i++)
468*4724848cSchristos smbuf[i - 1] = (i * 2) & 0xff;
469*4724848cSchristos
470*4724848cSchristos ADD_TEST(test_PACKET_buf_init);
471*4724848cSchristos ADD_TEST(test_PACKET_null_init);
472*4724848cSchristos ADD_TEST(test_PACKET_remaining);
473*4724848cSchristos ADD_TEST(test_PACKET_end);
474*4724848cSchristos ADD_TEST(test_PACKET_equal);
475*4724848cSchristos ADD_TEST(test_PACKET_get_1);
476*4724848cSchristos ADD_TEST(test_PACKET_get_4);
477*4724848cSchristos ADD_TEST(test_PACKET_get_net_2);
478*4724848cSchristos ADD_TEST(test_PACKET_get_net_3);
479*4724848cSchristos ADD_TEST(test_PACKET_get_net_4);
480*4724848cSchristos ADD_TEST(test_PACKET_get_sub_packet);
481*4724848cSchristos ADD_TEST(test_PACKET_get_bytes);
482*4724848cSchristos ADD_TEST(test_PACKET_copy_bytes);
483*4724848cSchristos ADD_TEST(test_PACKET_copy_all);
484*4724848cSchristos ADD_TEST(test_PACKET_memdup);
485*4724848cSchristos ADD_TEST(test_PACKET_strndup);
486*4724848cSchristos ADD_TEST(test_PACKET_contains_zero_byte);
487*4724848cSchristos ADD_TEST(test_PACKET_forward);
488*4724848cSchristos ADD_TEST(test_PACKET_get_length_prefixed_1);
489*4724848cSchristos ADD_TEST(test_PACKET_get_length_prefixed_2);
490*4724848cSchristos ADD_TEST(test_PACKET_get_length_prefixed_3);
491*4724848cSchristos ADD_TEST(test_PACKET_as_length_prefixed_1);
492*4724848cSchristos ADD_TEST(test_PACKET_as_length_prefixed_2);
493*4724848cSchristos return 1;
494*4724848cSchristos }
495