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