1 /* 	$OpenBSD: test_sshbuf_misc.c,v 1.2 2016/05/03 13:48:33 djm Exp $ */
2 /*
3  * Regress test for sshbuf.h buffer API
4  *
5  * Placed in the public domain
6  */
7 
8 #include "includes.h"
9 
10 #include <sys/types.h>
11 #include <sys/param.h>
12 #include <stdio.h>
13 #ifdef HAVE_STDINT_H
14 # include <stdint.h>
15 #endif
16 #include <stdlib.h>
17 #include <string.h>
18 
19 #include "../test_helper/test_helper.h"
20 
21 #include "sshbuf.h"
22 
23 void sshbuf_misc_tests(void);
24 
25 void
26 sshbuf_misc_tests(void)
27 {
28 	struct sshbuf *p1;
29 	char tmp[512], *p;
30 	FILE *out;
31 	size_t sz;
32 
33 	TEST_START("sshbuf_dump");
34 	out = tmpfile();
35 	ASSERT_PTR_NE(out, NULL);
36 	p1 = sshbuf_new();
37 	ASSERT_PTR_NE(p1, NULL);
38 	ASSERT_INT_EQ(sshbuf_put_u32(p1, 0x12345678), 0);
39 	sshbuf_dump(p1, out);
40 	fflush(out);
41 	rewind(out);
42 	sz = fread(tmp, 1, sizeof(tmp), out);
43 	ASSERT_INT_EQ(ferror(out), 0);
44 	ASSERT_INT_NE(feof(out), 0);
45 	ASSERT_SIZE_T_GT(sz, 0);
46 	tmp[sz] = '\0';
47 	ASSERT_PTR_NE(strstr(tmp, "12 34 56 78"), NULL);
48 	fclose(out);
49 	sshbuf_free(p1);
50 	TEST_DONE();
51 
52 	TEST_START("sshbuf_dtob16");
53 	p1 = sshbuf_new();
54 	ASSERT_PTR_NE(p1, NULL);
55 	ASSERT_INT_EQ(sshbuf_put_u32(p1, 0x12345678), 0);
56 	p = sshbuf_dtob16(p1);
57 	ASSERT_PTR_NE(p, NULL);
58 	ASSERT_STRING_EQ(p, "12345678");
59 	free(p);
60 	sshbuf_free(p1);
61 	TEST_DONE();
62 
63 	TEST_START("sshbuf_dtob64 len 1");
64 	p1 = sshbuf_new();
65 	ASSERT_PTR_NE(p1, NULL);
66 	ASSERT_INT_EQ(sshbuf_put_u8(p1, 0x11), 0);
67 	p = sshbuf_dtob64(p1);
68 	ASSERT_PTR_NE(p, NULL);
69 	ASSERT_STRING_EQ(p, "EQ==");
70 	free(p);
71 	sshbuf_free(p1);
72 	TEST_DONE();
73 
74 	TEST_START("sshbuf_dtob64 len 2");
75 	p1 = sshbuf_new();
76 	ASSERT_PTR_NE(p1, NULL);
77 	ASSERT_INT_EQ(sshbuf_put_u8(p1, 0x11), 0);
78 	ASSERT_INT_EQ(sshbuf_put_u8(p1, 0x22), 0);
79 	p = sshbuf_dtob64(p1);
80 	ASSERT_PTR_NE(p, NULL);
81 	ASSERT_STRING_EQ(p, "ESI=");
82 	free(p);
83 	sshbuf_free(p1);
84 	TEST_DONE();
85 
86 	TEST_START("sshbuf_dtob64 len 3");
87 	p1 = sshbuf_new();
88 	ASSERT_PTR_NE(p1, NULL);
89 	ASSERT_INT_EQ(sshbuf_put_u8(p1, 0x11), 0);
90 	ASSERT_INT_EQ(sshbuf_put_u8(p1, 0x22), 0);
91 	ASSERT_INT_EQ(sshbuf_put_u8(p1, 0x33), 0);
92 	p = sshbuf_dtob64(p1);
93 	ASSERT_PTR_NE(p, NULL);
94 	ASSERT_STRING_EQ(p, "ESIz");
95 	free(p);
96 	sshbuf_free(p1);
97 	TEST_DONE();
98 
99 	TEST_START("sshbuf_dtob64 len 8191");
100 	p1 = sshbuf_new();
101 	ASSERT_PTR_NE(p1, NULL);
102 	ASSERT_INT_EQ(sshbuf_reserve(p1, 8192, NULL), 0);
103 	bzero(sshbuf_mutable_ptr(p1), 8192);
104 	p = sshbuf_dtob64(p1);
105 	ASSERT_PTR_NE(p, NULL);
106 	ASSERT_SIZE_T_EQ(strlen(p), ((8191 + 2) / 3) * 4);
107 	free(p);
108 	sshbuf_free(p1);
109 	TEST_DONE();
110 
111 	TEST_START("sshbuf_b64tod len 1");
112 	p1 = sshbuf_new();
113 	ASSERT_PTR_NE(p1, NULL);
114 	ASSERT_INT_EQ(sshbuf_b64tod(p1, "0A=="), 0);
115 	ASSERT_SIZE_T_EQ(sshbuf_len(p1), 1);
116 	ASSERT_U8_EQ(*sshbuf_ptr(p1), 0xd0);
117 	sshbuf_free(p1);
118 	TEST_DONE();
119 
120 	TEST_START("sshbuf_b64tod len 2");
121 	p1 = sshbuf_new();
122 	ASSERT_PTR_NE(p1, NULL);
123 	ASSERT_INT_EQ(sshbuf_b64tod(p1, "0A8="), 0);
124 	ASSERT_SIZE_T_EQ(sshbuf_len(p1), 2);
125 	ASSERT_U16_EQ(PEEK_U16(sshbuf_ptr(p1)), 0xd00f);
126 	sshbuf_free(p1);
127 	TEST_DONE();
128 
129 	TEST_START("sshbuf_b64tod len 4");
130 	p1 = sshbuf_new();
131 	ASSERT_PTR_NE(p1, NULL);
132 	ASSERT_INT_EQ(sshbuf_b64tod(p1, "0A/QDw=="), 0);
133 	ASSERT_SIZE_T_EQ(sshbuf_len(p1), 4);
134 	ASSERT_U32_EQ(PEEK_U32(sshbuf_ptr(p1)), 0xd00fd00f);
135 	sshbuf_free(p1);
136 	TEST_DONE();
137 
138 	TEST_START("sshbuf_dup_string");
139 	p1 = sshbuf_new();
140 	ASSERT_PTR_NE(p1, NULL);
141 	/* Check empty buffer */
142 	p = sshbuf_dup_string(p1);
143 	ASSERT_PTR_NE(p, NULL);
144 	ASSERT_SIZE_T_EQ(strlen(p), 0);
145 	free(p);
146 	/* Check buffer with string */
147 	ASSERT_INT_EQ(sshbuf_put(p1, "quad1", strlen("quad1")), 0);
148 	p = sshbuf_dup_string(p1);
149 	ASSERT_PTR_NE(p, NULL);
150 	ASSERT_SIZE_T_EQ(strlen(p), strlen("quad1"));
151 	ASSERT_STRING_EQ(p, "quad1");
152 	free(p);
153 	/* Check buffer with terminating nul */
154 	ASSERT_INT_EQ(sshbuf_put(p1, "\0", 1), 0);
155 	p = sshbuf_dup_string(p1);
156 	ASSERT_PTR_NE(p, NULL);
157 	ASSERT_SIZE_T_EQ(strlen(p), strlen("quad1"));
158 	ASSERT_STRING_EQ(p, "quad1");
159 	free(p);
160 	/* Check buffer with data after nul (expect failure) */
161 	ASSERT_INT_EQ(sshbuf_put(p1, "quad2", strlen("quad2")), 0);
162 	p = sshbuf_dup_string(p1);
163 	ASSERT_PTR_EQ(p, NULL);
164 	sshbuf_free(p1);
165 	TEST_DONE();
166 }
167 
168