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


Link úteis
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/