Add end-to-end encrypted voice messages; release v5.4.5
- Record voice notes in-browser, sent over the chunked AES-GCM file-transfer channel (per-file session key + signed SHA-256 integrity). - Captured as PCM and encoded to WAV for universal playback (incl. iOS/Safari); auto-accepted and played inline from an in-memory blob, never written to disk. - Composer mic button with live waveform + timer; desktop shows mic + send side by side, mobile swaps mic to send when typing. - CSP media-src now allows blob: so recorded/received audio can play. - Roadmap: Desktop Edition -> 5.0, new 5.5 'Secure Voice & Calls', later milestones shifted; version bumped to 5.4.5. - Update README, docs (security/API/cryptography), and CHANGELOG.
This commit is contained in:
+10
@@ -18,6 +18,16 @@
|
||||
- `setFileTransferCallbacks(onProgress, onReceived, onError, onIncomingRequest)` updates manager fields and any live `EnhancedSecureFileTransfer` instance.
|
||||
- Passing `null` values detaches callbacks from the active transfer system.
|
||||
|
||||
### Voice messages
|
||||
|
||||
- `sendFile(file, options)` accepts an optional `options` object. `options.voice`
|
||||
(`{ dur, bars }`) marks the transfer as a voice note and rides along as unsigned
|
||||
metadata; `options.uiId` correlates progress events to a UI bubble before the
|
||||
`fileId` resolves.
|
||||
- `onProgress` receives `{ fileId, uiId, direction, progress, isVoice, voice }`.
|
||||
`onIncomingFileRequest` and `onReceived` include `isVoice` and `voice` so the UI
|
||||
can auto-accept and render a voice bubble instead of a file card.
|
||||
|
||||
## EnhancedSecureFileTransfer
|
||||
|
||||
### Incoming transfers
|
||||
|
||||
+5
-2
@@ -2,7 +2,7 @@
|
||||
|
||||
## Release context
|
||||
|
||||
- Product release: `v4.8.5`
|
||||
- Product release: `v5.4.5`
|
||||
- Protocol version: `4.1`
|
||||
|
||||
## Session establishment
|
||||
@@ -16,6 +16,9 @@ The SAS is deterministic for both peers in the same authenticated session. Users
|
||||
- encrypted payloads are validated before decryption
|
||||
- decrypted chat text is sanitized before entering React state or the UI
|
||||
- replay and ordering controls remain part of the session layer
|
||||
- voice messages are transported over the file-transfer channel: each is
|
||||
encrypted with a per-file AES-GCM session key and integrity-checked with a
|
||||
signed SHA-256 hash before playback
|
||||
|
||||
## Local key metadata
|
||||
|
||||
@@ -23,4 +26,4 @@ Sensitive IndexedDB metadata is stored in encrypted envelopes. Legacy plaintext
|
||||
|
||||
## Scope note
|
||||
|
||||
This document describes the current browser implementation behavior relevant to the v4.8.5 hardening release. It does not replace independent cryptographic review.
|
||||
This document describes the current browser implementation behavior relevant to the v5.4.5 release. It does not replace independent cryptographic review.
|
||||
|
||||
@@ -10,6 +10,7 @@
|
||||
| Privacy mode | optional TURN relay-only mode |
|
||||
| Message UI safety | incoming decrypted text sanitized before display |
|
||||
| File transfer | validated metadata, explicit consent, allowlist policy |
|
||||
| Voice messages | same chunked AES-GCM transfer as files; auto-accepted and played inline |
|
||||
| Local metadata | encrypted IndexedDB envelopes with migration |
|
||||
| Lifecycle | unified disconnect cleanup and bounded resource retention |
|
||||
|
||||
@@ -42,6 +43,18 @@ The verified state is reached only when both local and remote confirmation flags
|
||||
5. sender transmits chunks only after acceptance
|
||||
6. completed received buffers are retained within a bounded window
|
||||
|
||||
## Voice messages
|
||||
|
||||
Voice notes reuse the file-transfer pipeline, so they inherit its per-file
|
||||
AES-GCM session key, chunking, and SHA-256 integrity check. Differences from a
|
||||
regular file:
|
||||
|
||||
1. audio is recorded in-browser and encoded as PCM/WAV before sending
|
||||
2. duration and a downsampled waveform travel as **unsigned** presentation
|
||||
metadata; the audio bytes remain integrity-protected by the signed file hash
|
||||
3. the receiver **auto-accepts** voice transfers (no consent prompt) and plays
|
||||
them inline from an in-memory blob — nothing is written to disk
|
||||
|
||||
## Disconnect cleanup
|
||||
|
||||
The canonical disconnect path clears:
|
||||
|
||||
Reference in New Issue
Block a user