src.bluetooth_sig.advertising.encryption¶
Encryption key management for advertising data parsing.
This module provides protocols and implementations for managing encryption keys used by encrypted BLE advertising protocols.
Includes support for: - vendor-specific encryption (bindkeys for Xiaomi, BTHome, etc.) - BLE-standard Encrypted Advertising Data (EAD) per Core Spec Supplement 1.23
Attributes¶
Name | Description |
|---|---|
Classes¶
Name | Description |
|---|---|
Simple dictionary-based encryption key provider. |
|
Protocol for EAD encryption key lookup. |
|
Protocol for encryption key lookup. |
Module Contents¶
- class src.bluetooth_sig.advertising.encryption.DictKeyProvider(keys: dict[str, bytes] | None = None, ead_keys: dict[str, bluetooth_sig.types.ead.EADKeyMaterial] | None = None)¶
Simple dictionary-based encryption key provider.
Stores keys in a dictionary mapping MAC addresses to key bytes. Supports both legacy bindkeys and EAD key material. Logs a warning once per unknown MAC address.
- keys¶
Dictionary mapping MAC addresses to encryption keys
- ead_keys¶
Dictionary mapping MAC addresses to EAD key material
- warned_macs¶
Set of MAC addresses that have already been warned about
Example
>>> provider = DictKeyProvider( ... { ... "AA:BB:CC:DD:EE:FF": bytes.fromhex("0123456789abcdef0123456789abcdef"), ... } ... ) >>> key = provider.get_key("AA:BB:CC:DD:EE:FF") >>> print(key.hex() if key else "No key") 0123456789abcdef0123456789abcdef
- get_ead_key(mac_address: str) bluetooth_sig.types.ead.EADKeyMaterial | None¶
Get EAD key material for a device.
- Parameters:
mac_address – Device MAC address (e.g., “AA:BB:CC:DD:EE:FF”)
- Returns:
EADKeyMaterial containing session key and IV, or None if no key is available for this device.
- get_key(mac_address: str) bytes | None¶
Get encryption key for a device.
- Parameters:
mac_address – Device MAC address (e.g., “AA:BB:CC:DD:EE:FF”)
- Returns:
Encryption key bytes, or None if no key available.
- remove_ead_key(mac_address: str) None¶
Remove EAD key material for a device.
- Parameters:
mac_address – Device MAC address
- remove_key(mac_address: str) None¶
Remove encryption key for a device.
- Parameters:
mac_address – Device MAC address
- set_ead_key(mac_address: str, key_material: bluetooth_sig.types.ead.EADKeyMaterial) None¶
Set or update EAD key material for a device.
- Parameters:
mac_address – Device MAC address
key_material – EAD key material (session key + IV)
- set_key(mac_address: str, key: bytes) None¶
Set or update encryption key for a device.
- Parameters:
mac_address – Device MAC address
key – Encryption key bytes (typically 16 bytes)
- ead_keys: dict[str, bluetooth_sig.types.ead.EADKeyMaterial]¶
- class src.bluetooth_sig.advertising.encryption.EADKeyProvider¶
Bases:
ProtocolProtocol for EAD encryption key lookup.
Implement this protocol to provide EAD key material for devices that use BLE-standard Encrypted Advertising Data.
Example
>>> class MyEADKeyProvider: ... def __init__(self, keys: dict[str, EADKeyMaterial]): ... self._keys = keys ... ... def get_ead_key(self, mac_address: str) -> EADKeyMaterial | None: ... return self._keys.get(mac_address.upper())
- get_ead_key(mac_address: str) bluetooth_sig.types.ead.EADKeyMaterial | None¶
Get EAD key material for a device.
- Parameters:
mac_address – Device MAC address (e.g., “AA:BB:CC:DD:EE:FF”)
- Returns:
EADKeyMaterial containing session key and IV, or None if no key is available for this device.
- class src.bluetooth_sig.advertising.encryption.EncryptionKeyProvider¶
Bases:
ProtocolProtocol for encryption key lookup.
Implement this protocol to provide encryption keys for devices that use encrypted advertising (e.g., Xiaomi MiBeacon, BTHome).
Example
>>> class MyKeyProvider: ... def __init__(self, keys: dict[str, bytes]): ... self._keys = keys ... ... def get_key(self, mac_address: str) -> bytes | None: ... return self._keys.get(mac_address.upper())
- src.bluetooth_sig.advertising.encryption.AsyncKeyLookup: typing_extensions.TypeAlias¶
- src.bluetooth_sig.advertising.encryption.logger¶