blob: 3976896a99e1cd0cbc73d5bb22749ade971e0069 [file] [log] [blame]
Adam Langleyd0592972015-03-30 14:49:51 -07001/* $OpenBSD: bufaux.c,v 1.60 2014/04/30 05:29:56 djm Exp $ */
Greg Hartmanbd77cf72015-02-25 13:21:06 -08002/*
Adam Langleyd0592972015-03-30 14:49:51 -07003 * Copyright (c) 2012 Damien Miller <djm@mindrot.org>
Greg Hartmanbd77cf72015-02-25 13:21:06 -08004 *
Adam Langleyd0592972015-03-30 14:49:51 -07005 * 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.
Greg Hartmanbd77cf72015-02-25 13:21:06 -08008 *
Adam Langleyd0592972015-03-30 14:49:51 -07009 * 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.
Greg Hartmanbd77cf72015-02-25 13:21:06 -080016 */
17
Adam Langleyd0592972015-03-30 14:49:51 -070018/* Emulation wrappers for legacy OpenSSH buffer API atop sshbuf */
19
Greg Hartmanbd77cf72015-02-25 13:21:06 -080020#include "includes.h"
21
22#include <sys/types.h>
23
Greg Hartmanbd77cf72015-02-25 13:21:06 -080024#include "buffer.h"
25#include "log.h"
Adam Langleyd0592972015-03-30 14:49:51 -070026#include "ssherr.h"
Greg Hartmanbd77cf72015-02-25 13:21:06 -080027
28int
Adam Langleyd0592972015-03-30 14:49:51 -070029buffer_get_short_ret(u_short *v, Buffer *buffer)
Greg Hartmanbd77cf72015-02-25 13:21:06 -080030{
Adam Langleyd0592972015-03-30 14:49:51 -070031 int ret;
Greg Hartmanbd77cf72015-02-25 13:21:06 -080032
Adam Langleyd0592972015-03-30 14:49:51 -070033 if ((ret = sshbuf_get_u16(buffer, v)) != 0) {
34 error("%s: %s", __func__, ssh_err(ret));
35 return -1;
36 }
37 return 0;
Greg Hartmanbd77cf72015-02-25 13:21:06 -080038}
39
40u_short
41buffer_get_short(Buffer *buffer)
42{
43 u_short ret;
44
45 if (buffer_get_short_ret(&ret, buffer) == -1)
Adam Langleyd0592972015-03-30 14:49:51 -070046 fatal("%s: buffer error", __func__);
Greg Hartmanbd77cf72015-02-25 13:21:06 -080047
48 return (ret);
49}
50
51int
Adam Langleyd0592972015-03-30 14:49:51 -070052buffer_get_int_ret(u_int *v, Buffer *buffer)
Greg Hartmanbd77cf72015-02-25 13:21:06 -080053{
Adam Langleyd0592972015-03-30 14:49:51 -070054 int ret;
Greg Hartmanbd77cf72015-02-25 13:21:06 -080055
Adam Langleyd0592972015-03-30 14:49:51 -070056 if ((ret = sshbuf_get_u32(buffer, v)) != 0) {
57 error("%s: %s", __func__, ssh_err(ret));
58 return -1;
59 }
60 return 0;
Greg Hartmanbd77cf72015-02-25 13:21:06 -080061}
62
63u_int
64buffer_get_int(Buffer *buffer)
65{
66 u_int ret;
67
68 if (buffer_get_int_ret(&ret, buffer) == -1)
Adam Langleyd0592972015-03-30 14:49:51 -070069 fatal("%s: buffer error", __func__);
Greg Hartmanbd77cf72015-02-25 13:21:06 -080070
71 return (ret);
72}
73
74int
Adam Langleyd0592972015-03-30 14:49:51 -070075buffer_get_int64_ret(u_int64_t *v, Buffer *buffer)
Greg Hartmanbd77cf72015-02-25 13:21:06 -080076{
Adam Langleyd0592972015-03-30 14:49:51 -070077 int ret;
Greg Hartmanbd77cf72015-02-25 13:21:06 -080078
Adam Langleyd0592972015-03-30 14:49:51 -070079 if ((ret = sshbuf_get_u64(buffer, v)) != 0) {
80 error("%s: %s", __func__, ssh_err(ret));
81 return -1;
82 }
83 return 0;
Greg Hartmanbd77cf72015-02-25 13:21:06 -080084}
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)
Adam Langleyd0592972015-03-30 14:49:51 -070092 fatal("%s: buffer error", __func__);
Greg Hartmanbd77cf72015-02-25 13:21:06 -080093
94 return (ret);
95}
96
Greg Hartmanbd77cf72015-02-25 13:21:06 -080097void
98buffer_put_short(Buffer *buffer, u_short value)
99{
Adam Langleyd0592972015-03-30 14:49:51 -0700100 int ret;
Greg Hartmanbd77cf72015-02-25 13:21:06 -0800101
Adam Langleyd0592972015-03-30 14:49:51 -0700102 if ((ret = sshbuf_put_u16(buffer, value)) != 0)
103 fatal("%s: %s", __func__, ssh_err(ret));
Greg Hartmanbd77cf72015-02-25 13:21:06 -0800104}
105
106void
107buffer_put_int(Buffer *buffer, u_int value)
108{
Adam Langleyd0592972015-03-30 14:49:51 -0700109 int ret;
Greg Hartmanbd77cf72015-02-25 13:21:06 -0800110
Adam Langleyd0592972015-03-30 14:49:51 -0700111 if ((ret = sshbuf_put_u32(buffer, value)) != 0)
112 fatal("%s: %s", __func__, ssh_err(ret));
Greg Hartmanbd77cf72015-02-25 13:21:06 -0800113}
114
115void
116buffer_put_int64(Buffer *buffer, u_int64_t value)
117{
Adam Langleyd0592972015-03-30 14:49:51 -0700118 int ret;
Greg Hartmanbd77cf72015-02-25 13:21:06 -0800119
Adam Langleyd0592972015-03-30 14:49:51 -0700120 if ((ret = sshbuf_put_u64(buffer, value)) != 0)
121 fatal("%s: %s", __func__, ssh_err(ret));
Greg Hartmanbd77cf72015-02-25 13:21:06 -0800122}
123
Greg Hartmanbd77cf72015-02-25 13:21:06 -0800124void *
125buffer_get_string_ret(Buffer *buffer, u_int *length_ptr)
126{
Adam Langleyd0592972015-03-30 14:49:51 -0700127 size_t len;
128 int ret;
Greg Hartmanbd77cf72015-02-25 13:21:06 -0800129 u_char *value;
Greg Hartmanbd77cf72015-02-25 13:21:06 -0800130
Adam Langleyd0592972015-03-30 14:49:51 -0700131 if ((ret = sshbuf_get_string(buffer, &value, &len)) != 0) {
132 error("%s: %s", __func__, ssh_err(ret));
133 return NULL;
Greg Hartmanbd77cf72015-02-25 13:21:06 -0800134 }
Adam Langleyd0592972015-03-30 14:49:51 -0700135 if (length_ptr != NULL)
136 *length_ptr = len; /* Safe: sshbuf never stores len > 2^31 */
137 return value;
Greg Hartmanbd77cf72015-02-25 13:21:06 -0800138}
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)
Adam Langleyd0592972015-03-30 14:49:51 -0700146 fatal("%s: buffer error", __func__);
Greg Hartmanbd77cf72015-02-25 13:21:06 -0800147 return (ret);
148}
149
150char *
151buffer_get_cstring_ret(Buffer *buffer, u_int *length_ptr)
152{
Adam Langleyd0592972015-03-30 14:49:51 -0700153 size_t len;
154 int ret;
155 char *value;
Greg Hartmanbd77cf72015-02-25 13:21:06 -0800156
Adam Langleyd0592972015-03-30 14:49:51 -0700157 if ((ret = sshbuf_get_cstring(buffer, &value, &len)) != 0) {
158 error("%s: %s", __func__, ssh_err(ret));
Greg Hartmanbd77cf72015-02-25 13:21:06 -0800159 return NULL;
Greg Hartmanbd77cf72015-02-25 13:21:06 -0800160 }
161 if (length_ptr != NULL)
Adam Langleyd0592972015-03-30 14:49:51 -0700162 *length_ptr = len; /* Safe: sshbuf never stores len > 2^31 */
163 return value;
Greg Hartmanbd77cf72015-02-25 13:21:06 -0800164}
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)
Adam Langleyd0592972015-03-30 14:49:51 -0700172 fatal("%s: buffer error", __func__);
Greg Hartmanbd77cf72015-02-25 13:21:06 -0800173 return ret;
174}
175
Adam Langleyd0592972015-03-30 14:49:51 -0700176const void *
Greg Hartmanbd77cf72015-02-25 13:21:06 -0800177buffer_get_string_ptr_ret(Buffer *buffer, u_int *length_ptr)
178{
Adam Langleyd0592972015-03-30 14:49:51 -0700179 size_t len;
180 int ret;
181 const u_char *value;
Greg Hartmanbd77cf72015-02-25 13:21:06 -0800182
Adam Langleyd0592972015-03-30 14:49:51 -0700183 if ((ret = sshbuf_get_string_direct(buffer, &value, &len)) != 0) {
184 error("%s: %s", __func__, ssh_err(ret));
Greg Hartmanbd77cf72015-02-25 13:21:06 -0800185 return NULL;
186 }
Adam Langleyd0592972015-03-30 14:49:51 -0700187 if (length_ptr != NULL)
188 *length_ptr = len; /* Safe: sshbuf never stores len > 2^31 */
189 return value;
Greg Hartmanbd77cf72015-02-25 13:21:06 -0800190}
191
Adam Langleyd0592972015-03-30 14:49:51 -0700192const void *
Greg Hartmanbd77cf72015-02-25 13:21:06 -0800193buffer_get_string_ptr(Buffer *buffer, u_int *length_ptr)
194{
Adam Langleyd0592972015-03-30 14:49:51 -0700195 const void *ret;
Greg Hartmanbd77cf72015-02-25 13:21:06 -0800196
197 if ((ret = buffer_get_string_ptr_ret(buffer, length_ptr)) == NULL)
Adam Langleyd0592972015-03-30 14:49:51 -0700198 fatal("%s: buffer error", __func__);
Greg Hartmanbd77cf72015-02-25 13:21:06 -0800199 return (ret);
200}
201
Greg Hartmanbd77cf72015-02-25 13:21:06 -0800202void
203buffer_put_string(Buffer *buffer, const void *buf, u_int len)
204{
Adam Langleyd0592972015-03-30 14:49:51 -0700205 int ret;
206
207 if ((ret = sshbuf_put_string(buffer, buf, len)) != 0)
208 fatal("%s: %s", __func__, ssh_err(ret));
Greg Hartmanbd77cf72015-02-25 13:21:06 -0800209}
Adam Langleyd0592972015-03-30 14:49:51 -0700210
Greg Hartmanbd77cf72015-02-25 13:21:06 -0800211void
212buffer_put_cstring(Buffer *buffer, const char *s)
213{
Adam Langleyd0592972015-03-30 14:49:51 -0700214 int ret;
215
216 if ((ret = sshbuf_put_cstring(buffer, s)) != 0)
217 fatal("%s: %s", __func__, ssh_err(ret));
Greg Hartmanbd77cf72015-02-25 13:21:06 -0800218}
219
Greg Hartmanbd77cf72015-02-25 13:21:06 -0800220int
Adam Langleyd0592972015-03-30 14:49:51 -0700221buffer_get_char_ret(char *v, Buffer *buffer)
Greg Hartmanbd77cf72015-02-25 13:21:06 -0800222{
Adam Langleyd0592972015-03-30 14:49:51 -0700223 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;
Greg Hartmanbd77cf72015-02-25 13:21:06 -0800228 }
Adam Langleyd0592972015-03-30 14:49:51 -0700229 return 0;
Greg Hartmanbd77cf72015-02-25 13:21:06 -0800230}
231
232int
233buffer_get_char(Buffer *buffer)
234{
235 char ch;
236
237 if (buffer_get_char_ret(&ch, buffer) == -1)
Adam Langleyd0592972015-03-30 14:49:51 -0700238 fatal("%s: buffer error", __func__);
Greg Hartmanbd77cf72015-02-25 13:21:06 -0800239 return (u_char) ch;
240}
241
Greg Hartmanbd77cf72015-02-25 13:21:06 -0800242void
243buffer_put_char(Buffer *buffer, int value)
244{
Adam Langleyd0592972015-03-30 14:49:51 -0700245 int ret;
Greg Hartmanbd77cf72015-02-25 13:21:06 -0800246
Adam Langleyd0592972015-03-30 14:49:51 -0700247 if ((ret = sshbuf_put_u8(buffer, value)) != 0)
248 fatal("%s: %s", __func__, ssh_err(ret));
Greg Hartmanbd77cf72015-02-25 13:21:06 -0800249}
Adam Langleyd0592972015-03-30 14:49:51 -0700250
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