NOM-151 y herramientas PDF
Sella cualquier archivo o hash con constancia de conservación, y utilidades de PDF.
Un sello NOM-151 certifica ante un tercero que algo existía, con ese contenido exacto, en un momento dado. Firmame lo aplica solo a los documentos que firma; estos endpoints te dejan usarlo por separado, sobre archivos que nunca pasaron por la plataforma.
Sellar un hash
El caso más flexible: sacas tú el SHA-256 de lo que sea —un registro de base de datos, una bitácora, un artefacto de compilación— y mandas solo el digest.
import { createHash } from 'node:crypto';
const hash = createHash('sha256').update(datos).digest('hex');
const sello = await services.timestamp({ hash });Firmame nunca ve tus datos, solo el digest. Eso lo hace viable para información que no puedes compartir.
Ojo con el formato: aquí el hash va en hexadecimal.
Validarlo después
Puedes validar contra el archivo, o contra su hash si prefieres no subirlo:
// con el archivo
await services.timestampValidate({ file: contenido, timestamp: sello.timestamp });
// solo con el hash
await services.timestampValidate({ hash, timestamp: sello.timestamp });Sellar un PDF
Si lo que tienes es un PDF y quieres el sello embebido en el archivo:
const sellado = await services.nom151Stamp(fs.readFileSync('documento.pdf'));Y para verificar uno que ya viene sellado:
const resultado = await services.nom151Validate(fs.readFileSync('sellado.pdf'));Estos endpoints son multipart
POST /api/nom151/stamp, /api/nom151/validate, /api/print y /api/pdf/pageData reciben el archivo
como multipart/form-data. En multipart la cadena firmada es el SHA-256 en Base64 del archivo, que
además va en el header Content-SHA256 — los SDKs se encargan de esto por ti. El playground funciona con
los endpoints JSON.
Los sellos de un documento de Firmame
Para los documentos que sí pasaron por la plataforma:
const { timestamps } = await services.getNom151StampsForDocument(firmamexId);{
"timestamps": [
{
"hash": "ce92da77b45ddbb26ab4210600023de8f0effb062276cd4c2765feed3988cfc4",
"tsa": "L=MIGUEL HIDALGO,ST=CIUDAD DE MEXICO,C=MX,CN=CECOBAN-PSC-NOM151-1-01,O=CECOBAN SA DE CV",
"genTime": "2023-07-10T18:21:28.467Z",
"status": "granted",
"policy": "2.16.484.101.10.316.2.3.1.2.1.1.1"
}
]
}Con el hash de un sello bajas la revisión exacta del documento que ese sello ampara:
const revision = await services.getDocumentForStamp(firmamexId, timestamps[0].hash);Eso es lo que necesita un tercero para verificar: el documento como estaba en ese momento, no como está ahora.
Herramientas PDF
Dimensiones de una página
Antes de colocar stickers en un documento que no generaste tú, conviene saber de qué tamaño es la página
— rect va en unidades de PDF desde la esquina inferior izquierda, y una página rotada o de tamaño
inusual deja un rectángulo fijo en el lugar equivocado.
const primera = await services.getPageData(archivo, 'first');
const segunda = await services.getPageData(archivo, '2');
const ultima = await services.getPageData(archivo, 'last');Acepta first, last o un número de página. Aquí los números empiezan en 1, a diferencia del page
de un sticker, que empieza en 0.
Aplanar un PDF
Convierte los campos de formulario en contenido estático y fusiona las capas:
const plano = await services.printPdf(fs.readFileSync('formulario.pdf'));Útil antes de sellar o firmar un documento con formulario interactivo que no quieres que quede editable.