test_sshbuf.c revision 323134
1/* 	$OpenBSD: test_sshbuf.c,v 1.1 2014/04/30 05:32:00 djm Exp $ */
2/*
3 * Regress test for sshbuf.h buffer API
4 *
5 * Placed in the public domain
6 */
7
8#define SSHBUF_INTERNAL 1	/* access internals for testing */
9#include "includes.h"
10
11#include <sys/types.h>
12#include <sys/param.h>
13#include <stdio.h>
14#ifdef HAVE_STDINT_H
15# include <stdint.h>
16#endif
17#include <stdlib.h>
18#include <string.h>
19
20#include "../test_helper/test_helper.h"
21
22#include "ssherr.h"
23#include "sshbuf.h"
24
25void sshbuf_tests(void);
26
27void
28sshbuf_tests(void)
29{
30	struct sshbuf *p1;
31	const u_char *cdp;
32	u_char *dp;
33	size_t sz;
34	int r;
35
36	TEST_START("allocate sshbuf");
37	p1 = sshbuf_new();
38	ASSERT_PTR_NE(p1, NULL);
39	TEST_DONE();
40
41	TEST_START("max size on fresh buffer");
42	ASSERT_SIZE_T_GT(sshbuf_max_size(p1), 0);
43	TEST_DONE();
44
45	TEST_START("available on fresh buffer");
46	ASSERT_SIZE_T_GT(sshbuf_avail(p1), 0);
47	TEST_DONE();
48
49	TEST_START("len = 0 on empty buffer");
50	ASSERT_SIZE_T_EQ(sshbuf_len(p1), 0);
51	TEST_DONE();
52
53	TEST_START("set valid max size");
54	ASSERT_INT_EQ(sshbuf_set_max_size(p1, 65536), 0);
55	ASSERT_SIZE_T_EQ(sshbuf_max_size(p1), 65536);
56	TEST_DONE();
57
58	TEST_START("available on limited buffer");
59	ASSERT_SIZE_T_EQ(sshbuf_avail(p1), 65536);
60	TEST_DONE();
61
62	TEST_START("free");
63	sshbuf_free(p1);
64	TEST_DONE();
65
66	TEST_START("consume on empty buffer");
67	p1 = sshbuf_new();
68	ASSERT_PTR_NE(p1, NULL);
69	ASSERT_INT_EQ(sshbuf_consume(p1, 0), 0);
70	ASSERT_INT_EQ(sshbuf_consume(p1, 1), SSH_ERR_MESSAGE_INCOMPLETE);
71	sshbuf_free(p1);
72	TEST_DONE();
73
74	TEST_START("consume_end on empty buffer");
75	p1 = sshbuf_new();
76	ASSERT_PTR_NE(p1, NULL);
77	ASSERT_INT_EQ(sshbuf_consume_end(p1, 0), 0);
78	ASSERT_INT_EQ(sshbuf_consume_end(p1, 1), SSH_ERR_MESSAGE_INCOMPLETE);
79	sshbuf_free(p1);
80	TEST_DONE();
81
82	TEST_START("reserve space");
83	p1 = sshbuf_new();
84	ASSERT_PTR_NE(p1, NULL);
85	r = sshbuf_reserve(p1, 1, &dp);
86	ASSERT_INT_EQ(r, 0);
87	ASSERT_PTR_NE(dp, NULL);
88	*dp = 0x11;
89	r = sshbuf_reserve(p1, 3, &dp);
90	ASSERT_INT_EQ(r, 0);
91	ASSERT_PTR_NE(dp, NULL);
92	*dp++ = 0x22;
93	*dp++ = 0x33;
94	*dp++ = 0x44;
95	TEST_DONE();
96
97	TEST_START("sshbuf_len on filled buffer");
98	ASSERT_SIZE_T_EQ(sshbuf_len(p1), 4);
99	TEST_DONE();
100
101	TEST_START("sshbuf_ptr on filled buffer");
102	cdp = sshbuf_ptr(p1);
103	ASSERT_PTR_NE(cdp, NULL);
104	ASSERT_U8_EQ(cdp[0], 0x11);
105	ASSERT_U8_EQ(cdp[1], 0x22);
106	ASSERT_U8_EQ(cdp[2], 0x33);
107	ASSERT_U8_EQ(cdp[3], 0x44);
108	TEST_DONE();
109
110	TEST_START("consume on filled buffer");
111	ASSERT_SIZE_T_EQ(sshbuf_len(p1), 4);
112	ASSERT_INT_EQ(sshbuf_consume(p1, 0), 0);
113	ASSERT_SIZE_T_EQ(sshbuf_len(p1), 4);
114	r = sshbuf_consume(p1, 64);
115	ASSERT_INT_EQ(r, SSH_ERR_MESSAGE_INCOMPLETE);
116	ASSERT_SIZE_T_EQ(sshbuf_len(p1), 4);
117	ASSERT_INT_EQ(sshbuf_consume(p1, 1), 0);
118	ASSERT_SIZE_T_EQ(sshbuf_len(p1), 3);
119	cdp = sshbuf_ptr(p1);
120	ASSERT_PTR_NE(p1, NULL);
121	ASSERT_U8_EQ(cdp[0], 0x22);
122	ASSERT_INT_EQ(sshbuf_consume(p1, 2), 0);
123	ASSERT_SIZE_T_EQ(sshbuf_len(p1), 1);
124	cdp = sshbuf_ptr(p1);
125	ASSERT_PTR_NE(p1, NULL);
126	ASSERT_U8_EQ(cdp[0], 0x44);
127	r = sshbuf_consume(p1, 2);
128	ASSERT_INT_EQ(r, SSH_ERR_MESSAGE_INCOMPLETE);
129	ASSERT_SIZE_T_EQ(sshbuf_len(p1), 1);
130	ASSERT_INT_EQ(sshbuf_consume(p1, 1), 0);
131	ASSERT_SIZE_T_EQ(sshbuf_len(p1), 0);
132	r = sshbuf_consume(p1, 1);
133	ASSERT_INT_EQ(r, SSH_ERR_MESSAGE_INCOMPLETE);
134	sshbuf_free(p1);
135	TEST_DONE();
136
137	TEST_START("consume_end on filled buffer");
138	p1 = sshbuf_new();
139	ASSERT_PTR_NE(p1, NULL);
140	r = sshbuf_reserve(p1, 4, &dp);
141	ASSERT_INT_EQ(r, 0);
142	ASSERT_PTR_NE(dp, NULL);
143	*dp++ = 0x11;
144	*dp++ = 0x22;
145	*dp++ = 0x33;
146	*dp++ = 0x44;
147	ASSERT_SIZE_T_EQ(sshbuf_len(p1), 4);
148	r = sshbuf_consume_end(p1, 5);
149	ASSERT_INT_EQ(r, SSH_ERR_MESSAGE_INCOMPLETE);
150	ASSERT_SIZE_T_EQ(sshbuf_len(p1), 4);
151	ASSERT_INT_EQ(sshbuf_consume_end(p1, 3), 0);
152	ASSERT_SIZE_T_EQ(sshbuf_len(p1), 1);
153	cdp = sshbuf_ptr(p1);
154	ASSERT_PTR_NE(cdp, NULL);
155	ASSERT_U8_EQ(*cdp, 0x11);
156	r = sshbuf_consume_end(p1, 2);
157	ASSERT_INT_EQ(r, SSH_ERR_MESSAGE_INCOMPLETE);
158	ASSERT_INT_EQ(sshbuf_consume_end(p1, 1), 0);
159	ASSERT_SIZE_T_EQ(sshbuf_len(p1), 0);
160	sshbuf_free(p1);
161	TEST_DONE();
162
163	TEST_START("fill limited buffer");
164	p1 = sshbuf_new();
165	ASSERT_PTR_NE(p1, NULL);
166	ASSERT_INT_EQ(sshbuf_set_max_size(p1, 1223), 0);
167	ASSERT_SIZE_T_EQ(sshbuf_max_size(p1), 1223);
168	ASSERT_SIZE_T_EQ(sshbuf_avail(p1), 1223);
169	r = sshbuf_reserve(p1, 1223, &dp);
170	ASSERT_INT_EQ(r, 0);
171	ASSERT_PTR_NE(dp, NULL);
172	memset(dp, 0xd7, 1223);
173	ASSERT_SIZE_T_EQ(sshbuf_len(p1), 1223);
174	ASSERT_SIZE_T_EQ(sshbuf_avail(p1), 0);
175	r = sshbuf_reserve(p1, 1, &dp);
176	ASSERT_INT_EQ(r, SSH_ERR_NO_BUFFER_SPACE);
177	ASSERT_PTR_EQ(dp, NULL);
178	TEST_DONE();
179
180	TEST_START("consume and force compaction");
181	ASSERT_INT_EQ(sshbuf_consume(p1, 223), 0);
182	ASSERT_SIZE_T_EQ(sshbuf_len(p1), 1000);
183	ASSERT_SIZE_T_EQ(sshbuf_avail(p1), 223);
184	r = sshbuf_reserve(p1, 224, &dp);
185	ASSERT_INT_EQ(r, SSH_ERR_NO_BUFFER_SPACE);
186	ASSERT_PTR_EQ(dp, NULL);
187	ASSERT_SIZE_T_EQ(sshbuf_len(p1), 1000);
188	ASSERT_SIZE_T_EQ(sshbuf_avail(p1), 223);
189	r = sshbuf_reserve(p1, 223, &dp);
190	ASSERT_INT_EQ(r, 0);
191	ASSERT_PTR_NE(dp, NULL);
192	memset(dp, 0x7d, 223);
193	cdp = sshbuf_ptr(p1);
194	ASSERT_PTR_NE(cdp, NULL);
195	ASSERT_MEM_FILLED_EQ(cdp, 0xd7, 1000);
196	ASSERT_MEM_FILLED_EQ(cdp + 1000, 0x7d, 223);
197	TEST_DONE();
198
199	TEST_START("resize full buffer");
200	r = sshbuf_set_max_size(p1, 1000);
201	ASSERT_INT_EQ(r, SSH_ERR_NO_BUFFER_SPACE);
202	sz = roundup(1223 + SSHBUF_SIZE_INC * 3, SSHBUF_SIZE_INC);
203	ASSERT_INT_EQ(sshbuf_set_max_size(p1, sz), 0);
204	ASSERT_SIZE_T_EQ(sshbuf_max_size(p1), sz);
205	ASSERT_SIZE_T_EQ(sshbuf_avail(p1), sz - 1223);
206	ASSERT_INT_EQ(sshbuf_len(p1), 1223);
207	TEST_DONE();
208
209	/* NB. uses sshbuf internals */
210	TEST_START("alloc chunking");
211	r = sshbuf_reserve(p1, 1, &dp);
212	ASSERT_INT_EQ(r, 0);
213	ASSERT_PTR_NE(dp, NULL);
214	*dp = 0xff;
215	cdp = sshbuf_ptr(p1);
216	ASSERT_PTR_NE(cdp, NULL);
217	ASSERT_MEM_FILLED_EQ(cdp, 0xd7, 1000);
218	ASSERT_MEM_FILLED_EQ(cdp + 1000, 0x7d, 223);
219	ASSERT_MEM_FILLED_EQ(cdp + 1223, 0xff, 1);
220	ASSERT_SIZE_T_EQ(sshbuf_alloc(p1) % SSHBUF_SIZE_INC, 0);
221	sshbuf_free(p1);
222	TEST_DONE();
223
224	TEST_START("reset buffer");
225	p1 = sshbuf_new();
226	ASSERT_PTR_NE(p1, NULL);
227	ASSERT_INT_EQ(sshbuf_set_max_size(p1, 1223), 0);
228	ASSERT_SIZE_T_EQ(sshbuf_max_size(p1), 1223);
229	r = sshbuf_reserve(p1, 1223, &dp);
230	ASSERT_INT_EQ(r, 0);
231	ASSERT_PTR_NE(dp, NULL);
232	memset(dp, 0xd7, 1223);
233	ASSERT_SIZE_T_EQ(sshbuf_len(p1), 1223);
234	sshbuf_reset(p1);
235	ASSERT_SIZE_T_EQ(sshbuf_max_size(p1), 1223);
236	ASSERT_SIZE_T_EQ(sshbuf_len(p1), 0);
237	ASSERT_SIZE_T_EQ(sshbuf_avail(p1), 1223);
238	sshbuf_free(p1);
239	TEST_DONE();
240}
241