Implements OPPORTUNISTIC LXMF delivery receive — single-packet
encrypted messages without link establishment.
BeaconCrypto.h: beacon_crypto_decrypt() — reverse of encrypt.
ECDH + HKDF + HMAC verify + AES-256-CBC decrypt + PKCS7 unpad.
LxmfBeacon.h: MsgpackReader for unpacking received messages.
lxmf_parse_received() extracts source_hash, timestamp, title, content.
lxmf_verify_signature() verifies Ed25519 against cached announce key.
MessageLog.h: Extended to detect DATA packets addressed to our
lxmf_source_hash, decrypt, parse, and store content. Announce
entries now cache sender's ed25519 public key for verification.
Gui.h: Messages screen shows LXMF content (green if verified,
white if unverified) with sender name and time ago.
New MessageLog.h parses incoming RNS packets:
- Announces: extracts display name, identity hash, public keys
- Data packets: logs dest hash, RSSI, SNR, size
- De-duplicates by sender hash within 60s
Messages screen (swipe right from watch face) shows:
- "Listening..." when no packets received
- Chronological list of peers with name, RSSI (colour-coded), time ago
- Announces shown in amber, data packets in white
- Up to 16 entries in ring buffer, 8 visible rows
Packet interception hooks into main loop dequeue path, before
kiss_write_packet(), so host forwarding is unaffected.