@@ -105,16 +105,14 @@ def _save_secrets(arg=None):
105
105
_modified = False
106
106
107
107
108
- def _remove_entry (sec_type , key , value = None ):
108
+ def _remove_entry (sec_type , key ):
109
109
secrets = _secrets [sec_type ]
110
110
111
111
# Delete existing secrets matching the type and key.
112
112
deleted = False
113
113
for to_delete in [
114
114
entry for entry in secrets if entry [0 ] == key
115
115
]:
116
- if value and to_delete [1 ] != value :
117
- continue
118
116
log_info ("Removing existing secret matching key" )
119
117
secrets .remove (to_delete )
120
118
deleted = True
@@ -153,8 +151,10 @@ def _security_irq(event, data):
153
151
connection ._pair_event .set ()
154
152
155
153
elif event == _IRQ_SET_SECRET :
156
- sec_type , key , value = data
154
+ sec_type , key , key2 , value = data
157
155
key = bytes (key )
156
+ if key2 :
157
+ key += bytes (key2 )
158
158
value = bytes (value ) if value else None
159
159
160
160
is_saving = value is not None
@@ -173,13 +173,8 @@ def _security_irq(event, data):
173
173
_secrets [sec_type ] = []
174
174
secrets = _secrets [sec_type ]
175
175
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 )
183
178
184
179
if is_deleting and not removed :
185
180
# Delete mode, but no entries were deleted
@@ -204,9 +199,12 @@ def _security_irq(event, data):
204
199
return True
205
200
206
201
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 )
210
208
211
209
secrets = _secrets .get (sec_type , [])
212
210
if key is None :
@@ -219,10 +217,10 @@ def _security_irq(event, data):
219
217
return None
220
218
else :
221
219
# Return the secret for this key (or None).
222
- key = bytes (key )
223
-
224
220
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 :
226
224
if index :
227
225
index -= 1
228
226
continue
0 commit comments