xref: /openbsd-src/regress/usr.bin/ssh/unittests/sshbuf/test_sshbuf_getput_basic.c (revision a8c975d25b8973125837f3cd4c63b4a611f5c5f5)
1*a8c975d2Sderaadt /* 	$OpenBSD: test_sshbuf_getput_basic.c,v 1.3 2021/12/14 21:25:27 deraadt Exp $ */
229518ea0Sdjm /*
329518ea0Sdjm  * Regress test for sshbuf.h buffer API
429518ea0Sdjm  *
529518ea0Sdjm  * Placed in the public domain
629518ea0Sdjm  */
729518ea0Sdjm 
829518ea0Sdjm #include <sys/types.h>
929518ea0Sdjm #include <stdio.h>
1029518ea0Sdjm #include <stdint.h>
1129518ea0Sdjm #include <stdlib.h>
1229518ea0Sdjm #include <string.h>
1329518ea0Sdjm 
1429518ea0Sdjm #include "test_helper.h"
1529518ea0Sdjm #include "ssherr.h"
1629518ea0Sdjm #include "sshbuf.h"
1729518ea0Sdjm 
1829518ea0Sdjm void sshbuf_getput_basic_tests(void);
1929518ea0Sdjm 
2029518ea0Sdjm void
sshbuf_getput_basic_tests(void)2129518ea0Sdjm sshbuf_getput_basic_tests(void)
2229518ea0Sdjm {
2329518ea0Sdjm 	struct sshbuf *p1, *p2;
2429518ea0Sdjm 	const u_char *cd;
2529518ea0Sdjm 	u_char *d, d2[32], x[] = {
2629518ea0Sdjm 		0x11, 0x22, 0x33, 0x44, 0x55, 0x66, 0x77, 0x88, 0x00, 0x99
2729518ea0Sdjm 	};
2829518ea0Sdjm 	u_int64_t v64;
2929518ea0Sdjm 	u_int32_t v32;
3029518ea0Sdjm 	u_int16_t v16;
3129518ea0Sdjm 	u_char v8;
3229518ea0Sdjm 	size_t s;
3329518ea0Sdjm 	char *s2;
3429518ea0Sdjm 	int r;
3529518ea0Sdjm 	u_char bn1[] = { 0x00, 0x00, 0x00 };
3629518ea0Sdjm 	u_char bn2[] = { 0x00, 0x00, 0x01, 0x02 };
3729518ea0Sdjm 	u_char bn3[] = { 0x00, 0x80, 0x09 };
3829518ea0Sdjm 	u_char bn_exp1[] = { 0x00, 0x00, 0x00, 0x00 };
3929518ea0Sdjm 	u_char bn_exp2[] = { 0x00, 0x00, 0x00, 0x02, 0x01, 0x02 };
4029518ea0Sdjm 	u_char bn_exp3[] = { 0x00, 0x00, 0x00, 0x03, 0x00, 0x80, 0x09 };
4129518ea0Sdjm 
4229518ea0Sdjm 	TEST_START("PEEK_U64");
4329518ea0Sdjm 	ASSERT_U64_EQ(PEEK_U64(x), 0x1122334455667788ULL);
4429518ea0Sdjm 	TEST_DONE();
4529518ea0Sdjm 
4629518ea0Sdjm 	TEST_START("PEEK_U32");
4729518ea0Sdjm 	ASSERT_U32_EQ(PEEK_U32(x), 0x11223344);
4829518ea0Sdjm 	TEST_DONE();
4929518ea0Sdjm 
5029518ea0Sdjm 	TEST_START("PEEK_U16");
5129518ea0Sdjm 	ASSERT_U16_EQ(PEEK_U16(x), 0x1122);
5229518ea0Sdjm 	TEST_DONE();
5329518ea0Sdjm 
5429518ea0Sdjm 	TEST_START("POKE_U64");
5529518ea0Sdjm 	bzero(d2, sizeof(d2));
5629518ea0Sdjm 	POKE_U64(d2, 0x1122334455667788ULL);
5729518ea0Sdjm 	ASSERT_MEM_EQ(d2, x, 8);
5829518ea0Sdjm 	TEST_DONE();
5929518ea0Sdjm 
6029518ea0Sdjm 	TEST_START("POKE_U32");
6129518ea0Sdjm 	bzero(d2, sizeof(d2));
6229518ea0Sdjm 	POKE_U32(d2, 0x11223344);
6329518ea0Sdjm 	ASSERT_MEM_EQ(d2, x, 4);
6429518ea0Sdjm 	TEST_DONE();
6529518ea0Sdjm 
6629518ea0Sdjm 	TEST_START("POKE_U16");
6729518ea0Sdjm 	bzero(d2, sizeof(d2));
6829518ea0Sdjm 	POKE_U16(d2, 0x1122);
6929518ea0Sdjm 	ASSERT_MEM_EQ(d2, x, 2);
7029518ea0Sdjm 	TEST_DONE();
7129518ea0Sdjm 
7229518ea0Sdjm 	TEST_START("sshbuf_put");
7329518ea0Sdjm 	p1 = sshbuf_new();
7429518ea0Sdjm 	ASSERT_PTR_NE(p1, NULL);
7529518ea0Sdjm 	ASSERT_INT_EQ(sshbuf_put(p1, x, 5), 0);
7629518ea0Sdjm 	ASSERT_SIZE_T_EQ(sshbuf_len(p1), 5);
7729518ea0Sdjm 	cd = sshbuf_ptr(p1);
7829518ea0Sdjm 	ASSERT_PTR_NE(cd, NULL);
7929518ea0Sdjm 	ASSERT_U8_EQ(cd[0], 0x11);
8029518ea0Sdjm 	ASSERT_U8_EQ(cd[1], 0x22);
8129518ea0Sdjm 	ASSERT_U8_EQ(cd[2], 0x33);
8229518ea0Sdjm 	ASSERT_U8_EQ(cd[3], 0x44);
8329518ea0Sdjm 	ASSERT_U8_EQ(cd[4], 0x55);
8429518ea0Sdjm 	TEST_DONE();
8529518ea0Sdjm 
8629518ea0Sdjm 	TEST_START("sshbuf_get");
8729518ea0Sdjm 	ASSERT_INT_EQ(sshbuf_get(p1, d2, 4), 0);
8829518ea0Sdjm 	ASSERT_MEM_EQ(d2, x, 4);
8929518ea0Sdjm 	ASSERT_SIZE_T_EQ(sshbuf_len(p1), 1);
9029518ea0Sdjm 	ASSERT_U8_EQ(*(sshbuf_ptr(p1)), 0x55);
9129518ea0Sdjm 	TEST_DONE();
9229518ea0Sdjm 
9329518ea0Sdjm 	TEST_START("sshbuf_get truncated");
9429518ea0Sdjm 	r = sshbuf_get(p1, d2, 4);
9529518ea0Sdjm 	ASSERT_INT_EQ(r, SSH_ERR_MESSAGE_INCOMPLETE);
9629518ea0Sdjm 	ASSERT_SIZE_T_EQ(sshbuf_len(p1), 1);
9729518ea0Sdjm 	ASSERT_U8_EQ(*(sshbuf_ptr(p1)), 0x55);
9829518ea0Sdjm 	TEST_DONE();
9929518ea0Sdjm 
10029518ea0Sdjm 	TEST_START("sshbuf_put truncated");
10129518ea0Sdjm 	ASSERT_INT_EQ(sshbuf_set_max_size(p1, 4), 0);
10229518ea0Sdjm 	r = sshbuf_put(p1, x, 5);
10329518ea0Sdjm 	ASSERT_INT_EQ(r, SSH_ERR_NO_BUFFER_SPACE);
10429518ea0Sdjm 	ASSERT_SIZE_T_EQ(sshbuf_len(p1), 1);
10529518ea0Sdjm 	sshbuf_free(p1);
10629518ea0Sdjm 	TEST_DONE();
10729518ea0Sdjm 
10829518ea0Sdjm 	TEST_START("sshbuf_get_u64");
10929518ea0Sdjm 	p1 = sshbuf_new();
11029518ea0Sdjm 	ASSERT_PTR_NE(p1, NULL);
11129518ea0Sdjm 	ASSERT_INT_EQ(sshbuf_put(p1, x, 10), 0);
11229518ea0Sdjm 	ASSERT_SIZE_T_EQ(sshbuf_len(p1), 10);
11329518ea0Sdjm 	ASSERT_INT_EQ(sshbuf_get_u64(p1, &v64), 0);
11429518ea0Sdjm 	ASSERT_U64_EQ(v64, 0x1122334455667788ULL);
11529518ea0Sdjm 	ASSERT_SIZE_T_EQ(sshbuf_len(p1), 2);
11629518ea0Sdjm 	TEST_DONE();
11729518ea0Sdjm 
11829518ea0Sdjm 	TEST_START("sshbuf_get_u64 truncated");
11929518ea0Sdjm 	ASSERT_SIZE_T_EQ(sshbuf_len(p1), 2);
12029518ea0Sdjm 	r = sshbuf_get_u64(p1, &v64);
12129518ea0Sdjm 	ASSERT_INT_EQ(r, SSH_ERR_MESSAGE_INCOMPLETE);
12229518ea0Sdjm 	ASSERT_SIZE_T_EQ(sshbuf_len(p1), 2);
12329518ea0Sdjm 	sshbuf_free(p1);
12429518ea0Sdjm 	TEST_DONE();
12529518ea0Sdjm 
12629518ea0Sdjm 	TEST_START("sshbuf_get_u32");
12729518ea0Sdjm 	p1 = sshbuf_new();
12829518ea0Sdjm 	ASSERT_PTR_NE(p1, NULL);
12929518ea0Sdjm 	ASSERT_INT_EQ(sshbuf_put(p1, x, 10), 0);
13029518ea0Sdjm 	ASSERT_SIZE_T_EQ(sshbuf_len(p1), 10);
13129518ea0Sdjm 	ASSERT_INT_EQ(sshbuf_get_u32(p1, &v32), 0);
13229518ea0Sdjm 	ASSERT_U32_EQ(v32, 0x11223344);
13329518ea0Sdjm 	ASSERT_SIZE_T_EQ(sshbuf_len(p1), 6);
13429518ea0Sdjm 	ASSERT_INT_EQ(sshbuf_get_u32(p1, &v32), 0);
13529518ea0Sdjm 	ASSERT_U32_EQ(v32, 0x55667788);
13629518ea0Sdjm 	ASSERT_SIZE_T_EQ(sshbuf_len(p1), 2);
13729518ea0Sdjm 	TEST_DONE();
13829518ea0Sdjm 
13929518ea0Sdjm 	TEST_START("sshbuf_get_u32 truncated");
14029518ea0Sdjm 	ASSERT_SIZE_T_EQ(sshbuf_len(p1), 2);
14129518ea0Sdjm 	r = sshbuf_get_u32(p1, &v32);
14229518ea0Sdjm 	ASSERT_INT_EQ(r, SSH_ERR_MESSAGE_INCOMPLETE);
14329518ea0Sdjm 	ASSERT_SIZE_T_EQ(sshbuf_len(p1), 2);
14429518ea0Sdjm 	sshbuf_free(p1);
14529518ea0Sdjm 	TEST_DONE();
14629518ea0Sdjm 
14729518ea0Sdjm 	TEST_START("sshbuf_get_u16");
14829518ea0Sdjm 	p1 = sshbuf_new();
14929518ea0Sdjm 	ASSERT_PTR_NE(p1, NULL);
15029518ea0Sdjm 	ASSERT_INT_EQ(sshbuf_put(p1, x, 9), 0);
15129518ea0Sdjm 	ASSERT_SIZE_T_EQ(sshbuf_len(p1), 9);
15229518ea0Sdjm 	ASSERT_INT_EQ(sshbuf_get_u16(p1, &v16), 0);
15329518ea0Sdjm 	ASSERT_U16_EQ(v16, 0x1122);
15429518ea0Sdjm 	ASSERT_SIZE_T_EQ(sshbuf_len(p1), 7);
15529518ea0Sdjm 	ASSERT_INT_EQ(sshbuf_get_u16(p1, &v16), 0);
15629518ea0Sdjm 	ASSERT_U16_EQ(v16, 0x3344);
15729518ea0Sdjm 	ASSERT_SIZE_T_EQ(sshbuf_len(p1), 5);
15829518ea0Sdjm 	ASSERT_INT_EQ(sshbuf_get_u16(p1, &v16), 0);
15929518ea0Sdjm 	ASSERT_U16_EQ(v16, 0x5566);
16029518ea0Sdjm 	ASSERT_SIZE_T_EQ(sshbuf_len(p1), 3);
16129518ea0Sdjm 	ASSERT_INT_EQ(sshbuf_get_u16(p1, &v16), 0);
16229518ea0Sdjm 	ASSERT_U16_EQ(v16, 0x7788);
16329518ea0Sdjm 	ASSERT_SIZE_T_EQ(sshbuf_len(p1), 1);
16429518ea0Sdjm 	TEST_DONE();
16529518ea0Sdjm 
16629518ea0Sdjm 	TEST_START("sshbuf_get_u16 truncated");
16729518ea0Sdjm 	ASSERT_SIZE_T_EQ(sshbuf_len(p1), 1);
16829518ea0Sdjm 	r = sshbuf_get_u16(p1, &v16);
16929518ea0Sdjm 	ASSERT_INT_EQ(r, SSH_ERR_MESSAGE_INCOMPLETE);
17029518ea0Sdjm 	ASSERT_SIZE_T_EQ(sshbuf_len(p1), 1);
17129518ea0Sdjm 	sshbuf_free(p1);
17229518ea0Sdjm 	TEST_DONE();
17329518ea0Sdjm 
17429518ea0Sdjm 	TEST_START("sshbuf_get_u8");
17529518ea0Sdjm 	p1 = sshbuf_new();
17629518ea0Sdjm 	ASSERT_PTR_NE(p1, NULL);
17729518ea0Sdjm 	ASSERT_INT_EQ(sshbuf_put(p1, x, 2), 0);
17829518ea0Sdjm 	ASSERT_SIZE_T_EQ(sshbuf_len(p1), 2);
17929518ea0Sdjm 	ASSERT_INT_EQ(sshbuf_get_u8(p1, &v8), 0);
18029518ea0Sdjm 	ASSERT_U8_EQ(v8, 0x11);
18129518ea0Sdjm 	ASSERT_SIZE_T_EQ(sshbuf_len(p1), 1);
18229518ea0Sdjm 	ASSERT_INT_EQ(sshbuf_get_u8(p1, &v8), 0);
18329518ea0Sdjm 	ASSERT_U8_EQ(v8, 0x22);
18429518ea0Sdjm 	ASSERT_SIZE_T_EQ(sshbuf_len(p1), 0);
18529518ea0Sdjm 	TEST_DONE();
18629518ea0Sdjm 
18729518ea0Sdjm 	TEST_START("sshbuf_get_u8 truncated");
18829518ea0Sdjm 	ASSERT_SIZE_T_EQ(sshbuf_len(p1), 0);
18929518ea0Sdjm 	r = sshbuf_get_u8(p1, &v8);
19029518ea0Sdjm 	ASSERT_INT_EQ(r, SSH_ERR_MESSAGE_INCOMPLETE);
19129518ea0Sdjm 	ASSERT_SIZE_T_EQ(sshbuf_len(p1), 0);
19229518ea0Sdjm 	sshbuf_free(p1);
19329518ea0Sdjm 	TEST_DONE();
19429518ea0Sdjm 
19529518ea0Sdjm 	TEST_START("sshbuf_put_u64");
19629518ea0Sdjm 	p1 = sshbuf_new();
19729518ea0Sdjm 	ASSERT_PTR_NE(p1, NULL);
19829518ea0Sdjm 	ASSERT_INT_EQ(sshbuf_put_u64(p1, 0x1122334455667788ULL), 0);
19929518ea0Sdjm 	ASSERT_SIZE_T_EQ(sshbuf_len(p1), 8);
20029518ea0Sdjm 	ASSERT_MEM_EQ(sshbuf_ptr(p1), x, 8);
20129518ea0Sdjm 	sshbuf_free(p1);
20229518ea0Sdjm 	TEST_DONE();
20329518ea0Sdjm 
20429518ea0Sdjm 	TEST_START("sshbuf_put_u64 exact");
20529518ea0Sdjm 	p1 = sshbuf_new();
20629518ea0Sdjm 	ASSERT_PTR_NE(p1, NULL);
20729518ea0Sdjm 	ASSERT_INT_EQ(sshbuf_set_max_size(p1, 8), 0);
20829518ea0Sdjm 	ASSERT_INT_EQ(sshbuf_put_u64(p1, 0x1122334455667788ULL), 0);
20929518ea0Sdjm 	ASSERT_SIZE_T_EQ(sshbuf_len(p1), 8);
21029518ea0Sdjm 	ASSERT_MEM_EQ(sshbuf_ptr(p1), x, 8);
21129518ea0Sdjm 	sshbuf_free(p1);
21229518ea0Sdjm 	TEST_DONE();
21329518ea0Sdjm 
21429518ea0Sdjm 	TEST_START("sshbuf_put_u64 limited");
21529518ea0Sdjm 	p1 = sshbuf_new();
21629518ea0Sdjm 	ASSERT_PTR_NE(p1, NULL);
21729518ea0Sdjm 	ASSERT_INT_EQ(sshbuf_set_max_size(p1, 7), 0);
21829518ea0Sdjm 	r = sshbuf_put_u64(p1, 0x1122334455667788ULL);
21929518ea0Sdjm 	ASSERT_INT_EQ(r, SSH_ERR_NO_BUFFER_SPACE);
22029518ea0Sdjm 	ASSERT_SIZE_T_EQ(sshbuf_len(p1), 0);
22129518ea0Sdjm 	sshbuf_free(p1);
22229518ea0Sdjm 	TEST_DONE();
22329518ea0Sdjm 
22429518ea0Sdjm 	TEST_START("sshbuf_put_u32");
22529518ea0Sdjm 	p1 = sshbuf_new();
22629518ea0Sdjm 	ASSERT_PTR_NE(p1, NULL);
22729518ea0Sdjm 	ASSERT_INT_EQ(sshbuf_put_u32(p1, 0x11223344), 0);
22829518ea0Sdjm 	ASSERT_SIZE_T_EQ(sshbuf_len(p1), 4);
22929518ea0Sdjm 	ASSERT_MEM_EQ(sshbuf_ptr(p1), x, 4);
23029518ea0Sdjm 	sshbuf_free(p1);
23129518ea0Sdjm 	TEST_DONE();
23229518ea0Sdjm 
23329518ea0Sdjm 	TEST_START("sshbuf_put_u32 exact");
23429518ea0Sdjm 	p1 = sshbuf_new();
23529518ea0Sdjm 	ASSERT_PTR_NE(p1, NULL);
23629518ea0Sdjm 	ASSERT_INT_EQ(sshbuf_set_max_size(p1, 4), 0);
23729518ea0Sdjm 	ASSERT_INT_EQ(sshbuf_put_u32(p1, 0x11223344), 0);
23829518ea0Sdjm 	ASSERT_SIZE_T_EQ(sshbuf_len(p1), 4);
23929518ea0Sdjm 	ASSERT_MEM_EQ(sshbuf_ptr(p1), x, 4);
24029518ea0Sdjm 	sshbuf_free(p1);
24129518ea0Sdjm 	TEST_DONE();
24229518ea0Sdjm 
24329518ea0Sdjm 	TEST_START("sshbuf_put_u32 limited");
24429518ea0Sdjm 	p1 = sshbuf_new();
24529518ea0Sdjm 	ASSERT_PTR_NE(p1, NULL);
24629518ea0Sdjm 	ASSERT_INT_EQ(sshbuf_set_max_size(p1, 3), 0);
24729518ea0Sdjm 	r = sshbuf_put_u32(p1, 0x11223344);
24829518ea0Sdjm 	ASSERT_INT_EQ(r, SSH_ERR_NO_BUFFER_SPACE);
24929518ea0Sdjm 	ASSERT_SIZE_T_EQ(sshbuf_len(p1), 0);
25029518ea0Sdjm 	sshbuf_free(p1);
25129518ea0Sdjm 	TEST_DONE();
25229518ea0Sdjm 
25329518ea0Sdjm 	TEST_START("sshbuf_put_u16");
25429518ea0Sdjm 	p1 = sshbuf_new();
25529518ea0Sdjm 	ASSERT_PTR_NE(p1, NULL);
25629518ea0Sdjm 	ASSERT_INT_EQ(sshbuf_put_u16(p1, 0x1122), 0);
25729518ea0Sdjm 	ASSERT_SIZE_T_EQ(sshbuf_len(p1), 2);
25829518ea0Sdjm 	ASSERT_MEM_EQ(sshbuf_ptr(p1), x, 2);
25929518ea0Sdjm 	sshbuf_free(p1);
26029518ea0Sdjm 	TEST_DONE();
26129518ea0Sdjm 
26229518ea0Sdjm 	TEST_START("sshbuf_put_u16");
26329518ea0Sdjm 	p1 = sshbuf_new();
26429518ea0Sdjm 	ASSERT_PTR_NE(p1, NULL);
26529518ea0Sdjm 	ASSERT_INT_EQ(sshbuf_set_max_size(p1, 2), 0);
26629518ea0Sdjm 	ASSERT_INT_EQ(sshbuf_put_u16(p1, 0x1122), 0);
26729518ea0Sdjm 	ASSERT_SIZE_T_EQ(sshbuf_len(p1), 2);
26829518ea0Sdjm 	ASSERT_MEM_EQ(sshbuf_ptr(p1), x, 2);
26929518ea0Sdjm 	sshbuf_free(p1);
27029518ea0Sdjm 	TEST_DONE();
27129518ea0Sdjm 
27229518ea0Sdjm 	TEST_START("sshbuf_put_u16 limited");
27329518ea0Sdjm 	p1 = sshbuf_new();
27429518ea0Sdjm 	ASSERT_PTR_NE(p1, NULL);
27529518ea0Sdjm 	ASSERT_INT_EQ(sshbuf_set_max_size(p1, 1), 0);
27629518ea0Sdjm 	r = sshbuf_put_u16(p1, 0x1122);
27729518ea0Sdjm 	ASSERT_INT_EQ(r, SSH_ERR_NO_BUFFER_SPACE);
27829518ea0Sdjm 	ASSERT_SIZE_T_EQ(sshbuf_len(p1), 0);
27929518ea0Sdjm 	sshbuf_free(p1);
28029518ea0Sdjm 	TEST_DONE();
28129518ea0Sdjm 
28229518ea0Sdjm 	TEST_START("sshbuf_get_string");
28329518ea0Sdjm 	p1 = sshbuf_new();
28429518ea0Sdjm 	ASSERT_PTR_NE(p1, NULL);
28529518ea0Sdjm 	ASSERT_INT_EQ(sshbuf_put_u32(p1, sizeof(x)), 0);
28629518ea0Sdjm 	ASSERT_INT_EQ(sshbuf_put(p1, x, sizeof(x)), 0);
28729518ea0Sdjm 	ASSERT_INT_EQ(sshbuf_put_u32(p1, sizeof(x)), 0);
28829518ea0Sdjm 	ASSERT_SIZE_T_EQ(sshbuf_len(p1), sizeof(x) + 4 + 4);
28929518ea0Sdjm 	ASSERT_INT_EQ(sshbuf_get_string(p1, &d, &s), 0);
29029518ea0Sdjm 	ASSERT_SIZE_T_EQ(s, sizeof(x));
29129518ea0Sdjm 	ASSERT_MEM_EQ(d, x, sizeof(x));
29229518ea0Sdjm 	ASSERT_SIZE_T_EQ(sshbuf_len(p1), 4);
29329518ea0Sdjm 	free(d);
29429518ea0Sdjm 	sshbuf_free(p1);
29529518ea0Sdjm 	TEST_DONE();
29629518ea0Sdjm 
29729518ea0Sdjm 	TEST_START("sshbuf_get_string exact");
29829518ea0Sdjm 	p1 = sshbuf_new();
29929518ea0Sdjm 	ASSERT_PTR_NE(p1, NULL);
30029518ea0Sdjm 	ASSERT_INT_EQ(sshbuf_set_max_size(p1, sizeof(x) + 4), 0);
30129518ea0Sdjm 	ASSERT_INT_EQ(sshbuf_put_u32(p1, sizeof(x)), 0);
30229518ea0Sdjm 	ASSERT_INT_EQ(sshbuf_put(p1, x, sizeof(x)), 0);
30329518ea0Sdjm 	ASSERT_SIZE_T_EQ(sshbuf_len(p1), sizeof(x) + 4);
30429518ea0Sdjm 	ASSERT_INT_EQ(sshbuf_get_string(p1, &d, &s), 0);
30529518ea0Sdjm 	ASSERT_SIZE_T_EQ(s, sizeof(x));
30629518ea0Sdjm 	ASSERT_MEM_EQ(d, x, sizeof(x));
30729518ea0Sdjm 	ASSERT_SIZE_T_EQ(sshbuf_len(p1), 0);
30829518ea0Sdjm 	free(d);
30929518ea0Sdjm 	sshbuf_free(p1);
31029518ea0Sdjm 	TEST_DONE();
31129518ea0Sdjm 
31229518ea0Sdjm 	TEST_START("sshbuf_get_string truncated");
31329518ea0Sdjm 	p1 = sshbuf_new();
31429518ea0Sdjm 	ASSERT_PTR_NE(p1, NULL);
31529518ea0Sdjm 	ASSERT_INT_EQ(sshbuf_put_u32(p1, sizeof(x)), 0);
31629518ea0Sdjm 	ASSERT_INT_EQ(sshbuf_put(p1, x, sizeof(x)), 0);
31729518ea0Sdjm 	ASSERT_SIZE_T_EQ(sshbuf_len(p1), sizeof(x) + 4);
31829518ea0Sdjm 	ASSERT_INT_EQ(sshbuf_consume_end(p1, 1), 0);
31929518ea0Sdjm 	ASSERT_SIZE_T_EQ(sshbuf_len(p1), sizeof(x) + 3);
32029518ea0Sdjm 	r = sshbuf_get_string(p1, &d, &s);
32129518ea0Sdjm 	ASSERT_INT_EQ(r, SSH_ERR_MESSAGE_INCOMPLETE);
32229518ea0Sdjm 	ASSERT_SIZE_T_EQ(sshbuf_len(p1), sizeof(x) + 3);
32329518ea0Sdjm 	sshbuf_free(p1);
32429518ea0Sdjm 	TEST_DONE();
32529518ea0Sdjm 
32629518ea0Sdjm 	TEST_START("sshbuf_get_string giant");
32729518ea0Sdjm 	p1 = sshbuf_new();
32829518ea0Sdjm 	ASSERT_PTR_NE(p1, NULL);
32929518ea0Sdjm 	ASSERT_INT_EQ(sshbuf_put_u32(p1, 0xffffffff), 0);
33029518ea0Sdjm 	ASSERT_INT_EQ(sshbuf_put(p1, x, sizeof(x)), 0);
33129518ea0Sdjm 	ASSERT_SIZE_T_EQ(sshbuf_len(p1), sizeof(x) + 4);
33229518ea0Sdjm 	r = sshbuf_get_string(p1, &d, &s);
33329518ea0Sdjm 	ASSERT_INT_EQ(r, SSH_ERR_STRING_TOO_LARGE);
33429518ea0Sdjm 	ASSERT_SIZE_T_EQ(sshbuf_len(p1), sizeof(x) + 4);
33529518ea0Sdjm 	sshbuf_free(p1);
33629518ea0Sdjm 	TEST_DONE();
33729518ea0Sdjm 
33829518ea0Sdjm 	TEST_START("sshbuf_get_cstring giant");
33929518ea0Sdjm 	p1 = sshbuf_new();
34029518ea0Sdjm 	ASSERT_PTR_NE(p1, NULL);
34129518ea0Sdjm 	ASSERT_INT_EQ(sshbuf_put_u32(p1, 0xffffffff), 0);
34229518ea0Sdjm 	ASSERT_INT_EQ(sshbuf_put(p1, x, sizeof(x)), 0);
34329518ea0Sdjm 	ASSERT_SIZE_T_EQ(sshbuf_len(p1), sizeof(x) + 4);
34429518ea0Sdjm 	r = sshbuf_get_cstring(p1, &s2, &s);
34529518ea0Sdjm 	ASSERT_INT_EQ(r, SSH_ERR_STRING_TOO_LARGE);
34629518ea0Sdjm 	ASSERT_SIZE_T_EQ(sshbuf_len(p1), sizeof(x) + 4);
34729518ea0Sdjm 	sshbuf_free(p1);
34829518ea0Sdjm 	TEST_DONE();
34929518ea0Sdjm 
35029518ea0Sdjm 	TEST_START("sshbuf_get_cstring embedded \\0");
35129518ea0Sdjm 	p1 = sshbuf_new();
35229518ea0Sdjm 	ASSERT_PTR_NE(p1, NULL);
35329518ea0Sdjm 	ASSERT_INT_EQ(sshbuf_put_u32(p1, sizeof(x)), 0);
35429518ea0Sdjm 	ASSERT_INT_EQ(sshbuf_put(p1, x, sizeof(x)), 0);
35529518ea0Sdjm 	ASSERT_SIZE_T_EQ(sshbuf_len(p1), sizeof(x) + 4);
35629518ea0Sdjm 	r = sshbuf_get_cstring(p1, &s2, NULL);
35729518ea0Sdjm 	ASSERT_INT_EQ(r, SSH_ERR_INVALID_FORMAT);
35829518ea0Sdjm 	sshbuf_free(p1);
35929518ea0Sdjm 	TEST_DONE();
36029518ea0Sdjm 
36129518ea0Sdjm 	TEST_START("sshbuf_get_cstring trailing \\0");
36229518ea0Sdjm 	p1 = sshbuf_new();
36329518ea0Sdjm 	ASSERT_PTR_NE(p1, NULL);
36429518ea0Sdjm 	ASSERT_INT_EQ(sshbuf_put_u32(p1, sizeof(x) - 1), 0);
36529518ea0Sdjm 	ASSERT_INT_EQ(sshbuf_put(p1, x, sizeof(x) - 1), 0);
36629518ea0Sdjm 	ASSERT_SIZE_T_EQ(sshbuf_len(p1), sizeof(x) + 4 - 1);
36729518ea0Sdjm 	ASSERT_INT_EQ(sshbuf_get_cstring(p1, &s2, &s), 0);
36829518ea0Sdjm 	ASSERT_SIZE_T_EQ(s, sizeof(x) - 1);
36929518ea0Sdjm 	ASSERT_MEM_EQ(s2, x, s);
37029518ea0Sdjm 	free(s2);
37129518ea0Sdjm 	sshbuf_free(p1);
37229518ea0Sdjm 	TEST_DONE();
37329518ea0Sdjm 
37429518ea0Sdjm 	TEST_START("sshbuf_put_string");
37529518ea0Sdjm 	p1 = sshbuf_new();
37629518ea0Sdjm 	ASSERT_PTR_NE(p1, NULL);
37729518ea0Sdjm 	ASSERT_INT_EQ(sshbuf_put_string(p1, x, sizeof(x)), 0);
37829518ea0Sdjm 	ASSERT_SIZE_T_EQ(sshbuf_len(p1), sizeof(x) + 4);
37929518ea0Sdjm 	ASSERT_U32_EQ(PEEK_U32(sshbuf_ptr(p1)), sizeof(x));
38029518ea0Sdjm 	ASSERT_MEM_EQ(sshbuf_ptr(p1) + 4, x, sizeof(x));
38129518ea0Sdjm 	sshbuf_free(p1);
38229518ea0Sdjm 	TEST_DONE();
38329518ea0Sdjm 
38429518ea0Sdjm 	TEST_START("sshbuf_put_string limited");
38529518ea0Sdjm 	p1 = sshbuf_new();
38629518ea0Sdjm 	ASSERT_PTR_NE(p1, NULL);
38729518ea0Sdjm 	ASSERT_INT_EQ(sshbuf_set_max_size(p1, sizeof(x) + 4 - 1), 0);
38829518ea0Sdjm 	r = sshbuf_put_string(p1, x, sizeof(x));
38929518ea0Sdjm 	ASSERT_INT_EQ(r, SSH_ERR_NO_BUFFER_SPACE);
39029518ea0Sdjm 	ASSERT_SIZE_T_EQ(sshbuf_len(p1), 0);
39129518ea0Sdjm 	sshbuf_free(p1);
39229518ea0Sdjm 	TEST_DONE();
39329518ea0Sdjm 
39429518ea0Sdjm 	TEST_START("sshbuf_put_string giant");
39529518ea0Sdjm 	p1 = sshbuf_new();
39629518ea0Sdjm 	ASSERT_PTR_NE(p1, NULL);
39729518ea0Sdjm 	r = sshbuf_put_string(p1, (void *)0x01, 0xfffffffc);
39829518ea0Sdjm 	ASSERT_INT_EQ(r, SSH_ERR_NO_BUFFER_SPACE);
39929518ea0Sdjm 	ASSERT_SIZE_T_EQ(sshbuf_len(p1), 0);
40029518ea0Sdjm 	sshbuf_free(p1);
40129518ea0Sdjm 	TEST_DONE();
40229518ea0Sdjm 
40329518ea0Sdjm 	TEST_START("sshbuf_putf");
40429518ea0Sdjm 	p1 = sshbuf_new();
40529518ea0Sdjm 	ASSERT_PTR_NE(p1, NULL);
40629518ea0Sdjm 	r = sshbuf_putf(p1, "%s %d %x", "hello", 23, 0x5f);
40729518ea0Sdjm 	ASSERT_INT_EQ(r, 0);
40829518ea0Sdjm 	ASSERT_SIZE_T_EQ(sshbuf_len(p1), 11);
40929518ea0Sdjm 	ASSERT_MEM_EQ(sshbuf_ptr(p1), "hello 23 5f", 11);
41029518ea0Sdjm 	sshbuf_free(p1);
41129518ea0Sdjm 	TEST_DONE();
41229518ea0Sdjm 
41329518ea0Sdjm 	TEST_START("sshbuf_putb");
41429518ea0Sdjm 	p1 = sshbuf_new();
41529518ea0Sdjm 	ASSERT_PTR_NE(p1, NULL);
41629518ea0Sdjm 	p2 = sshbuf_new();
41729518ea0Sdjm 	ASSERT_PTR_NE(p2, NULL);
41829518ea0Sdjm 	ASSERT_INT_EQ(sshbuf_put(p1, "blahblahblah", 12), 0);
41929518ea0Sdjm 	ASSERT_INT_EQ(sshbuf_putb(p2, p1), 0);
42029518ea0Sdjm 	sshbuf_free(p1);
42129518ea0Sdjm 	ASSERT_SIZE_T_EQ(sshbuf_len(p2), 12);
42229518ea0Sdjm 	ASSERT_MEM_EQ(sshbuf_ptr(p2), "blahblahblah", 12);
42329518ea0Sdjm 	sshbuf_free(p2);
42429518ea0Sdjm 	TEST_DONE();
42529518ea0Sdjm 
42629518ea0Sdjm 	TEST_START("sshbuf_put_bignum2_bytes empty buf");
42729518ea0Sdjm 	p1 = sshbuf_new();
42829518ea0Sdjm 	ASSERT_PTR_NE(p1, NULL);
42929518ea0Sdjm 	ASSERT_INT_EQ(sshbuf_put_bignum2_bytes(p1, NULL, 0), 0);
43029518ea0Sdjm 	ASSERT_SIZE_T_EQ(sshbuf_len(p1), sizeof(bn_exp1));
43129518ea0Sdjm 	ASSERT_MEM_EQ(sshbuf_ptr(p1), bn_exp1, sizeof(bn_exp1));
43229518ea0Sdjm 	sshbuf_free(p1);
43329518ea0Sdjm 	TEST_DONE();
43429518ea0Sdjm 
43529518ea0Sdjm 	TEST_START("sshbuf_put_bignum2_bytes all zeroes");
43629518ea0Sdjm 	p1 = sshbuf_new();
43729518ea0Sdjm 	ASSERT_PTR_NE(p1, NULL);
43829518ea0Sdjm 	ASSERT_INT_EQ(sshbuf_put_bignum2_bytes(p1, bn1, sizeof(bn1)), 0);
43929518ea0Sdjm 	ASSERT_SIZE_T_EQ(sshbuf_len(p1), sizeof(bn_exp1));
44029518ea0Sdjm 	ASSERT_MEM_EQ(sshbuf_ptr(p1), bn_exp1, sizeof(bn_exp1));
44129518ea0Sdjm 	sshbuf_free(p1);
44229518ea0Sdjm 	TEST_DONE();
44329518ea0Sdjm 
44429518ea0Sdjm 	TEST_START("sshbuf_put_bignum2_bytes simple");
44529518ea0Sdjm 	p1 = sshbuf_new();
44629518ea0Sdjm 	ASSERT_PTR_NE(p1, NULL);
44729518ea0Sdjm 	ASSERT_INT_EQ(sshbuf_put_bignum2_bytes(p1, bn2+2, sizeof(bn2)-2), 0);
44829518ea0Sdjm 	ASSERT_SIZE_T_EQ(sshbuf_len(p1), sizeof(bn_exp2));
44929518ea0Sdjm 	ASSERT_MEM_EQ(sshbuf_ptr(p1), bn_exp2, sizeof(bn_exp2));
45029518ea0Sdjm 	sshbuf_free(p1);
45129518ea0Sdjm 	TEST_DONE();
45229518ea0Sdjm 
45329518ea0Sdjm 	TEST_START("sshbuf_put_bignum2_bytes leading zero");
45429518ea0Sdjm 	p1 = sshbuf_new();
45529518ea0Sdjm 	ASSERT_PTR_NE(p1, NULL);
45629518ea0Sdjm 	ASSERT_INT_EQ(sshbuf_put_bignum2_bytes(p1, bn2, sizeof(bn2)), 0);
45729518ea0Sdjm 	ASSERT_SIZE_T_EQ(sshbuf_len(p1), sizeof(bn_exp2));
45829518ea0Sdjm 	ASSERT_MEM_EQ(sshbuf_ptr(p1), bn_exp2, sizeof(bn_exp2));
45929518ea0Sdjm 	sshbuf_free(p1);
46029518ea0Sdjm 	TEST_DONE();
46129518ea0Sdjm 
46229518ea0Sdjm 	TEST_START("sshbuf_put_bignum2_bytes neg");
46329518ea0Sdjm 	p1 = sshbuf_new();
46429518ea0Sdjm 	ASSERT_PTR_NE(p1, NULL);
46529518ea0Sdjm 	ASSERT_INT_EQ(sshbuf_put_bignum2_bytes(p1, bn3+1, sizeof(bn3)-1), 0);
46629518ea0Sdjm 	ASSERT_SIZE_T_EQ(sshbuf_len(p1), sizeof(bn_exp3));
46729518ea0Sdjm 	ASSERT_MEM_EQ(sshbuf_ptr(p1), bn_exp3, sizeof(bn_exp3));
46829518ea0Sdjm 	sshbuf_free(p1);
46929518ea0Sdjm 	TEST_DONE();
47029518ea0Sdjm 
47129518ea0Sdjm 	TEST_START("sshbuf_put_bignum2_bytes neg and leading zero");
47229518ea0Sdjm 	p1 = sshbuf_new();
47329518ea0Sdjm 	ASSERT_PTR_NE(p1, NULL);
47429518ea0Sdjm 	ASSERT_INT_EQ(sshbuf_put_bignum2_bytes(p1, bn3, sizeof(bn3)), 0);
47529518ea0Sdjm 	ASSERT_SIZE_T_EQ(sshbuf_len(p1), sizeof(bn_exp3));
47629518ea0Sdjm 	ASSERT_MEM_EQ(sshbuf_ptr(p1), bn_exp3, sizeof(bn_exp3));
47729518ea0Sdjm 	sshbuf_free(p1);
47829518ea0Sdjm 	TEST_DONE();
479f828cc92Sdjm 
480f828cc92Sdjm 	TEST_START("sshbuf_peek_u64");
481f828cc92Sdjm 	p1 = sshbuf_new();
482f828cc92Sdjm 	ASSERT_PTR_NE(p1, NULL);
483f828cc92Sdjm 	ASSERT_INT_EQ(sshbuf_put(p1, x, sizeof(x)), 0);
484f828cc92Sdjm 	ASSERT_INT_EQ(sshbuf_peek_u64(p1, 0, &v64), 0);
485f828cc92Sdjm 	ASSERT_U64_EQ(v64, 0x1122334455667788ULL);
486f828cc92Sdjm 	ASSERT_INT_EQ(sshbuf_peek_u64(p1, 2, &v64), 0);
487f828cc92Sdjm 	ASSERT_U64_EQ(v64, 0x3344556677880099ULL);
488f828cc92Sdjm 	ASSERT_INT_EQ(sshbuf_peek_u64(p1, 3, &v64), SSH_ERR_MESSAGE_INCOMPLETE);
489f828cc92Sdjm 	ASSERT_INT_EQ(sshbuf_peek_u64(p1, sizeof(x), &v64),
490f828cc92Sdjm 	    SSH_ERR_MESSAGE_INCOMPLETE);
491f828cc92Sdjm 	ASSERT_INT_EQ(sshbuf_peek_u64(p1, 1000, &v64),
492f828cc92Sdjm 	    SSH_ERR_MESSAGE_INCOMPLETE);
493f828cc92Sdjm 	sshbuf_free(p1);
494f828cc92Sdjm 	TEST_DONE();
495f828cc92Sdjm 
496f828cc92Sdjm 	TEST_START("sshbuf_peek_u32");
497f828cc92Sdjm 	p1 = sshbuf_new();
498f828cc92Sdjm 	ASSERT_PTR_NE(p1, NULL);
499f828cc92Sdjm 	ASSERT_INT_EQ(sshbuf_put(p1, x, sizeof(x)), 0);
500f828cc92Sdjm 	ASSERT_INT_EQ(sshbuf_peek_u32(p1, 0, &v32), 0);
501f828cc92Sdjm 	ASSERT_U32_EQ(v32, 0x11223344);
502f828cc92Sdjm 	ASSERT_INT_EQ(sshbuf_peek_u32(p1, 6, &v32), 0);
503f828cc92Sdjm 	ASSERT_U32_EQ(v32, 0x77880099);
504f828cc92Sdjm 	ASSERT_INT_EQ(sshbuf_peek_u32(p1, 7, &v32), SSH_ERR_MESSAGE_INCOMPLETE);
505f828cc92Sdjm 	ASSERT_INT_EQ(sshbuf_peek_u32(p1, sizeof(x), &v32),
506f828cc92Sdjm 	    SSH_ERR_MESSAGE_INCOMPLETE);
507f828cc92Sdjm 	ASSERT_INT_EQ(sshbuf_peek_u32(p1, 1000, &v32),
508f828cc92Sdjm 	    SSH_ERR_MESSAGE_INCOMPLETE);
509f828cc92Sdjm 	sshbuf_free(p1);
510f828cc92Sdjm 	TEST_DONE();
511f828cc92Sdjm 
512f828cc92Sdjm 	TEST_START("sshbuf_peek_u16");
513f828cc92Sdjm 	p1 = sshbuf_new();
514f828cc92Sdjm 	ASSERT_PTR_NE(p1, NULL);
515f828cc92Sdjm 	ASSERT_INT_EQ(sshbuf_put(p1, x, sizeof(x)), 0);
516f828cc92Sdjm 	ASSERT_INT_EQ(sshbuf_peek_u16(p1, 0, &v16), 0);
517f828cc92Sdjm 	ASSERT_U16_EQ(v16, 0x1122);
518f828cc92Sdjm 	ASSERT_INT_EQ(sshbuf_peek_u16(p1, 8, &v16), 0);
519f828cc92Sdjm 	ASSERT_U16_EQ(v16, 0x99);
520f828cc92Sdjm 	ASSERT_INT_EQ(sshbuf_peek_u16(p1, 9, &v16), SSH_ERR_MESSAGE_INCOMPLETE);
521f828cc92Sdjm 	ASSERT_INT_EQ(sshbuf_peek_u16(p1, sizeof(x), &v16),
522f828cc92Sdjm 	    SSH_ERR_MESSAGE_INCOMPLETE);
523f828cc92Sdjm 	ASSERT_INT_EQ(sshbuf_peek_u16(p1, 1000, &v16),
524f828cc92Sdjm 	    SSH_ERR_MESSAGE_INCOMPLETE);
525f828cc92Sdjm 	sshbuf_free(p1);
526f828cc92Sdjm 	TEST_DONE();
527f828cc92Sdjm 
528f828cc92Sdjm 	TEST_START("sshbuf_peek_u8");
529f828cc92Sdjm 	p1 = sshbuf_new();
530f828cc92Sdjm 	ASSERT_PTR_NE(p1, NULL);
531f828cc92Sdjm 	ASSERT_INT_EQ(sshbuf_put(p1, x, sizeof(x)), 0);
532f828cc92Sdjm 	ASSERT_INT_EQ(sshbuf_peek_u8(p1, 0, &v8), 0);
533f828cc92Sdjm 	ASSERT_U8_EQ(v8, 0x11);
534f828cc92Sdjm 	ASSERT_INT_EQ(sshbuf_peek_u8(p1, 9, &v8), 0);
535f828cc92Sdjm 	ASSERT_U8_EQ(v8, 0x99);
536f828cc92Sdjm 	ASSERT_INT_EQ(sshbuf_peek_u8(p1, sizeof(x), &v8),
537f828cc92Sdjm 	    SSH_ERR_MESSAGE_INCOMPLETE);
538f828cc92Sdjm 	ASSERT_INT_EQ(sshbuf_peek_u8(p1, 1000, &v8),
539f828cc92Sdjm 	    SSH_ERR_MESSAGE_INCOMPLETE);
540f828cc92Sdjm 	sshbuf_free(p1);
541f828cc92Sdjm 	TEST_DONE();
542f828cc92Sdjm 
543f828cc92Sdjm 	TEST_START("sshbuf_poke_u64");
544f828cc92Sdjm 	p1 = sshbuf_new();
545f828cc92Sdjm 	ASSERT_PTR_NE(p1, NULL);
546f828cc92Sdjm 	ASSERT_INT_EQ(sshbuf_reserve(p1, 10, NULL), 0);
547f828cc92Sdjm 	/* poke at start of buffer */
548f828cc92Sdjm 	ASSERT_INT_EQ(sshbuf_poke_u64(p1, 0, 0xa1b2c3d4e5f60718ULL), 0);
549f828cc92Sdjm 	s2 = sshbuf_dtob16(p1);
550f828cc92Sdjm 	ASSERT_PTR_NE(s2, NULL);
551f828cc92Sdjm 	ASSERT_STRING_EQ(s2, "a1b2c3d4e5f607180000");
552f828cc92Sdjm 	free(s2);
553f828cc92Sdjm 	sshbuf_reset(p1);
554f828cc92Sdjm 	ASSERT_INT_EQ(sshbuf_reserve(p1, 10, NULL), 0);
555f828cc92Sdjm 	/* poke aligned with end of buffer */
556f828cc92Sdjm 	ASSERT_INT_EQ(sshbuf_poke_u64(p1, 2, 0xa1b2c3d4e5f60718ULL), 0);
557f828cc92Sdjm 	s2 = sshbuf_dtob16(p1);
558f828cc92Sdjm 	ASSERT_PTR_NE(s2, NULL);
559f828cc92Sdjm 	ASSERT_STRING_EQ(s2, "0000a1b2c3d4e5f60718");
560f828cc92Sdjm 	free(s2);
561f828cc92Sdjm 	sshbuf_reset(p1);
562f828cc92Sdjm 	ASSERT_INT_EQ(sshbuf_reserve(p1, 10, NULL), 0);
563f828cc92Sdjm 	/* poke past end of buffer */
564f828cc92Sdjm 	ASSERT_INT_EQ(sshbuf_poke_u64(p1, 3, 0xa1b2c3d4e5f60718ULL),
565f828cc92Sdjm 	    SSH_ERR_NO_BUFFER_SPACE);
566f828cc92Sdjm 	ASSERT_INT_EQ(sshbuf_poke_u64(p1, 10, 0xa1b2c3d4e5f60718ULL),
567f828cc92Sdjm 	    SSH_ERR_NO_BUFFER_SPACE);
568f828cc92Sdjm 	ASSERT_INT_EQ(sshbuf_poke_u64(p1, 1000, 0xa1b2c3d4e5f60718ULL),
569f828cc92Sdjm 	    SSH_ERR_NO_BUFFER_SPACE);
570f828cc92Sdjm 	/* ensure failed pokes do not modify buffer */
571f828cc92Sdjm 	s2 = sshbuf_dtob16(p1);
572f828cc92Sdjm 	ASSERT_PTR_NE(s2, NULL);
573f828cc92Sdjm 	ASSERT_STRING_EQ(s2, "00000000000000000000");
574f828cc92Sdjm 	sshbuf_free(p1);
575f828cc92Sdjm 	TEST_DONE();
576f828cc92Sdjm 
577f828cc92Sdjm 	TEST_START("sshbuf_poke_u32");
578f828cc92Sdjm 	p1 = sshbuf_new();
579f828cc92Sdjm 	ASSERT_PTR_NE(p1, NULL);
580f828cc92Sdjm 	ASSERT_INT_EQ(sshbuf_reserve(p1, 10, NULL), 0);
581f828cc92Sdjm 	/* poke at start of buffer */
582f828cc92Sdjm 	ASSERT_INT_EQ(sshbuf_poke_u32(p1, 0, 0xa1b2c3d4), 0);
583f828cc92Sdjm 	s2 = sshbuf_dtob16(p1);
584f828cc92Sdjm 	ASSERT_PTR_NE(s2, NULL);
585f828cc92Sdjm 	ASSERT_STRING_EQ(s2, "a1b2c3d4000000000000");
586f828cc92Sdjm 	free(s2);
587f828cc92Sdjm 	sshbuf_reset(p1);
588f828cc92Sdjm 	ASSERT_INT_EQ(sshbuf_reserve(p1, 10, NULL), 0);
589f828cc92Sdjm 	/* poke aligned with end of buffer */
590f828cc92Sdjm 	ASSERT_INT_EQ(sshbuf_poke_u32(p1, 6, 0xa1b2c3d4), 0);
591f828cc92Sdjm 	s2 = sshbuf_dtob16(p1);
592f828cc92Sdjm 	ASSERT_PTR_NE(s2, NULL);
593f828cc92Sdjm 	ASSERT_STRING_EQ(s2, "000000000000a1b2c3d4");
594f828cc92Sdjm 	free(s2);
595f828cc92Sdjm 	sshbuf_reset(p1);
596f828cc92Sdjm 	ASSERT_INT_EQ(sshbuf_reserve(p1, 10, NULL), 0);
597f828cc92Sdjm 	/* poke past end of buffer */
598f828cc92Sdjm 	ASSERT_INT_EQ(sshbuf_poke_u32(p1, 7, 0xa1b2c3d4),
599f828cc92Sdjm 	    SSH_ERR_NO_BUFFER_SPACE);
600f828cc92Sdjm 	ASSERT_INT_EQ(sshbuf_poke_u32(p1, 10, 0xa1b2c3d4),
601f828cc92Sdjm 	    SSH_ERR_NO_BUFFER_SPACE);
602f828cc92Sdjm 	ASSERT_INT_EQ(sshbuf_poke_u32(p1, 1000, 0xa1b2c3d4),
603f828cc92Sdjm 	    SSH_ERR_NO_BUFFER_SPACE);
604f828cc92Sdjm 	/* ensure failed pokes do not modify buffer */
605f828cc92Sdjm 	s2 = sshbuf_dtob16(p1);
606f828cc92Sdjm 	ASSERT_PTR_NE(s2, NULL);
607f828cc92Sdjm 	ASSERT_STRING_EQ(s2, "00000000000000000000");
608f828cc92Sdjm 	sshbuf_free(p1);
609f828cc92Sdjm 	TEST_DONE();
610f828cc92Sdjm 
611f828cc92Sdjm 	TEST_START("sshbuf_poke_u16");
612f828cc92Sdjm 	p1 = sshbuf_new();
613f828cc92Sdjm 	ASSERT_PTR_NE(p1, NULL);
614f828cc92Sdjm 	ASSERT_INT_EQ(sshbuf_reserve(p1, 10, NULL), 0);
615f828cc92Sdjm 	/* poke at start of buffer */
616f828cc92Sdjm 	ASSERT_INT_EQ(sshbuf_poke_u16(p1, 0, 0xa1b2), 0);
617f828cc92Sdjm 	s2 = sshbuf_dtob16(p1);
618f828cc92Sdjm 	ASSERT_PTR_NE(s2, NULL);
619f828cc92Sdjm 	ASSERT_STRING_EQ(s2, "a1b20000000000000000");
620f828cc92Sdjm 	free(s2);
621f828cc92Sdjm 	sshbuf_reset(p1);
622f828cc92Sdjm 	ASSERT_INT_EQ(sshbuf_reserve(p1, 10, NULL), 0);
623f828cc92Sdjm 	/* poke aligned with end of buffer */
624f828cc92Sdjm 	ASSERT_INT_EQ(sshbuf_poke_u16(p1, 8, 0xa1b2), 0);
625f828cc92Sdjm 	s2 = sshbuf_dtob16(p1);
626f828cc92Sdjm 	ASSERT_PTR_NE(s2, NULL);
627f828cc92Sdjm 	ASSERT_STRING_EQ(s2, "0000000000000000a1b2");
628f828cc92Sdjm 	free(s2);
629f828cc92Sdjm 	sshbuf_reset(p1);
630f828cc92Sdjm 	ASSERT_INT_EQ(sshbuf_reserve(p1, 10, NULL), 0);
631f828cc92Sdjm 	/* poke past end of buffer */
632f828cc92Sdjm 	ASSERT_INT_EQ(sshbuf_poke_u16(p1, 9, 0xa1b2),
633f828cc92Sdjm 	    SSH_ERR_NO_BUFFER_SPACE);
634f828cc92Sdjm 	ASSERT_INT_EQ(sshbuf_poke_u16(p1, 10, 0xa1b2),
635f828cc92Sdjm 	    SSH_ERR_NO_BUFFER_SPACE);
636f828cc92Sdjm 	ASSERT_INT_EQ(sshbuf_poke_u16(p1, 1000, 0xa1b2),
637f828cc92Sdjm 	    SSH_ERR_NO_BUFFER_SPACE);
638f828cc92Sdjm 	/* ensure failed pokes do not modify buffer */
639f828cc92Sdjm 	s2 = sshbuf_dtob16(p1);
640f828cc92Sdjm 	ASSERT_PTR_NE(s2, NULL);
641f828cc92Sdjm 	ASSERT_STRING_EQ(s2, "00000000000000000000");
642f828cc92Sdjm 	sshbuf_free(p1);
643f828cc92Sdjm 	TEST_DONE();
644f828cc92Sdjm 
645f828cc92Sdjm 	TEST_START("sshbuf_poke_u8");
646f828cc92Sdjm 	p1 = sshbuf_new();
647f828cc92Sdjm 	ASSERT_PTR_NE(p1, NULL);
648f828cc92Sdjm 	ASSERT_INT_EQ(sshbuf_reserve(p1, 10, NULL), 0);
649f828cc92Sdjm 	/* poke at start of buffer */
650f828cc92Sdjm 	ASSERT_INT_EQ(sshbuf_poke_u8(p1, 0, 0xa1), 0);
651f828cc92Sdjm 	s2 = sshbuf_dtob16(p1);
652f828cc92Sdjm 	ASSERT_PTR_NE(s2, NULL);
653f828cc92Sdjm 	ASSERT_STRING_EQ(s2, "a1000000000000000000");
654f828cc92Sdjm 	free(s2);
655f828cc92Sdjm 	sshbuf_reset(p1);
656f828cc92Sdjm 	ASSERT_INT_EQ(sshbuf_reserve(p1, 10, NULL), 0);
657f828cc92Sdjm 	/* poke aligned with end of buffer */
658f828cc92Sdjm 	ASSERT_INT_EQ(sshbuf_poke_u8(p1, 9, 0xa1), 0);
659f828cc92Sdjm 	s2 = sshbuf_dtob16(p1);
660f828cc92Sdjm 	ASSERT_PTR_NE(s2, NULL);
661f828cc92Sdjm 	ASSERT_STRING_EQ(s2, "000000000000000000a1");
662f828cc92Sdjm 	free(s2);
663f828cc92Sdjm 	sshbuf_reset(p1);
664f828cc92Sdjm 	ASSERT_INT_EQ(sshbuf_reserve(p1, 10, NULL), 0);
665f828cc92Sdjm 	/* poke past end of buffer */
666f828cc92Sdjm 	ASSERT_INT_EQ(sshbuf_poke_u8(p1, 10, 0xa1), SSH_ERR_NO_BUFFER_SPACE);
667f828cc92Sdjm 	ASSERT_INT_EQ(sshbuf_poke_u8(p1, 1000, 0xa1), SSH_ERR_NO_BUFFER_SPACE);
668f828cc92Sdjm 	/* ensure failed pokes do not modify buffer */
669f828cc92Sdjm 	s2 = sshbuf_dtob16(p1);
670f828cc92Sdjm 	ASSERT_PTR_NE(s2, NULL);
671f828cc92Sdjm 	ASSERT_STRING_EQ(s2, "00000000000000000000");
672f828cc92Sdjm 	sshbuf_free(p1);
673f828cc92Sdjm 	TEST_DONE();
674f828cc92Sdjm 
675f828cc92Sdjm 	TEST_START("sshbuf_poke");
676f828cc92Sdjm 	p1 = sshbuf_new();
677f828cc92Sdjm 	ASSERT_PTR_NE(p1, NULL);
678f828cc92Sdjm 	ASSERT_INT_EQ(sshbuf_reserve(p1, 10, NULL), 0);
679f828cc92Sdjm 	/* poke at start of buffer */
680f828cc92Sdjm 	ASSERT_INT_EQ(sshbuf_poke(p1, 0, "hello!", 6), 0);
681f828cc92Sdjm 	s2 = sshbuf_dtob16(p1);
682f828cc92Sdjm 	ASSERT_PTR_NE(s2, NULL);
683f828cc92Sdjm 	ASSERT_STRING_EQ(s2, "68656c6c6f2100000000");
684f828cc92Sdjm 	free(s2);
685f828cc92Sdjm 	sshbuf_reset(p1);
686f828cc92Sdjm 	ASSERT_INT_EQ(sshbuf_reserve(p1, 10, NULL), 0);
687f828cc92Sdjm 	/* poke aligned with end of buffer */
688f828cc92Sdjm 	ASSERT_INT_EQ(sshbuf_poke(p1, 4, "hello!", 6), 0);
689f828cc92Sdjm 	s2 = sshbuf_dtob16(p1);
690f828cc92Sdjm 	ASSERT_PTR_NE(s2, NULL);
691f828cc92Sdjm 	ASSERT_STRING_EQ(s2, "0000000068656c6c6f21");
692f828cc92Sdjm 	free(s2);
693f828cc92Sdjm 	sshbuf_reset(p1);
694f828cc92Sdjm 	ASSERT_INT_EQ(sshbuf_reserve(p1, 10, NULL), 0);
695f828cc92Sdjm 	/* poke past end of buffer */
696f828cc92Sdjm 	ASSERT_INT_EQ(sshbuf_poke(p1, 7, "hello!", 6),
697f828cc92Sdjm 	    SSH_ERR_NO_BUFFER_SPACE);
698f828cc92Sdjm 	ASSERT_INT_EQ(sshbuf_poke(p1, 10, "hello!", 6),
699f828cc92Sdjm 	    SSH_ERR_NO_BUFFER_SPACE);
700f828cc92Sdjm 	ASSERT_INT_EQ(sshbuf_poke(p1, 1000, "hello!", 6),
701f828cc92Sdjm 	    SSH_ERR_NO_BUFFER_SPACE);
702f828cc92Sdjm 	/* ensure failed pokes do not modify buffer */
703f828cc92Sdjm 	s2 = sshbuf_dtob16(p1);
704f828cc92Sdjm 	ASSERT_PTR_NE(s2, NULL);
705f828cc92Sdjm 	ASSERT_STRING_EQ(s2, "00000000000000000000");
706f828cc92Sdjm 	sshbuf_free(p1);
707f828cc92Sdjm 	TEST_DONE();
70829518ea0Sdjm }
709