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
EncryptionContext+vincula tanto o hash de conteúdo quanto (para tesseras seladas) o timestamp +open_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.
+ +