[IRPF-Livre, Rnetclient] Impossível enviar declaração

Alexandre Oliva lxoliva en fsfla.org
Lun Mayo 25 09:50:49 UTC 2026


On May 24, 2026, Alexandre Oliva <lxoliva en fsfla.org> wrote:

> Outra descoberta talvez útil é que quem faz a validação do
> receitanet.jar a partir do sha1 em receitanet.dat é o próprio, em
> ControleReceitanet.a().

Queria complementar que esse sha1 não é o calculado por sha1sum, há algo
diferente.

Trago também algumas mensagens (trocadas via XMPP) a respeito do código
descompilado do receitanet-pro-1.32.jar incluído no IRPF2026 1.[012]

‎05/24/2026 | 08:13:49 PM  ‎Adonay Felipe Nogueira‎: O programa de referência usa `A_COMP` (em letras maísculas), mas não sei se isso faz diferença.  
‎05/25/2026 | 03:57:45 AM  ‎lxoliva‎: Adonay Felipe Nogueira, muito bem observado.  várias das strings no receitanet estão em maiúsculas, enquanto o rnetclient as usa em minúsculas.  vale a pena experimentar fazer o rnetclient usar as mesmas convenções.  pior que pode acontecer é não fazer diferença  
‎05/25/2026 | 04:02:43 AM  ‎lxoliva‎: mas provavelmente não vai fazer diferença: aa.a(String, byte[]) converte a String para lowercase, e as demais variantes de aa.a acabam chamando este método  
‎05/25/2026 | 04:26:35 AM  ‎lxoliva‎: se estou lendo direito o código de aa.a(String, byte[]), o caractere antes de a_comp é \x06, indicando o tamanho da string a_comp.  o caractere depois de a_comp deve ser \x04, indicando o tamanho da sequência de bytes associada com a_comp.  os bytes seguintes, pelo menos no rnetclient, seriam 4 \x00.  no receitanet, se for usado um P como implementação de O, também é zero, senão, é o que o método Q.r() retornar  
‎05/25/2026 | 04:38:24 AM  ‎lxoliva‎: a decisão entre P e Q é tomada em w.a(File).  o código tenta um Q primeiro, e só se falhar tenta um P.  o construtor de Q instancia um R que lê a primeira linha do arquivo e tenta intepretar os últimos 10 bytes como um Long.  se falhar, lança uma exceção.  isso deve passar, é o hash no final de cada linha de um arquivo de declaração.  mas depois o construtor de Q testa o início dessa linha, em Q.a(byte[]) procurando os 3 caracteres #01 no início da linha.  não é o caso para um arquivo de declaração de IRPF, então lança uma exceção que nos faz tentar um P  
‎05/25/2026 | 04:39:52 AM  ‎lxoliva‎: será que deveríamos usar outra sala pra falar desse projeto?  imagino que esse papo possa ser desinteressante e indistinguível de um erro de modem para boa parte dos participantes aqui  
‎05/25/2026 | 04:44:26 AM  ‎lxoliva‎: não consegui ir além disso hoje :-(  vc conseguiu algum progresso em termos de instrumentar o receitanet pra ver o que ele está enviando?  
‎05/25/2026 | 04:54:22 AM  ‎lxoliva‎: notei que a descompilação do procyon deixa um pouco a desejar na presença de variáveis locais final em alguns casos.  elas precisariam ser inicializadas no ponto de declaração, mas nem sempre são.  no construtor de Q há um caso mais grave, em que a variável r2 deveria (creio) receber o valor de r, no bloco try/finally, mas está declarada num bloco em que r nem é mais visível.  b também é final mas é inicializada depois.  isso não deve ser recompilável  
‎05/25/2026 | 04:55:45 AM  ‎lxoliva‎: felizmente não precisamos nos preocupar com Q, até onde consigo ver  
‎05/25/2026 | 04:57:10 AM  ‎lxoliva‎: mas isso sugere que um eventual plano de descompilar o IRPF e usá-lo como código fonte pode precisar de bastantes ajustes manuais.  não sei dizer se essas imperfeições são consequência de ofuscamento, otimização, ou só limitações do procyon mesmo  

-- 
Alexandre Oliva, happy hacker            https://blog.lx.oliva.nom.br/
Free Software Activist     FSFLA co-founder     GNU Toolchain Engineer
Learn the truth about Richard Stallman at https://stallmansupport.org/


Más información sobre la lista de distribución Softwares-impostos