Ola pessoal!!!
Após algum tempo estou voltando a postar novas informações sobre um assunto muito discutido em alguns fóruns de programação. A assinatura digital EAD usada em aplicativos PAF-ECF para atender a nova legislação.
Neste post vou colocar a disposição o exemplo da função que estou usando em meu aplicativo para gerar essa assinatura EAD.
Observações:
Essa função que estou usando foi adquirida em um fórum disponibilizada por um membro e adaptada em meu aplicativo. Todo credito pelo desenvolvimento deve ser atribuído ao mesmo.
Essa assinatura é realizada apenas usando a DLL Libeay32.dll e a unit Libeay32.pas.
Vamos lá:
O primeiro passo é fazer o download da DLL e da Unit necessários para o funcionamento da função em questão.
Clique nos links a seguir para efetuar tal download:
http://www.disi.unige.it/person/FerranteM/delphiopenssl/libeay32.pas
http://www.dll-files.com/dllindex/dll-files.shtml?libeay32
Depois adcione a unit Libeay32.pas ao seu projeto.
Copie os códigos abaixo e faça as adaptações necessárias no seu projeto.
// função para gerar a assinatura EAD
function TECF.AssinaArquivo(fArquivo: String): Boolean;
var aAssinatura : String;
strList : TStringList;
begin
aAssinatura := Sign_RSA_MD5(ExtractFilePath(Application.ExeName)+'avisnet.pem',fArquivo);
// Assina Arquivo
strList := TStringList.Create;
strList.LoadFromFile(fArquivo);
strList.SaveToFile(fArquivo);
// strList.Add('EAD10'+copy(aAssinatura,1,254));
strList.Add('EAD'+aAssinatura);
strList.SaveToFile(fArquivo);
strList.Free;
end;
// função que retorna a assinatura digital EAD usando a DLL
function TECF.Sign_RSA_MD5(chave_privada, arquivo_assinar: string): string;
var Len: cardinal;
mdctx: EVP_MD_CTX;
inbuf, outbuf: array [0..1023] of char;
key: pEVP_PKEY;
a : pEVP_PKEY;
keyfile: pBIO;
oArquivo : TStringList;
begin
if FileExists(chave_privada) = false then
begin
raise Exception.Create('Arquivo da chave privada não foi encontrado.');
end;
if FileExists(arquivo_assinar) = false then
begin
raise Exception.Create('Arquivo para ser assinado não foi encontrado.');
end;
a := nil;
OpenSSL_add_all_algorithms; //
OpenSSL_add_all_ciphers; // InitOpenSSL
OpenSSL_add_all_digests; //
ERR_load_crypto_strings; //
try
keyfile := BIO_new(BIO_s_file());
BIO_read_filename(keyfile, PChar(chave_privada));
key := PEM_read_bio_PrivateKey(keyfile, a, nil, nil);
if key = nil then
begin
raise Exception.Create('Não foi possível ler a chave privada.');
end;
oArquivo := TStringList.Create;
oArquivo.LoadFromFile(arquivo_assinar);
// StrPCopy(inbuf,oArquivo.Text);
// oArquivo.Free;
EVP_SignInit(@mdctx, EVP_md5());
EVP_SignUpdate(@mdctx, pChar(oArquivo.Text), StrLen(pchar(oArquivo.Text)));
// EVP_SignUpdate(@mdctx, @inbuf, StrLen(inbuf));
EVP_SignFinal(@mdctx, @outbuf, Len, key);
BinToHex(outbuf, inbuf,Len);
inbuf[2*Len]:=#0;
oArquivo.Free;
Result := inbuf;
finally
EVP_cleanup; // FreeOpenSSL
end;
end;
Caso tenha efetuado corretamente os procedimentos esta pronto a rotina para assinar digitalmente um arquivo.
Basta agora compilar o projeto, selecionar um arquivo no formato TXT e enviar o comando para executar a rotina. Depois é só conferir a assinatura com o aplicativo eECFc.exe 3.0.12.0.
Qualque dúvida, post um comentário, terei prazer em tirar as dúvidas.