improve identity announcements (#198)

* improve identity announcements

* touches

* signing noise id

* panic mode delete signing key
This commit is contained in:
callebtc
2025-07-31 06:26:41 +02:00
committed by GitHub
parent 34d00839b2
commit 4cb5932fd0
15 changed files with 302 additions and 113 deletions
@@ -63,11 +63,8 @@ class BluetoothMeshService(private val context: Context) {
init {
setupDelegates()
// Wire up PacketProcessor reference for recursive handling in MessageHandler
messageHandler.packetProcessor = packetProcessor
sendPeriodicBroadcastAnnounce()
// startPeriodicDebugLogging()
startPeriodicDebugLogging()
}
/**
@@ -98,6 +95,7 @@ class BluetoothMeshService(private val context: Context) {
try {
delay(30000) // 30 seconds
sendBroadcastAnnounce()
broadcastNoiseIdentityAnnouncement()
} catch (e: Exception) {
Log.e(TAG, "Error in periodic broadcast announce: ${e.message}")
}
@@ -126,11 +124,7 @@ class BluetoothMeshService(private val context: Context) {
// SecurityManager delegate for key exchange notifications
securityManager.delegate = object : SecurityManagerDelegate {
override fun onKeyExchangeCompleted(peerID: String, peerPublicKeyData: ByteArray, receivedAddress: String?) {
receivedAddress?.let { address ->
connectionManager.addressPeerMap[address] = peerID
}
override fun onKeyExchangeCompleted(peerID: String, peerPublicKeyData: ByteArray) {
// Send announcement and cached messages after key exchange
serviceScope.launch {
delay(100)
@@ -150,7 +144,7 @@ class BluetoothMeshService(private val context: Context) {
recipientID = hexStringToByteArray(peerID),
timestamp = System.currentTimeMillis().toULong(),
payload = response,
ttl = 1u
ttl = MAX_TTL
)
connectionManager.broadcastPacket(RoutedPacket(responsePacket))
Log.d(TAG, "Sent Noise handshake response to $peerID (${response.size} bytes)")
@@ -225,6 +219,10 @@ class BluetoothMeshService(private val context: Context) {
return securityManager.decryptFromPeer(encryptedData, senderPeerID)
}
override fun verifyEd25519Signature(signature: ByteArray, data: ByteArray, publicKey: ByteArray): Boolean {
return encryptionService.verifyEd25519Signature(signature, data, publicKey)
}
// Noise protocol operations
override fun hasNoiseSession(peerID: String): Boolean {
return encryptionService.hasEstablishedSession(peerID)
@@ -243,7 +241,7 @@ class BluetoothMeshService(private val context: Context) {
recipientID = hexStringToByteArray(peerID),
timestamp = System.currentTimeMillis().toULong(),
payload = handshakeData,
ttl = 1u
ttl = MAX_TTL
)
connectionManager.broadcastPacket(RoutedPacket(packet))
@@ -387,13 +385,13 @@ class BluetoothMeshService(private val context: Context) {
override fun onDeviceConnected(device: android.bluetooth.BluetoothDevice) {
// Send initial announcements after services are ready
serviceScope.launch {
delay(100)
delay(200)
sendBroadcastAnnounce()
}
// Send key exchange to newly connected device
serviceScope.launch {
delay(100) // Ensure connection is stable
sendKeyExchangeToDevice()
delay(400) // Ensure connection is stable
broadcastNoiseIdentityAnnouncement()
}
}
@@ -685,7 +683,7 @@ class BluetoothMeshService(private val context: Context) {
val announcePacket = BitchatPacket(
type = MessageType.ANNOUNCE.value,
ttl = 3u,
ttl = MAX_TTL,
senderID = myPeerID,
payload = nickname.toByteArray()
)
@@ -703,7 +701,7 @@ class BluetoothMeshService(private val context: Context) {
val nickname = delegate?.getNickname() ?: myPeerID
val packet = BitchatPacket(
type = MessageType.ANNOUNCE.value,
ttl = 3u,
ttl = MAX_TTL,
senderID = myPeerID,
payload = nickname.toByteArray()
)
@@ -715,7 +713,7 @@ class BluetoothMeshService(private val context: Context) {
/**
* Send key exchange to newly connected device
*/
fun sendKeyExchangeToDevice() {
fun broadcastNoiseIdentityAnnouncement() {
serviceScope.launch {
try {
val nickname = delegate?.getNickname() ?: myPeerID
@@ -726,13 +724,11 @@ class BluetoothMeshService(private val context: Context) {
val announcementData = announcement.toBinaryData()
val packet = BitchatPacket(
version = 1u,
type = MessageType.NOISE_IDENTITY_ANNOUNCE.value,
senderID = hexStringToByteArray(myPeerID),
recipientID = SpecialRecipients.BROADCAST,
timestamp = System.currentTimeMillis().toULong(),
ttl = MAX_TTL,
senderID = myPeerID,
payload = announcementData,
ttl = 1u
)
connectionManager.broadcastPacket(RoutedPacket(packet))
@@ -838,7 +834,7 @@ class BluetoothMeshService(private val context: Context) {
val nickname = delegate?.getNickname() ?: myPeerID
val packet = BitchatPacket(
type = MessageType.LEAVE.value,
ttl = 1u,
ttl = MAX_TTL,
senderID = myPeerID,
payload = nickname.toByteArray()
)
@@ -984,6 +980,40 @@ class BluetoothMeshService(private val context: Context) {
return result
}
// MARK: - Panic Mode Support
/**
* Clear all internal mesh service data (for panic mode)
*/
fun clearAllInternalData() {
Log.w(TAG, "🚨 Clearing all mesh service internal data")
try {
// Clear all managers
fragmentManager.clearAllFragments()
storeForwardManager.clearAllCache()
securityManager.clearAllData()
peerManager.clearAllPeers()
peerManager.clearAllFingerprints()
Log.d(TAG, "✅ Cleared all mesh service internal data")
} catch (e: Exception) {
Log.e(TAG, "❌ Error clearing mesh service internal data: ${e.message}")
}
}
/**
* Clear all encryption and cryptographic data (for panic mode)
*/
fun clearAllEncryptionData() {
Log.w(TAG, "🚨 Clearing all encryption data")
try {
// Clear encryption service persistent identity (includes Ed25519 signing keys)
encryptionService.clearPersistentIdentity()
Log.d(TAG, "✅ Cleared all encryption data")
} catch (e: Exception) {
Log.e(TAG, "❌ Error clearing encryption data: ${e.message}")
}
}
}
/**