mirror of
https://git.kernel.org/pub/scm/bluetooth/bluez.git
synced 2024-11-26 05:34:23 +08:00
Parse pin codes starting with '$' as hexadecimal encoded strings
If a pin code is retrieved from an agent and the first character is a dollar sign '$', then the pin is decoded as following: - The first character (dollar sign) is stripped from the pin - The rest is parsed as hexadecimal numbers, where each two characters will be converted into a one byte integer. If an odd number of characters follows, then the last character is stripped. Parser is case insensitive. Pins not starting with '$' are parsed as usual. For instance: pin: $0A3e005067 is decoded into a 5 byte pin: decoded: 0x0a 0x3e 0x00 0x50 0x67
This commit is contained in:
parent
90e0b59b97
commit
c70a4afe43
35
src/event.c
35
src/event.c
@ -102,24 +102,53 @@ static gboolean get_adapter_and_device(bdaddr_t *src, bdaddr_t *dst,
|
||||
*
|
||||
*****************************************************************/
|
||||
|
||||
static size_t decode_hex(const char *pin, char *out)
|
||||
{
|
||||
size_t i;
|
||||
|
||||
for (i = 0; i < 16 && pin[i * 2] && pin[i * 2 + 1]; i++)
|
||||
sscanf(&pin[i * 2], "%02hhX", &out[i]);
|
||||
|
||||
return i;
|
||||
}
|
||||
|
||||
static size_t decode_pin(const char *pin, char *out)
|
||||
{
|
||||
size_t len;
|
||||
|
||||
if (!pin)
|
||||
return 0;
|
||||
|
||||
if (pin[0] == '$') {
|
||||
len = decode_hex(&pin[1], out);
|
||||
} else {
|
||||
len = strnlen(pin, 16);
|
||||
memcpy(out, pin, len);
|
||||
}
|
||||
|
||||
return len;
|
||||
}
|
||||
|
||||
static void pincode_cb(struct agent *agent, DBusError *derr,
|
||||
const char *pincode, struct btd_device *device)
|
||||
{
|
||||
struct btd_adapter *adapter = device_get_adapter(device);
|
||||
bdaddr_t dba;
|
||||
int err;
|
||||
size_t len;
|
||||
char rawpin[16];
|
||||
|
||||
device_get_address(device, &dba);
|
||||
|
||||
if (derr) {
|
||||
len = decode_pin(pincode, rawpin);
|
||||
if (derr || !len) {
|
||||
err = btd_adapter_pincode_reply(adapter, &dba, NULL, 0);
|
||||
if (err < 0)
|
||||
goto fail;
|
||||
return;
|
||||
}
|
||||
|
||||
err = btd_adapter_pincode_reply(adapter, &dba, pincode,
|
||||
pincode ? strlen(pincode) : 0);
|
||||
err = btd_adapter_pincode_reply(adapter, &dba, rawpin, len);
|
||||
if (err < 0)
|
||||
goto fail;
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user