Capítulo 15 — Segurança quântica e pós-quântica: laboratório guiado
Mapa da aula
Aula 15 publicada. Mapa, exemplo, EX029.
flowchart TD
N0["15.1 Ambiente de laboratório"]
N1["15.2 Atividade prática — Laboratório V"]
N2["15.3 Registros de laboratório"]
N3["15.4 Controles negativos"]
N4["15.5 Caso resolvido"]
N5["15.7 Higiene do laboratório"]
N6["Síntese"]
N0 --> N1 --> N2 --> N3 --> N4 --> N5 --> N6
N6 --> EX["Exemplo resolvido"]
EX --> Q["Exercício EX029"]
Desenho lógico
flowchart LR
N0["15.1 Ambiente de laboratório"]
N1["15.2 Atividade prática — Laboratório V"]
N2["15.3 Registros de laboratório"]
N3["15.4 Controles negativos"]
N4["15.5 Caso resolvido"]
N5["15.7 Higiene do laboratório"]
N6["Síntese"]
N0 --> N1 --> N2 --> N3 --> N4 --> N5 --> N6 --> Q["EX029"]
[15.1 Ambiente de laboratório]
|
v
[15.2 Atividade prática — Laboratório V]
|
v
[15.3 Registros de laboratório]
|
v
[15.4 Controles negativos]
|
v
[15.5 Caso resolvido]
|
v
[15.7 Higiene do laboratório]
|
v
[Síntese]
|
v
[Exemplo resolvido] --> [Exercício EX029]
Objetivos de aprendizagem
Você vai (1) executar testes de resposta conhecida e testes negativos; (2) construir um ambiente de laboratório reproduzível para a configuração de PQC; (3) registrar as evidências de forma adequada; e (4) usar controles negativos.
15.1 Ambiente de laboratório
Construa um laboratório isolado: duas VMs ou contêineres (servidor e cliente) com uma biblioteca TLS atual que suporte o ML-KEM, um ponto de captura na rede do laboratório e scripts para executar os handshakes e registrar os resultados. Nenhum dado de produção; nenhuma conexão com as redes de produção.
O laboratório da KLS são dois contêineres numa rede bridge isolada, uma imagem de servidor com OpenSSL 3.5 e NGINX e uma imagem de cliente com quatro bibliotecas TLS, além de um terceiro contêiner rodando o tcpdump na bridge. Tudo é construído a partir de um script no repositório do laboratório, para que o ambiente possa ser destruído e recriado em minutos.
15.2 Atividade prática — Laboratório V
# Lab V (ch 15): known-answer and negative tests - the habit behind validating PQC libraries.
import hashlib
KATS = [ # (function, input, expected hex prefix) - published test values for SHA-3 / SHAKE on empty input
("sha3_256", b"", "a7ffc6f8bf1ed76651c14756a061d662f580ff4de43b49fa82d80a4b80f8434a"),
("shake_128/32", b"", "7f9c2ba4e88f827d616045507605853ed73b8093f6efbc88eb1a6eacfa66ef26"),
]
def run(name, data):
if name == "sha3_256": return hashlib.sha3_256(data).hexdigest()
return hashlib.shake_128(data).hexdigest(32)
for name, data, want in KATS:
print(f"KAT {name:13s}", "PASS" if run(name, data) == want else "FAIL")
SIZES = {"ML-KEM-512": 800, "ML-KEM-768": 1184, "ML-KEM-1024": 1568} # encapsulation-key bytes, FIPS 203
def validate_ek(param, ek):
if len(ek) != SIZES[param]: raise ValueError(f"{param}: expected {SIZES[param]} bytes, got {len(ek)}")
return True
for param, n in [("ML-KEM-768", 1184), ("ML-KEM-768", 1183), ("ML-KEM-512", 1184)]:
try: validate_ek(param, bytes(n)); print(f"negative/positive test {param} len {n}: accepted")
except ValueError as e: print(f"negative/positive test {param} len {n}: rejected ({e})")
Saída esperada:
KAT sha3_256 PASS
KAT shake_128/32 PASS
negative/positive test ML-KEM-768 len 1184: accepted
negative/positive test ML-KEM-768 len 1183: rejected (ML-KEM-768: expected 1184 bytes, got 1183)
negative/positive test ML-KEM-512 len 1184: rejected (ML-KEM-512: expected 800 bytes, got 1184)
Os testes de resposta conhecida confirmam que as primitivas coincidem com as referências; os testes negativos confirmam que as entradas malformadas são rejeitadas. As bibliotecas que suportam a FIPS 203 também devem rejeitar chaves de encapsulamento cujos coeficientes estejam fora do intervalo.
O laboratório tem duas metades. Os testes de resposta conhecida comparam o SHA3-256 e o SHAKE128 sobre a entrada vazia com os digests publicados; um PASS mostra que as funções de hash da plataforma coincidem com a norma. As verificações de comprimento então exercitam a validação: uma chave ML-KEM-768 correta, de 1.184 bytes, é aceita; uma chave de 1.183 bytes é rejeitada; e um valor de 1.184 bytes rotulado ML-KEM-512 é rejeitado, porque o rótulo exige 800 bytes. Esse terceiro caso é o que as equipes esquecem: um comprimento correto para o conjunto de parâmetros errado. Cada mensagem de rejeição nomeia o conjunto de parâmetros, o comprimento esperado e o comprimento real, que é o que um operador precisa num log.
15.3 Registros de laboratório
Registre as versões, os hashes da configuração, os comandos, as saídas e as interpretações. Guarde-os no controle de versão, ao lado dos scripts. Um resultado de laboratório que você não consegue reproduzir é uma anedota.
Um registro de laboratório da KLS é um arquivo Markdown nomeado pela data e pela pergunta, com campos para as versões das bibliotecas, os digests das imagens, o SHA-256 de cada arquivo de configuração, os comandos exatos, a saída bruta e uma interpretação curta. O registro e o script que o produziu são commitados juntos, para que um revisor possa executar de novo os comandos e comparar as saídas linha a linha.
15.4 Controles negativos
Antes de confiar numa verificação, mostre que ela pode falhar: configure o servidor sem o grupo híbrido e confirme que o seu script reporta clássico; inverta um byte num KAT e confirme o FAIL.
A KLS acrescenta um terceiro controle para o script de handshake: um cliente que não sabe falar o grupo híbrido ainda precisa ser reportado como clássico, e não como erro. Um script que passa nos três casos mostrou que consegue distinguir híbrido, clássico e quebrado; um que só imprimiu "híbrido" não mostrou nada.
15.5 Caso resolvido
Registro de laboratório da KLS "LAB-015": servidor OpenSSL 3.5.x, matriz de clientes com quatro bibliotecas, script handshake.sh imprimindo o grupo negociado; resultados: três híbridos, um clássico (cliente Java mais antigo, esperado). Controle negativo: servidor sem o híbrido → o script imprimiu clássico para os quatro. Interpretação: configuração correta; é necessária uma atualização do cliente Java para o híbrido.
O registro também mostra para que o resultado serve. Três negociações híbridas confirmam o perfil do servidor; o resultado clássico do Java é previsto pela versão da sua biblioteca, então vira um chamado de atualização, e não um defeito. O controle negativo prova que o script teria percebido a falta de um grupo. O LAB-015 é citado na solicitação de mudança que depois levou o perfil para a produção.
15.6 Erros comuns e limites
- Laboratórios conectados à produção.
- Resultados sem versões.
- Verificações nunca mostradas falhando.
A KLS viu cada um deles. Uma VM de laboratório que recebeu uma rota para a produção por conveniência conseguia alcançar serviços reais, então a rede do laboratório foi reconstruída sem nenhuma rota de saída. Um resultado redigido como "o híbrido funciona com Java" não tinha versões anexadas e não pôde ser reproduzido depois que a imagem Java mudou. E um verificador de handshakes que imprimia "híbrido" para todos os servidores revelou-se lendo o arquivo de configuração, e não a negociação; ele nunca tinha recebido um servidor clássico, então ninguém percebeu.
15.7 Higiene do laboratório
Desmonte e reconstrua o laboratório a partir dos scripts com regularidade, para que ele nunca derive para um estado não documentado. Fixe as versões dos pacotes, registre os digests das imagens e mantenha os segredos usados no laboratório separados de qualquer repositório de segredos de produção. Quando um laboratório produzir um resultado surpreendente, reconstrua do zero e repita antes de tirar conclusões; muitos aparentes defeitos de biblioteca acabam sendo restos de um experimento anterior.
Por fim, compartilhe o laboratório. Um laboratório que outras equipes podem clonar permite que os donos das aplicações testem os seus próprios clientes contra o gateway de homologação com o híbrido habilitado antes da implantação, o que encontra as incompatibilidades mais cedo e distribui o trabalho para além da equipe de plataforma.
Exercícios
- EX029 — Controle negativo. Projete um controle negativo para um script que verifica a negociação da KEX do SSH. Rubrica: 3 = servidor configurado sem a KEX híbrida, esperar clássico.
- EX030 — Campos do registro. Liste seis campos de um registro de laboratório. Rubrica: 3 = seis campos relevantes.
Síntese
Laboratórios isolados e reproduzíveis, com testes de resposta conhecida, testes negativos e controles negativos, produzem evidências de que as configurações funcionam como pretendido.
Continue estudando — capítulo 15 de 30
← Capítulo 14 · Índice de capítulos do curso · Capítulo 16 →
Siga para a próxima lição escrita.