11305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood/* $OpenBSD: bufbn.c,v 1.6 2007/06/02 09:04:58 djm Exp $*/
21305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood/*
31305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood * Author: Tatu Ylonen <ylo@cs.hut.fi>
41305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood * Copyright (c) 1995 Tatu Ylonen <ylo@cs.hut.fi>, Espoo, Finland
51305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood *                    All rights reserved
61305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood * Auxiliary functions for storing and retrieving various data types to/from
71305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood * Buffers.
81305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood *
91305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood * As far as I am concerned, the code I have written for this software
101305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood * can be used freely for any purpose.  Any derived versions of this
111305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood * software must be clearly marked as such, and if the derived work is
121305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood * incompatible with the protocol description in the RFC file, it must be
131305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood * called by a name other than "ssh" or "Secure Shell".
141305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood *
151305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood *
161305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood * SSH2 packet format added by Markus Friedl
171305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood * Copyright (c) 2000 Markus Friedl.  All rights reserved.
181305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood *
191305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood * Redistribution and use in source and binary forms, with or without
201305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood * modification, are permitted provided that the following conditions
211305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood * are met:
221305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood * 1. Redistributions of source code must retain the above copyright
231305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood *    notice, this list of conditions and the following disclaimer.
241305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood * 2. Redistributions in binary form must reproduce the above copyright
251305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood *    notice, this list of conditions and the following disclaimer in the
261305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood *    documentation and/or other materials provided with the distribution.
271305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood *
281305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
291305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
301305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
311305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
321305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
331305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
341305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
351305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
361305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
371305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
381305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood */
391305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood
401305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood#include "includes.h"
411305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood
421305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood#include <sys/types.h>
431305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood
441305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood#include <openssl/bn.h>
451305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood
461305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood#include <string.h>
471305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood#include <stdarg.h>
481305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood
491305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood#include "xmalloc.h"
501305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood#include "buffer.h"
511305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood#include "log.h"
521305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood#include "misc.h"
531305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood
541305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood/*
551305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood * Stores an BIGNUM in the buffer with a 2-byte msb first bit count, followed
561305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood * by (bits+7)/8 bytes of binary data, msb first.
571305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood */
581305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwoodint
591305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwoodbuffer_put_bignum_ret(Buffer *buffer, const BIGNUM *value)
601305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood{
611305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood	int bits = BN_num_bits(value);
621305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood	int bin_size = (bits + 7) / 8;
631305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood	u_char *buf = xmalloc(bin_size);
641305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood	int oi;
651305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood	char msg[2];
661305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood
671305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood	/* Get the value of in binary */
681305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood	oi = BN_bn2bin(value, buf);
691305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood	if (oi != bin_size) {
701305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood		error("buffer_put_bignum_ret: BN_bn2bin() failed: oi %d != bin_size %d",
711305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood		    oi, bin_size);
721305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood		xfree(buf);
731305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood		return (-1);
741305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood	}
751305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood
761305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood	/* Store the number of bits in the buffer in two bytes, msb first. */
771305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood	put_u16(msg, bits);
781305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood	buffer_append(buffer, msg, 2);
791305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood	/* Store the binary data. */
801305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood	buffer_append(buffer, buf, oi);
811305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood
821305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood	memset(buf, 0, bin_size);
831305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood	xfree(buf);
841305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood
851305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood	return (0);
861305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood}
871305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood
881305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwoodvoid
891305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwoodbuffer_put_bignum(Buffer *buffer, const BIGNUM *value)
901305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood{
911305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood	if (buffer_put_bignum_ret(buffer, value) == -1)
921305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood		fatal("buffer_put_bignum: buffer error");
931305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood}
941305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood
951305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood/*
961305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood * Retrieves a BIGNUM from the buffer.
971305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood */
981305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwoodint
991305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwoodbuffer_get_bignum_ret(Buffer *buffer, BIGNUM *value)
1001305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood{
1011305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood	u_int bits, bytes;
1021305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood	u_char buf[2], *bin;
1031305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood
1041305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood	/* Get the number of bits. */
1051305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood	if (buffer_get_ret(buffer, (char *) buf, 2) == -1) {
1061305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood		error("buffer_get_bignum_ret: invalid length");
1071305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood		return (-1);
1081305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood	}
1091305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood	bits = get_u16(buf);
1101305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood	/* Compute the number of binary bytes that follow. */
1111305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood	bytes = (bits + 7) / 8;
1121305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood	if (bytes > 8 * 1024) {
1131305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood		error("buffer_get_bignum_ret: cannot handle BN of size %d", bytes);
1141305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood		return (-1);
1151305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood	}
1161305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood	if (buffer_len(buffer) < bytes) {
1171305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood		error("buffer_get_bignum_ret: input buffer too small");
1181305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood		return (-1);
1191305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood	}
1201305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood	bin = buffer_ptr(buffer);
1211305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood	if (BN_bin2bn(bin, bytes, value) == NULL) {
1221305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood		error("buffer_get_bignum_ret: BN_bin2bn failed");
1231305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood		return (-1);
1241305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood	}
1251305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood	if (buffer_consume_ret(buffer, bytes) == -1) {
1261305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood		error("buffer_get_bignum_ret: buffer_consume failed");
1271305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood		return (-1);
1281305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood	}
1291305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood	return (0);
1301305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood}
1311305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood
1321305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwoodvoid
1331305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwoodbuffer_get_bignum(Buffer *buffer, BIGNUM *value)
1341305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood{
1351305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood	if (buffer_get_bignum_ret(buffer, value) == -1)
1361305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood		fatal("buffer_get_bignum: buffer error");
1371305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood}
1381305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood
1391305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood/*
1401305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood * Stores a BIGNUM in the buffer in SSH2 format.
1411305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood */
1421305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwoodint
1431305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwoodbuffer_put_bignum2_ret(Buffer *buffer, const BIGNUM *value)
1441305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood{
1451305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood	u_int bytes;
1461305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood	u_char *buf;
1471305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood	int oi;
1481305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood	u_int hasnohigh = 0;
1491305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood
1501305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood	if (BN_is_zero(value)) {
1511305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood		buffer_put_int(buffer, 0);
1521305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood		return 0;
1531305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood	}
1541305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood	if (value->neg) {
1551305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood		error("buffer_put_bignum2_ret: negative numbers not supported");
1561305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood		return (-1);
1571305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood	}
1581305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood	bytes = BN_num_bytes(value) + 1; /* extra padding byte */
1591305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood	if (bytes < 2) {
1601305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood		error("buffer_put_bignum2_ret: BN too small");
1611305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood		return (-1);
1621305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood	}
1631305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood	buf = xmalloc(bytes);
1641305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood	buf[0] = 0x00;
1651305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood	/* Get the value of in binary */
1661305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood	oi = BN_bn2bin(value, buf+1);
1671305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood	if (oi < 0 || (u_int)oi != bytes - 1) {
1681305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood		error("buffer_put_bignum2_ret: BN_bn2bin() failed: "
1691305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood		    "oi %d != bin_size %d", oi, bytes);
1701305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood		xfree(buf);
1711305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood		return (-1);
1721305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood	}
1731305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood	hasnohigh = (buf[1] & 0x80) ? 0 : 1;
1741305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood	buffer_put_string(buffer, buf+hasnohigh, bytes-hasnohigh);
1751305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood	memset(buf, 0, bytes);
1761305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood	xfree(buf);
1771305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood	return (0);
1781305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood}
1791305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood
1801305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwoodvoid
1811305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwoodbuffer_put_bignum2(Buffer *buffer, const BIGNUM *value)
1821305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood{
1831305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood	if (buffer_put_bignum2_ret(buffer, value) == -1)
1841305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood		fatal("buffer_put_bignum2: buffer error");
1851305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood}
1861305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood
1871305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwoodint
1881305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwoodbuffer_get_bignum2_ret(Buffer *buffer, BIGNUM *value)
1891305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood{
1901305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood	u_int len;
1911305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood	u_char *bin;
1921305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood
1931305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood	if ((bin = buffer_get_string_ret(buffer, &len)) == NULL) {
1941305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood		error("buffer_get_bignum2_ret: invalid bignum");
1951305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood		return (-1);
1961305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood	}
1971305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood
1981305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood	if (len > 0 && (bin[0] & 0x80)) {
1991305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood		error("buffer_get_bignum2_ret: negative numbers not supported");
2001305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood		xfree(bin);
2011305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood		return (-1);
2021305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood	}
2031305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood	if (len > 8 * 1024) {
2041305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood		error("buffer_get_bignum2_ret: cannot handle BN of size %d",
2051305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood		    len);
2061305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood		xfree(bin);
2071305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood		return (-1);
2081305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood	}
2091305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood	if (BN_bin2bn(bin, len, value) == NULL) {
2101305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood		error("buffer_get_bignum2_ret: BN_bin2bn failed");
2111305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood		xfree(bin);
2121305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood		return (-1);
2131305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood	}
2141305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood	xfree(bin);
2151305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood	return (0);
2161305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood}
2171305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood
2181305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwoodvoid
2191305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwoodbuffer_get_bignum2(Buffer *buffer, BIGNUM *value)
2201305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood{
2211305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood	if (buffer_get_bignum2_ret(buffer, value) == -1)
2221305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood		fatal("buffer_get_bignum2: buffer error");
2231305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood}
224