Skip to content

ASN1.parse() error #7

Closed as not planned
Closed as not planned
@pedroserretti

Description

@pedroserretti

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!

Metadata

Metadata

Assignees

No one assigned

    Labels

    questionFurther information is requested

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions