Buenos días,
Estoy intentando hacer un programa en Visual Studio Basic para calcular la huella siguiendo el ejemplo en java que la AEAT expone en la documentación, y el resultado es diferente. Alguien podría compartir el código en Visual Studio Basic?
Expongo el código que estoy utilizando:
Código:
Imports System
Imports System.Security.Cryptography
Imports System.Text
Imports System.Web
Module Program
Sub Main(args As String())
Console.WriteLine(CalculaHuellaAlta("89890001K", "12345678/G33", "01-01-2024", "F1", "12.35", "123.45", "", "2024-01-01T19:20:30+01:00"))
End Sub
' Genera el hash en formato Base16 (hexadecimal) en mayúsculas
Public Function GetHashVerificada(msg As String) As String
Try
Dim digest As HashAlgorithm = SHA256.Create()
Dim hash As Byte() = digest.ComputeHash(Encoding.UTF8.GetBytes(msg))
' Convertir el hash a formato hexadecimal en mayúsculas
Dim sb As New StringBuilder()
For Each b As Byte In hash
sb.Append(b.ToString("X2")) ' X2 asegura mayúsculas
Next
Return sb.ToString()
Catch ex As Exception
Throw New ArgumentException("Error al generar la huella SHA", ex)
End Try
End Function
' Genera la referencia concatenada
Public Function GetReferenciaRegistroAlta(nifEmisor As String, numFacturaSerie As String,
fechaExpedicion As String, tipoFactura As String,
cuotaTotal As String, importeTotal As String,
huellaAnterior As String, fechaHoraUsoRegistro As String) As String
Dim sb As New StringBuilder()
sb.Append(GetValorCampo("IDEmisorFactura", nifEmisor, True)) _
.Append(GetValorCampo("NumSerieFactura", numFacturaSerie, True)) _
.Append(GetValorCampo("FechaExpedicionFactura", fechaExpedicion, True)) _
.Append(GetValorCampo("TipoFactura", tipoFactura, True)) _
.Append(GetValorCampo("CuotaTotal", cuotaTotal, True)) _
.Append(GetValorCampo("ImporteTotal", importeTotal, True)) _
.Append(GetValorCampo("Huella", huellaAnterior, True)) _
.Append(GetValorCampo("FechaHoraUsoRegistro", fechaHoraUsoRegistro, False))
Return sb.ToString()
End Function
' Concatena un campo con su valor y separador
Public Function GetValorCampo(nombre As String, valor As String, separador As Boolean) As String
If separador Then
Return nombre & "=" & If(String.IsNullOrEmpty(valor), "", valor.Trim()) & ";"
Else
Return nombre & "=" & If(String.IsNullOrEmpty(valor), "", valor.Trim())
End If
End Function
' Calcula la huella completa
Public Function CalculaHuellaAlta(nifEmisor As String, numFacturaSerie As String, fechaExpedicion As Date,
tipoFactura As String, cuotaTotal As String, importeTotal As String,
huellaAnterior As String, fechaHoraUsoRegistro As String) As String
' Genera la referencia concatenada
Dim ref As String = GetReferenciaRegistroAlta(nifEmisor, numFacturaSerie, fechaExpedicion.ToString("yyyy-MM-dd"),
tipoFactura, cuotaTotal, importeTotal, huellaAnterior, fechaHoraUsoRegistro)
' Genera el hash en Base16
Return GetHashVerificada(ref)
End Function
End Module
Resultado obtenido: 07DCAADE3EA3216A80409A37359A5A53D48038F7BD2C61D51178CD7112C3E9FA
Resultado que debería de ser según la documentación de la AEAT: 3C464DAF61ACB827C65FDA19F352A4E3BDC2C640E9E9FC4CC058073F38F12F60
Gracias de antemano por la ayuda.
Saludos,