Skip to content

Commit 9fc9816

Browse files
Merge pull request #1599 from AgnaldoSilva0/Branch_23228
cleanup: substituído usos do SHA1CryptoServiceProvider obsoleto por SHA1.Create
2 parents f3d7069 + 39a289b commit 9fc9816

File tree

12 files changed

+155
-75
lines changed

12 files changed

+155
-75
lines changed

CTe.Utils/CTe/ExtCTe.cs

Lines changed: 1 addition & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -33,7 +33,6 @@
3333

3434
using System;
3535
using System.IO;
36-
using System.Security.Cryptography;
3736
using System.Security.Cryptography.X509Certificates;
3837
using System.Text;
3938
using System.Xml;
@@ -297,7 +296,7 @@ public static infCTeSupl QrCode(this CteEletronica cte, X509Certificate2 certifi
297296
&& cte.infCte.ide.tpEmis != tpEmis.teSVCSP
298297
)
299298
{
300-
var assinatura = Convert.ToBase64String(CreateSignaturePkcs1(certificadoDigital, encoding.GetBytes(chave)));
299+
var assinatura = Convert.ToBase64String(AssinaturaDigital.CriarAssinaturaPkcs1(certificadoDigital, encoding.GetBytes(chave)));
301300
qrCode.Append("&sign=");
302301
qrCode.Append(assinatura);
303302
}
@@ -308,23 +307,6 @@ public static infCTeSupl QrCode(this CteEletronica cte, X509Certificate2 certifi
308307
};
309308
}
310309

311-
private static byte[] CreateSignaturePkcs1(X509Certificate2 certificadoDigital, byte[] Value)
312-
{
313-
var rsa = certificadoDigital.GetRSAPrivateKey();
314-
315-
RSAPKCS1SignatureFormatter rsaF = new RSAPKCS1SignatureFormatter(rsa);
316-
317-
SHA1CryptoServiceProvider sha1 = new SHA1CryptoServiceProvider();
318-
319-
byte[] hash = null;
320-
321-
hash = sha1.ComputeHash(Value);
322-
323-
rsaF.SetHashAlgorithm("SHA1");
324-
325-
return rsaF.CreateSignature(hash);
326-
}
327-
328310
public static void SalvarXmlEmDisco(this CteEletronica cte, ConfiguracaoServico configuracaoServico = null)
329311
{
330312
var instanciaServico = configuracaoServico ?? ConfiguracaoServico.Instancia;

CTe.Utils/CTe/ExtCTeOs.cs

Lines changed: 1 addition & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,6 @@
99
using DFe.Utils.Assinatura;
1010
using System;
1111
using System.IO;
12-
using System.Security.Cryptography;
1312
using System.Security.Cryptography.X509Certificates;
1413
using System.Text;
1514
using System.Xml;
@@ -72,7 +71,7 @@ public static infCTeSupl QrCode(this CteEletronica cte, X509Certificate2 certifi
7271
&& cte.InfCte.ide.tpEmis != tpEmis.teSVCSP
7372
)
7473
{
75-
var assinatura = Convert.ToBase64String(CreateSignaturePkcs1(certificadoDigital, encoding.GetBytes(chave)));
74+
var assinatura = Convert.ToBase64String(AssinaturaDigital.CriarAssinaturaPkcs1(certificadoDigital, encoding.GetBytes(chave)));
7675
qrCode.Append("&sign=");
7776
qrCode.Append(assinatura);
7877
}
@@ -83,23 +82,6 @@ public static infCTeSupl QrCode(this CteEletronica cte, X509Certificate2 certifi
8382
};
8483
}
8584

86-
private static byte[] CreateSignaturePkcs1(X509Certificate2 certificadoDigital, byte[] Value)
87-
{
88-
var rsa = certificadoDigital.GetRSAPrivateKey();
89-
90-
RSAPKCS1SignatureFormatter rsaF = new RSAPKCS1SignatureFormatter(rsa);
91-
92-
SHA1CryptoServiceProvider sha1 = new SHA1CryptoServiceProvider();
93-
94-
byte[] hash = null;
95-
96-
hash = sha1.ComputeHash(Value);
97-
98-
rsaF.SetHashAlgorithm("SHA1");
99-
100-
return rsaF.CreateSignature(hash);
101-
}
102-
10385
public static string Chave(this CteEletronica cte)
10486
{
10587
var chave = cte.InfCte.Id.Substring(3, 44);

DFe.Testes/DFe.Testes.csproj

Lines changed: 0 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -22,8 +22,4 @@
2222
<ProjectReference Include="..\NFe.Utils\NFe.Utils.csproj" />
2323
</ItemGroup>
2424

25-
<ItemGroup>
26-
<Folder Include="Valores\DadosDeTeste\" />
27-
</ItemGroup>
28-
2925
</Project>
Lines changed: 48 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,48 @@
1+
using System.Security.Cryptography;
2+
using System.Text;
3+
using DadosDeTestes.AssinaturaDigital;
4+
using DFe.Utils.Assinatura;
5+
using Microsoft.VisualStudio.TestTools.UnitTesting;
6+
7+
namespace DFe.Testes.Utils.Assinatura;
8+
9+
[TestClass]
10+
public class AssinaturaDigitalTesteUnitario
11+
{
12+
[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.")]
13+
[DynamicData(nameof(AssinaturaDigitalTesteDados.ObterDadosParaGeracaoDoHashSha1Bytes), typeof(AssinaturaDigitalTesteDados), DynamicDataSourceType.Method)]
14+
public void DadoDadosParaGeracaoDoHashSha1BytesQuandoObterHashSha1BytesEntaoDeveObterHashSha1EmBytesIgualDoSha1CryptoServiceProvider(string dadosEmString)
15+
{
16+
// Arrange
17+
var dadosEmBytes = Encoding.UTF8.GetBytes(dadosEmString);
18+
var bytesEsperados = ObterHashSha1BytesUsandoSha1CryptoServiceProvider(dadosEmBytes);
19+
20+
// Act
21+
var bytesRetornado = AssinaturaDigital.ObterHashSha1Bytes(dadosEmBytes);
22+
23+
// Assert
24+
CollectionAssert.AreEqual(bytesEsperados, bytesRetornado);
25+
}
26+
27+
[TestMethod(displayName: "Dado dados para geração do hash sha1 bytes, quando obter hash sha1 bytes, então deve obter hash sha1 em bytes.")]
28+
[DynamicData(nameof(AssinaturaDigitalTesteDados.ObterDadosParaGeracaoDoHashSha1BytesEValorEsperado), typeof(AssinaturaDigitalTesteDados), DynamicDataSourceType.Method)]
29+
public void DadoDadosParaGeracaoDoHashSha1BytesQuandoObterHashSha1BytesEntaoDeveObterHashSha1EmBytes(string dadosEmString, byte[] bytesEsperados)
30+
{
31+
// Arrange
32+
var dadosEmBytes = Encoding.UTF8.GetBytes(dadosEmString);
33+
34+
// Act
35+
var bytesRetornado = AssinaturaDigital.ObterHashSha1Bytes(dadosEmBytes);
36+
37+
// Assert
38+
CollectionAssert.AreEqual(bytesEsperados, bytesRetornado);
39+
}
40+
41+
private byte[] ObterHashSha1BytesUsandoSha1CryptoServiceProvider(byte[] dados)
42+
{
43+
var sha1 = new SHA1CryptoServiceProvider();
44+
var hashSha1Bytes = sha1.ComputeHash(dados);
45+
46+
return hashSha1Bytes;
47+
}
48+
}

DFe.Utils/Assinatura/AssinaturaDigital.cs

Lines changed: 34 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -31,6 +31,7 @@
3131
/* Rua Comendador Francisco josé da Cunha, 111 - Itabaiana - SE - 49500-000 */
3232
/********************************************************************************/
3333
using System;
34+
using System.Security.Cryptography;
3435
using System.Security.Cryptography.X509Certificates;
3536
using System.Security.Cryptography.Xml;
3637
using System.Xml;
@@ -82,5 +83,38 @@ public static SignatureZeus Assina<T>(T objeto, string id, X509Certificate2 cert
8283
var assinatura = FuncoesXml.XmlStringParaClasse<Classes.Assinatura.Signature>(xmlDigitalSignature.OuterXml);
8384
return assinatura;
8485
}
86+
87+
/// <summary>
88+
/// Gera uma assinatura digital no formato PKCS1 utilizando o algoritmo RSA com SHA-1.
89+
/// </summary>
90+
/// <param name="certificado">Certificado digital com chave privada usada para assinar.</param>
91+
/// <param name="valor">Dados a serem assinados em formato de array de bytes.</param>
92+
/// <returns>Assinatura digital como um array de bytes.</returns>
93+
public static byte[] CriarAssinaturaPkcs1(X509Certificate2 certificado, byte[] valor)
94+
{
95+
var rsa = certificado.GetRSAPrivateKey();
96+
97+
var rsaFormatter = new RSAPKCS1SignatureFormatter(rsa);
98+
rsaFormatter.SetHashAlgorithm("SHA1");
99+
100+
var hashSha1Bytes = ObterHashSha1Bytes(valor);
101+
102+
var assinatura = rsaFormatter.CreateSignature(hashSha1Bytes);
103+
104+
return assinatura;
105+
}
106+
107+
/// <summary>
108+
/// Obtém o hash SHA-1 em formato byte array a partir de um array de bytes informado.
109+
/// </summary>
110+
public static byte[] ObterHashSha1Bytes(byte[] dados)
111+
{
112+
using (var sha1 = SHA1.Create())
113+
{
114+
var sha1HashBytes = sha1.ComputeHash(dados);
115+
116+
return sha1HashBytes;
117+
}
118+
}
85119
}
86120
}
Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,28 @@
1+
using System.Security.Cryptography;
2+
3+
namespace DadosDeTestes.AssinaturaDigital;
4+
5+
public class AssinaturaDigitalTesteDados
6+
{
7+
public static IEnumerable<object[]> ObterDadosParaGeracaoDoHashSha1Bytes()
8+
{
9+
return new List<object[]>
10+
{
11+
new object[] { "92037465012398765432100011223344556677889900|2|1|F1A9B237CD8800FFE234A9912B674CFA1" },
12+
new object[] { "87122345099887766554433221100009988776655443" },
13+
new object[] { "73456789101112131415161718192021222324252627" },
14+
new object[] { "65829374618273645564738291028374618273645564" }
15+
};
16+
}
17+
18+
public static IEnumerable<object[]> ObterDadosParaGeracaoDoHashSha1BytesEValorEsperado()
19+
{
20+
return new List<object[]>
21+
{
22+
new object[] { "92037465012398765432100011223344556677889900|2|1|F1A9B237CD8800FFE234A9912B674CFA1", new byte[] { 128, 55, 179, 49, 198, 97, 206, 43, 246, 208, 112, 183, 231, 3, 23, 105, 114, 184, 33, 153 }},
23+
new object[] { "87122345099887766554433221100009988776655443", new byte[] { 151, 153, 16, 228, 170, 100, 76, 248, 192, 58, 160, 126, 157, 224, 171, 233, 75, 23, 118, 67 }},
24+
new object[] { "73456789101112131415161718192021222324252627", new byte[] { 71, 100, 124, 212, 171, 46, 181, 47, 206, 96, 227, 230, 215, 8, 14, 131, 167, 214, 99, 181 }},
25+
new object[] { "65829374618273645564738291028374618273645564", new byte[] { 147, 88, 158, 178, 38, 247, 111, 70, 151, 152, 182, 14, 69, 18, 129, 97, 157, 47, 222, 50 }}
26+
};
27+
}
28+
}
Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,15 @@
1+
namespace DadosDeTestes.NFe.Utils;
2+
3+
public class ConversaoDadosDeTeste
4+
{
5+
public static IEnumerable<object[]> ObterDadosParaGerarHashSha1DeStringEValorEsperado()
6+
{
7+
return new List<object[]>
8+
{
9+
new object[] { "92037465012398765432100011223344556677889900|2|1|F1A9B237CD8800FFE234A9912B674CFA1", "8037b331c661ce2bf6d070b7e703176972b82199" },
10+
new object[] { "87122345099887766554433221100009988776655443|1|2|9CFD3321AAC4900BDEAFA1105BC088119", "5994d3d62ca107c89677e7bede2f1e6a9371d9da" },
11+
new object[] { "73456789101112131415161718192021222324252627|2|2|A7C44B8D56E9002FAB1133DCE5AA784C3", "ebbb014e73ff18fec652350da4a24907fad21297" },
12+
new object[] { "65829374618273645564738291028374618273645564|1|1|B21C9D77E04A00BBF5C21EA39988D10AA", "19f80bbd273e606d206880f79ea56a671b263586" }
13+
};
14+
}
15+
}

MDFe.Classes/Extensoes/ExtMDFe.cs

Lines changed: 2 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -41,7 +41,6 @@
4141
using MDFe.Utils.Validacao;
4242
using System;
4343
using System.IO;
44-
using System.Security.Cryptography;
4544
using System.Security.Cryptography.X509Certificates;
4645
using System.Text;
4746
using MDFEletronico = MDFe.Classes.Informacoes.MDFe;
@@ -161,7 +160,7 @@ public static MDFEletronico Assina(this MDFEletronico mdfe, EventHandler<string>
161160
if (mdfe.InfMDFe.Ide.TpEmis == MDFeTipoEmissao.Contingencia)
162161
{
163162
var encoding = Encoding.UTF8;
164-
var sign = Convert.ToBase64String(CreateSignaturePkcs1(config.X509Certificate2, encoding.GetBytes(mdfe.Chave())));
163+
var sign = Convert.ToBase64String(AssinaturaDigital.CriarAssinaturaPkcs1(config.X509Certificate2, encoding.GetBytes(mdfe.Chave())));
165164
mdfe.InfMDFeSupl.QrCodMDFe += "&sign=" + sign;
166165
}
167166

@@ -254,7 +253,7 @@ public static MdfeInfMDFeSupl QrCode(this MDFEletronico mdfe, X509Certificate2 c
254253
switch (mdfe.InfMDFe.Ide.TpEmis)
255254
{
256255
case MDFeTipoEmissao.Contingencia:
257-
var assinatura = Convert.ToBase64String(CreateSignaturePkcs1(certificadoDigital, encoding.GetBytes(mdfe.Chave())));
256+
var assinatura = Convert.ToBase64String(AssinaturaDigital.CriarAssinaturaPkcs1(certificadoDigital, encoding.GetBytes(mdfe.Chave())));
258257
qrCode.Append("&sign=");
259258
qrCode.Append(assinatura);
260259
break;
@@ -265,23 +264,5 @@ public static MdfeInfMDFeSupl QrCode(this MDFEletronico mdfe, X509Certificate2 c
265264
QrCodMDFe = qrCode.ToString()
266265
};
267266
}
268-
269-
private static byte[] CreateSignaturePkcs1(X509Certificate2 certificado, byte[] Value)
270-
{
271-
var rsa = certificado.GetRSAPrivateKey();
272-
273-
RSAPKCS1SignatureFormatter rsaF = new RSAPKCS1SignatureFormatter(rsa);
274-
275-
SHA1CryptoServiceProvider sha1 = new SHA1CryptoServiceProvider();
276-
277-
byte[] hash = null;
278-
279-
hash = sha1.ComputeHash(Value);
280-
281-
rsaF.SetHashAlgorithm("SHA1");
282-
283-
return rsaF.CreateSignature(hash);
284-
285-
}
286267
}
287268
}
Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,18 @@
1+
using DadosDeTestes.NFe.Utils;
2+
using Xunit;
3+
4+
namespace NFe.Utils.Testes;
5+
6+
public class ConversaoTesteUnitario
7+
{
8+
[Theory(DisplayName = "Dado dados em string para geração do hex sha1 de string, quando obter hex sha1 de string, então deve obter hex sha1 de string.")]
9+
[MemberData(nameof(ConversaoDadosDeTeste.ObterDadosParaGerarHashSha1DeStringEValorEsperado), MemberType = typeof(ConversaoDadosDeTeste))]
10+
public void DadoDadosEmStringParaGeracaoDoHexSha1DeStringQuandoObterHexSha1DeStringEntaoDeveObterHexSha1DeString(string dadosEmString, string stringEsperada)
11+
{
12+
// Act
13+
var valorRetornado = Conversao.ObterHexSha1DeString(dadosEmString);
14+
15+
// Assert
16+
Assert.Equal(stringEsperada, valorRetornado);
17+
}
18+
}

NFe.Utils.Testes/NFe.Utils.Testes.csproj

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@
1717
</ItemGroup>
1818

1919
<ItemGroup>
20+
<ProjectReference Include="..\DadosDeTestes\DadosDeTestes.csproj" />
2021
<ProjectReference Include="..\DFe.Classes\DFe.Classes.csproj" />
2122
<ProjectReference Include="..\NFe.Classes\NFe.Classes.csproj" />
2223
<ProjectReference Include="..\NFe.Utils\NFe.Utils.csproj" />

0 commit comments

Comments
 (0)