Ir para conteúdo
  • Cadastre-se

dev botao

Ajuda Com Ead


Ver Solução Respondido por Régys Silveira,
  • Este tópico foi criado há 3750 dias atrás.
  • Talvez seja melhor você criar um NOVO TÓPICO do que postar uma resposta aqui.

Recommended Posts

Postado

Peço ajuda dos prezados no seguinte:

 

Falta apenas a geração do registro do PAF-ECF para eu liberar o nosso sistema. No caso dos meus clientes e de acordo com a MG001, pois atendo apenas Minas, devo ter o registro U1 e o EAD, lembrando que não tenho inscrição estadual e como é alfa, fica tudo branco.

Peguei o trecho do componente do ACrEAD que é a function CalcularEAD que vai da liha 738 até 789 para entender a lógica e replicar no php, saindo o seguinte:
 
 
$data = <<<EOD
U106996155000106              02133020017   MULTDATA SISTEMAS LTDA - ME                       

EOD;

$pvk = <<<EOD
-----BEGIN RSA PRIVATE KEY-----
MIICXAIBAAKBgQC4TjPRNaDu14Mc7OhQQ+Pro4WQp0ZXdOyXy83FunyYlM4E981A
9W0PC9dO8CRdOdFZOKd0D1fcqLaUf50FiTROTKjzKRxxd6k34eWjJvr3ArkoiuTA
ZorhWrhHZ70zFJG3Nc3vGs4rkm5iury30PC7mMCbz1JVp9BlGU5qX5kWtQIDAQAB
AoGAQp8yJ+vk0rFgmbIhf/Iqj2E6xMFSsgZ4B58KMPFqXJVdq3oP3e1ZkNjM6aHw
4yolPMU38sIhFoh+B0vh7MBeAVpOt+DiLWcOCsRSwe2V8/7sh/wgYNSyJ4R/p6+H
ujC7Yb7OMVPecwyH8oAsDEzSVxkCXVmfhh5cvjlllu7sdDkCQQDpby9d3G6d8kCr
aNNOvcLzSF+YcY/3MK0BpEzRvgW7/GTTK7GJtPiF6VXhn+MmEY0bX8DpgHUF3wrw
/CdvFIBLAkEAyh85ALgAKD0o2lC9xd6nOUxbqsz1CEAHicepw5V5M2+f3TLpwLwa
vvEUdFPfZkROrYPikf9EOWTSRzqtvjBk/wJAfARoA9PSqPNFTEu6x8ClTB8NOq5K
sCcaIx8o+N2dqkvjPRWfkuukhXB8Agyx302/y+VJVkS6502iQHmWcbtQlQJAcaxh
qK/TFs5evXmPYUs5jRYOr96ZKEyqcKikJ2VXRsBOjl7l7AlemWiIcmwBRkjAXwG/
WRDRU94KDRlJQZ+CDQJBAL/3LZ6xZFQZUbiIfwwlaiPzVmTSkrEVnmeSwCsGGMro
mQkHIpVM+FF4jdOBcKKliexdFX+qsqRH265FvTZrME8=
-----END RSA PRIVATE KEY-----
EOD;

$md5File = openssl_digest($data, 'md5');

$hex = dechex(16);

$file = str_pad($hex . $md5File, 128, 0, STR_PAD_RIGHT);

$rsc = openssl_get_privatekey($pvk);

openssl_private_encrypt($file, $signature, $rsc, OPENSSL_NO_PADDING);

file_put_contents('c:\Multpaf\arquivosdigitais\ead.txt', $data . chr(10) . 'EAD' . strtoupper(bin2hex($signature)) . chr(10));

Então explicando o que fiz, baseado no ACBrEAD CalculaEAD

 

carrego o conteúdo do arquivo que quero assinar na variável $data (sem assinatura).
carrego o conteúdo da minha chave privada em $pvk

faço um md5 do $data que é o conteúdo do arquivo.

crio um hexa do número decimal 16 com a função dechex, o conteúdo é sempre 10.

crio a variável $file que é o hex de 16 mais o md5 o conteúdo do arquivo e preencho com 0 a esquerda até o comprimento de 128, ficando: 000000000000000000.....1082b996e081a5cc4c21db940c7562232c (128 caracteres) para se formar o bloco que será criptografado.

Uso o openssl_get_privatekey para criar o resource da chave privada que vou usar a seguir.

Uso o openssl_private_encrypt para criptografar o $file, com a minha private key que vai me gerar $signature

Depois dou uma saída em ead.txt com signature convertido para hex e dou um upper, junto com a literal EAD e com $data que é o primeiro conteúdo sem a assinatura, sempre com chr(10) para LF.

 

Anexo está o arquivo gerado, mas o acbrvalidadorpafecf sempre dá que a assinatura é invalida. Já coloquei tirei quebra de linha, pas a direita a esquerda dos bytes mais significativos. Alguém me dá uma luz se os passos são estes mesmos e poderia me descrever a função CalcularEAD para eu ver se entendi direito como ela se desenrola no Delphi.

ead.txt

Postado

Complementando a informação acima, eu consigo retornar o mesmo conteúdo criptografado com a minha chave privada, usando o openssl_public_decrypt r minha chave pública. Sem problema algum. Quer dizer, está indo e voltando sem perda ou alteração.

  • Fundadores
Postado

Faz muito tempo que escrevi essas rotinas e realmente não lembro de todos os passos...

 

Lembro porém, que inicialmente usávamos a linha de comando (o que era muito mais simples, mas menos seguro, para Desktop)

 

http://www.madboa.com/geek/openssl/#digest-file

Consultor SAC ACBr

Daniel Simões de Almeida
O melhor TEF, é com o Projeto ACBr - Clique e Conheça
Ajude o Projeto ACBr crescer - Assine o SAC

Projeto ACBr     Telefone:(15) 2105-0750 WhatsApp(15)99790-2976.

Postado (editado)

Daniel, a assinatura e si está beleza, o meu problema é o tal bloco de 128 bytes que tem que ser assinado. É muito mal explicado na lei como montá-lo. As rotinas em si de assinatura e criptografia estão ok, onde estão sendo aplicadas, o conteúdo que não consigo enxergar com a explicação do documento do Estado. 

 

Lá no requisito V do SRE 132 MG001 é dito que:

 

c1) aplicar a função unidirecional MD5 uma única vez na porção do arquivo que compreende entre o seu primeiro byte e os bytes de quebra de linha imediatamente anteriores ao registro EAD, ficando excluído do cálculo do hash o registro EAD. O resultado será um código de 128 bits ou 16 bytes que devem ser inseridos no bloco de dados de 128 bytes que será assinado de acordo com a tabela abaixo:

Bloco de dados de 128 bytes que deve ser assinado:

 

Imagem anexada a mensagem bloco128bytes.png
 

onde:

- a letra “A” indica o tamanho do hash e deve ser preenchido com valor fixo 16 (em hexadecimal 0x10).

- a letra “B” indica o local de preenchimento do hash, sendo que à esquerda fica o byte mais significativo e à direita o menos significativo.

- a letra “C” indica os bytes restantes não usados, de preenchimento livre.

c2) criar uma chave privada de 1024 bits, equivalente a um número hexadecimal de 256 dígitos, de conhecimento exclusivo da empresa desenvolvedora do PAF-ECF, devendo ser utilizada a mesma chave para todos os PAF-ECF desenvolvidos pela mesma empresa.

c3) criptografar o bloco de dados gerado conforme disposto na alínea “a”, utilizando a chave a que se refere a aliena “b” pelo algoritmo RSA de chave pública, sem utilizar nenhuma codificação dos dados além da criptografia RSA, de maneira que o bloco de dados seja recuperado no momento da decriptografia exatamente igual ao detalhado na tabela acima.

c4) com o resultado do procedimento descrito na alínea “c3” será obtido um número hexadecimal com até 256 dígitos que deverá ser informado no campo 02 do Registro tipo EAD.

 

Note que da letra B estão preenchido nesse bloco acima 16 posições, mas o md5 por si somente gera uma string com 32 posições.

 

Obrigado pela atenção e se puder me dar um help somente em como montar o tal bloco onde será aplicada a rotina.

 

Abraço

post-25555-0-26534700-1408456341.png

Editado por Siepi
  • Consultores
Postado

Me parece que o ACBrMonitor tem o método assinararquivo ou AssinaArquivoComEAD (algo assim, eu não uso o Monitor).

Acho que ele faz esse serviço de adicionar o EAD no final do arquivo para você.

[]'s

Consultor SAC ACBr

Elton
Profissionalize o ACBr na sua empresa, conheça o ACBr Pro.

Projeto ACBr     Telefone:(15) 2105-0750 WhatsApp(15)99790-2976.

Um engenheiro de Controle de Qualidade(QA) entra num bar. Pede uma cerveja. Pede zero cervejas.
Pede 99999999 cervejas. Pede -1 cervejas. Pede um jacaré. Pede asdfdhklçkh.
Postado

Realmente não tem tal método, e seria exatamente isso. Eu criaria o arquivo e logo após grava-lo chamaria o acbrmonitor invocando um método e passando o path do arquivo como parametro para ele assinar como faz com os demais arquivos. Isso tem como ser implementado?

Postado

Regys, funcionou perfeito. Obrigado

Esse método não está listado no help, seria interessante atualiza-lo lá. Muito util para quando se tem que assinar um arquivo criado pelo PAF.

  • Este tópico foi criado há 3750 dias atrás.
  • Talvez seja melhor você criar um NOVO TÓPICO do que postar uma resposta aqui.

Crie uma conta ou entre para comentar

Você precisar ser um membro para fazer um comentário

Criar uma conta

Crie uma nova conta em nossa comunidade. É fácil!

Crie uma nova conta

Entrar

Já tem uma conta? Faça o login.

Entrar Agora
×
×
  • Criar Novo...

Informação Importante

Colocamos cookies em seu dispositivo para ajudar a tornar este site melhor. Você pode ajustar suas configurações de cookies, caso contrário, assumiremos que você está bem para continuar.