blob: aa9b892d9509ce10b570ec90a9aa1adcc8a926b0 [file] [log] [blame]
Damien Miller05e82c32014-05-15 14:33:43 +10001/* $OpenBSD: bufaux.c,v 1.60 2014/04/30 05:29:56 djm Exp $ */
Damien Millerd4a8b7e1999-10-27 13:42:43 +10002/*
Damien Miller05e82c32014-05-15 14:33:43 +10003 * Copyright (c) 2012 Damien Miller <djm@mindrot.org>
Damien Miller95def091999-11-25 00:26:21 +11004 *
Damien Miller05e82c32014-05-15 14:33:43 +10005 * 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.
Damien Millerb38eff82000-04-01 11:09:21 +10008 *
Damien Miller05e82c32014-05-15 14:33:43 +10009 * 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.
Damien Miller95def091999-11-25 00:26:21 +110016 */
Damien Millerd4a8b7e1999-10-27 13:42:43 +100017
Damien Miller05e82c32014-05-15 14:33:43 +100018/* Emulation wrappers for legacy OpenSSH buffer API atop sshbuf */
Damien Millerd4a8b7e1999-10-27 13:42:43 +100019
Damien Millerd7834352006-08-05 12:39:39 +100020#include <sys/types.h>
21
Damien Millerd7834352006-08-05 12:39:39 +100022#include "buffer.h"
Ben Lindstrom226cfa02001-01-22 05:34:40 +000023#include "log.h"
Damien Miller05e82c32014-05-15 14:33:43 +100024#include "ssherr.h"
Damien Miller3b235662002-04-23 20:42:36 +100025
Darren Tucker50dbe832004-11-05 20:41:24 +110026int
Damien Miller05e82c32014-05-15 14:33:43 +100027buffer_get_short_ret(u_short *v, Buffer *buffer)
Damien Miller3b235662002-04-23 20:42:36 +100028{
Damien Miller05e82c32014-05-15 14:33:43 +100029 int ret;
Ben Lindstrome1353632002-06-23 21:29:23 +000030
Damien Miller05e82c32014-05-15 14:33:43 +100031 if ((ret = sshbuf_get_u16(buffer, v)) != 0) {
32 error("%s: %s", __func__, ssh_err(ret));
33 return -1;
34 }
35 return 0;
Darren Tucker50dbe832004-11-05 20:41:24 +110036}
37
38u_short
39buffer_get_short(Buffer *buffer)
40{
41 u_short ret;
42
43 if (buffer_get_short_ret(&ret, buffer) == -1)
Damien Miller05e82c32014-05-15 14:33:43 +100044 fatal("%s: buffer error", __func__);
Darren Tucker50dbe832004-11-05 20:41:24 +110045
46 return (ret);
47}
48
49int
Damien Miller05e82c32014-05-15 14:33:43 +100050buffer_get_int_ret(u_int *v, Buffer *buffer)
Darren Tucker50dbe832004-11-05 20:41:24 +110051{
Damien Miller05e82c32014-05-15 14:33:43 +100052 int ret;
Darren Tucker50dbe832004-11-05 20:41:24 +110053
Damien Miller05e82c32014-05-15 14:33:43 +100054 if ((ret = sshbuf_get_u32(buffer, v)) != 0) {
55 error("%s: %s", __func__, ssh_err(ret));
56 return -1;
57 }
58 return 0;
Damien Miller3b235662002-04-23 20:42:36 +100059}
60
Ben Lindstrom46c16222000-12-22 01:43:59 +000061u_int
Damien Miller95def091999-11-25 00:26:21 +110062buffer_get_int(Buffer *buffer)
Damien Millerd4a8b7e1999-10-27 13:42:43 +100063{
Darren Tucker50dbe832004-11-05 20:41:24 +110064 u_int ret;
Ben Lindstrome1353632002-06-23 21:29:23 +000065
Darren Tucker50dbe832004-11-05 20:41:24 +110066 if (buffer_get_int_ret(&ret, buffer) == -1)
Damien Miller05e82c32014-05-15 14:33:43 +100067 fatal("%s: buffer error", __func__);
Darren Tucker50dbe832004-11-05 20:41:24 +110068
69 return (ret);
70}
71
72int
Damien Miller05e82c32014-05-15 14:33:43 +100073buffer_get_int64_ret(u_int64_t *v, Buffer *buffer)
Darren Tucker50dbe832004-11-05 20:41:24 +110074{
Damien Miller05e82c32014-05-15 14:33:43 +100075 int ret;
Darren Tucker50dbe832004-11-05 20:41:24 +110076
Damien Miller05e82c32014-05-15 14:33:43 +100077 if ((ret = sshbuf_get_u64(buffer, v)) != 0) {
78 error("%s: %s", __func__, ssh_err(ret));
79 return -1;
80 }
81 return 0;
Damien Millerd4a8b7e1999-10-27 13:42:43 +100082}
83
Ben Lindstrom2f959b42001-01-11 06:20:23 +000084u_int64_t
85buffer_get_int64(Buffer *buffer)
86{
Darren Tucker50dbe832004-11-05 20:41:24 +110087 u_int64_t ret;
Ben Lindstrome1353632002-06-23 21:29:23 +000088
Darren Tucker50dbe832004-11-05 20:41:24 +110089 if (buffer_get_int64_ret(&ret, buffer) == -1)
Damien Miller05e82c32014-05-15 14:33:43 +100090 fatal("%s: buffer error", __func__);
Darren Tucker50dbe832004-11-05 20:41:24 +110091
92 return (ret);
Ben Lindstrom2f959b42001-01-11 06:20:23 +000093}
94
Damien Miller5f056372000-04-16 12:31:48 +100095void
Damien Miller3b235662002-04-23 20:42:36 +100096buffer_put_short(Buffer *buffer, u_short value)
97{
Damien Miller05e82c32014-05-15 14:33:43 +100098 int ret;
Ben Lindstrome1353632002-06-23 21:29:23 +000099
Damien Miller05e82c32014-05-15 14:33:43 +1000100 if ((ret = sshbuf_put_u16(buffer, value)) != 0)
101 fatal("%s: %s", __func__, ssh_err(ret));
Damien Miller3b235662002-04-23 20:42:36 +1000102}
103
104void
Ben Lindstrom46c16222000-12-22 01:43:59 +0000105buffer_put_int(Buffer *buffer, u_int value)
Damien Millerd4a8b7e1999-10-27 13:42:43 +1000106{
Damien Miller05e82c32014-05-15 14:33:43 +1000107 int ret;
Ben Lindstrome1353632002-06-23 21:29:23 +0000108
Damien Miller05e82c32014-05-15 14:33:43 +1000109 if ((ret = sshbuf_put_u32(buffer, value)) != 0)
110 fatal("%s: %s", __func__, ssh_err(ret));
Damien Millerd4a8b7e1999-10-27 13:42:43 +1000111}
112
Ben Lindstrom2f959b42001-01-11 06:20:23 +0000113void
114buffer_put_int64(Buffer *buffer, u_int64_t value)
115{
Damien Miller05e82c32014-05-15 14:33:43 +1000116 int ret;
Ben Lindstrome1353632002-06-23 21:29:23 +0000117
Damien Miller05e82c32014-05-15 14:33:43 +1000118 if ((ret = sshbuf_put_u64(buffer, value)) != 0)
119 fatal("%s: %s", __func__, ssh_err(ret));
Ben Lindstrom2f959b42001-01-11 06:20:23 +0000120}
121
Damien Miller5a6b4fe2001-12-21 14:56:54 +1100122void *
Darren Tucker50dbe832004-11-05 20:41:24 +1100123buffer_get_string_ret(Buffer *buffer, u_int *length_ptr)
Damien Millerd4a8b7e1999-10-27 13:42:43 +1000124{
Damien Miller05e82c32014-05-15 14:33:43 +1000125 size_t len;
126 int ret;
Damien Miller5a6b4fe2001-12-21 14:56:54 +1100127 u_char *value;
Ben Lindstrome1353632002-06-23 21:29:23 +0000128
Damien Miller05e82c32014-05-15 14:33:43 +1000129 if ((ret = sshbuf_get_string(buffer, &value, &len)) != 0) {
130 error("%s: %s", __func__, ssh_err(ret));
131 return NULL;
Damien Miller17751bc2010-02-12 07:35:08 +1100132 }
Damien Miller05e82c32014-05-15 14:33:43 +1000133 if (length_ptr != NULL)
134 *length_ptr = len; /* Safe: sshbuf never stores len > 2^31 */
135 return value;
Darren Tucker50dbe832004-11-05 20:41:24 +1100136}
137
138void *
139buffer_get_string(Buffer *buffer, u_int *length_ptr)
140{
141 void *ret;
142
143 if ((ret = buffer_get_string_ret(buffer, length_ptr)) == NULL)
Damien Miller05e82c32014-05-15 14:33:43 +1000144 fatal("%s: buffer error", __func__);
Darren Tucker50dbe832004-11-05 20:41:24 +1100145 return (ret);
Damien Millerd4a8b7e1999-10-27 13:42:43 +1000146}
147
Damien Millerda108ec2010-08-31 22:36:39 +1000148char *
149buffer_get_cstring_ret(Buffer *buffer, u_int *length_ptr)
150{
Damien Miller05e82c32014-05-15 14:33:43 +1000151 size_t len;
152 int ret;
153 char *value;
Damien Millerda108ec2010-08-31 22:36:39 +1000154
Damien Miller05e82c32014-05-15 14:33:43 +1000155 if ((ret = sshbuf_get_cstring(buffer, &value, &len)) != 0) {
156 error("%s: %s", __func__, ssh_err(ret));
Damien Millerda108ec2010-08-31 22:36:39 +1000157 return NULL;
Damien Millerda108ec2010-08-31 22:36:39 +1000158 }
159 if (length_ptr != NULL)
Damien Miller05e82c32014-05-15 14:33:43 +1000160 *length_ptr = len; /* Safe: sshbuf never stores len > 2^31 */
161 return value;
Damien Millerda108ec2010-08-31 22:36:39 +1000162}
163
164char *
165buffer_get_cstring(Buffer *buffer, u_int *length_ptr)
166{
167 char *ret;
168
169 if ((ret = buffer_get_cstring_ret(buffer, length_ptr)) == NULL)
Damien Miller05e82c32014-05-15 14:33:43 +1000170 fatal("%s: buffer error", __func__);
Damien Millerda108ec2010-08-31 22:36:39 +1000171 return ret;
172}
173
Damien Miller633de332014-05-15 13:48:26 +1000174const void *
Darren Tuckerebc71d92010-01-12 19:45:59 +1100175buffer_get_string_ptr_ret(Buffer *buffer, u_int *length_ptr)
Damien Millerdb255ca2008-05-19 14:59:37 +1000176{
Damien Miller05e82c32014-05-15 14:33:43 +1000177 size_t len;
178 int ret;
179 const u_char *value;
Damien Millerdb255ca2008-05-19 14:59:37 +1000180
Damien Miller05e82c32014-05-15 14:33:43 +1000181 if ((ret = sshbuf_get_string_direct(buffer, &value, &len)) != 0) {
182 error("%s: %s", __func__, ssh_err(ret));
Darren Tuckerebc71d92010-01-12 19:45:59 +1100183 return NULL;
184 }
Damien Miller05e82c32014-05-15 14:33:43 +1000185 if (length_ptr != NULL)
186 *length_ptr = len; /* Safe: sshbuf never stores len > 2^31 */
187 return value;
Damien Millerdb255ca2008-05-19 14:59:37 +1000188}
189
Damien Miller633de332014-05-15 13:48:26 +1000190const void *
Darren Tuckerebc71d92010-01-12 19:45:59 +1100191buffer_get_string_ptr(Buffer *buffer, u_int *length_ptr)
192{
Damien Miller633de332014-05-15 13:48:26 +1000193 const void *ret;
Darren Tuckerebc71d92010-01-12 19:45:59 +1100194
195 if ((ret = buffer_get_string_ptr_ret(buffer, length_ptr)) == NULL)
Damien Miller05e82c32014-05-15 14:33:43 +1000196 fatal("%s: buffer error", __func__);
Darren Tuckerebc71d92010-01-12 19:45:59 +1100197 return (ret);
198}
199
Damien Miller5f056372000-04-16 12:31:48 +1000200void
Ben Lindstrom46c16222000-12-22 01:43:59 +0000201buffer_put_string(Buffer *buffer, const void *buf, u_int len)
Damien Millerd4a8b7e1999-10-27 13:42:43 +1000202{
Damien Miller05e82c32014-05-15 14:33:43 +1000203 int ret;
204
205 if ((ret = sshbuf_put_string(buffer, buf, len)) != 0)
206 fatal("%s: %s", __func__, ssh_err(ret));
Damien Millerd4a8b7e1999-10-27 13:42:43 +1000207}
Damien Miller05e82c32014-05-15 14:33:43 +1000208
Damien Miller5f056372000-04-16 12:31:48 +1000209void
Damien Millerb38eff82000-04-01 11:09:21 +1000210buffer_put_cstring(Buffer *buffer, const char *s)
211{
Damien Miller05e82c32014-05-15 14:33:43 +1000212 int ret;
213
214 if ((ret = sshbuf_put_cstring(buffer, s)) != 0)
215 fatal("%s: %s", __func__, ssh_err(ret));
Damien Millerb38eff82000-04-01 11:09:21 +1000216}
Damien Millerd4a8b7e1999-10-27 13:42:43 +1000217
Damien Miller5f056372000-04-16 12:31:48 +1000218int
Damien Miller05e82c32014-05-15 14:33:43 +1000219buffer_get_char_ret(char *v, Buffer *buffer)
Darren Tucker50dbe832004-11-05 20:41:24 +1100220{
Damien Miller05e82c32014-05-15 14:33:43 +1000221 int ret;
222
223 if ((ret = sshbuf_get_u8(buffer, (u_char *)v)) != 0) {
224 error("%s: %s", __func__, ssh_err(ret));
225 return -1;
Darren Tucker50dbe832004-11-05 20:41:24 +1100226 }
Damien Miller05e82c32014-05-15 14:33:43 +1000227 return 0;
Darren Tucker50dbe832004-11-05 20:41:24 +1100228}
229
230int
Damien Miller95def091999-11-25 00:26:21 +1100231buffer_get_char(Buffer *buffer)
Damien Millerd4a8b7e1999-10-27 13:42:43 +1000232{
Damien Miller05e82c32014-05-15 14:33:43 +1000233 char ch;
Ben Lindstrome1353632002-06-23 21:29:23 +0000234
Darren Tucker50dbe832004-11-05 20:41:24 +1100235 if (buffer_get_char_ret(&ch, buffer) == -1)
Damien Miller05e82c32014-05-15 14:33:43 +1000236 fatal("%s: buffer error", __func__);
237 return (u_char) ch;
Damien Millerd4a8b7e1999-10-27 13:42:43 +1000238}
239
Damien Miller5f056372000-04-16 12:31:48 +1000240void
Damien Miller95def091999-11-25 00:26:21 +1100241buffer_put_char(Buffer *buffer, int value)
Damien Millerd4a8b7e1999-10-27 13:42:43 +1000242{
Damien Miller05e82c32014-05-15 14:33:43 +1000243 int ret;
Ben Lindstrome1353632002-06-23 21:29:23 +0000244
Damien Miller05e82c32014-05-15 14:33:43 +1000245 if ((ret = sshbuf_put_u8(buffer, value)) != 0)
246 fatal("%s: %s", __func__, ssh_err(ret));
Damien Millerd4a8b7e1999-10-27 13:42:43 +1000247}
Damien Miller91b580e2014-01-12 19:21:22 +1100248
Damien Miller91b580e2014-01-12 19:21:22 +1100249void
250buffer_put_bignum2_from_string(Buffer *buffer, const u_char *s, u_int l)
251{
Damien Miller05e82c32014-05-15 14:33:43 +1000252 int ret;
Damien Miller91b580e2014-01-12 19:21:22 +1100253
Damien Miller05e82c32014-05-15 14:33:43 +1000254 if ((ret = sshbuf_put_bignum2_bytes(buffer, s, l)) != 0)
255 fatal("%s: %s", __func__, ssh_err(ret));
Damien Miller91b580e2014-01-12 19:21:22 +1100256}
257