[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