mirror of
https://github.com/vanhoefm/fragattacks.git
synced 2024-11-28 18:28:23 -05:00
WPS: Added helper functions for generating and validating PINs
This commit is contained in:
parent
b01c18a8ef
commit
e05716d0b0
@ -133,4 +133,8 @@ int wps_registrar_button_pushed(struct wps_registrar *reg);
|
||||
void wps_registrar_probe_req_rx(struct wps_registrar *reg, const u8 *addr,
|
||||
const struct wpabuf *wps_data);
|
||||
|
||||
unsigned int wps_pin_checksum(unsigned int pin);
|
||||
unsigned int wps_pin_valid(unsigned int pin);
|
||||
unsigned int wps_generate_pin(void);
|
||||
|
||||
#endif /* WPS_H */
|
||||
|
@ -247,3 +247,54 @@ struct wpabuf * wps_decrypt_encr_settings(struct wps_data *wps, const u8 *encr,
|
||||
|
||||
return decrypted;
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* wps_pin_checksum - Compute PIN checksum
|
||||
* @pin: Seven digit PIN (i.e., eight digit PIN without the checksum digit)
|
||||
* Returns: Checksum digit
|
||||
*/
|
||||
unsigned int wps_pin_checksum(unsigned int pin)
|
||||
{
|
||||
unsigned int accum = 0;
|
||||
while (pin) {
|
||||
accum += 3 * (pin % 10);
|
||||
pin /= 10;
|
||||
accum += pin % 10;
|
||||
pin /= 10;
|
||||
}
|
||||
|
||||
return (10 - accum % 10) % 10;
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* wps_pin_valid - Check whether a PIN has a valid checksum
|
||||
* @pin: Eight digit PIN (i.e., including the checksum digit)
|
||||
* Returns: 1 if checksum digit is valid, or 0 if not
|
||||
*/
|
||||
unsigned int wps_pin_valid(unsigned int pin)
|
||||
{
|
||||
return wps_pin_checksum(pin / 10) == (pin % 10);
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* wps_generate_pin - Generate a random PIN
|
||||
* Returns: Eight digit PIN (i.e., including the checksum digit)
|
||||
*/
|
||||
unsigned int wps_generate_pin(void)
|
||||
{
|
||||
unsigned int val;
|
||||
|
||||
/* Generate seven random digits for the PIN */
|
||||
if (os_get_random((unsigned char *) &val, sizeof(val)) < 0) {
|
||||
struct os_time now;
|
||||
os_get_time(&now);
|
||||
val = os_random() ^ now.sec ^ now.usec;
|
||||
}
|
||||
val %= 10000000;
|
||||
|
||||
/* Append checksum digit */
|
||||
return val * 10 + wps_pin_checksum(val);
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user