Build and test
This walkthrough takes you from a fresh clone to both forms built and tested, and to a running Windows service that answers its first request. Plan on 10 to 20 minutes the first time; most of that is the OpenSSL build.
Before you begin, install the tools listed in Prerequisites.
1. Build and test the L4Re form
Change to the form's directory. From the repository root, the form's .cargo/config.toml doesn't take
effect.
cd l4re
cargo test
On Windows, Strawberry Perl must come before any other Perl on the path, for example
$env:PATH = "C:\Strawberry\perl\bin;" + $env:PATH.
Each test group ends with test result: ok. Among other things, the tests confirm that the linked
OpenSSL provides ML-DSA, that a tampered signature is rejected, and that the test vectors have the real
sizes of signatures and ciphertexts.
For the Linux targets:
cd l4re cargo build --release --target x86_64-unknown-linux-gnu cargo build --release --target aarch64-unknown-linux-gnu # cross-compilation
A program built this way runs a demonstration outside L4Re and exits; it doesn't accept requests.
2. Build and test the Windows form
Point the build at the OpenSSL to link against, and build from the win directory:
$env:OPENSSL_DIR = "C:\OpenSSL-3.6" # your installation directory cd win cargo test cargo build --release
If lib\ contains only static libraries, also set $env:OPENSSL_STATIC = "1". The program ends up in
win\target\release\wvds_crypto_service.exe.
3. Start the Windows service
.\target\release\wvds_crypto_service.exe --no-tui --single
The startup banner shows the OpenSSL version actually linked, for example OpenSSL 3.5.4 30 Sep 2025.
The service then logs Starting gateway: Default Gateway on \\.\pipe\wvds_crypto and waits for
connections.
4. Send a first request
Open a second PowerShell window and ask the service for its status:
$pipe = [System.IO.Pipes.NamedPipeClientStream]::new('.', 'wvds_crypto', 'InOut') $pipe.Connect(5000) $utf8 = [System.Text.UTF8Encoding]::new($false) $reader = [System.IO.StreamReader]::new($pipe, $utf8) $writer = [System.IO.StreamWriter]::new($pipe, $utf8) $writer.NewLine = "`n"; $writer.AutoFlush = $true $writer.WriteLine('{"operation":"info","request_id":"i1"}') $reader.ReadLine() $pipe.Dispose()
The response is a single JSON line with "success":true, "status":"running", and the list of
algorithms. To generate keys, sign, and encrypt, see Call the Windows service.
5. Verify the test vectors independently
You can recompute the L4Re form's test vectors with any OpenSSL 3.5 or later:
python tools/verify-test-vectors.py l4re/crypto_test_vectors.json "C:\Program Files\OpenSSL\bin\libcrypto-3-x64.dll"
The script reports 8 vectors, 0 failures when every vector checks out. For details, see
Verify the test vectors.