Assinar XML com várias assinaturas (NFSE)

Aqui você poderá oferecer suas Contribuições, Dicas e Tutoriais (Texto ou Vídeo) que sejam de interesse de todos.

Moderador: Moderadores

Avatar do usuário
JoséQuintas
Administrador
Administrador
Mensagens: 20267
Registrado em: 26 Fev 2007 11:59
Localização: São Paulo-SP

Assinar XML com várias assinaturas (NFSE)

Mensagem 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 1850 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.
José M. C. Quintas
Harbour 3.2, mingw, gtwvg mt, fivewin 25.04, multithread, dbfcdx, MySQL, ADOClass, PDFClass, SefazClass, (hwgui mt), (hmg3), (hmg extended), (oohg), PNotepad, ASP, stored procedure, stored function, Linux (Flagship/harbour 3.2)
"The world is full of kings and queens, who blind our eyes and steal our dreams Its Heaven and Hell"

https://github.com/JoseQuintas/
Avatar do usuário
JoséQuintas
Administrador
Administrador
Mensagens: 20267
Registrado em: 26 Fev 2007 11:59
Localização: São Paulo-SP

Assinar XML com várias assinaturas (NFSE)

Mensagem por JoséQuintas »

vb6.png
A IDE do VB6 ajudou na descoberta.
A briga depois foi pra descobrir como usar kkkk
José M. C. Quintas
Harbour 3.2, mingw, gtwvg mt, fivewin 25.04, multithread, dbfcdx, MySQL, ADOClass, PDFClass, SefazClass, (hwgui mt), (hmg3), (hmg extended), (oohg), PNotepad, ASP, stored procedure, stored function, Linux (Flagship/harbour 3.2)
"The world is full of kings and queens, who blind our eyes and steal our dreams Its Heaven and Hell"

https://github.com/JoseQuintas/
Avatar do usuário
JoséQuintas
Administrador
Administrador
Mensagens: 20267
Registrado em: 26 Fev 2007 11:59
Localização: São Paulo-SP

Assinar XML com várias assinaturas (NFSE)

Mensagem 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
José M. C. Quintas
Harbour 3.2, mingw, gtwvg mt, fivewin 25.04, multithread, dbfcdx, MySQL, ADOClass, PDFClass, SefazClass, (hwgui mt), (hmg3), (hmg extended), (oohg), PNotepad, ASP, stored procedure, stored function, Linux (Flagship/harbour 3.2)
"The world is full of kings and queens, who blind our eyes and steal our dreams Its Heaven and Hell"

https://github.com/JoseQuintas/
Responder