X-Git-Url: https://git.distorted.org.uk/u/mdw/putty/blobdiff_plain/374330e25a6b51c40436fa869a381dd510790f6e..033b4cef1e52d65786b00df47f57361b96ca4321:/sshrsa.c diff --git a/sshrsa.c b/sshrsa.c index 70cf9bbe..bf54e409 100644 --- a/sshrsa.c +++ b/sshrsa.c @@ -1,23 +1,14 @@ /* * RSA implementation just sufficient for ssh client-side * initialisation step + * + * Rewritten for more speed by Joris van Rantwijk, Jun 1999. */ -/*#include -#define RSADEBUG -#define DLVL 2 -#include "stel.h"*/ - #include #include #include -#include "ssh.h" - -typedef unsigned short *Bignum; - -static unsigned short Zero[1] = { 0 }; - #if defined TESTMODE || defined RSADEBUG #ifndef DLVL #define DLVL 10000 @@ -45,206 +36,7 @@ static void bndebug(char *name, Bignum b) { #define leave(x) #endif -static Bignum newbn(int length) { - Bignum b = malloc((length+1)*sizeof(unsigned short)); - if (!b) - abort(); /* FIXME */ - b[0] = length; - return b; -} - -static void freebn(Bignum b) { - free(b); -} - -static int msb(Bignum r) { - int i; - int j; - unsigned short n; - - for (i=r[0]; i>0; i--) - if (r[i]) - break; - - j = (i-1)*16; - n = r[i]; - if (n & 0xFF00) j += 8, n >>= 8; - if (n & 0x00F0) j += 4, n >>= 4; - if (n & 0x000C) j += 2, n >>= 2; - if (n & 0x0002) j += 1, n >>= 1; - - return j; -} - -static void add(Bignum r1, Bignum r2, Bignum result) { - int i; - long stuff = 0; - - enter((">add\n")); - debug(r1); - debug(r2); - - for (i = 1 ;; i++) { - if (i <= r1[0]) - stuff += r1[i]; - if (i <= r2[0]) - stuff += r2[i]; - if (i <= result[0]) - result[i] = stuff & 0xFFFFU; - if (i > r1[0] && i > r2[0] && i >= result[0]) - break; - stuff >>= 16; - } - - debug(result); - leave(("sub\n")); - debug(r1); - debug(r2); - - for (i = 1 ;; i++) { - if (i <= r1[0]) - stuff += r1[i]; - if (i <= r2[0]) - stuff -= r2[i]; - if (i <= result[0]) - result[i] = stuff & 0xFFFFU; - if (i > r1[0] && i > r2[0] && i >= result[0]) - break; - stuff = stuff<0 ? -1 : 0; - } - - debug(result); - leave(("ge\n")); - debug(r1); - debug(r2); - - if (r1[0] < r2[0]) - i = r2[0]; - else - i = r1[0]; - - while (i > 0) { - unsigned short n1 = (i > r1[0] ? 0 : r1[i]); - unsigned short n2 = (i > r2[0] ? 0 : r2[i]); - - if (n1 > n2) { - dmsg(("greater\n")); - leave((" r2 */ - } else if (n1 < n2) { - dmsg(("less\n")); - leave(("modmult\n")); - debug(r1); - debug(r2); - debug(modulus); - - for (i=1; i<=result[0]; i++) - result[i] = 0; /* result := 0 */ - for (i=1; i<=temp[0]; i++) - temp[i] = (i > r2[0] ? 0 : r2[i]); /* temp := r2 */ - - bits = 1+msb(r1); - - for (bit = 0; bit < bits; bit++) { - digit = 1 + bit / 16; - smallbit = bit % 16; - - debug(temp); - if (digit <= r1[0] && (r1[digit] & (1<modpow\n")); - debug(r1); - debug(r2); - debug(modulus); - - for (i=1; i<=result[0]; i++) - result[i] = (i==1); /* result := 1 */ - for (i=1; i<=temp[0]; i++) - temp[i] = (i > r1[0] ? 0 : r1[i]); /* temp := r1 */ - - bits = 1+msb(r2); - - for (bit = 0; bit < bits; bit++) { - digit = 1 + bit / 16; - smallbit = bit % 16; - - debug(temp); - if (digit <= r2[0] && (r2[digit] & (1<bytes; i++) { + for (i=key->bytes; i-- ;) { unsigned char byte = *p++; - if ((key->bytes-i) & 1) - b1[w-i/2] |= byte; + if (i & 1) + b1[1+i/2] |= byte<<8; else - b1[w-i/2] |= byte<<8; + b1[1+i/2] |= byte; } debug(b1); @@ -331,12 +123,12 @@ void rsaencrypt(unsigned char *data, int length, struct RSAKey *key) { debug(b2); p = data; - for (i=0; ibytes; i++) { + for (i=key->bytes; i-- ;) { unsigned char b; if (i & 1) - b = b2[w-i/2] & 0xFF; + b = b2[1+i/2] >> 8; else - b = b2[w-i/2] >> 8; + b = b2[1+i/2] & 0xFF; *p++ = b; }