Nesta terceira parte desse pequeno e despretencioso tutorial , vamos dar sequência na Assinatura e a Validação desse mesmo Arquivo(PAF_Produtos.txt ) .Porém utilizando umas funçoes disponibilizadas pela dll da Bematech , a “sign_bema.dll” que é utilizada em conjunto com a libeay32.dll . Ressaltando que estamos usando o AcbrPaf para efetuarmos esta assinatura e posteriormente a validação
As duas funçoes são bem simples de serem usadas e tem como Assinatura a definição abaixo :
function genkkey( cChavePublica: AnsiString; cChavePrivada: AnsiString ): integer; stdcall; external ‘sign_bema.dll’;
function generateEAD( cNomeArquivo: AnsiString; cChavePublica: AnsiString; cChavePrivada: AnsiString; cEAD: AnsiString; iSign: Integer): integer; stdcall; external ‘sign_bema.dll’;
Obs) > definição para o Delphi 2009 e posteiror… Para delphi anteiror a estas versões utilize apenas strings no lugar do AnsiString
Definido o cabeçãlho da função e tendo as dlls incorparados na Raiz do projeto , vamos passar os devidos parâmetros para podermos então a utilizarmos. A primeira função deve ser usada uma unica vez. Como o seu nome é bem sugestivo ela fornecera para nós as referidas chaves
Execute o metodo abaixo uma unica vez
procedure TFormularioQualquer.btnGerarChaveClick(Sender: TObject);
const
priv_key = ‘priv_key_Bematech.pem’;
pub_key = ‘ pub_key_Bematech.pem’;
var
cChavePublica, cChavePrivada : AnsiString;
iRetorno : integer;
StrArquivo:TStrings;
strDirPriv,strDirPub:String;
begin
StrArquivo:=TStringList.Create;
try
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
begin
strDirPriv:=ExtractFilePath(Application.ExeName)+ priv_key;
StrArquivo.Text:=cChavePrivada;
StrArquivo.SaveToFile(StrDirPriv);
StrArquivo.Text:=cChavePublica;
strDirPub:=ExtractFilePath(Application.ExeName)+ pub_key;
StrArquivo.SaveToFile(StrDirPub);
end;
finally
FreeAndNil(StrArquivo);
end;
end;
Apos executarmos este procedimento teremos o Par <Chave Privada e sua correspondente Chave Publica > . Note que se tudo der certo teremos dois Arquivos salvos no diretorio do executável sendo eles conhecidos a seguir :
- priv_key_Bematech.pem ?
- pub_key_Bematech.pem
Todos dois arquivos anteriores são do tipo texto , devem ser guardados a “sete chaves” , mais uma vez reiteramos que são pessoal e intrasnferivel qnd o processo for colocado a nivel de produção .
No programa em si devemos armazenar essas duas constantes . Para isto abrimos o Arquivo priv_key_Bematech.pem , direncionamos o | Pipe (“cursor”) no início do Arquivo dando um Shift + End seguido de um Cntr + C … Com isto ja esta na Aréa de transferencia do Windows o Valor dessas chaves . O proximo passo é Definir a Constante cChavePiv no Programa . Esta constante pode estar numa Unit separada , mas o mais importante que ela tenha visibilidade fora da unidade (no Delphi é tudo aquilo que esta definido entre a Secçção Interface e Implementation ) . Se for querer usar uma Unit , esta podera ser usada ate mesmo em outros projetos , evitando assim a duplicação de codigos nos seus projetos. Deve acrescentar a Unit a LibrayPacth do Delph para ela ser acessivel em todo o delphi , não esqueça é claro de dar uses o nome da Unit qnd for “usa-la” , (neste caso o “sentido de usar” se refere único e exclusivamente a ter acesso aos valores das duas constantes < cChavePiv , cChavePub > que serão definidas nela)
interface
const
cChavePiv =” ;
cChavePub = ”;
implementation
end;
após isto posicione o piple (cursor) entre o ‘|’ parêntesis da Constante cChavePiv =’|‘ ; dê um Ctrl+V transferindo então o conteúdo que fora selecionado na etapa anterior . Neste processo não iremos Concatenar o conteudo por se tratar de Constantes tal como fora feito na etapa anterior , de modo que o unico trabalho é Copiar e Colar . Porém vale resaltar que a string que foi salva no Arquvo priv_key_Bematech.pem tem um comprimento de 256 caracters e no delphi so podemos definir comprimentos de ate 255 . Então teremos sim que fazer uma Concatenação de Strings , mas de forma muito mais simples . Para isto basta colocar o Primeiro caracter Fora da String e Concatena-la com os demais 255
Sua constante deve estar parecida como abaixo … O Caracter “F” é o primeiro caracter do Arquivo priv_key_Bematech.pem . Perceba a concatenação desta String Constante. Isto é devido a limitação do Delphi
cChavePri=‘F’+’EF277A544D94FF9F8946FC76C19963DA4EB17DCF2524EA2E0B999668208AD7E6DF15BA264FB977178224AA4EAD9C4DECF67E976CCB4E33CF606884380C32B61C23BC02FA49C8E94A4BC39EA5E690110B74C995ABF9BF1F4D1A2B0E1B8827984F768EC3EFC55A67D747B1DB63AA55DEE12F2192AAECF78B24892DC150E8D81E1';
Repita o mesmo procedimento para a constante cChavePub . Não faremos aqui as etapas por serem identicas . No final teremos o conteudo da constante cChavePub mais ou menos assim:
cChavePub:=‘C‘+’16F3FF21D72B610CC48BC07334D658FD5A6A82610C7156975F5E3F7E00A2C388499D48D26E72BB79CFCF57053F4597C4C216E8BA2EE1CAE31379437F48515C715DDB4BB249A76EEFB39B0AB8289063C43D149673EE688A41FD69468AE0098B62B624019FA3184F5CF171A9D0BEC0010EC269F9B135772BF933C4A09B6D20141
Novamente o … O Caracter “C” é o primeiro caracter do Arquivo pub_key_Bematech.pem . Perceba novamente a concatenação desta String Constante.
Usaremos agora a função generateEAD para então podermos assinarmos o Arquivo PAF_Produtos ( nosso Arquivo desde da primeira parte do Tutorial ) . Com isto usaremos a seguinte sintaxi
var
regEAD : AnsiString;
begin
SetLength(regEAD,256);
generateEAD(ACBrPAF1.Path+’PAF_Produtos.txt’,
cChavePub,cChavePri,regEAD,1);
Apos executarmos esta chamada , o nosso Arquivo PAF_Produtos ja deve estar devidamente Assinado . Um ponto que deve ser lembrado aqui , que se ja existir uma assinatura neste Arquivo a função generateEAD não sobescreve esta assinatura deixando-a com a assinatura anterior . Se for necessário a uma nova assinatura devemos tirar manualmente ou utilizando algum utilitário á assinatura do Arquivo . Estou dizendo isto porque estamos usando o mesmo arquivo (‘PAF_Produtos ‘), tanto com o Openssl.exe quanto as dll da Bematech o que pode causar uma incompreesão por parte daqueles que forem atestas as veracidades postadas aqui . Não esqueçam portanto deste detalhe
Cabe por fim a Validação desta Assinatura realizada pela dlls da Bematech . Isto faremos no próximo artigo desta jornada. Atê lá e muito obrigado
http://marcosalles.wordpress.com/2011/01/26/assinando-validando-arquivos-acbrpaf-paf-ecf-parte1/
http://marcosalles.wordpress.com/2011/01/26/assinando-validando-arquivos-acbrpaf-paf-ecf-parte2/
http://marcosalles.wordpress.com/2011/01/27/assinando-validando-arquivos-acbrpaf-paf-ecf-parte3/