Save link_key in CTKD over BR/EDR

Since keystore.update() overwrites all existing keys, the existing link
key will be wiped out. To avoid this, SMP also need to keep the key.
This commit is contained in:
Josh Wu
2024-01-17 19:25:04 +08:00
parent 46ceea7ecd
commit acd9d994c3
2 changed files with 12 additions and 3 deletions
+5 -3
View File
@@ -1134,8 +1134,10 @@ class Session:
async def get_link_key_and_derive_ltk(self) -> None: async def get_link_key_and_derive_ltk(self) -> None:
'''Retrieves BR/EDR Link Key from storage and derive it to LE LTK.''' '''Retrieves BR/EDR Link Key from storage and derive it to LE LTK.'''
link_key = await self.manager.device.get_link_key(self.connection.peer_address) self.link_key = await self.manager.device.get_link_key(
if link_key is None: self.connection.peer_address
)
if self.link_key is None:
logging.warning( logging.warning(
'Try to derive LTK but host does not have the LK. Send a SMP_PAIRING_FAILED but the procedure will not be paused!' 'Try to derive LTK but host does not have the LK. Send a SMP_PAIRING_FAILED but the procedure will not be paused!'
) )
@@ -1143,7 +1145,7 @@ class Session:
SMP_CROSS_TRANSPORT_KEY_DERIVATION_NOT_ALLOWED_ERROR SMP_CROSS_TRANSPORT_KEY_DERIVATION_NOT_ALLOWED_ERROR
) )
else: else:
self.ltk = self.derive_ltk(link_key, self.ct2) self.ltk = self.derive_ltk(self.link_key, self.ct2)
def distribute_keys(self) -> None: def distribute_keys(self) -> None:
# Distribute the keys as required # Distribute the keys as required
+7
View File
@@ -547,6 +547,13 @@ async def test_self_smp_over_classic():
MockSmpSession.send_public_key_command.assert_not_called() MockSmpSession.send_public_key_command.assert_not_called()
MockSmpSession.send_pairing_random_command.assert_not_called() MockSmpSession.send_pairing_random_command.assert_not_called()
for i in range(2):
assert (
await two_devices.devices[i].keystore.get(
str(two_devices.connections[i].peer_address)
)
).link_key
# ----------------------------------------------------------------------------- # -----------------------------------------------------------------------------
@pytest.mark.asyncio @pytest.mark.asyncio