
Zig-Implementierung von TLS 1.3 für QUIC, RFC 8446/9001-konform mit null externen Abhängigkeiten, mit AEAD-Schutz, X.509-Validierung und über 1000 Tests.
Eine TLS 1.3-Implementierung für QUIC, geschrieben in Zig, die strikt RFC 8446 (TLS 1.3) und RFC 9001 (QUIC-TLS) einhält.
| Aspekt | Info |
|---|---|
| API-Stabilität | Produktion |
| Zig-Version | 0.16.0 |
| Plattformen | Linux, macOS, Windows |
Das Handshake-Ziel von <2 ms wurde für Ed25519- und RSA-2048-Zertifikatskonfigurationen validiert. secp256r1 (P-256)-Workloads benötigen derzeit 2–3 ms pro Handshake aufgrund einer Einschränkung der upstream Zig stdlib (PERF-229). Siehe ADR-0002 für den vollständigen Entscheidungsdatensatz.
✅ RFC-konform - Implementiert TLS 1.3 (RFC 8446) und QUIC-TLS (RFC 9001) ✅ Keine Abhängigkeiten - Verwendet nur die Zig-Standardbibliothek ✅ Interop-getestet - Konformitätstests gegen BoringSSL und OpenSSL ✅ QUIC-nativ - Entwickelt für QUIC-Integration, keine traditionelle Record-Schicht ✅ Gut getestet - 551 Unit-Tests + RFC-Testvektoren + 449 Konformitätstests
# Build and test everything
make
# Or manually
zig build
zig build test
Das Projekt verwendet sowohl eine Makefile als auch build.zig für Flexibilität:
# Build and run all tests (default)
make
# Build only
make build
# Run specific test suites
make test-unit # Unit-Tests
make test-vectors # RFC 8446/9001 Testvektoren
make test-conformance # BoringSSL/OpenSSL-Konformität (erfordert libssl-dev)
# Development workflow
make dev # Formatierung + Prüfung + Unit-Tests
make clean # Build-Artefakte bereinigen
make help # Alle verfügbaren Ziele anzeigen
# Bibliothek erstellen
zig build
# Alle Tests ausführen
zig build test
# Bestimmte Test-Suites ausführen
zig build test-vectors
zig build test-conformance # Erfordert OpenSSL-Entwicklungsbibliotheken
# Mit Optimierungen
zig build -Doptimize=ReleaseFast
Build Summary: All steps succeeded; 1000 tests passed ✅
Umfassende Testabdeckung:
Insgesamt: 1000 Tests zur Sicherstellung von RFC-Konformität, kryptografischer Parität und Produktionsbereitschaft
src/
├── lib.zig # Main library entry point
├── tls13/ # TLS 1.3 handshake state machine (modularized)
├── tls13_full.zig # Full TLS 1.3 message parsing
├── key_schedule.zig # HKDF-based key derivation
├── record.zig # Record layer & AEAD operations
├── x509.zig # Certificate parsing & validation
├── sig.zig # Signature verification
├── asn1.zig # ASN.1 DER decoder
├── alert.zig # TLS alert protocol
├── entropy.zig # Fail-closed RNG helper (SEC-074)
├── zero_rtt.zig # 0-RTT support
└── quic_*.zig # QUIC integration interfaces
tests/
├── rfc8446_vectors.zig # RFC test vectors
├── boringssl_conformance.zig # BoringSSL parity tests
└── openssl_conformance.zig # OpenSSL conformance tests
const std = @import("std");
const tls = @import("ztls");
pub fn main() !void {
var gpa = std.heap.GeneralPurposeAllocator(.{}){};
defer _ = gpa.deinit();
// Configure TLS context
const config = tls.Config{
.allocator = gpa.allocator(),
.role = .client,
.supported_cipher_suites = &.{.TLS_AES_128_GCM_SHA256},
.supported_groups = &.{.x25519},
.alpn_protocols = &.{"h3"},
};
// Set up callbacks
const callbacks = tls.Callbacks{
.on_secret_available = mySecretCallback,
.on_handshake_complete = myHandshakeCallback,
};
// Initialize TLS context
var ctx = try tls.Context.init(config, callbacks);
defer ctx.deinit();
// Process incoming CRYPTO frames from QUIC
try ctx.processCrypto(crypto_data);
}
std.crypto.kdf.hkdfDas Projekt umfasst umfassende Konformitätstests, um die Kompatibilität mit branchenüblichen TLS-Implementierungen sicherzustellen:
Um Konformitätstests auszuführen:
# OpenSSL-Entwicklungsbibliotheken zuerst installieren
make install-deps # Erkennt Ihr Betriebssystem automatisch
# Konformitätstests ausführen
make test-conformance
ztls wird mit einer opt-in OpenTelemetry-Naht ausgeliefert. Wenn die Build-Flag -Dwith_otel=true gesetzt ist, emittiert die Bibliothek genau einen Span pro TLS-Handshake (Span-Name: "TLS handshake") mit den folgenden semantischen Konventionsattributen, die bei Abschluss angehängt werden:
tls.role -- "client" oder "server"tls.protocol.version -- "1.3" (immer für ztls)tls.cipher_suite -- der ausgehandelte Cipher (z.B. TLS_AES_128_GCM_SHA256)network.protocol.name -- "tls"# Standard-Build: keine otel-Symbole, kein Overhead.
zig build test
# Aktivierter Build: ein Span pro Handshake, exportiert über die OTLP
# Standardeinstellungen (http://localhost:4318) oder beliebige OTEL_* Umgebungsvariablen
# angeben.
zig build test -Dwith_otel=true
Die Naht wird durch eine Lazy-Abhängigkeit abgeschirmt, sodass das otel-Paket nur abgerufen wird, wenn die Flagge gesetzt ist. Anwendungs-Einstiegspunktcode, der einen TracerProvider installieren möchte, sollte ztls.observability_init.Otel.init und dann installGlobals() aufrufen; konsultieren Sie das Upstream-otel-Integrationsrezept (otel/docs/integration/RECIPE.md) für das vollständige Host-Anwendungs-Bootstrap.
# Schnelle Entwicklungsiteration
make dev
# Code formatieren
make fmt
# oder
zig fmt src/ tests/
# Syntax prüfen
make check
# Sauberer Build
make clean build
Beim Hinzufügen von Funktionen:
Apache-2.0-Lizenz - siehe LICENSE für Details.
Erstellt mit Zig 0.16.0 | TLS 1.3 | QUIC-nativ | RFC-konform