SHA-1 e base64

Projeto [x]Harbour - Compilador de código aberto compatível com o Clipper.

Moderador: Moderadores

Avatar do usuário
depaula.jau
Usuário Nível 2
Usuário Nível 2
Mensagens: 98
Registrado em: 15 Mai 2007 17:07
Localização: JAU

SHA-1 e base64

Mensagem por depaula.jau »

Bom dia a todos

Jairo! Qual o Portal para fazer o cadastro do Responsável tecnico ?

Como vcs estão discutindo sobre , imagino que ja tenha isso em algum lugar?

Eu procurei , procurei e não encontrei ainda nada a respeito.


Abrs.
Avatar do usuário
Jairo Maia
Moderador
Moderador
Mensagens: 2785
Registrado em: 16 Ago 2010 13:46
Localização: Campinas-SP

SHA-1 e base64

Mensagem por Jairo Maia »

depaula.jau, conforme a nova versão da NT 2018.005, no futuro será obrigatório para todas as UF´s. Na NT anterior falava em opção de cada UF adotar.

São Paulo declarou que não tem previsão SE ou QUANDO irá adotar o controle de responsável técnico. Trabalho com NF-e somente no estado de SP, e não tem como se cadastrar ainda em SP. No futuro (ainda não definido), e se nada mudar SP terá que adotar.

Já para quem tem emissão nos estados de AL, AM, MS, PE, PR, SC e TO está disponível nos sites de cada SEFAZ, e entra em produção em 07/05/2019.
Abraços, Jairo
Harbour / Clipper 5.2e - Blinker 7
(Não respondo dúvidas por MP ou E-mail. Por favor, não encaminhe via mensagem privada ou e-mail, dúvidas que podem ser compartilhadas com todos no fórum)
Avatar do usuário
JoséQuintas
Administrador
Administrador
Mensagens: 20267
Registrado em: 26 Fev 2007 11:59
Localização: São Paulo-SP

SHA-1 e base64

Mensagem por JoséQuintas »

Algumas UFs exigem o bloco, mas incompleto sem código ou se cadastrar.
Ou seja, nada desse cálculo doido.
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

SHA-1 e base64

Mensagem por JoséQuintas »

Convém lembrar que tem outras alterações que vão entrar.
Em São Paulo não entra o bloco do desenvolvedor, mas entram outras, na semana que vém.
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/
malcarli
Usuário Nível 3
Usuário Nível 3
Mensagens: 239
Registrado em: 20 Ago 2015 18:14
Localização: marilia/sp

SHA-1 e base64

Mensagem por malcarli »

Caro Jairo pegando carona no seu post
seria possivel com a sua rotina converter isso

"31000000OL03 00000000000120070103TNN00000000205000000000000050000002658100013167474254”
2º - Converta a cadeia de caracteres ASCII para bytes.
3º - Gere o HASH (array de bytes) utilizando SHA1.
4º - Assine o HASH (array de bytes) utilizando RSA-SHA1.
ATENÇÃO! Na maioria das linguagens de programação, os passos 3 e 4 são feitos através de uma única função. Verifique a documentação de sua linguagem para evitar assinar um hash de um hash.
Jairo Maia escreveu:Olá Pessoal,

Entre outras coisas, a versão 1.20 da NT 2018.005 também corrigiu o exemplo de como gerar a tag hashCSRT. Agora funciona exatamente como está no manual. Poderiam ter feito a coisa certa antes, pouparia muito tempo de muita gente:

NOTA: No exemplo da NT onde se lê: "resultando em uma string de 28 caracteres (20 bytes)", leia: "Só na cabeça do ENCAT 28 caracteres tem 20 bytes."
hashCSRT.jpg

Código: Selecionar todos

Function Main()

 Clear Screen

 cHash := "G8063VRTNDMO886SFNK5LDUDEI24XJ22YIPO"
 cChave := "41180678393592000146558900000006041028190697"

 /*
   Passo 1:  Concatenar o CSRT com a chave de acesso da NF-e/NFC-e
 */
 cHash := cHash + cChave
 ?
 ? "Resultado passo 1: cHash + cChave:", cHash

 /*
   Passo 2: Aplicar o algorítmo SHA1 resultando em uma string de 40 caracteres em Hexadecimal:
 */
 cHash := Hb_SHA1( cHash, .F. )  // se usar o segundo parâmetro como .T. (raw), elimine o passo 2A
 ?
 ? "Resultado passo 2 SHA1:", cHash

 /*
   Passo 2A: Passar Hexadecimal para String (usei assim apenas para entender o exemplo).
   Se usar no passo acima dessa forma: cHash := Hb_SHA1( cHash, .T. ), elimene essa etapa.
 */
 cHash := HexToStr( cHash )
 ?
 ? "Resultado passo 2A (Hex para Str):", cHash

 /*
   Passo 3: Passar o resultado anterior para Base 64, resultando numa string de 28 bytes:
 */
 cHash := hb_base64Encode( cHash, Len( cHash ) )
 cHash := StrTran( cHash, Hb_EOL() )  // sem quebra de linha (se der erro na validação, não use StrTran())
 ?
 ? "Resultado passo 3 (<hashCSRT> em Base 64):", cHash
 
 ?
 ? "Bingo: Agora o exemplo da NT esta certo..: aWv6LeEM4X6u4+qBI2OYZ8grigw="
 ?

Return Nil
Peguei este exemplo e tentei adaptar, mas não deu certo, é a tag assinatura da nfse de sp

Código: Selecionar todos

/*
https://pctoledo.org/forum/viewtopic.php?f=43&t=18664
*/

#define __TESTE__
#include "minigui.ch"
#define _CAPICOM_STORE_OPEN_READ_ONLY                 0           // Somente Smart Card em Modo de Leitura

#define _CAPICOM_MEMORY_STORE                         0
#define _CAPICOM_LOCAL_MACHINE_STORE                  1
#define _CAPICOM_CURRENT_USER_STORE                   2
#define _CAPICOM_ACTIVE_DIRECTORY_USER_STORE          3
#define _CAPICOM_SMART_CARD_USER_STORE                4

#define _CAPICOM_STORE_OPEN_MAXIMUM_ALLOWED           2
#define _CAPICOM_CERTIFICATE_FIND_SHA1_HASH           0           // Retorna os Dados Criptografados com Hash SH1
#define _CAPICOM_CERTIFICATE_FIND_EXTENDED_PROPERTY   6
#define _CAPICOM_CERTIFICATE_FIND_TIME_VALID          9           // Retorna Certificados Válidos
#define _CAPICOM_CERTIFICATE_FIND_KEY_USAGE           12          // Retorna Certificados que contém dados.
#define _CAPICOM_DIGITAL_SIGNATURE_KEY_USAGE          0x00000080  // Permitir o uso da Chave Privada para assinatura Digital
#define _CAPICOM_AUTHENTICATED_ATTRIBUTE_SIGNING_TIME 0           // Este atributo contém o tempo em que a assinatura foi criada.
#define _CAPICOM_INFO_SUBJECT_SIMPLE_NAME             0           // Retorna o nome de exibição do certificado.
#define _CAPICOM_ENCODE_BASE64                        0           // Os dados são guardados como uma string base64-codificado.
#define _CAPICOM_E_CANCELLED                          -2138568446 // A operação foi cancelada pelo usuário.
#define _CERT_KEY_SPEC_PROP_ID                        6
#define _CAPICOM_CERT_INFO_ISSUER_EMAIL_NAME          0
#define _SIG_KEYINFO                                  2

#include "hbclass.ch"
#ifdef __TESTE__

PROCEDURE TesteCapicom
   LOCAL cTexto, cSignatureValue, cDigestValue, cPublicKey

   cTexto    := "37925504A    00000000102620230323TNN00000000000010000000000000000002919232877058000295"
   cResult:=[NRFumPrLb8GMxh/e0UXVh8aLq6Vim6s1kbOc5AFcOFl61TlhHG6PsTJgZA+HYz2WZ9nVExmbDPffavI0qjFyxE/PZkWCAWzPzXU2DRzFKGGTUSRm4fr/g66AJZX4Ok+W70rCx3wMMKO1R1s83TXQdpcexNxFDoxhBPpUy/wQfNGfmxKZsMTRkbCjd28Dz3kpOIWNxeuQ2Wc7CV0ko631/kz3ErRDZyig2qcKg3lkpanw27pgLaDAm10EHUrurR/fsmBDnhfzU63V4z1U8iYPsbXT2j6WP6DLdaxzIBdZfiu1+dPlrTlH51fC3Uve8/T5+dUh2MT9D/cwL4g1IxR8eg==]

    msginfo(GeraAssSHA1(ctexto) == cresult)

   RETURN
#endif


FUNCTION GeraAssSHA1(sAssinatura)
LOCAL cRET:=''
LOCAL cCHA:=sAssinatura
LOCAL aRetorno
LOCAL aBytes


oStoreMem := win_oleCreateObject( "CAPICOM.Store" )
oStoreMem:open(_CAPICOM_MEMORY_STORE,'Memoria',_CAPICOM_STORE_OPEN_MAXIMUM_ALLOWED)
oStoreMem:Add( pegaObjetoCertificado()  )
DadosParaAssinar := CreateObject("CAPICOM.SignedData")

// Array de Bytes
aBytes := {}
FOR i:= 1 TO LEN(cCHA)
   AADD( aBytes, ALLTRIM( STR( ASC(SUBSTR( cCHA,i,1))-48 ) ) )
NEXT
// Array de Bytes

DadosParaAssinar:content := HB_SHA1( aBytes, .T. )


oSign := CreateObject("CAPICOM.Signer")
cCHA := DadosParaAssinar:Sign(oSign,.F.,0)
 
msginfo(hb_Base64Encode(ccha))
msginfo(hb_Base64DEcode(ccha))
RETURN(cCHA)

function pegaObjetoCertificado() 
LOCAL oStore, oCertificados, oResult := Nil, nI
Local cSerialCert    := upper([4b8db3b9d22a50b5])

        oStore := win_oleCreateObject( "CAPICOM.Store" )
  IF oStore=nIL
msginfo([erro])
     Return oResult
  ENDIF
     oStore:open(_CAPICOM_CURRENT_USER_STORE,'My',_CAPICOM_STORE_OPEN_MAXIMUM_ALLOWED)
  IF oStore=nIL
 msginfo([erro 1])
    Return oResult
  ENDIF

  oCertificados:=oStore:Certificates()
  FOR nI=1 TO oCertificados:Count()

        IF oCertificados:Item(nI):SerialNumber == cSerialCert
            oResult := oCertificados:Item(nI)

           EXIT
        ENDIF
  NEXT
  oCertificados := Nil
  oStore := Nil
RETURN(oResult)
Responder