]> asedeno.scripts.mit.edu Git - PuTTY.git/blob - noise.c
Remove GetSystemPowerStatus() - should resolve hard-hangs
[PuTTY.git] / noise.c
1 /*
2  * Noise generation for PuTTY's cryptographic random number
3  * generator.
4  */
5
6 #include <stdio.h>
7
8 #include "putty.h"
9 #include "ssh.h"
10 #include "storage.h"
11
12 /*
13  * This function is called once, at PuTTY startup, and will do some
14  * seriously silly things like listing directories and getting disk
15  * free space and a process snapshot.
16  */
17
18 void noise_get_heavy(void (*func) (void *, int))
19 {
20     HANDLE srch;
21     WIN32_FIND_DATA finddata;
22     char winpath[MAX_PATH + 3];
23
24     GetWindowsDirectory(winpath, sizeof(winpath));
25     strcat(winpath, "\\*");
26     srch = FindFirstFile(winpath, &finddata);
27     if (srch != INVALID_HANDLE_VALUE) {
28         do {
29             func(&finddata, sizeof(finddata));
30         } while (FindNextFile(srch, &finddata));
31         FindClose(srch);
32     }
33
34     read_random_seed(func);
35     /* Update the seed immediately, in case another instance uses it. */
36     random_save_seed();
37 }
38
39 void random_save_seed(void)
40 {
41     int len;
42     void *data;
43
44     if (random_active) {
45         random_get_savedata(&data, &len);
46         write_random_seed(data, len);
47         sfree(data);
48     }
49 }
50
51 /*
52  * This function is called every time the random pool needs
53  * stirring, and will acquire the system time in all available
54  * forms and the battery status.
55  */
56 void noise_get_light(void (*func) (void *, int))
57 {
58     SYSTEMTIME systime;
59     DWORD adjust[2];
60     BOOL rubbish;
61     SYSTEM_POWER_STATUS pwrstat;
62
63     GetSystemTime(&systime);
64     func(&systime, sizeof(systime));
65
66     GetSystemTimeAdjustment(&adjust[0], &adjust[1], &rubbish);
67     func(&adjust, sizeof(adjust));
68 }
69
70 /*
71  * This function is called on a timer, and it will monitor
72  * frequently changing quantities such as the state of physical and
73  * virtual memory, the state of the process's message queue, which
74  * window is in the foreground, which owns the clipboard, etc.
75  */
76 void noise_regular(void)
77 {
78     HWND w;
79     DWORD z;
80     POINT pt;
81     MEMORYSTATUS memstat;
82     FILETIME times[4];
83
84     w = GetForegroundWindow();
85     random_add_noise(&w, sizeof(w));
86     w = GetCapture();
87     random_add_noise(&w, sizeof(w));
88     w = GetClipboardOwner();
89     random_add_noise(&w, sizeof(w));
90     z = GetQueueStatus(QS_ALLEVENTS);
91     random_add_noise(&z, sizeof(z));
92
93     GetCursorPos(&pt);
94     random_add_noise(&pt, sizeof(pt));
95
96     GlobalMemoryStatus(&memstat);
97     random_add_noise(&memstat, sizeof(memstat));
98
99     GetThreadTimes(GetCurrentThread(), times, times + 1, times + 2,
100                    times + 3);
101     random_add_noise(&times, sizeof(times));
102     GetProcessTimes(GetCurrentProcess(), times, times + 1, times + 2,
103                     times + 3);
104     random_add_noise(&times, sizeof(times));
105 }
106
107 /*
108  * This function is called on every keypress or mouse move, and
109  * will add the current Windows time and performance monitor
110  * counter to the noise pool. It gets the scan code or mouse
111  * position passed in.
112  */
113 void noise_ultralight(unsigned long data)
114 {
115     DWORD wintime;
116     LARGE_INTEGER perftime;
117
118     random_add_noise(&data, sizeof(DWORD));
119
120     wintime = GetTickCount();
121     random_add_noise(&wintime, sizeof(DWORD));
122
123     if (QueryPerformanceCounter(&perftime))
124         random_add_noise(&perftime, sizeof(perftime));
125 }