bufaux.c revision 295367
1/* $OpenBSD: bufaux.c,v 1.60 2014/04/30 05:29:56 djm Exp $ */
2/*
3 * Copyright (c) 2012 Damien Miller <djm@mindrot.org>
4 *
5 * Permission to use, copy, modify, and distribute this software for any
6 * purpose with or without fee is hereby granted, provided that the above
7 * copyright notice and this permission notice appear in all copies.
8 *
9 * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
10 * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
11 * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
12 * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
13 * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
14 * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
15 * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
16 */
17
18/* Emulation wrappers for legacy OpenSSH buffer API atop sshbuf */
19
20#include "includes.h"
21
22#include <sys/types.h>
23
24#include "buffer.h"
25#include "log.h"
26#include "ssherr.h"
27
28int
29buffer_get_short_ret(u_short *v, Buffer *buffer)
30{
31	int ret;
32
33	if ((ret = sshbuf_get_u16(buffer, v)) != 0) {
34		error("%s: %s", __func__, ssh_err(ret));
35		return -1;
36	}
37	return 0;
38}
39
40u_short
41buffer_get_short(Buffer *buffer)
42{
43	u_short ret;
44
45	if (buffer_get_short_ret(&ret, buffer) == -1)
46		fatal("%s: buffer error", __func__);
47
48	return (ret);
49}
50
51int
52buffer_get_int_ret(u_int *v, Buffer *buffer)
53{
54	int ret;
55
56	if ((ret = sshbuf_get_u32(buffer, v)) != 0) {
57		error("%s: %s", __func__, ssh_err(ret));
58		return -1;
59	}
60	return 0;
61}
62
63u_int
64buffer_get_int(Buffer *buffer)
65{
66	u_int ret;
67
68	if (buffer_get_int_ret(&ret, buffer) == -1)
69		fatal("%s: buffer error", __func__);
70
71	return (ret);
72}
73
74int
75buffer_get_int64_ret(u_int64_t *v, Buffer *buffer)
76{
77	int ret;
78
79	if ((ret = sshbuf_get_u64(buffer, v)) != 0) {
80		error("%s: %s", __func__, ssh_err(ret));
81		return -1;
82	}
83	return 0;
84}
85
86u_int64_t
87buffer_get_int64(Buffer *buffer)
88{
89	u_int64_t ret;
90
91	if (buffer_get_int64_ret(&ret, buffer) == -1)
92		fatal("%s: buffer error", __func__);
93
94	return (ret);
95}
96
97void
98buffer_put_short(Buffer *buffer, u_short value)
99{
100	int ret;
101
102	if ((ret = sshbuf_put_u16(buffer, value)) != 0)
103		fatal("%s: %s", __func__, ssh_err(ret));
104}
105
106void
107buffer_put_int(Buffer *buffer, u_int value)
108{
109	int ret;
110
111	if ((ret = sshbuf_put_u32(buffer, value)) != 0)
112		fatal("%s: %s", __func__, ssh_err(ret));
113}
114
115void
116buffer_put_int64(Buffer *buffer, u_int64_t value)
117{
118	int ret;
119
120	if ((ret = sshbuf_put_u64(buffer, value)) != 0)
121		fatal("%s: %s", __func__, ssh_err(ret));
122}
123
124void *
125buffer_get_string_ret(Buffer *buffer, u_int *length_ptr)
126{
127	size_t len;
128	int ret;
129	u_char *value;
130
131	if ((ret = sshbuf_get_string(buffer, &value, &len)) != 0) {
132		error("%s: %s", __func__, ssh_err(ret));
133		return NULL;
134	}
135	if (length_ptr != NULL)
136		*length_ptr = len;  /* Safe: sshbuf never stores len > 2^31 */
137	return value;
138}
139
140void *
141buffer_get_string(Buffer *buffer, u_int *length_ptr)
142{
143	void *ret;
144
145	if ((ret = buffer_get_string_ret(buffer, length_ptr)) == NULL)
146		fatal("%s: buffer error", __func__);
147	return (ret);
148}
149
150char *
151buffer_get_cstring_ret(Buffer *buffer, u_int *length_ptr)
152{
153	size_t len;
154	int ret;
155	char *value;
156
157	if ((ret = sshbuf_get_cstring(buffer, &value, &len)) != 0) {
158		error("%s: %s", __func__, ssh_err(ret));
159		return NULL;
160	}
161	if (length_ptr != NULL)
162		*length_ptr = len;  /* Safe: sshbuf never stores len > 2^31 */
163	return value;
164}
165
166char *
167buffer_get_cstring(Buffer *buffer, u_int *length_ptr)
168{
169	char *ret;
170
171	if ((ret = buffer_get_cstring_ret(buffer, length_ptr)) == NULL)
172		fatal("%s: buffer error", __func__);
173	return ret;
174}
175
176const void *
177buffer_get_string_ptr_ret(Buffer *buffer, u_int *length_ptr)
178{
179	size_t len;
180	int ret;
181	const u_char *value;
182
183	if ((ret = sshbuf_get_string_direct(buffer, &value, &len)) != 0) {
184		error("%s: %s", __func__, ssh_err(ret));
185		return NULL;
186	}
187	if (length_ptr != NULL)
188		*length_ptr = len;  /* Safe: sshbuf never stores len > 2^31 */
189	return value;
190}
191
192const void *
193buffer_get_string_ptr(Buffer *buffer, u_int *length_ptr)
194{
195	const void *ret;
196
197	if ((ret = buffer_get_string_ptr_ret(buffer, length_ptr)) == NULL)
198		fatal("%s: buffer error", __func__);
199	return (ret);
200}
201
202void
203buffer_put_string(Buffer *buffer, const void *buf, u_int len)
204{
205	int ret;
206
207	if ((ret = sshbuf_put_string(buffer, buf, len)) != 0)
208		fatal("%s: %s", __func__, ssh_err(ret));
209}
210
211void
212buffer_put_cstring(Buffer *buffer, const char *s)
213{
214	int ret;
215
216	if ((ret = sshbuf_put_cstring(buffer, s)) != 0)
217		fatal("%s: %s", __func__, ssh_err(ret));
218}
219
220int
221buffer_get_char_ret(char *v, Buffer *buffer)
222{
223	int ret;
224
225	if ((ret = sshbuf_get_u8(buffer, (u_char *)v)) != 0) {
226		error("%s: %s", __func__, ssh_err(ret));
227		return -1;
228	}
229	return 0;
230}
231
232int
233buffer_get_char(Buffer *buffer)
234{
235	char ch;
236
237	if (buffer_get_char_ret(&ch, buffer) == -1)
238		fatal("%s: buffer error", __func__);
239	return (u_char) ch;
240}
241
242void
243buffer_put_char(Buffer *buffer, int value)
244{
245	int ret;
246
247	if ((ret = sshbuf_put_u8(buffer, value)) != 0)
248		fatal("%s: %s", __func__, ssh_err(ret));
249}
250
251void
252buffer_put_bignum2_from_string(Buffer *buffer, const u_char *s, u_int l)
253{
254	int ret;
255
256	if ((ret = sshbuf_put_bignum2_bytes(buffer, s, l)) != 0)
257		fatal("%s: %s", __func__, ssh_err(ret));
258}
259
260