
Implementación en Zig de TLS 1.3 para QUIC, compatible con RFC 8446/9001 con cero dependencias externas, con protección AEAD, validación X.509 y más de 1000 pruebas.
Una implementación de TLS 1.3 para QUIC escrita en Zig, cumpliendo estrictamente con RFC 8446 (TLS 1.3) y RFC 9001 (QUIC-TLS).
| Aspecto | Información |
|---|---|
| Estabilidad de la API | Producción |
| Versión de Zig | 0.16.0 |
| Plataformas | Linux, macOS, Windows |
El objetivo de handshake <2 ms está validado en configuraciones de certificados Ed25519 y RSA-2048. Las cargas de trabajo secp256r1 (P-256) actualmente ejecutan 2–3 ms por handshake debido a una limitación de la stdlib de Zig upstream (PERF-229). Consulte ADR-0002 para el registro de decisión completo.
✅ Cumplimiento con RFC - Implementa TLS 1.3 (RFC 8446) y QUIC-TLS (RFC 9001) ✅ Cero dependencias - Utiliza solo la biblioteca estándar de Zig ✅ Probado en interoperabilidad - Pruebas de conformidad contra BoringSSL y OpenSSL ✅ Nativo para QUIC - Diseñado para integración con QUIC, sin capa de registro tradicional ✅ Bien probado - 551 pruebas unitarias + vectores de prueba RFC + 449 pruebas de conformidad
# Construir y probar todo
make
# O manualmente
zig build
zig build test
El proyecto utiliza tanto un Makefile como build.zig para mayor flexibilidad:
# Construir y ejecutar todas las pruebas (por defecto)
make
# Construir solo
make build
# Ejecutar suites de pruebas específicas
make test-unit # Pruebas unitarias
make test-vectors # Vectores de prueba RFC 8446/9001
make test-conformance # Conformidad con BoringSSL/OpenSSL (requiere libssl-dev)
# Flujo de trabajo de desarrollo
make dev # Formatear + verificar + pruebas unitarias
make clean # Limpiar artefactos de compilación
make help # Mostrar todos los objetivos disponibles
# Construir la biblioteca
zig build
# Ejecutar todas las pruebas
zig build test
# Ejecutar suites de pruebas específicas
zig build test-vectors
zig build test-conformance # Requiere bibliotecas de desarrollo de OpenSSL
# Con optimizaciones
zig build -Doptimize=ReleaseFast
Build Summary: All steps succeeded; 1000 tests passed ✅
Cobertura integral de pruebas:
Total: 1000 pruebas que garantizan cumplimiento con RFC, paridad criptográfica y preparación para producción
src/
├── lib.zig # Punto de entrada principal de la biblioteca
├── tls13/ # Máquina de estados del handshake TLS 1.3 (modularizada)
├── tls13_full.zig # Análisis sintáctico completo de mensajes TLS 1.3
├── key_schedule.zig # Derivación de claves basada en HKDF
├── record.zig # Capa de registro y operaciones AEAD
├── x509.zig # Análisis sintáctico y validación de certificados
├── sig.zig # Verificación de firmas
├── asn1.zig # Decodificador ASN.1 DER
├── alert.zig # Protocolo de alerta TLS
├── entropy.zig # Ayudante RNG de cierre seguro (SEC-074)
├── zero_rtt.zig # Soporte 0-RTT
└── quic_*.zig # Interfaces de integración con QUIC
tests/
├── rfc8446_vectors.zig # Vectores de prueba RFC
├── boringssl_conformance.zig # Pruebas de paridad con BoringSSL
└── openssl_conformance.zig # Pruebas de conformidad con OpenSSL
const std = @import("std");
const tls = @import("ztls");
pub fn main() !void {
var gpa = std.heap.GeneralPurposeAllocator(.{}){};
defer _ = gpa.deinit();
// Configurar contexto TLS
const config = tls.Config{
.allocator = gpa.allocator(),
.role = .client,
.supported_cipher_suites = &.{.TLS_AES_128_GCM_SHA256},
.supported_groups = &.{.x25519},
.alpn_protocols = &.{"h3"},
};
// Configurar callbacks
const callbacks = tls.Callbacks{
.on_secret_available = mySecretCallback,
.on_handshake_complete = myHandshakeCallback,
};
// Inicializar contexto TLS
var ctx = try tls.Context.init(config, callbacks);
defer ctx.deinit();
// Procesar tramas CRYPTO entrantes desde QUIC
try ctx.processCrypto(crypto_data);
}
std.crypto.kdf.hkdfEl proyecto incluye pruebas de conformidad completas para garantizar la compatibilidad con implementaciones TLS estándar de la industria:
Para ejecutar pruebas de conformidad:
# Instalar primero las bibliotecas de desarrollo de OpenSSL
make install-deps # Detecta automáticamente su SO
# Ejecutar pruebas de conformidad
make test-conformance
ztls incluye una interfaz opt-in para OpenTelemetry. Cuando se usa el flag de compilación -Dwith_otel=true,
la biblioteca emite exactamente un span por handshake TLS
(nombre del span: "TLS handshake") con los siguientes atributos
de convención semántica adjuntos al completarse:
tls.role -- "client" o "server"tls.protocol.version -- "1.3" (siempre para ztls)tls.cipher_suite -- el cifrado negociado (p. ej.
TLS_AES_128_GCM_SHA256)network.protocol.name -- "tls"# Compilación por defecto: sin símbolos otel, sin sobrecarga.
zig build test
# Compilación habilitada: un span por handshake, exportado a través de los
# valores predeterminados de OTLP (http://localhost:4318) o cualquier variable
# de entorno OTEL_* que se especifique.
zig build test -Dwith_otel=true
La interfaz está protegida por una dependencia perezosa, por lo que el paquete otel solo
se obtiene cuando el flag está activado. El código de punto de entrada de la aplicación que
desee instalar un TracerProvider debe llamar a
ztls.observability_init.Otel.init y luego installGlobals(); consulte
la receta de integración del paquete otel upstream (otel/docs/integration/RECIPE.md)
para el arranque completo de la aplicación host.
# Iteración rápida de desarrollo
make dev
# Formatear código
make fmt
# o
zig fmt src/ tests/
# Verificar sintaxis
make check
# Compilación limpia
make clean build
Al agregar funcionalidades:
Licencia Apache-2.0 - consulte LICENSE para más detalles.
Construido con Zig 0.16.0 | TLS 1.3 | Nativo para QUIC | Cumplimiento RFC