Skip to content

Commit 0b30b8d

Browse files
committed
aioble/security: Add support for CCCD bonding.
1 parent 539b9fa commit 0b30b8d

File tree

1 file changed

+15
-17
lines changed

1 file changed

+15
-17
lines changed

micropython/bluetooth/aioble/aioble/security.py

Lines changed: 15 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -105,16 +105,14 @@ def _save_secrets(arg=None):
105105
_modified = False
106106

107107

108-
def _remove_entry(sec_type, key, value=None):
108+
def _remove_entry(sec_type, key):
109109
secrets = _secrets[sec_type]
110110

111111
# Delete existing secrets matching the type and key.
112112
deleted = False
113113
for to_delete in [
114114
entry for entry in secrets if entry[0] == key
115115
]:
116-
if value and to_delete[1] != value:
117-
continue
118116
log_info("Removing existing secret matching key")
119117
secrets.remove(to_delete)
120118
deleted = True
@@ -153,8 +151,10 @@ def _security_irq(event, data):
153151
connection._pair_event.set()
154152

155153
elif event == _IRQ_SET_SECRET:
156-
sec_type, key, value = data
154+
sec_type, key, key2, value = data
157155
key = bytes(key)
156+
if key2:
157+
key += bytes(key2)
158158
value = bytes(value) if value else None
159159

160160
is_saving = value is not None
@@ -173,13 +173,8 @@ def _security_irq(event, data):
173173
_secrets[sec_type] = []
174174
secrets = _secrets[sec_type]
175175

176-
# Delete existing secrets matching the type and key as required.
177-
# There should only every be one SEC_TYPES_PEER per addr, but
178-
# multiple entries are allowed for SEC_TYPES_CCCD
179-
del_by_value = None
180-
if not is_deleting and sec_type in SEC_TYPES_CCCD:
181-
del_by_value = value
182-
removed = _remove_entry(sec_type, key, del_by_value)
176+
# Delete existing secrets matching the type and key.
177+
removed = _remove_entry(sec_type, key)
183178

184179
if is_deleting and not removed:
185180
# Delete mode, but no entries were deleted
@@ -204,9 +199,12 @@ def _security_irq(event, data):
204199
return True
205200

206201
elif event == _IRQ_GET_SECRET:
207-
sec_type, index, key = data
208-
209-
log_info("get secret:", sec_type, index, bytes(key) if key else None)
202+
sec_type, index, key, key2 = data
203+
key = bytes(key) if key else None
204+
if key2:
205+
assert key, "can't have key2 without key"
206+
key += bytes(key2)
207+
log_info("get secret:", sec_type, index, key)
210208

211209
secrets = _secrets.get(sec_type, [])
212210
if key is None:
@@ -219,10 +217,10 @@ def _security_irq(event, data):
219217
return None
220218
else:
221219
# Return the secret for this key (or None).
222-
key = bytes(key)
223-
224220
for k, v in secrets:
225-
if k == key:
221+
# For CCCD, the requested key might be just handle at start of stored key
222+
match = k.startswith(key)
223+
if match:
226224
if index:
227225
index -= 1
228226
continue

0 commit comments

Comments
 (0)