@@ -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