X-Git-Url: https://git.distorted.org.uk/u/mdw/putty/blobdiff_plain/3709bfe9981af43e3cd491c37d300b57e5b26d50..7af9fa7f957710190d184d85e43bf917f71f84a9:/sshbn.c diff --git a/sshbn.c b/sshbn.c index aea5a82b..2fd98f91 100644 --- a/sshbn.c +++ b/sshbn.c @@ -6,6 +6,14 @@ #include #include +#if 0 // use PuTTY main debugging for diagbn() +#include +#include "putty.h" +#define debugprint debug +#else +#define debugprint(x) printf x +#endif + #define BIGNUM_INTERNAL typedef unsigned short *Bignum; @@ -60,7 +68,7 @@ void freebn(Bignum b) { } Bignum bn_power_2(int n) { - Bignum ret = newbn((n+15)/16); + Bignum ret = newbn(n/16+1); bignum_set_bit(ret, n, 1); return ret; } @@ -289,7 +297,7 @@ Bignum modmul(Bignum p, Bignum q, Bignum mod) { unsigned short *a, *n, *m, *o; int mshift; - int pqlen, mlen, i, j; + int pqlen, mlen, rlen, i, j; Bignum result; /* Allocate m of size mlen, copy mod to m */ @@ -339,9 +347,10 @@ Bignum modmul(Bignum p, Bignum q, Bignum mod) } /* Copy result to buffer */ - result = newbn(mod[0]); - for (i = 0; i < mlen; i++) - result[result[0] - i] = a[i+2*pqlen-mlen]; + rlen = (mlen < pqlen*2 ? mlen : pqlen*2); + result = newbn(rlen); + for (i = 0; i < rlen; i++) + result[result[0] - i] = a[i+2*pqlen-rlen]; while (result[0] > 1 && result[result[0]] == 0) result[0]--; /* Free temporary arrays */ @@ -469,7 +478,7 @@ int ssh1_read_bignum(unsigned char *data, Bignum *result) { /* * Return the bit count of a bignum, for ssh1 encoding. */ -int ssh1_bignum_bitcount(Bignum bn) { +int bignum_bitcount(Bignum bn) { int bitcount = bn[0] * 16 - 1; while (bitcount >= 0 && (bn[bitcount/16+1] >> (bitcount % 16)) == 0) bitcount--; @@ -480,7 +489,14 @@ int ssh1_bignum_bitcount(Bignum bn) { * Return the byte length of a bignum when ssh1 encoded. */ int ssh1_bignum_length(Bignum bn) { - return 2 + (ssh1_bignum_bitcount(bn)+7)/8; + return 2 + (bignum_bitcount(bn)+7)/8; +} + +/* + * Return the byte length of a bignum when ssh2 encoded. + */ +int ssh2_bignum_length(Bignum bn) { + return 4 + (bignum_bitcount(bn)+8)/8; } /* @@ -529,7 +545,7 @@ int ssh1_write_bignum(void *data, Bignum bn) { unsigned char *p = data; int len = ssh1_bignum_length(bn); int i; - int bitc = ssh1_bignum_bitcount(bn); + int bitc = bignum_bitcount(bn); *p++ = (bitc >> 8) & 0xFF; *p++ = (bitc ) & 0xFF; @@ -562,7 +578,7 @@ Bignum bignum_rshift(Bignum a, int shift) { int i, shiftw, shiftb, shiftbb, bits; unsigned short ai, ai1; - bits = ssh1_bignum_bitcount(a) - shift; + bits = bignum_bitcount(a) - shift; ret = newbn((bits+15)/16); if (ret) { @@ -713,15 +729,15 @@ void diagbn(char *prefix, Bignum md) { int i, nibbles, morenibbles; static const char hex[] = "0123456789ABCDEF"; - printf("%s0x", prefix ? prefix : ""); + debugprint(("%s0x", prefix ? prefix : "")); - nibbles = (3 + ssh1_bignum_bitcount(md))/4; if (nibbles<1) nibbles=1; + nibbles = (3 + bignum_bitcount(md))/4; if (nibbles<1) nibbles=1; morenibbles = 4*md[0] - nibbles; - for (i=0; i> (4*(i%2))) & 0xF]); + debugprint(("%c",hex[(bignum_byte(md, i/2) >> (4*(i%2))) & 0xF])); - if (prefix) putchar('\n'); + if (prefix) debugprint(("\n")); } /* @@ -826,7 +842,7 @@ char *bignum_decimal(Bignum x) { * Therefore if we multiply the bit count by 28/93, rounding * up, we will have enough digits. */ - i = ssh1_bignum_bitcount(x); + i = bignum_bitcount(x); ndigits = (28*i + 92)/93; /* multiply by 28/93 and round up */ ndigits++; /* allow for trailing \0 */ ret = smalloc(ndigits);