Página 2 de 3
Enviado: 21 Jan 2008 15:42
por alaminojunior
Curiosidade mórbida.
Como vc está gerando este arquivo ?
Uma outra coisa, percebi que voces mencionaram algo a respeito de "315 caracteres".
Apenas informando: o arquivo tem tamanho variável e não delimitado.
Enviado: 21 Jan 2008 16:55
por ALEX170970
alaminojunior escreveu:Curiosidade mórbida.
Como vc está gerando este arquivo ?
Uma outra coisa, percebi que voces mencionaram algo a respeito de "315 caracteres".
Apenas informando: o arquivo tem tamanho variável e não delimitado.
Alamino Junior:
315 caracteres represanta o tamanho do maior registro do arquivo (no caso o registro E00, que tinha 315 e foi alterado para 297 caracteres pela Portaria CAT 60/2007). É usado apenas para inicializar a variável que recebe os dados para posterior impressão do registro no arquivo TXT. Eu tentei com space(1) e também deu erro.
Estou gerando cada registro com o tamanho solicitado:
E00 297 caracteres;
E01 166 caracteres;
E02 272 caracteres;
E12 101 caracteres;
E13 72 caracteres;
E14 191 caracteres;
E15 267 caracteres;
E16 90 caracteres;
E21 106 caracteres;
EAD 259 caracteres.
Se tiver algum com tamanho errado, por favor me corrija.
Enviado: 21 Jan 2008 17:25
por alaminojunior
Não sei se acabaria dando na mesma, mas eu faço da seguinte maneira:
De um modo geral, vou somando strings, por exemplo:
Código: Selecionar todos
reg01:= "E01"
c2:= "98560671 "
c3:= "N"
c4:= "ECF-IF "
c5:= "SCHALTER "
c6:= "SCHALTER S-PRINT "
c7:= "2.04 "
c8:= space(8)
c9:= space(6)
c10:= "001"
c11:= "46081543000181"
c12:= "APL"
c13:= c14:= "00"+str(val(ecfred)-1,4)
c15:= c16:= dtos(ecfdat)
c17:= "01.00.00"
c18:= "PC5207 01.00.00"
Este é o meu registro E01, depois de testar a impressão, conferi as posições de cada registro, com as posições constantes na CAT60. Bateram todas.
Abra o arquivo gerado com um editor de textos e confira estas posições.
Enviado: 21 Jan 2008 17:51
por ALEX170970
Eu estou fazendo assim, deve dar o mesmo resultado:
Código: Selecionar todos
//REGISTRO E01 *****OK
cEadTxt:=space(1)
cEadTxt:="E01"+cEcfSerie+cEcfMemAd+cEcfTipo+cEcfMarca+cEcfModel+cEcfSoft+cEcfData+cEcfHora+cEcfNume+cEcfCNPJ+"ALT"+ZeroEsq(nRedCRZ-1,6,0)+ZeroEsq(nRedCRZ,6,0)+DataAAAAmmDD(dRedData)+DataAAAAmmDD(dRedData)+"01.00.00PC5207 01.00.00"+chr(13)+chr(10)
GravaLinha()
//- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
function GravaLinha()
//Com a ajuda do colega EOLO.
gravou:=fwrite(arqh,cEadTxt)
if !gravou=len(cEadTxt)
? "ERRO NA GRAVACAO DO REGISTRO"
inkey(0)
endif
//gravou:=space(315)
gravou:=space(1)
return
//-------------------------------------------------------------------------
function ZeroEsq(Var,compr,casas)
//acrescenta zeros a esquerda em variavel caractere
local var2:=space(compr), var3:=space(compr)
do case
case casas = 1
var:=var*10
case casas = 2
var:=var*100
case casas = 3
var:=var*1000
case casas = 4
var:=var*10000
endcase
var2:=str(Var,compr,0)
var3:=replicate("0",compr-len(alltrim(var2)))+alltrim(var2)
return var3
//- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
function DataAAAAMMDD(Var)
//Transforma uma data em string no formato AAAAMMDD
local ano:=space(4), mes:=space(2), dia:=space(2)
ano:=str(year(var))
mes:=str(month(var))
if val(mes) < 10
mes:="0"+ltrim(mes)
endif
dia:=str(day(var))
if val(dia) < 10
dia:="0"+ltrim(dia)
endif
aaaammdd:=alltrim(ano)+alltrim(mes)+alltrim(dia)
return
//- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Enviado: 21 Jan 2008 17:58
por alaminojunior
Já conferiu as posições ?
Enviado: 21 Jan 2008 18:03
por alaminojunior
Um detalhe: Consultando aqui a CAT60, este registro E01, deve terminar exatamente na coluna 166.
Enviado: 21 Jan 2008 18:17
por ALEX170970
Verifiquei todos os registros conforme a CAT 60, o layout está ok.
O seu cliente (ou o contador dele) está conseguindo transmitir para a Secretaria da Fazenda os arquivos que você está gerando?
Eu não estou conseguindo, dá sempre o mesmo erro:
O arquivo EL100001.1C7 foi recusado para processamento
Motivo: erro na validação do arquivo.
Enviado: 21 Jan 2008 18:22
por alaminojunior
Erro na validação é uma resposta um tanto ambigua, não acha ?
Poderia este erro ser retornado por falha na transmissão ?
Enviado: 21 Jan 2008 18:26
por alaminojunior
Se achar conveniente, mande este arquivo para eu dar uma confrontada com o meu.
alaminojunior@ig.com.br
Enviado: 21 Jan 2008 18:26
por Maligno
Os pacotes da Internet contém algoritmo de validação. Difícil passar algum erro.
Enviado: 22 Jan 2008 10:05
por ALEX170970
pringles escreveu:ALEX170970 escreveu:
run OPENSSL genrsa -out MYKEY.PEM 1024
run OPENSSL rsa -in MYKEY.PEM -pubout -out PUBKEY.PEM
run OPENSSL dgst -md5 -sign MYKEY.PEM -out EAD.TXT -hex ARQENT.TXT
Isso mesmo, só que as duas primeiras linhas não devem ser executadas toda vez de se gerar o arquivo digital.
Nestas duas primeiras linhas, você cria as chaves, que devem ser utilizadas na geração do arquivo. Mas você deve gerar as chaves uma única vez. Depois disso, você só vai gerar a assinatura baseado nas chaves já geradas.
Sugestão: gere manualmente as chaves e insira no seu fonte somente a terceira linha, que irá gerar a assinatura baseada nas chaves já existentes.
Se gerar uma chave para cada arquivo, as chaves serão aleatórias e, portanto, a assinatura sempre será diferente (até mesmo para o mesmo arquivo, criptografado duas vezes seguidas).
Ainda tenho uma dúvida:
Na linha de comando da geração do hash, (run OPENSSL dgst -md5 -sign MYKEY.PEM -out EAD.TXT -hex ARQENT.TXT) onde entra o arquivo para ser validado?
Já substituí por MYKEY.PEM, EAD.TXT e ARQENT.TXT, mas só gera o hash se a linha estiver exatamente como consta acima.
O problema é que está gerando sempre a mesma assinatura, até para arquivos diferentes.
Por favor, me ajude. Obrigado.
Enviado: 22 Jan 2008 10:17
por ALEX170970
alaminojunior escreveu:Se achar conveniente, mande este arquivo para eu dar uma confrontada com o meu.
Verifiquei os registros que você mencionou, realmente tinha erros, mas agora está ok. Obrigado.
Apenas o registro EAD que continua gerando sempre igual. Como você está gerando a assinatura de hash?
Enviado: 22 Jan 2008 10:34
por alaminojunior
Alexandre, veja bem:
Código: Selecionar todos
run OPENSSL genrsa -out MYKEY.PEM 1024
run OPENSSL rsa -in MYKEY.PEM -pubout -out PUBKEY.PEM
Estas duas linhas vc executa uma unica vez, para gerar a sua chave privada baseada numa chave publica. Chave esta que fica gravada no arquivo MYKEY.PEM.
A ultima linha:
Código: Selecionar todos
run OPENSSL dgst -md5 -sign MYKEY.PEM -out EAD.TXT -hex ARQENT.TXT
Só lembrando que: ao invéz de mencionar o arquivo "arqent.txt", voce deve mencionar o arquivo que voce havia gerado com os registros.
Com isso é gerada a assinatura digital, que vai estar gravada em EAD.TXT
Depois disso vc precisa ler o conteudo de EAD.TXT e escrever no final do arquivo com os registros.
Que verborréia .... Espero que tenha ajudado menos que atrapalhado.
Enviado: 22 Jan 2008 10:46
por alaminojunior
Outro detalhe: O arquivo EAD.TXT vai conter alguns caracteres a mais. Certifique de ler apenas o que interessa.
#define F_BLOCK 290
cbuffer:= space(F_BLOCK)
nhandley:= fopen("EAD.TXT")
if ferror() != 0
alert("Erro na abertura do arquivo de Assinatura Digital")
quit
else
if fread(nhandley,@cbuffer,F_BLOCK) <> F_BLOCK
alert("Quantidade de Bytes do HASH nÆo confere.")
quit
endif
endif
cbuffer:= subst(cbuffer,-256) // Aqui vc pega só o que interessa.
Enviado: 24 Jan 2008 09:14
por ALEX170970
alaminojunior escreveu:Outro detalhe: O arquivo EAD.TXT vai conter alguns caracteres a mais. Certifique de ler apenas o que interessa.
Infelizmente, não estou conseguindo enviar o arquivo.
Fiz as alterações necessárias, mas continua o mesmo erro:
"O arquivo EL123456.1C7 foi recusado para processamento.
Motivo: erro na validação do arquivo"
Alguém sabe o que é ou já teve este problema?