1295367Sdes/* $OpenBSD: bufaux.c,v 1.60 2014/04/30 05:29:56 djm Exp $ */
257429Smarkm/*
3295367Sdes * Copyright (c) 2012 Damien Miller <djm@mindrot.org>
457429Smarkm *
5295367Sdes * Permission to use, copy, modify, and distribute this software for any
6295367Sdes * purpose with or without fee is hereby granted, provided that the above
7295367Sdes * copyright notice and this permission notice appear in all copies.
865674Skris *
9295367Sdes * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
10295367Sdes * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
11295367Sdes * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
12295367Sdes * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
13295367Sdes * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
14295367Sdes * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
15295367Sdes * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
1657429Smarkm */
1757429Smarkm
18295367Sdes/* Emulation wrappers for legacy OpenSSH buffer API atop sshbuf */
19295367Sdes
2057429Smarkm#include "includes.h"
2157429Smarkm
22162856Sdes#include <sys/types.h>
23162856Sdes
24162856Sdes#include "buffer.h"
2576262Sgreen#include "log.h"
26295367Sdes#include "ssherr.h"
2757429Smarkm
28147005Sdesint
29295367Sdesbuffer_get_short_ret(u_short *v, Buffer *buffer)
30147005Sdes{
31295367Sdes	int ret;
32147005Sdes
33295367Sdes	if ((ret = sshbuf_get_u16(buffer, v)) != 0) {
34295367Sdes		error("%s: %s", __func__, ssh_err(ret));
35295367Sdes		return -1;
36295367Sdes	}
37295367Sdes	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)
46295367Sdes		fatal("%s: buffer error", __func__);
47147005Sdes
48147005Sdes	return (ret);
4998684Sdes}
5098684Sdes
51147005Sdesint
52295367Sdesbuffer_get_int_ret(u_int *v, Buffer *buffer)
53147005Sdes{
54295367Sdes	int ret;
55147005Sdes
56295367Sdes	if ((ret = sshbuf_get_u32(buffer, v)) != 0) {
57295367Sdes		error("%s: %s", __func__, ssh_err(ret));
58295367Sdes		return -1;
59295367Sdes	}
60295367Sdes	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)
69295367Sdes		fatal("%s: buffer error", __func__);
70147005Sdes
71147005Sdes	return (ret);
7257429Smarkm}
7357429Smarkm
74147005Sdesint
75295367Sdesbuffer_get_int64_ret(u_int64_t *v, Buffer *buffer)
76147005Sdes{
77295367Sdes	int ret;
78147005Sdes
79295367Sdes	if ((ret = sshbuf_get_u64(buffer, v)) != 0) {
80295367Sdes		error("%s: %s", __func__, ssh_err(ret));
81295367Sdes		return -1;
82295367Sdes	}
83295367Sdes	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)
92295367Sdes		fatal("%s: buffer error", __func__);
93147005Sdes
94147005Sdes	return (ret);
9576262Sgreen}
9676262Sgreen
9760576Skrisvoid
9898684Sdesbuffer_put_short(Buffer *buffer, u_short value)
9998684Sdes{
100295367Sdes	int ret;
10199063Sdes
102295367Sdes	if ((ret = sshbuf_put_u16(buffer, value)) != 0)
103295367Sdes		fatal("%s: %s", __func__, ssh_err(ret));
10498684Sdes}
10598684Sdes
10698684Sdesvoid
10776262Sgreenbuffer_put_int(Buffer *buffer, u_int value)
10857429Smarkm{
109295367Sdes	int ret;
11099063Sdes
111295367Sdes	if ((ret = sshbuf_put_u32(buffer, value)) != 0)
112295367Sdes		fatal("%s: %s", __func__, ssh_err(ret));
11357429Smarkm}
11457429Smarkm
11576262Sgreenvoid
11676262Sgreenbuffer_put_int64(Buffer *buffer, u_int64_t value)
11776262Sgreen{
118295367Sdes	int ret;
11999063Sdes
120295367Sdes	if ((ret = sshbuf_put_u64(buffer, value)) != 0)
121295367Sdes		fatal("%s: %s", __func__, ssh_err(ret));
12276262Sgreen}
12376262Sgreen
12492559Sdesvoid *
125147005Sdesbuffer_get_string_ret(Buffer *buffer, u_int *length_ptr)
12657429Smarkm{
127295367Sdes	size_t len;
128295367Sdes	int ret;
12999063Sdes	u_char *value;
13099063Sdes
131295367Sdes	if ((ret = sshbuf_get_string(buffer, &value, &len)) != 0) {
132295367Sdes		error("%s: %s", __func__, ssh_err(ret));
133295367Sdes		return NULL;
134204917Sdes	}
135295367Sdes	if (length_ptr != NULL)
136295367Sdes		*length_ptr = len;  /* Safe: sshbuf never stores len > 2^31 */
137295367Sdes	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)
146295367Sdes		fatal("%s: buffer error", __func__);
147147005Sdes	return (ret);
148147005Sdes}
149147005Sdes
150221420Sdeschar *
151221420Sdesbuffer_get_cstring_ret(Buffer *buffer, u_int *length_ptr)
152221420Sdes{
153295367Sdes	size_t len;
154295367Sdes	int ret;
155295367Sdes	char *value;
156221420Sdes
157295367Sdes	if ((ret = sshbuf_get_cstring(buffer, &value, &len)) != 0) {
158295367Sdes		error("%s: %s", __func__, ssh_err(ret));
159221420Sdes		return NULL;
160221420Sdes	}
161221420Sdes	if (length_ptr != NULL)
162295367Sdes		*length_ptr = len;  /* Safe: sshbuf never stores len > 2^31 */
163295367Sdes	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)
172295367Sdes		fatal("%s: buffer error", __func__);
173221420Sdes	return ret;
174221420Sdes}
175221420Sdes
176295367Sdesconst void *
177204917Sdesbuffer_get_string_ptr_ret(Buffer *buffer, u_int *length_ptr)
178181111Sdes{
179295367Sdes	size_t len;
180295367Sdes	int ret;
181295367Sdes	const u_char *value;
182181111Sdes
183295367Sdes	if ((ret = sshbuf_get_string_direct(buffer, &value, &len)) != 0) {
184295367Sdes		error("%s: %s", __func__, ssh_err(ret));
185204917Sdes		return NULL;
186204917Sdes	}
187295367Sdes	if (length_ptr != NULL)
188295367Sdes		*length_ptr = len;  /* Safe: sshbuf never stores len > 2^31 */
189295367Sdes	return value;
190181111Sdes}
191181111Sdes
192295367Sdesconst void *
193204917Sdesbuffer_get_string_ptr(Buffer *buffer, u_int *length_ptr)
194204917Sdes{
195295367Sdes	const void *ret;
196204917Sdes
197204917Sdes	if ((ret = buffer_get_string_ptr_ret(buffer, length_ptr)) == NULL)
198295367Sdes		fatal("%s: buffer error", __func__);
199204917Sdes	return (ret);
200204917Sdes}
201204917Sdes
20260576Skrisvoid
20376262Sgreenbuffer_put_string(Buffer *buffer, const void *buf, u_int len)
20457429Smarkm{
205295367Sdes	int ret;
206295367Sdes
207295367Sdes	if ((ret = sshbuf_put_string(buffer, buf, len)) != 0)
208295367Sdes		fatal("%s: %s", __func__, ssh_err(ret));
20957429Smarkm}
210295367Sdes
21160576Skrisvoid
21260576Skrisbuffer_put_cstring(Buffer *buffer, const char *s)
21360576Skris{
214295367Sdes	int ret;
215295367Sdes
216295367Sdes	if ((ret = sshbuf_put_cstring(buffer, s)) != 0)
217295367Sdes		fatal("%s: %s", __func__, ssh_err(ret));
21860576Skris}
21957429Smarkm
22060576Skrisint
221295367Sdesbuffer_get_char_ret(char *v, Buffer *buffer)
222147005Sdes{
223295367Sdes	int ret;
224295367Sdes
225295367Sdes	if ((ret = sshbuf_get_u8(buffer, (u_char *)v)) != 0) {
226295367Sdes		error("%s: %s", __func__, ssh_err(ret));
227295367Sdes		return -1;
228147005Sdes	}
229295367Sdes	return 0;
230147005Sdes}
231147005Sdes
232147005Sdesint
23357429Smarkmbuffer_get_char(Buffer *buffer)
23457429Smarkm{
235295367Sdes	char ch;
23699063Sdes
237147005Sdes	if (buffer_get_char_ret(&ch, buffer) == -1)
238295367Sdes		fatal("%s: buffer error", __func__);
239295367Sdes	return (u_char) ch;
24057429Smarkm}
24157429Smarkm
24260576Skrisvoid
24357429Smarkmbuffer_put_char(Buffer *buffer, int value)
24457429Smarkm{
245295367Sdes	int ret;
24699063Sdes
247295367Sdes	if ((ret = sshbuf_put_u8(buffer, value)) != 0)
248295367Sdes		fatal("%s: %s", __func__, ssh_err(ret));
24957429Smarkm}
250262566Sdes
251262566Sdesvoid
252262566Sdesbuffer_put_bignum2_from_string(Buffer *buffer, const u_char *s, u_int l)
253262566Sdes{
254295367Sdes	int ret;
255262566Sdes
256295367Sdes	if ((ret = sshbuf_put_bignum2_bytes(buffer, s, l)) != 0)
257295367Sdes		fatal("%s: %s", __func__, ssh_err(ret));
258262566Sdes}
259262566Sdes
260