Fase 4: Criptografia e Tesseras Seladas
2026-02-14
Algumas memórias não são para todos. Um diário privado, uma carta para ser aberta em 2050, um segredo de família selado até que os netos tenham idade suficiente. Até agora, toda tessera na rede era aberta. A Fase 4 muda isso: Tesseras agora criptografa conteúdo privado e selado com um esquema criptográfico híbrido projetado para resistir tanto a ataques clássicos quanto quânticos.
O princípio continua o mesmo — criptografar o mínimo possível. Memórias públicas precisam de disponibilidade, não de sigilo. Mas quando alguém cria uma tessera privada ou selada, o conteúdo agora é trancado por criptografia AES-256-GCM com chaves protegidas por um mecanismo híbrido de encapsulamento de chaves combinando X25519 e ML-KEM-768. Ambos os algoritmos precisam ser quebrados para acessar o conteúdo.
O que foi construído
Encriptador AES-256-GCM (tesseras-crypto/src/encryption.rs) — Criptografia
simétrica de conteúdo com nonces aleatórios de 12 bytes e dados autenticados
associados (AAD). O AAD vincula o texto cifrado ao seu contexto: para tesseras
privadas, o hash do conteúdo é incluído; para tesseras seladas, tanto o hash do
conteúdo quanto o timestamp open_after são vinculados no AAD. Isso significa
que mover texto cifrado entre tesseras com datas de abertura diferentes causa
falha na decriptação — você não consegue enganar o sistema para abrir uma
memória selada antecipadamente trocando o texto cifrado para uma tessera com uma
data de selo anterior.
Mecanismo Híbrido de Encapsulamento de Chaves (tesseras-crypto/src/kem.rs)
— Troca de chaves usando X25519 (Diffie-Hellman clássico em curva elíptica)
combinado com ML-KEM-768 (o KEM pós-quântico baseado em reticulados padronizado
pelo NIST, anteriormente Kyber). Ambos os segredos compartilhados são combinados
via blake3::derive_key com uma string de contexto fixa ("tesseras hybrid kem
v1") para produzir uma única chave de criptografia de conteúdo de 256 bits. Isso
segue a mesma filosofia "dual desde o início" das assinaturas duplas do projeto
(Ed25519 + ML-DSA): se qualquer algoritmo for quebrado no futuro, o outro ainda
protege o conteúdo.
Envelope de Chave Selada (tesseras-crypto/src/sealed.rs) — Encapsula uma
chave de criptografia de conteúdo usando o KEM híbrido, para que apenas o dono
da tessera possa recuperá-la. O KEM produz uma chave de transporte, que é XORed
com a chave de conteúdo para produzir uma chave encapsulada armazenada junto ao
texto cifrado do KEM. Ao desselar, o dono decapsula o texto cifrado do KEM para
recuperar a chave de transporte, depois faz XOR novamente para recuperar a chave
de conteúdo.
Publicação de Chave (tesseras-crypto/src/sealed.rs) — Um artefato assinado
independente para publicar a chave de conteúdo de uma tessera selada após a data
open_after ter passado. O dono assina a chave de conteúdo, o hash da tessera e
o timestamp de publicação com suas chaves duais (Ed25519, com placeholder
ML-DSA). O manifesto permanece imutável — a publicação da chave é um documento
separado. Outros nós verificam a assinatura contra a chave pública do dono antes
de usar a chave publicada para decriptar o conteúdo.
EncryptionContext (tesseras-core/src/enums.rs) — Um tipo de domínio que
representa o contexto AAD para criptografia. Ele vive em tesseras-core e não em
tesseras-crypto porque é um conceito de domínio (não um detalhe de implementação
criptográfica). O método to_aad_bytes() produz serialização determinística: um
byte de tag (0x00 para Private, 0x01 para Sealed), seguido do hash de conteúdo
e, para Sealed, o timestamp open_after como i64 little-endian.
Validação de domínio (tesseras-core/src/service.rs) —
TesseraService::create() agora rejeita tesseras Sealed e Private que não
fornecem chaves de criptografia. Esta é uma validação no nível de domínio: a
camada de serviço garante que você não pode criar uma memória selada sem a
maquinaria criptográfica para protegê-la. A mensagem de erro é clara: "missing
encryption keys for visibility sealed until 2050-01-01."
Atualizações de tipos do core — TesseraIdentity agora inclui um campo
opcional encryption_public: Option<HybridEncryptionPublic> contendo tanto as
chaves públicas X25519 quanto ML-KEM-768. KeyAlgorithm ganhou as variantes
X25519 e MlKem768. O layout do sistema de arquivos de identidade agora
suporta node.x25519.key/.pub e node.mlkem768.key/.pub.
Testes — 8 testes unitários para AES-256-GCM (roundtrip, chave errada, texto cifrado adulterado, AAD errado, falha de decriptação cross-context, nonces únicos, mais 2 testes baseados em propriedades para payloads arbitrários e unicidade de nonces). 5 testes unitários para HybridKem (roundtrip, par de chaves errado, X25519 adulterado, determinismo do KDF, mais 1 teste baseado em propriedades). 4 testes unitários para SealedKeyEnvelope e KeyPublication. 2 testes de integração cobrindo o ciclo de vida completo de tesseras seladas e privadas: gerar chaves, criar chave de conteúdo, criptografar, selar, desselar, decriptar, publicar chave e verificar — o ciclo completo.
Decisões de arquitetura
- KEM híbrido desde o início: X25519 + ML-KEM-768 segue a mesma filosofia das assinaturas duplas. Não sabemos quais suposições criptográficas se manterão ao longo dos milênios, então combinamos algoritmos clássicos e pós-quânticos. O custo é ~1,2 KB de material de chave adicional por identidade — trivial comparado às fotos e vídeos em uma tessera.
- BLAKE3 para KDF: ao invés de adicionar
hkdf+sha2como novas dependências, usamosblake3::derive_keycom uma string de contexto fixa. O modo de derivação de chaves do BLAKE3 é especificamente projetado para este caso de uso, e o projeto já depende do BLAKE3 para hashing de conteúdo. - Manifestos imutáveis: quando a data
open_afterde uma tessera selada passa, a chave de conteúdo é publicada como um artefato assinado separado (KeyPublication), não modificando o manifesto. Isso preserva a natureza append-only e endereçada por conteúdo das tesseras. O manifesto foi assinado no momento da criação e nunca muda. - Vinculação AAD previne troca de texto cifrado: o
EncryptionContextvincula tanto o hash de conteúdo quanto (para tesseras seladas) o timestampopen_afternos dados autenticados do AES-GCM. Um atacante que copie conteúdo criptografado de uma tessera "selada até 2050" para uma tessera "selada até 2025" vai descobrir que a decriptação falha — o AAD não corresponde mais. - Encapsulamento de chave por XOR: o envelope de chave selada usa um XOR simples da chave de conteúdo com a chave de transporte derivada do KEM, ao invés de uma camada adicional de AES-GCM. Como a chave de transporte é um valor aleatório fresco do KEM e é usada exatamente uma vez, o XOR é informação-teoricamente seguro para este caso de uso específico e evita complexidade desnecessária.
- Validação de domínio, não validação de storage: a verificação de "chaves
de criptografia ausentes" vive em
TesseraService::create(), não na camada de storage. Isso segue o padrão de arquitetura hexagonal: regras de domínio são aplicadas na fronteira de serviço, não espalhadas pelos adaptadores.
O que vem a seguir
- Fase 4 continuada: Resiliência e Escala — Shamir's Secret Sharing para distribuição de chaves de herdeiros, NAT traversal avançado (STUN/TURN), ajuste de performance, auditorias de segurança, empacotamento para sistemas operacionais
- Fase 5: Exploração e Cultura — Navegador público de tesseras por era/localização/tema/idioma, curadoria institucional, integração com genealogia, exportação para mídia física (M-DISC, microfilme, papel livre de ácido com QR)
Tesseras seladas fazem do Tesseras uma verdadeira cápsula do tempo. Um pai agora pode gravar uma mensagem para o neto que ainda não nasceu, selá-la até 2060 e saber que o envelope criptográfico vai resistir — mesmo que os computadores quânticos do futuro tentem abri-lo antes da hora.