version 1.8, 2000/03/16 20:56:14 |
version 1.9, 2000/03/28 20:24:18 |
|
|
* Auxiliary functions for storing and retrieving various data types to/from |
* Auxiliary functions for storing and retrieving various data types to/from |
* Buffers. |
* Buffers. |
* |
* |
|
* SSH2 packet format added by Markus Friedl |
|
* |
*/ |
*/ |
|
|
#include "includes.h" |
#include "includes.h" |
|
|
} |
} |
|
|
/* |
/* |
|
* Stores an BIGNUM in the buffer in SSH2 format. |
|
*/ |
|
void |
|
buffer_put_bignum2(Buffer *buffer, BIGNUM *value) |
|
{ |
|
int bytes = BN_num_bytes(value) + 1; |
|
unsigned char *buf = xmalloc(bytes); |
|
int oi; |
|
int hasnohigh = 0; |
|
buf[0] = '\0'; |
|
/* Get the value of in binary */ |
|
oi = BN_bn2bin(value, buf+1); |
|
if (oi != bytes-1) |
|
fatal("buffer_put_bignum: BN_bn2bin() failed: oi %d != bin_size %d", |
|
oi, bytes); |
|
hasnohigh = (buf[1] & 0x80) ? 0 : 1; |
|
if (value->neg) { |
|
/**XXX should be two's-complement */ |
|
int i, carry; |
|
unsigned char *uc = buf; |
|
log("negativ!"); |
|
for(i = bytes-1, carry = 1; i>=0; i--) { |
|
uc[i] ^= 0xff; |
|
if(carry) |
|
carry = !++uc[i]; |
|
} |
|
} |
|
buffer_put_string(buffer, buf+hasnohigh, bytes-hasnohigh); |
|
memset(buf, 0, bytes); |
|
xfree(buf); |
|
} |
|
|
|
int |
|
buffer_get_bignum2(Buffer *buffer, BIGNUM *value) |
|
{ |
|
/**XXX should be two's-complement */ |
|
int len; |
|
unsigned char *bin = (unsigned char *)buffer_get_string(buffer, (unsigned int *)&len); |
|
BN_bin2bn(bin, len, value); |
|
xfree(bin); |
|
return len; |
|
} |
|
|
|
/* |
* Returns an integer from the buffer (4 bytes, msb first). |
* Returns an integer from the buffer (4 bytes, msb first). |
*/ |
*/ |
unsigned int |
unsigned int |
|
|
{ |
{ |
buffer_put_int(buffer, len); |
buffer_put_int(buffer, len); |
buffer_append(buffer, buf, len); |
buffer_append(buffer, buf, len); |
|
} |
|
void |
|
buffer_put_cstring(Buffer *buffer, const char *s) |
|
{ |
|
buffer_put_string(buffer, s, strlen(s)); |
} |
} |
|
|
/* |
/* |