/* * Retrieves a BIGNUM from the buffer. */ int buffer_get_bignum_ret(Buffer *buffer, BIGNUM *value) { u_int bits, bytes; u_char buf[2], *bin; /* Get the number of bits. */ if (buffer_get_ret(buffer, (char *) buf, 2) == -1) { error("buffer_get_bignum_ret: invalid length"); return (-1); } bits = get_u16(buf); /* Compute the number of binary bytes that follow. */ bytes = (bits + 7) / 8; if (bytes > 8 * 1024) { error("buffer_get_bignum_ret: cannot handle BN of size %d", bytes); return (-1); } if (buffer_len(buffer) < bytes) { error("buffer_get_bignum_ret: input buffer too small"); return (-1); } bin = buffer_ptr(buffer); if (BN_bin2bn(bin, bytes, value) == NULL) { error("buffer_get_bignum_ret: BN_bin2bn failed"); return (-1); } if (buffer_consume_ret(buffer, bytes) == -1) { error("buffer_get_bignum_ret: buffer_consume failed"); return (-1); } return (0); }
/* * Returns an arbitrary binary string from the buffer. The string cannot * be longer than 256k. The returned value points to memory allocated * with xmalloc; it is the responsibility of the calling function to free * the data. If length_ptr is non-NULL, the length of the returned data * will be stored there. A null character will be automatically appended * to the returned string, and is not counted in length. */ void * buffer_get_string_ret(Buffer *buffer, u_int *length_ptr) { u_char *value; u_int len; /* Get the length. */ if (buffer_get_int_ret(&len, buffer) != 0) { error("buffer_get_string_ret: cannot extract length"); return (NULL); } if (len > 256 * 1024) { error("buffer_get_string_ret: bad string length %u", len); return (NULL); } /* Allocate space for the string. Add one byte for a null character. */ value = xmalloc(len + 1); /* Get the string. */ if (buffer_get_ret(buffer, value, len) == -1) { error("buffer_get_string_ret: buffer_get failed"); free(value); return (NULL); } /* Append a null character to make processing easier. */ value[len] = '\0'; /* Optionally return the length of the string. */ if (length_ptr) *length_ptr = len; return (value); }
void *buffer_get_string_ret(Buffer *buffer, unsigned int *length_ptr) { unsigned char *value; unsigned int len; /* Get the length. */ len = buffer_get_int(buffer); if (len > 256 * 1024) { error("buffer_get_string_ret: bad string length %u", len); return (NULL); } /* Allocate space for the string. Add one byte for a null character. */ value = (unsigned char *)malloc(len + 1); /* Get the string. */ if (buffer_get_ret(buffer, value, len) == -1) { error("buffer_get_string_ret: buffer_get failed"); free(value); return (NULL); } /* Append a null character to make processing easier. */ value[len] = 0; /* Optionally return the length of the string. */ if (length_ptr) *length_ptr = len; return (value); }
unsigned int buffer_get_int(Buffer *buffer) { u_char buf[4]; if (buffer_get_ret(buffer, (char *) buf, 4) == -1) return (-1); return get_u32(buf); }
int buffer_get_char_ret(char *ret, Buffer *buffer) { if (buffer_get_ret(buffer, ret, 1) == -1) { error("buffer_get_char_ret: buffer_get_ret failed"); return (-1); } return (0); }
int buffer_get_short_ret(u_short *ret, Buffer *buffer) { u_char buf[2]; if (buffer_get_ret(buffer, (char *) buf, 2) == -1) return (-1); *ret = get_u16(buf); return (0); }
int buffer_get_int_ret(u_int *ret, Buffer *buffer) { u_char buf[4]; if (buffer_get_ret(buffer, (char *) buf, 4) == -1) return (-1); *ret = get_u32(buf); return (0); }
int buffer_get_int64_ret(u_int64_t *ret, Buffer *buffer) { u_char buf[8]; if (buffer_get_ret(buffer, (char *) buf, 8) == -1) return (-1); *ret = get_u64(buf); return (0); }
void buffer_get(Buffer *buffer, void *buf, u_int len) { if (buffer_get_ret(buffer, buf, len) == -1) fatal("buffer_get: buffer error"); }
void buffer_get(Buffer *buffer, void *buf, u_int len) { if (buffer_get_ret(buffer, buf, len) == -1) fatal("%s: buffer error", __func__); }
void buffer_get(Buffer *buffer, void *buf, uint32_t len) { if (buffer_get_ret(buffer, buf, len) == -1) croak("buffer_get: buffer error"); }