1276707Sdes/* 	$OpenBSD: test_sshbuf_getput_basic.c,v 1.1 2014/04/30 05:32:00 djm Exp $ */
2276707Sdes/*
3276707Sdes * Regress test for sshbuf.h buffer API
4276707Sdes *
5276707Sdes * Placed in the public domain
6276707Sdes */
7276707Sdes
8276707Sdes#include "includes.h"
9276707Sdes
10276707Sdes#include <sys/types.h>
11276707Sdes#include <sys/param.h>
12276707Sdes#include <stdio.h>
13276707Sdes#ifdef HAVE_STDINT_H
14276707Sdes# include <stdint.h>
15276707Sdes#endif
16276707Sdes#include <stdlib.h>
17276707Sdes#include <string.h>
18276707Sdes
19276707Sdes#include "../test_helper/test_helper.h"
20276707Sdes#include "ssherr.h"
21276707Sdes#include "sshbuf.h"
22276707Sdes
23276707Sdesvoid sshbuf_getput_basic_tests(void);
24276707Sdes
25276707Sdesvoid
26276707Sdessshbuf_getput_basic_tests(void)
27276707Sdes{
28276707Sdes	struct sshbuf *p1, *p2;
29276707Sdes	const u_char *cd;
30276707Sdes	u_char *d, d2[32], x[] = {
31276707Sdes		0x11, 0x22, 0x33, 0x44, 0x55, 0x66, 0x77, 0x88, 0x00, 0x99
32276707Sdes	};
33276707Sdes	u_int64_t v64;
34276707Sdes	u_int32_t v32;
35276707Sdes	u_int16_t v16;
36276707Sdes	u_char v8;
37276707Sdes	size_t s;
38276707Sdes	char *s2;
39276707Sdes	int r;
40276707Sdes	u_char bn1[] = { 0x00, 0x00, 0x00 };
41276707Sdes	u_char bn2[] = { 0x00, 0x00, 0x01, 0x02 };
42276707Sdes	u_char bn3[] = { 0x00, 0x80, 0x09 };
43276707Sdes	u_char bn_exp1[] = { 0x00, 0x00, 0x00, 0x00 };
44276707Sdes	u_char bn_exp2[] = { 0x00, 0x00, 0x00, 0x02, 0x01, 0x02 };
45276707Sdes	u_char bn_exp3[] = { 0x00, 0x00, 0x00, 0x03, 0x00, 0x80, 0x09 };
46276707Sdes
47276707Sdes	TEST_START("PEEK_U64");
48276707Sdes	ASSERT_U64_EQ(PEEK_U64(x), 0x1122334455667788ULL);
49276707Sdes	TEST_DONE();
50276707Sdes
51276707Sdes	TEST_START("PEEK_U32");
52276707Sdes	ASSERT_U32_EQ(PEEK_U32(x), 0x11223344);
53276707Sdes	TEST_DONE();
54276707Sdes
55276707Sdes	TEST_START("PEEK_U16");
56276707Sdes	ASSERT_U16_EQ(PEEK_U16(x), 0x1122);
57276707Sdes	TEST_DONE();
58276707Sdes
59276707Sdes	TEST_START("POKE_U64");
60276707Sdes	bzero(d2, sizeof(d2));
61276707Sdes	POKE_U64(d2, 0x1122334455667788ULL);
62276707Sdes	ASSERT_MEM_EQ(d2, x, 8);
63276707Sdes	TEST_DONE();
64276707Sdes
65276707Sdes	TEST_START("POKE_U32");
66276707Sdes	bzero(d2, sizeof(d2));
67276707Sdes	POKE_U32(d2, 0x11223344);
68276707Sdes	ASSERT_MEM_EQ(d2, x, 4);
69276707Sdes	TEST_DONE();
70276707Sdes
71276707Sdes	TEST_START("POKE_U16");
72276707Sdes	bzero(d2, sizeof(d2));
73276707Sdes	POKE_U16(d2, 0x1122);
74276707Sdes	ASSERT_MEM_EQ(d2, x, 2);
75276707Sdes	TEST_DONE();
76276707Sdes
77276707Sdes	TEST_START("sshbuf_put");
78276707Sdes	p1 = sshbuf_new();
79276707Sdes	ASSERT_PTR_NE(p1, NULL);
80276707Sdes	ASSERT_INT_EQ(sshbuf_put(p1, x, 5), 0);
81276707Sdes	ASSERT_SIZE_T_EQ(sshbuf_len(p1), 5);
82276707Sdes	cd = sshbuf_ptr(p1);
83276707Sdes	ASSERT_PTR_NE(cd, NULL);
84276707Sdes	ASSERT_U8_EQ(cd[0], 0x11);
85276707Sdes	ASSERT_U8_EQ(cd[1], 0x22);
86276707Sdes	ASSERT_U8_EQ(cd[2], 0x33);
87276707Sdes	ASSERT_U8_EQ(cd[3], 0x44);
88276707Sdes	ASSERT_U8_EQ(cd[4], 0x55);
89276707Sdes	TEST_DONE();
90276707Sdes
91276707Sdes	TEST_START("sshbuf_get");
92276707Sdes	ASSERT_INT_EQ(sshbuf_get(p1, d2, 4), 0);
93276707Sdes	ASSERT_MEM_EQ(d2, x, 4);
94276707Sdes	ASSERT_SIZE_T_EQ(sshbuf_len(p1), 1);
95276707Sdes	ASSERT_U8_EQ(*(sshbuf_ptr(p1)), 0x55);
96276707Sdes	TEST_DONE();
97276707Sdes
98276707Sdes	TEST_START("sshbuf_get truncated");
99276707Sdes	r = sshbuf_get(p1, d2, 4);
100276707Sdes	ASSERT_INT_EQ(r, SSH_ERR_MESSAGE_INCOMPLETE);
101276707Sdes	ASSERT_SIZE_T_EQ(sshbuf_len(p1), 1);
102276707Sdes	ASSERT_U8_EQ(*(sshbuf_ptr(p1)), 0x55);
103276707Sdes	TEST_DONE();
104276707Sdes
105276707Sdes	TEST_START("sshbuf_put truncated");
106276707Sdes	ASSERT_INT_EQ(sshbuf_set_max_size(p1, 4), 0);
107276707Sdes	r = sshbuf_put(p1, x, 5);
108276707Sdes	ASSERT_INT_EQ(r, SSH_ERR_NO_BUFFER_SPACE);
109276707Sdes	ASSERT_SIZE_T_EQ(sshbuf_len(p1), 1);
110276707Sdes	sshbuf_free(p1);
111276707Sdes	TEST_DONE();
112276707Sdes
113276707Sdes	TEST_START("sshbuf_get_u64");
114276707Sdes	p1 = sshbuf_new();
115276707Sdes	ASSERT_PTR_NE(p1, NULL);
116276707Sdes	ASSERT_INT_EQ(sshbuf_put(p1, x, 10), 0);
117276707Sdes	ASSERT_SIZE_T_EQ(sshbuf_len(p1), 10);
118276707Sdes	ASSERT_INT_EQ(sshbuf_get_u64(p1, &v64), 0);
119276707Sdes	ASSERT_U64_EQ(v64, 0x1122334455667788ULL);
120276707Sdes	ASSERT_SIZE_T_EQ(sshbuf_len(p1), 2);
121276707Sdes	TEST_DONE();
122276707Sdes
123276707Sdes	TEST_START("sshbuf_get_u64 truncated");
124276707Sdes	ASSERT_SIZE_T_EQ(sshbuf_len(p1), 2);
125276707Sdes	r = sshbuf_get_u64(p1, &v64);
126276707Sdes	ASSERT_INT_EQ(r, SSH_ERR_MESSAGE_INCOMPLETE);
127276707Sdes	ASSERT_SIZE_T_EQ(sshbuf_len(p1), 2);
128276707Sdes	sshbuf_free(p1);
129276707Sdes	TEST_DONE();
130276707Sdes
131276707Sdes	TEST_START("sshbuf_get_u32");
132276707Sdes	p1 = sshbuf_new();
133276707Sdes	ASSERT_PTR_NE(p1, NULL);
134276707Sdes	ASSERT_INT_EQ(sshbuf_put(p1, x, 10), 0);
135276707Sdes	ASSERT_SIZE_T_EQ(sshbuf_len(p1), 10);
136276707Sdes	ASSERT_INT_EQ(sshbuf_get_u32(p1, &v32), 0);
137276707Sdes	ASSERT_U32_EQ(v32, 0x11223344);
138276707Sdes	ASSERT_SIZE_T_EQ(sshbuf_len(p1), 6);
139276707Sdes	ASSERT_INT_EQ(sshbuf_get_u32(p1, &v32), 0);
140276707Sdes	ASSERT_U32_EQ(v32, 0x55667788);
141276707Sdes	ASSERT_SIZE_T_EQ(sshbuf_len(p1), 2);
142276707Sdes	TEST_DONE();
143276707Sdes
144276707Sdes	TEST_START("sshbuf_get_u32 truncated");
145276707Sdes	ASSERT_SIZE_T_EQ(sshbuf_len(p1), 2);
146276707Sdes	r = sshbuf_get_u32(p1, &v32);
147276707Sdes	ASSERT_INT_EQ(r, SSH_ERR_MESSAGE_INCOMPLETE);
148276707Sdes	ASSERT_SIZE_T_EQ(sshbuf_len(p1), 2);
149276707Sdes	sshbuf_free(p1);
150276707Sdes	TEST_DONE();
151276707Sdes
152276707Sdes	TEST_START("sshbuf_get_u16");
153276707Sdes	p1 = sshbuf_new();
154276707Sdes	ASSERT_PTR_NE(p1, NULL);
155276707Sdes	ASSERT_INT_EQ(sshbuf_put(p1, x, 9), 0);
156276707Sdes	ASSERT_SIZE_T_EQ(sshbuf_len(p1), 9);
157276707Sdes	ASSERT_INT_EQ(sshbuf_get_u16(p1, &v16), 0);
158276707Sdes	ASSERT_U16_EQ(v16, 0x1122);
159276707Sdes	ASSERT_SIZE_T_EQ(sshbuf_len(p1), 7);
160276707Sdes	ASSERT_INT_EQ(sshbuf_get_u16(p1, &v16), 0);
161276707Sdes	ASSERT_U16_EQ(v16, 0x3344);
162276707Sdes	ASSERT_SIZE_T_EQ(sshbuf_len(p1), 5);
163276707Sdes	ASSERT_INT_EQ(sshbuf_get_u16(p1, &v16), 0);
164276707Sdes	ASSERT_U16_EQ(v16, 0x5566);
165276707Sdes	ASSERT_SIZE_T_EQ(sshbuf_len(p1), 3);
166276707Sdes	ASSERT_INT_EQ(sshbuf_get_u16(p1, &v16), 0);
167276707Sdes	ASSERT_U16_EQ(v16, 0x7788);
168276707Sdes	ASSERT_SIZE_T_EQ(sshbuf_len(p1), 1);
169276707Sdes	TEST_DONE();
170276707Sdes
171276707Sdes	TEST_START("sshbuf_get_u16 truncated");
172276707Sdes	ASSERT_SIZE_T_EQ(sshbuf_len(p1), 1);
173276707Sdes	r = sshbuf_get_u16(p1, &v16);
174276707Sdes	ASSERT_INT_EQ(r, SSH_ERR_MESSAGE_INCOMPLETE);
175276707Sdes	ASSERT_SIZE_T_EQ(sshbuf_len(p1), 1);
176276707Sdes	sshbuf_free(p1);
177276707Sdes	TEST_DONE();
178276707Sdes
179276707Sdes	TEST_START("sshbuf_get_u8");
180276707Sdes	p1 = sshbuf_new();
181276707Sdes	ASSERT_PTR_NE(p1, NULL);
182276707Sdes	ASSERT_INT_EQ(sshbuf_put(p1, x, 2), 0);
183276707Sdes	ASSERT_SIZE_T_EQ(sshbuf_len(p1), 2);
184276707Sdes	ASSERT_INT_EQ(sshbuf_get_u8(p1, &v8), 0);
185276707Sdes	ASSERT_U8_EQ(v8, 0x11);
186276707Sdes	ASSERT_SIZE_T_EQ(sshbuf_len(p1), 1);
187276707Sdes	ASSERT_INT_EQ(sshbuf_get_u8(p1, &v8), 0);
188276707Sdes	ASSERT_U8_EQ(v8, 0x22);
189276707Sdes	ASSERT_SIZE_T_EQ(sshbuf_len(p1), 0);
190276707Sdes	TEST_DONE();
191276707Sdes
192276707Sdes	TEST_START("sshbuf_get_u8 truncated");
193276707Sdes	ASSERT_SIZE_T_EQ(sshbuf_len(p1), 0);
194276707Sdes	r = sshbuf_get_u8(p1, &v8);
195276707Sdes	ASSERT_INT_EQ(r, SSH_ERR_MESSAGE_INCOMPLETE);
196276707Sdes	ASSERT_SIZE_T_EQ(sshbuf_len(p1), 0);
197276707Sdes	sshbuf_free(p1);
198276707Sdes	TEST_DONE();
199276707Sdes
200276707Sdes	TEST_START("sshbuf_put_u64");
201276707Sdes	p1 = sshbuf_new();
202276707Sdes	ASSERT_PTR_NE(p1, NULL);
203276707Sdes	ASSERT_INT_EQ(sshbuf_put_u64(p1, 0x1122334455667788ULL), 0);
204276707Sdes	ASSERT_SIZE_T_EQ(sshbuf_len(p1), 8);
205276707Sdes	ASSERT_MEM_EQ(sshbuf_ptr(p1), x, 8);
206276707Sdes	sshbuf_free(p1);
207276707Sdes	TEST_DONE();
208276707Sdes
209276707Sdes	TEST_START("sshbuf_put_u64 exact");
210276707Sdes	p1 = sshbuf_new();
211276707Sdes	ASSERT_PTR_NE(p1, NULL);
212276707Sdes	ASSERT_INT_EQ(sshbuf_set_max_size(p1, 8), 0);
213276707Sdes	ASSERT_INT_EQ(sshbuf_put_u64(p1, 0x1122334455667788ULL), 0);
214276707Sdes	ASSERT_SIZE_T_EQ(sshbuf_len(p1), 8);
215276707Sdes	ASSERT_MEM_EQ(sshbuf_ptr(p1), x, 8);
216276707Sdes	sshbuf_free(p1);
217276707Sdes	TEST_DONE();
218276707Sdes
219276707Sdes	TEST_START("sshbuf_put_u64 limited");
220276707Sdes	p1 = sshbuf_new();
221276707Sdes	ASSERT_PTR_NE(p1, NULL);
222276707Sdes	ASSERT_INT_EQ(sshbuf_set_max_size(p1, 7), 0);
223276707Sdes	r = sshbuf_put_u64(p1, 0x1122334455667788ULL);
224276707Sdes	ASSERT_INT_EQ(r, SSH_ERR_NO_BUFFER_SPACE);
225276707Sdes	ASSERT_SIZE_T_EQ(sshbuf_len(p1), 0);
226276707Sdes	sshbuf_free(p1);
227276707Sdes	TEST_DONE();
228276707Sdes
229276707Sdes	TEST_START("sshbuf_put_u32");
230276707Sdes	p1 = sshbuf_new();
231276707Sdes	ASSERT_PTR_NE(p1, NULL);
232276707Sdes	ASSERT_INT_EQ(sshbuf_put_u32(p1, 0x11223344), 0);
233276707Sdes	ASSERT_SIZE_T_EQ(sshbuf_len(p1), 4);
234276707Sdes	ASSERT_MEM_EQ(sshbuf_ptr(p1), x, 4);
235276707Sdes	sshbuf_free(p1);
236276707Sdes	TEST_DONE();
237276707Sdes
238276707Sdes	TEST_START("sshbuf_put_u32 exact");
239276707Sdes	p1 = sshbuf_new();
240276707Sdes	ASSERT_PTR_NE(p1, NULL);
241276707Sdes	ASSERT_INT_EQ(sshbuf_set_max_size(p1, 4), 0);
242276707Sdes	ASSERT_INT_EQ(sshbuf_put_u32(p1, 0x11223344), 0);
243276707Sdes	ASSERT_SIZE_T_EQ(sshbuf_len(p1), 4);
244276707Sdes	ASSERT_MEM_EQ(sshbuf_ptr(p1), x, 4);
245276707Sdes	sshbuf_free(p1);
246276707Sdes	TEST_DONE();
247276707Sdes
248276707Sdes	TEST_START("sshbuf_put_u32 limited");
249276707Sdes	p1 = sshbuf_new();
250276707Sdes	ASSERT_PTR_NE(p1, NULL);
251276707Sdes	ASSERT_INT_EQ(sshbuf_set_max_size(p1, 3), 0);
252276707Sdes	r = sshbuf_put_u32(p1, 0x11223344);
253276707Sdes	ASSERT_INT_EQ(r, SSH_ERR_NO_BUFFER_SPACE);
254276707Sdes	ASSERT_SIZE_T_EQ(sshbuf_len(p1), 0);
255276707Sdes	sshbuf_free(p1);
256276707Sdes	TEST_DONE();
257276707Sdes
258276707Sdes	TEST_START("sshbuf_put_u16");
259276707Sdes	p1 = sshbuf_new();
260276707Sdes	ASSERT_PTR_NE(p1, NULL);
261276707Sdes	ASSERT_INT_EQ(sshbuf_put_u16(p1, 0x1122), 0);
262276707Sdes	ASSERT_SIZE_T_EQ(sshbuf_len(p1), 2);
263276707Sdes	ASSERT_MEM_EQ(sshbuf_ptr(p1), x, 2);
264276707Sdes	sshbuf_free(p1);
265276707Sdes	TEST_DONE();
266276707Sdes
267276707Sdes	TEST_START("sshbuf_put_u16");
268276707Sdes	p1 = sshbuf_new();
269276707Sdes	ASSERT_PTR_NE(p1, NULL);
270276707Sdes	ASSERT_INT_EQ(sshbuf_set_max_size(p1, 2), 0);
271276707Sdes	ASSERT_INT_EQ(sshbuf_put_u16(p1, 0x1122), 0);
272276707Sdes	ASSERT_SIZE_T_EQ(sshbuf_len(p1), 2);
273276707Sdes	ASSERT_MEM_EQ(sshbuf_ptr(p1), x, 2);
274276707Sdes	sshbuf_free(p1);
275276707Sdes	TEST_DONE();
276276707Sdes
277276707Sdes	TEST_START("sshbuf_put_u16 limited");
278276707Sdes	p1 = sshbuf_new();
279276707Sdes	ASSERT_PTR_NE(p1, NULL);
280276707Sdes	ASSERT_INT_EQ(sshbuf_set_max_size(p1, 1), 0);
281276707Sdes	r = sshbuf_put_u16(p1, 0x1122);
282276707Sdes	ASSERT_INT_EQ(r, SSH_ERR_NO_BUFFER_SPACE);
283276707Sdes	ASSERT_SIZE_T_EQ(sshbuf_len(p1), 0);
284276707Sdes	sshbuf_free(p1);
285276707Sdes	TEST_DONE();
286276707Sdes
287276707Sdes	TEST_START("sshbuf_get_string");
288276707Sdes	p1 = sshbuf_new();
289276707Sdes	ASSERT_PTR_NE(p1, NULL);
290276707Sdes	ASSERT_INT_EQ(sshbuf_put_u32(p1, sizeof(x)), 0);
291276707Sdes	ASSERT_INT_EQ(sshbuf_put(p1, x, sizeof(x)), 0);
292276707Sdes	ASSERT_INT_EQ(sshbuf_put_u32(p1, sizeof(x)), 0);
293276707Sdes	ASSERT_SIZE_T_EQ(sshbuf_len(p1), sizeof(x) + 4 + 4);
294276707Sdes	ASSERT_INT_EQ(sshbuf_get_string(p1, &d, &s), 0);
295276707Sdes	ASSERT_SIZE_T_EQ(s, sizeof(x));
296276707Sdes	ASSERT_MEM_EQ(d, x, sizeof(x));
297276707Sdes	ASSERT_SIZE_T_EQ(sshbuf_len(p1), 4);
298276707Sdes	free(d);
299276707Sdes	sshbuf_free(p1);
300276707Sdes	TEST_DONE();
301276707Sdes
302276707Sdes	TEST_START("sshbuf_get_string exact");
303276707Sdes	p1 = sshbuf_new();
304276707Sdes	ASSERT_PTR_NE(p1, NULL);
305276707Sdes	ASSERT_INT_EQ(sshbuf_set_max_size(p1, sizeof(x) + 4), 0);
306276707Sdes	ASSERT_INT_EQ(sshbuf_put_u32(p1, sizeof(x)), 0);
307276707Sdes	ASSERT_INT_EQ(sshbuf_put(p1, x, sizeof(x)), 0);
308276707Sdes	ASSERT_SIZE_T_EQ(sshbuf_len(p1), sizeof(x) + 4);
309276707Sdes	ASSERT_INT_EQ(sshbuf_get_string(p1, &d, &s), 0);
310276707Sdes	ASSERT_SIZE_T_EQ(s, sizeof(x));
311276707Sdes	ASSERT_MEM_EQ(d, x, sizeof(x));
312276707Sdes	ASSERT_SIZE_T_EQ(sshbuf_len(p1), 0);
313276707Sdes	free(d);
314276707Sdes	sshbuf_free(p1);
315276707Sdes	TEST_DONE();
316276707Sdes
317276707Sdes	TEST_START("sshbuf_get_string truncated");
318276707Sdes	p1 = sshbuf_new();
319276707Sdes	ASSERT_PTR_NE(p1, NULL);
320276707Sdes	ASSERT_INT_EQ(sshbuf_put_u32(p1, sizeof(x)), 0);
321276707Sdes	ASSERT_INT_EQ(sshbuf_put(p1, x, sizeof(x)), 0);
322276707Sdes	ASSERT_SIZE_T_EQ(sshbuf_len(p1), sizeof(x) + 4);
323276707Sdes	ASSERT_INT_EQ(sshbuf_consume_end(p1, 1), 0);
324276707Sdes	ASSERT_SIZE_T_EQ(sshbuf_len(p1), sizeof(x) + 3);
325276707Sdes	r = sshbuf_get_string(p1, &d, &s);
326276707Sdes	ASSERT_INT_EQ(r, SSH_ERR_MESSAGE_INCOMPLETE);
327276707Sdes	ASSERT_SIZE_T_EQ(sshbuf_len(p1), sizeof(x) + 3);
328276707Sdes	sshbuf_free(p1);
329276707Sdes	TEST_DONE();
330276707Sdes
331276707Sdes	TEST_START("sshbuf_get_string giant");
332276707Sdes	p1 = sshbuf_new();
333276707Sdes	ASSERT_PTR_NE(p1, NULL);
334276707Sdes	ASSERT_INT_EQ(sshbuf_put_u32(p1, 0xffffffff), 0);
335276707Sdes	ASSERT_INT_EQ(sshbuf_put(p1, x, sizeof(x)), 0);
336276707Sdes	ASSERT_SIZE_T_EQ(sshbuf_len(p1), sizeof(x) + 4);
337276707Sdes	r = sshbuf_get_string(p1, &d, &s);
338276707Sdes	ASSERT_INT_EQ(r, SSH_ERR_STRING_TOO_LARGE);
339276707Sdes	ASSERT_SIZE_T_EQ(sshbuf_len(p1), sizeof(x) + 4);
340276707Sdes	sshbuf_free(p1);
341276707Sdes	TEST_DONE();
342276707Sdes
343276707Sdes	TEST_START("sshbuf_get_cstring giant");
344276707Sdes	p1 = sshbuf_new();
345276707Sdes	ASSERT_PTR_NE(p1, NULL);
346276707Sdes	ASSERT_INT_EQ(sshbuf_put_u32(p1, 0xffffffff), 0);
347276707Sdes	ASSERT_INT_EQ(sshbuf_put(p1, x, sizeof(x)), 0);
348276707Sdes	ASSERT_SIZE_T_EQ(sshbuf_len(p1), sizeof(x) + 4);
349276707Sdes	r = sshbuf_get_cstring(p1, &s2, &s);
350276707Sdes	ASSERT_INT_EQ(r, SSH_ERR_STRING_TOO_LARGE);
351276707Sdes	ASSERT_SIZE_T_EQ(sshbuf_len(p1), sizeof(x) + 4);
352276707Sdes	sshbuf_free(p1);
353276707Sdes	TEST_DONE();
354276707Sdes
355276707Sdes	TEST_START("sshbuf_get_cstring embedded \\0");
356276707Sdes	p1 = sshbuf_new();
357276707Sdes	ASSERT_PTR_NE(p1, NULL);
358276707Sdes	ASSERT_INT_EQ(sshbuf_put_u32(p1, sizeof(x)), 0);
359276707Sdes	ASSERT_INT_EQ(sshbuf_put(p1, x, sizeof(x)), 0);
360276707Sdes	ASSERT_SIZE_T_EQ(sshbuf_len(p1), sizeof(x) + 4);
361276707Sdes	r = sshbuf_get_cstring(p1, &s2, NULL);
362276707Sdes	ASSERT_INT_EQ(r, SSH_ERR_INVALID_FORMAT);
363276707Sdes	sshbuf_free(p1);
364276707Sdes	TEST_DONE();
365276707Sdes
366276707Sdes	TEST_START("sshbuf_get_cstring trailing \\0");
367276707Sdes	p1 = sshbuf_new();
368276707Sdes	ASSERT_PTR_NE(p1, NULL);
369276707Sdes	ASSERT_INT_EQ(sshbuf_put_u32(p1, sizeof(x) - 1), 0);
370276707Sdes	ASSERT_INT_EQ(sshbuf_put(p1, x, sizeof(x) - 1), 0);
371276707Sdes	ASSERT_SIZE_T_EQ(sshbuf_len(p1), sizeof(x) + 4 - 1);
372276707Sdes	ASSERT_INT_EQ(sshbuf_get_cstring(p1, &s2, &s), 0);
373276707Sdes	ASSERT_SIZE_T_EQ(s, sizeof(x) - 1);
374276707Sdes	ASSERT_MEM_EQ(s2, x, s);
375276707Sdes	free(s2);
376276707Sdes	sshbuf_free(p1);
377276707Sdes	TEST_DONE();
378276707Sdes
379276707Sdes	TEST_START("sshbuf_put_string");
380276707Sdes	p1 = sshbuf_new();
381276707Sdes	ASSERT_PTR_NE(p1, NULL);
382276707Sdes	ASSERT_INT_EQ(sshbuf_put_string(p1, x, sizeof(x)), 0);
383276707Sdes	ASSERT_SIZE_T_EQ(sshbuf_len(p1), sizeof(x) + 4);
384276707Sdes	ASSERT_U32_EQ(PEEK_U32(sshbuf_ptr(p1)), sizeof(x));
385276707Sdes	ASSERT_MEM_EQ(sshbuf_ptr(p1) + 4, x, sizeof(x));
386276707Sdes	sshbuf_free(p1);
387276707Sdes	TEST_DONE();
388276707Sdes
389276707Sdes	TEST_START("sshbuf_put_string limited");
390276707Sdes	p1 = sshbuf_new();
391276707Sdes	ASSERT_PTR_NE(p1, NULL);
392276707Sdes	ASSERT_INT_EQ(sshbuf_set_max_size(p1, sizeof(x) + 4 - 1), 0);
393276707Sdes	r = sshbuf_put_string(p1, x, sizeof(x));
394276707Sdes	ASSERT_INT_EQ(r, SSH_ERR_NO_BUFFER_SPACE);
395276707Sdes	ASSERT_SIZE_T_EQ(sshbuf_len(p1), 0);
396276707Sdes	sshbuf_free(p1);
397276707Sdes	TEST_DONE();
398276707Sdes
399276707Sdes	TEST_START("sshbuf_put_string giant");
400276707Sdes	p1 = sshbuf_new();
401276707Sdes	ASSERT_PTR_NE(p1, NULL);
402276707Sdes	r = sshbuf_put_string(p1, (void *)0x01, 0xfffffffc);
403276707Sdes	ASSERT_INT_EQ(r, SSH_ERR_NO_BUFFER_SPACE);
404276707Sdes	ASSERT_SIZE_T_EQ(sshbuf_len(p1), 0);
405276707Sdes	sshbuf_free(p1);
406276707Sdes	TEST_DONE();
407276707Sdes
408276707Sdes	TEST_START("sshbuf_putf");
409276707Sdes	p1 = sshbuf_new();
410276707Sdes	ASSERT_PTR_NE(p1, NULL);
411276707Sdes	r = sshbuf_putf(p1, "%s %d %x", "hello", 23, 0x5f);
412276707Sdes	ASSERT_INT_EQ(r, 0);
413276707Sdes	ASSERT_SIZE_T_EQ(sshbuf_len(p1), 11);
414276707Sdes	ASSERT_MEM_EQ(sshbuf_ptr(p1), "hello 23 5f", 11);
415276707Sdes	sshbuf_free(p1);
416276707Sdes	TEST_DONE();
417276707Sdes
418276707Sdes	TEST_START("sshbuf_putb");
419276707Sdes	p1 = sshbuf_new();
420276707Sdes	ASSERT_PTR_NE(p1, NULL);
421276707Sdes	p2 = sshbuf_new();
422276707Sdes	ASSERT_PTR_NE(p2, NULL);
423276707Sdes	ASSERT_INT_EQ(sshbuf_put(p1, "blahblahblah", 12), 0);
424276707Sdes	ASSERT_INT_EQ(sshbuf_putb(p2, p1), 0);
425276707Sdes	sshbuf_free(p1);
426276707Sdes	ASSERT_SIZE_T_EQ(sshbuf_len(p2), 12);
427276707Sdes	ASSERT_MEM_EQ(sshbuf_ptr(p2), "blahblahblah", 12);
428276707Sdes	sshbuf_free(p2);
429276707Sdes	TEST_DONE();
430276707Sdes
431276707Sdes	TEST_START("sshbuf_put_bignum2_bytes empty buf");
432276707Sdes	p1 = sshbuf_new();
433276707Sdes	ASSERT_PTR_NE(p1, NULL);
434276707Sdes	ASSERT_INT_EQ(sshbuf_put_bignum2_bytes(p1, NULL, 0), 0);
435276707Sdes	ASSERT_SIZE_T_EQ(sshbuf_len(p1), sizeof(bn_exp1));
436276707Sdes	ASSERT_MEM_EQ(sshbuf_ptr(p1), bn_exp1, sizeof(bn_exp1));
437276707Sdes	sshbuf_free(p1);
438276707Sdes	TEST_DONE();
439276707Sdes
440276707Sdes	TEST_START("sshbuf_put_bignum2_bytes all zeroes");
441276707Sdes	p1 = sshbuf_new();
442276707Sdes	ASSERT_PTR_NE(p1, NULL);
443276707Sdes	ASSERT_INT_EQ(sshbuf_put_bignum2_bytes(p1, bn1, sizeof(bn1)), 0);
444276707Sdes	ASSERT_SIZE_T_EQ(sshbuf_len(p1), sizeof(bn_exp1));
445276707Sdes	ASSERT_MEM_EQ(sshbuf_ptr(p1), bn_exp1, sizeof(bn_exp1));
446276707Sdes	sshbuf_free(p1);
447276707Sdes	TEST_DONE();
448276707Sdes
449276707Sdes	TEST_START("sshbuf_put_bignum2_bytes simple");
450276707Sdes	p1 = sshbuf_new();
451276707Sdes	ASSERT_PTR_NE(p1, NULL);
452276707Sdes	ASSERT_INT_EQ(sshbuf_put_bignum2_bytes(p1, bn2+2, sizeof(bn2)-2), 0);
453276707Sdes	ASSERT_SIZE_T_EQ(sshbuf_len(p1), sizeof(bn_exp2));
454276707Sdes	ASSERT_MEM_EQ(sshbuf_ptr(p1), bn_exp2, sizeof(bn_exp2));
455276707Sdes	sshbuf_free(p1);
456276707Sdes	TEST_DONE();
457276707Sdes
458276707Sdes	TEST_START("sshbuf_put_bignum2_bytes leading zero");
459276707Sdes	p1 = sshbuf_new();
460276707Sdes	ASSERT_PTR_NE(p1, NULL);
461276707Sdes	ASSERT_INT_EQ(sshbuf_put_bignum2_bytes(p1, bn2, sizeof(bn2)), 0);
462276707Sdes	ASSERT_SIZE_T_EQ(sshbuf_len(p1), sizeof(bn_exp2));
463276707Sdes	ASSERT_MEM_EQ(sshbuf_ptr(p1), bn_exp2, sizeof(bn_exp2));
464276707Sdes	sshbuf_free(p1);
465276707Sdes	TEST_DONE();
466276707Sdes
467276707Sdes	TEST_START("sshbuf_put_bignum2_bytes neg");
468276707Sdes	p1 = sshbuf_new();
469276707Sdes	ASSERT_PTR_NE(p1, NULL);
470276707Sdes	ASSERT_INT_EQ(sshbuf_put_bignum2_bytes(p1, bn3+1, sizeof(bn3)-1), 0);
471276707Sdes	ASSERT_SIZE_T_EQ(sshbuf_len(p1), sizeof(bn_exp3));
472276707Sdes	ASSERT_MEM_EQ(sshbuf_ptr(p1), bn_exp3, sizeof(bn_exp3));
473276707Sdes	sshbuf_free(p1);
474276707Sdes	TEST_DONE();
475276707Sdes
476276707Sdes	TEST_START("sshbuf_put_bignum2_bytes neg and leading zero");
477276707Sdes	p1 = sshbuf_new();
478276707Sdes	ASSERT_PTR_NE(p1, NULL);
479276707Sdes	ASSERT_INT_EQ(sshbuf_put_bignum2_bytes(p1, bn3, sizeof(bn3)), 0);
480276707Sdes	ASSERT_SIZE_T_EQ(sshbuf_len(p1), sizeof(bn_exp3));
481276707Sdes	ASSERT_MEM_EQ(sshbuf_ptr(p1), bn_exp3, sizeof(bn_exp3));
482276707Sdes	sshbuf_free(p1);
483276707Sdes	TEST_DONE();
484276707Sdes}
485