xref: /freebsd/crypto/openssl/test/wpackettest.c (revision e0c4386e7e71d93b0edc0c8fa156263fc4a8b0b6)
1*e0c4386eSCy Schubert /*
2*e0c4386eSCy Schubert  * Copyright 2016-2022 The OpenSSL Project Authors. All Rights Reserved.
3*e0c4386eSCy Schubert  *
4*e0c4386eSCy Schubert  * Licensed under the Apache License 2.0 (the "License").  You may not use
5*e0c4386eSCy Schubert  * this file except in compliance with the License.  You can obtain a copy
6*e0c4386eSCy Schubert  * in the file LICENSE in the source distribution or at
7*e0c4386eSCy Schubert  * https://www.openssl.org/source/license.html
8*e0c4386eSCy Schubert  */
9*e0c4386eSCy Schubert 
10*e0c4386eSCy Schubert #include <string.h>
11*e0c4386eSCy Schubert #include <openssl/buffer.h>
12*e0c4386eSCy Schubert #include <openssl/rand.h>
13*e0c4386eSCy Schubert #include "internal/packet.h"
14*e0c4386eSCy Schubert #include "testutil.h"
15*e0c4386eSCy Schubert 
16*e0c4386eSCy Schubert static const unsigned char simple1[] = { 0xff };
17*e0c4386eSCy Schubert static const unsigned char simple2[] = { 0x01, 0xff };
18*e0c4386eSCy Schubert static const unsigned char simple3[] = { 0x00, 0x00, 0x00, 0x01, 0xff };
19*e0c4386eSCy Schubert static const unsigned char nestedsub[] = { 0x03, 0xff, 0x01, 0xff };
20*e0c4386eSCy Schubert static const unsigned char seqsub[] = { 0x01, 0xff, 0x01, 0xff };
21*e0c4386eSCy Schubert static const unsigned char empty[] = { 0x00 };
22*e0c4386eSCy Schubert static const unsigned char alloc[] = { 0x02, 0xfe, 0xff };
23*e0c4386eSCy Schubert static const unsigned char submem[] = { 0x03, 0x02, 0xfe, 0xff };
24*e0c4386eSCy Schubert static const unsigned char fixed[] = { 0xff, 0xff, 0xff };
25*e0c4386eSCy Schubert static const unsigned char simpleder[] = {
26*e0c4386eSCy Schubert     0xfc, 0x04, 0x00, 0x01, 0x02, 0x03, 0xff, 0xfe, 0xfd
27*e0c4386eSCy Schubert };
28*e0c4386eSCy Schubert 
29*e0c4386eSCy Schubert static BUF_MEM *buf;
30*e0c4386eSCy Schubert 
cleanup(WPACKET * pkt)31*e0c4386eSCy Schubert static int cleanup(WPACKET *pkt)
32*e0c4386eSCy Schubert {
33*e0c4386eSCy Schubert     WPACKET_cleanup(pkt);
34*e0c4386eSCy Schubert     return 0;
35*e0c4386eSCy Schubert }
36*e0c4386eSCy Schubert 
test_WPACKET_init(void)37*e0c4386eSCy Schubert static int test_WPACKET_init(void)
38*e0c4386eSCy Schubert {
39*e0c4386eSCy Schubert     WPACKET pkt;
40*e0c4386eSCy Schubert     int i;
41*e0c4386eSCy Schubert     size_t written;
42*e0c4386eSCy Schubert     unsigned char sbuf[3];
43*e0c4386eSCy Schubert 
44*e0c4386eSCy Schubert     if (!TEST_true(WPACKET_init(&pkt, buf))
45*e0c4386eSCy Schubert             || !TEST_true(WPACKET_put_bytes_u8(&pkt, 0xff))
46*e0c4386eSCy Schubert                 /* Closing a top level WPACKET should fail */
47*e0c4386eSCy Schubert             || !TEST_false(WPACKET_close(&pkt))
48*e0c4386eSCy Schubert                 /* Finishing a top level WPACKET should succeed */
49*e0c4386eSCy Schubert             || !TEST_true(WPACKET_finish(&pkt))
50*e0c4386eSCy Schubert                 /*
51*e0c4386eSCy Schubert                  * Can't call close or finish on a WPACKET that's already
52*e0c4386eSCy Schubert                  * finished.
53*e0c4386eSCy Schubert                  */
54*e0c4386eSCy Schubert             || !TEST_false(WPACKET_close(&pkt))
55*e0c4386eSCy Schubert             || !TEST_false(WPACKET_finish(&pkt))
56*e0c4386eSCy Schubert             || !TEST_true(WPACKET_get_total_written(&pkt, &written))
57*e0c4386eSCy Schubert             || !TEST_mem_eq(buf->data, written, simple1, sizeof(simple1)))
58*e0c4386eSCy Schubert         return cleanup(&pkt);
59*e0c4386eSCy Schubert 
60*e0c4386eSCy Schubert     /* Now try with a one byte length prefix */
61*e0c4386eSCy Schubert     if (!TEST_true(WPACKET_init_len(&pkt, buf, 1))
62*e0c4386eSCy Schubert             || !TEST_true(WPACKET_put_bytes_u8(&pkt, 0xff))
63*e0c4386eSCy Schubert             || !TEST_true(WPACKET_finish(&pkt))
64*e0c4386eSCy Schubert             || !TEST_true(WPACKET_get_total_written(&pkt, &written))
65*e0c4386eSCy Schubert             || !TEST_mem_eq(buf->data, written, simple2, sizeof(simple2)))
66*e0c4386eSCy Schubert         return cleanup(&pkt);
67*e0c4386eSCy Schubert 
68*e0c4386eSCy Schubert     /* And a longer length prefix */
69*e0c4386eSCy Schubert     if (!TEST_true(WPACKET_init_len(&pkt, buf, 4))
70*e0c4386eSCy Schubert             || !TEST_true(WPACKET_put_bytes_u8(&pkt, 0xff))
71*e0c4386eSCy Schubert             || !TEST_true(WPACKET_finish(&pkt))
72*e0c4386eSCy Schubert             || !TEST_true(WPACKET_get_total_written(&pkt, &written))
73*e0c4386eSCy Schubert             || !TEST_mem_eq(buf->data, written, simple3, sizeof(simple3)))
74*e0c4386eSCy Schubert         return cleanup(&pkt);
75*e0c4386eSCy Schubert 
76*e0c4386eSCy Schubert     if (!TEST_true(WPACKET_init_len(&pkt, buf, 1)))
77*e0c4386eSCy Schubert         return cleanup(&pkt);
78*e0c4386eSCy Schubert     for (i = 1; i < 257; i++) {
79*e0c4386eSCy Schubert         /*
80*e0c4386eSCy Schubert          * Putting more bytes in than fit for the size of the length prefix
81*e0c4386eSCy Schubert          * should fail
82*e0c4386eSCy Schubert          */
83*e0c4386eSCy Schubert         if (!TEST_int_eq(WPACKET_put_bytes_u8(&pkt, 0xff), i < 256))
84*e0c4386eSCy Schubert             return cleanup(&pkt);
85*e0c4386eSCy Schubert     }
86*e0c4386eSCy Schubert     if (!TEST_true(WPACKET_finish(&pkt)))
87*e0c4386eSCy Schubert         return cleanup(&pkt);
88*e0c4386eSCy Schubert 
89*e0c4386eSCy Schubert     /* Test initialising from a fixed size buffer */
90*e0c4386eSCy Schubert     if (!TEST_true(WPACKET_init_static_len(&pkt, sbuf, sizeof(sbuf), 0))
91*e0c4386eSCy Schubert                 /* Adding 3 bytes should succeed */
92*e0c4386eSCy Schubert             || !TEST_true(WPACKET_put_bytes_u24(&pkt, 0xffffff))
93*e0c4386eSCy Schubert                 /* Adding 1 more byte should fail */
94*e0c4386eSCy Schubert             || !TEST_false(WPACKET_put_bytes_u8(&pkt, 0xff))
95*e0c4386eSCy Schubert                 /* Finishing the top level WPACKET should succeed */
96*e0c4386eSCy Schubert             || !TEST_true(WPACKET_finish(&pkt))
97*e0c4386eSCy Schubert             || !TEST_true(WPACKET_get_total_written(&pkt, &written))
98*e0c4386eSCy Schubert             || !TEST_mem_eq(sbuf, written, fixed, sizeof(sbuf))
99*e0c4386eSCy Schubert                 /* Initialise with 1 len byte */
100*e0c4386eSCy Schubert             || !TEST_true(WPACKET_init_static_len(&pkt, sbuf, sizeof(sbuf), 1))
101*e0c4386eSCy Schubert                 /* Adding 2 bytes should succeed */
102*e0c4386eSCy Schubert             || !TEST_true(WPACKET_put_bytes_u16(&pkt, 0xfeff))
103*e0c4386eSCy Schubert                 /* Adding 1 more byte should fail */
104*e0c4386eSCy Schubert             || !TEST_false(WPACKET_put_bytes_u8(&pkt, 0xff))
105*e0c4386eSCy Schubert             || !TEST_true(WPACKET_finish(&pkt))
106*e0c4386eSCy Schubert             || !TEST_true(WPACKET_get_total_written(&pkt, &written))
107*e0c4386eSCy Schubert             || !TEST_mem_eq(sbuf, written, alloc, sizeof(alloc)))
108*e0c4386eSCy Schubert         return cleanup(&pkt);
109*e0c4386eSCy Schubert 
110*e0c4386eSCy Schubert     return 1;
111*e0c4386eSCy Schubert }
112*e0c4386eSCy Schubert 
test_WPACKET_set_max_size(void)113*e0c4386eSCy Schubert static int test_WPACKET_set_max_size(void)
114*e0c4386eSCy Schubert {
115*e0c4386eSCy Schubert     WPACKET pkt;
116*e0c4386eSCy Schubert     size_t written;
117*e0c4386eSCy Schubert 
118*e0c4386eSCy Schubert     if (!TEST_true(WPACKET_init(&pkt, buf))
119*e0c4386eSCy Schubert                 /*
120*e0c4386eSCy Schubert                  * No previous lenbytes set so we should be ok to set the max
121*e0c4386eSCy Schubert                  * possible max size
122*e0c4386eSCy Schubert                  */
123*e0c4386eSCy Schubert             || !TEST_true(WPACKET_set_max_size(&pkt, SIZE_MAX))
124*e0c4386eSCy Schubert                 /* We should be able to set it smaller too */
125*e0c4386eSCy Schubert             || !TEST_true(WPACKET_set_max_size(&pkt, SIZE_MAX -1))
126*e0c4386eSCy Schubert                 /* And setting it bigger again should be ok */
127*e0c4386eSCy Schubert             || !TEST_true(WPACKET_set_max_size(&pkt, SIZE_MAX))
128*e0c4386eSCy Schubert             || !TEST_true(WPACKET_finish(&pkt)))
129*e0c4386eSCy Schubert         return cleanup(&pkt);
130*e0c4386eSCy Schubert 
131*e0c4386eSCy Schubert     if (!TEST_true(WPACKET_init_len(&pkt, buf, 1))
132*e0c4386eSCy Schubert                 /*
133*e0c4386eSCy Schubert                  * Should fail because we already consumed 1 byte with the
134*e0c4386eSCy Schubert                  * length
135*e0c4386eSCy Schubert                  */
136*e0c4386eSCy Schubert             || !TEST_false(WPACKET_set_max_size(&pkt, 0))
137*e0c4386eSCy Schubert                 /*
138*e0c4386eSCy Schubert                  * Max size can't be bigger than biggest that will fit in
139*e0c4386eSCy Schubert                  * lenbytes
140*e0c4386eSCy Schubert                  */
141*e0c4386eSCy Schubert             || !TEST_false(WPACKET_set_max_size(&pkt, 0x0101))
142*e0c4386eSCy Schubert                 /* It can be the same as the maximum possible size */
143*e0c4386eSCy Schubert             || !TEST_true(WPACKET_set_max_size(&pkt, 0x0100))
144*e0c4386eSCy Schubert                 /* Or it can be less */
145*e0c4386eSCy Schubert             || !TEST_true(WPACKET_set_max_size(&pkt, 0x01))
146*e0c4386eSCy Schubert                 /* Should fail because packet is already filled */
147*e0c4386eSCy Schubert             || !TEST_false(WPACKET_put_bytes_u8(&pkt, 0xff))
148*e0c4386eSCy Schubert                 /* You can't put in more bytes than max size */
149*e0c4386eSCy Schubert             || !TEST_true(WPACKET_set_max_size(&pkt, 0x02))
150*e0c4386eSCy Schubert             || !TEST_true(WPACKET_put_bytes_u8(&pkt, 0xff))
151*e0c4386eSCy Schubert             || !TEST_false(WPACKET_put_bytes_u8(&pkt, 0xff))
152*e0c4386eSCy Schubert             || !TEST_true(WPACKET_finish(&pkt))
153*e0c4386eSCy Schubert             || !TEST_true(WPACKET_get_total_written(&pkt, &written))
154*e0c4386eSCy Schubert             || !TEST_mem_eq(buf->data, written, simple2, sizeof(simple2)))
155*e0c4386eSCy Schubert         return cleanup(&pkt);
156*e0c4386eSCy Schubert 
157*e0c4386eSCy Schubert     return 1;
158*e0c4386eSCy Schubert }
159*e0c4386eSCy Schubert 
test_WPACKET_start_sub_packet(void)160*e0c4386eSCy Schubert static int test_WPACKET_start_sub_packet(void)
161*e0c4386eSCy Schubert {
162*e0c4386eSCy Schubert     WPACKET pkt;
163*e0c4386eSCy Schubert     size_t written;
164*e0c4386eSCy Schubert     size_t len;
165*e0c4386eSCy Schubert 
166*e0c4386eSCy Schubert     if (!TEST_true(WPACKET_init(&pkt, buf))
167*e0c4386eSCy Schubert             || !TEST_true(WPACKET_start_sub_packet(&pkt))
168*e0c4386eSCy Schubert             || !TEST_true(WPACKET_put_bytes_u8(&pkt, 0xff))
169*e0c4386eSCy Schubert                 /* Can't finish because we have a sub packet */
170*e0c4386eSCy Schubert             || !TEST_false(WPACKET_finish(&pkt))
171*e0c4386eSCy Schubert             || !TEST_true(WPACKET_close(&pkt))
172*e0c4386eSCy Schubert                 /* Sub packet is closed so can't close again */
173*e0c4386eSCy Schubert             || !TEST_false(WPACKET_close(&pkt))
174*e0c4386eSCy Schubert                 /* Now a top level so finish should succeed */
175*e0c4386eSCy Schubert             || !TEST_true(WPACKET_finish(&pkt))
176*e0c4386eSCy Schubert             || !TEST_true(WPACKET_get_total_written(&pkt, &written))
177*e0c4386eSCy Schubert             || !TEST_mem_eq(buf->data, written, simple1, sizeof(simple1)))
178*e0c4386eSCy Schubert         return cleanup(&pkt);
179*e0c4386eSCy Schubert 
180*e0c4386eSCy Schubert    /* Single sub-packet with length prefix */
181*e0c4386eSCy Schubert     if (!TEST_true(WPACKET_init(&pkt, buf))
182*e0c4386eSCy Schubert             || !TEST_true(WPACKET_start_sub_packet_u8(&pkt))
183*e0c4386eSCy Schubert             || !TEST_true(WPACKET_put_bytes_u8(&pkt, 0xff))
184*e0c4386eSCy Schubert             || !TEST_true(WPACKET_close(&pkt))
185*e0c4386eSCy Schubert             || !TEST_true(WPACKET_finish(&pkt))
186*e0c4386eSCy Schubert             || !TEST_true(WPACKET_get_total_written(&pkt, &written))
187*e0c4386eSCy Schubert             || !TEST_mem_eq(buf->data, written, simple2, sizeof(simple2)))
188*e0c4386eSCy Schubert         return cleanup(&pkt);
189*e0c4386eSCy Schubert 
190*e0c4386eSCy Schubert     /* Nested sub-packets with length prefixes */
191*e0c4386eSCy Schubert     if (!TEST_true(WPACKET_init(&pkt, buf))
192*e0c4386eSCy Schubert             || !TEST_true(WPACKET_start_sub_packet_u8(&pkt))
193*e0c4386eSCy Schubert             || !TEST_true(WPACKET_put_bytes_u8(&pkt, 0xff))
194*e0c4386eSCy Schubert             || !TEST_true(WPACKET_start_sub_packet_u8(&pkt))
195*e0c4386eSCy Schubert             || !TEST_true(WPACKET_put_bytes_u8(&pkt, 0xff))
196*e0c4386eSCy Schubert             || !TEST_true(WPACKET_get_length(&pkt, &len))
197*e0c4386eSCy Schubert             || !TEST_size_t_eq(len, 1)
198*e0c4386eSCy Schubert             || !TEST_true(WPACKET_close(&pkt))
199*e0c4386eSCy Schubert             || !TEST_true(WPACKET_get_length(&pkt, &len))
200*e0c4386eSCy Schubert             || !TEST_size_t_eq(len, 3)
201*e0c4386eSCy Schubert             || !TEST_true(WPACKET_close(&pkt))
202*e0c4386eSCy Schubert             || !TEST_true(WPACKET_finish(&pkt))
203*e0c4386eSCy Schubert             || !TEST_true(WPACKET_get_total_written(&pkt, &written))
204*e0c4386eSCy Schubert             || !TEST_mem_eq(buf->data, written, nestedsub, sizeof(nestedsub)))
205*e0c4386eSCy Schubert         return cleanup(&pkt);
206*e0c4386eSCy Schubert 
207*e0c4386eSCy Schubert     /* Sequential sub-packets with length prefixes */
208*e0c4386eSCy Schubert     if (!TEST_true(WPACKET_init(&pkt, buf))
209*e0c4386eSCy Schubert             || !TEST_true(WPACKET_start_sub_packet_u8(&pkt))
210*e0c4386eSCy Schubert             || !TEST_true(WPACKET_put_bytes_u8(&pkt, 0xff))
211*e0c4386eSCy Schubert             || !TEST_true(WPACKET_close(&pkt))
212*e0c4386eSCy Schubert             || !TEST_true(WPACKET_start_sub_packet_u8(&pkt))
213*e0c4386eSCy Schubert             || !TEST_true(WPACKET_put_bytes_u8(&pkt, 0xff))
214*e0c4386eSCy Schubert             || !TEST_true(WPACKET_close(&pkt))
215*e0c4386eSCy Schubert             || !TEST_true(WPACKET_finish(&pkt))
216*e0c4386eSCy Schubert             || !TEST_true(WPACKET_get_total_written(&pkt, &written))
217*e0c4386eSCy Schubert             || !TEST_mem_eq(buf->data, written, seqsub, sizeof(seqsub)))
218*e0c4386eSCy Schubert         return cleanup(&pkt);
219*e0c4386eSCy Schubert 
220*e0c4386eSCy Schubert     /* Nested sub-packets with lengths filled before finish */
221*e0c4386eSCy Schubert     if (!TEST_true(WPACKET_init(&pkt, buf))
222*e0c4386eSCy Schubert             || !TEST_true(WPACKET_start_sub_packet_u8(&pkt))
223*e0c4386eSCy Schubert             || !TEST_true(WPACKET_put_bytes_u8(&pkt, 0xff))
224*e0c4386eSCy Schubert             || !TEST_true(WPACKET_start_sub_packet_u8(&pkt))
225*e0c4386eSCy Schubert             || !TEST_true(WPACKET_put_bytes_u8(&pkt, 0xff))
226*e0c4386eSCy Schubert             || !TEST_true(WPACKET_get_length(&pkt, &len))
227*e0c4386eSCy Schubert             || !TEST_size_t_eq(len, 1)
228*e0c4386eSCy Schubert             || !TEST_true(WPACKET_close(&pkt))
229*e0c4386eSCy Schubert             || !TEST_true(WPACKET_get_length(&pkt, &len))
230*e0c4386eSCy Schubert             || !TEST_size_t_eq(len, 3)
231*e0c4386eSCy Schubert             || !TEST_true(WPACKET_close(&pkt))
232*e0c4386eSCy Schubert             || !TEST_true(WPACKET_fill_lengths(&pkt))
233*e0c4386eSCy Schubert             || !TEST_true(WPACKET_get_total_written(&pkt, &written))
234*e0c4386eSCy Schubert             || !TEST_mem_eq(buf->data, written, nestedsub, sizeof(nestedsub))
235*e0c4386eSCy Schubert             || !TEST_true(WPACKET_finish(&pkt)))
236*e0c4386eSCy Schubert         return cleanup(&pkt);
237*e0c4386eSCy Schubert 
238*e0c4386eSCy Schubert     return 1;
239*e0c4386eSCy Schubert }
240*e0c4386eSCy Schubert 
241*e0c4386eSCy Schubert 
test_WPACKET_set_flags(void)242*e0c4386eSCy Schubert static int test_WPACKET_set_flags(void)
243*e0c4386eSCy Schubert {
244*e0c4386eSCy Schubert     WPACKET pkt;
245*e0c4386eSCy Schubert     size_t written;
246*e0c4386eSCy Schubert 
247*e0c4386eSCy Schubert     /* Set packet to be non-zero length */
248*e0c4386eSCy Schubert     if (!TEST_true(WPACKET_init(&pkt, buf))
249*e0c4386eSCy Schubert             || !TEST_true(WPACKET_set_flags(&pkt, WPACKET_FLAGS_NON_ZERO_LENGTH))
250*e0c4386eSCy Schubert                 /* Should fail because of zero length */
251*e0c4386eSCy Schubert             || !TEST_false(WPACKET_finish(&pkt))
252*e0c4386eSCy Schubert             || !TEST_true(WPACKET_put_bytes_u8(&pkt, 0xff))
253*e0c4386eSCy Schubert             || !TEST_true(WPACKET_finish(&pkt))
254*e0c4386eSCy Schubert             || !TEST_true(WPACKET_get_total_written(&pkt, &written))
255*e0c4386eSCy Schubert             || !TEST_mem_eq(buf->data, written, simple1, sizeof(simple1)))
256*e0c4386eSCy Schubert         return cleanup(&pkt);
257*e0c4386eSCy Schubert 
258*e0c4386eSCy Schubert     /* Repeat above test in a sub-packet */
259*e0c4386eSCy Schubert     if (!TEST_true(WPACKET_init(&pkt, buf))
260*e0c4386eSCy Schubert             || !TEST_true(WPACKET_start_sub_packet(&pkt))
261*e0c4386eSCy Schubert             || !TEST_true(WPACKET_set_flags(&pkt, WPACKET_FLAGS_NON_ZERO_LENGTH))
262*e0c4386eSCy Schubert                 /* Should fail because of zero length */
263*e0c4386eSCy Schubert             || !TEST_false(WPACKET_close(&pkt))
264*e0c4386eSCy Schubert             || !TEST_true(WPACKET_put_bytes_u8(&pkt, 0xff))
265*e0c4386eSCy Schubert             || !TEST_true(WPACKET_close(&pkt))
266*e0c4386eSCy Schubert             || !TEST_true(WPACKET_finish(&pkt))
267*e0c4386eSCy Schubert             || !TEST_true(WPACKET_get_total_written(&pkt, &written))
268*e0c4386eSCy Schubert             || !TEST_mem_eq(buf->data, written, simple1, sizeof(simple1)))
269*e0c4386eSCy Schubert         return cleanup(&pkt);
270*e0c4386eSCy Schubert 
271*e0c4386eSCy Schubert     /* Set packet to abandon non-zero length */
272*e0c4386eSCy Schubert     if (!TEST_true(WPACKET_init_len(&pkt, buf, 1))
273*e0c4386eSCy Schubert             || !TEST_true(WPACKET_set_flags(&pkt, WPACKET_FLAGS_ABANDON_ON_ZERO_LENGTH))
274*e0c4386eSCy Schubert             || !TEST_true(WPACKET_finish(&pkt))
275*e0c4386eSCy Schubert             || !TEST_true(WPACKET_get_total_written(&pkt, &written))
276*e0c4386eSCy Schubert             || !TEST_size_t_eq(written, 0))
277*e0c4386eSCy Schubert         return cleanup(&pkt);
278*e0c4386eSCy Schubert 
279*e0c4386eSCy Schubert     /* Repeat above test but only abandon a sub-packet */
280*e0c4386eSCy Schubert     if (!TEST_true(WPACKET_init_len(&pkt, buf, 1))
281*e0c4386eSCy Schubert             || !TEST_true(WPACKET_start_sub_packet_u8(&pkt))
282*e0c4386eSCy Schubert             || !TEST_true(WPACKET_set_flags(&pkt, WPACKET_FLAGS_ABANDON_ON_ZERO_LENGTH))
283*e0c4386eSCy Schubert             || !TEST_true(WPACKET_close(&pkt))
284*e0c4386eSCy Schubert             || !TEST_true(WPACKET_finish(&pkt))
285*e0c4386eSCy Schubert             || !TEST_true(WPACKET_get_total_written(&pkt, &written))
286*e0c4386eSCy Schubert             || !TEST_mem_eq(buf->data, written, empty, sizeof(empty)))
287*e0c4386eSCy Schubert         return cleanup(&pkt);
288*e0c4386eSCy Schubert 
289*e0c4386eSCy Schubert     /* And repeat with a non empty sub-packet */
290*e0c4386eSCy Schubert     if (!TEST_true(WPACKET_init(&pkt, buf))
291*e0c4386eSCy Schubert             || !TEST_true(WPACKET_start_sub_packet_u8(&pkt))
292*e0c4386eSCy Schubert             || !TEST_true(WPACKET_set_flags(&pkt, WPACKET_FLAGS_ABANDON_ON_ZERO_LENGTH))
293*e0c4386eSCy Schubert             || !TEST_true(WPACKET_put_bytes_u8(&pkt, 0xff))
294*e0c4386eSCy Schubert             || !TEST_true(WPACKET_close(&pkt))
295*e0c4386eSCy Schubert             || !TEST_true(WPACKET_finish(&pkt))
296*e0c4386eSCy Schubert             || !TEST_true(WPACKET_get_total_written(&pkt, &written))
297*e0c4386eSCy Schubert             || !TEST_mem_eq(buf->data, written, simple2, sizeof(simple2)))
298*e0c4386eSCy Schubert         return cleanup(&pkt);
299*e0c4386eSCy Schubert     return 1;
300*e0c4386eSCy Schubert }
301*e0c4386eSCy Schubert 
test_WPACKET_allocate_bytes(void)302*e0c4386eSCy Schubert static int test_WPACKET_allocate_bytes(void)
303*e0c4386eSCy Schubert {
304*e0c4386eSCy Schubert     WPACKET pkt;
305*e0c4386eSCy Schubert     size_t written;
306*e0c4386eSCy Schubert     unsigned char *bytes;
307*e0c4386eSCy Schubert 
308*e0c4386eSCy Schubert     if (!TEST_true(WPACKET_init_len(&pkt, buf, 1))
309*e0c4386eSCy Schubert             || !TEST_true(WPACKET_allocate_bytes(&pkt, 2, &bytes)))
310*e0c4386eSCy Schubert         return cleanup(&pkt);
311*e0c4386eSCy Schubert     bytes[0] = 0xfe;
312*e0c4386eSCy Schubert     bytes[1] = 0xff;
313*e0c4386eSCy Schubert     if (!TEST_true(WPACKET_finish(&pkt))
314*e0c4386eSCy Schubert             || !TEST_true(WPACKET_get_total_written(&pkt, &written))
315*e0c4386eSCy Schubert             || !TEST_mem_eq(buf->data, written, alloc, sizeof(alloc)))
316*e0c4386eSCy Schubert         return cleanup(&pkt);
317*e0c4386eSCy Schubert 
318*e0c4386eSCy Schubert     /* Repeat with WPACKET_sub_allocate_bytes */
319*e0c4386eSCy Schubert     if (!TEST_true(WPACKET_init_len(&pkt, buf, 1))
320*e0c4386eSCy Schubert             || !TEST_true(WPACKET_sub_allocate_bytes_u8(&pkt, 2, &bytes)))
321*e0c4386eSCy Schubert         return cleanup(&pkt);
322*e0c4386eSCy Schubert     bytes[0] = 0xfe;
323*e0c4386eSCy Schubert     bytes[1] = 0xff;
324*e0c4386eSCy Schubert     if (!TEST_true(WPACKET_finish(&pkt))
325*e0c4386eSCy Schubert             || !TEST_true(WPACKET_get_total_written(&pkt, &written))
326*e0c4386eSCy Schubert             || !TEST_mem_eq(buf->data, written, submem, sizeof(submem)))
327*e0c4386eSCy Schubert         return cleanup(&pkt);
328*e0c4386eSCy Schubert 
329*e0c4386eSCy Schubert     return 1;
330*e0c4386eSCy Schubert }
331*e0c4386eSCy Schubert 
test_WPACKET_memcpy(void)332*e0c4386eSCy Schubert static int test_WPACKET_memcpy(void)
333*e0c4386eSCy Schubert {
334*e0c4386eSCy Schubert     WPACKET pkt;
335*e0c4386eSCy Schubert     size_t written;
336*e0c4386eSCy Schubert     const unsigned char bytes[] = { 0xfe, 0xff };
337*e0c4386eSCy Schubert 
338*e0c4386eSCy Schubert     if (!TEST_true(WPACKET_init_len(&pkt, buf, 1))
339*e0c4386eSCy Schubert             || !TEST_true(WPACKET_memcpy(&pkt, bytes, sizeof(bytes)))
340*e0c4386eSCy Schubert             || !TEST_true(WPACKET_finish(&pkt))
341*e0c4386eSCy Schubert             || !TEST_true(WPACKET_get_total_written(&pkt, &written))
342*e0c4386eSCy Schubert             || !TEST_mem_eq(buf->data, written, alloc, sizeof(alloc)))
343*e0c4386eSCy Schubert         return cleanup(&pkt);
344*e0c4386eSCy Schubert 
345*e0c4386eSCy Schubert     /* Repeat with WPACKET_sub_memcpy() */
346*e0c4386eSCy Schubert     if (!TEST_true(WPACKET_init_len(&pkt, buf, 1))
347*e0c4386eSCy Schubert             || !TEST_true(WPACKET_sub_memcpy_u8(&pkt, bytes, sizeof(bytes)))
348*e0c4386eSCy Schubert             || !TEST_true(WPACKET_finish(&pkt))
349*e0c4386eSCy Schubert             || !TEST_true(WPACKET_get_total_written(&pkt, &written))
350*e0c4386eSCy Schubert             || !TEST_mem_eq(buf->data, written, submem, sizeof(submem)))
351*e0c4386eSCy Schubert         return cleanup(&pkt);
352*e0c4386eSCy Schubert 
353*e0c4386eSCy Schubert     return 1;
354*e0c4386eSCy Schubert }
355*e0c4386eSCy Schubert 
test_WPACKET_init_der(void)356*e0c4386eSCy Schubert static int test_WPACKET_init_der(void)
357*e0c4386eSCy Schubert {
358*e0c4386eSCy Schubert     WPACKET pkt;
359*e0c4386eSCy Schubert     unsigned char sbuf[1024];
360*e0c4386eSCy Schubert     unsigned char testdata[] = { 0x00, 0x01, 0x02, 0x03 };
361*e0c4386eSCy Schubert     unsigned char testdata2[259]  = { 0x82, 0x01, 0x00 };
362*e0c4386eSCy Schubert     size_t written[2];
363*e0c4386eSCy Schubert     size_t size1, size2;
364*e0c4386eSCy Schubert     int flags = WPACKET_FLAGS_ABANDON_ON_ZERO_LENGTH;
365*e0c4386eSCy Schubert     int i;
366*e0c4386eSCy Schubert 
367*e0c4386eSCy Schubert     /* Test initialising for writing DER */
368*e0c4386eSCy Schubert     if (!TEST_true(WPACKET_init_der(&pkt, sbuf, sizeof(sbuf)))
369*e0c4386eSCy Schubert             || !TEST_true(WPACKET_put_bytes_u24(&pkt, 0xfffefd))
370*e0c4386eSCy Schubert                /* Test writing data in a length prefixed sub-packet */
371*e0c4386eSCy Schubert             || !TEST_true(WPACKET_start_sub_packet(&pkt))
372*e0c4386eSCy Schubert             || !TEST_true(WPACKET_memcpy(&pkt, testdata, sizeof(testdata)))
373*e0c4386eSCy Schubert             || !TEST_true(WPACKET_close(&pkt))
374*e0c4386eSCy Schubert             || !TEST_true(WPACKET_put_bytes_u8(&pkt, 0xfc))
375*e0c4386eSCy Schubert             /* this sub-packet is empty, and should render zero bytes */
376*e0c4386eSCy Schubert             || (!TEST_true(WPACKET_start_sub_packet(&pkt))
377*e0c4386eSCy Schubert                 || !TEST_true(WPACKET_set_flags(&pkt, flags))
378*e0c4386eSCy Schubert                 || !TEST_true(WPACKET_get_total_written(&pkt, &size1))
379*e0c4386eSCy Schubert                 || !TEST_true(WPACKET_close(&pkt))
380*e0c4386eSCy Schubert                 || !TEST_true(WPACKET_get_total_written(&pkt, &size2))
381*e0c4386eSCy Schubert                 || !TEST_size_t_eq(size1, size2))
382*e0c4386eSCy Schubert             || !TEST_true(WPACKET_finish(&pkt))
383*e0c4386eSCy Schubert             || !TEST_true(WPACKET_get_total_written(&pkt, &written[0]))
384*e0c4386eSCy Schubert             || !TEST_mem_eq(WPACKET_get_curr(&pkt), written[0], simpleder,
385*e0c4386eSCy Schubert                             sizeof(simpleder)))
386*e0c4386eSCy Schubert         return cleanup(&pkt);
387*e0c4386eSCy Schubert 
388*e0c4386eSCy Schubert     /* Generate random packet data for test */
389*e0c4386eSCy Schubert     if (!TEST_int_gt(RAND_bytes(&testdata2[3], sizeof(testdata2) - 3), 0))
390*e0c4386eSCy Schubert         return 0;
391*e0c4386eSCy Schubert 
392*e0c4386eSCy Schubert     /*
393*e0c4386eSCy Schubert      * Test with a sub-packet that has 2 length bytes. We do 2 passes - first
394*e0c4386eSCy Schubert      * with a NULL buffer, just to calculate lengths, and a second pass with a
395*e0c4386eSCy Schubert      * real buffer to actually generate a packet
396*e0c4386eSCy Schubert      */
397*e0c4386eSCy Schubert     for (i = 0; i < 2; i++) {
398*e0c4386eSCy Schubert         if (i == 0) {
399*e0c4386eSCy Schubert             if (!TEST_true(WPACKET_init_null_der(&pkt)))
400*e0c4386eSCy Schubert                 return 0;
401*e0c4386eSCy Schubert         } else {
402*e0c4386eSCy Schubert             if (!TEST_true(WPACKET_init_der(&pkt, sbuf, sizeof(sbuf))))
403*e0c4386eSCy Schubert                 return 0;
404*e0c4386eSCy Schubert         }
405*e0c4386eSCy Schubert         if (!TEST_true(WPACKET_start_sub_packet(&pkt))
406*e0c4386eSCy Schubert             || !TEST_true(WPACKET_memcpy(&pkt, &testdata2[3],
407*e0c4386eSCy Schubert                                          sizeof(testdata2) - 3))
408*e0c4386eSCy Schubert             || !TEST_true(WPACKET_close(&pkt))
409*e0c4386eSCy Schubert             || !TEST_true(WPACKET_finish(&pkt))
410*e0c4386eSCy Schubert             || !TEST_true(WPACKET_get_total_written(&pkt, &written[i])))
411*e0c4386eSCy Schubert         return cleanup(&pkt);
412*e0c4386eSCy Schubert     }
413*e0c4386eSCy Schubert 
414*e0c4386eSCy Schubert     /*
415*e0c4386eSCy Schubert      * Check that the size calculated in the first pass equals the size of the
416*e0c4386eSCy Schubert      * packet actually generated in the second pass. Also check the generated
417*e0c4386eSCy Schubert      * packet looks as we expect it to.
418*e0c4386eSCy Schubert      */
419*e0c4386eSCy Schubert     if (!TEST_size_t_eq(written[0], written[1])
420*e0c4386eSCy Schubert             || !TEST_mem_eq(WPACKET_get_curr(&pkt), written[1], testdata2,
421*e0c4386eSCy Schubert                             sizeof(testdata2)))
422*e0c4386eSCy Schubert         return 0;
423*e0c4386eSCy Schubert 
424*e0c4386eSCy Schubert     return 1;
425*e0c4386eSCy Schubert }
426*e0c4386eSCy Schubert 
setup_tests(void)427*e0c4386eSCy Schubert int setup_tests(void)
428*e0c4386eSCy Schubert {
429*e0c4386eSCy Schubert     if (!TEST_ptr(buf = BUF_MEM_new()))
430*e0c4386eSCy Schubert             return 0;
431*e0c4386eSCy Schubert 
432*e0c4386eSCy Schubert     ADD_TEST(test_WPACKET_init);
433*e0c4386eSCy Schubert     ADD_TEST(test_WPACKET_set_max_size);
434*e0c4386eSCy Schubert     ADD_TEST(test_WPACKET_start_sub_packet);
435*e0c4386eSCy Schubert     ADD_TEST(test_WPACKET_set_flags);
436*e0c4386eSCy Schubert     ADD_TEST(test_WPACKET_allocate_bytes);
437*e0c4386eSCy Schubert     ADD_TEST(test_WPACKET_memcpy);
438*e0c4386eSCy Schubert     ADD_TEST(test_WPACKET_init_der);
439*e0c4386eSCy Schubert     return 1;
440*e0c4386eSCy Schubert }
441*e0c4386eSCy Schubert 
cleanup_tests(void)442*e0c4386eSCy Schubert void cleanup_tests(void)
443*e0c4386eSCy Schubert {
444*e0c4386eSCy Schubert     BUF_MEM_free(buf);
445*e0c4386eSCy Schubert }
446