Browse Source

Updating code to PuTTY 320bf847

Source commit: 577e986201a579f61294e4b2b3b245524d81b7df
Martin Prikryl 6 years ago
parent
commit
72e76371d2
5 changed files with 51 additions and 18 deletions
  1. 3 0
      source/Putty.cbproj
  2. 5 5
      source/putty/putty.h
  3. 17 4
      source/putty/sshprng.c
  4. 24 5
      source/putty/sshrand.c
  5. 2 4
      source/putty/windows/winnoise.c

+ 3 - 0
source/Putty.cbproj

@@ -269,6 +269,9 @@
 			<BuildOrder>53</BuildOrder>
 			<BuildOrder>31</BuildOrder>
 		</CppCompile>
+		<CppCompile Include="putty\sshprng.c">
+			<BuildOrder>80</BuildOrder>
+		</CppCompile>
 		<CppCompile Include="putty\sshpubk.c">
 			<BuildOrder>56</BuildOrder>
 			<BuildOrder>30</BuildOrder>

+ 5 - 5
source/putty/putty.h

@@ -2159,16 +2159,16 @@ void request_callback_notifications(toplevel_callback_notify_fn_t notify,
 #define FROM_SURROGATES(wch1, wch2) \
     (0x10000 + (((wch1) & 0x3FF) << 10) + ((wch2) & 0x3FF))
 
-#ifdef MPEXT
+#ifdef WINSCP
 extern CRITICAL_SECTION putty_section;
 void putty_initialize();
 void putty_finalize();
 void pktin_free_queue_callback(void *vctx);
-#define MPEXT_PUTTY_SECTION_ENTER EnterCriticalSection(&putty_section);
-#define MPEXT_PUTTY_SECTION_LEAVE LeaveCriticalSection(&putty_section);
+#define WINSCP_PUTTY_SECTION_ENTER EnterCriticalSection(&putty_section);
+#define WINSCP_PUTTY_SECTION_LEAVE LeaveCriticalSection(&putty_section);
 #else
-#define MPEXT_PUTTY_SECTION_ENTER
-#define MPEXT_PUTTY_SECTION_LEAVE
+#define WINSCP_PUTTY_SECTION_ENTER
+#define WINSCP_PUTTY_SECTION_LEAVE
 #endif
 
 #ifdef MPEXT

+ 17 - 4
source/putty/sshprng.c

@@ -124,7 +124,9 @@ prng *prng_new(const ssh_hashalg *hashalg)
     pi->pending_output = snewn(pi->hashalg->hlen, uint8_t);
     pi->pending_output_remaining = 0;
     pi->counter = mp_new(128);
-    for (size_t i = 0; i < NCOLLECTORS; i++)
+    { // WINSCP
+    size_t i; // WINSCP
+    for (i = 0; i < NCOLLECTORS; i++)
         pi->collectors[i] = ssh_hash_new(pi->hashalg);
     pi->until_reseed = 0;
     BinarySink_INIT(&pi->Prng, prng_seed_BinarySink_write);
@@ -132,6 +134,7 @@ prng *prng_new(const ssh_hashalg *hashalg)
     pi->Prng.savesize = pi->hashalg->hlen * 4;
 
     return &pi->Prng;
+    } // WINSCP
 }
 
 void prng_free(prng *pr)
@@ -140,7 +143,9 @@ void prng_free(prng *pr)
 
     sfree(pi->pending_output);
     mp_free(pi->counter);
-    for (size_t i = 0; i < NCOLLECTORS; i++)
+    { // WINSCP
+    size_t i; // WINSCP
+    for (i = 0; i < NCOLLECTORS; i++)
         ssh_hash_free(pi->collectors[i]);
     if (pi->generator)
         ssh_hash_free(pi->generator);
@@ -148,6 +153,7 @@ void prng_free(prng *pr)
         ssh_hash_free(pi->keymaker);
     smemclr(pi, sizeof(*pi));
     sfree(pi);
+    } // WINSCP
 }
 
 void prng_seed_begin(prng *pr)
@@ -230,6 +236,7 @@ void prng_read(prng *pr, void *vout, size_t size)
 
     prngdebug("prng_read %zu\n", size);
 
+    { // WINSCP
     uint8_t *out = (uint8_t *)vout;
     for (; size > 0; size--) {
         if (pi->pending_output_remaining == 0)
@@ -241,13 +248,14 @@ void prng_read(prng *pr, void *vout, size_t size)
 
     prng_seed_begin(&pi->Prng);
     prng_seed_finish(&pi->Prng);
+    } // WINSCP
 }
 
 void prng_add_entropy(prng *pr, unsigned source_id, ptrlen data)
 {
     prng_impl *pi = container_of(pr, prng_impl, Prng);
 
-    assert(source_id < NOISE_MAX_SOURCES);
+    pinitassert(source_id < NOISE_MAX_SOURCES);
     uint32_t counter = ++pi->source_counters[source_id];
 
     size_t index = 0;
@@ -269,9 +277,12 @@ void prng_add_entropy(prng *pr, unsigned source_id, ptrlen data)
         prng_reseed_time_ms() - pi->last_reseed_time >= 100) {
         prng_seed_begin(&pi->Prng);
 
+        { // WINSCP
         uint32_t reseed_index = ++pi->reseeds;
         prngdebug("prng entropy reseed #%"PRIu32"\n", reseed_index);
-        for (size_t i = 0; i < NCOLLECTORS; i++) {
+        { // WINSCP
+        size_t i; // WINSCP
+        for (i = 0; i < NCOLLECTORS; i++) {
             prngdebug("emptying collector %zu\n", i);
             ssh_hash_final(pi->collectors[i], pi->pending_output);
             put_data(&pi->Prng, pi->pending_output, pi->hashalg->hlen);
@@ -282,5 +293,7 @@ void prng_add_entropy(prng *pr, unsigned source_id, ptrlen data)
         }
 
         prng_seed_finish(&pi->Prng);
+        } // WINSCP
+        } // WINSCP
     }
 }

+ 24 - 5
source/putty/sshrand.c

@@ -36,25 +36,32 @@ static unsigned long next_noise_collection;
 
 void random_add_noise(NoiseSourceId source, const void *noise, int length)
 {
+    WINSCP_PUTTY_SECTION_ENTER;
     if (!random_active)
 	return;
 
     prng_add_entropy(global_prng, source, make_ptrlen(noise, length));
+    WINSCP_PUTTY_SECTION_LEAVE;
 }
 
 static void random_timer(void *ctx, unsigned long now)
 {
+    unreachable_internal(); // WINSCP
+    WINSCP_PUTTY_SECTION_ENTER;
     if (random_active > 0 && now == next_noise_collection) {
 	noise_regular();
 	next_noise_collection =
 	    schedule_timer(NOISE_REGULAR_INTERVAL, random_timer,
                            &random_timer_ctx);
     }
+    WINSCP_PUTTY_SECTION_LEAVE;
 }
 
 static void random_seed_callback(void *noise, int length)
 {
+    WINSCP_PUTTY_SECTION_ENTER;
     put_data(global_prng, noise, length);
+    WINSCP_PUTTY_SECTION_LEAVE;
 }
 
 static void random_create(const ssh_hashalg *hashalg)
@@ -80,29 +87,37 @@ static void random_create(const ssh_hashalg *hashalg)
 
 void random_ref(void)
 {
+    WINSCP_PUTTY_SECTION_ENTER;
     if (!random_active++)
         random_create(&ssh_sha256);
+    WINSCP_PUTTY_SECTION_LEAVE;
 }
 
 void random_setup_special()
 {
+    unreachable_internal(); // used by PuTTYgen only
+    WINSCP_PUTTY_SECTION_ENTER;
     random_active++;
     random_create(&ssh_sha512);
+    WINSCP_PUTTY_SECTION_LEAVE;
 }
 
 void random_reseed(ptrlen seed)
 {
+    unreachable_internal(); // used by PuTTYgen only
+    WINSCP_PUTTY_SECTION_ENTER;
     prng_seed_begin(global_prng);
     put_datapl(global_prng, seed);
     prng_seed_finish(global_prng);
+    WINSCP_PUTTY_SECTION_LEAVE;
 }
 
 void random_unref(void)
 {
-    MPEXT_PUTTY_SECTION_ENTER;
+    WINSCP_PUTTY_SECTION_ENTER;
     assert(random_active > 0);
     if (random_active == 1) {
-        #ifndef MPEXT
+        #ifndef WINSCP
         // We control this on our own in PuttyFinalize()
         random_save_seed();
         #endif
@@ -111,23 +126,27 @@ void random_unref(void)
         global_prng = NULL;
     }
     random_active--;
-    MPEXT_PUTTY_SECTION_LEAVE;
+    WINSCP_PUTTY_SECTION_LEAVE;
 }
 
 void random_read(void *buf, size_t size)
 {
-    MPEXT_PUTTY_SECTION_ENTER;
+    WINSCP_PUTTY_SECTION_ENTER;
     assert(random_active > 0);
     prng_read(global_prng, buf, size);
-    MPEXT_PUTTY_SECTION_LEAVE;
+    WINSCP_PUTTY_SECTION_LEAVE;
 }
 
 void random_get_savedata(void **data, int *len)
 {
+    WINSCP_PUTTY_SECTION_ENTER; // though called from our finalizer, when the app is single threaded only
+    { // WINSCP
     void *buf = snewn(global_prng->savesize, char);
     random_read(buf, global_prng->savesize);
     *len = global_prng->savesize;
     *data = buf;
+    } // WINSCP
+    WINSCP_PUTTY_SECTION_LEAVE;
 }
 
 #endif /* FUZZING */

+ 2 - 4
source/putty/windows/winnoise.c

@@ -100,7 +100,6 @@ void noise_regular(void)
     MEMORYSTATUS memstat;
     FILETIME times[4];
 
-    MPEXT_PUTTY_SECTION_ENTER;
     w = GetForegroundWindow();
     random_add_noise(NOISE_SOURCE_FGWINDOW, &w, sizeof(w));
     w = GetCapture();
@@ -122,7 +121,6 @@ void noise_regular(void)
     GetProcessTimes(GetCurrentProcess(), times, times + 1, times + 2,
 		    times + 3);
     random_add_noise(NOISE_SOURCE_PROCTIME, &times, sizeof(times));
-    MPEXT_PUTTY_SECTION_LEAVE;
 }
 
 /*
@@ -136,7 +134,6 @@ void noise_ultralight(NoiseSourceId id, unsigned long data)
     DWORD wintime;
     LARGE_INTEGER perftime;
 
-    MPEXT_PUTTY_SECTION_ENTER;
     random_add_noise(id, &data, sizeof(DWORD));
 
     wintime = GetTickCount();
@@ -144,14 +141,15 @@ void noise_ultralight(NoiseSourceId id, unsigned long data)
 
     if (QueryPerformanceCounter(&perftime))
 	random_add_noise(NOISE_SOURCE_PERFCOUNT, &perftime, sizeof(perftime));
-    MPEXT_PUTTY_SECTION_LEAVE;
 }
 
 uint64_t prng_reseed_time_ms(void)
 {
     FILETIME ft;
     GetSystemTimeAsFileTime(&ft);
+    { // WINSCP
     uint64_t value = ft.dwHighDateTime;
     value = (value << 32) + ft.dwLowDateTime;
     return value / 10000;              /* 1 millisecond / 100ns */
+    } // WINSCP
 }