Alain da Silva Posted December 1, 2017 Report Share Posted December 1, 2017 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 Quote Link to comment Share on other sites More sharing options...
Alain da Silva Posted December 1, 2017 Author Report Share Posted December 1, 2017 Atualizando... Quote Link to comment Share on other sites More sharing options...
kapiaba Posted December 1, 2017 Report Share Posted December 1, 2017 /* 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 Quote Link to comment Share on other sites More sharing options...
rochinha Posted December 1, 2017 Report Share Posted December 1, 2017 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 Quote Link to comment Share on other sites More sharing options...
Alain da Silva Posted December 1, 2017 Author Report Share Posted December 1, 2017 Rochinha, essa parte eu inclui porque ele dava erro na hb_datetime. Esta rodando em xbarbour. Mas nos asteriscos abaixo ele dá erro. Mas está mostrando os retornos. Só não sei se está certo. Quote Link to comment Share on other sites More sharing options...
rochinha Posted December 1, 2017 Report Share Posted December 1, 2017 Amiguinhos, Alain da Silva posta a mensagem de erro, pra nóis vê. Quote Link to comment Share on other sites More sharing options...
Alain da Silva Posted December 1, 2017 Author Report Share Posted December 1, 2017 Não trouxe os programas, ficou no escritório. Não lembro o erro.Na segunda feira vou voltar a mexer no programa e posto. Sei que um ele não achava esse hb_datetime. Aqui também: * oCapicom:Algorithm := nAlgorithm rochinha 1 Quote Link to comment Share on other sites More sharing options...
Alain da Silva Posted December 1, 2017 Author Report Share Posted December 1, 2017 Kapiaba, agora que vi as observações que fez. Esse mresultado é meu. É só uma função pra mostrar o erro. Quote Link to comment Share on other sites More sharing options...
Alain da Silva Posted December 4, 2017 Author Report Share Posted December 4, 2017 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? Quote Link to comment Share on other sites More sharing options...
kapiaba Posted December 4, 2017 Report Share Posted December 4, 2017 Alguem tem o contato do Jose Quintas? No meu facebook ou direto no PcToledo. Quote Link to comment Share on other sites More sharing options...
JoséQuintas Posted December 6, 2017 Report Share Posted December 6, 2017 (edited) Não sei se já resolveram. Só pesquisar no google CAPICOM SHA256 que vão encontrar o documento sobre qual versão da CAPICOM é necessária pra ter SHA256. E o download pode ser direto da Microsoft. Edited December 6, 2017 by JoséQuintas fotos não aparecem rochinha 1 Quote Link to comment Share on other sites More sharing options...
Eroni Posted December 11, 2017 Report Share Posted December 11, 2017 Boa tarde. Capicom e Sha256 não rola. Quote Link to comment Share on other sites More sharing options...
Recommended Posts
Join the conversation
You can post now and register later. If you have an account, sign in now to post with your account.