BLE: Pairing schlaegt auf Android fehl — SC_MITM_BOND inkompatibel #3

Open
opened 2026-05-28 18:20:06 +02:00 by ppfeiffer · 0 comments
Owner

Problem

Das Geraet ist per BLE sichtbar (nRF Connect und MeshCore-App zeigen es an), aber das Pairing schlaegt fehl.

Ursache: SerialBLEInterface in der MeshCore-Bibliothek setzt ESP_LE_AUTH_REQ_SC_MITM_BOND:

BLESecurity sec;
sec.setStaticPIN(pin_code);
sec.setAuthenticationMode(ESP_LE_AUTH_REQ_SC_MITM_BOND);

Dieser Modus verlangt:

  • Secure Connections (SC) — BLE 4.2+
  • MITM-Schutz — Passkey-Dialog am Telefon erforderlich
  • Bonding — Geraet wird gespeichert

Verhalten auf Android 12+

  • BLE UART-Geraete erscheinen nicht in den Android-System-Bluetooth-Einstellungen (nur Classic BT und bekannte Profile wie HID/HFP)
  • Der Pairing-Dialog fuer MITM wird von Android 12+ oft nicht mehr als Vordergrund-Dialog angezeigt
  • Die Verbindung schlaegt still fehl ohne Fehlermeldung

Betroffene Datei

lib/MeshCore/src/helpers/esp32/SerialBLEInterface.cpp — Submodul (upstream MeshCore)

Loesung

Security-Mode auf ESP_LE_AUTH_BOND (Just Works) aendern:

// Vorher:
sec.setStaticPIN(pin_code);
sec.setAuthenticationMode(ESP_LE_AUTH_REQ_SC_MITM_BOND);

// Nachher:
sec.setAuthenticationMode(ESP_LE_AUTH_BOND);

Kein PIN-Dialog mehr — Android verbindet automatisch. Datensicherheit bleibt gewahrt: MeshCore-Protokoll nutzt eigene ed25519-Verschluesselung, die BLE-Transportverschluesselung ist redundant.

Optionen

  1. Patch im Submodul: SerialBLEInterface.cpp direkt aendern (bricht kuenftige Upstream-Updates)
  2. Upstream-PR: Fix an MeshCore-Projekt melden (https://github.com/ripplebiz/MeshCore)
  3. Eigener Fork: MeshCore forken und gepatchte Version als Submodul verwenden

Workaround (kein Fix)

Kein bekannter Workaround — das Problem liegt in der hardcodierten Security-Policy der Bibliothek.

## Problem Das Geraet ist per BLE sichtbar (nRF Connect und MeshCore-App zeigen es an), aber das Pairing schlaegt fehl. Ursache: `SerialBLEInterface` in der MeshCore-Bibliothek setzt `ESP_LE_AUTH_REQ_SC_MITM_BOND`: ```cpp BLESecurity sec; sec.setStaticPIN(pin_code); sec.setAuthenticationMode(ESP_LE_AUTH_REQ_SC_MITM_BOND); ``` Dieser Modus verlangt: - **Secure Connections (SC)** — BLE 4.2+ - **MITM-Schutz** — Passkey-Dialog am Telefon erforderlich - **Bonding** — Geraet wird gespeichert ## Verhalten auf Android 12+ - BLE UART-Geraete erscheinen **nicht** in den Android-System-Bluetooth-Einstellungen (nur Classic BT und bekannte Profile wie HID/HFP) - Der Pairing-Dialog fuer MITM wird von Android 12+ oft nicht mehr als Vordergrund-Dialog angezeigt - Die Verbindung schlaegt still fehl ohne Fehlermeldung ## Betroffene Datei `lib/MeshCore/src/helpers/esp32/SerialBLEInterface.cpp` — Submodul (upstream MeshCore) ## Loesung Security-Mode auf `ESP_LE_AUTH_BOND` (Just Works) aendern: ```cpp // Vorher: sec.setStaticPIN(pin_code); sec.setAuthenticationMode(ESP_LE_AUTH_REQ_SC_MITM_BOND); // Nachher: sec.setAuthenticationMode(ESP_LE_AUTH_BOND); ``` Kein PIN-Dialog mehr — Android verbindet automatisch. Datensicherheit bleibt gewahrt: MeshCore-Protokoll nutzt eigene ed25519-Verschluesselung, die BLE-Transportverschluesselung ist redundant. ## Optionen 1. **Patch im Submodul**: `SerialBLEInterface.cpp` direkt aendern (bricht kuenftige Upstream-Updates) 2. **Upstream-PR**: Fix an MeshCore-Projekt melden (https://github.com/ripplebiz/MeshCore) 3. **Eigener Fork**: MeshCore forken und gepatchte Version als Submodul verwenden ## Workaround (kein Fix) Kein bekannter Workaround — das Problem liegt in der hardcodierten Security-Policy der Bibliothek.
Sign in to join this conversation.
No labels
No milestone
No project
No assignees
1 participant
Notifications
Due date
The due date is invalid or out of range. Please use the format "yyyy-mm-dd".

No due date set.

Dependencies

No dependencies set.

Reference
ppfeiffer/OpenMeshOS#3
No description provided.