1294328Sdes/* $OpenBSD: bufaux.c,v 1.60 2014/04/30 05:29:56 djm Exp $ */
257429Smarkm/*
3294328Sdes * Copyright (c) 2012 Damien Miller <djm@mindrot.org>
457429Smarkm *
5294328Sdes * Permission to use, copy, modify, and distribute this software for any
6294328Sdes * purpose with or without fee is hereby granted, provided that the above
7294328Sdes * copyright notice and this permission notice appear in all copies.
865674Skris *
9294328Sdes * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
10294328Sdes * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
11294328Sdes * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
12294328Sdes * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
13294328Sdes * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
14294328Sdes * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
15294328Sdes * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
1657429Smarkm */
1757429Smarkm
18294328Sdes/* Emulation wrappers for legacy OpenSSH buffer API atop sshbuf */
19294328Sdes
2057429Smarkm#include "includes.h"
2157429Smarkm
22162856Sdes#include <sys/types.h>
23162856Sdes
24162856Sdes#include "buffer.h"
2576262Sgreen#include "log.h"
26294328Sdes#include "ssherr.h"
2757429Smarkm
28147005Sdesint
29294328Sdesbuffer_get_short_ret(u_short *v, Buffer *buffer)
30147005Sdes{
31294328Sdes	int ret;
32147005Sdes
33294328Sdes	if ((ret = sshbuf_get_u16(buffer, v)) != 0) {
34294328Sdes		error("%s: %s", __func__, ssh_err(ret));
35294328Sdes		return -1;
36294328Sdes	}
37294328Sdes	return 0;
38147005Sdes}
39147005Sdes
4098684Sdesu_short
4198684Sdesbuffer_get_short(Buffer *buffer)
4298684Sdes{
43147005Sdes	u_short ret;
4499063Sdes
45147005Sdes	if (buffer_get_short_ret(&ret, buffer) == -1)
46294328Sdes		fatal("%s: buffer error", __func__);
47147005Sdes
48147005Sdes	return (ret);
4998684Sdes}
5098684Sdes
51147005Sdesint
52294328Sdesbuffer_get_int_ret(u_int *v, Buffer *buffer)
53147005Sdes{
54294328Sdes	int ret;
55147005Sdes
56294328Sdes	if ((ret = sshbuf_get_u32(buffer, v)) != 0) {
57294328Sdes		error("%s: %s", __func__, ssh_err(ret));
58294328Sdes		return -1;
59294328Sdes	}
60294328Sdes	return 0;
61147005Sdes}
62147005Sdes
6376262Sgreenu_int
6457429Smarkmbuffer_get_int(Buffer *buffer)
6557429Smarkm{
66147005Sdes	u_int ret;
6799063Sdes
68147005Sdes	if (buffer_get_int_ret(&ret, buffer) == -1)
69294328Sdes		fatal("%s: buffer error", __func__);
70147005Sdes
71147005Sdes	return (ret);
7257429Smarkm}
7357429Smarkm
74147005Sdesint
75294328Sdesbuffer_get_int64_ret(u_int64_t *v, Buffer *buffer)
76147005Sdes{
77294328Sdes	int ret;
78147005Sdes
79294328Sdes	if ((ret = sshbuf_get_u64(buffer, v)) != 0) {
80294328Sdes		error("%s: %s", __func__, ssh_err(ret));
81294328Sdes		return -1;
82294328Sdes	}
83294328Sdes	return 0;
84147005Sdes}
85147005Sdes
8676262Sgreenu_int64_t
8776262Sgreenbuffer_get_int64(Buffer *buffer)
8876262Sgreen{
89147005Sdes	u_int64_t ret;
9099063Sdes
91147005Sdes	if (buffer_get_int64_ret(&ret, buffer) == -1)
92294328Sdes		fatal("%s: buffer error", __func__);
93147005Sdes
94147005Sdes	return (ret);
9576262Sgreen}
9676262Sgreen
9760576Skrisvoid
9898684Sdesbuffer_put_short(Buffer *buffer, u_short value)
9998684Sdes{
100294328Sdes	int ret;
10199063Sdes
102294328Sdes	if ((ret = sshbuf_put_u16(buffer, value)) != 0)
103294328Sdes		fatal("%s: %s", __func__, ssh_err(ret));
10498684Sdes}
10598684Sdes
10698684Sdesvoid
10776262Sgreenbuffer_put_int(Buffer *buffer, u_int value)
10857429Smarkm{
109294328Sdes	int ret;
11099063Sdes
111294328Sdes	if ((ret = sshbuf_put_u32(buffer, value)) != 0)
112294328Sdes		fatal("%s: %s", __func__, ssh_err(ret));
11357429Smarkm}
11457429Smarkm
11576262Sgreenvoid
11676262Sgreenbuffer_put_int64(Buffer *buffer, u_int64_t value)
11776262Sgreen{
118294328Sdes	int ret;
11999063Sdes
120294328Sdes	if ((ret = sshbuf_put_u64(buffer, value)) != 0)
121294328Sdes		fatal("%s: %s", __func__, ssh_err(ret));
12276262Sgreen}
12376262Sgreen
12492559Sdesvoid *
125147005Sdesbuffer_get_string_ret(Buffer *buffer, u_int *length_ptr)
12657429Smarkm{
127294328Sdes	size_t len;
128294328Sdes	int ret;
12999063Sdes	u_char *value;
13099063Sdes
131294328Sdes	if ((ret = sshbuf_get_string(buffer, &value, &len)) != 0) {
132294328Sdes		error("%s: %s", __func__, ssh_err(ret));
133294328Sdes		return NULL;
134204917Sdes	}
135294328Sdes	if (length_ptr != NULL)
136294328Sdes		*length_ptr = len;  /* Safe: sshbuf never stores len > 2^31 */
137294328Sdes	return value;
13857429Smarkm}
13957429Smarkm
140147005Sdesvoid *
141147005Sdesbuffer_get_string(Buffer *buffer, u_int *length_ptr)
142147005Sdes{
143147005Sdes	void *ret;
144147005Sdes
145147005Sdes	if ((ret = buffer_get_string_ret(buffer, length_ptr)) == NULL)
146294328Sdes		fatal("%s: buffer error", __func__);
147147005Sdes	return (ret);
148147005Sdes}
149147005Sdes
150221420Sdeschar *
151221420Sdesbuffer_get_cstring_ret(Buffer *buffer, u_int *length_ptr)
152221420Sdes{
153294328Sdes	size_t len;
154294328Sdes	int ret;
155294328Sdes	char *value;
156221420Sdes
157294328Sdes	if ((ret = sshbuf_get_cstring(buffer, &value, &len)) != 0) {
158294328Sdes		error("%s: %s", __func__, ssh_err(ret));
159221420Sdes		return NULL;
160221420Sdes	}
161221420Sdes	if (length_ptr != NULL)
162294328Sdes		*length_ptr = len;  /* Safe: sshbuf never stores len > 2^31 */
163294328Sdes	return value;
164221420Sdes}
165221420Sdes
166221420Sdeschar *
167221420Sdesbuffer_get_cstring(Buffer *buffer, u_int *length_ptr)
168221420Sdes{
169221420Sdes	char *ret;
170221420Sdes
171221420Sdes	if ((ret = buffer_get_cstring_ret(buffer, length_ptr)) == NULL)
172294328Sdes		fatal("%s: buffer error", __func__);
173221420Sdes	return ret;
174221420Sdes}
175221420Sdes
176294328Sdesconst void *
177204917Sdesbuffer_get_string_ptr_ret(Buffer *buffer, u_int *length_ptr)
178181111Sdes{
179294328Sdes	size_t len;
180294328Sdes	int ret;
181294328Sdes	const u_char *value;
182181111Sdes
183294328Sdes	if ((ret = sshbuf_get_string_direct(buffer, &value, &len)) != 0) {
184294328Sdes		error("%s: %s", __func__, ssh_err(ret));
185204917Sdes		return NULL;
186204917Sdes	}
187294328Sdes	if (length_ptr != NULL)
188294328Sdes		*length_ptr = len;  /* Safe: sshbuf never stores len > 2^31 */
189294328Sdes	return value;
190181111Sdes}
191181111Sdes
192294328Sdesconst void *
193204917Sdesbuffer_get_string_ptr(Buffer *buffer, u_int *length_ptr)
194204917Sdes{
195294328Sdes	const void *ret;
196204917Sdes
197204917Sdes	if ((ret = buffer_get_string_ptr_ret(buffer, length_ptr)) == NULL)
198294328Sdes		fatal("%s: buffer error", __func__);
199204917Sdes	return (ret);
200204917Sdes}
201204917Sdes
20260576Skrisvoid
20376262Sgreenbuffer_put_string(Buffer *buffer, const void *buf, u_int len)
20457429Smarkm{
205294328Sdes	int ret;
206294328Sdes
207294328Sdes	if ((ret = sshbuf_put_string(buffer, buf, len)) != 0)
208294328Sdes		fatal("%s: %s", __func__, ssh_err(ret));
20957429Smarkm}
210294328Sdes
21160576Skrisvoid
21260576Skrisbuffer_put_cstring(Buffer *buffer, const char *s)
21360576Skris{
214294328Sdes	int ret;
215294328Sdes
216294328Sdes	if ((ret = sshbuf_put_cstring(buffer, s)) != 0)
217294328Sdes		fatal("%s: %s", __func__, ssh_err(ret));
21860576Skris}
21957429Smarkm
22060576Skrisint
221294328Sdesbuffer_get_char_ret(char *v, Buffer *buffer)
222147005Sdes{
223294328Sdes	int ret;
224294328Sdes
225294328Sdes	if ((ret = sshbuf_get_u8(buffer, (u_char *)v)) != 0) {
226294328Sdes		error("%s: %s", __func__, ssh_err(ret));
227294328Sdes		return -1;
228147005Sdes	}
229294328Sdes	return 0;
230147005Sdes}
231147005Sdes
232147005Sdesint
23357429Smarkmbuffer_get_char(Buffer *buffer)
23457429Smarkm{
235294328Sdes	char ch;
23699063Sdes
237147005Sdes	if (buffer_get_char_ret(&ch, buffer) == -1)
238294328Sdes		fatal("%s: buffer error", __func__);
239294328Sdes	return (u_char) ch;
24057429Smarkm}
24157429Smarkm
24260576Skrisvoid
24357429Smarkmbuffer_put_char(Buffer *buffer, int value)
24457429Smarkm{
245294328Sdes	int ret;
24699063Sdes
247294328Sdes	if ((ret = sshbuf_put_u8(buffer, value)) != 0)
248294328Sdes		fatal("%s: %s", __func__, ssh_err(ret));
24957429Smarkm}
250261320Sdes
251261320Sdesvoid
252261320Sdesbuffer_put_bignum2_from_string(Buffer *buffer, const u_char *s, u_int l)
253261320Sdes{
254294328Sdes	int ret;
255261320Sdes
256294328Sdes	if ((ret = sshbuf_put_bignum2_bytes(buffer, s, l)) != 0)
257294328Sdes		fatal("%s: %s", __func__, ssh_err(ret));
258261320Sdes}
259261320Sdes
260