Development

API Pública

El Faro de Aleatoriedad de Random UChile utiliza la misma API que el Beacon de NIST, cuyos endpoints se detallan a continuación:

Los <timestamp> utilizados en la API siguen el formato POSIX con milisegundos en zona horario GMT (más información sobre como convertir fechas a este formato aquí: https://www.epochconverter.com)

Verificación

A continuación se pueden encontrar los scripts de verificación del Faro de Aleatoriedad de Random UChile.

El código (en lenguaje Python) y las instrucciones de uso se encuentran en el Repositorio Github del verificador. También es posible descargar el código a través de este enlace (instrucciones de uso en README).

Los scripts de verificación son:

  1. Consistencia de Cadena (chain-consistency-version2.py): este script revisa la correctitud de todos los pulsos entregados por el Faro. En particular verifica las siguientes propiedades:
    • Correcta referencia a pulsos previos.
    • Uso de la entropía generada localmente en el minuto anterior y comprometida (en commitment) en el pulso de dicho minuto.
    • Correcto uso de la función de hash lento (sloth propuesto por Arjen Lenstra and Benjamin Wesolowski descrito en este paper e implementación basada en este repositorio github) para la generación del valor aleatorio final.
    • Firma válida.
  2. Verificador de eventos externos en tiempo real: disponible pronto.

Certificado Público

El certificado necesario para verificar la firma en cada pulso está disponible a través de la API:

Verificación de Firma

Cada pulso está firmado digitalmente por Random UChile, utilizando el algoritmo RSA-PSS. La firma se realiza sobre la concatenación de los siguientes valores:

strlen(x) retorna el número de carácteres que hay en x.
length(x) retorna el número de bytes en x luego que x ha sido decodificado de su expresión hexadecimal.
Tanto strlen(x) como length(x) están codificados como valores enteros de 4 bytes (big-endian).
El resto de los valores están codificados como valores enteros de 4 bytes, a excepción de chainIndex y pulseIndex que están codificados como valores enteros de 8 bytes.