Description
I'm doing a function that i'm signing a XML.
Before i was testing with the same certificate, and it does successfully.
Now, i'm doing some tests, but unfortunally, when i test with another certificate, it occurs a new error, in ASN1.parse function.
Can anyone help me with this??
static Future<(bool, String)> assinarDocumento(String sCertificadoConteudo, String sSenhaCertificado, String sTagAssinar, String arquivoXml, String sXmlString) async {
bool responseOk = true;
String sCert = "";
String sMensagem = "";
Uint8List chaveBytes;
// Uint8List certBytes;
XmlDocument document = XmlDocument.parse(sXmlString);
document.normalize(trimAllWhitespace: true);
Iterable<XmlElement> tagElements = document.findAllElements(sTagAssinar);
switch (tagElements.length) {
case 0:
sMensagem = "A tag a ser assinada não existe.";
return (!responseOk, sMensagem);
case 1:
try {
(chaveBytes, sCert) = await FNfeNfceGerais.extrairChavePrivadaCertificado(sCertificadoConteudo, sSenhaCertificado);
SignedXml sig = SignedXml()
..signatureAlgorithm = "http://www.w3.org/2000/09/xmldsig#rsa-sha1"
..canonicalizationAlgorithm = "http://www.w3.org/TR/2001/REC-xml-c14n-20010315"
..addReference(
"//*[local-name()='$sTagAssinar']",
["http://www.w3.org/2000/09/xmldsig#enveloped-signature", "http://www.w3.org/TR/2001/REC-xml-c14n-20010315"],
)
..signingKey = chaveBytes;
sig.computeSignature(document.toXmlString());
XmlDocument newDocument = XmlDocument.parse(sig.signedXml);
XmlElement keyInfo = XmlElement(XmlName('KeyInfo'), [], [
XmlElement(XmlName('X509Data'), [], [
XmlElement(XmlName('X509Certificate'), [], [XmlText(sCert.replaceAll("-----BEGIN CERTIFICATE-----", "").replaceAll("-----END CERTIFICATE-----", "").replaceAll(RegExp(r'\s+'), "").trim())]),
]),
]);
XmlElement signatureNode = newDocument.findAllElements("Signature").first;
signatureNode.children.add(keyInfo);
await File(arquivoXml).writeAsString(newDocument.toXmlString(pretty: true));
return (responseOk, "O Xml foi assinado com sucesso.");
} catch (e, stacktrace) {
return (!responseOk, "Erro: $e\n Stack Trace: $stacktrace");
}
default:
return (!responseOk, "Existe mais de uma tag a ser assinada.");
}
}
static Future<(Uint8List, String)> extrairChavePrivadaCertificado(String sCertificadoConteudo, String sSenhaCertificado) async {
String sCert = "";
Uint8List? chaveBytes;
Uint8List certBytes = base64Decode(sCertificadoConteudo);
List<String> results = Pkcs12Utils.parsePkcs12(certBytes, password: FGeral.descriptografarTexto(sSenhaCertificado, tlAsc: false));
for (String conteudo in results) {
if (conteudo.contains("PRIVATE KEY")) {
// chaveBytes = conteudo.codeUnits;
conteudo = conteudo.replaceAll("-----BEGIN PRIVATE KEY-----", "").replaceAll("-----END PRIVATE KEY-----", "").replaceAll("\n", "").replaceAll("\r", "");
Uint8List x = utf8.encode("-----BEGIN PRIVATE KEY-----");
Uint8List y = FGeral.stringToUint8List(conteudo);
Uint8List z = utf8.encode("-----END PRIVATE KEY-----");
chaveBytes = Uint8List.fromList(x + y + z);
}
if (conteudo.contains("CERTIFICATE")) {
sCert = conteudo;
// certBytes = utf8.encode(conteudo);
}
}
return (chaveBytes ?? Uint8List(0), sCert);
}
That's my CallStack:
#0 ASN1Object.parse (package:ninja_asn1/src/ninja_asn1_base.dart:120:9)
#1 ASN1Sequence.parse (package:ninja_asn1/src/ninja_asn1_base.dart:211:33)
#2 new ASN1Sequence.decode (package:ninja_asn1/src/ninja_asn1_base.dart:180:70)
#3 new RSAPrivateKey.fromASN1 (package:ninja/asymmetric/rsa/rsa.dart:271:32)
#4 new RSAPrivateKey.fromPEM (package:ninja/asymmetric/rsa/rsa.dart:325:26)
#5 RSASHA1.getSignature (package:xml_crypto/src/signed_xml.dart:980:31)
#6 SignedXml._calculateSignatureValue (package:xml_crypto/src/signed_xml.dart:291:16)
#7 SignedXml.computeSignature (package:xml_crypto/src/signed_xml.dart:659:7)
#8 FNfeNfceGerais.assinarDocumento (package:vip12/funcoes/nfeNfce/fNfeNfceGerais.dart:67:15)
e: UnimplementedError
message: null
That's urgent, please, someone help me, i need answers!