Edição 43 - Edição extra: sign_bema.dll
Caro Parceiro,
Primeiramente, gostaríamos de agradecer os feedbacks que temos recebido desde o lançamento de nossa dll que gera as chaves pública e privada, e a assinatura EAD no arquivo para o PAF - a dll sign_bema.dll.
Sem dúvida, esta dll veio para auxiliar nossa comunidade de desenvolvedores na implementação de um dos requisitos mais complexos do PAF-ECF - a Assinatura Digital do arquivo.
Nesta edição extra do Flash-Tip, queremos contribuir ainda mais com nossa comunidade, exemplificando o uso da sign_bema.dll e de suas funções, e mostrar a simplicidade que é gerar estas chaves e o registro EAD no arquivo.
1º passo - A declaração das funções
Nosso primeiro passo, é conhecer a declaração das funções da sign_bema.dll. Vamos fazê-la em Delphi e VB.
- em Delphi:
function genkkey( cChavePublica: String; cChavePrivada: String ): integer; stdcall; external ’sign_bema.dll’;
function setLibType( iTipo: integer ): integer; stdcall; external ’sign_bema.dll’;
function generateEAD( cNomeArquivo: String; cChavePublica: String; cChavePrivada: String; cEAD:String; iSign: Integer): integer; stdcall; external ’sign_bema.dll’;
function validateFile( cNomeArquivo: String; cChavePublica: String; cChavePrivada: String ): integer; stdcall; external ’sign_bema.dll’;
- em VB:
Private Declare Function genkkey Lib “sign_bema.dll” (ByVal cChavePublica As String, ByVal cChavePrivada As String) As Integer
Private Declare Function setLibType Lib “sign_bema.dll” (iTipo as Integer) As Integer
Private Declare Function generateEAD Lib “sign_bema.dll” (ByVal cNomeArquivo As String, ByVal cChavePublica As String, ByVal cChavePrivada As String, ByVal cEAD As String, ByVal iSign As Integer) As Integer
Private Declare Function validateFile Lib “sign_bema.dll” (ByVal cNomeArquivo As String, ByVal cChavePublica As String, ByVal cChavePrivada As String) As Integer
2º passo - Conhecer as funções que serão usadas
A sign_bema.dll possui 4 funções. Dentre elas, temos 2 funções que são usadas para a geração das chaves e da assinatura do arquivo, ou seja, basicamente precisamos de apenas 2 funções para atender ao requisito do PAF-ECF. São elas:
-
genkkey
-
generateEAD
A função genkkey é responsável pela geração das chaves pública e privada, e a função generateEAD é responsável pela assinatura do arquivo, gerando e inserindo o registro EAD.
3º passo - Usar as funções
Veja como é simples a implementação destas duas funções. Vamos codificá-las em Delphi e VB.
- em Delphi:
(…)
setlength( cChavePublica, 256 );
setlength( cChavePrivada, 256 );
iRetorno := genkkey( cChavePublica, cChavePrivada );
if ( iRetorno = 0 ) then
application.MessageBox( ‘Erro de execução!’, ‘ERRO’, MB_ICONINFORMATION + MB_OK )
else
application.MessageBox( ‘Sucesso!’, ‘Atenção’, MB_ICONINFORMATION + MB_OK );
(…)
setlength( cRegistroEAD, 256 );
cNomeArquivo := “C:\Espelho.txt”;
iRetorno := generateEAD( cNomeArquivo, cChavePublica, cChavePrivada, cRegistroEAD, 1 );
if ( iRetorno = 0) then
application.MessageBox( ‘Erro de execução!’, ‘ERRO’, MB_ICONINFORMATION + MB_OK )
else
application.MessageBox( ‘Sucesso!’, ‘Atenção’, MB_ICONINFORMATION + MB_OK );
(…)
- em VB:
(…)
cChavePublica = Space(256)
cChavePrivada = Space(256)
iRetorno = genkkey(cChavePublica, cChavePrivada)
If (iRetorno = 0) Then
MsgBox “Erro de execução!”, vbInformation + vbOKOnly, “ERRO”
Else
MsgBox “Sucesso!”, vbInformation + vbOKOnly, “Atenção”
End If
(…)
cRegistroEAD = Space(256)
cNomeArquivo = “C:\Espelho.txt”
iRetorno = generateEAD( cNomeArquivo, cChavePublica, cChavePrivada, cRegistroEAD, 1 )
If ( iRetorno = 0 ) Then
MsgBox “Erro de execução!”, vbInformation + vbOKOnly, “ERRO”
Else
MsgBox “Sucesso!”, vbInformation + vbOKOnly, “Atenção”
End If
(…)
Detalhando um pouco mais estas duas funções, temos na função genkkey dois parâmetros já inicializados com 256 bytes, um para receber a geração da chave pública e outro para a chave privada, ambas automaticamente.
Tendo em mãos estas duas chaves, podemos assinar o arquivo com a função generateEAD. Esta função possui como parâmetros, o nome do arquivo que será assinado, a chave pública, a chave privada (previamente geradas pela função genkkey), o registro EAD e uma flag que indica se desejamos que o registro EAD já seja incluído no arquivo ou não (1 para sim ou 0 para não). Em relação ao 4º parâmetro (registro EAD), este precisa ser inicializado antes com 256 bytes, pois ele receberá a geração automática da assinatura.
Estas funções retornam um int, onde 1 (um) corresponde ao sucesso da execução e 0 (zero) a algum erro que tenha ocorrido.
Pronto, implementado, validado e funcionando na aplicação! Uma dll com funções simples, que ajudam a atender este requisito do PAF-ECF de forma fácil, rápida e segura.
Quero agora, compartilhar com você algumas dicas importantes para a validação do arquivo:
1) O Fisco possui um programa chamado “eECFc” que faz a validação do arquivo com base na chave pública informada.
2) A software-house deve criar um arquivo XML com o seguinte conteúdo:
<?xml version=”1.0″ ?>
<empresa_desenvolvedora>
<nome></nome>
<chave>
<modulo></modulo>
<expoente_publico>03</expoente_publico>
</chave>
</empresa_desenvolvedora>
Onde:
-
Na TAG <nome> deve ser informado o nome da software-house.
-
Na TAG <modulo> deve ser informada a chave pública gerada.
-
Na TAG <expoente_publico> deve ser informado o expoente de validação. Para Bematech o expoente é 03.
3) A nomenclatura deste arquivo é formada pelo nome da sofware-house mais a extensão “.xml”, exemplo: “EMPRESA.xml”.
4) O arquivo .xml deve ser salvo na pasta “SHOUSE”, localizada onde o “eECFc” foi instalado.
Estamos à disposição para qualquer dúvida que venha a surgir, através dos canais:
|
|
|
|
suporte@bematech.com.br |
|
suporte.andre@bematech.com.br
suporte.iohannes@bematech.com.br suporte.sidnei@bematech.com.br |
|
suporte.andre.luiz
suporte.iohannes suporte.sidnei |
Boas implementações!