Improved entropy gathering.
[u/mdw/putty] / noise.c
diff --git a/noise.c b/noise.c
index 3be3c06..c5966a7 100644 (file)
--- a/noise.c
+++ b/noise.c
@@ -14,7 +14,7 @@
  * GetSystemPowerStatus function.
  */
 typedef BOOL (WINAPI *gsps_t)(LPSYSTEM_POWER_STATUS);
-gsps_t gsps;
+static gsps_t gsps;
 
 /*
  * This function is called once, at PuTTY startup, and will do some
@@ -44,7 +44,6 @@ void noise_get_heavy(void (*func) (void *, int)) {
     mod = GetModuleHandle("KERNEL32");
     if (mod) {
         gsps = (gsps_t)GetProcAddress(mod, "GetSystemPowerStatus");
-        debug(("got gsps=%p\n", gsps));
     }
 }
 
@@ -83,6 +82,34 @@ void noise_get_light(void (*func) (void *, int)) {
 }
 
 /*
+ * This function is called on a timer, and it will monitor
+ * frequently changing quantities such as the state of physical and
+ * virtual memory, the state of the process's message queue, which
+ * window is in the foreground, which owns the clipboard, etc.
+ */
+void noise_regular(void) {
+    HWND w;
+    DWORD z;
+    POINT pt;
+    MEMORYSTATUS memstat;
+    FILETIME times[4];
+
+    w = GetForegroundWindow(); random_add_noise(&w, sizeof(w));
+    w = GetCapture(); random_add_noise(&w, sizeof(w));
+    w = GetClipboardOwner(); random_add_noise(&w, sizeof(w));
+    z = GetQueueStatus(QS_ALLEVENTS); random_add_noise(&z, sizeof(z));
+
+    GetCursorPos(&pt); random_add_noise(&pt, sizeof(pt));
+
+    GlobalMemoryStatus(&memstat); random_add_noise(&memstat, sizeof(memstat));
+
+    GetThreadTimes(GetCurrentThread(), times, times+1, times+2, times+3);
+    random_add_noise(&times, sizeof(times));
+    GetProcessTimes(GetCurrentProcess(), times, times+1, times+2, times+3);
+    random_add_noise(&times, sizeof(times));
+}
+
+/*
  * This function is called on every keypress or mouse move, and
  * will add the current Windows time and performance monitor
  * counter to the noise pool. It gets the scan code or mouse