# `Isox.Xmldsig.Verifier`
[🔗](https://github.com/RicardoSantos-99/isox/blob/v0.2.0/lib/isox/xmldsig/verifier.ex#L1)

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, porque os
bytes
vêm de terceiro, então, diferente da assinatura na saída, não dá pra
não dá para supor 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.

# `error`

```elixir
@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
```

# `otp_certificate`
*macro* 

# `otp_certificate`
*macro* 

# `otp_subject_public_key_info`
*macro* 

# `otp_subject_public_key_info`
*macro* 

# `otp_tbs_certificate`
*macro* 

# `otp_tbs_certificate`
*macro* 

# `verify`

```elixir
@spec verify(binary(), binary()) :: :ok | {:error, error()}
```

Verifica `envelope_xml` (`<Envelope><AppHdr>...<Document>...`) contra o
certificado esperado (DER). `:ok` ou `{:error, motivo}`, e o motivo
nunca é
detalhe de exceção interna, só as categorias em `t:error/0`.

---

*Consult [api-reference.md](api-reference.md) for complete listing*
