← Home
Download Switch to Italian

Security

How authentication and encryption work in WFAS, and what their limits are. Please read the disclaimer below first.

Read this first: experimental software, not security-audited

WFAS is a personal project by an engineering student. Its security features (key authentication, ChaCha20-Poly1305 encryption, anti-replay checks) are an experimental implementation that I wrote myself while learning. They have not undergone any formal security audit or independent review.

The software is provided "as is", without warranty of any kind, under the terms of its licenses. If you find a problem, I would be grateful if you reported it on GitHub.

Three authentication modes

None

No checks are made. Anyone on the same network who can reach the server can connect, so this only makes sense on a network you fully control.

Manual approval

Any new device attempting to connect is blocked and requires your manual confirmation on the server screen.

Shared key

Devices show that they know the same key, without sending the key itself over the network.

Uses challenge-response based on HMAC-SHA256.

Optional encryption

Audio sent over the native protocol can be encrypted with ChaCha20-Poly1305, an authenticated encryption algorithm standardized by the IETF (RFC 8439). The algorithm itself is well studied, but my implementation of it and of the protocol around it has not been audited, and I cannot rule out mistakes. To enable it, select Key security mode on the Send (Server) screen, set your passphrase, and turn on the encryption switch.

Anti-replay protection

In addition to encryption, the receiver is designed to recognize and discard audio packets that are duplicated, out of order, or replayed, using timestamps. This mechanism has not been independently reviewed.

SENDER RECEIVER ENCRYPTED REPLAY PKT
void wfas_encrypt (packet* p) { chacha20_poly1305_seal ( p->data , p->len, shared_key , p->nonce ); } bool verify_auth (client* c) { return hmac_sha256 ( c->challenge , key ) == c->response; } void wfas_encrypt (packet* p) { chacha20_poly1305_seal ( p->data , p->len, shared_key , p->nonce ); } bool verify_auth (client* c) { return hmac_sha256 ( c->challenge , key ) == c->response; }

Public specification

The specification of the WFAS v2 protocol, including the cryptographic details, handshake phases and primitives used, is public on GitHub. Publishing it does not make it secure, but it allows others to review it, and I would welcome corrections.

Read the full specification on GitHub →

Known limitations

In Multicast streaming mode, encryption relies on a static key shared in advance among all clients, so every device holding that key can decrypt the stream. This may be acceptable on a home network you trust, but it is not intended or recommended for public, corporate, or untrusted Wi-Fi networks. There may be other weaknesses that I am not aware of, which is why the disclaimer at the top of this page exists.

Privacy

Read the full privacy policy →
Security & Encryption Notice

The optional WFAS encryption feature is provided "AS IS" and is intended primarily as a lightweight privacy and traffic-protection layer for trusted local networks (LAN/P2P). It is an experimental implementation written by a student as a learning project, and it has not been formally audited.

It is not intended to provide protection against high-threat attackers, hostile networks, or security-critical environments, and it should not be relied upon as a substitute for a dedicated secure transport or other security mechanisms where stronger guarantees are required.

Users and integrators are responsible for evaluating whether WFAS's security properties and their network environment are appropriate for their intended use.

The WFAS protocol and its reference implementations are provided under the terms of their respective open-source licenses. No additional security guarantees are implied beyond those explicitly documented by the protocol and implementation.

If you find a security issue, please report it through the GitHub repositories so I can look into it. I maintain the project on my own in my spare time, so replies may take a while.