2 * Copyright 2015-2023 The OpenSSL Project Authors. All Rights Reserved.
4 * Licensed under the Apache License 2.0 (the "License"). You may not use
5 * this file except in compliance with the License. You can obtain a copy
6 * in the file LICENSE in the source distribution or at
7 * https://www.openssl.org/source/license.html
10 #include "internal/packet_quic.h"
15 static unsigned char smbuf
[BUF_LEN
+ 1];
17 static int test_PACKET_remaining(void)
21 if (!TEST_true(PACKET_buf_init(&pkt
, smbuf
, BUF_LEN
))
22 || !TEST_size_t_eq(PACKET_remaining(&pkt
), BUF_LEN
)
23 || !TEST_true(PACKET_forward(&pkt
, BUF_LEN
- 1))
24 || !TEST_size_t_eq(PACKET_remaining(&pkt
), 1)
25 || !TEST_true(PACKET_forward(&pkt
, 1))
26 || !TEST_size_t_eq(PACKET_remaining(&pkt
), 0))
32 static int test_PACKET_end(void)
36 if (!TEST_true(PACKET_buf_init(&pkt
, smbuf
, BUF_LEN
))
37 || !TEST_size_t_eq(PACKET_remaining(&pkt
), BUF_LEN
)
38 || !TEST_ptr_eq(PACKET_end(&pkt
), smbuf
+ BUF_LEN
)
39 || !TEST_true(PACKET_forward(&pkt
, BUF_LEN
- 1))
40 || !TEST_ptr_eq(PACKET_end(&pkt
), smbuf
+ BUF_LEN
)
41 || !TEST_true(PACKET_forward(&pkt
, 1))
42 || !TEST_ptr_eq(PACKET_end(&pkt
), smbuf
+ BUF_LEN
))
48 static int test_PACKET_get_1(void)
53 if (!TEST_true(PACKET_buf_init(&pkt
, smbuf
, BUF_LEN
))
54 || !TEST_true(PACKET_get_1(&pkt
, &i
))
55 || !TEST_uint_eq(i
, 0x02)
56 || !TEST_true(PACKET_forward(&pkt
, BUF_LEN
- 2))
57 || !TEST_true(PACKET_get_1(&pkt
, &i
))
58 || !TEST_uint_eq(i
, 0xfe)
59 || !TEST_false(PACKET_get_1(&pkt
, &i
)))
65 static int test_PACKET_get_4(void)
70 if (!TEST_true(PACKET_buf_init(&pkt
, smbuf
, BUF_LEN
))
71 || !TEST_true(PACKET_get_4(&pkt
, &i
))
72 || !TEST_ulong_eq(i
, 0x08060402UL
)
73 || !TEST_true(PACKET_forward(&pkt
, BUF_LEN
- 8))
74 || !TEST_true(PACKET_get_4(&pkt
, &i
))
75 || !TEST_ulong_eq(i
, 0xfefcfaf8UL
)
76 || !TEST_false(PACKET_get_4(&pkt
, &i
)))
82 static int test_PACKET_get_net_2(void)
87 if (!TEST_true(PACKET_buf_init(&pkt
, smbuf
, BUF_LEN
))
88 || !TEST_true(PACKET_get_net_2(&pkt
, &i
))
89 || !TEST_uint_eq(i
, 0x0204)
90 || !TEST_true(PACKET_forward(&pkt
, BUF_LEN
- 4))
91 || !TEST_true(PACKET_get_net_2(&pkt
, &i
))
92 || !TEST_uint_eq(i
, 0xfcfe)
93 || !TEST_false(PACKET_get_net_2(&pkt
, &i
)))
99 static int test_PACKET_get_net_3(void)
104 if (!TEST_true(PACKET_buf_init(&pkt
, smbuf
, BUF_LEN
))
105 || !TEST_true(PACKET_get_net_3(&pkt
, &i
))
106 || !TEST_ulong_eq(i
, 0x020406UL
)
107 || !TEST_true(PACKET_forward(&pkt
, BUF_LEN
- 6))
108 || !TEST_true(PACKET_get_net_3(&pkt
, &i
))
109 || !TEST_ulong_eq(i
, 0xfafcfeUL
)
110 || !TEST_false(PACKET_get_net_3(&pkt
, &i
)))
116 static int test_PACKET_get_net_4(void)
121 if (!TEST_true(PACKET_buf_init(&pkt
, smbuf
, BUF_LEN
))
122 || !TEST_true(PACKET_get_net_4(&pkt
, &i
))
123 || !TEST_ulong_eq(i
, 0x02040608UL
)
124 || !TEST_true(PACKET_forward(&pkt
, BUF_LEN
- 8))
125 || !TEST_true(PACKET_get_net_4(&pkt
, &i
))
126 || !TEST_ulong_eq(i
, 0xf8fafcfeUL
)
127 || !TEST_false(PACKET_get_net_4(&pkt
, &i
)))
133 static int test_PACKET_get_sub_packet(void)
138 if (!TEST_true(PACKET_buf_init(&pkt
, smbuf
, BUF_LEN
))
139 || !TEST_true(PACKET_get_sub_packet(&pkt
, &subpkt
, 4))
140 || !TEST_true(PACKET_get_net_4(&subpkt
, &i
))
141 || !TEST_ulong_eq(i
, 0x02040608UL
)
142 || !TEST_size_t_eq(PACKET_remaining(&subpkt
), 0)
143 || !TEST_true(PACKET_forward(&pkt
, BUF_LEN
- 8))
144 || !TEST_true(PACKET_get_sub_packet(&pkt
, &subpkt
, 4))
145 || !TEST_true(PACKET_get_net_4(&subpkt
, &i
))
146 || !TEST_ulong_eq(i
, 0xf8fafcfeUL
)
147 || !TEST_size_t_eq(PACKET_remaining(&subpkt
), 0)
148 || !TEST_false(PACKET_get_sub_packet(&pkt
, &subpkt
, 4)))
154 static int test_PACKET_get_bytes(void)
156 const unsigned char *bytes
= NULL
;
159 if (!TEST_true(PACKET_buf_init(&pkt
, smbuf
, BUF_LEN
))
160 || !TEST_true(PACKET_get_bytes(&pkt
, &bytes
, 4))
161 || !TEST_uchar_eq(bytes
[0], 2)
162 || !TEST_uchar_eq(bytes
[1], 4)
163 || !TEST_uchar_eq(bytes
[2], 6)
164 || !TEST_uchar_eq(bytes
[3], 8)
165 || !TEST_size_t_eq(PACKET_remaining(&pkt
), BUF_LEN
-4)
166 || !TEST_true(PACKET_forward(&pkt
, BUF_LEN
- 8))
167 || !TEST_true(PACKET_get_bytes(&pkt
, &bytes
, 4))
168 || !TEST_uchar_eq(bytes
[0], 0xf8)
169 || !TEST_uchar_eq(bytes
[1], 0xfa)
170 || !TEST_uchar_eq(bytes
[2], 0xfc)
171 || !TEST_uchar_eq(bytes
[3], 0xfe)
172 || !TEST_false(PACKET_remaining(&pkt
)))
178 static int test_PACKET_copy_bytes(void)
180 unsigned char bytes
[4];
183 if (!TEST_true(PACKET_buf_init(&pkt
, smbuf
, BUF_LEN
))
184 || !TEST_true(PACKET_copy_bytes(&pkt
, bytes
, 4))
185 || !TEST_char_eq(bytes
[0], 2)
186 || !TEST_char_eq(bytes
[1], 4)
187 || !TEST_char_eq(bytes
[2], 6)
188 || !TEST_char_eq(bytes
[3], 8)
189 || !TEST_size_t_eq(PACKET_remaining(&pkt
), BUF_LEN
- 4)
190 || !TEST_true(PACKET_forward(&pkt
, BUF_LEN
- 8))
191 || !TEST_true(PACKET_copy_bytes(&pkt
, bytes
, 4))
192 || !TEST_uchar_eq(bytes
[0], 0xf8)
193 || !TEST_uchar_eq(bytes
[1], 0xfa)
194 || !TEST_uchar_eq(bytes
[2], 0xfc)
195 || !TEST_uchar_eq(bytes
[3], 0xfe)
196 || !TEST_false(PACKET_remaining(&pkt
)))
202 static int test_PACKET_copy_all(void)
204 unsigned char tmp
[BUF_LEN
];
208 if (!TEST_true(PACKET_buf_init(&pkt
, smbuf
, BUF_LEN
))
209 || !TEST_true(PACKET_copy_all(&pkt
, tmp
, BUF_LEN
, &len
))
210 || !TEST_size_t_eq(len
, BUF_LEN
)
211 || !TEST_mem_eq(smbuf
, BUF_LEN
, tmp
, BUF_LEN
)
212 || !TEST_size_t_eq(PACKET_remaining(&pkt
), BUF_LEN
)
213 || !TEST_false(PACKET_copy_all(&pkt
, tmp
, BUF_LEN
- 1, &len
)))
219 static int test_PACKET_memdup(void)
221 unsigned char *data
= NULL
;
226 if (!TEST_true(PACKET_buf_init(&pkt
, smbuf
, BUF_LEN
))
227 || !TEST_true(PACKET_memdup(&pkt
, &data
, &len
))
228 || !TEST_size_t_eq(len
, BUF_LEN
)
229 || !TEST_mem_eq(data
, len
, PACKET_data(&pkt
), len
)
230 || !TEST_true(PACKET_forward(&pkt
, 10))
231 || !TEST_true(PACKET_memdup(&pkt
, &data
, &len
))
232 || !TEST_size_t_eq(len
, BUF_LEN
- 10)
233 || !TEST_mem_eq(data
, len
, PACKET_data(&pkt
), len
))
241 static int test_PACKET_strndup(void)
243 char buf1
[10], buf2
[10];
248 memset(buf1
, 'x', 10);
249 memset(buf2
, 'y', 10);
252 if (!TEST_true(PACKET_buf_init(&pkt
, (unsigned char*)buf1
, 10))
253 || !TEST_true(PACKET_strndup(&pkt
, &data
))
254 || !TEST_size_t_eq(strlen(data
), 10)
255 || !TEST_strn_eq(data
, buf1
, 10)
256 || !TEST_true(PACKET_buf_init(&pkt
, (unsigned char*)buf2
, 10))
257 || !TEST_true(PACKET_strndup(&pkt
, &data
))
258 || !TEST_size_t_eq(strlen(data
), 5)
259 || !TEST_str_eq(data
, buf2
))
268 static int test_PACKET_contains_zero_byte(void)
270 char buf1
[10], buf2
[10];
273 memset(buf1
, 'x', 10);
274 memset(buf2
, 'y', 10);
277 if (!TEST_true(PACKET_buf_init(&pkt
, (unsigned char*)buf1
, 10))
278 || !TEST_false(PACKET_contains_zero_byte(&pkt
))
279 || !TEST_true(PACKET_buf_init(&pkt
, (unsigned char*)buf2
, 10))
280 || !TEST_true(PACKET_contains_zero_byte(&pkt
)))
286 static int test_PACKET_forward(void)
288 const unsigned char *byte
= NULL
;
291 if (!TEST_true(PACKET_buf_init(&pkt
, smbuf
, BUF_LEN
))
292 || !TEST_true(PACKET_forward(&pkt
, 1))
293 || !TEST_true(PACKET_get_bytes(&pkt
, &byte
, 1))
294 || !TEST_uchar_eq(byte
[0], 4)
295 || !TEST_true(PACKET_forward(&pkt
, BUF_LEN
- 3))
296 || !TEST_true(PACKET_get_bytes(&pkt
, &byte
, 1))
297 || !TEST_uchar_eq(byte
[0], 0xfe))
303 static int test_PACKET_buf_init(void)
305 unsigned char buf1
[BUF_LEN
] = { 0 };
308 /* Also tests PACKET_remaining() */
309 if (!TEST_true(PACKET_buf_init(&pkt
, buf1
, 4))
310 || !TEST_size_t_eq(PACKET_remaining(&pkt
), 4)
311 || !TEST_true(PACKET_buf_init(&pkt
, buf1
, BUF_LEN
))
312 || !TEST_size_t_eq(PACKET_remaining(&pkt
), BUF_LEN
)
313 || !TEST_false(PACKET_buf_init(&pkt
, buf1
, -1)))
319 static int test_PACKET_null_init(void)
323 PACKET_null_init(&pkt
);
324 if (!TEST_size_t_eq(PACKET_remaining(&pkt
), 0)
325 || !TEST_false(PACKET_forward(&pkt
, 1)))
331 static int test_PACKET_equal(void)
335 if (!TEST_true(PACKET_buf_init(&pkt
, smbuf
, 4))
336 || !TEST_true(PACKET_equal(&pkt
, smbuf
, 4))
337 || !TEST_false(PACKET_equal(&pkt
, smbuf
+ 1, 4))
338 || !TEST_true(PACKET_buf_init(&pkt
, smbuf
, BUF_LEN
))
339 || !TEST_true(PACKET_equal(&pkt
, smbuf
, BUF_LEN
))
340 || !TEST_false(PACKET_equal(&pkt
, smbuf
, BUF_LEN
- 1))
341 || !TEST_false(PACKET_equal(&pkt
, smbuf
, BUF_LEN
+ 1))
342 || !TEST_false(PACKET_equal(&pkt
, smbuf
, 0)))
348 static int test_PACKET_get_length_prefixed_1(void)
350 unsigned char buf1
[BUF_LEN
];
351 const size_t len
= 16;
353 PACKET pkt
, short_pkt
, subpkt
;
355 memset(&subpkt
, 0, sizeof(subpkt
));
356 buf1
[0] = (unsigned char)len
;
357 for (i
= 1; i
< BUF_LEN
; i
++)
358 buf1
[i
] = (i
* 2) & 0xff;
360 if (!TEST_true(PACKET_buf_init(&pkt
, buf1
, BUF_LEN
))
361 || !TEST_true(PACKET_buf_init(&short_pkt
, buf1
, len
))
362 || !TEST_true(PACKET_get_length_prefixed_1(&pkt
, &subpkt
))
363 || !TEST_size_t_eq(PACKET_remaining(&subpkt
), len
)
364 || !TEST_true(PACKET_get_net_2(&subpkt
, &i
))
365 || !TEST_uint_eq(i
, 0x0204)
366 || !TEST_false(PACKET_get_length_prefixed_1(&short_pkt
, &subpkt
))
367 || !TEST_size_t_eq(PACKET_remaining(&short_pkt
), len
))
373 static int test_PACKET_get_length_prefixed_2(void)
375 unsigned char buf1
[1024];
376 const size_t len
= 516; /* 0x0204 */
378 PACKET pkt
, short_pkt
, subpkt
;
380 memset(&subpkt
, 0, sizeof(subpkt
));
381 for (i
= 1; i
<= 1024; i
++)
382 buf1
[i
- 1] = (i
* 2) & 0xff;
384 if (!TEST_true(PACKET_buf_init(&pkt
, buf1
, 1024))
385 || !TEST_true(PACKET_buf_init(&short_pkt
, buf1
, len
))
386 || !TEST_true(PACKET_get_length_prefixed_2(&pkt
, &subpkt
))
387 || !TEST_size_t_eq(PACKET_remaining(&subpkt
), len
)
388 || !TEST_true(PACKET_get_net_2(&subpkt
, &i
))
389 || !TEST_uint_eq(i
, 0x0608)
390 || !TEST_false(PACKET_get_length_prefixed_2(&short_pkt
, &subpkt
))
391 || !TEST_size_t_eq(PACKET_remaining(&short_pkt
), len
))
397 static int test_PACKET_get_length_prefixed_3(void)
399 unsigned char buf1
[1024];
400 const size_t len
= 516; /* 0x000204 */
402 PACKET pkt
, short_pkt
, subpkt
;
404 memset(&subpkt
, 0, sizeof(subpkt
));
405 for (i
= 0; i
< 1024; i
++)
406 buf1
[i
] = (i
* 2) & 0xff;
408 if (!TEST_true(PACKET_buf_init(&pkt
, buf1
, 1024))
409 || !TEST_true(PACKET_buf_init(&short_pkt
, buf1
, len
))
410 || !TEST_true(PACKET_get_length_prefixed_3(&pkt
, &subpkt
))
411 || !TEST_size_t_eq(PACKET_remaining(&subpkt
), len
)
412 || !TEST_true(PACKET_get_net_2(&subpkt
, &i
))
413 || !TEST_uint_eq(i
, 0x0608)
414 || !TEST_false(PACKET_get_length_prefixed_3(&short_pkt
, &subpkt
))
415 || !TEST_size_t_eq(PACKET_remaining(&short_pkt
), len
))
421 static int test_PACKET_as_length_prefixed_1(void)
423 unsigned char buf1
[BUF_LEN
];
424 const size_t len
= 16;
426 PACKET pkt
, exact_pkt
, subpkt
;
428 memset(&subpkt
, 0, sizeof(subpkt
));
429 buf1
[0] = (unsigned char)len
;
430 for (i
= 1; i
< BUF_LEN
; i
++)
431 buf1
[i
] = (i
* 2) & 0xff;
433 if (!TEST_true(PACKET_buf_init(&pkt
, buf1
, BUF_LEN
))
434 || !TEST_true(PACKET_buf_init(&exact_pkt
, buf1
, len
+ 1))
435 || !TEST_false(PACKET_as_length_prefixed_1(&pkt
, &subpkt
))
436 || !TEST_size_t_eq(PACKET_remaining(&pkt
), BUF_LEN
)
437 || !TEST_true(PACKET_as_length_prefixed_1(&exact_pkt
, &subpkt
))
438 || !TEST_size_t_eq(PACKET_remaining(&exact_pkt
), 0)
439 || !TEST_size_t_eq(PACKET_remaining(&subpkt
), len
))
445 static int test_PACKET_as_length_prefixed_2(void)
447 unsigned char buf
[1024];
448 const size_t len
= 516; /* 0x0204 */
450 PACKET pkt
, exact_pkt
, subpkt
;
452 memset(&subpkt
, 0, sizeof(subpkt
));
453 for (i
= 1; i
<= 1024; i
++)
454 buf
[i
-1] = (i
* 2) & 0xff;
456 if (!TEST_true(PACKET_buf_init(&pkt
, buf
, 1024))
457 || !TEST_true(PACKET_buf_init(&exact_pkt
, buf
, len
+ 2))
458 || !TEST_false(PACKET_as_length_prefixed_2(&pkt
, &subpkt
))
459 || !TEST_size_t_eq(PACKET_remaining(&pkt
), 1024)
460 || !TEST_true(PACKET_as_length_prefixed_2(&exact_pkt
, &subpkt
))
461 || !TEST_size_t_eq(PACKET_remaining(&exact_pkt
), 0)
462 || !TEST_size_t_eq(PACKET_remaining(&subpkt
), len
))
468 #ifndef OPENSSL_NO_QUIC
470 static int test_PACKET_get_quic_vlint(void)
472 struct quic_test_case
{
473 unsigned char buf
[16];
474 size_t expected_read_count
;
478 static const struct quic_test_case cases
[] = {
483 { {0x40,0x00}, 2, 0 },
484 { {0x40,0x01}, 2, 1 },
485 { {0x40,0x02}, 2, 2 },
486 { {0x40,0xff}, 2, 255 },
487 { {0x41,0x00}, 2, 256 },
488 { {0x7f,0xfe}, 2, 16382 },
489 { {0x7f,0xff}, 2, 16383 },
490 { {0x80,0x00,0x00,0x00}, 4, 0 },
491 { {0x80,0x00,0x00,0x01}, 4, 1 },
492 { {0x80,0x00,0x01,0x02}, 4, 258 },
493 { {0x80,0x18,0x49,0x65}, 4, 1591653 },
494 { {0xbe,0x18,0x49,0x65}, 4, 1041779045 },
495 { {0xbf,0xff,0xff,0xff}, 4, 1073741823 },
496 { {0xc0,0x00,0x00,0x00,0x00,0x00,0x00,0x00}, 8, 0 },
497 { {0xc0,0x00,0x00,0x00,0x00,0x00,0x01,0x02}, 8, 258 },
498 { {0xfd,0x1f,0x59,0x8d,0xc9,0xf8,0x71,0x8a}, 8, 4404337426105397642 },
505 for (i
= 0; i
< OSSL_NELEM(cases
); ++i
) {
506 memset(&pkt
, 0, sizeof(pkt
));
509 if (!TEST_true(PACKET_buf_init(&pkt
, cases
[i
].buf
, sizeof(cases
[i
].buf
)))
510 || !TEST_true(PACKET_get_quic_vlint(&pkt
, &v
))
511 || !TEST_uint64_t_eq(v
, cases
[i
].value
)
512 || !TEST_size_t_eq(PACKET_remaining(&pkt
),
513 sizeof(cases
[i
].buf
) - cases
[i
].expected_read_count
)
521 static int test_PACKET_get_quic_length_prefixed(void)
523 struct quic_test_case
{
524 unsigned char buf
[16];
529 static const struct quic_test_case cases
[] = {
544 PACKET pkt
, subpkt
= {0};
546 for (i
= 0; i
< OSSL_NELEM(cases
); ++i
) {
547 memset(&pkt
, 0, sizeof(pkt
));
549 if (!TEST_true(PACKET_buf_init(&pkt
, cases
[i
].buf
,
551 ? sizeof(cases
[i
].buf
)
552 : cases
[i
].enclen
+ cases
[i
].len
)))
555 if (!TEST_int_eq(PACKET_get_quic_length_prefixed(&pkt
, &subpkt
), !cases
[i
].fail
))
559 if (!TEST_ptr_eq(pkt
.curr
, cases
[i
].buf
))
564 if (!TEST_ptr_eq(subpkt
.curr
, cases
[i
].buf
+ cases
[i
].enclen
))
567 if (!TEST_size_t_eq(subpkt
.remaining
, cases
[i
].len
))
576 int setup_tests(void)
580 for (i
= 1; i
<= BUF_LEN
; i
++)
581 smbuf
[i
- 1] = (i
* 2) & 0xff;
583 ADD_TEST(test_PACKET_buf_init
);
584 ADD_TEST(test_PACKET_null_init
);
585 ADD_TEST(test_PACKET_remaining
);
586 ADD_TEST(test_PACKET_end
);
587 ADD_TEST(test_PACKET_equal
);
588 ADD_TEST(test_PACKET_get_1
);
589 ADD_TEST(test_PACKET_get_4
);
590 ADD_TEST(test_PACKET_get_net_2
);
591 ADD_TEST(test_PACKET_get_net_3
);
592 ADD_TEST(test_PACKET_get_net_4
);
593 ADD_TEST(test_PACKET_get_sub_packet
);
594 ADD_TEST(test_PACKET_get_bytes
);
595 ADD_TEST(test_PACKET_copy_bytes
);
596 ADD_TEST(test_PACKET_copy_all
);
597 ADD_TEST(test_PACKET_memdup
);
598 ADD_TEST(test_PACKET_strndup
);
599 ADD_TEST(test_PACKET_contains_zero_byte
);
600 ADD_TEST(test_PACKET_forward
);
601 ADD_TEST(test_PACKET_get_length_prefixed_1
);
602 ADD_TEST(test_PACKET_get_length_prefixed_2
);
603 ADD_TEST(test_PACKET_get_length_prefixed_3
);
604 ADD_TEST(test_PACKET_as_length_prefixed_1
);
605 ADD_TEST(test_PACKET_as_length_prefixed_2
);
606 #ifndef OPENSSL_NO_QUIC
607 ADD_TEST(test_PACKET_get_quic_vlint
);
608 ADD_TEST(test_PACKET_get_quic_length_prefixed
);