Repository navigation
v0.2.0 — verification & trust hardening
Fecha uma auditoria interna de 10 achados na engine de assinatura/verificação (issues #1–#10). A criptografia segue 100% Rust puro (RustCrypto), sem OpenSSL/Java.
Destaques de segurança
- #4 —
/DocTimeStampvalidado de verdade: decodifica oTSTInfo, exige eContentid-ct-TSTInfo, verifica a assinatura CMS da TSA e amarra omessageImprintao dado. A resposta da TSA no caminho de assinatura é conferida contra o imprint. - #6 — validação da cadeia no tempo de assinatura: usa o
genTimede um timestamp RFC 3161 verificado e com TSA confiável (nunca osigningTimeforjável); senão cai em "agora". Evita que cert expirado/revogado seja retrodatado. - #7 — revogação autenticada: CRL precisa estar em escopo, assinada pela CA e vigente; OCSP precisa ser assinado pelo emissor ou responder delegado (
id-kp-OCSPSigning) e vigente. Política soft-fail documentada. - #3 —
/ByteRangeamarrado ao/Contents:covers_whole_documentsó é verdade se o gap excluído for exatamente o/Contents. - #5 — localização estrutural de assinaturas: enumera pelos dicionários do documento, não varrendo bytes (sem falsos
/ByteRangeem streams; sem suposição de ordem de chaves). - #9 — path building com backtracking: encontra cadeias válidas sob cross-signing / intermediários duplicados.
- #2 — exit code honesto da CLI: com
--roots, exige cadeia confiável (novoSignatureReport::all_trusted()). - #1 —
B-T/B-LT/B-LTAsemtsa_urlagora falham em vez de degradar silenciosamente para B-B. - #8 — HTTPS para CRL/OCSP aceito com a feature
https. - #10 — doc-comments internos atualizados.
Compatibilidade
API Rust pública compatível (apenas adições, ex. all_trusted()). Mudanças de comportamento a revisar: sign_pdf_bytes erra sem tsa_url em níveis com timestamp; exit code da CLI considera confiança da cadeia sob --roots; verificação de timestamp/revogação mais estrita.
Consumidores
- R
pdfsigner(extendr): re-sincronizar e re-vendorar a cópia do crate. - Python
pdfsignerpy(PyO3): bumpar a tag pinada parav0.2.0.
Testes: 24 de integração + unit + 2 de rede (freetsa.org, DigiCert); cargo clippy limpo (default + --features https).