Add encrypted managed UDP relay and native voice conformance

This commit is contained in:
2026-09-15 22:53:54 +02:00
parent 4067bab7c2
commit 05eacb3092
19 changed files with 1068 additions and 46 deletions
+33 -11
View File
@@ -10,6 +10,31 @@ up instantly. Newest status at the top.
## ▶ Where we left off / next action
- **Done (2026-09-15): Phase 4 encrypted voice checkpoint.** Existing pending codec/DSP
and initial server work committed as `4067bab`. Managed server now binds UDP on the
TCP port number, issues 16-byte session tokens, supports subscription and multi-stream
signaling, and authenticates/reseals encoded Opus to eligible channel subscribers.
Crypto and endpoints have one UDP-loop owner; control handlers publish immutable
routing snapshots. Rejects invalid tokens, malformed/forged/replayed media and SSRCs
not owned by the sender. Stop, unsubscribe, channel movement and disconnect update
routing; retired keys are cleared without requiring subsequent UDP traffic.
First endpoint binding is fixed for the session (reconnect to change it), unlike
the C++ oracle's permissive rebinding policy. Packet formats/protocol v2 are unchanged.
Two actual C++ `vccli` processes authenticate, join, chat and exchange mono/stereo
voice through the managed server. Native voice oracle additionally verifies three
concurrent streams with bidirectional decoded PCM energy/metadata, without hardware.
Added finite `vccli --test-tone-ms` and fixed normal `--voice` to subscribe first.
**Verified:** 154/154 managed tests, no skips with TLS/database/voice/CLI variables;
native dev build and 29/29 CTest tests; independent native media staging; warning-free
managed Release build; identical regenerated wire/password fixtures; C++ DSP within
one PCM unit; 22 permissive package licenses; `git diff --check` passes. Fan-out core
allocates zero managed bytes for 50 subscribers; transport scheduling and crypto
fallback are excluded. Transport test delivers all 2,500 packets at a paced 50 pps.
**Next:** media-aware keepalive/reaper, then protected channel joins, channel CRUD,
permissions/moderation/account administration and production configuration. Phase 4
remains in progress. Audio, managed client/CLI, Windows cutover and C# AppKit/UIKit
follow; keep Swift ReplayKit extension and freeze its ring contract before iOS.
- **In progress (2026-09-15): Phase 4 managed server control plane.** Added TLS socket
orchestration, bounded framing/queues, guest and password authentication, persisted
channels, state snapshots, channel joins, text routing, ping and disconnect events.
@@ -26,7 +51,7 @@ up instantly. Newest status at the top.
UDP voice, streams, administration, protected channel joins and production configuration
remain pending; this is the first control-plane checkpoint, not Phase 4 completion.
### .NET handoff / discoveries (2026-09-15)
### .NET control-plane checkpoint handoff / discoveries (2026-09-15)
- **Working tree:** stay on `dotnet/foundations`, tracking `origin/dotnet/foundations`.
Foundation `b76181d` and TLS checkpoint `2df79cd` were committed and pushed.
@@ -83,7 +108,7 @@ up instantly. Newest status at the top.
SourceGear's native package lacks a NuGet license expression; the audit has an
exact-version/repository-identity exception for its public-domain SQLite build.
NativeAOT publishing/trimming has not been verified for this solution.
- **Server checkpoint limits:** CLI binds loopback; positional arguments are data
- **Previous control-plane checkpoint limits:** CLI binds loopback; positional arguments are data
directory and TCP port. Guests are enabled there, and the hosting API can disable
them. Accounts can be provisioned through `AccountStore` or native administration;
automatic bootstrap/admin CLI is pending. Authentication enters unprotected Lobby
@@ -106,25 +131,22 @@ dotnet restore dotnet/VoiceCat.slnx --locked-mode
$env:VOICECAT_TLS_ORACLE = (Resolve-Path build/dev/bin/voicecat-dotnet-tls-oracle.exe).Path
$env:VOICECAT_DATABASE_ORACLE = (Resolve-Path build/dev/bin/voicecat-dotnet-database-oracle.exe).Path
$env:VOICECAT_VCCLI = (Resolve-Path build/dev/bin/vccli.exe).Path
$env:VOICECAT_VOICE_ORACLE = (Resolve-Path build/dev/bin/voicecat-dotnet-voice-oracle.exe).Path
dotnet test dotnet/VoiceCat.slnx -c Release --no-restore
./dotnet/check-licenses.ps1
```
Last results: **142/142 managed tests, no skips with those variables set; 29/29 native
Last results: **154/154 managed tests, no skips with those variables set; 29/29 native
CTest tests; warning-free Release build; 22 package licenses approved; locked restore
and `git diff --check` passed.** Without the variables, native interoperability tests
skip; that is not equivalent verification. Desktop CI stages codec/DSP bindings on
Windows/Linux/macOS. Its Linux C++ job requires TLS, CLI and database interoperability
and regenerates wire/password/DSP fixtures. Only Windows was run locally this session.
**Next behavior to implement:** read `docs/protocol.md`, `docs/security.md` and the
existing UDP binding/relay/session handlers. Write a real-client test for authenticated
UDP binding and encrypted relay between two clients, preserving SSRC/timestamp/flags
and encoded Opus while resealing with each recipient's directional key/counter.
Then implement binding tokens, stream announce/stop/subscription and channel routing.
Reject unauthenticated/replayed media and verify channel/subscription isolation.
Never decode audio on the SFU. Phase 4 exits only when two existing C++ clients can
exchange voice through the managed server as well as authenticate, join and chat.
**Voice behavior now verified:** real clients bind UDP and exchange encrypted Opus,
preserving SSRC/timestamp/flags while resealing with recipient-specific counters.
Never decode audio on the SFU. The two-C++-client voice/text criterion passes;
the remaining Phase 4 server behaviors still need implementation and conformance tests.
- **Done (2026-09-15): Codec/DSP desktop port.** TLS checkpoint `2df79cd` committed
and pushed to `origin/dotnet/foundations`. Added span-based Opus wrappers, safe native