Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Falha na validação do Hash da parte AuditFile #67

Closed
rsowd014 opened this issue May 22, 2020 · 11 comments
Closed

Falha na validação do Hash da parte AuditFile #67

rsowd014 opened this issue May 22, 2020 · 11 comments
Labels
help wanted Extra attention is needed question Further information is requested

Comments

@rsowd014
Copy link

rsowd014 commented May 22, 2020

Boa tarde,

Desde à 1 mês atrás, começamos a ter um problema de validação do ficheiro SAFT-AO por causa do HASH.

O erro que dá na validação do ficheiro é:

Falha na validação do Hash da parte AuditFile.SourceDocuments.SalesInvoices.2Invoice
Falha na validação do Hash da parte AuditFile.SourceDocuments.SalesInvoices.3Invoice

Estive a verificar e a verificar novamente todos os valores e a criação do HASH e parece tudo ok.´
ExcelDados.xlsx

No excel em anexo, além dos dados das faturas, tenho uma coluna com o HASH gerado e outro (HASHORI) com o HASH antes de ser encriptado.

Envio também o ficheiro XML para verificarem que está com os dados ok.
SAFTAO.txt

Nota: o problema com a validação do HASH começou à relativamente pouco tempo, já tivemos ficheiros submetidos e validados e a forma de fazer o HASH é a mesma.

Agradeço a Vossa ajuda por favor.
Obrigado.
Ricardo Sousa

@cryptolopes cryptolopes added help wanted Extra attention is needed question Further information is requested labels May 22, 2020
@cryptolopes
Copy link
Member

Para validar as assinaturas é necessário a chave pública.

Atenção que esse SAF-T tem atributos que não pertencem ao schema e isso pode resultar num problema ao validar o ficheiro.

testing/SAFTAO.xml:31: element Customer: Schemas validity error : Element '{urn:OECD:StandardAuditFile-Tax:AO_1.01_01}Customer', attribute 'CustomerCount': The attribute 'CustomerCount' is not allowed.
testing/SAFTAO.xml:56: element Customer: Schemas validity error : Element '{urn:OECD:StandardAuditFile-Tax:AO_1.01_01}Customer', attribute 'CustomerCount': The attribute 'CustomerCount' is not allowed.
testing/SAFTAO.xml:80: element Customer: Schemas validity error : Element '{urn:OECD:StandardAuditFile-Tax:AO_1.01_01}Customer', attribute 'CustomerCount': The attribute 'CustomerCount' is not allowed.
testing/SAFTAO.xml:104: element Product: Schemas validity error : Element '{urn:OECD:StandardAuditFile-Tax:AO_1.01_01}Product', attribute 'ProductCount': 
The attribute 'ProductCount' is not allowed.
testing/SAFTAO.xml:112: element Product: Schemas validity error : Element '{urn:OECD:StandardAuditFile-Tax:AO_1.01_01}Product', attribute 'ProductCount': 
The attribute 'ProductCount' is not allowed.
testing/SAFTAO.xml:120: element Product: Schemas validity error : Element '{urn:OECD:StandardAuditFile-Tax:AO_1.01_01}Product', attribute 'ProductCount': 
The attribute 'ProductCount' is not allowed.
testing/SAFTAO.xml:128: element Product: Schemas validity error : Element '{urn:OECD:StandardAuditFile-Tax:AO_1.01_01}Product', attribute 'ProductCount': 
The attribute 'ProductCount' is not allowed.
testing/SAFTAO.xml:136: element Product: Schemas validity error : Element '{urn:OECD:StandardAuditFile-Tax:AO_1.01_01}Product', attribute 'ProductCount': 
The attribute 'ProductCount' is not allowed.
testing/SAFTAO.xml:145: element TaxTableEntry: Schemas validity error : Element '{urn:OECD:StandardAuditFile-Tax:AO_1.01_01}TaxTableEntry', attribute 'TaxTableCount': The attribute 'TaxTableCount' is not allowed.
testing/SAFTAO.xml:160: element Invoice: Schemas validity error : Element '{urn:OECD:StandardAuditFile-Tax:AO_1.01_01}Invoice', attribute 'InvoiceCount': 
The attribute 'InvoiceCount' is not allowed.
testing/SAFTAO.xml:228: element Invoice: Schemas validity error : Element '{urn:OECD:StandardAuditFile-Tax:AO_1.01_01}Invoice', attribute 'InvoiceCount': 
The attribute 'InvoiceCount' is not allowed.
testing/SAFTAO.xml:296: element Invoice: Schemas validity error : Element '{urn:OECD:StandardAuditFile-Tax:AO_1.01_01}Invoice', attribute 'InvoiceCount': 
The attribute 'InvoiceCount' is not allowed.
testing/SAFTAO.xml fails to validate

@rsowd014
Copy link
Author

Obrigado cryptolopes pela resposta.
Sei que esses atributos não deveriam estar e vão ser retirados. Para já estão para mais facilmente encontrar os erros.
A chave publica vai em anexo:

SACWEBPublicKey.txt
(tem de mudar a extensão do ficheiro para .pem)

@cryptolopes
Copy link
Member

cryptolopes commented May 22, 2020

A chave publica vai em anexo:

As assinaturas estão corretas.

$ echo -n "eLCV8o71tLbr+ANWiPUNX9TuotQgyCHGWsuwbIj00LAIUhIqJlVtIs5eWDEPLdLsImglfH4gBIS8qD5EgVKQ7F1IXde4cd+7lsX2axqsUX5Oq8ReLwRCx0/lx65BBzxqOXYAw9hU9Fc/io0VBI5YDuSvseaIpG/zWE4EIy3Z6NI=" | openssl enc -base64 -d -A > testing/sha1.sign
$ echo -n "2020-05-14;2020-05-14T14:41:15;FT UUFC20/8305;62824.26;Nm2AdcYT33BvA04ymMj4lYhHEKn8V3OofAoWctnuYoKb7zBNLJI3gprSfXdqR+6qIYtT64sGf9Fyp5gcFEm4VCNKDENh0tDtUsky0XMyoUk5y5tsQF85tBVFNa7YecsPuZwFyogYmU1VSXvvZIPSh9YvBjUeXtPpAx2BTnYSHHg=" | openssl dgst -sha1 -verify testing/SACWEBPublicKey.txt -signature testing/sha1.sign 
Verified OK 
$ echo -n "SbCiFdQNuuraErKgzRH/ooi6vRiY2mATPzUXKbFqLsQMo68jjAMJVlH0vlAqkbkBUNmofejpwV0n9FKr3M2S9Zri/0eyZ0VofgPSBnCaQQxl/I7LN4KnetH1mEoqTR/IFfsfn7gv1aGyb1FYYeAzoig9oUGpc18LIkl3FfJ4wsA=" | openssl enc -base64 -d -A > testing/sha1.sign
$ echo -n "2020-05-14;2020-05-14T14:43:53;FT UUFC20/8306;353267.76;eLCV8o71tLbr+ANWiPUNX9TuotQgyCHGWsuwbIj00LAIUhIqJlVtIs5eWDEPLdLsImglfH4gBIS8qD5EgVKQ7F1IXde4cd+7lsX2axqsUX5Oq8ReLwRCx0/lx65BBzxqOXYAw9hU9Fc/io0VBI5YDuSvseaIpG/zWE4EIy3Z6NI=" | openssl dgst -sha1 -verify testing/SACWEBPublicKey.txt -signature testing/sha1.sign
Verified OK

Possivelmente tem que ver com a plataforma de validação da AGT e insisto nos atributos que estão a mais, que podem estar a dificultar o processo.

Reparei também que existem elementos como MovementEndTime e MovementStartTime que existem sem que exista também o elemento ShipTo a indicar que se trata de uma fatura que acompanha a mercadoria. Esses elementos não causam problemas de estrutura, mas é mesmo assim?

<MovementEndTime>2020-05-14T14:52:03</MovementEndTime>
<MovementStartTime>2020-05-14T14:52:03</MovementStartTime>

@cryptolopes
Copy link
Member

Duplicate of #49

@cryptolopes cryptolopes marked this as a duplicate of #49 Jun 1, 2020
@cryptolopes
Copy link
Member

cryptolopes commented Jun 2, 2020

Criar assinaturas através do algoritmo RSA

As assinaturas são geradas através do algoritmo RSA (algoritmo de criptografia de dados que usa o sistema de chaves assimétricas, chave pública e chave privada).

Para o efeito, cada fabricante de software necessita de criar o seu par de chaves. A chave privada é do conhecimento exclusivo do fabricante, devendo ser protegida contra disclosure a todo o custo. Já a chave pública, tal como o nome indica é pública e pode ser fornecida a qualquer entidade que tenha por fim o uso dos dados obtidos a partir da chave privada, no caso a Administração Geral Tributária (AGT).

Para que se tenha uma noção da importância da chave privada e da importância desta ter que ser preservada apenas no domínio do fabricante, caso seja conhecida por terceiros, estes podem usá-la para fins ilícitos. Por exemplo, assinar documentos em nome de ou fazendo-se passar por.

Alguns comandos gerais de OpenSSL

# Criar um certificado-auto assinado
# Criar uma chave privada
openssl req -x509 -sha1 -nodes -days 365 -newkey rsa:1024 -keyout private.key -out certificate.crt

# Em alternativa, para criar apenas uma chave privada
openssl genrsa -out private.key 1024

# Remover a passphrase de uma chave privada (limpar a chave privada)
openssl rsa -in private.key -out newprivate.key

# Guardar chave pública
openssl rsa -pubout -in private.key -out public.key

Método

De forma simples, o método usado consiste na assinatura do hash (sha1) de uma mensagem.

Por fim assinatura que se quer obter para o SAF-T consiste no hash da própria assinatura, através do algoritmo RSA, codificado em base64, conforme veremos em baixo.

# Criar mensagem
echo -n "hello world!" > message.txt

# Calcular o valor do hash SHA1
sha1sum 1 message.txt
430ce34d020724ed75a196dfc2ad67c77772d169  message.txt

# O hash SHA1 da mensagem ou do ficheiro são idênticos, como se pode verificar
echo -n "hello world!" | sha1sum
430ce34d020724ed75a196dfc2ad67c77772d169  -

Comandos de OpenSSL para criar e validar a assinatura de uma mensagem

# Assinar mensagem/ficheiro usando o digest sha1
openssl dgst -sha1 -sign private.key -out sha1.sign message.txt

# Codificar a assinatura em base64
# O parâmetro -A é usado para guardar o valor apenas numa linha
openssl enc -base64 -in sha1.sign -out sign.b64 -A

# Converter de base64 para o formato incial da assinatura
openssl enc -base64 -in sign.b64 -out b64.sign -d -A

# Verificar a assinatura do ficheiro
openssl dgst -sha1 -verify public.key -signature sha1.sign message.txt
Verified OK

openssl dgst -sha1 -verify public.key -signature b64.sign message.txt
Verified OK

Características da mensagem e regras para a criação das assinaturas dos documentos

As regras estipulam que a mensagem deve ser composta pela concatenação dos elementos que se seguem, usando ; como separador entre eles:

O objetivo é estabelecer uma relação em cadeia entre todos os documentos de uma determinada série de documentos.

# Exemplo de mensagem do primeiro documento de uma série
echo -n "2020-01-01;2020-01-01T00:30:50;FT SPOS1/1;2756.78;"

# Exemplo de mensagem do segundo (e restantes) documentos
# O separador ; deixa de existir no fim porque após o hash do documento anterior não existe mais nenhum campo para separar
echo -n "2020-01-01;2020-01-01T00:35:10;FT SPOS1/2;8000.00;vBCRgoKYCNWim/cZe8aaJhKcP3ZVNkiSnjCi2f0dC6t/Xdd+bgutrZjL7xd/JwQT2Uq4lxSaPkKpZfIlUWu7K+qRq2v6N1UkXes0bUciHV2FaAo2paV/DCpKP836jDgQzEsI6/lCvfUK7ta24M9B2dr+A2n3VLXWM3T0j8PlHUo="

Deste modo todos os documentos vão permanecer interligados entre si numa cadeia em que é sempre possível verificar o último depende do anterior e assim sucessivamente. Caso um determinado documento sofra uma alteração ao nível dos elementos contidos na mensagem ou seja removido por alguma razão, a cadeia sofre uma rutura, o que é possível de verificar facilmente através da chave pública.

Links e mais informação

@Luvivila
Copy link

Luvivila commented Aug 7, 2020

Muito boa tarde estimados
por favor peço a vossa ajuda
ao tentar de validar o ficheiro saft no portal da AGT recebo o segunte erro
Erro no ficheiro,AuditFile.SourceDocuments.SalesInvoices.2Invoices (FR 2020/62) . Hash está errado
Não consigo identificar onde esta o erro
Obedeci a regra de assinatura
primeiro String assidado foi "2020-08-09;2020-08-09T16:21:45;FR 2020/61;39900,00;"
Gerou o seguinte assinatura Hash
p/VOPbp87I8Fmto+5XITeqrhl4nVrmJncqpoyRPfpBj/vZgoS3zZqnZOdEMCdZhsrzdoLPmKgVK8t2asIr+xSJ/u8gpRwAxvDbR6ziKDoNb8EmlC1ltMqRu7HpH+NVMPkdUMUIGLA8fvf54BsX28fzousNAjbSJm4S2LHSTqLFw=

Segundo String assidado é "2020-08-09;2020-08-09T16:23:59;FR 2020/62;60.00;p/VOPbp87I8Fmto+5XITeqrhl4nVrmJncqpoyRPfpBj/vZgoS3zZqnZOdEMCdZhsrzdoLPmKgVK8t2asIr+xSJ/u8gpRwAxvDbR6ziKDoNb8EmlC1ltMqRu7HpH+NVMPkdUMUIGLA8fvf54BsX28fzousNAjbSJm4S2LHSTqLFw="
Gerou o seguinte assinatura Hash
RrrW4Y9hAL+9G01DPD0d9lTIYA+1yDeBZpCVrqripdSGWNRhS3DBnbYzzH2v0EVTWMLquHLiROohLyeeSoc6Uy9o0BfOgiin/uMZW6USLh1ZwI8pOmvXJ4iuZx4TDLTrUK73Htz8tw6MXzzrdaXzBR8NPN3oW249yTm066xfCw8=

Aqui esta os meus meus ficheiros em anexo
Adao_2020-08-09.txt
chavePrivada.txt
chavePublica.txt

@Luvivila
Copy link

Luvivila commented Aug 7, 2020

Muito boa tarde estimados
Muito obrigado pela atenção merecida, já fiz a correção da vírgula para o ponto mais o problema persiste
Erro no ficheiro,AuditFile.SourceDocuments.SalesInvoices.2Invoices (FR 2020/65) . Hash está errado
Não consigo identificar onde está o erro
Obedeci a regra de assinatura
primeiro String assidado foi "2020-08-07;2020-08-07T16:39:53;FR 2020/64;60.00;"

Gerou o seguinte assinatura Hash

UOwzONA+IfZ1nYCGQcJ8Ohqad/6fl5FBA4GiLe3OKBdxD9QM+7xSAO9ij6bvzY1Vi/gsSGIWxJECuJVZ9XuPB4MujGUUxYpn0p86rkXLzhokTYojO2Z3f8pnRoUGdY8AvoAoUAheQM3XjiO1wbf8TIyL7xoQz42N/AdWxZdFVc0=

Segundo String assidado é "2020-08-07;2020-08-07T16:42:47;FR 2020/65;39900.00;UOwzONA+IfZ1nYCGQcJ8Ohqad/6fl5FBA4GiLe3OKBdxD9QM+7xSAO9ij6bvzY1Vi/gsSGIWxJECuJVZ9XuPB4MujGUUxYpn0p86rkXLzhokTYojO2Z3f8pnRoUGdY8AvoAoUAheQM3XjiO1wbf8TIyL7xoQz42N/AdWxZdFVc0="

Gerou o seguinte assinatura Hash

lq9q1kmATWAmFjaDVqMlqHI3XLkyXJPFrUq2jK4UKCWogfjMF8W7jVqnHbddPD6cUiXT3eGcLFN7jWuYwjHuPQvRAG7XhPw3byw5mZm3L1PuvZ/Wwm0Rvi3/45p9KhftigawDexJJIqctV7vNUc34GhPcUXAlwn0C7O0EXoC1Cg=

Já fiz a verificação com os seguintes comando usanda a minha chave publica

openssl dgst -sha1 -verify sisvendaPublica.pem -signature Registo1.sha1 Registo1.txt

verificação OK

openssl dgst -sha1 -verify sisvendaPublica.pem -signature Registo2.sha1 Registo2.txt

verificação OK
Por favor peço a vossa ajuda
Em anexo
sisvendaPublica.txt
SisVenda_2020-08-07.txt

@AdilsonCosta03
Copy link

Boa tarde, Alguém obteve a certificação desenvolvendo a aplicação em C#?
Estou com o erro na validação do segundo Hash já a um tempo.

Alguém pode ajudar?

@Luvivila
Copy link

Luvivila commented Apr 10, 2022 via email

@viegasfh
Copy link

Este erro pode também ocorrer quando o campo SoftwareValidationNumber, no cabeçalho for 0. Nestes casos, o hash deve ser 0 para poder ser válido. Contudo, isto aplica-se apenas a importação de informações de softwares pré-SAFT. Todos os softwares certificados devem conter um SoftwareValidationNumber no formato XXX/AGT/YYYY, onde XXX é o número atribuído pela AGT, e YYYY é o ano da certificação.

Para quem está a validar o software, devem colocar 000/AGT/YYYY, onde YYYY é o ano de válido. Mas convém colocar o ano de validação, só para quando actualizarem não cometerem mais erros. Portanto, para 2022, coloquem 000/AGT/2022 no SoftwareValidationNumber, tal como é demonstrado abaixo:

<SoftwareValidationNumber>000/AGT/2022</SoftwareValidationNumber>

@FernandoManuel6107
Copy link

FernandoManuel6107 commented May 26, 2022 via email

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
help wanted Extra attention is needed question Further information is requested
Projects
None yet
Development

No branches or pull requests

6 participants