[BACK]Return to bufaux.c CVS log [TXT][DIR] Up to [local] / src / usr.bin / ssh

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: