Página 1 de 1

Assinar XML com várias assinaturas (NFSE)

Enviado: 01 Abr 2024 17:14
por JoséQuintas
Ainda estou fazendo os testes finais, mas.........
Na sefazclass atual, pra um único bloco:

Código: Selecionar todos

oBlocoAssinatura := oDoc:SelectSingleNode( ".//ds:Signature" )
Para um ou vários blocos:

Código: Selecionar todos

oNodes := oDoc:SelectNodes( ".//ds:Signature" )
DO WHILE .T.
   oTemp := oNodes:NextNode()
   IF ValType( oTemp ) != "O"
      EXIT
   ENDIF
   oBlocoAssinatura := oTemp
ENDDO
IF ValType( oBlocoAssinatura ) != "O"
   ? "Não encontrou nenhum bloco de assinatura"
ENDIF
Deu um certo trabalho, porque Len( oNodes ) retorna um número, que por coincidência batia com o primeiro teste, mas não serve.
NextNode() deu a impressão de começar no segundo, mas começa no primeiro.
A assinatura final é no último bloco de assinatura.

SelectSingleNode() só funciona quando o XML só tem uma assinatura, se tem mais de uma dá erro.

Só não testei assinar tudo de uma vez, mas de qualquer forma, a última assinatura depende disso acima pra funcionar.
test.png
test.png (2.41 KiB) Exibido 1852 vezes
Isso é o resultado se for testar ValType() de cada NextNode()
Quando NÃO é "O" significa que acabou, não adianta testar se é NIL.

o teste do print-screen é este:

Código: Selecionar todos

FOR nCont = 1 TO 5 
   oResult := oNodes:NextNode()
   ? nCont, ValType( oResult )
NEXT
Testado aqui com GTWVG.
Testado pelo Marcelo/RJ com FIVEWIN.

Assinar XML com várias assinaturas (NFSE)

Enviado: 01 Abr 2024 17:21
por JoséQuintas
vb6.png
A IDE do VB6 ajudou na descoberta.
A briga depois foi pra descobrir como usar kkkk

Assinar XML com várias assinaturas (NFSE)

Enviado: 02 Abr 2024 15:48
por JoséQuintas
Pra quem não entendeu assinatura, aqui vai o CONCEITO, detalhes se vê depois:

a) Processo de assinatura 1

- Precisa do XML, óbvio, criado igual TXT ou com componentes de XML
- Antes de assinar precisa adicionar o bloco de assinatura básico VAZIO
Esse bloco é referência pra assinatura sobre como formatar o XML, calcular o HASH e calcular a ASSINATURA
- Depois assinar
- É comum a assinatura ou o certificado/key ser dividido em blocos e com CR/LF. É interessante ajustar depois esse bloco

b) Processo de assinatura 2

NÃO é o XML que é assinado.
É calculado um hash, como se fosse um dígito de controle do XML, mas é um pequeno texto, e não só um dígito
A assinatura é encima desse hash
A rotina de assinatura acrescenta no XML essa assinatura, alguns detalhes a mais, e também a chave pública do certificado.
Essa chave contém praticamente uma cópia do certificado, mas sem a chave particular usada pra assinar, ela serve pra conferir a assinatura.

c) Processo de assinatura 3

Uso a CAPICOM pra assinar.
Ela sozinha consegue calcular hash, consegue assinar hash, mas não faz os outros processos usados pra assinar.
No Windows temos MSXML2, MSXML3, MSXML4 e MSXML6.
Apenas como parte do OFFICE saiu MSXML5, é a única versão que possui recursos pra tratar assinatura.
Com essa dupla, aí sim, é possível fazer o processo de assinatura completo.

d) Processo de assinatura 4

Também faz parte do processo formatar o XML seguindo os padrões.
Por exemplo, uma tag vazia: [codigo][/codigo] é transformada em [codigo/]
Também são removidos espaços em branco indevidos, e outras coisas mais.
[nome]jose [/code] pode ser convertido pra [nome]jose[/nome]
Mas é sempre bom já gerar o XML o mais formatado possível, porque rotinas de assinatura que não fizerem a formatação vão dar resultado diferente - hash diferente e assinatura diferente.

Olhar XML pelo EDGE ou outro programa é uma opção, MAS NÃO É CONFIÁVEL.
Esses programas também formatam o XML, e o que está se vendo não é o conteúdo exato do arquivo texto do xml.

Está aí um exemplo, como a visualização é diferente do conteúdo.
test.png