generateUBLSignExtensionsXml static method

XmlDocument generateUBLSignExtensionsXml({
  1. required String invoiceHash,
  2. required String signedPropertiesHash,
  3. required String digitalSignature,
  4. required String certificateString,
  5. required XmlDocument ublSignatureSignedPropertiesXML,
})

Generate a ZATCA-compliant UBLExtensions XML string for the invoice data.

Implementation

static XmlDocument generateUBLSignExtensionsXml({
  required String invoiceHash,
  required String signedPropertiesHash,
  required String digitalSignature,
  required String certificateString,
  required XmlDocument ublSignatureSignedPropertiesXML,
}) {
  final builder = XmlBuilder();
  builder.element(
    'ext:UBLExtensions',
    nest: () {
      builder.element(
        'ext:UBLExtension',
        nest: () {
          builder.element(
            'ext:ExtensionURI',
            nest: 'urn:oasis:names:specification:ubl:dsig:enveloped:xades',
          );
          builder.element(
            'ext:ExtensionContent',
            nest: () {
              builder.element(
                'sig:UBLDocumentSignatures',
                nest: () {
                  builder.attribute(
                    'xmlns:sac',
                    'urn:oasis:names:specification:ubl:schema:xsd:SignatureAggregateComponents-2',
                  );
                  builder.attribute(
                    'xmlns:sbc',
                    'urn:oasis:names:specification:ubl:schema:xsd:SignatureBasicComponents-2',
                  );
                  builder.attribute(
                    'xmlns:sig',
                    'urn:oasis:names:specification:ubl:schema:xsd:CommonSignatureComponents-2',
                  );
                  builder.element(
                    'sac:SignatureInformation',
                    nest: () {
                      builder.element(
                        'cbc:ID',
                        nest: 'urn:oasis:names:specification:ubl:signature:1',
                      );
                      builder.element(
                        'sbc:ReferencedSignatureID',
                        nest:
                            'urn:oasis:names:specification:ubl:signature:Invoice',
                      );
                      builder.element(
                        'ds:Signature',
                        nest: () {
                          builder.attribute('Id', 'signature');
                          builder.attribute(
                            'xmlns:ds',
                            'http://www.w3.org/2000/09/xmldsig#',
                          );
                          builder.element(
                            'ds:SignedInfo',
                            nest: () {
                              builder.element(
                                'ds:CanonicalizationMethod',
                                nest: () {
                                  builder.attribute(
                                    'Algorithm',
                                    'http://www.w3.org/2006/12/xml-c14n11',
                                  );
                                  builder.text('');
                                },
                              );
                              builder.element(
                                'ds:SignatureMethod',
                                nest: () {
                                  builder.attribute(
                                    'Algorithm',
                                    'http://www.w3.org/2001/04/xmldsig-more#ecdsa-sha256',
                                  );
                                  builder.text('');
                                },
                              );
                              builder.element(
                                'ds:Reference',
                                nest: () {
                                  builder.attribute(
                                    'Id',
                                    'invoiceSignedData',
                                  );
                                  builder.attribute('URI', '');
                                  builder.element(
                                    'ds:Transforms',
                                    nest: () {
                                      builder.element(
                                        'ds:Transform',
                                        nest: () {
                                          builder.attribute(
                                            'Algorithm',
                                            'http://www.w3.org/TR/1999/REC-xpath-19991116',
                                          );
                                          builder.element(
                                            'ds:XPath',
                                            nest:
                                                'not(//ancestor-or-self::ext:UBLExtensions)',
                                          );
                                        },
                                      );
                                      builder.element(
                                        'ds:Transform',
                                        nest: () {
                                          builder.attribute(
                                            'Algorithm',
                                            'http://www.w3.org/TR/1999/REC-xpath-19991116',
                                          );
                                          builder.element(
                                            'ds:XPath',
                                            nest:
                                                'not(//ancestor-or-self::cac:Signature)',
                                          );
                                        },
                                      );
                                      builder.element(
                                        'ds:Transform',
                                        nest: () {
                                          builder.attribute(
                                            'Algorithm',
                                            'http://www.w3.org/TR/1999/REC-xpath-19991116',
                                          );
                                          builder.element(
                                            'ds:XPath',
                                            nest:
                                                'not(//ancestor-or-self::cac:AdditionalDocumentReference[cbc:ID=\'QR\'])',
                                          );
                                        },
                                      );
                                      builder.element(
                                        'ds:Transform',
                                        nest: () {
                                          builder.attribute(
                                            'Algorithm',
                                            'http://www.w3.org/2006/12/xml-c14n11',
                                          );
                                          builder.text('');
                                        },
                                      );
                                    },
                                  );
                                  builder.element(
                                    'ds:DigestMethod',
                                    nest: () {
                                      builder.attribute(
                                        'Algorithm',
                                        'http://www.w3.org/2001/04/xmlenc#sha256',
                                      );
                                      builder.text('');
                                    },
                                  );
                                  builder.element(
                                    'ds:DigestValue',
                                    nest: invoiceHash,
                                  );
                                },
                              );
                              builder.element(
                                'ds:Reference',
                                nest: () {
                                  builder.attribute(
                                    'Type',
                                    'http://www.w3.org/2000/09/xmldsig#SignatureProperties',
                                  );
                                  builder.attribute(
                                    'URI',
                                    '#xadesSignedProperties',
                                  );
                                  builder.element(
                                    'ds:DigestMethod',
                                    nest: () {
                                      builder.attribute(
                                        'Algorithm',
                                        'http://www.w3.org/2001/04/xmlenc#sha256',
                                      );
                                      builder.text('');
                                    },
                                  );
                                  builder.element(
                                    'ds:DigestValue',
                                    nest: signedPropertiesHash,
                                  );
                                },
                              );
                            },
                          );
                          builder.element(
                            'ds:SignatureValue',
                            nest: digitalSignature,
                          );
                          builder.element(
                            'ds:KeyInfo',
                            nest: () {
                              builder.element(
                                'ds:X509Data',
                                nest: () {
                                  builder.element(
                                    'ds:X509Certificate',
                                    nest: certificateString,
                                  );
                                },
                              );
                            },
                          );
                          builder.element('ds:Object-1');
                        },
                      );
                    },
                  );
                },
              );
            },
          );
        },
      );
    },
  );

  return builder.buildDocument();
}