
Implémentation en Zig de TLS 1.3 pour QUIC, conforme aux RFC 8446/9001 avec zéro dépendance externe, offrant une protection AEAD, une validation X.509 et plus de 1000 tests.
Une implémentation TLS 1.3 pour QUIC écrite en Zig, strictement conforme aux RFC 8446 (TLS 1.3) et RFC 9001 (QUIC-TLS).
| Aspect | Info |
|---|---|
| Stabilité de l'API | Production |
| Version Zig | 0.16.0 |
| Plateformes | Linux, macOS, Windows |
L'objectif de handshake <2 ms est validé sur les configurations de certificats Ed25519 et RSA-2048. Les charges de travail secp256r1 (P-256) nécessitent actuellement 2–3 ms par handshake en raison d'une limitation en amont de la bibliothèque standard Zig (PERF-229). Voir ADR-0002 pour le dossier de décision complet.
✅ Conforme aux RFC - Implémente TLS 1.3 (RFC 8446) et QUIC-TLS (RFC 9001) ✅ Zéro Dépendances - Utilise uniquement la bibliothèque standard Zig ✅ Interopérabilité Testée - Tests de conformité contre BoringSSL et OpenSSL ✅ Natif QUIC - Conçu pour l'intégration QUIC, pas de couche d'enregistrement traditionnelle ✅ Bien Testé - 551 tests unitaires + vecteurs de test RFC + 449 tests de conformité
# Build and test everything
make
# Or manually
zig build
zig build test
Le projet utilise à la fois un Makefile et build.zig pour plus de flexibilité :
# Construire et exécuter tous les tests (par défaut)
make
# Construction uniquement
make build
# Exécuter des suites de test spécifiques
make test-unit # Tests unitaires
make test-vectors # Vecteurs de test RFC 8446/9001
make test-conformance # Conformité BoringSSL/OpenSSL (nécessite libssl-dev)
# Workflow de développement
make dev # Formatage + vérification + tests unitaires
make clean # Nettoyer les artefacts de construction
make help # Afficher toutes les cibles disponibles
# Construire la bibliothèque
zig build
# Exécuter tous les tests
zig build test
# Exécuter des suites de test spécifiques
zig build test-vectors
zig build test-conformance # Nécessite les bibliothèques de développement OpenSSL
# Avec optimisations
zig build -Doptimize=ReleaseFast
Build Summary: All steps succeeded; 1000 tests passed ✅
Couverture de Test Complète :
Total : 1000 tests garantissant la conformité RFC, la parité cryptographique et la préparation à la production
src/
├── lib.zig # Point d'entrée principal de la bibliothèque
├── tls13/ # Machine d'état du handshake TLS 1.3 (modularisé)
├── tls13_full.zig # Analyse complète des messages TLS 1.3
├── key_schedule.zig # Dérivation de clé basée sur HKDF
├── record.zig # Couche d'enregistrement et opérations AEAD
├── x509.zig # Analyse et validation de certificats
├── sig.zig # Vérification de signatures
├── asn1.zig # Décodeur ASN.1 DER
├── alert.zig # Protocole d'alerte TLS
├── entropy.zig # Générateur de nombres aléatoires à sécurité maximale (SEC-074)
├── zero_rtt.zig # Support 0-RTT
└── quic_*.zig # Interfaces d'intégration QUIC
tests/
├── rfc8446_vectors.zig # Vecteurs de test RFC
├── boringssl_conformance.zig # Tests de parité BoringSSL
└── openssl_conformance.zig # Tests de conformité OpenSSL
const std = @import("std");
const tls = @import("ztls");
pub fn main() !void {
var gpa = std.heap.GeneralPurposeAllocator(.{}){};
defer _ = gpa.deinit();
// Configurer le contexte TLS
const config = tls.Config{
.allocator = gpa.allocator(),
.role = .client,
.supported_cipher_suites = &.{.TLS_AES_128_GCM_SHA256},
.supported_groups = &.{.x25519},
.alpn_protocols = &.{"h3"},
};
// Configurer les callbacks
const callbacks = tls.Callbacks{
.on_secret_available = mySecretCallback,
.on_handshake_complete = myHandshakeCallback,
};
// Initialiser le contexte TLS
var ctx = try tls.Context.init(config, callbacks);
defer ctx.deinit();
// Traiter les trames CRYPTO entrantes depuis QUIC
try ctx.processCrypto(crypto_data);
}
std.crypto.kdf.hkdfLe projet inclut des tests de conformité complets pour garantir la compatibilité avec les implémentations TLS standards de l'industrie :
Pour exécuter les tests de conformité :
# Installer d'abord les bibliothèques de développement OpenSSL
make install-deps # Détecte automatiquement votre OS
# Exécuter les tests de conformité
make test-conformance
ztls est livré avec un point d'intégration OpenTelemetry optionnel. Lorsque le flag de construction -Dwith_otel=true est activé, la bibliothèque émet exactement une span par handshake TLS (nom de la span : "TLS handshake") avec les attributs de convention sémantique suivants attachés à la fin :
tls.role -- "client" ou "server"tls.protocol.version -- "1.3" (toujours pour ztls)tls.cipher_suite -- le chiffrement négocié (par ex. TLS_AES_128_GCM_SHA256)network.protocol.name -- "tls"# Construction par défaut : aucun symbole otel, zéro surcoût.
zig build test
# Construction activée : une span par handshake, exportée via les
# valeurs par défaut OTLP (http://localhost:4318) ou selon les
# variables d'environnement OTEL_* spécifiées.
zig build test -Dwith_otel=true
Le point d'intégration est protégé par une dépendance paresseuse, donc le paquet otel n'est récupéré que lorsque le flag est activé. Le code du point d'entrée de l'application qui souhaite installer un TracerProvider doit appeler ztls.observability_init.Otel.init puis installGlobals() ; consultez la recette d'intégration otel en amont (otel/docs/integration/RECIPE.md) pour le bootstrap complet de l'application hôte.
# Itération de développement rapide
make dev
# Formater le code
make fmt
# ou
zig fmt src/ tests/
# Vérifier la syntaxe
make check
# Nettoyer et construire
make clean build
Lors de l'ajout de fonctionnalités :
Licence Apache-2.0 - voir LICENSE pour les détails.
Construit avec Zig 0.16.0 | TLS 1.3 | Natif QUIC | Conforme RFC