Browse Source

Fixing Diffie-Hellman key exchange which was broken since upgrade to PuTTY 0.71

Source commit: 8fd8ae74c1539d1fff4f6c410ba7843a901cc2a7
Martin Prikryl 6 years ago
parent
commit
03db8793dd
2 changed files with 14 additions and 3 deletions
  1. 12 1
      source/putty/mpint.h
  2. 2 2
      source/putty/sshdh.c

+ 12 - 1
source/putty/mpint.h

@@ -85,7 +85,18 @@ static inline mp_int *mp__from_string_literal(const char *lit)
     else
     else
         return mp_from_decimal(lit);
         return mp_from_decimal(lit);
 }
 }
-#define MP_LITERAL(number) mp__from_string_literal(#number)
+// WINSCP
+static inline mp_int *mp__from_string_literal_check(const char *lit)
+{
+    // WORKAROUND: C++ Builder seems to limit stringified code to about 256 characters.
+    // So make sure this is not the case.
+    // If it is, we need to call mp__from_string_literal directly (MP_LITERAL_WINSCP_STR)
+    // with a string (as in dh_group*_construct).
+    assert(strlen(lit) < 200);
+    return mp__from_string_literal(lit);
+}
+#define MP_LITERAL(number) mp__from_string_literal_check(#number)
+#define MP_LITERAL_WINSCP_STR(number) mp__from_string_literal(number)
 
 
 /*
 /*
  * Create an mp_int with the value 2^power.
  * Create an mp_int with the value 2^power.

+ 2 - 2
source/putty/sshdh.c

@@ -19,13 +19,13 @@ struct dh_extra {
 
 
 static void dh_group1_construct(dh_ctx *ctx)
 static void dh_group1_construct(dh_ctx *ctx)
 {
 {
-    ctx->p = MP_LITERAL(0xFFFFFFFFFFFFFFFFC90FDAA22168C234C4C6628B80DC1CD129024E088A67CC74020BBEA63B139B22514A08798E3404DDEF9519B3CD3A431B302B0A6DF25F14374FE1356D6D51C245E485B576625E7EC6F44C42E9A637ED6B0BFF5CB6F406B7EDEE386BFB5A899FA5AE9F24117C4B1FE649286651ECE65381FFFFFFFFFFFFFFFF);
+    ctx->p = MP_LITERAL_WINSCP_STR("0xFFFFFFFFFFFFFFFFC90FDAA22168C234C4C6628B80DC1CD129024E088A67CC74020BBEA63B139B22514A08798E3404DDEF9519B3CD3A431B302B0A6DF25F14374FE1356D6D51C245E485B576625E7EC6F44C42E9A637ED6B0BFF5CB6F406B7EDEE386BFB5A899FA5AE9F24117C4B1FE649286651ECE65381FFFFFFFFFFFFFFFF");
     ctx->g = mp_from_integer(2);
     ctx->g = mp_from_integer(2);
 }
 }
 
 
 static void dh_group14_construct(dh_ctx *ctx)
 static void dh_group14_construct(dh_ctx *ctx)
 {
 {
-    ctx->p = MP_LITERAL(0xFFFFFFFFFFFFFFFFC90FDAA22168C234C4C6628B80DC1CD129024E088A67CC74020BBEA63B139B22514A08798E3404DDEF9519B3CD3A431B302B0A6DF25F14374FE1356D6D51C245E485B576625E7EC6F44C42E9A637ED6B0BFF5CB6F406B7EDEE386BFB5A899FA5AE9F24117C4B1FE649286651ECE45B3DC2007CB8A163BF0598DA48361C55D39A69163FA8FD24CF5F83655D23DCA3AD961C62F356208552BB9ED529077096966D670C354E4ABC9804F1746C08CA18217C32905E462E36CE3BE39E772C180E86039B2783A2EC07A28FB5C55DF06F4C52C9DE2BCBF6955817183995497CEA956AE515D2261898FA051015728E5A8AACAA68FFFFFFFFFFFFFFFF);
+    ctx->p = MP_LITERAL_WINSCP_STR("0xFFFFFFFFFFFFFFFFC90FDAA22168C234C4C6628B80DC1CD129024E088A67CC74020BBEA63B139B22514A08798E3404DDEF9519B3CD3A431B302B0A6DF25F14374FE1356D6D51C245E485B576625E7EC6F44C42E9A637ED6B0BFF5CB6F406B7EDEE386BFB5A899FA5AE9F24117C4B1FE649286651ECE45B3DC2007CB8A163BF0598DA48361C55D39A69163FA8FD24CF5F83655D23DCA3AD961C62F356208552BB9ED529077096966D670C354E4ABC9804F1746C08CA18217C32905E462E36CE3BE39E772C180E86039B2783A2EC07A28FB5C55DF06F4C52C9DE2BCBF6955817183995497CEA956AE515D2261898FA051015728E5A8AACAA68FFFFFFFFFFFFFFFF");
     ctx->g = mp_from_integer(2);
     ctx->g = mp_from_integer(2);
 }
 }