Verificação do perfil de assinatura SPI (Manual de Segurança do SFN Vol.
II §3.3): recalcula os três digests com canonicalização real — os bytes
vêm de terceiro, então, diferente da assinatura na saída, não dá pra
confiar que já chegaram canônicos — e confere a assinatura RSA-SHA256
sobre o SignedInfo.
Assume a ordem fixa de Reference do perfil SPI (KeyInfo, AppHdr,
Document) em vez de resolver por tipo — simplificação razoável para um
verificador de perfil único, não um XMLDSig genérico.
certificate_der é o certificado que quem chama já confia para o
participante emissor — o manual deixa explícito que cada participante
mantém sua própria base de números de série e chaves públicas (§3.3,
nota de rodapé), não que se deva confiar em algo vindo dentro da
mensagem. O KeyInfo da mensagem só aponta (por emissor + número de
série) qual certificado deveria ter sido usado; esta função confere que
o certificado dado bate com esse apontamento antes de usar a chave
pública dele pra verificar a assinatura.
Summary
Types
@type error() :: :missing_app_hdr | :missing_document | :missing_signature | :missing_signed_info | :missing_key_info | :missing_signature_value | :wrong_reference_count | {:digest_mismatch, non_neg_integer()} | :certificate_mismatch | :invalid_signature
Functions
Verifica envelope_xml (<Envelope><AppHdr>...<Document>...) contra o
certificado esperado (DER). :ok ou {:error, motivo} — motivo nunca é
detalhe de exceção interna, só as categorias em error/0.