OSDN Git Service

Change OpenSSL context mode flags.
[ffftp/ffftp.git] / putty / UNIX / UXNOISE.C
1 /*\r
2  * Noise generation for PuTTY's cryptographic random number\r
3  * generator.\r
4  */\r
5 \r
6 #include <stdio.h>\r
7 #include <stdlib.h>\r
8 #include <errno.h>\r
9 \r
10 #include <fcntl.h>\r
11 #include <unistd.h>\r
12 #include <sys/time.h>\r
13 #include <sys/resource.h>\r
14 \r
15 #include "putty.h"\r
16 #include "ssh.h"\r
17 #include "storage.h"\r
18 \r
19 static int read_dev_urandom(char *buf, int len)\r
20 {\r
21     int fd;\r
22     int ngot, ret;\r
23 \r
24     fd = open("/dev/urandom", O_RDONLY);\r
25     if (fd < 0)\r
26         return 0;\r
27 \r
28     ngot = 0;\r
29     while (ngot < len) {\r
30         ret = read(fd, buf+ngot, len-ngot);\r
31         if (ret < 0) {\r
32             close(fd);\r
33             return 0;\r
34         }\r
35         ngot += ret;\r
36     }\r
37 \r
38     close(fd);\r
39 \r
40     return 1;\r
41 }\r
42 \r
43 /*\r
44  * This function is called once, at PuTTY startup. It will do some\r
45  * slightly silly things such as fetching an entire process listing\r
46  * and scanning /tmp, load the saved random seed from disk, and\r
47  * also read 32 bytes out of /dev/urandom.\r
48  */\r
49 \r
50 void noise_get_heavy(void (*func) (void *, int))\r
51 {\r
52     char buf[512];\r
53     FILE *fp;\r
54     int ret;\r
55     int got_dev_urandom = 0;\r
56 \r
57     if (read_dev_urandom(buf, 32)) {\r
58         got_dev_urandom = 1;\r
59         func(buf, 32);\r
60     }\r
61 \r
62     fp = popen("ps -axu 2>/dev/null", "r");\r
63     if (fp) {\r
64         while ( (ret = fread(buf, 1, sizeof(buf), fp)) > 0)\r
65             func(buf, ret);\r
66         pclose(fp);\r
67     } else if (!got_dev_urandom) {\r
68         fprintf(stderr, "popen: %s\n"\r
69                 "Unable to access fallback entropy source\n", strerror(errno));\r
70         exit(1);\r
71     }\r
72 \r
73     fp = popen("ls -al /tmp 2>/dev/null", "r");\r
74     if (fp) {\r
75         while ( (ret = fread(buf, 1, sizeof(buf), fp)) > 0)\r
76             func(buf, ret);\r
77         pclose(fp);\r
78     } else if (!got_dev_urandom) {\r
79         fprintf(stderr, "popen: %s\n"\r
80                 "Unable to access fallback entropy source\n", strerror(errno));\r
81         exit(1);\r
82     }\r
83 \r
84     read_random_seed(func);\r
85     random_save_seed();\r
86 }\r
87 \r
88 void random_save_seed(void)\r
89 {\r
90     int len;\r
91     void *data;\r
92 \r
93     if (random_active) {\r
94         random_get_savedata(&data, &len);\r
95         write_random_seed(data, len);\r
96         sfree(data);\r
97     }\r
98 }\r
99 \r
100 /*\r
101  * This function is called every time the random pool needs\r
102  * stirring, and will acquire the system time.\r
103  */\r
104 void noise_get_light(void (*func) (void *, int))\r
105 {\r
106     struct timeval tv;\r
107     gettimeofday(&tv, NULL);\r
108     func(&tv, sizeof(tv));\r
109 }\r
110 \r
111 /*\r
112  * This function is called on a timer, and grabs as much changeable\r
113  * system data as it can quickly get its hands on.\r
114  */\r
115 void noise_regular(void)\r
116 {\r
117     int fd;\r
118     int ret;\r
119     char buf[512];\r
120     struct rusage rusage;\r
121 \r
122     if ((fd = open("/proc/meminfo", O_RDONLY)) >= 0) {\r
123         while ( (ret = read(fd, buf, sizeof(buf))) > 0)\r
124             random_add_noise(buf, ret);\r
125         close(fd);\r
126     }\r
127     if ((fd = open("/proc/stat", O_RDONLY)) >= 0) {\r
128         while ( (ret = read(fd, buf, sizeof(buf))) > 0)\r
129             random_add_noise(buf, ret);\r
130         close(fd);\r
131     }\r
132     getrusage(RUSAGE_SELF, &rusage);\r
133     random_add_noise(&rusage, sizeof(rusage));\r
134 }\r
135 \r
136 /*\r
137  * This function is called on every keypress or mouse move, and\r
138  * will add the current time to the noise pool. It gets the scan\r
139  * code or mouse position passed in, and adds that too.\r
140  */\r
141 void noise_ultralight(unsigned long data)\r
142 {\r
143     struct timeval tv;\r
144     gettimeofday(&tv, NULL);\r
145     random_add_noise(&tv, sizeof(tv));\r
146     random_add_noise(&data, sizeof(data));\r
147 }\r