forked from auracaster/bumble_mirror
Merge pull request #381 from zxzxwu/offload
Support non-directed address generation offload
This commit is contained in:
@@ -21,6 +21,7 @@ import functools
|
||||
import json
|
||||
import asyncio
|
||||
import logging
|
||||
import secrets
|
||||
from contextlib import asynccontextmanager, AsyncExitStack, closing
|
||||
from dataclasses import dataclass
|
||||
from collections.abc import Iterable
|
||||
@@ -994,12 +995,15 @@ class DeviceConfiguration:
|
||||
irk = config.get('irk')
|
||||
if irk:
|
||||
self.irk = bytes.fromhex(irk)
|
||||
else:
|
||||
elif self.address != Address(DEVICE_DEFAULT_ADDRESS):
|
||||
# Construct an IRK from the address bytes
|
||||
# NOTE: this is not secure, but will always give the same IRK for the same
|
||||
# address
|
||||
address_bytes = bytes(self.address)
|
||||
self.irk = (address_bytes * 3)[:16]
|
||||
else:
|
||||
# Fallback - when both IRK and address are not set, randomly generate an IRK.
|
||||
self.irk = secrets.token_bytes(16)
|
||||
|
||||
# Load advertising data
|
||||
advertising_data = config.get('advertising_data')
|
||||
@@ -1581,6 +1585,16 @@ class Device(CompositeEventEmitter):
|
||||
if self.address_resolution_offload:
|
||||
await self.send_command(HCI_LE_Clear_Resolving_List_Command())
|
||||
|
||||
# Add an empty entry for non-directed address generation.
|
||||
await self.send_command(
|
||||
HCI_LE_Add_Device_To_Resolving_List_Command(
|
||||
peer_identity_address_type=Address.ANY.address_type,
|
||||
peer_identity_address=Address.ANY,
|
||||
peer_irk=bytes(16),
|
||||
local_irk=self.irk,
|
||||
)
|
||||
)
|
||||
|
||||
for irk, address in resolving_keys:
|
||||
await self.send_command(
|
||||
HCI_LE_Add_Device_To_Resolving_List_Command(
|
||||
@@ -1681,8 +1695,8 @@ class Device(CompositeEventEmitter):
|
||||
peer_address = target
|
||||
peer_address_type = target.address_type
|
||||
else:
|
||||
peer_address = Address('00:00:00:00:00:00')
|
||||
peer_address_type = Address.PUBLIC_DEVICE_ADDRESS
|
||||
peer_address = Address.ANY
|
||||
peer_address_type = Address.ANY.address_type
|
||||
|
||||
# Set the advertising parameters
|
||||
await self.send_command(
|
||||
|
||||
@@ -1993,10 +1993,8 @@ class Manager(EventEmitter):
|
||||
) -> None:
|
||||
# Store the keys in the key store
|
||||
if self.device.keystore and identity_address is not None:
|
||||
self.device.abort_on(
|
||||
'flush', self.device.update_keys(str(identity_address), keys)
|
||||
)
|
||||
|
||||
# Make sure on_pairing emits after key update.
|
||||
await self.device.update_keys(str(identity_address), keys)
|
||||
# Notify the device
|
||||
self.device.on_pairing(session.connection, identity_address, keys, session.sc)
|
||||
|
||||
|
||||
Reference in New Issue
Block a user