xref: /openbsd-src/regress/usr.bin/ssh/unittests/sshbuf/test_sshbuf_misc.c (revision a8c975d25b8973125837f3cd4c63b4a611f5c5f5)
1*a8c975d2Sderaadt /* 	$OpenBSD: test_sshbuf_misc.c,v 1.5 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 
1629518ea0Sdjm #include "sshbuf.h"
178eb3e81cSdjm #include "ssherr.h"
1829518ea0Sdjm 
1929518ea0Sdjm void sshbuf_misc_tests(void);
2029518ea0Sdjm 
2129518ea0Sdjm void
sshbuf_misc_tests(void)2229518ea0Sdjm sshbuf_misc_tests(void)
2329518ea0Sdjm {
2429518ea0Sdjm 	struct sshbuf *p1;
258eb3e81cSdjm 	char tmp[512], msg[] = "imploring ping silence ping over", *p;
2629518ea0Sdjm 	FILE *out;
2729518ea0Sdjm 	size_t sz;
2829518ea0Sdjm 
2929518ea0Sdjm 	TEST_START("sshbuf_dump");
3029518ea0Sdjm 	out = tmpfile();
3129518ea0Sdjm 	ASSERT_PTR_NE(out, NULL);
3229518ea0Sdjm 	p1 = sshbuf_new();
3329518ea0Sdjm 	ASSERT_PTR_NE(p1, NULL);
3429518ea0Sdjm 	ASSERT_INT_EQ(sshbuf_put_u32(p1, 0x12345678), 0);
3529518ea0Sdjm 	sshbuf_dump(p1, out);
3629518ea0Sdjm 	fflush(out);
3729518ea0Sdjm 	rewind(out);
3829518ea0Sdjm 	sz = fread(tmp, 1, sizeof(tmp), out);
3929518ea0Sdjm 	ASSERT_INT_EQ(ferror(out), 0);
4029518ea0Sdjm 	ASSERT_INT_NE(feof(out), 0);
4129518ea0Sdjm 	ASSERT_SIZE_T_GT(sz, 0);
4229518ea0Sdjm 	tmp[sz] = '\0';
4329518ea0Sdjm 	ASSERT_PTR_NE(strstr(tmp, "12 34 56 78"), NULL);
4429518ea0Sdjm 	fclose(out);
4529518ea0Sdjm 	sshbuf_free(p1);
4629518ea0Sdjm 	TEST_DONE();
4729518ea0Sdjm 
4829518ea0Sdjm 	TEST_START("sshbuf_dtob16");
4929518ea0Sdjm 	p1 = sshbuf_new();
5029518ea0Sdjm 	ASSERT_PTR_NE(p1, NULL);
5129518ea0Sdjm 	ASSERT_INT_EQ(sshbuf_put_u32(p1, 0x12345678), 0);
5229518ea0Sdjm 	p = sshbuf_dtob16(p1);
5329518ea0Sdjm 	ASSERT_PTR_NE(p, NULL);
5429518ea0Sdjm 	ASSERT_STRING_EQ(p, "12345678");
5529518ea0Sdjm 	free(p);
5629518ea0Sdjm 	sshbuf_free(p1);
5729518ea0Sdjm 	TEST_DONE();
5829518ea0Sdjm 
5982c4892eSdjm 	TEST_START("sshbuf_dtob64_string len 1");
6029518ea0Sdjm 	p1 = sshbuf_new();
6129518ea0Sdjm 	ASSERT_PTR_NE(p1, NULL);
6229518ea0Sdjm 	ASSERT_INT_EQ(sshbuf_put_u8(p1, 0x11), 0);
6382c4892eSdjm 	p = sshbuf_dtob64_string(p1, 0);
6429518ea0Sdjm 	ASSERT_PTR_NE(p, NULL);
6529518ea0Sdjm 	ASSERT_STRING_EQ(p, "EQ==");
6629518ea0Sdjm 	free(p);
6729518ea0Sdjm 	sshbuf_free(p1);
6829518ea0Sdjm 	TEST_DONE();
6929518ea0Sdjm 
7082c4892eSdjm 	TEST_START("sshbuf_dtob64_string len 2");
7129518ea0Sdjm 	p1 = sshbuf_new();
7229518ea0Sdjm 	ASSERT_PTR_NE(p1, NULL);
7329518ea0Sdjm 	ASSERT_INT_EQ(sshbuf_put_u8(p1, 0x11), 0);
7429518ea0Sdjm 	ASSERT_INT_EQ(sshbuf_put_u8(p1, 0x22), 0);
7582c4892eSdjm 	p = sshbuf_dtob64_string(p1, 0);
7629518ea0Sdjm 	ASSERT_PTR_NE(p, NULL);
7729518ea0Sdjm 	ASSERT_STRING_EQ(p, "ESI=");
7829518ea0Sdjm 	free(p);
7929518ea0Sdjm 	sshbuf_free(p1);
8029518ea0Sdjm 	TEST_DONE();
8129518ea0Sdjm 
8282c4892eSdjm 	TEST_START("sshbuf_dtob64_string len 3");
8329518ea0Sdjm 	p1 = sshbuf_new();
8429518ea0Sdjm 	ASSERT_PTR_NE(p1, NULL);
8529518ea0Sdjm 	ASSERT_INT_EQ(sshbuf_put_u8(p1, 0x11), 0);
8629518ea0Sdjm 	ASSERT_INT_EQ(sshbuf_put_u8(p1, 0x22), 0);
8729518ea0Sdjm 	ASSERT_INT_EQ(sshbuf_put_u8(p1, 0x33), 0);
8882c4892eSdjm 	p = sshbuf_dtob64_string(p1, 0);
8929518ea0Sdjm 	ASSERT_PTR_NE(p, NULL);
9029518ea0Sdjm 	ASSERT_STRING_EQ(p, "ESIz");
9129518ea0Sdjm 	free(p);
9229518ea0Sdjm 	sshbuf_free(p1);
9329518ea0Sdjm 	TEST_DONE();
9429518ea0Sdjm 
9582c4892eSdjm 	TEST_START("sshbuf_dtob64_string len 8191");
9629518ea0Sdjm 	p1 = sshbuf_new();
9729518ea0Sdjm 	ASSERT_PTR_NE(p1, NULL);
9829518ea0Sdjm 	ASSERT_INT_EQ(sshbuf_reserve(p1, 8192, NULL), 0);
9929518ea0Sdjm 	bzero(sshbuf_mutable_ptr(p1), 8192);
10082c4892eSdjm 	p = sshbuf_dtob64_string(p1, 0);
10129518ea0Sdjm 	ASSERT_PTR_NE(p, NULL);
10229518ea0Sdjm 	ASSERT_SIZE_T_EQ(strlen(p), ((8191 + 2) / 3) * 4);
10329518ea0Sdjm 	free(p);
10429518ea0Sdjm 	sshbuf_free(p1);
10529518ea0Sdjm 	TEST_DONE();
10629518ea0Sdjm 
10729518ea0Sdjm 	TEST_START("sshbuf_b64tod len 1");
10829518ea0Sdjm 	p1 = sshbuf_new();
10929518ea0Sdjm 	ASSERT_PTR_NE(p1, NULL);
11029518ea0Sdjm 	ASSERT_INT_EQ(sshbuf_b64tod(p1, "0A=="), 0);
11129518ea0Sdjm 	ASSERT_SIZE_T_EQ(sshbuf_len(p1), 1);
11229518ea0Sdjm 	ASSERT_U8_EQ(*sshbuf_ptr(p1), 0xd0);
11329518ea0Sdjm 	sshbuf_free(p1);
11429518ea0Sdjm 	TEST_DONE();
11529518ea0Sdjm 
11629518ea0Sdjm 	TEST_START("sshbuf_b64tod len 2");
11729518ea0Sdjm 	p1 = sshbuf_new();
11829518ea0Sdjm 	ASSERT_PTR_NE(p1, NULL);
11929518ea0Sdjm 	ASSERT_INT_EQ(sshbuf_b64tod(p1, "0A8="), 0);
12029518ea0Sdjm 	ASSERT_SIZE_T_EQ(sshbuf_len(p1), 2);
12129518ea0Sdjm 	ASSERT_U16_EQ(PEEK_U16(sshbuf_ptr(p1)), 0xd00f);
12229518ea0Sdjm 	sshbuf_free(p1);
12329518ea0Sdjm 	TEST_DONE();
12429518ea0Sdjm 
12529518ea0Sdjm 	TEST_START("sshbuf_b64tod len 4");
12629518ea0Sdjm 	p1 = sshbuf_new();
12729518ea0Sdjm 	ASSERT_PTR_NE(p1, NULL);
12829518ea0Sdjm 	ASSERT_INT_EQ(sshbuf_b64tod(p1, "0A/QDw=="), 0);
12929518ea0Sdjm 	ASSERT_SIZE_T_EQ(sshbuf_len(p1), 4);
13029518ea0Sdjm 	ASSERT_U32_EQ(PEEK_U32(sshbuf_ptr(p1)), 0xd00fd00f);
13129518ea0Sdjm 	sshbuf_free(p1);
13229518ea0Sdjm 	TEST_DONE();
133ab8f9939Sdjm 
134ab8f9939Sdjm 	TEST_START("sshbuf_dup_string");
135ab8f9939Sdjm 	p1 = sshbuf_new();
136ab8f9939Sdjm 	ASSERT_PTR_NE(p1, NULL);
137ab8f9939Sdjm 	/* Check empty buffer */
138ab8f9939Sdjm 	p = sshbuf_dup_string(p1);
139ab8f9939Sdjm 	ASSERT_PTR_NE(p, NULL);
140ab8f9939Sdjm 	ASSERT_SIZE_T_EQ(strlen(p), 0);
141ab8f9939Sdjm 	free(p);
142ab8f9939Sdjm 	/* Check buffer with string */
143ab8f9939Sdjm 	ASSERT_INT_EQ(sshbuf_put(p1, "quad1", strlen("quad1")), 0);
144ab8f9939Sdjm 	p = sshbuf_dup_string(p1);
145ab8f9939Sdjm 	ASSERT_PTR_NE(p, NULL);
146ab8f9939Sdjm 	ASSERT_SIZE_T_EQ(strlen(p), strlen("quad1"));
147ab8f9939Sdjm 	ASSERT_STRING_EQ(p, "quad1");
148ab8f9939Sdjm 	free(p);
149ab8f9939Sdjm 	/* Check buffer with terminating nul */
150ab8f9939Sdjm 	ASSERT_INT_EQ(sshbuf_put(p1, "\0", 1), 0);
151ab8f9939Sdjm 	p = sshbuf_dup_string(p1);
152ab8f9939Sdjm 	ASSERT_PTR_NE(p, NULL);
153ab8f9939Sdjm 	ASSERT_SIZE_T_EQ(strlen(p), strlen("quad1"));
154ab8f9939Sdjm 	ASSERT_STRING_EQ(p, "quad1");
155ab8f9939Sdjm 	free(p);
156ab8f9939Sdjm 	/* Check buffer with data after nul (expect failure) */
157ab8f9939Sdjm 	ASSERT_INT_EQ(sshbuf_put(p1, "quad2", strlen("quad2")), 0);
158ab8f9939Sdjm 	p = sshbuf_dup_string(p1);
159ab8f9939Sdjm 	ASSERT_PTR_EQ(p, NULL);
160ab8f9939Sdjm 	sshbuf_free(p1);
161ab8f9939Sdjm 	TEST_DONE();
1628eb3e81cSdjm 
1638eb3e81cSdjm 	TEST_START("sshbuf_cmp");
1648eb3e81cSdjm 	p1 = sshbuf_from(msg, sizeof(msg) - 1);
1658eb3e81cSdjm 	ASSERT_PTR_NE(p1, NULL);
1668eb3e81cSdjm 	ASSERT_INT_EQ(sshbuf_cmp(p1, 0, "i", 1), 0);
1678eb3e81cSdjm 	ASSERT_INT_EQ(sshbuf_cmp(p1, 0, "j", 1), SSH_ERR_INVALID_FORMAT);
1688eb3e81cSdjm 	ASSERT_INT_EQ(sshbuf_cmp(p1, 0, "imploring", 9), 0);
1698eb3e81cSdjm 	ASSERT_INT_EQ(sshbuf_cmp(p1, 0, "implored", 9), SSH_ERR_INVALID_FORMAT);
1708eb3e81cSdjm 	ASSERT_INT_EQ(sshbuf_cmp(p1, 10, "ping", 4), 0);
1718eb3e81cSdjm 	ASSERT_INT_EQ(sshbuf_cmp(p1, 10, "ring", 4), SSH_ERR_INVALID_FORMAT);
1728eb3e81cSdjm 	ASSERT_INT_EQ(sshbuf_cmp(p1, 28, "over", 4), 0);
1738eb3e81cSdjm 	ASSERT_INT_EQ(sshbuf_cmp(p1, 28, "rove", 4), SSH_ERR_INVALID_FORMAT);
1748eb3e81cSdjm 	ASSERT_INT_EQ(sshbuf_cmp(p1, 28, "overt", 5),
1758eb3e81cSdjm 	    SSH_ERR_MESSAGE_INCOMPLETE);
1768eb3e81cSdjm 	ASSERT_INT_EQ(sshbuf_cmp(p1, 32, "ping", 4),
1778eb3e81cSdjm 	    SSH_ERR_MESSAGE_INCOMPLETE);
1788eb3e81cSdjm 	ASSERT_INT_EQ(sshbuf_cmp(p1, 1000, "silence", 7),
1798eb3e81cSdjm 	    SSH_ERR_MESSAGE_INCOMPLETE);
1808eb3e81cSdjm 	ASSERT_INT_EQ(sshbuf_cmp(p1, 0, msg, sizeof(msg) - 1), 0);
1818eb3e81cSdjm 	TEST_DONE();
1828eb3e81cSdjm 
1838eb3e81cSdjm 	TEST_START("sshbuf_find");
1848eb3e81cSdjm 	p1 = sshbuf_from(msg, sizeof(msg) - 1);
1858eb3e81cSdjm 	ASSERT_PTR_NE(p1, NULL);
1868eb3e81cSdjm 	ASSERT_INT_EQ(sshbuf_find(p1, 0, "i", 1, &sz), 0);
1878eb3e81cSdjm 	ASSERT_SIZE_T_EQ(sz, 0);
1888eb3e81cSdjm 	ASSERT_INT_EQ(sshbuf_find(p1, 0, "j", 1, &sz), SSH_ERR_INVALID_FORMAT);
1898eb3e81cSdjm 	ASSERT_INT_EQ(sshbuf_find(p1, 0, "imploring", 9, &sz), 0);
1908eb3e81cSdjm 	ASSERT_SIZE_T_EQ(sz, 0);
1918eb3e81cSdjm 	ASSERT_INT_EQ(sshbuf_find(p1, 0, "implored", 9, &sz),
1928eb3e81cSdjm 	    SSH_ERR_INVALID_FORMAT);
1938eb3e81cSdjm 	ASSERT_INT_EQ(sshbuf_find(p1, 3, "ping", 4, &sz), 0);
1948eb3e81cSdjm 	ASSERT_SIZE_T_EQ(sz, 10);
1958eb3e81cSdjm 	ASSERT_INT_EQ(sshbuf_find(p1, 11, "ping", 4, &sz), 0);
1968eb3e81cSdjm 	ASSERT_SIZE_T_EQ(sz, 23);
1978eb3e81cSdjm 	ASSERT_INT_EQ(sshbuf_find(p1, 20, "over", 4, &sz), 0);
1988eb3e81cSdjm 	ASSERT_SIZE_T_EQ(sz, 28);
1998eb3e81cSdjm 	ASSERT_INT_EQ(sshbuf_find(p1, 28, "over", 4, &sz), 0);
2008eb3e81cSdjm 	ASSERT_SIZE_T_EQ(sz, 28);
2018eb3e81cSdjm 	ASSERT_INT_EQ(sshbuf_find(p1, 28, "rove", 4, &sz),
2028eb3e81cSdjm 	    SSH_ERR_INVALID_FORMAT);
2038eb3e81cSdjm 	ASSERT_INT_EQ(sshbuf_find(p1, 28, "overt", 5, &sz),
2048eb3e81cSdjm 	    SSH_ERR_MESSAGE_INCOMPLETE);
2058eb3e81cSdjm 	ASSERT_INT_EQ(sshbuf_find(p1, 32, "ping", 4, &sz),
2068eb3e81cSdjm 	    SSH_ERR_MESSAGE_INCOMPLETE);
2078eb3e81cSdjm 	ASSERT_INT_EQ(sshbuf_find(p1, 1000, "silence", 7, &sz),
2088eb3e81cSdjm 	    SSH_ERR_MESSAGE_INCOMPLETE);
2098eb3e81cSdjm 	ASSERT_INT_EQ(sshbuf_find(p1, 0, msg + 1, sizeof(msg) - 2, &sz), 0);
2108eb3e81cSdjm 	ASSERT_SIZE_T_EQ(sz, 1);
2118eb3e81cSdjm 	TEST_DONE();
21229518ea0Sdjm }
21329518ea0Sdjm 
214