Retry private messages after Noise session replacement

This commit is contained in:
jack
2026-07-25 17:36:43 +02:00
committed by jack
parent 37e09393fa
commit ced9ac7610
10 changed files with 724 additions and 54 deletions
@@ -97,6 +97,7 @@ private final class MockChatVerificationContext: ChatVerificationContext {
var noiseSessionKeysByPeerID: [PeerID: Data] = [:]
private(set) var installedCallbacks: (onPeerAuthenticated: (PeerID, String) -> Void, onHandshakeRequired: (PeerID) -> Void)?
private(set) var triggeredHandshakes: [PeerID] = []
private(set) var securePrivateMessageRetryAliases: [[PeerID]] = []
private(set) var sentChallenges: [(peerID: PeerID, noiseKeyHex: String, nonceA: Data)] = []
private(set) var sentResponses: [(peerID: PeerID, noiseKeyHex: String, nonceA: Data)] = []
@@ -113,6 +114,9 @@ private final class MockChatVerificationContext: ChatVerificationContext {
establishedNoiseSessions.contains(peerID)
}
func triggerHandshake(with peerID: PeerID) { triggeredHandshakes.append(peerID) }
func retrySecurePrivateMessagesAfterAuthentication(for peerIDAliases: [PeerID]) {
securePrivateMessageRetryAliases.append(peerIDAliases)
}
func sendVerifyChallenge(to peerID: PeerID, noiseKeyHex: String, nonceA: Data) {
sentChallenges.append((peerID, noiseKeyHex, nonceA))
@@ -265,6 +269,10 @@ struct ChatVerificationCoordinatorContextTests {
let peerID = PeerID(str: "1122334455667788")
let noiseKey = Data(repeating: 0x33, count: 32)
context.noiseSessionKeysByPeerID[peerID] = noiseKey
context.cacheStablePeerID(
PeerID(hexData: Data(repeating: 0x44, count: 32)),
for: peerID
)
context.verifiedFingerprints = ["fp-verified"]
coordinator.setupNoiseCallbacks()
@@ -275,8 +283,10 @@ struct ChatVerificationCoordinatorContextTests {
callbacks?.onPeerAuthenticated(peerID, "fp-verified")
await waitForMainQueue()
#expect(context.encryptionStatuses[peerID] == .noiseVerified)
#expect(context.stablePeerIDCache[peerID] == PeerID(hexData: noiseKey))
let stablePeerID = PeerID(hexData: noiseKey)
#expect(context.stablePeerIDCache[peerID] == stablePeerID)
#expect(context.invalidatedEncryptionCachePeers.contains(peerID))
#expect(context.securePrivateMessageRetryAliases == [[peerID, stablePeerID]])
// Handshake required -> handshaking status.
callbacks?.onHandshakeRequired(peerID)