WPS: Use only os_get_random() for PIN generation
Remove the fallback dependency on os_random() when generating a WPS pin. This is exceptionally unlikely to ever be called as the call to os_get_random() is unlikely to fail. The intention is to facilitate future removal of os_random() as it uses a low quality PRNG. Signed-off-by: Nick Lowe <nick.lowe@lugatech.com>
This commit is contained in:
parent
f441e5af77
commit
98a516eae8
7 changed files with 36 additions and 16 deletions
|
@ -1627,7 +1627,8 @@ const char * hostapd_wps_ap_pin_random(struct hostapd_data *hapd, int timeout)
|
|||
unsigned int pin;
|
||||
struct wps_ap_pin_data data;
|
||||
|
||||
pin = wps_generate_pin();
|
||||
if (wps_generate_pin(&pin) < 0)
|
||||
return NULL;
|
||||
os_snprintf(data.pin_txt, sizeof(data.pin_txt), "%08u", pin);
|
||||
data.timeout = timeout;
|
||||
hostapd_wps_for_each(hapd, wps_ap_pin_set, &data);
|
||||
|
|
|
@ -837,7 +837,7 @@ int wps_build_credential_wrap(struct wpabuf *msg,
|
|||
|
||||
unsigned int wps_pin_checksum(unsigned int pin);
|
||||
unsigned int wps_pin_valid(unsigned int pin);
|
||||
unsigned int wps_generate_pin(void);
|
||||
int wps_generate_pin(unsigned int *pin);
|
||||
int wps_pin_str_valid(const char *pin);
|
||||
void wps_free_pending_msgs(struct upnp_pending_message *msgs);
|
||||
|
||||
|
|
|
@ -235,20 +235,18 @@ unsigned int wps_pin_valid(unsigned int pin)
|
|||
* wps_generate_pin - Generate a random PIN
|
||||
* Returns: Eight digit PIN (i.e., including the checksum digit)
|
||||
*/
|
||||
unsigned int wps_generate_pin(void)
|
||||
int wps_generate_pin(unsigned int *pin)
|
||||
{
|
||||
unsigned int val;
|
||||
|
||||
/* Generate seven random digits for the PIN */
|
||||
if (random_get_bytes((unsigned char *) &val, sizeof(val)) < 0) {
|
||||
struct os_time now;
|
||||
os_get_time(&now);
|
||||
val = os_random() ^ now.sec ^ now.usec;
|
||||
}
|
||||
if (random_get_bytes((unsigned char *) &val, sizeof(val)) < 0)
|
||||
return -1;
|
||||
val %= 10000000;
|
||||
|
||||
/* Append checksum digit */
|
||||
return val * 10 + wps_pin_checksum(val);
|
||||
*pin = val * 10 + wps_pin_checksum(val);
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue