← Nota técnica PTEN

Busca certificada · auditoria

Registro de triagem assinado e verificável

Como “certifica e assina” funciona de verdade — a diferença entre “confie em nós” e “verifique você mesmo”.

Resumo Uma busca certificada garante, por construção, que nenhum match verdadeiro escapa. Mas como um auditor que não confia no operador confirma isso meses depois? Descrevemos um registro de triagem que carrega a resposta com testemunhas, preso à versão exata da lista de sanções (um commit de Merkle) mais os parâmetros e o instante, e assinado (Ed25519). Um verificador independente — só com a chave pública e o commit da lista — confere assinatura, sanidade, pertinência e completude, e detecta qualquer adulteração. É o artefato que Model Risk e auditoria de fato pedem.

1Certificar não é o mesmo que assinar

“Certificar” é uma propriedade da computação: a busca devolve todos os nomes dentro do raio, zero falso negativo, porque a poda só descarta um ponto quando uma cota inferior prova que ele está além do raio. É um teorema, verificado em teste contra o brute-force a cada camada.

“Assinar” é outra coisa: é tornar a resposta não-repudiável e verificável por um terceiro. Um regulador não quer a sua palavra de que a triagem estava correta — quer um registro que ele possa checar sozinho, anos depois, e ter certeza de que não foi alterado. É a diferença entre confiança e prova, agora no nível operacional.

2As peças do registro

Cada triagem emite um documento com três blocos, selado por uma assinatura:

CLAIM  — commit da lista (Merkle root) · raio r_α · piso de recall · tempo · versão RESPOSTA — consulta · matches, cada um com sua distância exata (In / Possible) TESTEMUNHAS — prova de Merkle de que cada match pertence à lista comprometida Ed25519
Figura 1. O registro. O claim prende a resposta à versão exata da lista (o commit de Merkle) e aos parâmetros; a resposta traz os matches com distância exata; as testemunhas são provas de Merkle de pertinência. Tudo é serializado de forma canônica e assinado — íntegro e não-repudiável.

O commit de Merkle é o segredo do “contra a lista certa”: um hash-raiz de toda a lista de sanções. Cada match traz um caminho curto (≈16 hashes) que prova que aquele nome está na lista daquele root — sem precisar transmitir a lista inteira.

3O que o verificador confere — sozinho

O verificador não usa o índice de busca. Precisa apenas da chave pública do serviço e do commit da lista (ambos publicados fora de banda), mais a especificação pública (como normalizar um nome e calcular a distância):

auditor pubkey + root 1 · assinatura Ed25519 válida 2 · distância recomputada ≤ r_α 3 · prova de Merkle (pertinência) 4 · completude: re-execução exaustiva = mesmo conjunto
Figura 2. As quatro checagens independentes. As três primeiras são baratas (assinatura, recompute de poucas distâncias, provas de Merkle curtas). A quarta — completude — é a auditoria definitiva: re-executar a busca exaustiva contra a lista do commit e confirmar o mesmo conjunto.
// OFAC SDN real, 45.197 nomes · consulta = variante de um nome sancionado
consulta: "shwx kokko special economic zone" · r_α=2 · piso ≥0,95
match:    "Shwe Kokko Special Economic Zone" (d=1) · assinado (Ed25519)

VERIFICAÇÃO INDEPENDENTE
 assinatura Ed25519 válida — íntegro e não-repudiável
 commit da lista bate com o root confiável
 cada match a ≤ r_α (distância recomputada) — são
 cada match é membro da lista comprometida (prova de Merkle)
 completude: re-execução exaustiva devolve o mesmo conjunto — nada omitido

4Adulteração é detectada — nas duas vias

A força do registro é que a verificação não depende da palavra do operador:

// (a) alterar o registro depois de assinado
alterar a consulta após assinar  → assinatura INVÁLIDA ✗ (detectado)

// (b) forjar um match perfeito e RE-ASSINAR com a mesma chave
forjar distância=0 e re-assinar  → o verificador recomputa e acha d=1 ≠ 0  (detectado)

No caso (a), a assinatura sela o conteúdo exato — um byte trocado a invalida. No caso (b), mesmo que o atacante re-assine, o verificador recomputa a distância a partir do nome e da consulta: a prova não vem da palavra de quem assinou, vem da matemática pública.

5O que a assinatura garante — e o que não garante

O escopo faz parte do que se assina

A assinatura garante a claim assinada, com o seu escopo e as suas premissas: a métrica, o raio, o piso de recall conforme (com a premissa de trocabilidade) e a versão exata da lista. Ela não garante a verdade do mundo — se a premissa de trocabilidade quebra (um nome adversarial fora da distribuição de calibração), a garantia não cobre aquilo. Mas a premissa está dentro do registro, explícita e auditável.

Essa é a diferença entre confiança e prova: a confiança esconde a premissa; a assinatura a nomeia, prende ao registro, e deixa um terceiro conferir tudo o que está a jusante dela.

6Em produção

Peças: assinatura Ed25519 e commit de Merkle com SHA-256 (ambos da biblioteca padrão). O verificador é ~100 linhas e não depende do motor de busca. Código de referência aberto (motor SIEVE).