diff --git a/bitchat/Identity/SecureIdentityStateManager.swift b/bitchat/Identity/SecureIdentityStateManager.swift index 7342dd1f..8700a1f3 100644 --- a/bitchat/Identity/SecureIdentityStateManager.swift +++ b/bitchat/Identity/SecureIdentityStateManager.swift @@ -103,7 +103,7 @@ protocol SecureIdentityStateManagerProtocol { // MARK: Cryptographic Identities func upsertCryptographicIdentity(fingerprint: String, noisePublicKey: Data, signingPublicKey: Data?, claimedNickname: String?) - func getCryptoIdentitiesByPeerIDPrefix(_ peerID: String) -> [CryptographicIdentity] + func getCryptoIdentitiesByPeerIDPrefix(_ peer: Peer) -> [CryptographicIdentity] func updateSocialIdentity(_ identity: SocialIdentity) // MARK: Favorites Management @@ -321,11 +321,11 @@ final class SecureIdentityStateManager: SecureIdentityStateManagerProtocol { } /// Find cryptographic identities whose fingerprint prefix matches a peerID (16-hex) short ID - func getCryptoIdentitiesByPeerIDPrefix(_ peerID: String) -> [CryptographicIdentity] { + func getCryptoIdentitiesByPeerIDPrefix(_ peer: Peer) -> [CryptographicIdentity] { queue.sync { // Defensive: ensure hex and correct length - guard peerID.count == 16, peerID.allSatisfy({ $0.isHexDigit }) else { return [] } - return cryptographicIdentities.values.filter { $0.fingerprint.hasPrefix(peerID) } + guard peer.isShort, peer.id.allSatisfy({ $0.isHexDigit }) else { return [] } + return cryptographicIdentities.values.filter { $0.fingerprint.hasPrefix(peer.id) } } } diff --git a/bitchat/Models/Peer.swift b/bitchat/Models/Peer.swift index e710a968..ae0e96d5 100644 --- a/bitchat/Models/Peer.swift +++ b/bitchat/Models/Peer.swift @@ -10,6 +10,10 @@ import Foundation struct Peer: Equatable, Hashable { let id: String + + var isShort: Bool { + id.count == 16 && Data(hexString: id) != nil + } } extension Peer { diff --git a/bitchat/Services/BLEService.swift b/bitchat/Services/BLEService.swift index 3d15a24a..33ac41fd 100644 --- a/bitchat/Services/BLEService.swift +++ b/bitchat/Services/BLEService.swift @@ -1730,7 +1730,7 @@ final class BLEService: NSObject { // Fallback: verify signature using persisted signing key for this peerID's fingerprint prefix if let signature = packet.signature, let packetData = packet.toBinaryDataForSigning() { // Find candidate identities by peerID prefix (16 hex) - let candidates = identityManager.getCryptoIdentitiesByPeerIDPrefix(peerID) + let candidates = identityManager.getCryptoIdentitiesByPeerIDPrefix(Peer(str: peerID)) for candidate in candidates { if let signingKey = candidate.signingPublicKey, noiseService.verifySignature(signature, for: packetData, publicKey: signingKey) { diff --git a/bitchat/Views/ContentView.swift b/bitchat/Views/ContentView.swift index 79eaf04b..ffb18c31 100644 --- a/bitchat/Views/ContentView.swift +++ b/bitchat/Views/ContentView.swift @@ -1372,7 +1372,7 @@ struct ContentView: View { !fav.peerNickname.isEmpty { return fav.peerNickname } // Fallback: resolve from persisted social identity via fingerprint mapping if headerPeerID.count == 16 { - let candidates = viewModel.identityManager.getCryptoIdentitiesByPeerIDPrefix(headerPeerID) + let candidates = viewModel.identityManager.getCryptoIdentitiesByPeerIDPrefix(Peer(str: headerPeerID)) if let id = candidates.first, let social = viewModel.identityManager.getSocialIdentity(for: id.fingerprint) { if let pet = social.localPetname, !pet.isEmpty { return pet }