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