Skip to content

Commit

Permalink
Support non-directed address generation offload
Browse files Browse the repository at this point in the history
  • Loading branch information
zxzxwu committed Jan 26, 2024
1 parent 2920f05 commit 527bc32
Show file tree
Hide file tree
Showing 3 changed files with 17 additions and 12 deletions.
21 changes: 14 additions & 7 deletions bumble/device.py
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down Expand Up @@ -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')
Expand Down Expand Up @@ -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(
Expand Down Expand Up @@ -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(
Expand Down
6 changes: 2 additions & 4 deletions bumble/smp.py
Original file line number Diff line number Diff line change
Expand Up @@ -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)

Expand Down
2 changes: 1 addition & 1 deletion setup.cfg
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down

0 comments on commit 527bc32

Please sign in to comment.