X-Git-Url: https://git.distorted.org.uk/u/mdw/putty/blobdiff_plain/de3df031561a6109e98e18cafd336c82600fac77..7440fd4419acfc9c784f142fb9dee3e64c9a18c2:/noise.c diff --git a/noise.c b/noise.c index 383e6c33..00719bbd 100644 --- a/noise.c +++ b/noise.c @@ -3,46 +3,17 @@ * generator. */ -#include #include #include "putty.h" #include "ssh.h" - -static char seedpath[2*MAX_PATH+10] = "\0"; +#include "storage.h" /* - * Find the random seed file path and store it in `seedpath'. + * GetSystemPowerStatus function. */ -static void get_seedpath(void) { - HKEY rkey; - DWORD type, size; - - size = sizeof(seedpath); - - if (RegOpenKey(HKEY_CURRENT_USER, PUTTY_REG_POS, &rkey)==ERROR_SUCCESS) { - int ret = RegQueryValueEx(rkey, "RandSeedFile", - 0, &type, seedpath, &size); - if (ret != ERROR_SUCCESS || type != REG_SZ) - seedpath[0] = '\0'; - RegCloseKey(rkey); - } else - seedpath[0] = '\0'; - - if (!seedpath[0]) { - int len, ret; - - len = GetEnvironmentVariable("HOMEDRIVE", seedpath, sizeof(seedpath)); - ret = GetEnvironmentVariable("HOMEPATH", seedpath+len, - sizeof(seedpath)-len); - if (ret == 0) { /* probably win95; store in \WINDOWS */ - GetWindowsDirectory(seedpath, sizeof(seedpath)); - len = strlen(seedpath); - } else - len += ret; - strcpy(seedpath+len, "\\PUTTY.RND"); - } -} +typedef BOOL(WINAPI * gsps_t) (LPSYSTEM_POWER_STATUS); +static gsps_t gsps; /* * This function is called once, at PuTTY startup, and will do some @@ -50,11 +21,12 @@ static void get_seedpath(void) { * free space and a process snapshot. */ -void noise_get_heavy(void (*func) (void *, int)) { +void noise_get_heavy(void (*func) (void *, int)) +{ HANDLE srch; - HANDLE seedf; WIN32_FIND_DATA finddata; - char winpath[MAX_PATH+3]; + char winpath[MAX_PATH + 3]; + HMODULE mod; GetWindowsDirectory(winpath, sizeof(winpath)); strcat(winpath, "\\*"); @@ -66,63 +38,36 @@ void noise_get_heavy(void (*func) (void *, int)) { FindClose(srch); } - if (!seedpath[0]) - get_seedpath(); - - seedf = CreateFile(seedpath, GENERIC_READ, - FILE_SHARE_READ | FILE_SHARE_WRITE, - NULL, OPEN_EXISTING, 0, NULL); - - if (seedf != INVALID_HANDLE_VALUE) { - while (1) { - char buf[1024]; - DWORD len; + read_random_seed(func); + /* Update the seed immediately, in case another instance uses it. */ + random_save_seed(); - if (ReadFile(seedf, buf, sizeof(buf), &len, NULL) && len) - func(buf, len); - else - break; - } - CloseHandle(seedf); + gsps = NULL; + mod = GetModuleHandle("KERNEL32"); + if (mod) { + gsps = (gsps_t) GetProcAddress(mod, "GetSystemPowerStatus"); } } -void random_save_seed(void) { - HANDLE seedf; - - if (!seedpath[0]) - get_seedpath(); - - seedf = CreateFile(seedpath, GENERIC_WRITE, 0, - NULL, CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL); - - if (seedf != INVALID_HANDLE_VALUE) { - int len; - DWORD lenwritten; - void *data; +void random_save_seed(void) +{ + int len; + void *data; + if (random_active) { random_get_savedata(&data, &len); - WriteFile(seedf, data, len, &lenwritten, NULL); - CloseHandle(seedf); + write_random_seed(data, len); + sfree(data); } } /* - * This function is called from `putty -cleanup'. It removes the - * random seed file. - */ -void random_destroy_seed(void) { - if (!seedpath[0]) - get_seedpath(); - remove(seedpath); -} - -/* * This function is called every time the random pool needs * stirring, and will acquire the system time in all available * forms and the battery status. */ -void noise_get_light(void (*func) (void *, int)) { +void noise_get_light(void (*func) (void *, int)) +{ SYSTEMTIME systime; DWORD adjust[2]; BOOL rubbish; @@ -134,10 +79,50 @@ void noise_get_light(void (*func) (void *, int)) { GetSystemTimeAdjustment(&adjust[0], &adjust[1], &rubbish); func(&adjust, sizeof(adjust)); -#ifndef WIN32S_COMPAT - if (GetSystemPowerStatus(&pwrstat)) - func(&pwrstat, sizeof(pwrstat)); -#endif + /* + * Call GetSystemPowerStatus if present. + */ + if (gsps) { + if (gsps(&pwrstat)) + func(&pwrstat, sizeof(pwrstat)); + } +} + +/* + * 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(×, sizeof(times)); + GetProcessTimes(GetCurrentProcess(), times, times + 1, times + 2, + times + 3); + random_add_noise(×, sizeof(times)); } /* @@ -146,7 +131,8 @@ void noise_get_light(void (*func) (void *, int)) { * counter to the noise pool. It gets the scan code or mouse * position passed in. */ -void noise_ultralight(DWORD data) { +void noise_ultralight(unsigned long data) +{ DWORD wintime; LARGE_INTEGER perftime;