]> asedeno.scripts.mit.edu Git - PuTTY.git/commitdiff
Provide a little-endian version of bignum_from_bytes().
authorChris Staite <chris@yourdreamnet.co.uk>
Sat, 9 May 2015 14:02:50 +0000 (15:02 +0100)
committerSimon Tatham <anakin@pobox.com>
Sat, 9 May 2015 14:02:50 +0000 (15:02 +0100)
ssh.h
sshbn.c

diff --git a/ssh.h b/ssh.h
index d74c278db9c1293ceca71b45005dc5c0261658b5..4f58337dd7526cb348e6fd6dd59994cbd5f7c191 100644 (file)
--- a/ssh.h
+++ b/ssh.h
@@ -572,6 +572,7 @@ Bignum modsub(const Bignum a, const Bignum b, const Bignum n);
 void decbn(Bignum n);
 extern Bignum Zero, One;
 Bignum bignum_from_bytes(const unsigned char *data, int nbytes);
+Bignum bignum_from_bytes_le(const unsigned char *data, int nbytes);
 Bignum bignum_random_in_range(const Bignum lower, const Bignum upper);
 int ssh1_read_bignum(const unsigned char *data, int len, Bignum * result);
 int bignum_bitcount(Bignum bn);
diff --git a/sshbn.c b/sshbn.c
index 8da7d8a00e46c7d3ad6ffc72cdbcc5e3df887eab..b5c99125b2633645d83c06d28e842b8740fb5099 100644 (file)
--- a/sshbn.c
+++ b/sshbn.c
@@ -1233,6 +1233,28 @@ Bignum bignum_from_bytes(const unsigned char *data, int nbytes)
     return result;
 }
 
+Bignum bignum_from_bytes_le(const unsigned char *data, int nbytes)
+{
+    Bignum result;
+    int w, i;
+
+    assert(nbytes >= 0 && nbytes < INT_MAX/8);
+
+    w = (nbytes + BIGNUM_INT_BYTES - 1) / BIGNUM_INT_BYTES; /* bytes->words */
+
+    result = newbn(w);
+    for (i = 1; i <= w; i++)
+        result[i] = 0;
+    for (i = 0; i < nbytes; ++i) {
+        unsigned char byte = *data++;
+        result[1 + i / BIGNUM_INT_BYTES] |= byte << (8*i % BIGNUM_INT_BITS);
+    }
+
+    while (result[0] > 1 && result[result[0]] == 0)
+        result[0]--;
+    return result;
+}
+
 Bignum bignum_random_in_range(const Bignum lower, const Bignum upper)
 {
     Bignum ret = NULL;