Deleted Added
full compact
bufaux.c (76262) bufaux.c (92559)
1/*
2 * Author: Tatu Ylonen <ylo@cs.hut.fi>
3 * Copyright (c) 1995 Tatu Ylonen <ylo@cs.hut.fi>, Espoo, Finland
4 * All rights reserved
5 * Auxiliary functions for storing and retrieving various data types to/from
6 * Buffers.
7 *
8 * As far as I am concerned, the code I have written for this software

--- 23 unchanged lines hidden (view full) ---

32 * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
33 * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
34 * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
35 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
36 * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
37 */
38
39#include "includes.h"
1/*
2 * Author: Tatu Ylonen <ylo@cs.hut.fi>
3 * Copyright (c) 1995 Tatu Ylonen <ylo@cs.hut.fi>, Espoo, Finland
4 * All rights reserved
5 * Auxiliary functions for storing and retrieving various data types to/from
6 * Buffers.
7 *
8 * As far as I am concerned, the code I have written for this software

--- 23 unchanged lines hidden (view full) ---

32 * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
33 * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
34 * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
35 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
36 * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
37 */
38
39#include "includes.h"
40RCSID("$OpenBSD: bufaux.c,v 1.17 2001/01/21 19:05:45 markus Exp $");
41RCSID("$FreeBSD: head/crypto/openssh/bufaux.c 76262 2001-05-04 04:14:23Z green $");
40RCSID("$OpenBSD: bufaux.c,v 1.22 2002/01/18 18:14:17 stevesk Exp $");
41RCSID("$FreeBSD: head/crypto/openssh/bufaux.c 92559 2002-03-18 10:09:43Z des $");
42
43#include <openssl/bn.h>
44#include "bufaux.h"
45#include "xmalloc.h"
46#include "getput.h"
47#include "log.h"
48
49/*

--- 8 unchanged lines hidden (view full) ---

58 u_char *buf = xmalloc(bin_size);
59 int oi;
60 char msg[2];
61
62 /* Get the value of in binary */
63 oi = BN_bn2bin(value, buf);
64 if (oi != bin_size)
65 fatal("buffer_put_bignum: BN_bn2bin() failed: oi %d != bin_size %d",
42
43#include <openssl/bn.h>
44#include "bufaux.h"
45#include "xmalloc.h"
46#include "getput.h"
47#include "log.h"
48
49/*

--- 8 unchanged lines hidden (view full) ---

58 u_char *buf = xmalloc(bin_size);
59 int oi;
60 char msg[2];
61
62 /* Get the value of in binary */
63 oi = BN_bn2bin(value, buf);
64 if (oi != bin_size)
65 fatal("buffer_put_bignum: BN_bn2bin() failed: oi %d != bin_size %d",
66 oi, bin_size);
66 oi, bin_size);
67
68 /* Store the number of bits in the buffer in two bytes, msb first. */
69 PUT_16BIT(msg, bits);
70 buffer_append(buffer, msg, 2);
71 /* Store the binary data. */
72 buffer_append(buffer, (char *)buf, oi);
73
74 memset(buf, 0, bin_size);
75 xfree(buf);
76}
77
78/*
79 * Retrieves an BIGNUM from the buffer.
80 */
67
68 /* Store the number of bits in the buffer in two bytes, msb first. */
69 PUT_16BIT(msg, bits);
70 buffer_append(buffer, msg, 2);
71 /* Store the binary data. */
72 buffer_append(buffer, (char *)buf, oi);
73
74 memset(buf, 0, bin_size);
75 xfree(buf);
76}
77
78/*
79 * Retrieves an BIGNUM from the buffer.
80 */
81int
81void
82buffer_get_bignum(Buffer *buffer, BIGNUM *value)
83{
84 int bits, bytes;
85 u_char buf[2], *bin;
86
87 /* Get the number for bits. */
88 buffer_get(buffer, (char *) buf, 2);
89 bits = GET_16BIT(buf);
90 /* Compute the number of binary bytes that follow. */
91 bytes = (bits + 7) / 8;
92 if (buffer_len(buffer) < bytes)
93 fatal("buffer_get_bignum: input buffer too small");
82buffer_get_bignum(Buffer *buffer, BIGNUM *value)
83{
84 int bits, bytes;
85 u_char buf[2], *bin;
86
87 /* Get the number for bits. */
88 buffer_get(buffer, (char *) buf, 2);
89 bits = GET_16BIT(buf);
90 /* Compute the number of binary bytes that follow. */
91 bytes = (bits + 7) / 8;
92 if (buffer_len(buffer) < bytes)
93 fatal("buffer_get_bignum: input buffer too small");
94 bin = (u_char *) buffer_ptr(buffer);
94 bin = buffer_ptr(buffer);
95 BN_bin2bn(bin, bytes, value);
96 buffer_consume(buffer, bytes);
95 BN_bin2bn(bin, bytes, value);
96 buffer_consume(buffer, bytes);
97
98 return 2 + bytes;
99}
100
101/*
102 * Stores an BIGNUM in the buffer in SSH2 format.
103 */
104void
105buffer_put_bignum2(Buffer *buffer, BIGNUM *value)
106{
107 int bytes = BN_num_bytes(value) + 1;
108 u_char *buf = xmalloc(bytes);
109 int oi;
110 int hasnohigh = 0;
111 buf[0] = '\0';
112 /* Get the value of in binary */
113 oi = BN_bn2bin(value, buf+1);
114 if (oi != bytes-1)
115 fatal("buffer_put_bignum: BN_bn2bin() failed: oi %d != bin_size %d",
97}
98
99/*
100 * Stores an BIGNUM in the buffer in SSH2 format.
101 */
102void
103buffer_put_bignum2(Buffer *buffer, BIGNUM *value)
104{
105 int bytes = BN_num_bytes(value) + 1;
106 u_char *buf = xmalloc(bytes);
107 int oi;
108 int hasnohigh = 0;
109 buf[0] = '\0';
110 /* Get the value of in binary */
111 oi = BN_bn2bin(value, buf+1);
112 if (oi != bytes-1)
113 fatal("buffer_put_bignum: BN_bn2bin() failed: oi %d != bin_size %d",
116 oi, bytes);
114 oi, bytes);
117 hasnohigh = (buf[1] & 0x80) ? 0 : 1;
118 if (value->neg) {
119 /**XXX should be two's-complement */
120 int i, carry;
121 u_char *uc = buf;
122 log("negativ!");
115 hasnohigh = (buf[1] & 0x80) ? 0 : 1;
116 if (value->neg) {
117 /**XXX should be two's-complement */
118 int i, carry;
119 u_char *uc = buf;
120 log("negativ!");
123 for(i = bytes-1, carry = 1; i>=0; i--) {
121 for (i = bytes-1, carry = 1; i>=0; i--) {
124 uc[i] ^= 0xff;
122 uc[i] ^= 0xff;
125 if(carry)
123 if (carry)
126 carry = !++uc[i];
127 }
128 }
129 buffer_put_string(buffer, buf+hasnohigh, bytes-hasnohigh);
130 memset(buf, 0, bytes);
131 xfree(buf);
132}
133
124 carry = !++uc[i];
125 }
126 }
127 buffer_put_string(buffer, buf+hasnohigh, bytes-hasnohigh);
128 memset(buf, 0, bytes);
129 xfree(buf);
130}
131
134int
132void
135buffer_get_bignum2(Buffer *buffer, BIGNUM *value)
136{
137 /**XXX should be two's-complement */
138 int len;
133buffer_get_bignum2(Buffer *buffer, BIGNUM *value)
134{
135 /**XXX should be two's-complement */
136 int len;
139 u_char *bin = (u_char *)buffer_get_string(buffer, (u_int *)&len);
137 u_char *bin = buffer_get_string(buffer, (u_int *)&len);
140 BN_bin2bn(bin, len, value);
141 xfree(bin);
138 BN_bin2bn(bin, len, value);
139 xfree(bin);
142 return len;
143}
144
145/*
146 * Returns an integer from the buffer (4 bytes, msb first).
147 */
148u_int
149buffer_get_int(Buffer *buffer)
150{

--- 32 unchanged lines hidden (view full) ---

183/*
184 * Returns an arbitrary binary string from the buffer. The string cannot
185 * be longer than 256k. The returned value points to memory allocated
186 * with xmalloc; it is the responsibility of the calling function to free
187 * the data. If length_ptr is non-NULL, the length of the returned data
188 * will be stored there. A null character will be automatically appended
189 * to the returned string, and is not counted in length.
190 */
140}
141
142/*
143 * Returns an integer from the buffer (4 bytes, msb first).
144 */
145u_int
146buffer_get_int(Buffer *buffer)
147{

--- 32 unchanged lines hidden (view full) ---

180/*
181 * Returns an arbitrary binary string from the buffer. The string cannot
182 * be longer than 256k. The returned value points to memory allocated
183 * with xmalloc; it is the responsibility of the calling function to free
184 * the data. If length_ptr is non-NULL, the length of the returned data
185 * will be stored there. A null character will be automatically appended
186 * to the returned string, and is not counted in length.
187 */
191char *
188void *
192buffer_get_string(Buffer *buffer, u_int *length_ptr)
193{
194 u_int len;
189buffer_get_string(Buffer *buffer, u_int *length_ptr)
190{
191 u_int len;
195 char *value;
192 u_char *value;
196 /* Get the length. */
197 len = buffer_get_int(buffer);
198 if (len > 256 * 1024)
199 fatal("Received packet with bad string length %d", len);
200 /* Allocate space for the string. Add one byte for a null character. */
201 value = xmalloc(len + 1);
202 /* Get the string. */
203 buffer_get(buffer, value, len);

--- 43 unchanged lines hidden ---
193 /* Get the length. */
194 len = buffer_get_int(buffer);
195 if (len > 256 * 1024)
196 fatal("Received packet with bad string length %d", len);
197 /* Allocate space for the string. Add one byte for a null character. */
198 value = xmalloc(len + 1);
199 /* Get the string. */
200 buffer_get(buffer, value, len);

--- 43 unchanged lines hidden ---