diff --git a/CTe.Utils/CTe/ExtCTe.cs b/CTe.Utils/CTe/ExtCTe.cs
index e0f3d31f7..c43e6b003 100644
--- a/CTe.Utils/CTe/ExtCTe.cs
+++ b/CTe.Utils/CTe/ExtCTe.cs
@@ -33,7 +33,6 @@
using System;
using System.IO;
-using System.Security.Cryptography;
using System.Security.Cryptography.X509Certificates;
using System.Text;
using System.Xml;
@@ -297,7 +296,7 @@ public static infCTeSupl QrCode(this CteEletronica cte, X509Certificate2 certifi
&& cte.infCte.ide.tpEmis != tpEmis.teSVCSP
)
{
- var assinatura = Convert.ToBase64String(CreateSignaturePkcs1(certificadoDigital, encoding.GetBytes(chave)));
+ var assinatura = Convert.ToBase64String(AssinaturaDigital.CriarAssinaturaPkcs1(certificadoDigital, encoding.GetBytes(chave)));
qrCode.Append("&sign=");
qrCode.Append(assinatura);
}
@@ -308,23 +307,6 @@ public static infCTeSupl QrCode(this CteEletronica cte, X509Certificate2 certifi
};
}
- private static byte[] CreateSignaturePkcs1(X509Certificate2 certificadoDigital, byte[] Value)
- {
- var rsa = certificadoDigital.GetRSAPrivateKey();
-
- RSAPKCS1SignatureFormatter rsaF = new RSAPKCS1SignatureFormatter(rsa);
-
- SHA1CryptoServiceProvider sha1 = new SHA1CryptoServiceProvider();
-
- byte[] hash = null;
-
- hash = sha1.ComputeHash(Value);
-
- rsaF.SetHashAlgorithm("SHA1");
-
- return rsaF.CreateSignature(hash);
- }
-
public static void SalvarXmlEmDisco(this CteEletronica cte, ConfiguracaoServico configuracaoServico = null)
{
var instanciaServico = configuracaoServico ?? ConfiguracaoServico.Instancia;
diff --git a/CTe.Utils/CTe/ExtCTeOs.cs b/CTe.Utils/CTe/ExtCTeOs.cs
index 928f34b2e..437f6e799 100644
--- a/CTe.Utils/CTe/ExtCTeOs.cs
+++ b/CTe.Utils/CTe/ExtCTeOs.cs
@@ -9,7 +9,6 @@
using DFe.Utils.Assinatura;
using System;
using System.IO;
-using System.Security.Cryptography;
using System.Security.Cryptography.X509Certificates;
using System.Text;
using System.Xml;
@@ -72,7 +71,7 @@ public static infCTeSupl QrCode(this CteEletronica cte, X509Certificate2 certifi
&& cte.InfCte.ide.tpEmis != tpEmis.teSVCSP
)
{
- var assinatura = Convert.ToBase64String(CreateSignaturePkcs1(certificadoDigital, encoding.GetBytes(chave)));
+ var assinatura = Convert.ToBase64String(AssinaturaDigital.CriarAssinaturaPkcs1(certificadoDigital, encoding.GetBytes(chave)));
qrCode.Append("&sign=");
qrCode.Append(assinatura);
}
@@ -83,23 +82,6 @@ public static infCTeSupl QrCode(this CteEletronica cte, X509Certificate2 certifi
};
}
- private static byte[] CreateSignaturePkcs1(X509Certificate2 certificadoDigital, byte[] Value)
- {
- var rsa = certificadoDigital.GetRSAPrivateKey();
-
- RSAPKCS1SignatureFormatter rsaF = new RSAPKCS1SignatureFormatter(rsa);
-
- SHA1CryptoServiceProvider sha1 = new SHA1CryptoServiceProvider();
-
- byte[] hash = null;
-
- hash = sha1.ComputeHash(Value);
-
- rsaF.SetHashAlgorithm("SHA1");
-
- return rsaF.CreateSignature(hash);
- }
-
public static string Chave(this CteEletronica cte)
{
var chave = cte.InfCte.Id.Substring(3, 44);
diff --git a/DFe.Testes/DFe.Testes.csproj b/DFe.Testes/DFe.Testes.csproj
index 1efc8325b..cc90271e4 100644
--- a/DFe.Testes/DFe.Testes.csproj
+++ b/DFe.Testes/DFe.Testes.csproj
@@ -22,8 +22,4 @@
-
-
-
-
diff --git a/DFe.Testes/Utils/Assinatura/AssinaturaDigitalTesteUnitario.cs b/DFe.Testes/Utils/Assinatura/AssinaturaDigitalTesteUnitario.cs
new file mode 100644
index 000000000..570b4bba6
--- /dev/null
+++ b/DFe.Testes/Utils/Assinatura/AssinaturaDigitalTesteUnitario.cs
@@ -0,0 +1,48 @@
+using System.Security.Cryptography;
+using System.Text;
+using DadosDeTestes.AssinaturaDigital;
+using DFe.Utils.Assinatura;
+using Microsoft.VisualStudio.TestTools.UnitTesting;
+
+namespace DFe.Testes.Utils.Assinatura;
+
+[TestClass]
+public class AssinaturaDigitalTesteUnitario
+{
+ [TestMethod(displayName: "Dado dados para geração do hash sha1 bytes, quando obter hash sha1 bytes, então deve obter hash sha1 em bytes igual do SHA1CryptoServiceProvider.")]
+ [DynamicData(nameof(AssinaturaDigitalTesteDados.ObterDadosParaGeracaoDoHashSha1Bytes), typeof(AssinaturaDigitalTesteDados), DynamicDataSourceType.Method)]
+ public void DadoDadosParaGeracaoDoHashSha1BytesQuandoObterHashSha1BytesEntaoDeveObterHashSha1EmBytesIgualDoSha1CryptoServiceProvider(string dadosEmString)
+ {
+ // Arrange
+ var dadosEmBytes = Encoding.UTF8.GetBytes(dadosEmString);
+ var bytesEsperados = ObterHashSha1BytesUsandoSha1CryptoServiceProvider(dadosEmBytes);
+
+ // Act
+ var bytesRetornado = AssinaturaDigital.ObterHashSha1Bytes(dadosEmBytes);
+
+ // Assert
+ CollectionAssert.AreEqual(bytesEsperados, bytesRetornado);
+ }
+
+ [TestMethod(displayName: "Dado dados para geração do hash sha1 bytes, quando obter hash sha1 bytes, então deve obter hash sha1 em bytes.")]
+ [DynamicData(nameof(AssinaturaDigitalTesteDados.ObterDadosParaGeracaoDoHashSha1BytesEValorEsperado), typeof(AssinaturaDigitalTesteDados), DynamicDataSourceType.Method)]
+ public void DadoDadosParaGeracaoDoHashSha1BytesQuandoObterHashSha1BytesEntaoDeveObterHashSha1EmBytes(string dadosEmString, byte[] bytesEsperados)
+ {
+ // Arrange
+ var dadosEmBytes = Encoding.UTF8.GetBytes(dadosEmString);
+
+ // Act
+ var bytesRetornado = AssinaturaDigital.ObterHashSha1Bytes(dadosEmBytes);
+
+ // Assert
+ CollectionAssert.AreEqual(bytesEsperados, bytesRetornado);
+ }
+
+ private byte[] ObterHashSha1BytesUsandoSha1CryptoServiceProvider(byte[] dados)
+ {
+ var sha1 = new SHA1CryptoServiceProvider();
+ var hashSha1Bytes = sha1.ComputeHash(dados);
+
+ return hashSha1Bytes;
+ }
+}
\ No newline at end of file
diff --git a/DFe.Utils/Assinatura/AssinaturaDigital.cs b/DFe.Utils/Assinatura/AssinaturaDigital.cs
index 86a3173b7..3c099e3b7 100644
--- a/DFe.Utils/Assinatura/AssinaturaDigital.cs
+++ b/DFe.Utils/Assinatura/AssinaturaDigital.cs
@@ -31,6 +31,7 @@
/* Rua Comendador Francisco josé da Cunha, 111 - Itabaiana - SE - 49500-000 */
/********************************************************************************/
using System;
+using System.Security.Cryptography;
using System.Security.Cryptography.X509Certificates;
using System.Security.Cryptography.Xml;
using System.Xml;
@@ -82,5 +83,38 @@ public static SignatureZeus Assina(T objeto, string id, X509Certificate2 cert
var assinatura = FuncoesXml.XmlStringParaClasse(xmlDigitalSignature.OuterXml);
return assinatura;
}
+
+ ///
+ /// Gera uma assinatura digital no formato PKCS1 utilizando o algoritmo RSA com SHA-1.
+ ///
+ /// Certificado digital com chave privada usada para assinar.
+ /// Dados a serem assinados em formato de array de bytes.
+ /// Assinatura digital como um array de bytes.
+ public static byte[] CriarAssinaturaPkcs1(X509Certificate2 certificado, byte[] valor)
+ {
+ var rsa = certificado.GetRSAPrivateKey();
+
+ var rsaFormatter = new RSAPKCS1SignatureFormatter(rsa);
+ rsaFormatter.SetHashAlgorithm("SHA1");
+
+ var hashSha1Bytes = ObterHashSha1Bytes(valor);
+
+ var assinatura = rsaFormatter.CreateSignature(hashSha1Bytes);
+
+ return assinatura;
+ }
+
+ ///
+ /// Obtém o hash SHA-1 em formato byte array a partir de um array de bytes informado.
+ ///
+ public static byte[] ObterHashSha1Bytes(byte[] dados)
+ {
+ using (var sha1 = SHA1.Create())
+ {
+ var sha1HashBytes = sha1.ComputeHash(dados);
+
+ return sha1HashBytes;
+ }
+ }
}
}
\ No newline at end of file
diff --git a/DadosDeTestes/AssinaturaDigital/AssinaturaDigitalDadosDeTeste.cs b/DadosDeTestes/AssinaturaDigital/AssinaturaDigitalDadosDeTeste.cs
new file mode 100644
index 000000000..c34c52976
--- /dev/null
+++ b/DadosDeTestes/AssinaturaDigital/AssinaturaDigitalDadosDeTeste.cs
@@ -0,0 +1,28 @@
+using System.Security.Cryptography;
+
+namespace DadosDeTestes.AssinaturaDigital;
+
+public class AssinaturaDigitalTesteDados
+{
+ public static IEnumerable