2 * Copyright 2015-2018 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 "../ssl/packet_locl.h"
15 static unsigned char smbuf
[BUF_LEN
];
17 static int test_PACKET_remaining(void)
21 if (!TEST_true(PACKET_buf_init(&pkt
, smbuf
, sizeof(smbuf
)))
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
, sizeof(smbuf
)))
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
];
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 int setup_tests(void)
472 for (i
= 1; i
<= BUF_LEN
; i
++)
473 smbuf
[i
- 1] = (i
* 2) & 0xff;
475 ADD_TEST(test_PACKET_buf_init
);
476 ADD_TEST(test_PACKET_null_init
);
477 ADD_TEST(test_PACKET_remaining
);
478 ADD_TEST(test_PACKET_end
);
479 ADD_TEST(test_PACKET_equal
);
480 ADD_TEST(test_PACKET_get_1
);
481 ADD_TEST(test_PACKET_get_4
);
482 ADD_TEST(test_PACKET_get_net_2
);
483 ADD_TEST(test_PACKET_get_net_3
);
484 ADD_TEST(test_PACKET_get_net_4
);
485 ADD_TEST(test_PACKET_get_sub_packet
);
486 ADD_TEST(test_PACKET_get_bytes
);
487 ADD_TEST(test_PACKET_copy_bytes
);
488 ADD_TEST(test_PACKET_copy_all
);
489 ADD_TEST(test_PACKET_memdup
);
490 ADD_TEST(test_PACKET_strndup
);
491 ADD_TEST(test_PACKET_contains_zero_byte
);
492 ADD_TEST(test_PACKET_forward
);
493 ADD_TEST(test_PACKET_get_length_prefixed_1
);
494 ADD_TEST(test_PACKET_get_length_prefixed_2
);
495 ADD_TEST(test_PACKET_get_length_prefixed_3
);
496 ADD_TEST(test_PACKET_as_length_prefixed_1
);
497 ADD_TEST(test_PACKET_as_length_prefixed_2
);