projects
/
u
/
mdw
/
putty
/ blobdiff
commit
grep
author
committer
pickaxe
?
search:
re
summary
|
shortlog
|
log
|
commit
|
commitdiff
|
tree
raw
|
inline
| side by side
Debugging improvements. Started using Dave Hinton's dmemdump
[u/mdw/putty]
/
sshbn.c
diff --git
a/sshbn.c
b/sshbn.c
index
aea5a82
..
2fd98f9
100644
(file)
--- a/
sshbn.c
+++ b/
sshbn.c
@@
-6,6
+6,14
@@
#include <stdlib.h>
#include <string.h>
#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;
#define BIGNUM_INTERNAL
typedef unsigned short *Bignum;
@@
-60,7
+68,7
@@
void freebn(Bignum b) {
}
Bignum bn_power_2(int n) {
}
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;
}
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;
{
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 */
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 */
}
/* 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 */
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.
*/
/*
* 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--;
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 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;
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;
*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;
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) {
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";
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;
morenibbles = 4*md[0] - nibbles;
- for (i=0; i<morenibbles; i++)
putchar('-'
);
+ for (i=0; i<morenibbles; i++)
debugprint(("-")
);
for (i=nibbles; i-- ;)
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")
);
}
/*
}
/*
@@
-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.
*/
* 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);
ndigits = (28*i + 92)/93; /* multiply by 28/93 and round up */
ndigits++; /* allow for trailing \0 */
ret = smalloc(ndigits);