mirror of
https://git.tartarus.org/simon/putty.git
synced 2025-01-09 09:27:59 +00:00
f39c51f9a7
This gets rid of all those annoying 'win', 'ux' and 'gtk' prefixes which made filenames annoying to type and to tab-complete. Also, as with my other recent renaming sprees, I've taken the opportunity to expand and clarify some of the names so that they're not such cryptic abbreviations.
143 lines
4.1 KiB
C
143 lines
4.1 KiB
C
/*
|
|
* Noise generation for PuTTY's cryptographic random number
|
|
* generator.
|
|
*/
|
|
|
|
#include <stdio.h>
|
|
|
|
#include "putty.h"
|
|
#include "ssh.h"
|
|
#include "storage.h"
|
|
|
|
#include <wincrypt.h>
|
|
|
|
DECL_WINDOWS_FUNCTION(static, BOOL, CryptAcquireContextA,
|
|
(HCRYPTPROV *, LPCTSTR, LPCTSTR, DWORD, DWORD));
|
|
DECL_WINDOWS_FUNCTION(static, BOOL, CryptGenRandom,
|
|
(HCRYPTPROV, DWORD, BYTE *));
|
|
DECL_WINDOWS_FUNCTION(static, BOOL, CryptReleaseContext,
|
|
(HCRYPTPROV, DWORD));
|
|
static HMODULE wincrypt_module = NULL;
|
|
|
|
bool win_read_random(void *buf, unsigned wanted)
|
|
{
|
|
bool toret = false;
|
|
HCRYPTPROV crypt_provider;
|
|
|
|
if (!wincrypt_module) {
|
|
wincrypt_module = load_system32_dll("advapi32.dll");
|
|
GET_WINDOWS_FUNCTION(wincrypt_module, CryptAcquireContextA);
|
|
GET_WINDOWS_FUNCTION(wincrypt_module, CryptGenRandom);
|
|
GET_WINDOWS_FUNCTION(wincrypt_module, CryptReleaseContext);
|
|
}
|
|
|
|
if (wincrypt_module && p_CryptAcquireContextA &&
|
|
p_CryptGenRandom && p_CryptReleaseContext &&
|
|
p_CryptAcquireContextA(&crypt_provider, NULL, NULL, PROV_RSA_FULL,
|
|
CRYPT_VERIFYCONTEXT)) {
|
|
toret = p_CryptGenRandom(crypt_provider, wanted, buf);
|
|
p_CryptReleaseContext(crypt_provider, 0);
|
|
}
|
|
|
|
return toret;
|
|
}
|
|
|
|
/*
|
|
* This function is called once, at PuTTY startup.
|
|
*/
|
|
|
|
void noise_get_heavy(void (*func) (void *, int))
|
|
{
|
|
HANDLE srch;
|
|
WIN32_FIND_DATA finddata;
|
|
DWORD pid;
|
|
char winpath[MAX_PATH + 3];
|
|
BYTE buf[32];
|
|
|
|
GetWindowsDirectory(winpath, sizeof(winpath));
|
|
strcat(winpath, "\\*");
|
|
srch = FindFirstFile(winpath, &finddata);
|
|
if (srch != INVALID_HANDLE_VALUE) {
|
|
do {
|
|
func(&finddata, sizeof(finddata));
|
|
} while (FindNextFile(srch, &finddata));
|
|
FindClose(srch);
|
|
}
|
|
|
|
pid = GetCurrentProcessId();
|
|
func(&pid, sizeof(pid));
|
|
|
|
if (win_read_random(buf, sizeof(buf))) {
|
|
func(buf, sizeof(buf));
|
|
smemclr(buf, sizeof(buf));
|
|
}
|
|
|
|
read_random_seed(func);
|
|
}
|
|
|
|
/*
|
|
* 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(NOISE_SOURCE_FGWINDOW, &w, sizeof(w));
|
|
w = GetCapture();
|
|
random_add_noise(NOISE_SOURCE_CAPTURE, &w, sizeof(w));
|
|
w = GetClipboardOwner();
|
|
random_add_noise(NOISE_SOURCE_CLIPBOARD, &w, sizeof(w));
|
|
z = GetQueueStatus(QS_ALLEVENTS);
|
|
random_add_noise(NOISE_SOURCE_QUEUE, &z, sizeof(z));
|
|
|
|
GetCursorPos(&pt);
|
|
random_add_noise(NOISE_SOURCE_CURSORPOS, &pt, sizeof(pt));
|
|
|
|
GlobalMemoryStatus(&memstat);
|
|
random_add_noise(NOISE_SOURCE_MEMINFO, &memstat, sizeof(memstat));
|
|
|
|
GetThreadTimes(GetCurrentThread(), times, times + 1, times + 2,
|
|
times + 3);
|
|
random_add_noise(NOISE_SOURCE_THREADTIME, ×, sizeof(times));
|
|
GetProcessTimes(GetCurrentProcess(), times, times + 1, times + 2,
|
|
times + 3);
|
|
random_add_noise(NOISE_SOURCE_PROCTIME, ×, 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
|
|
* position passed in.
|
|
*/
|
|
void noise_ultralight(NoiseSourceId id, unsigned long data)
|
|
{
|
|
DWORD wintime;
|
|
LARGE_INTEGER perftime;
|
|
|
|
random_add_noise(id, &data, sizeof(DWORD));
|
|
|
|
wintime = GetTickCount();
|
|
random_add_noise(NOISE_SOURCE_TIME, &wintime, sizeof(DWORD));
|
|
|
|
if (QueryPerformanceCounter(&perftime))
|
|
random_add_noise(NOISE_SOURCE_PERFCOUNT, &perftime, sizeof(perftime));
|
|
}
|
|
|
|
uint64_t prng_reseed_time_ms(void)
|
|
{
|
|
FILETIME ft;
|
|
GetSystemTimeAsFileTime(&ft);
|
|
uint64_t value = ft.dwHighDateTime;
|
|
value = (value << 32) + ft.dwLowDateTime;
|
|
return value / 10000; /* 1 millisecond / 100ns */
|
|
}
|