mirror of
https://github.com/permissionlesstech/bitchat.git
synced 2026-07-27 11:25:20 +00:00
BLE announce trust verified the packet signature against the Ed25519 signing key carried inside the same announce, and the trust policy only rejected on noise-key mismatch. Since peerIDs derive from the broadcast (public) noise key, an on-mesh attacker could replay a victim's peerID+noiseKey with their own signing key, nickname, and a valid self-signature; the registry/persisted identity was then overwritten unconditionally, enabling mesh nickname spoofing and forged attribution of signed public/broadcast messages. Fix: TOFU-pin the Ed25519 signing key per peer (noise-key-derived peerID) on the announce path. - BLEAnnounceTrustPolicy rejects announces whose signing key differs from the one already recorded for the peer (.signingKeyMismatch). - BLEPeerRegistry.upsertVerifiedAnnounce refuses to replace a pinned signing key (returns nil) and never drops a pinned key. - BLEAnnounceHandler falls back to the persisted cryptographic identity (persistedSigningPublicKey) when the registry has no signing key, so the pin survives registry eviction and app restart. - SecureIdentityStateManager.upsertCryptographicIdentity refuses to replace a persisted signing key with a different one, and the cryptographic identities (incl. the pin) now live in the encrypted, persisted IdentityCache with synchronous, teardown-safe saves. Rebased onto main and integrated with #1432 (Noise session identity binding + signed leaves): both are complementary. #1432's signed-leave verification reads the same registry/persisted signing key that this change protects from announce-path poisoning. main's evolution is kept: BLEPeerRegistry.upsertVerifiedAnnounce still takes capabilities/ bridgeGeohash (nil return propagates as a refusal), the handler's linkBoundToOtherPeer env is preserved, CryptographicIdentity keeps main's field set, and EphemeralIdentity uses main's initializer. Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
84 lines
1.1 KiB
Plaintext
84 lines
1.1 KiB
Plaintext
# Xcode
|
|
#
|
|
# gitignore contributors: remember to update Global/Xcode.gitignore, Objective-C.gitignore & Swift.gitignore
|
|
|
|
## implementation plans
|
|
plans/
|
|
|
|
## AI
|
|
CLAUDE.md
|
|
AGENTS.md
|
|
.claude/
|
|
|
|
## compatibility with Xcode 8 and earlier (ignoring not required starting Xcode 9)
|
|
*.xcscmblueprint
|
|
*.xccheckout
|
|
|
|
## compatibility with Xcode 3 and earlier (ignoring not required starting Xcode 4)
|
|
build/
|
|
DerivedData/
|
|
.DerivedData/
|
|
*.moved-aside
|
|
*.pbxuser
|
|
!default.pbxuser
|
|
*.mode1v3
|
|
!default.mode1v3
|
|
*.mode2v3
|
|
!default.mode2v3
|
|
*.perspectivev3
|
|
!default.perspectivev3
|
|
|
|
## Gcc Patch
|
|
/*.gcno
|
|
|
|
## macOS
|
|
.DS_Store
|
|
|
|
## SPM
|
|
.swiftpm
|
|
.build/
|
|
|
|
## CocoaPods
|
|
Pods/
|
|
|
|
## Carthage
|
|
Carthage/Build/
|
|
|
|
## fastlane
|
|
fastlane/report.xml
|
|
fastlane/Preview.html
|
|
fastlane/screenshots/**/*.png
|
|
fastlane/test_output
|
|
|
|
## Code Injection
|
|
iOSInjectionProject/
|
|
|
|
## Xcode project
|
|
*.xcodeproj/project.xcworkspace/
|
|
## Xcode User settings
|
|
xcuserdata/
|
|
|
|
## Python
|
|
__pycache__/
|
|
*.py[cod]
|
|
*$py.class
|
|
|
|
## Temporary files
|
|
*.tmp
|
|
*.temp
|
|
|
|
## Cache
|
|
.cache/
|
|
|
|
# Local build results
|
|
.Result*/
|
|
.Result*.xcresult/
|
|
TestResult.xcresult/
|
|
*.xcresult/
|
|
build.log
|
|
*.log
|
|
|
|
# Local configs
|
|
Local.xcconfig
|
|
*.profraw
|