Fix Noise session persistence during peer ID rotation

- Add session migration when peer IDs rotate
- Sessions now follow peers across ID changes via fingerprint
- Add migratePeerSession to NoiseEncryptionService
- Add migrateSession to NoiseSessionManager
- Integrate migration in BluetoothMeshService updatePeerBinding

This fixes the issue where established Noise sessions were lost
when peer IDs rotated, causing "No Noise session" errors and
requiring re-handshake.
This commit is contained in:
jack
2025-07-22 11:01:24 +02:00
parent 83a808fce6
commit 0be35a5378
3 changed files with 34 additions and 0 deletions
+13
View File
@@ -259,6 +259,19 @@ class NoiseSessionManager {
}
}
func migrateSession(from oldPeerID: String, to newPeerID: String) {
_ = managerQueue.sync(flags: .barrier) {
// Check if we have a session for the old peer ID
if let session = sessions[oldPeerID] {
// Move the session to the new peer ID
sessions[newPeerID] = session
sessions.removeValue(forKey: oldPeerID)
SecurityLogger.log("Migrated Noise session from \(oldPeerID) to \(newPeerID)", category: SecurityLogger.noise, level: .info)
}
}
}
func getEstablishedSessions() -> [String: NoiseSession] {
return managerQueue.sync {
return sessions.filter { $0.value.isEstablished() }