# NOM-151

## Sello de tiempo NOM-151

El sello de tiempo se puede solicitar de dos maneras:

1. Incrustado dentro de un PDF: si se van a sellar documentos PDF recomendamos utilizar esta manera. El sello queda incrustado dentro de la metadata del documento y después se agrega una firma para que no se pueda modificar. Sirve como una manera de cerrar el documento y no se tienen que mantener dos archivos.
2. Sello para cualquier tipo de archivo: La otra opción es generar el sello como un archivo independiente. Esto permite que se puedan generar sellos para cualquier tipo de archivo, como fotos, videos, docx, xlsx, etc.

Además de los métodos para obtener el sello de tiempo, están disponibles los métodos para validar el sello generado. La validación revisa que:

1. El hash del documento corresponda al hash que se encuentra en el sello
2. Que el status del sello sea válido
3. Que la firma del sello sea válida

### Estampilla incrustada dentro de un PDF

#### Generación

Para generar el sello e incrustarlo dentro de un PDF, solicitamos el binario del documento:

```javascript
    const file = fs.readFileSync('./ejemplo.pdf');
    const response = await services.nom151Stamp(file)
```

La respuesta contiene la siguiente información:

```javascript
{
    "status": "success" o "error",
    "document":"base64 del documento PDF",
    "timestampData":{
        "genTime":"fecha de generacion del sello",
        "hash":"hash que fue sellado",
        "status":"status contenido dentro de la respuesta de la TSA",
        "tsa":"nombre de la TSA que firmó el sello de tiempo"
    },
    "error":"si 'status' es 'error', contendra una descripción del error",
}
```

#### Validación

Después de obtener un documento sellado, se puede validar en cualquier momento. Este proceso extrae el sello del documento y lo valida, sólo acepta documentos con el sello de tiempo incrustado.

```javascript
    const stampedFile = fs.readFileSync('./stampedFile.pdf');
    const validationResult = await services.nom151Validate(stampedFile);
```

La respuesta contiene la siguiente información:

```javascript
{
    "status": "success" o "error",
    "document":"base64 del documento PDF",
    "timestamp":"el timestamp en base64 que se extrajo del documento PDF",
    "timestampData":{
        "genTime":"fecha de generacion del sello",
        "hash":"hash que fue sellado",
        "status":"status contenido dentro de la respuesta de la TSA",
        "tsa":"nombre de la TSA que firmó el sello de tiempo"
    },
    "error":"si 'status' es 'error', contendra una descripción del error",
}
```

### Sello para cualquier tipo de PDF

#### Generación

Para generar un sello para cualquier tipo de archivo, enviamos el hash 256 en hexadecimal del archivo:

```javascript
    // genera un hash256 de los datos para los que quieres
    // una estampilla de tiempo
    const hash = crypto.createHash('sha256')
      hash.update('datos a estampillar');

    // manda el hash como un string hexadecimal
     const response = await services.timestamp({
      hash: hash.digest('hex')
  })
```

La respuesta contiene la siguiente información:

```javascript
{
    "status": "success" o "error",
    "timestamp":"el timestamp en base64 generado para el archivo",
    "timestampData":{
        "genTime":"fecha de generacion del sello",
        "hash":"hash que fue sellado",
        "status":"status contenido dentro de la respuesta de la TSA",
        "tsa":"nombre de la TSA que firmó el sello de tiempo"
    },
    "error":"si 'status' es 'error', contendra una descripción del error",
}
```

### Validación

Después de obtener el sello, se puede validar en cualquier momento enviando el sello junto con el archivo original o el hash con el que se generó

```javascript
    const validationResultFile = await services.timestampValidate({
        file: binaryFile, 
        timestamp: binaryTimestamp
    })

    const validationResultFile = await services.timestampValidate({
        hash: 'hexHash',
        timestamp: binaryTimestamp
    })
```

La respuesta para cualquiera de las dos opciones contendrá la siguiente información:

```javascript
{
    "status": "success" o "error",
    "timestampData":{
        "genTime":"fecha de generacion del sello",
        "hash":"hash que fue sellado",
        "status":"status contenido dentro de la respuesta de la TSA",
        "tsa":"nombre de la TSA que firmó el sello de tiempo"
    },
    "error":"si 'status' es 'error', contendra una descripción del error",
}
```


---

# Agent Instructions: Querying This Documentation

If you need additional information that is not directly available in this page, you can query the documentation dynamically by asking a question.

Perform an HTTP GET request on the current page URL with the `ask` query parameter:

```
GET https://docs.acertia.mx/nom-151.md?ask=<question>
```

The question should be specific, self-contained, and written in natural language.
The response will contain a direct answer to the question and relevant excerpts and sources from the documentation.

Use this mechanism when the answer is not explicitly present in the current page, you need clarification or additional context, or you want to retrieve related documentation sections.
