Jump to content
Fivewin Brasil

Assinatura XML


Alain da Silva

Recommended Posts

Pessoal, fiz as alterações mas esta dando erro nos asteriscos abaixo:

nalgorithm, datetime...

 

*/
https://github.com/JoseQuintas/sefazclass/blob/master/drafts/assinaturacapicom.prg
*/

/*
http://www.pctoledo.com.br/forum/viewtopic.php?f=43&t=18664
*/

#include "fivewin.ch"
#include "xbrowse.ch"
#include "hbxml.ch"
#include "capicom.ch"

#ifdef __XHARBOUR__
   #xtranslate HB_DateTime()=>DateTime()
#endif


PROCEDURE TESTE
   LOCAL cTexto, cSignatureValue, cDigestValue, cPublicKey

   cTexto    := "seu arquivo cXml"
   cDigestValue    := CapicomClass():HashData( cTexto )
   cSignatureValue := CapicomClass():Sign( cDigestValue, , , @cPublicKey )
   ? cDigestValue
   ? cSignatureValue
   ? cDigestValue == CapicomClass():VerifySignature( cSignatureValue )
   ? IsValidSignatureCapicom( cDigestValue, cSignatureValue )
   ? cPublicKey
RETURN


FUNCTION IsValidSignatureCapicom( cDigestValue, cSignatureValue )
   IF cDigestValue = NIL .OR. cSignatureValue = NIL
      RETURN .F.
   ENDIF
   RETURN CapicomClass():VerifySignature( cSignatureValue ) == cDigestValue


CLASS CapicomClass
   METHOD SelectCertificate()
   METHOD VerifySignature( cSignedData )
   METHOD HashData( cData, nAlgorithm )
   METHOD PublicKey( oCAPICOMCert )
   METHOD Sign( cDigestValue, oCAPICOMcert, nEncode, cPublicKey )
   END CLASS


METHOD SelectCertificate() CLASS CapicomClass
   LOCAL oCapicom, oCertificate
   oCapicom:= xhb_CreateObject( "CAPICOM.Store" )
   oCapicom:Open( CAPICOM_CURRENT_USER_STORE, "My", CAPICOM_STORE_OPEN_READ_ONLY )
   try
      oCertificate := oCapicom:Certificates:Select( "Selecione um certificado digital", "Algoritmo de Assinatura SHA256RSA" )
   catch
      cErroRet:='Problema ao criar objetos solicitados.1'
      RETURN mResultado("Pesquisa de Nota(s) Fiscal(is) Destinada(s).",IIF(m->hDados['NFEProducao'],"PRODUÇÃO","HOMOLOGAÇÃO"),cErroRet)
   end
   IF oCapicom:Certificates:Count() == 0
      RETURN NIL
   ENDIF
   RETURN oCertificate:Item( 1 )

METHOD VerifySignature( cSignedData ) CLASS CapicomClass
   LOCAL oCapicom
   IF cSignedData == NIL
      RETURN NIL
   ENDIF
   oCapicom := xhb_CreateObject( "CAPICOM.SignedData.1" )
   oCapicom:Verify(cSignedData,.F.,CAPICOM_VERIFY_SIGNATURE_ONLY)
   RETURN oCapicom:Content

METHOD HashData( cData, nAlgorithm ) CLASS CapicomClass
   LOCAL oCapicom
   IF cData = NIL
      cData := DToS( Date() ) + Time()
   ENDIF
   IF nAlgorithm = NIL
      nAlgorithm := CAPICOM_HASH_ALGORITHM_SHA_256
   ENDIF
   oCapicom := xhb_CreateObject( "CAPICOM.HashedData.1" )
*   oCapicom:Algorithm := nAlgorithm
   oCapicom:Hash( cData )
   RETURN oCapicom:Value

METHOD PublicKey( oCapicomCert ) CLASS CapicomClass
   LOCAL oCapicom, cPublicKey
   oCapicom := xhb_CreateObject( "CAPICOM.Signer.2" )
   oCapicom:Signer:Certificate := oCAPICOMCert
   oCapicom:Signer:Options := CAPICOM_CERTIFICATE_INCLUDE_CHAIN_EXCEPT_ROOT
   cPublicKey := StrTran( oCapicom:Certificate:Export( CAPICOM_ENCODE_BASE64 ), Chr(13) + Chr(10), "" )
   RETURN cPublicKey

METHOD Sign( cDigestValue, oCAPICOMCert, nEncode, cPublicKey ) CLASS CapicomClass
   LOCAL oCAPICOMSignedData, oCAPICOMSigner, oCAPICOMTimeStamp, cSignature
   IF cDigestValue = NIL
      RETURN NIL
   ENDIF
   IF nEncode = NIL
      nEncode := CAPICOM_ENCODE_BASE64
   ENDIF
   oCAPICOMSigner := xhb_CreateObject( "CAPICOM.Signer.2" ) // versao 2
   IF oCAPICOMCert = NIL
      oCAPICOMCert := ::SelectCertificate()
      IF oCAPICOMCert = NIL
         RETURN NIL
      ENDIF
      oCAPICOMSigner:Certificate := oCAPICOMcert
   ELSE
      oCAPICOMSigner:Certificate := oCAPICOMcert:DefaultInterface
   ENDIF
   IF ! ( oCAPICOMSigner:Certificate:HasPrivateKey ;
         .AND. DToS( oCAPICOMSigner:Certificate:ValidFromDate ) <= DToS( Date() ) ;
         .AND. DToS( oCAPICOMSigner:Certificate:ValidToDate ) >= DToS( Date() ) )
      RETURN NIL
   ENDIF
   oCAPICOMSigner:Options := CAPICOM_CERTIFICATE_INCLUDE_CHAIN_EXCEPT_ROOT
   cPublicKey             := StrTran( oCAPICOMSigner:Certificate:Export( CAPICOM_ENCODE_BASE64 ), Chr(13) + Chr(10), "" )
   oCAPICOMTimeStamp := xhb_CreateObject( "CAPICOM.Attribute" )
   oCAPICOMTimeStamp:Name  := CAPICOM_AUTHENTICATED_ATTRIBUTE_SIGNING_TIME
*   oCAPICOMTimeStamp:Value := hb_DateTime()
*   oCAPICOMSigner:AuthenticatedAttributes:Add( oCAPICOMTimeStamp )
   oCAPICOMSignedData := xhb_CreateObject( "CAPICOM.SignedData.1" )
   oCAPICOMSignedData:Content := cDigestValue
// segundo parametro falso, apenas retona assinatura do texto, não inclui no texto
   cSignature := oCAPICOMSignedData:Sign( oCAPICOMSigner, .F., nEncode )
   RETURN cSignature

 

Link to comment
Share on other sites

/*
https://github.com/JoseQuintas/sefazclass/blob/master/drafts/assinaturacapicom.prg
*/
	/*
http://www.pctoledo.com.br/forum/viewtopic.php?f=43&t=18664
*/
	#include "fivewin.ch"
#include "xbrowse.ch"
#include "hbxml.ch"
#include "capicom.ch"
	#ifdef __XHARBOUR__
   #xtranslate HB_DateTime()=>DateTime()
#endif
	
PROCEDURE TESTE
   LOCAL cTexto, cSignatureValue, cDigestValue, cPublicKey
	   cTexto    := "seu arquivo cXml"
   cDigestValue    := CapicomClass():HashData( cTexto )
   cSignatureValue := CapicomClass():Sign( cDigestValue, , , @cPublicKey )
   ? cDigestValue
   ? cSignatureValue
   ? cDigestValue == CapicomClass():VerifySignature( cSignatureValue )
   ? IsValidSignatureCapicom( cDigestValue, cSignatureValue )
   ? cPublicKey
RETURN
	
FUNCTION IsValidSignatureCapicom( cDigestValue, cSignatureValue )
   IF cDigestValue = NIL .OR. cSignatureValue = NIL
      RETURN .F.
   ENDIF
   RETURN CapicomClass():VerifySignature( cSignatureValue ) == cDigestValue
	
CLASS CapicomClass
   METHOD SelectCertificate()
   METHOD VerifySignature( cSignedData )
   METHOD HashData( cData, nAlgorithm )
   METHOD PublicKey( oCAPICOMCert )
   METHOD Sign( cDigestValue, oCAPICOMcert, nEncode, cPublicKey )
   END CLASS
	
METHOD SelectCertificate() CLASS CapicomClass
   LOCAL oCapicom, oCertificate
	   //oCapicom:= xhb_CreateObject( "CAPICOM.Store" )
   oCapicom:= CreateObject( "CAPICOM.Store" )
	   oCapicom:Open( CAPICOM_CURRENT_USER_STORE, "My", CAPICOM_STORE_OPEN_READ_ONLY )
	   try
      oCertificate := oCapicom:Certificates:Select( "Selecione um certificado digital", "Algoritmo de Assinatura SHA256RSA" )
   catch
      cErroRet:='Problema ao criar objetos solicitados.1'
	      // PECA MRESULTADO ao Jose Quintas:
      // RETURN mResultado("Pesquisa de Nota(s) Fiscal(is) Destinada(s).",IIF(m->hDados['NFEProducao'],"PRODUÇÃO","HOMOLOGAÇÃO"),cErroRet)
	   end
   IF oCapicom:Certificates:Count() == 0
      RETURN NIL
   ENDIF
   RETURN oCertificate:Item( 1 )
	METHOD VerifySignature( cSignedData ) CLASS CapicomClass
   LOCAL oCapicom
   IF cSignedData == NIL
      RETURN NIL
   ENDIF
	   //oCapicom := xhb_CreateObject( "CAPICOM.SignedData.1" )
   oCapicom := CreateObject( "CAPICOM.SignedData.1" )
	   oCapicom:Verify(cSignedData,.F.,CAPICOM_VERIFY_SIGNATURE_ONLY)
	   RETURN oCapicom:Content
	METHOD HashData( cData, nAlgorithm ) CLASS CapicomClass
   LOCAL oCapicom
   IF cData = NIL
      cData := DToS( Date() ) + Time()
   ENDIF
   IF nAlgorithm = NIL
      nAlgorithm := CAPICOM_HASH_ALGORITHM_SHA_256
   ENDIF
	   //oCapicom := xhb_CreateObject( "CAPICOM.HashedData.1" )
	   // Veja com o Jose Quintas onde baixa a DLL CAPICOM.DLL
   oCapicom := CreateObject( "CAPICOM.HashedData.1" )
	*   oCapicom:Algorithm := nAlgorithm
   oCapicom:Hash( cData )
   RETURN oCapicom:Value
	METHOD PublicKey( oCapicomCert ) CLASS CapicomClass
   LOCAL oCapicom, cPublicKey
	   //oCapicom := xhb_CreateObject( "CAPICOM.Signer.2" )
   oCapicom := CreateObject( "CAPICOM.Signer.2" )
	   oCapicom:Signer:Certificate := oCAPICOMCert
   oCapicom:Signer:Options := CAPICOM_CERTIFICATE_INCLUDE_CHAIN_EXCEPT_ROOT
   cPublicKey := StrTran( oCapicom:Certificate:Export( CAPICOM_ENCODE_BASE64 ), Chr(13) + Chr(10), "" )
   RETURN cPublicKey
	METHOD Sign( cDigestValue, oCAPICOMCert, nEncode, cPublicKey ) CLASS CapicomClass
   LOCAL oCAPICOMSignedData, oCAPICOMSigner, oCAPICOMTimeStamp, cSignature
   IF cDigestValue = NIL
      RETURN NIL
   ENDIF
   IF nEncode = NIL
      nEncode := CAPICOM_ENCODE_BASE64
   ENDIF
	   //oCAPICOMSigner := xhb_CreateObject( "CAPICOM.Signer.2" ) // versao 2
   CreateObject( "CAPICOM.Signer.2" ) // versao 2
	   IF oCAPICOMCert = NIL
      oCAPICOMCert := ::SelectCertificate()
      IF oCAPICOMCert = NIL
         RETURN NIL
      ENDIF
      oCAPICOMSigner:Certificate := oCAPICOMcert
   ELSE
      oCAPICOMSigner:Certificate := oCAPICOMcert:DefaultInterface
   ENDIF
   IF ! ( oCAPICOMSigner:Certificate:HasPrivateKey ;
         .AND. DToS( oCAPICOMSigner:Certificate:ValidFromDate ) <= DToS( Date() ) ;
         .AND. DToS( oCAPICOMSigner:Certificate:ValidToDate ) >= DToS( Date() ) )
      RETURN NIL
   ENDIF
   oCAPICOMSigner:Options := CAPICOM_CERTIFICATE_INCLUDE_CHAIN_EXCEPT_ROOT
   cPublicKey             := StrTran( oCAPICOMSigner:Certificate:Export( CAPICOM_ENCODE_BASE64 ), Chr(13) + Chr(10), "" )
	   // oCAPICOMTimeStamp := xhb_CreateObject( "CAPICOM.Attribute" )
   oCAPICOMTimeStamp := CreateObject( "CAPICOM.Attribute" )
	   oCAPICOMTimeStamp:Name  := CAPICOM_AUTHENTICATED_ATTRIBUTE_SIGNING_TIME
*   oCAPICOMTimeStamp:Value := hb_DateTime()
*   oCAPICOMSigner:AuthenticatedAttributes:Add( oCAPICOMTimeStamp )
	   // oCAPICOMSignedData := xhb_CreateObject( "CAPICOM.SignedData.1" )
   oCAPICOMSignedData := CreateObject( "CAPICOM.SignedData.1" )
	   oCAPICOMSignedData:Content := cDigestValue
// segundo parametro falso, apenas retona assinatura do texto, não inclui no texto
   cSignature := oCAPICOMSignedData:Sign( oCAPICOMSigner, .F., nEncode )
   RETURN cSignature


Link to comment
Share on other sites

Amiguinhos,

Alain da Silva, quase um Delon.

Esta classe esta sendo suportada pelo pai da criança, o José Quintas, em seu perfil está como atuante em Harbour 3.4. Mas tenho pra mim que a classe pode ser usada no xHarbour sim.

#ifdef __XHARBOUR__   #xtranslate HB_DateTime()=>DateTime()#endif
	

Link to comment
Share on other sites

bom dia, o primeiro erro acontece aqui:

Time from start: 0 hours 0 mins 58 secs
   Error occurred at: 04/12/2017, 08:50:26
   Error description: Error CAPICOM.HashedData.1/9  The HashedData object does not contain hashed value.
: _ALGORITHM
   Args:
     [   1] = N   4

Só aceita até 3, no caso nAlgorithm := CAPICOM_HASH_ALGORITHM_SHA_256  = 4 acontece o erro.

Será a versão da capicom.dll ? Alguem tem o contato do Jose Quintas?

 

Link to comment
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Reply to this topic...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

Loading...
×
×
  • Create New...