Rather silly byte-string / word-string transformations in RSA key
authorsimon <simon@cda61777-01e9-0310-a592-d414129be87e>
Fri, 24 Mar 2000 11:46:39 +0000 (11:46 +0000)
committersimon <simon@cda61777-01e9-0310-a592-d414129be87e>
Fri, 24 Mar 2000 11:46:39 +0000 (11:46 +0000)
handling were failing when the key had an odd number of bytes. A
server with an 850-bit key was suffering connection failures as a
result. Now fixed.

git-svn-id: svn://svn.tartarus.org/sgt/putty@426 cda61777-01e9-0310-a592-d414129be87e

sshrsa.c

index 3a017c2..d13f6cf 100644 (file)
--- a/sshrsa.c
+++ b/sshrsa.c
@@ -264,12 +264,12 @@ int makekey(unsigned char *data, struct RSAKey *result,
 
        for (i=1; i<=w; i++)
            bn[j][i] = 0;
-       for (i=0; i<b; i++) {
+       for (i=b; i-- ;) {
            unsigned char byte = *p++;
-           if ((b-i) & 1)
-               bn[j][w-i/2] |= byte;
+           if (i & 1)
+               bn[j][1+i/2] |= byte<<8;
            else
-               bn[j][w-i/2] |= byte<<8;
+               bn[j][1+i/2] |= byte;
        }
 
        debug(bn[j]);
@@ -308,12 +308,12 @@ void rsaencrypt(unsigned char *data, int length, struct RSAKey *key) {
     p = data;
     for (i=1; i<=w; i++)
        b1[i] = 0;
-    for (i=0; i<key->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);
@@ -323,12 +323,12 @@ void rsaencrypt(unsigned char *data, int length, struct RSAKey *key) {
     debug(b2);
 
     p = data;
-    for (i=0; i<key->bytes; 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;
     }