summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorjsing <>2026-06-06 08:13:50 +0000
committerjsing <>2026-06-06 08:13:50 +0000
commit959cf9ab5ba19116c52ad633faab70292d4c6858 (patch)
tree11c2ece613ed3bea7d2fd22138829081c5ebafa1 /src
parenta4bda5c70b985f1c4cca40b239aa5324c5a22a83 (diff)
downloadopenbsd-959cf9ab5ba19116c52ad633faab70292d4c6858.tar.gz
openbsd-959cf9ab5ba19116c52ad633faab70292d4c6858.tar.bz2
openbsd-959cf9ab5ba19116c52ad633faab70292d4c6858.zip
Add regress tests for DTLS handshake messages.
Diffstat (limited to 'src')
-rw-r--r--src/regress/lib/libssl/dtls/Makefile7
-rw-r--r--src/regress/lib/libssl/dtls/dtls_handshake_msg_test.c369
2 files changed, 375 insertions, 1 deletions
diff --git a/src/regress/lib/libssl/dtls/Makefile b/src/regress/lib/libssl/dtls/Makefile
index a8d888c882..739faf8b9e 100644
--- a/src/regress/lib/libssl/dtls/Makefile
+++ b/src/regress/lib/libssl/dtls/Makefile
@@ -1,6 +1,7 @@
1# $OpenBSD: Makefile,v 1.5 2026/04/25 14:36:12 jsing Exp $ 1# $OpenBSD: Makefile,v 1.6 2026/06/06 08:13:50 jsing Exp $
2 2
3PROGS += dtlstest 3PROGS += dtlstest
4PROGS += dtls_handshake_msg_test
4PROGS += dtls_wire_test 5PROGS += dtls_wire_test
5 6
6LDADD= ${SSL_INT} -lcrypto 7LDADD= ${SSL_INT} -lcrypto
@@ -12,6 +13,7 @@ CFLAGS+= -I${.CURDIR}/../../../../lib/libssl
12 13
13REGRESS_TARGETS= \ 14REGRESS_TARGETS= \
14 regress-dtlstest \ 15 regress-dtlstest \
16 regress-dtls_handshake_msg_test \
15 regress-dtls_wire_test 17 regress-dtls_wire_test
16 18
17# XXX(jsing): use CA root and chain 19# XXX(jsing): use CA root and chain
@@ -21,6 +23,9 @@ regress-dtlstest: dtlstest
21 ${.CURDIR}/../../libssl/certs/server1-rsa.pem \ 23 ${.CURDIR}/../../libssl/certs/server1-rsa.pem \
22 ${.CURDIR}/../../libssl/certs/ca-int-rsa.pem 24 ${.CURDIR}/../../libssl/certs/ca-int-rsa.pem
23 25
26regress-dtls_handshake_msg_test: dtls_handshake_msg_test
27 ./dtls_handshake_msg_test
28
24regress-dtls_wire_test: dtls_wire_test 29regress-dtls_wire_test: dtls_wire_test
25 ./dtls_wire_test 30 ./dtls_wire_test
26 31
diff --git a/src/regress/lib/libssl/dtls/dtls_handshake_msg_test.c b/src/regress/lib/libssl/dtls/dtls_handshake_msg_test.c
new file mode 100644
index 0000000000..4fbc8d8803
--- /dev/null
+++ b/src/regress/lib/libssl/dtls/dtls_handshake_msg_test.c
@@ -0,0 +1,369 @@
1/* $OpenBSD: dtls_handshake_msg_test.c,v 1.1 2026/06/06 08:13:50 jsing Exp $ */
2/*
3 * Copyright (c) 2026 Joel Sing <jsing@openbsd.org>
4 *
5 * Permission to use, copy, modify, and distribute this software for any
6 * purpose with or without fee is hereby granted, provided that the above
7 * copyright notice and this permission notice appear in all copies.
8 *
9 * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
10 * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
11 * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
12 * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
13 * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
14 * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
15 * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
16 */
17
18#include <stdio.h>
19#include <string.h>
20
21#include <openssl/ssl3.h>
22
23#include "bytestring.h"
24#include "dtls12_internal.h"
25
26static void
27hexdump(const unsigned char *buf, size_t len)
28{
29 size_t i;
30
31 for (i = 1; i <= len; i++)
32 fprintf(stderr, " 0x%02hhx,%s", buf[i - 1], i % 8 ? "" : "\n");
33
34 fprintf(stderr, "\n");
35}
36
37static const uint8_t dtls12_hs_msg_data[] = {
38 0x01, 0x00, 0x01, 0x00, 0xca, 0xfe, 0x00, 0x00,
39 0x00, 0x00, 0x01, 0x00, 0x00, 0x01, 0x02, 0x03,
40 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0a, 0x0b,
41 0x0c, 0x0d, 0x0e, 0x0f, 0x10, 0x11, 0x12, 0x13,
42 0x14, 0x15, 0x16, 0x17, 0x18, 0x19, 0x1a, 0x1b,
43 0x1c, 0x1d, 0x1e, 0x1f, 0x20, 0x21, 0x22, 0x23,
44 0x24, 0x25, 0x26, 0x27, 0x28, 0x29, 0x2a, 0x2b,
45 0x2c, 0x2d, 0x2e, 0x2f, 0x30, 0x31, 0x32, 0x33,
46 0x34, 0x35, 0x36, 0x37, 0x38, 0x39, 0x3a, 0x3b,
47 0x3c, 0x3d, 0x3e, 0x3f, 0x40, 0x41, 0x42, 0x43,
48 0x44, 0x45, 0x46, 0x47, 0x48, 0x49, 0x4a, 0x4b,
49 0x4c, 0x4d, 0x4e, 0x4f, 0x50, 0x51, 0x52, 0x53,
50 0x54, 0x55, 0x56, 0x57, 0x58, 0x59, 0x5a, 0x5b,
51 0x5c, 0x5d, 0x5e, 0x5f, 0x60, 0x61, 0x62, 0x63,
52 0x64, 0x65, 0x66, 0x67, 0x68, 0x69, 0x6a, 0x6b,
53 0x6c, 0x6d, 0x6e, 0x6f, 0x70, 0x71, 0x72, 0x73,
54 0x74, 0x75, 0x76, 0x77, 0x78, 0x79, 0x7a, 0x7b,
55 0x7c, 0x7d, 0x7e, 0x7f, 0x80, 0x81, 0x82, 0x83,
56 0x84, 0x85, 0x86, 0x87, 0x88, 0x89, 0x8a, 0x8b,
57 0x8c, 0x8d, 0x8e, 0x8f, 0x90, 0x91, 0x92, 0x93,
58 0x94, 0x95, 0x96, 0x97, 0x98, 0x99, 0x9a, 0x9b,
59 0x9c, 0x9d, 0x9e, 0x9f, 0xa0, 0xa1, 0xa2, 0xa3,
60 0xa4, 0xa5, 0xa6, 0xa7, 0xa8, 0xa9, 0xaa, 0xab,
61 0xac, 0xad, 0xae, 0xaf, 0xb0, 0xb1, 0xb2, 0xb3,
62 0xb4, 0xb5, 0xb6, 0xb7, 0xb8, 0xb9, 0xba, 0xbb,
63 0xbc, 0xbd, 0xbe, 0xbf, 0xc0, 0xc1, 0xc2, 0xc3,
64 0xc4, 0xc5, 0xc6, 0xc7, 0xc8, 0xc9, 0xca, 0xcb,
65 0xcc, 0xcd, 0xce, 0xcf, 0xd0, 0xd1, 0xd2, 0xd3,
66 0xd4, 0xd5, 0xd6, 0xd7, 0xd8, 0xd9, 0xda, 0xdb,
67 0xdc, 0xdd, 0xde, 0xdf, 0xe0, 0xe1, 0xe2, 0xe3,
68 0xe4, 0xe5, 0xe6, 0xe7, 0xe8, 0xe9, 0xea, 0xeb,
69 0xec, 0xed, 0xee, 0xef, 0xf0, 0xf1, 0xf2, 0xf3,
70 0xf4, 0xf5, 0xf6, 0xf7, 0xf8, 0xf9, 0xfa, 0xfb,
71 0xfc, 0xfd, 0xfe, 0xff,
72};
73
74static const uint8_t dtls12_hm_content[] = {
75 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07,
76 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f,
77 0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17,
78 0x18, 0x19, 0x1a, 0x1b, 0x1c, 0x1d, 0x1e, 0x1f,
79 0x20, 0x21, 0x22, 0x23, 0x24, 0x25, 0x26, 0x27,
80 0x28, 0x29, 0x2a, 0x2b, 0x2c, 0x2d, 0x2e, 0x2f,
81 0x30, 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37,
82 0x38, 0x39, 0x3a, 0x3b, 0x3c, 0x3d, 0x3e, 0x3f,
83 0x40, 0x41, 0x42, 0x43, 0x44, 0x45, 0x46, 0x47,
84 0x48, 0x49, 0x4a, 0x4b, 0x4c, 0x4d, 0x4e, 0x4f,
85 0x50, 0x51, 0x52, 0x53, 0x54, 0x55, 0x56, 0x57,
86 0x58, 0x59, 0x5a, 0x5b, 0x5c, 0x5d, 0x5e, 0x5f,
87 0x60, 0x61, 0x62, 0x63, 0x64, 0x65, 0x66, 0x67,
88 0x68, 0x69, 0x6a, 0x6b, 0x6c, 0x6d, 0x6e, 0x6f,
89 0x70, 0x71, 0x72, 0x73, 0x74, 0x75, 0x76, 0x77,
90 0x78, 0x79, 0x7a, 0x7b, 0x7c, 0x7d, 0x7e, 0x7f,
91 0x80, 0x81, 0x82, 0x83, 0x84, 0x85, 0x86, 0x87,
92 0x88, 0x89, 0x8a, 0x8b, 0x8c, 0x8d, 0x8e, 0x8f,
93 0x90, 0x91, 0x92, 0x93, 0x94, 0x95, 0x96, 0x97,
94 0x98, 0x99, 0x9a, 0x9b, 0x9c, 0x9d, 0x9e, 0x9f,
95 0xa0, 0xa1, 0xa2, 0xa3, 0xa4, 0xa5, 0xa6, 0xa7,
96 0xa8, 0xa9, 0xaa, 0xab, 0xac, 0xad, 0xae, 0xaf,
97 0xb0, 0xb1, 0xb2, 0xb3, 0xb4, 0xb5, 0xb6, 0xb7,
98 0xb8, 0xb9, 0xba, 0xbb, 0xbc, 0xbd, 0xbe, 0xbf,
99 0xc0, 0xc1, 0xc2, 0xc3, 0xc4, 0xc5, 0xc6, 0xc7,
100 0xc8, 0xc9, 0xca, 0xcb, 0xcc, 0xcd, 0xce, 0xcf,
101 0xd0, 0xd1, 0xd2, 0xd3, 0xd4, 0xd5, 0xd6, 0xd7,
102 0xd8, 0xd9, 0xda, 0xdb, 0xdc, 0xdd, 0xde, 0xdf,
103 0xe0, 0xe1, 0xe2, 0xe3, 0xe4, 0xe5, 0xe6, 0xe7,
104 0xe8, 0xe9, 0xea, 0xeb, 0xec, 0xed, 0xee, 0xef,
105 0xf0, 0xf1, 0xf2, 0xf3, 0xf4, 0xf5, 0xf6, 0xf7,
106 0xf8, 0xf9, 0xfa, 0xfb, 0xfc, 0xfd, 0xfe, 0xff,
107};
108
109static const uint8_t dtls12_hs_msg_frag_0[] = {
110 0x01, 0x00, 0x01, 0x00, 0xca, 0xfe, 0x00, 0x00,
111 0x00, 0x00, 0x00, 0x40, 0x00, 0x01, 0x02, 0x03,
112 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0a, 0x0b,
113 0x0c, 0x0d, 0x0e, 0x0f, 0x10, 0x11, 0x12, 0x13,
114 0x14, 0x15, 0x16, 0x17, 0x18, 0x19, 0x1a, 0x1b,
115 0x1c, 0x1d, 0x1e, 0x1f, 0x20, 0x21, 0x22, 0x23,
116 0x24, 0x25, 0x26, 0x27, 0x28, 0x29, 0x2a, 0x2b,
117 0x2c, 0x2d, 0x2e, 0x2f, 0x30, 0x31, 0x32, 0x33,
118 0x34, 0x35, 0x36, 0x37, 0x38, 0x39, 0x3a, 0x3b,
119 0x3c, 0x3d, 0x3e, 0x3f,
120};
121
122static const uint8_t dtls12_hs_msg_frag_1[] = {
123 0x01, 0x00, 0x01, 0x00, 0xca, 0xfe, 0x00, 0x00,
124 0x00, 0x00, 0x00, 0x20, 0x00, 0x01, 0x02, 0x03,
125 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0a, 0x0b,
126 0x0c, 0x0d, 0x0e, 0x0f, 0x10, 0x11, 0x12, 0x13,
127 0x14, 0x15, 0x16, 0x17, 0x18, 0x19, 0x1a, 0x1b,
128 0x1c, 0x1d, 0x1e, 0x1f,
129};
130
131static const uint8_t dtls12_hs_msg_frag_2[] = {
132 0x01, 0x00, 0x01, 0x00, 0xca, 0xfe, 0x00, 0x00,
133 0x20, 0x00, 0x00, 0x80, 0x20, 0x21, 0x22, 0x23,
134 0x24, 0x25, 0x26, 0x27, 0x28, 0x29, 0x2a, 0x2b,
135 0x2c, 0x2d, 0x2e, 0x2f, 0x30, 0x31, 0x32, 0x33,
136 0x34, 0x35, 0x36, 0x37, 0x38, 0x39, 0x3a, 0x3b,
137 0x3c, 0x3d, 0x3e, 0x3f, 0x40, 0x41, 0x42, 0x43,
138 0x44, 0x45, 0x46, 0x47, 0x48, 0x49, 0x4a, 0x4b,
139 0x4c, 0x4d, 0x4e, 0x4f, 0x50, 0x51, 0x52, 0x53,
140 0x54, 0x55, 0x56, 0x57, 0x58, 0x59, 0x5a, 0x5b,
141 0x5c, 0x5d, 0x5e, 0x5f, 0x60, 0x61, 0x62, 0x63,
142 0x64, 0x65, 0x66, 0x67, 0x68, 0x69, 0x6a, 0x6b,
143 0x6c, 0x6d, 0x6e, 0x6f, 0x70, 0x71, 0x72, 0x73,
144 0x74, 0x75, 0x76, 0x77, 0x78, 0x79, 0x7a, 0x7b,
145 0x7c, 0x7d, 0x7e, 0x7f, 0x80, 0x81, 0x82, 0x83,
146 0x84, 0x85, 0x86, 0x87, 0x88, 0x89, 0x8a, 0x8b,
147 0x8c, 0x8d, 0x8e, 0x8f, 0x90, 0x91, 0x92, 0x93,
148 0x94, 0x95, 0x96, 0x97, 0x98, 0x99, 0x9a, 0x9b,
149 0x9c, 0x9d, 0x9e, 0x9f,
150};
151
152static const uint8_t dtls12_hs_msg_frag_3[] = {
153 0x01, 0x00, 0x01, 0x00, 0xca, 0xfe, 0x00, 0x00,
154 0xa0, 0x00, 0x00, 0x60, 0xa0, 0xa1, 0xa2, 0xa3,
155 0xa4, 0xa5, 0xa6, 0xa7, 0xa8, 0xa9, 0xaa, 0xab,
156 0xac, 0xad, 0xae, 0xaf, 0xb0, 0xb1, 0xb2, 0xb3,
157 0xb4, 0xb5, 0xb6, 0xb7, 0xb8, 0xb9, 0xba, 0xbb,
158 0xbc, 0xbd, 0xbe, 0xbf, 0xc0, 0xc1, 0xc2, 0xc3,
159 0xc4, 0xc5, 0xc6, 0xc7, 0xc8, 0xc9, 0xca, 0xcb,
160 0xcc, 0xcd, 0xce, 0xcf, 0xd0, 0xd1, 0xd2, 0xd3,
161 0xd4, 0xd5, 0xd6, 0xd7, 0xd8, 0xd9, 0xda, 0xdb,
162 0xdc, 0xdd, 0xde, 0xdf, 0xe0, 0xe1, 0xe2, 0xe3,
163 0xe4, 0xe5, 0xe6, 0xe7, 0xe8, 0xe9, 0xea, 0xeb,
164 0xec, 0xed, 0xee, 0xef, 0xf0, 0xf1, 0xf2, 0xf3,
165 0xf4, 0xf5, 0xf6, 0xf7, 0xf8, 0xf9, 0xfa, 0xfb,
166 0xfc, 0xfd, 0xfe, 0xff,
167};
168
169static int
170dtls_handshake_msg_test(void)
171{
172 struct dtls12_handshake_msg *hs_msg = NULL;
173 uint8_t *p;
174 int i;
175 CBB cbb;
176 CBS cbs;
177 int failed = 1;
178
179 memset(&cbb, 0, sizeof(cbb));
180
181 if ((hs_msg = dtls12_handshake_msg_new()) == NULL) {
182 fprintf(stderr, "FAIL: dtls12_handshake_msg_new\n");
183 goto failure;
184 }
185 if (!dtls12_handshake_msg_start(hs_msg, &cbb, SSL3_MT_CLIENT_HELLO,
186 0xcafe)) {
187 fprintf(stderr, "FAIL: dtls12_handshake_msg_start\n");
188 goto failure;
189 }
190 if (!CBB_add_space(&cbb, &p, 256)) {
191 fprintf(stderr, "FAIL: CBB_add_space\n");
192 goto failure;
193 }
194 for (i = 0; i < 256; i++)
195 p[i] = i;
196 if (!dtls12_handshake_msg_finish(hs_msg)) {
197 fprintf(stderr, "FAIL: dtls12_handshake_msg_finish\n");
198 goto failure;
199 }
200
201 dtls12_handshake_msg_data(hs_msg, &cbs);
202 if (CBS_len(&cbs) != sizeof(dtls12_hs_msg_data)) {
203 fprintf(stderr, "FAIL: handshake message data length = %zu, want %zu\n",
204 CBS_len(&cbs), sizeof(dtls12_hs_msg_data));
205 goto failure;
206 }
207 if (memcmp(CBS_data(&cbs), dtls12_hs_msg_data, CBS_len(&cbs)) != 0) {
208 fprintf(stderr, "FAIL: got handshake message data:\n");
209 hexdump(CBS_data(&cbs), CBS_len(&cbs));
210 fprintf(stderr, "want handshake message data:\n");
211 hexdump(dtls12_hs_msg_data, CBS_len(&cbs));
212 }
213
214 dtls12_handshake_msg_content(hs_msg, &cbs);
215 if (CBS_len(&cbs) != sizeof(dtls12_hm_content)) {
216 fprintf(stderr, "FAIL: handshake message content length = %zu, want %zu\n",
217 CBS_len(&cbs), sizeof(dtls12_hm_content));
218 goto failure;
219 }
220 if (memcmp(CBS_data(&cbs), dtls12_hm_content, CBS_len(&cbs)) != 0) {
221 fprintf(stderr, "FAIL: got handshake message content:\n");
222 hexdump(CBS_data(&cbs), CBS_len(&cbs));
223 fprintf(stderr, "want handshake message content:\n");
224 hexdump(dtls12_hm_content, CBS_len(&cbs));
225 }
226
227 if (!dtls12_handshake_msg_fragment_pending(hs_msg)) {
228 fprintf(stderr, "FAIL: handshake message should have pending fragments\n");
229 goto failure;
230 }
231 if (!dtls12_handshake_msg_fragment_build(hs_msg, 64, &cbs)) {
232 fprintf(stderr, "FAIL: failed to build handshake message fragment 0\n");
233 goto failure;
234 }
235 if (CBS_len(&cbs) != sizeof(dtls12_hs_msg_frag_0)) {
236 fprintf(stderr, "FAIL: handshake message fragment 0 length = %zu, want %zu\n",
237 CBS_len(&cbs), sizeof(dtls12_hs_msg_frag_0));
238 goto failure;
239 }
240 if (memcmp(CBS_data(&cbs), dtls12_hs_msg_frag_0, CBS_len(&cbs)) != 0) {
241 fprintf(stderr, "FAIL: got handshake message fragment:\n");
242 hexdump(CBS_data(&cbs), CBS_len(&cbs));
243 fprintf(stderr, "want handshake message fragment:\n");
244 hexdump(dtls12_hs_msg_frag_0, CBS_len(&cbs));
245 }
246
247 if (!dtls12_handshake_msg_fragment_build(hs_msg, 32, &cbs)) {
248 fprintf(stderr, "FAIL: failed to build handshake message fragment 1\n");
249 goto failure;
250 }
251 if (CBS_len(&cbs) != sizeof(dtls12_hs_msg_frag_1)) {
252 fprintf(stderr, "FAIL: handshake message fragment 1 length = %zu, want %zu\n",
253 CBS_len(&cbs), sizeof(dtls12_hs_msg_frag_1));
254 goto failure;
255 }
256 if (memcmp(CBS_data(&cbs), dtls12_hs_msg_frag_1, CBS_len(&cbs)) != 0) {
257 fprintf(stderr, "FAIL: got handshake message 1 fragment:\n");
258 hexdump(CBS_data(&cbs), CBS_len(&cbs));
259 fprintf(stderr, "want handshake message 1 fragment:\n");
260 hexdump(dtls12_hs_msg_frag_1, CBS_len(&cbs));
261 }
262
263 if (!dtls12_handshake_msg_fragment_build(hs_msg, 32, &cbs)) {
264 fprintf(stderr, "FAIL: failed to rebuild handshake message fragment 1\n");
265 goto failure;
266 }
267 if (CBS_len(&cbs) != sizeof(dtls12_hs_msg_frag_1)) {
268 fprintf(stderr, "FAIL: handshake message fragment 1 length = %zu, want %zu\n",
269 CBS_len(&cbs), sizeof(dtls12_hs_msg_frag_1));
270 goto failure;
271 }
272 if (memcmp(CBS_data(&cbs), dtls12_hs_msg_frag_1, CBS_len(&cbs)) != 0) {
273 fprintf(stderr, "FAIL: got handshake message 1 fragment:\n");
274 hexdump(CBS_data(&cbs), CBS_len(&cbs));
275 fprintf(stderr, "want handshake message 1 fragment:\n");
276 hexdump(dtls12_hs_msg_frag_1, CBS_len(&cbs));
277 }
278
279 if (!dtls12_handshake_msg_fragment_next(hs_msg)) {
280 fprintf(stderr, "FAIL: failed to progress to next fragment\n");
281 goto failure;
282 }
283 if (!dtls12_handshake_msg_fragment_pending(hs_msg)) {
284 fprintf(stderr, "FAIL: handshake message should have pending fragments\n");
285 goto failure;
286 }
287
288 if (!dtls12_handshake_msg_fragment_build(hs_msg, 128, &cbs)) {
289 fprintf(stderr, "FAIL: failed to build handshake message fragment 2\n");
290 goto failure;
291 }
292 if (CBS_len(&cbs) != sizeof(dtls12_hs_msg_frag_2)) {
293 fprintf(stderr, "FAIL: handshake message fragment 2 length = %zu, want %zu\n",
294 CBS_len(&cbs), sizeof(dtls12_hs_msg_frag_2));
295 goto failure;
296 }
297 if (memcmp(CBS_data(&cbs), dtls12_hs_msg_frag_2, CBS_len(&cbs)) != 0) {
298 fprintf(stderr, "FAIL: got handshake message 2 fragment:\n");
299 hexdump(CBS_data(&cbs), CBS_len(&cbs));
300 fprintf(stderr, "want handshake message 2 fragment:\n");
301 hexdump(dtls12_hs_msg_frag_2, CBS_len(&cbs));
302 }
303
304 if (!dtls12_handshake_msg_fragment_next(hs_msg)) {
305 fprintf(stderr, "FAIL: failed to progress to next fragment\n");
306 goto failure;
307 }
308 if (!dtls12_handshake_msg_fragment_pending(hs_msg)) {
309 fprintf(stderr, "FAIL: handshake message should have pending fragments\n");
310 goto failure;
311 }
312
313 if (!dtls12_handshake_msg_fragment_build(hs_msg, 128, &cbs)) {
314 fprintf(stderr, "FAIL: failed to build handshake message fragment 3\n");
315 goto failure;
316 }
317 if (CBS_len(&cbs) != sizeof(dtls12_hs_msg_frag_3)) {
318 fprintf(stderr, "FAIL: handshake message fragment 3 length = %zu, want %zu\n",
319 CBS_len(&cbs), sizeof(dtls12_hs_msg_frag_3));
320 goto failure;
321 }
322 if (memcmp(CBS_data(&cbs), dtls12_hs_msg_frag_3, CBS_len(&cbs)) != 0) {
323 fprintf(stderr, "FAIL: got handshake message 3 fragment:\n");
324 hexdump(CBS_data(&cbs), CBS_len(&cbs));
325 fprintf(stderr, "want handshake message 3 fragment:\n");
326 hexdump(dtls12_hs_msg_frag_2, CBS_len(&cbs));
327 }
328
329 if (!dtls12_handshake_msg_fragment_next(hs_msg)) {
330 fprintf(stderr, "FAIL: failed to progress to next fragment\n");
331 goto failure;
332 }
333 if (dtls12_handshake_msg_fragment_pending(hs_msg)) {
334 fprintf(stderr, "FAIL: handshake message should not have pending fragments\n");
335 goto failure;
336 }
337 if (dtls12_handshake_msg_fragment_next(hs_msg)) {
338 fprintf(stderr, "FAIL: should have failed to progress to next fragment\n");
339 goto failure;
340 }
341
342 if (!dtls12_handshake_msg_fragment_reset(hs_msg)) {
343 fprintf(stderr, "FAIL: failed to reset handshake message fragments\n");
344 goto failure;
345 }
346 if (!dtls12_handshake_msg_fragment_pending(hs_msg)) {
347 fprintf(stderr, "FAIL: handshake message should have pending fragments after reset\n");
348 goto failure;
349 }
350
351 failed = 0;
352
353 failure:
354 dtls12_handshake_msg_free(hs_msg);
355
356 CBB_cleanup(&cbb);
357
358 return failed;
359}
360
361int
362main(int argc, char **argv)
363{
364 int failed = 0;
365
366 failed |= dtls_handshake_msg_test();
367
368 return failed;
369}