Annotation of src/usr.bin/ssh/bufaux.c, Revision 1.60
1.60 ! djm 1: /* $OpenBSD: bufaux.c,v 1.59 2014/04/29 18:01:49 markus Exp $ */
1.1 deraadt 2: /*
1.60 ! djm 3: * Copyright (c) 2012 Damien Miller <djm@mindrot.org>
1.11 markus 4: *
1.60 ! djm 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.
1.11 markus 8: *
1.60 ! djm 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.
1.6 deraadt 16: */
1.1 deraadt 17:
1.60 ! djm 18: /* Emulation wrappers for legacy OpenSSH buffer API atop sshbuf */
! 19:
1.44 deraadt 20: #include <sys/types.h>
1.43 stevesk 21:
1.44 deraadt 22: #include "buffer.h"
1.17 markus 23: #include "log.h"
1.60 ! djm 24: #include "ssherr.h"
1.25 markus 25:
1.33 djm 26: int
1.60 ! djm 27: buffer_get_short_ret(u_short *v, Buffer *buffer)
1.33 djm 28: {
1.60 ! djm 29: int ret;
1.33 djm 30:
1.60 ! djm 31: if ((ret = sshbuf_get_u16(buffer, v)) != 0) {
! 32: error("%s: %s", __func__, ssh_err(ret));
! 33: return -1;
! 34: }
! 35: return 0;
1.33 djm 36: }
37:
1.25 markus 38: u_short
39: buffer_get_short(Buffer *buffer)
40: {
1.33 djm 41: u_short ret;
42:
43: if (buffer_get_short_ret(&ret, buffer) == -1)
1.60 ! djm 44: fatal("%s: buffer error", __func__);
1.33 djm 45:
46: return (ret);
47: }
48:
49: int
1.60 ! djm 50: buffer_get_int_ret(u_int *v, Buffer *buffer)
1.33 djm 51: {
1.60 ! djm 52: int ret;
1.26 deraadt 53:
1.60 ! djm 54: if ((ret = sshbuf_get_u32(buffer, v)) != 0) {
! 55: error("%s: %s", __func__, ssh_err(ret));
! 56: return -1;
! 57: }
! 58: return 0;
1.25 markus 59: }
60:
1.14 markus 61: u_int
1.5 markus 62: buffer_get_int(Buffer *buffer)
1.1 deraadt 63: {
1.33 djm 64: u_int ret;
65:
66: if (buffer_get_int_ret(&ret, buffer) == -1)
1.60 ! djm 67: fatal("%s: buffer error", __func__);
1.33 djm 68:
69: return (ret);
70: }
71:
72: int
1.60 ! djm 73: buffer_get_int64_ret(u_int64_t *v, Buffer *buffer)
1.33 djm 74: {
1.60 ! djm 75: int ret;
1.26 deraadt 76:
1.60 ! djm 77: if ((ret = sshbuf_get_u64(buffer, v)) != 0) {
! 78: error("%s: %s", __func__, ssh_err(ret));
! 79: return -1;
! 80: }
! 81: return 0;
1.1 deraadt 82: }
83:
1.15 markus 84: u_int64_t
85: buffer_get_int64(Buffer *buffer)
86: {
1.33 djm 87: u_int64_t ret;
88:
89: if (buffer_get_int64_ret(&ret, buffer) == -1)
1.60 ! djm 90: fatal("%s: buffer error", __func__);
1.26 deraadt 91:
1.33 djm 92: return (ret);
1.15 markus 93: }
94:
1.25 markus 95: void
96: buffer_put_short(Buffer *buffer, u_short value)
97: {
1.60 ! djm 98: int ret;
1.26 deraadt 99:
1.60 ! djm 100: if ((ret = sshbuf_put_u16(buffer, value)) != 0)
! 101: fatal("%s: %s", __func__, ssh_err(ret));
1.25 markus 102: }
103:
1.11 markus 104: void
1.14 markus 105: buffer_put_int(Buffer *buffer, u_int value)
1.1 deraadt 106: {
1.60 ! djm 107: int ret;
1.26 deraadt 108:
1.60 ! djm 109: if ((ret = sshbuf_put_u32(buffer, value)) != 0)
! 110: fatal("%s: %s", __func__, ssh_err(ret));
1.15 markus 111: }
112:
113: void
114: buffer_put_int64(Buffer *buffer, u_int64_t value)
115: {
1.60 ! djm 116: int ret;
1.26 deraadt 117:
1.60 ! djm 118: if ((ret = sshbuf_put_u64(buffer, value)) != 0)
! 119: fatal("%s: %s", __func__, ssh_err(ret));
1.1 deraadt 120: }
121:
1.20 stevesk 122: void *
1.33 djm 123: buffer_get_string_ret(Buffer *buffer, u_int *length_ptr)
1.1 deraadt 124: {
1.60 ! djm 125: size_t len;
! 126: int ret;
1.26 deraadt 127: u_char *value;
128:
1.60 ! djm 129: if ((ret = sshbuf_get_string(buffer, &value, &len)) != 0) {
! 130: error("%s: %s", __func__, ssh_err(ret));
! 131: return NULL;
1.48 djm 132: }
1.60 ! djm 133: if (length_ptr != NULL)
! 134: *length_ptr = len; /* Safe: sshbuf never stores len > 2^31 */
! 135: return value;
1.33 djm 136: }
137:
138: void *
139: buffer_get_string(Buffer *buffer, u_int *length_ptr)
140: {
141: void *ret;
142:
143: if ((ret = buffer_get_string_ret(buffer, length_ptr)) == NULL)
1.60 ! djm 144: fatal("%s: buffer error", __func__);
1.33 djm 145: return (ret);
1.50 djm 146: }
147:
148: char *
149: buffer_get_cstring_ret(Buffer *buffer, u_int *length_ptr)
150: {
1.60 ! djm 151: size_t len;
! 152: int ret;
! 153: char *value;
1.50 djm 154:
1.60 ! djm 155: if ((ret = sshbuf_get_cstring(buffer, &value, &len)) != 0) {
! 156: error("%s: %s", __func__, ssh_err(ret));
1.50 djm 157: return NULL;
158: }
159: if (length_ptr != NULL)
1.60 ! djm 160: *length_ptr = len; /* Safe: sshbuf never stores len > 2^31 */
! 161: return value;
1.50 djm 162: }
163:
164: char *
165: buffer_get_cstring(Buffer *buffer, u_int *length_ptr)
166: {
167: char *ret;
168:
169: if ((ret = buffer_get_cstring_ret(buffer, length_ptr)) == NULL)
1.60 ! djm 170: fatal("%s: buffer error", __func__);
1.50 djm 171: return ret;
1.45 markus 172: }
173:
1.58 djm 174: const void *
1.47 djm 175: buffer_get_string_ptr_ret(Buffer *buffer, u_int *length_ptr)
1.45 markus 176: {
1.60 ! djm 177: size_t len;
! 178: int ret;
! 179: const u_char *value;
1.45 markus 180:
1.60 ! djm 181: if ((ret = sshbuf_get_string_direct(buffer, &value, &len)) != 0) {
! 182: error("%s: %s", __func__, ssh_err(ret));
1.47 djm 183: return NULL;
184: }
1.60 ! djm 185: if (length_ptr != NULL)
! 186: *length_ptr = len; /* Safe: sshbuf never stores len > 2^31 */
! 187: return value;
1.47 djm 188: }
189:
1.58 djm 190: const void *
1.47 djm 191: buffer_get_string_ptr(Buffer *buffer, u_int *length_ptr)
192: {
1.58 djm 193: const void *ret;
1.47 djm 194:
195: if ((ret = buffer_get_string_ptr_ret(buffer, length_ptr)) == NULL)
1.60 ! djm 196: fatal("%s: buffer error", __func__);
1.47 djm 197: return (ret);
1.1 deraadt 198: }
199:
1.11 markus 200: void
1.14 markus 201: buffer_put_string(Buffer *buffer, const void *buf, u_int len)
1.1 deraadt 202: {
1.60 ! djm 203: int ret;
! 204:
! 205: if ((ret = sshbuf_put_string(buffer, buf, len)) != 0)
! 206: fatal("%s: %s", __func__, ssh_err(ret));
1.9 markus 207: }
1.60 ! djm 208:
1.11 markus 209: void
1.9 markus 210: buffer_put_cstring(Buffer *buffer, const char *s)
211: {
1.60 ! djm 212: int ret;
! 213:
! 214: if ((ret = sshbuf_put_cstring(buffer, s)) != 0)
! 215: fatal("%s: %s", __func__, ssh_err(ret));
1.1 deraadt 216: }
217:
1.11 markus 218: int
1.60 ! djm 219: buffer_get_char_ret(char *v, Buffer *buffer)
1.33 djm 220: {
1.60 ! djm 221: 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;
1.33 djm 226: }
1.60 ! djm 227: return 0;
1.33 djm 228: }
229:
230: int
1.5 markus 231: buffer_get_char(Buffer *buffer)
1.1 deraadt 232: {
1.60 ! djm 233: char ch;
1.26 deraadt 234:
1.33 djm 235: if (buffer_get_char_ret(&ch, buffer) == -1)
1.60 ! djm 236: fatal("%s: buffer error", __func__);
! 237: return (u_char) ch;
1.1 deraadt 238: }
239:
1.11 markus 240: void
1.5 markus 241: buffer_put_char(Buffer *buffer, int value)
1.1 deraadt 242: {
1.60 ! djm 243: int ret;
1.54 djm 244:
1.60 ! djm 245: if ((ret = sshbuf_put_u8(buffer, value)) != 0)
! 246: fatal("%s: %s", __func__, ssh_err(ret));
1.54 djm 247: }
248:
249: void
250: buffer_put_bignum2_from_string(Buffer *buffer, const u_char *s, u_int l)
251: {
1.60 ! djm 252: int ret;
1.54 djm 253:
1.60 ! djm 254: if ((ret = sshbuf_put_bignum2_bytes(buffer, s, l)) != 0)
! 255: fatal("%s: %s", __func__, ssh_err(ret));
1.54 djm 256: }
257: