X-Git-Url: https://git.distorted.org.uk/u/mdw/putty/blobdiff_plain/80b105717eaccb493391330a0a812be0af2a40e7..7af9fa7f957710190d184d85e43bf917f71f84a9:/sshbn.c diff --git a/sshbn.c b/sshbn.c index 587fc8f3..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; } @@ -470,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--; @@ -481,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; } /* @@ -530,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; @@ -563,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) { @@ -714,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")); } /* @@ -827,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);