uClibc: Deactivate oversized thread stack cache
[openwrt.git] / package / network / services / hostapd / patches / 500-random_pool_add_kernel.patch
1 --- a/src/crypto/random.c
2 +++ b/src/crypto/random.c
3 @@ -25,6 +25,7 @@
4  #include "utils/includes.h"
5  #ifdef __linux__
6  #include <fcntl.h>
7 +#include <sys/stat.h>
8  #endif /* __linux__ */
9  
10  #include "utils/common.h"
11 @@ -33,6 +34,8 @@
12  #include "sha1.h"
13  #include "random.h"
14  
15 +#define RANDOM_STAMPFILE "/var/run/.random_available"
16 +
17  #define POOL_WORDS 32
18  #define POOL_WORDS_MASK (POOL_WORDS - 1)
19  #define POOL_TAP1 26
20 @@ -43,6 +46,8 @@
21  #define EXTRACT_LEN 16
22  #define MIN_READY_MARK 2
23  
24 +#ifndef CONFIG_NO_RANDOM_POOL
25 +
26  static u32 pool[POOL_WORDS];
27  static unsigned int input_rotate = 0;
28  static unsigned int pool_pos = 0;
29 @@ -123,7 +128,7 @@ static void random_extract(u8 *out)
30  }
31  
32  
33 -void random_add_randomness(const void *buf, size_t len)
34 +static void random_pool_add_randomness(const void *buf, size_t len)
35  {
36         struct os_time t;
37         static unsigned int count = 0;
38 @@ -213,16 +218,22 @@ int random_get_bytes(void *buf, size_t l
39  int random_pool_ready(void)
40  {
41  #ifdef __linux__
42 +       struct stat st;
43         int fd;
44         ssize_t res;
45  
46 +       if (stat(RANDOM_STAMPFILE, &st) == 0)
47 +               return 1;
48 +
49         /*
50          * Make sure that there is reasonable entropy available before allowing
51          * some key derivation operations to proceed.
52          */
53  
54 -       if (dummy_key_avail == sizeof(dummy_key))
55 +       if (dummy_key_avail == sizeof(dummy_key)) {
56 +               random_mark_pool_ready();
57                 return 1; /* Already initialized - good to continue */
58 +       }
59  
60         /*
61          * Try to fetch some more data from the kernel high quality
62 @@ -257,6 +268,7 @@ int random_pool_ready(void)
63         if (dummy_key_avail == sizeof(dummy_key)) {
64                 if (own_pool_ready < MIN_READY_MARK)
65                         own_pool_ready = MIN_READY_MARK;
66 +               random_mark_pool_ready();
67                 random_write_entropy();
68                 return 1;
69         }
70 @@ -269,6 +281,7 @@ int random_pool_ready(void)
71             total_collected + 10 * own_pool_ready > MIN_COLLECT_ENTROPY) {
72                 wpa_printf(MSG_INFO, "random: Allow operation to proceed "
73                            "based on internal entropy");
74 +               random_mark_pool_ready();
75                 return 1;
76         }
77  
78 @@ -284,10 +297,16 @@ int random_pool_ready(void)
79  
80  void random_mark_pool_ready(void)
81  {
82 +       int fd;
83 +
84         own_pool_ready++;
85         wpa_printf(MSG_DEBUG, "random: Mark internal entropy pool to be "
86                    "ready (count=%u/%u)", own_pool_ready, MIN_READY_MARK);
87         random_write_entropy();
88 +
89 +       fd = open(RANDOM_STAMPFILE, O_CREAT | O_WRONLY | O_EXCL | O_NOFOLLOW, 0600);
90 +       if (fd >= 0)
91 +               close(fd);
92  }
93  
94  
95 @@ -444,3 +463,22 @@ void random_deinit(void)
96         os_free(random_entropy_file);
97         random_entropy_file = NULL;
98  }
99 +
100 +#endif /* CONFIG_NO_RANDOM_POOL */
101 +
102 +
103 +void random_add_randomness(const void *buf, size_t len)
104 +{
105 +#ifdef __linux__
106 +       int fd;
107 +
108 +       fd = open("/dev/random", O_RDWR);
109 +       if (fd >= 0) {
110 +               write(fd, buf, len);
111 +               close(fd);
112 +       }
113 +#endif
114 +#ifndef CONFIG_NO_RANDOM_POOL
115 +       random_pool_add_randomness(buf, len);
116 +#endif
117 +}
118 --- a/wpa_supplicant/Makefile
119 +++ b/wpa_supplicant/Makefile
120 @@ -1236,9 +1236,8 @@ endif
121  
122  ifdef CONFIG_NO_RANDOM_POOL
123  CFLAGS += -DCONFIG_NO_RANDOM_POOL
124 -else
125 -OBJS += ../src/crypto/random.o
126  endif
127 +OBJS += ../src/crypto/random.o
128  
129  ifdef CONFIG_CTRL_IFACE
130  ifeq ($(CONFIG_CTRL_IFACE), y)
131 --- a/wpa_supplicant/Android.mk
132 +++ b/wpa_supplicant/Android.mk
133 @@ -1208,9 +1208,8 @@ endif
134  
135  ifdef CONFIG_NO_RANDOM_POOL
136  L_CFLAGS += -DCONFIG_NO_RANDOM_POOL
137 -else
138 -OBJS += src/crypto/random.c
139  endif
140 +OBJS += src/crypto/random.c
141  
142  ifdef CONFIG_CTRL_IFACE
143  ifeq ($(CONFIG_CTRL_IFACE), y)
144 --- a/hostapd/Android.mk
145 +++ b/hostapd/Android.mk
146 @@ -785,12 +785,12 @@ endif
147  ifdef CONFIG_NO_RANDOM_POOL
148  L_CFLAGS += -DCONFIG_NO_RANDOM_POOL
149  else
150 -OBJS += src/crypto/random.c
151 -HOBJS += src/crypto/random.c
152  HOBJS += src/utils/eloop.c
153  HOBJS += $(SHA1OBJS)
154  HOBJS += src/crypto/md5.c
155  endif
156 +OBJS += src/crypto/random.c
157 +HOBJS += src/crypto/random.c
158  
159  ifdef CONFIG_RADIUS_SERVER
160  L_CFLAGS += -DRADIUS_SERVER
161 --- a/hostapd/Makefile
162 +++ b/hostapd/Makefile
163 @@ -755,12 +755,12 @@ endif
164  ifdef CONFIG_NO_RANDOM_POOL
165  CFLAGS += -DCONFIG_NO_RANDOM_POOL
166  else
167 -OBJS += ../src/crypto/random.o
168 -HOBJS += ../src/crypto/random.o
169  HOBJS += ../src/utils/eloop.o
170  HOBJS += $(SHA1OBJS)
171  HOBJS += ../src/crypto/md5.o
172  endif
173 +OBJS += ../src/crypto/random.o
174 +HOBJS += ../src/crypto/random.o
175  
176  ifdef CONFIG_RADIUS_SERVER
177  CFLAGS += -DRADIUS_SERVER