#include <stdlib.h>
#include <string.h>
+#if 0 // use PuTTY main debugging for diagbn()
+#include <windows.h>
+#include "putty.h"
+#define debugprint debug
+#else
+#define debugprint(x) printf x
+#endif
+
#define BIGNUM_INTERNAL
typedef unsigned short *Bignum;
}
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;
}
{
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 */
}
/* 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 */
/*
* 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--;
* 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;
}
/*
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;
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) {
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<morenibbles; i++) putchar('-');
+ for (i=0; i<morenibbles; i++) debugprint(("-"));
for (i=nibbles; i-- ;)
- putchar(hex[(bignum_byte(md, i/2) >> (4*(i%2))) & 0xF]);
+ debugprint(("%c",hex[(bignum_byte(md, i/2) >> (4*(i%2))) & 0xF]));
- if (prefix) putchar('\n');
+ if (prefix) debugprint(("\n"));
}
/*
* 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);