From 527bc32bae0f832b86ab405816ed5af81d544136 Mon Sep 17 00:00:00 2001 From: Josh Wu Date: Sun, 24 Dec 2023 18:11:37 +0800 Subject: [PATCH] Support non-directed address generation offload --- bumble/device.py | 21 ++++++++++++++------- bumble/smp.py | 6 ++---- setup.cfg | 2 +- 3 files changed, 17 insertions(+), 12 deletions(-) diff --git a/bumble/device.py b/bumble/device.py index 3d4b59a29..19043f7a6 100644 --- a/bumble/device.py +++ b/bumble/device.py @@ -21,6 +21,7 @@ import json import asyncio import logging +import secrets from contextlib import asynccontextmanager, AsyncExitStack, closing from dataclasses import dataclass from collections.abc import Iterable @@ -996,11 +997,7 @@ def load_from_dict(self, config: Dict[str, Any]) -> None: if irk: self.irk = bytes.fromhex(irk) else: - # 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] + self.irk = secrets.token_bytes(16) # Load advertising data advertising_data = config.get('advertising_data') @@ -1582,6 +1579,16 @@ async def refresh_resolving_list(self) -> None: 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( @@ -1682,8 +1689,8 @@ async def start_legacy_advertising( 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( diff --git a/bumble/smp.py b/bumble/smp.py index b2d980621..73fd439ec 100644 --- a/bumble/smp.py +++ b/bumble/smp.py @@ -1993,10 +1993,8 @@ async def on_pairing( ) -> 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) diff --git a/setup.cfg b/setup.cfg index 123d83824..ddca5008d 100644 --- a/setup.cfg +++ b/setup.cfg @@ -99,7 +99,7 @@ development = types-protobuf >= 4.21.0 avatar = pandora-avatar == 0.0.5 - rootcanal == 1.4.0 ; python_version>='3.10' + rootcanal == 1.6.0 ; python_version>='3.10' documentation = mkdocs >= 1.4.0 mkdocs-material >= 8.5.6