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