generateUBLSignExtensionsXml static method
XmlDocument
generateUBLSignExtensionsXml({})
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();
}