Archived
Watch
1
0
Fork
You've already forked libreshield
0
Experimental mTLS alternative
This repository has been archived on 2026-06-28. You can view files and clone it, but you cannot make any changes to its state, such as pushing and creating new issues, pull requests or comments.
  • D 87.1%
  • C 10.8%
  • Makefile 2.1%
Find a file
Repository files (latest commit first)
Filename Latest commit message Latest commit date
2026-06-28 11:57:07 +01:00
src Mark LibreShield as unmaintained 2026-06-28 11:57:07 +01:00
.gitignore Relicense under GPLv3 2026-04-19 20:45:12 +01:00
COPYING Relicense under GPLv3 2026-04-19 20:45:12 +01:00
Makefile Enable contracts for RELEASE builds 2026-04-28 17:34:30 +01:00
README.md Mark LibreShield as unmaintained 2026-06-28 11:57:07 +01:00

WARNING: LibreShield is no longer actively maintained.


LibreShield is an experimental alternative to mTLS for secure communication across untrusted networks. It features post-quantum cryptography (PQC), perfect forward secrecy and anti-replay protection. LibreShield can be used with any transport layer protocol, provided that streams are reliable and in-order.

Examples

Generating an identity:

JSONValue cert;
JSONValue identity;
libreshield.generateIdentity(identity, cert);

Creating a session:

libreshield.Session client;
libreshield.Session server;
scope(exit) client.erase();
scope(exit) server.erase();

client.load(clientIdentity, serverCert);
server.load(serverIdentity, clientCert);

ubyte[] clientHello = client.clientHandshake();
ubyte[] serverHello = server.serverHandshake(clientHello);
client.clientStart(serverHello);
server.serverStart();

Exchanging messages:

ubyte[] clientMessage = cast(ubyte[]) "Hello from client!";
ubyte[] serverMessage = cast(ubyte[]) "Hello from server!";
c1 = client.seal(clientMessage);
c2 = server.seal(serverMessage);
assert(client.unseal(c2) == serverMessage);
assert(server.unseal(c1) == clientMessage);

Cryptography

Identities use a hybrid combination of ed25519 and ML-DSA-65. Key exchange uses a hybrid combination of ECDH (X25519) and KEM (ML-KEM-768). Messages are encrypted using XChaCha20-Poly1305.

Guidance and limitations

LibreShield has not undergone a security audit; exercise caution.

LibreShield provides mutual authentication and transport security, but it does not hide the identities of the communicating parties. If your threat model requires this, you would be better served by mTLS 1.3 or a protocol based on Noise.

If you are defining a new protocol, you should consider compressing your plaintexts (e.g. with zstd) prior to encryption. You should also consider the use of a messaging library (e.g. ZeroMQ).

Compatibility

LibreShield should work correctly on systems which implement 64-bit (LP64) POSIX or POSIX-oriented standards. However, the Makefile (which builds the module and the test suite) is currently configured for GNU/Linux on amd64.

Build

To build the module and the test suite, the following dependencies are required:

  • the GNU D compiler
  • GNU Make
  • libsodium
  • liboqs

then run:

make prepare && make

Report a bug

Report bugs directly to hello@indraj.net.

For security bugs, please allow up to 48 hours for a reply and up to 90 days for the issue(s) to be confirmed and fixed before disclosing them publicly.

License

LibreShield is licensed under the GNU General Public License version 3 or later.