Codec das mensagens ISO 20022 do catálogo do SPI (Pix): encode/2 e decode/1 genéricos, que despacham pelo tipo do modelo (encode/2) ou pelo namespace do XML (decode/1) para o módulo certo — o schema é gerado a partir dos XSDs publicados pelo Banco Central (não redistribuídos aqui — ver mix catalog.gen).

envelope = %Isox.Envelope{
  header: %Isox.AppHdr{...},
  message: %Isox.Pacs008{...}
}

{:ok, xml} = Isox.encode(envelope, :v1_16)
{:ok, %Isox.Envelope{message: %Isox.Pacs008{}}, :v1_16} = Isox.decode(xml)

encode/2 recebe um Isox.Envelope (cabeçalho + modelo da mensagem) e a versão do schema, e devolve o XML pronto (AppHdr + Document) já validado contra o schema. decode/1 faz o caminho inverso: identifica sozinho o tipo da mensagem e a versão a partir do namespace do XML, e devolve os dois de volta dentro de um Isox.Envelope.

Cada mensagem do catálogo também tem seu próprio módulo, de baixo nível — mesma forma de API em todas, mas separada (cabeçalho e modelo como argumentos distintos, sem o envelope, e sem o despacho automático de tipo/versão). Útil se você já sabe de antemão qual mensagem está lidando e quer pular esse despacho — por exemplo, Isox.Pacs008:

{:ok, xml} = Isox.Pacs008.encode(mensagem, cabecalho, :v1_16)
{:ok, mensagem, :v1_16} = Isox.Pacs008.decode(xml)

Assinatura digital

sign/4, verify/2 e generate_test_certificate/0 cobrem o dia a dia de quem consome a lib — assinar o que sua aplicação envia, verificar o que ela recebe, gerar certificado descartável pra testar. Por baixo, isso é implementado em Isox.Xmldsig (um módulo à parte, que não conhece estrutura de mensagem alguma — <Sgntr> é sempre tratado como opaco por esta camada de codec); vá direto lá só se precisar de controle mais fino (perfis com número de referência diferente, por exemplo).

# certificate_der é o certificado de quem ASSINOU a mensagem — não
# o seu: pra assinar o que você manda, é sua própria chave privada
# e seu próprio certificado; pra verificar o que você recebe, é o
# certificado de quem te mandou. Cada lado da conversa só precisa
# da própria chave privada e do certificado público do outro lado
# — nunca da chave privada alheia. Ver a seção de certificados no
# README.
signature_xml = Isox.sign(app_hdr_xml, document_xml, minha_chave_privada_der, meu_certificado_der)
:ok = Isox.verify(envelope_recebido_xml, certificado_de_quem_enviou_der)

Summary

Functions

Decodifica um XML de qualquer mensagem do catálogo, identificando sozinho o tipo e a versão a partir do namespace — substitui Isox.Registry.decode/1 como ponto de entrada principal para quem recebe XML sem saber de antemão que mensagem é.

Codifica um envelope (cabeçalho + modelo da mensagem) para XML, na versão de schema dada. Despacha pelo tipo do modelo em envelope.message para o módulo de baixo nível certo — por exemplo, Isox.Pacs008.encode/3, se envelope.message for um Isox.Pacs008.

Gera, em memória, um par de chave privada + certificado autoassinado para testes. Nunca em produção — ver Isox.Xmldsig.TestCA.

Assina app_hdr_xml + document_xml no perfil de três <ds:Reference> do Manual de Segurança do SFN. Ambos precisam já vir em forma canônica exclusiva — ver Isox.Xmldsig.Signer.sign/4, que esta função só encaminha.

Verifica a assinatura de envelope_xml contra certificate_der — o certificado que você confia para quem assinou. Encaminha para Isox.Xmldsig.Verifier.verify/2.

Functions

decode(xml)

@spec decode(binary()) :: {:ok, Isox.Envelope.t(), atom()} | {:error, term()}

Decodifica um XML de qualquer mensagem do catálogo, identificando sozinho o tipo e a versão a partir do namespace — substitui Isox.Registry.decode/1 como ponto de entrada principal para quem recebe XML sem saber de antemão que mensagem é.

encode(envelope, version)

@spec encode(Isox.Envelope.t(), atom()) :: {:ok, binary()} | {:error, term()}

Codifica um envelope (cabeçalho + modelo da mensagem) para XML, na versão de schema dada. Despacha pelo tipo do modelo em envelope.message para o módulo de baixo nível certo — por exemplo, Isox.Pacs008.encode/3, se envelope.message for um Isox.Pacs008.

generate_test_certificate()

@spec generate_test_certificate() :: Isox.Xmldsig.TestCA.ca()

Gera, em memória, um par de chave privada + certificado autoassinado para testes. Nunca em produção — ver Isox.Xmldsig.TestCA.

sign(app_hdr_xml, document_xml, private_key_der, certificate_der)

@spec sign(binary(), binary(), binary(), binary()) :: binary()

Assina app_hdr_xml + document_xml no perfil de três <ds:Reference> do Manual de Segurança do SFN. Ambos precisam já vir em forma canônica exclusiva — ver Isox.Xmldsig.Signer.sign/4, que esta função só encaminha.

verify(envelope_xml, certificate_der)

@spec verify(binary(), binary()) :: :ok | {:error, Isox.Xmldsig.Verifier.error()}

Verifica a assinatura de envelope_xml contra certificate_der — o certificado que você confia para quem assinou. Encaminha para Isox.Xmldsig.Verifier.verify/2.