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