Files
RetroArch/docs/network-stack.md
T
libretroadmin 0ddc58c44d 3ds, vita, switch: the built-in SMB client
The 3DS, Vita and Switch build smb://: the SMB and Kerberos clients
reach the network only through libretro-common's socket helpers, and
the crypto they rest on draws on each console's hardware random number
generator. The Wii U, whose crypto has only a clock to stir, is left
out: SMB derives its signing and sealing keys from that randomness. The
3DS keeps its SMB transfers at 64 KiB, as it does NFS's.

The compile matrix builds the SMB client, the Kerberos client and the
SMB VFS backend for each of the three under their Makefiles' defines.
2026-09-30 22:44:16 +02:00

9.6 KiB

Built-in network stack: TLS, SMB, NFS and the keychain

RetroArch carries its own implementation of the network protocols it uses: a TLS client for secure web connections, SMB2/3 and NFS clients for loading content from network shares, and an encrypted keychain for saved passwords. All of it lives in libretro-common (crypto/, net/, vfs/, file/keychain.c), is written in C89, and needs no third-party library, so every platform builds it the same way.

Secure connections (TLS)

RetroAchievements, Cloud Sync, the Online Updater and other HTTPS traffic go through the built-in TLS client. It speaks TLS 1.3 (AES-128-GCM, AES-256-GCM, ChaCha20-Poly1305) and TLS 1.2 (ECDHE with AES-GCM or ChaCha20-Poly1305, over RSA or ECDSA certificates). Server certificates are checked against the certificate authority bundle compiled into RetroArch; the operating system's certificate store is not used.

The TLS Certificate Verification setting (tls_verify_mode in retroarch.cfg) chooses what happens when a certificate does not verify:

Value Setting Behaviour
0 Required (Recommended) A certificate that does not verify refuses the connection. The default.
1 Optional (Warn Only) A failed check is logged and the connection goes ahead.
2 Disabled (Insecure) Certificates are not checked; every connection logs a warning.

Anything other than Required lets someone on the network read and change the traffic, passwords included. Lower it only to diagnose a connection problem, and set it back afterwards.

Loading content from SMB shares

The SMB client connects to Windows shares, Samba and NAS devices using SMB 2.0.2 through 3.1.1. Messages are signed (a guest session has no key to sign with); when a server or share requires encryption, traffic is sealed with AES-CCM (SMB 3.0/3.0.2) or AES-GCM (SMB 3.1.1). Authentication is NTLMv2 with a user name and password, or Kerberos in an Active Directory domain.

Enable it under Settings > Network > SMB Network Settings:

Key Default Meaning
smb_client_enable false Turns the client on.
smb_client_server_address Server IP address or host name.
smb_client_share Share name. Empty lists every share the server exports, to pick one while browsing.
smb_client_subdir Directory on the share. Optional.
smb_client_username, smb_client_password Credentials; kept in the keychain (see below).
smb_client_workgroup Workgroup or domain. Optional in many setups.
smb_client_auth_mode 1 1 NTLMSSP, 2 Kerberos, 0 Kerberos if available and NTLM if not.
smb_client_realm Kerberos realm, the Active Directory domain in capitals (EXAMPLE.COM). Empty for password authentication.
smb_client_kdc Kerberos key distribution center host. Empty when the SMB server is the domain controller.
smb_client_num_contexts 4 Connections kept open to the server, 1 to 20.
smb_client_timeout 5 Seconds to wait for the server, 1 to 60.
smb_client_readahead 0 Read-ahead in KiB, 0 (off) to 16384 (see below).

For Kerberos, give the server by host name, not by IP address: the ticket is issued for that name.

Content on a share is addressed as smb://server/share/path/to/game.chd, and the share appears in the file browser once the client is enabled. Cores that read files through the VFS stream straight from the share; other cores have the file copied to local storage first. Changes to these settings apply the next time a share is browsed; content already running keeps its connection. A wired connection is more reliable than Wi-Fi.

Besides the desktop and mobile builds, the 3DS, Vita and Switch carry the SMB client, on their hardware random number generators. The Wii U does not: it has no kernel source of randomness for the keys SMB derives.

Loading content from NFS exports

The NFS client supports NFSv3, which finds the NFS and MOUNT services through the server's portmapper, and NFSv4, which connects straight to the NFS port and addresses the export as a path in the server's pseudo-filesystem. With version 4 chosen, the client speaks the newest of 4.2, 4.1 and 4.0 the server offers, so servers that have dropped 4.0 work too. Over 4.2 it reads with READ_PLUS, which sends the holes of a sparse file as their extent instead of as zeros: an image the filesystem stores sparse costs its data on the network, not its size. A server whose READ_PLUS answers are impossible (nfs-ganesha 4.3's) is read with plain READ instead. It authenticates with AUTH_UNIX, as the user RetroArch runs as; platforms without user IDs, such as Windows and the consoles, send user and group 1000.

Settings > Network > NFS Network Settings:

Key Default Meaning
nfs_server Server IP address or host name.
nfs_export Exported path, for example /export/roms. For NFSv4 the same path works: when the server roots its v4 namespace lower down (Linux fsid=0), the leading part is dropped until the directory is found. Empty to give the export in the address instead.
nfs_subdir Directory under the export. Optional.
nfs_version 3 3, or 4 for the newest of 4.2, 4.1 and 4.0 the server offers.
nfs_port 0 NFS service port; 0 asks the portmapper.
nfs_mount_port 0 MOUNT service port (NFSv3); 0 asks the portmapper.
nfs_num_contexts 4 Connections kept open, 1 to 16.
nfs_timeout 5 Seconds to wait for the server, 1 to 60.
nfs_readahead 0 Read-ahead in KiB, 0 (off) to 16384 (see below).

Content is addressed as nfs://server/export/path/to/game.chd. Besides the desktop and mobile builds, the 3DS, Vita, Switch and Wii U carry the NFS client; it needs no crypto library.

Read-ahead

Read-ahead is off by default: each read a core makes is one request to the server, which suits most content.

Some cores read a disc image in many small pieces, and over a slow or high-latency link each piece costs a round trip, which shows as stutter. With smb_client_readahead or nfs_readahead set, the client fetches a window of that many KiB around each read, with several requests in flight, and on a build with threads a background thread keeps the next window coming for files opened read-only. Each open file then holds that much memory, a second connection and a thread, so it is a poor fit for content that opens many small files at once. Try 1024 for a large disc image that stutters; raise it for a slow link.

Saved passwords: the keychain

Passwords, tokens and stream keys are not written to retroarch.cfg. They go to retroarch-keychain.cfg beside it, each value sealed with ChaCha20-Poly1305: RetroAchievements, WebDAV and S3 cloud sync, Google Drive, the streaming services, SMB, netplay, and the kiosk and settings passwords. Plaintext secrets found in an older retroarch.cfg move into the keychain the next time the configuration is saved.

The key comes from two things: retroarch-keychain.key, a random key file created beside the configuration, and the machine's identity (the Windows MachineGuid, /etc/machine-id on Linux, the host UUID on macOS). On platforms without a machine identity, the key file alone is the key. So retroarch-keychain.cfg copied without its key file, or to another machine, does not open.

Moving a configuration to another machine

A keychain opens on the machine that made it. To take it along, set a passphrase first, under Settings > User > Keychain Passphrase. The passphrase is kept nowhere; it wraps the keychain's key inside retroarch-keychain.key, next to the wrap for the current machine. Nothing needs entering on this machine afterwards.

Copy retroarch.cfg, retroarch-keychain.cfg and retroarch-keychain.key together. On the new machine the keychain comes up locked:

  • the log says so, and the saved passwords are not available;
  • saving the configuration keeps them sealed as they are, and never writes a password in the clear. A password set while the keychain is locked is not saved; unlock first, then set it again.

Open Settings > User > Keychain Passphrase and enter the passphrase. The keychain unlocks, the saved passwords apply at once without a restart, and the keychain is wrapped for the new machine, so it opens by itself from then on. The passphrase stays in the key file for the next move.

To change the passphrase, enter a new one. To remove it, enter nothing. A key file without a passphrase is the plain key file older versions of RetroArch wrote and still read. Deriving the key from a passphrase takes a moment, longer on a handheld; it runs in the background and a notification reports the result.

If the key file is lost, the sealed values cannot be recovered: enter the passwords again. RetroArch never deletes sealed values it cannot open, so restoring the right key file later brings them back.

Build options

The stack is on by default. ./configure switches:

Option Effect
--disable-crypto Leaves out the crypto library and everything built on it: the keychain, the TLS client and the SMB client.
--disable-keychain Stores credentials in the clear in retroarch-keychain.cfg.
--disable-retrossl Leaves out the built-in TLS client.
--disable-retrosmb, --disable-retronfs Leave out the SMB or NFS client.
--enable-mbedtls, --enable-bearssl Use a system mbedTLS or BearSSL for TLS in place of the built-in client.
--enable-libsmb Use a system libsmb2 for SMB in place of the built-in client.

The library options need the library installed and fail at configure time if it is not found. The consoles with 24 or 32 MiB of RAM (GameCube, Wii, PS2) build without the crypto library.