Se hace con xadesjs, la verdad es que no importa el lenguaje, esa firma es un estandard asi que lo que yo hice fue leer la documentacion de dicho estandard y compararlo con una factura valida (ve a tu correo y mira alguna factura que te hayan enviando al comprar algo, descomprimerla y dentro del attached docuemet debe estar la factura como CDATA, luego analiza los campos que tiene la firma, ahi estan: las referencias, la politica, el role...
Ya con eso el estandard "toma forma" y se te hace mas entendible la documentacion de XADESJS porque seamos sinceros, si nunca hemos firmado un documentos xml, cualquier documentacion de firma (sea la libreria que sea) parece chino... y xades va a parecer aun mas intrincado...
voy a compartir como se ve el objeto de configuracion de la firma con xadesjs para que se hagan a una idea, no lo comparto todo por temas legales:
```
const signature = await xadesXml.Sign(
alg,
privateKey,
xmlDoc,
{
x509: signingCertificates,
references: [
{ hash: 'SHA-256', transforms: [ 'enveloped' ], uri: '', id: `ReferenceID-${ id }` },
{ hash: 'SHA-256', uri: `#${ xadesXml.XmlSignature.KeyInfo.Id }` }
],
policy: {
hash,
digestValue: 'dMoMvtcG5aIzgYo0tIsSQeVJBDnUnfSOfBpxXrmor0Y=',
identifier: {
value: '
https://facturaelectronica.dian.gov.co/politicadefirma/v2/politicadefirmav2.pdf',
qualifier: 'OIDAsURI'
}
},
signerRole: {
claimed: [ 'supplier' ]
},
signingCertificate: signingCertificates[ 0 ],
signingTime: { format: signingTime }
}
)
```
Adicionalmente, nodejs no es una plataforma muy amigable para todo lo que tiene que ver con crypto, firmas, acceso a archivos porque estas son operaciones costosas que aun trabajandose asincronamente son tareas "bloqueantes" (segun la documentacion de node) osea que demoran mucho y ponen en espera a otras tareas (peticiones del usuario) por lo que siempre deben hacerse de forma asincrona y preferiblemente en microservicios externos que no bloqueen el flujo principal de nuestra aplicacion.
Dicho esto, si vamos a crear un micro para firmar xadesjs, soap, validar xsd, generar pdf (xsl)... pues hagamoslo en lenguajes que ya tienen librerias maduras para ellos, por rejemplo creas un microservicio en java/c# que haga todo lo referente a xml y lo llamas desde node, cuando java/c# termine le informa a node y node consolida la factura en base de datos...