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