CI/CD / Build Frontend (push) Failing after 11s
CI/CD / Test (macos-latest) (push) Has been cancelled
CI/CD / Test (windows-latest) (push) Has been cancelled
CI/CD / Build Desktop (linux) (push) Has been cancelled
CI/CD / Build Desktop (macos) (push) Has been cancelled
CI/CD / Build Desktop (windows) (push) Has been cancelled
CI/CD / Release (push) Has been cancelled
CI/CD / Test (ubuntu-latest) (push) Failing after 2s
- tscore: Protocol implementation (packets, crypto, connection handshake) - tsaudio: Audio engine (capture, playback, codec, VAD, jitter buffer) - tsdb: SQLite database (identities, bookmarks, messages, settings) - shared: Core types and events - tauri-app: Tauri v2 desktop application with React frontend - docs: SRS, SAD, SDD documentation - CI/CD: GitHub Actions workflow - 32 unit tests passing
323 lines
9.4 KiB
Markdown
323 lines
9.4 KiB
Markdown
# Software Requirements Specification (SRS)
|
|
# ReTeamSpeak - Cross-Platform TeamSpeak Client
|
|
|
|
**Version**: 1.0.0
|
|
**Date**: 2026-05-12
|
|
**Status**: Based on actual implementation
|
|
|
|
---
|
|
|
|
## 1. Introduction
|
|
|
|
### 1.1 Purpose
|
|
ReTeamSpeak is a cross-platform TeamSpeak 3 voice communication client supporting Windows, macOS, Linux, iOS, and Android. This document specifies the software requirements based on the implemented system.
|
|
|
|
### 1.2 Scope
|
|
The system implements:
|
|
- TeamSpeak 3 protocol (UDP-based, encrypted voice/text communication)
|
|
- Cross-platform UI via Tauri v2 + React
|
|
- Audio engine with Opus codec
|
|
- Local data storage (SQLite)
|
|
- Identity and bookmark management
|
|
|
|
### 1.3 Definitions
|
|
| Term | Definition |
|
|
|------|-----------|
|
|
| TS3 | TeamSpeak 3 protocol |
|
|
| EAX | AES-128-CTR with OMAC encryption mode |
|
|
| ECDH | Elliptic Curve Diffie-Hellman key exchange |
|
|
| Opus | Audio codec used for voice transmission |
|
|
| VAD | Voice Activity Detection |
|
|
| PTT | Push-To-Talk |
|
|
|
|
---
|
|
|
|
## 2. System Requirements
|
|
|
|
### 2.1 Functional Requirements
|
|
|
|
#### FR-01: Connection Management
|
|
- **FR-01.1**: Connect to TS3 servers via UDP
|
|
- **FR-01.2**: Support RSA puzzle handshake (DoS protection)
|
|
- **FR-01.3**: Support ECDH key exchange (P-256 and Curve25519)
|
|
- **FR-01.4**: Support AES-128-EAX encrypted communication
|
|
- **FR-01.5**: Support QuickLZ packet compression
|
|
- **FR-01.6**: Support packet fragmentation (max 500 bytes)
|
|
- **FR-01.7**: Support selective repeat reliable delivery
|
|
- **FR-01.8**: Support connection state machine (Disconnected → Connecting → Connected → ChannelListFinished)
|
|
|
|
#### FR-02: Authentication
|
|
- **FR-02.1**: ECC P-256 identity key generation
|
|
- **FR-02.2**: Hash Cash level computation (anti-spam)
|
|
- **FR-02.3**: Server password authentication (base64(sha1(password)))
|
|
- **FR-02.4**: Channel password authentication
|
|
- **FR-02.5**: Permission token support
|
|
- **FR-02.6**: UID computation (base64(sha1(publicKey)))
|
|
|
|
#### FR-03: Voice Communication
|
|
- **FR-03.1**: Opus codec encoding/decoding (48kHz)
|
|
- **FR-03.2**: Voice Activity Detection (VAD)
|
|
- **FR-03.3**: Push-To-Talk (PTT) mode
|
|
- **FR-03.4**: Per-client volume control
|
|
- **FR-03.5**: Whisper support (direct and group)
|
|
- **FR-03.6**: Codec types: Speex NB/WB/UWB, CELT, Opus Voice/Music
|
|
|
|
#### FR-04: Text Messaging
|
|
- **FR-04.1**: Server messages
|
|
- **FR-04.2**: Channel messages
|
|
- **FR-04.3**: Private messages
|
|
- **FR-04.4**: BBCode formatting support
|
|
- **FR-04.5**: Message history (SQLite storage)
|
|
|
|
#### FR-05: Channel Management
|
|
- **FR-05.1**: Channel tree display
|
|
- **FR-05.2**: Channel join/leave
|
|
- **FR-05.3**: Channel creation/editing (with permissions)
|
|
- **FR-05.4**: Channel subscription
|
|
|
|
#### FR-06: Client Management
|
|
- **FR-06.1**: Online client list
|
|
- **FR-06.2**: Client info display
|
|
- **FR-06.3**: Server group management
|
|
- **FR-06.4**: Channel group management
|
|
- **FR-06.5**: Client kick/ban (with permissions)
|
|
|
|
#### FR-07: Data Storage
|
|
- **FR-07.1**: Identity storage (encrypted private keys)
|
|
- **FR-07.2**: Server bookmarks
|
|
- **FR-07.3**: Chat message history
|
|
- **FR-07.4**: Application settings
|
|
|
|
#### FR-08: File Transfer
|
|
- **FR-08.1**: File upload to channels
|
|
- **FR-08.2**: File download from channels
|
|
- **FR-08.3**: File browsing
|
|
- **FR-08.4**: Transfer progress tracking
|
|
|
|
### 2.2 Non-Functional Requirements
|
|
|
|
#### NFR-01: Performance
|
|
- **NFR-01.1**: Connection establishment < 3 seconds
|
|
- **NFR-01.2**: Voice latency < 200ms
|
|
- **NFR-01.3**: Message delivery < 100ms
|
|
- **NFR-01.4**: Support 1000+ client servers
|
|
|
|
#### NFR-02: Security
|
|
- **NFR-02.1**: AES-128-EAX encryption for all commands
|
|
- **NFR-02.2**: ECDH key exchange (forward secrecy)
|
|
- **NFR-02.3**: RSA puzzle DoS protection
|
|
- **NFR-02.4**: ChaCha20-Poly1305 identity storage encryption
|
|
|
|
#### NFR-03: Compatibility
|
|
- **NFR-03.1**: Windows 10/11
|
|
- **NFR-03.2**: macOS 11+
|
|
- **NFR-03.3**: Linux (Ubuntu 20.04+, Debian 11+)
|
|
- **NFR-03.4**: iOS 15+
|
|
- **NFR-03.5**: Android 10+
|
|
- **NFR-03.6**: TS3 server versions 3.0.x and 3.1.x
|
|
|
|
#### NFR-04: Reliability
|
|
- **NFR-04.1**: Automatic reconnection on temporary disconnect
|
|
- **NFR-04.2**: Packet retransmission with exponential backoff
|
|
- **NFR-04.3**: Connection timeout detection (30 seconds)
|
|
- **NFR-04.4**: Graceful degradation on packet loss
|
|
|
|
---
|
|
|
|
## 3. System Architecture
|
|
|
|
### 3.1 Module Structure
|
|
```
|
|
src/
|
|
├── shared/ # Shared types (Client, Channel, Server, Events)
|
|
├── tscore/ # Protocol core (packets, crypto, connection)
|
|
├── tsaudio/ # Audio engine (capture, playback, codec)
|
|
├── tsdb/ # Database (SQLite via rusqlite)
|
|
└── tauri-app/ # Application shell
|
|
├── src-tauri/ # Rust backend (Tauri commands)
|
|
└── frontend/ # React frontend (TypeScript)
|
|
```
|
|
|
|
### 3.2 Technology Stack
|
|
| Layer | Technology |
|
|
|-------|-----------|
|
|
| Language | Rust 1.70+, TypeScript 5.x |
|
|
| Desktop Framework | Tauri v2 |
|
|
| Frontend | React 18, Vite 5 |
|
|
| Async Runtime | Tokio |
|
|
| Actor Framework | Actix |
|
|
| Database | SQLite (rusqlite) |
|
|
| Audio | Opus, cpal |
|
|
| Crypto | AES-EAX, P-256, Curve25519, SHA-256/512 |
|
|
|
|
---
|
|
|
|
## 4. Protocol Specification
|
|
|
|
### 4.1 Packet Format
|
|
```
|
|
C2S: [MAC:8][PId:2][CId:2][PT:1][Data:≤487]
|
|
S2C: [MAC:8][PId:2][PT:1][Data:≤489]
|
|
```
|
|
|
|
### 4.2 Packet Types
|
|
| Type | Value | Encrypted | Reliable | Fragmentable |
|
|
|------|-------|-----------|----------|--------------|
|
|
| Voice | 0x00 | Optional | No | No |
|
|
| VoiceWhisper | 0x01 | Optional | No | No |
|
|
| Command | 0x02 | Yes | Yes | Yes |
|
|
| CommandLow | 0x03 | Yes | Yes | Yes |
|
|
| Ping | 0x04 | No | No | No |
|
|
| Pong | 0x05 | No | No | No |
|
|
| Ack | 0x06 | Yes | Yes | No |
|
|
| AckLow | 0x07 | Yes | Yes | No |
|
|
| Init | 0x08 | No | Yes | No |
|
|
|
|
### 4.3 Handshake Sequence
|
|
```
|
|
Client → Server: Init0 (version, timestamp, random0)
|
|
Server → Client: Init1 (random1, random0_r)
|
|
Client → Server: Init2 (version, random1, random0_r)
|
|
Server → Client: Init3 (x, n, level, random2) [RSA puzzle]
|
|
Client → Server: Init4 (x, n, level, random2, y, clientinitiv)
|
|
Server → Client: initivexpand2 (beta, omega, proof, license)
|
|
Client → Server: clientek (ek, proof)
|
|
Server → Client: initserver
|
|
Server → Client: channellist...channellistfinished
|
|
Server → Client: notifycliententerview...
|
|
```
|
|
|
|
### 4.4 Encryption
|
|
- **Algorithm**: AES-128-EAX (AES-128-CTR + OMAC)
|
|
- **Key derivation**: SHA-256(direction | type | generation_id | shared_iv)
|
|
- **Shared IV**: SHA-512(ECDH shared secret) XOR alpha/beta
|
|
- **MAC**: 8 bytes (EAX tag)
|
|
|
|
---
|
|
|
|
## 5. Data Structures
|
|
|
|
### 5.1 Core Types (from shared/src/types.rs)
|
|
```rust
|
|
ClientId(u16) // Client identifier
|
|
ChannelId(u64) // Channel identifier
|
|
ServerGroupId(u64) // Server group identifier
|
|
ClientDbId(u64) // Client database identifier
|
|
Uid(String) // Unique identifier (base64)
|
|
PermissionId(u32) // Permission identifier
|
|
```
|
|
|
|
### 5.2 Database Schema (from tsdb/src/lib.rs)
|
|
```sql
|
|
CREATE TABLE identities (
|
|
id TEXT PRIMARY KEY,
|
|
name TEXT NOT NULL,
|
|
private_key TEXT NOT NULL,
|
|
counter INTEGER DEFAULT 0,
|
|
max_counter INTEGER DEFAULT 0,
|
|
created_at TEXT NOT NULL,
|
|
updated_at TEXT NOT NULL
|
|
);
|
|
|
|
CREATE TABLE bookmarks (
|
|
id TEXT PRIMARY KEY,
|
|
name TEXT NOT NULL,
|
|
address TEXT NOT NULL,
|
|
port INTEGER DEFAULT 9987,
|
|
nickname TEXT,
|
|
server_password TEXT,
|
|
channel TEXT,
|
|
channel_password TEXT,
|
|
auto_connect INTEGER DEFAULT 0,
|
|
last_connected TEXT,
|
|
created_at TEXT NOT NULL,
|
|
updated_at TEXT NOT NULL
|
|
);
|
|
|
|
CREATE TABLE messages (
|
|
id INTEGER PRIMARY KEY AUTOINCREMENT,
|
|
server_address TEXT NOT NULL,
|
|
invoker_id INTEGER NOT NULL,
|
|
invoker_name TEXT NOT NULL,
|
|
invoker_uid TEXT NOT NULL,
|
|
target_type TEXT NOT NULL,
|
|
target_id INTEGER,
|
|
message TEXT NOT NULL,
|
|
is_read INTEGER DEFAULT 0,
|
|
timestamp TEXT NOT NULL
|
|
);
|
|
|
|
CREATE TABLE settings (
|
|
key TEXT PRIMARY KEY,
|
|
value TEXT NOT NULL,
|
|
updated_at TEXT NOT NULL
|
|
);
|
|
```
|
|
|
|
---
|
|
|
|
## 6. Test Results
|
|
|
|
### 6.1 Unit Tests (32 tests passing)
|
|
```
|
|
tscore::protocol::tests - 14 tests
|
|
✓ test_packet_type_conversion
|
|
✓ test_flags
|
|
✓ test_header_c2s
|
|
✓ test_header_s2c
|
|
✓ test_in_packet_parse
|
|
✓ test_out_packet
|
|
✓ test_command_parse
|
|
✓ test_command_serialize
|
|
✓ test_command_builder
|
|
✓ test_escape_sequences
|
|
✓ test_init_packet_parse
|
|
✓ test_init_packet_serialize
|
|
✓ test_ack_packet
|
|
✓ test_packet_type_properties
|
|
|
|
tscore::crypto::tests - 12 tests
|
|
✓ test_sha1, test_sha256, test_sha512
|
|
✓ test_hash_password
|
|
✓ test_create_key_nonce
|
|
✓ test_create_encryption_key
|
|
✓ test_shared_secret_old, test_shared_secret_new
|
|
✓ test_key_cache
|
|
✓ test_eax_encrypt_decrypt
|
|
✓ test_fake_encrypt_decrypt
|
|
✓ test_hash_cash_level
|
|
✓ test_compute_uid
|
|
|
|
tscore::connection::tests - 6 tests
|
|
✓ test_encode_version
|
|
✓ test_rsa_puzzle
|
|
✓ test_resend_manager
|
|
✓ test_rtt_estimator
|
|
✓ test_sent_packet_retry
|
|
```
|
|
|
|
---
|
|
|
|
## 7. Constraints
|
|
|
|
### 7.1 Technical Constraints
|
|
- Rust edition 2021
|
|
- Tauri v2 for desktop/mobile
|
|
- Must maintain TS3 protocol compatibility
|
|
- UDP transport only (no TCP fallback)
|
|
|
|
### 7.2 Legal Constraints
|
|
- TeamSpeak is a trademark of TeamSpeak Systems GmbH
|
|
- Implementation is for educational/research purposes
|
|
- No server-side code (client-only)
|
|
|
|
---
|
|
|
|
## 8. References
|
|
|
|
1. TS3 Protocol Paper (`refercence/tsdeclarations/ts3protocol.md`)
|
|
2. Packet Definitions (`refercence/tsdeclarations/Packets.txt`)
|
|
3. Message Definitions (`refercence/tsdeclarations/Messages.toml`)
|
|
4. tsclientlib implementation (`refercence/tsclientlib/`)
|
|
5. Qint implementation (`refercence/Qint/`)
|