add oob data on command line

This commit is contained in:
Gilles Boccon-Gibod
2023-11-07 20:38:35 -08:00
parent 4ae612090b
commit 5a307c19b8
2 changed files with 58 additions and 15 deletions

View File

@@ -48,25 +48,33 @@ from .core import AdvertisingData, LeRole
@dataclass
class OobData:
"""OOB data that can be sent from one device to another."""
address: Optional[Address] = None
role: Optional[LeRole] = None
shared_data: Optional[OobSharedData] = None
legacy_context: Optional[OobLegacyContext] = None
@classmethod
def from_ad(cls, ad: AdvertisingData) -> OobData:
instance = cls()
shared_data_c = None
shared_data_r = None
for (ad_type, ad_data) in ad.ad_structures:
shared_data_c: Optional[bytes] = None
shared_data_r: Optional[bytes] = None
for ad_type, ad_data in ad.ad_structures:
if ad_type == AdvertisingData.LE_BLUETOOTH_DEVICE_ADDRESS:
instance.address = Address(ad_data)
elif ad_type == AdvertisingData.LE_ROLE:
instance.role = LeRole(ad_data[0])
elif ad_type == AdvertisingData.LE_SECURE_CONNECTIONS_CONFIRMATION_VALUE:
shared_data_c: bytes = AdvertisingData.ad_data_to_object(ad_type, ad_data)
shared_data_c: Optional[bytes] = AdvertisingData.ad_data_to_object(
ad_type, ad_data
)
elif ad_type == AdvertisingData.LE_SECURE_CONNECTIONS_RANDOM_VALUE:
shared_data_r: bytes = AdvertisingData.ad_data_to_object(ad_type, ad_data)
if shared_data_c or shared_data_r:
shared_data_r: bytes = AdvertisingData.ad_data_to_object(
ad_type, ad_data
)
elif ad_type == AdvertisingData.SECURITY_MANAGER_TK_VALUE:
instance.legacy_context = OobLegacyContext(tk=ad_data)
if shared_data_c and shared_data_r:
instance.shared_data = OobSharedData(c=shared_data_c, r=shared_data_r)
return instance
@@ -74,11 +82,17 @@ class OobData:
def to_ad(self):
ad_structures = []
if self.address is not None:
ad_structures.append((AdvertisingData.LE_BLUETOOTH_DEVICE_ADDRESS, bytes(self.address)))
ad_structures.append(
(AdvertisingData.LE_BLUETOOTH_DEVICE_ADDRESS, bytes(self.address))
)
if self.role is not None:
ad_structures.append((AdvertisingData.LE_ROLE, bytes([self.role])))
if self.shared_data is not None:
ad_structures.extend(self.shared_data.to_ad().ad_structures)
if self.legacy_context is not None:
ad_structures.append(
(AdvertisingData.SECURITY_MANAGER_TK_VALUE, self.legacy_context.tk)
)
return AdvertisingData(ad_structures)
@@ -221,6 +235,7 @@ class PairingConfig:
@dataclass
class OobConfig:
"""Config for OOB pairing."""
our_context: Optional[OobContext]
peer_data: Optional[OobSharedData]
legacy_context: Optional[OobLegacyContext]