]> andersk Git - openssh.git/blob - bufaux.c
Merged OpenBSD CVS changes that go away
[openssh.git] / bufaux.c
1 /*
2
3 bufaux.c
4
5 Author: Tatu Ylonen <ylo@cs.hut.fi>
6
7 Copyright (c) 1995 Tatu Ylonen <ylo@cs.hut.fi>, Espoo, Finland
8                    All rights reserved
9
10 Created: Wed Mar 29 02:24:47 1995 ylo
11
12 Auxiliary functions for storing and retrieving various data types to/from
13 Buffers.
14
15 */
16
17 #include "config.h"
18 #include "includes.h"
19 RCSID("$Id$");
20
21 #include "ssh.h"
22
23 #ifdef HAVE_OPENSSL
24 #include <openssl/bn.h>
25 #endif
26 #ifdef HAVE_SSL
27 #include <ssl/bn.h>
28 #endif
29
30 #include "bufaux.h"
31 #include "xmalloc.h"
32 #include "getput.h"
33
34 /* Stores an BIGNUM in the buffer with a 2-byte msb first bit count, followed
35    by (bits+7)/8 bytes of binary data, msb first. */
36
37 void
38 buffer_put_bignum(Buffer *buffer, BIGNUM *value)
39 {
40   int bits = BN_num_bits(value);
41   int bin_size = (bits + 7) / 8;
42   char *buf = xmalloc(bin_size);
43   int oi;
44   char msg[2];
45   
46   /* Get the value of in binary */
47   oi = BN_bn2bin(value, buf);
48   if (oi != bin_size)
49     fatal("buffer_put_bignum: BN_bn2bin() failed: oi %d != bin_size %d",
50           oi, bin_size);
51
52   /* Store the number of bits in the buffer in two bytes, msb first. */
53   PUT_16BIT(msg, bits);
54   buffer_append(buffer, msg, 2);
55   /* Store the binary data. */
56   buffer_append(buffer, buf, oi);
57   /* Clear the temporary data. */
58   memset(buf, 0, bin_size);
59   xfree(buf);
60 }
61
62 /* Retrieves an BIGNUM from the buffer. */
63
64 int
65 buffer_get_bignum(Buffer *buffer, BIGNUM *value)
66 {
67   int bits, bytes;
68   unsigned char buf[2], *bin;
69
70   /* Get the number for bits. */
71   buffer_get(buffer, (char *)buf, 2);
72   bits = GET_16BIT(buf);
73   /* Compute the number of binary bytes that follow. */
74   bytes = (bits + 7) / 8;
75   bin = xmalloc(bytes);
76   buffer_get(buffer, bin, bytes);
77   BN_bin2bn(bin, bytes, value);
78   xfree(bin);
79
80   return 2 + bytes;
81 }
82
83 /* Returns an integer from the buffer (4 bytes, msb first). */
84
85 unsigned int buffer_get_int(Buffer *buffer)
86 {
87   unsigned char buf[4];
88   buffer_get(buffer, (char *)buf, 4);
89   return GET_32BIT(buf);
90 }
91
92 /* Stores an integer in the buffer in 4 bytes, msb first. */
93
94 void buffer_put_int(Buffer *buffer, unsigned int value)
95 {
96   char buf[4];
97   PUT_32BIT(buf, value);
98   buffer_append(buffer, buf, 4);
99 }
100
101 /* Returns an arbitrary binary string from the buffer.  The string cannot
102    be longer than 256k.  The returned value points to memory allocated
103    with xmalloc; it is the responsibility of the calling function to free
104    the data.  If length_ptr is non-NULL, the length of the returned data
105    will be stored there.  A null character will be automatically appended
106    to the returned string, and is not counted in length. */
107
108 char *buffer_get_string(Buffer *buffer, unsigned int *length_ptr)
109 {
110   unsigned int len;
111   char *value;
112   /* Get the length. */
113   len = buffer_get_int(buffer);
114   if (len > 256*1024)
115     fatal("Received packet with bad string length %d", len);
116   /* Allocate space for the string.  Add one byte for a null character. */
117   value = xmalloc(len + 1);
118   /* Get the string. */
119   buffer_get(buffer, value, len);
120   /* Append a null character to make processing easier. */
121   value[len] = 0;
122   /* Optionally return the length of the string. */
123   if (length_ptr)
124     *length_ptr = len;
125   return value;
126 }
127
128 /* Stores and arbitrary binary string in the buffer. */
129
130 void buffer_put_string(Buffer *buffer, const void *buf, unsigned int len)
131 {
132   buffer_put_int(buffer, len);
133   buffer_append(buffer, buf, len);
134 }
135
136 /* Returns a character from the buffer (0 - 255). */
137
138 int buffer_get_char(Buffer *buffer)
139 {
140   char ch;
141   buffer_get(buffer, &ch, 1);
142   return (unsigned char)ch;
143 }
144
145 /* Stores a character in the buffer. */
146
147 void buffer_put_char(Buffer *buffer, int value)
148 {
149   char ch = value;
150   buffer_append(buffer, &ch, 1);
151 }
This page took 0.053317 seconds and 5 git commands to generate.