support ssh2 bignums
authormarkus <markus@openbsd.org>
Tue, 28 Mar 2000 20:24:18 +0000 (20:24 +0000)
committermarkus <markus@openbsd.org>
Tue, 28 Mar 2000 20:24:18 +0000 (20:24 +0000)
usr.bin/ssh/bufaux.c
usr.bin/ssh/bufaux.h

index dddc41f..16dce15 100644 (file)
  * Auxiliary functions for storing and retrieving various data types to/from
  * Buffers.
  *
+ * SSH2 packet format added by Markus Friedl
+ *
  */
 
 #include "includes.h"
-RCSID("$Id: bufaux.c,v 1.8 2000/03/16 20:56:14 markus Exp $");
+RCSID("$Id: bufaux.c,v 1.9 2000/03/28 20:24:18 markus Exp $");
 
 #include "ssh.h"
 #include <ssl/bn.h>
@@ -75,6 +77,50 @@ buffer_get_bignum(Buffer *buffer, BIGNUM *value)
        return 2 + bytes;
 }
 
+/*
+ * 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).
  */
@@ -135,6 +181,11 @@ buffer_put_string(Buffer *buffer, const void *buf, unsigned int len)
        buffer_put_int(buffer, len);
        buffer_append(buffer, buf, len);
 }
+void 
+buffer_put_cstring(Buffer *buffer, const char *s)
+{
+       buffer_put_string(buffer, s, strlen(s));
+}
 
 /*
  * Returns a character from the buffer (0 - 255).
index 124a265..f21491f 100644 (file)
@@ -11,7 +11,7 @@
  * 
  */
 
-/* RCSID("$Id: bufaux.h,v 1.4 1999/11/24 19:53:44 markus Exp $"); */
+/* RCSID("$Id: bufaux.h,v 1.5 2000/03/28 20:24:18 markus Exp $"); */
 
 #ifndef BUFAUX_H
 #define BUFAUX_H
  * by (bits+7)/8 bytes of binary data, msb first.
  */
 void    buffer_put_bignum(Buffer * buffer, BIGNUM * value);
+void    buffer_put_bignum2(Buffer * buffer, BIGNUM * value);
 
 /* Retrieves an BIGNUM from the buffer. */
 int     buffer_get_bignum(Buffer * buffer, BIGNUM * value);
+int    buffer_get_bignum2(Buffer *buffer, BIGNUM * value);
 
 /* Returns an integer from the buffer (4 bytes, msb first). */
 unsigned int buffer_get_int(Buffer * buffer);
@@ -51,5 +53,6 @@ char   *buffer_get_string(Buffer * buffer, unsigned int *length_ptr);
 
 /* Stores and arbitrary binary string in the buffer. */
 void    buffer_put_string(Buffer * buffer, const void *buf, unsigned int len);
+void   buffer_put_cstring(Buffer *buffer, const char *s);
 
 #endif                         /* BUFAUX_H */