
Extensión de la ISA RISC-V para cómputo secreto reforzado por hardware usando encapsulación de clave ML-KEM-512 y cifrado SIMON-128, permitiendo ejecución oblivious a los datos con rendimiento cercano al nativo.
Mojo-V (pronunciado “mojo-five”) es una nueva extensión de RISC-V que introduce capacidades de programación orientadas a la privacidad para RISC-V. Mojo-V implementa computación secreta, lo que permite una ejecución segura, eficiente y oblivious a los datos sin depender de software frágil ni de la confianza del programador. Al aislar los datos sensibles en registros secretos dedicados y cifrar la memoria con una clave de terceros, Mojo-V previene divulgaciones y aplica una computación que es tanto ciega (sin divulgaciones directas) como silenciosa (sin fugas por canales laterales). El diseño se integra sin problemas en la ISA RISC-V existente con solo un bit de modo y cuatro instrucciones nuevas, aplicadas íntegramente en la decodificación. Los primeros resultados muestran velocidades de ejecución casi nativas, ofreciendo al mismo tiempo una mejora de rendimiento de más de 5 a 7 órdenes de magnitud en comparación con el cifrado totalmente homomórfico (FHE), con una hoja de ruta clara para la integración en CPU, GPU y aceleradores especializados.
Para obtener más información...
La Especificación actual de la Extensión ISA de Mojo-V (versión 1.02):
Para contactar a los desarrolladores de Mojo-V:
La Plataforma de Referencia Mojo-V versión 1.03 implementa una plataforma de simulador Spike de referencia para RISC-V RV64GC y el compilador EXO para la Especificación ISA de Mojo-V v1.02. La implementación actual soporta modos de cifrado rápido, fuerte y con prueba, junto con la divulgación segura de resultados de computación cifrada y la generación certificada de números aleatorios. La versión incluye una amplia gama de pruebas de Mojo-V, benchmarks orientados a la privacidad y aplicaciones demostradoras para la divulgación segura. También incluye la especificación completa de la ISA de Mojo-V y documentación para desarrolladores.
Esta versión es adecuada para usarse como i) plataforma de desarrollo de aplicaciones Mojo-V, ii) modelo de referencia para validar implementaciones de hardware Mojo-V y iii) implementación de referencia para análisis de seguridad. El trabajo actual se centra en el desarrollo de i) un compilador Mojo-V basado en LLVM, ii) un modelo Mojo-V basado en gem5 para exploración y análisis arquitectónico y iii) una implementación RTL de referencia CVA6 SystemVerilog de RISC-V RV64GC con extensiones Mojo-V.
Versión de la Especificación: 1.02 (agosto de 2026)
Contacto: [email protected]
Especificación ISA Mojo-V v1.02
doc/Spike (Simulador de Conjunto de Instrucciones) con Extensiones Mojo-V
riscv-isa-sim, con funcionalidad completa para una CPU RV64GC con encapsulación de claves ML-KEM-512 para la carga de contratos de datos y cifrado simétrico SIMON-128 para la protección de la computación secreta.--isa=rv64gc_zicond_zkmojov_zicntr al ejecutar spikeMulti-herramienta de Contrato de Datos
Los contratos de datos son paquetes cifrados que permiten que el hardware de una CPU Mojo-V acceda a la clave de acceso a datos y a la información de configuración (por ejemplo, el modo de cifrado de memoria) para un conjunto de datos cifrados con Mojo-V. La Multi-herramienta DC permite las siguientes capacidades:
Benchmarks Mojo-V Bringup-Bench
Tenga en cuenta que el resto de los benchmarks Bringup-bench aún NO se han portado a Mojo-V.
Necesitará un compilador cruzado RISC-V basado en LLVM capaz de producir binarios RV64GC.
Aquí hay un buen punto de partida: https://github.com/openssl/openssl
Necesitará una instalación para desarrolladores de OpenSSL versión 3.6 o más reciente. Esto proporciona bibliotecas que implementan ML-KEM512, utilizado por Spike para el intercambio de claves protegido.
Aquí hay un buen punto de partida: https://clang.llvm.org/get_started.html
git clone https://github.com/toddmaustin/mojo-v.git cd mojo-v
### D. Construir el simulador Spike de RISC-V con soporte Mojo-V```bash
sudo apt-get install device-tree-compiler libboost-regex-dev libboost-system-dev
cd riscv-isa-sim
mkdir build
cd build
../configure --prefix=$RISCV
make
Los contratos de datos son paquetes cifrados que permiten al hardware de una CPU Mojo-V acceder a la clave de acceso a datos y a la información de configuración (p. ej., modo de cifrado de memoria) de un conjunto de datos cifrado con Mojo-V.``` cd dc-tool make clean build test
### **E. Construir y ejecutar las pruebas de benchmark Bringup-Bench de Mojo-V**
1. **Construir el controlador de dispositivo Spike** ```bash
cd bringup-bench/target
make
Configura tu compilador
Edita ../Makefile y establece TARGET_CC para el destino mojov a la ubicación de tu compilador RISC-V de LVM basado en Clang.
Compila y prueba los programas de prueba Bringup-Bench ```bash cd .. # go to the top-level bringup-bench directory make TARGET=mojov-spike mojov-tests # run all Mojo-V tests
Como alternativa, puedes ejecutar un benchmark individual entrando en su directorio y ejecutando el siguiente comando. ```bash cd ../mojov-test make TARGET=mojov-spike clean build test
## 🧪 Resumen de Pruebas de Mojo-V Bringup-Bench
| Programa | Descripción |
|:---------|:-------------|
| `mojov-test` | Ejemplo introductorio de las diapositivas |
| `mojov-test1` | Pruebas de semántica de registros secretos y memoria cifrada |
| `mojov-test2` | Benchmark de ordenamiento de burbuja de enteros data-oblivious codificado a mano con cifrado rápido Mojo-V (int,fast) |
| `mojov-test3` | Benchmark de ordenamiento de burbuja de punto flotante data-oblivious codificado a mano con cifrado rápido Mojo-V (fp,fast) |
| `mojov-test4` | Benchmark de ordenamiento de burbuja de enteros data-oblivious codificado a mano con cifrado fuerte Mojo-V (int,strong) |
| `mojov-test5` | Benchmark de ordenamiento de burbuja de punto flotante data-oblivious codificado a mano con cifrado fuerte Mojo-V (fp,strong) |
| `mojov-typetests` | Pruebas de validación del sistema de tipos para tipos cifrados Mojo-V y uso de la biblioteca EXO |
| `mojov-pctests` | Suite de pruebas de verificación de integridad codificada a mano para RV64GC+Mojo-V que incluye pruebas positivas y negativas para el formato de cifrado proof-carrying de Mojo-V (proofcarrying) |
| `mojov-sectests` | Suite de pruebas de seguridad codificada a mano para RV64GC+Mojo-V que incluye 130 pruebas positivas + 245 negativas == 375 en total (int,fp,fast,strong) |
| `mojov-stringtests` | Pruebas de validación de la biblioteca de cadenas EXO cifrada para operaciones y comparaciones seguras de cadenas |
| `mojov-mathtests` | Pruebas de validación de la biblioteca matemática EXO cifrada para `_sincos`, `mojov_sin`, `mojov_cos`, `mojov_fabs`, `mojov_floor`, `mojov_pow`, `mojov_round` y `mojov_sqrt` |
Estos benchmarks de prueba demuestran las reglas ISA de Mojo-V, el comportamiento de la biblioteca EXO y las semánticas de seguridad.
## 🧪 Resumen de Benchmarks de Mojo-V Bringup-Bench
El conjunto actual de benchmarks de bring-up incluye las siguientes aplicaciones de benchmark Mojo-V:
| Programa | Descripción |
|:---------|:-------------|
| `bitonic-sort` | Benchmark de ordenamiento bitónico data-oblivious |
| `bloom-filter` | Benchmark de pertenencia a conjuntos con filtro de Bloom |
| `bubble-sort` | Benchmark de ordenamiento de burbuja de enteros |
| `bubble-sort-strong` | Benchmark de ordenamiento de burbuja de enteros configurado para cifrado fuerte |
| `chi-squared` | Benchmark de bondad de ajuste estadístico chi-cuadrado |
| `distinctness` | Benchmark de análisis de distinción (distinctness) |
| `distinctness-Onlog2n` | Variante del benchmark de distinción con estrategia O(n log² n) |
| `edit-distance` | Benchmark de distancia de edición (distancia entre cadenas) |
| `eulers-approx` | Benchmark de aproximación de la constante/serie de Euler |
| `fft-int` | Benchmark FFT de enteros |
| `flood-fill` | Benchmark de relleno por inundación (flood-fill) |
| `flood-fill-On2` | Variante del benchmark de relleno por inundación con comportamiento O(n²) |
| `fuzzy-match` | Benchmark de coincidencia difusa de cadenas |
| `gcd-list` | Benchmark de máximo común divisor sobre listas |
| `gemm` | Benchmark de multiplicación general de matrices |
| `gemm-strong` | Benchmark GEMM configurado para cifrado fuerte |
| `grad-descent` | Benchmark de optimización por descenso de gradiente |
| `heat-calc` | Benchmark de cálculo de transferencia/ecuación de calor |
| `heldkarp-tsp` | Benchmark de programación dinámica de Held-Karp para el problema del viajante sobre grafos cifrados |
| `highlife` | Benchmark de autómatas celulares HighLife con evolución cifrada del estado del tablero |
| `kadane` | Benchmark de subarreglo máximo (algoritmo de Kadane) |
| `kalman-filter` | Benchmark de filtrado de Kalman |
| `kcore-decomp` | Benchmark de descomposición k-core de grafos |
| `kepler-calc` | Benchmark de ecuación de Kepler/cálculo numérico |
| `knapsack` | Benchmark de optimización de la mochila (knapsack) |
| `lcs` | Benchmark data-oblivious de subsecuencia común más larga sobre cadenas cifradas |
| `lda` | Benchmark de asignación latente de Dirichlet |
| `manacher-lps` | Benchmark de subcadena palindrómica más larga (algoritmo de Manacher) |
| `mersenne` | Benchmark de cálculo de números de Mersenne |
| `minspan` | Benchmark de estructura de expansión mínima |
| `monte-carlo` | Benchmark de simulación de Monte Carlo |
| `moving-average` | Benchmark analítico de media móvil |
| `moving-average-fp64` | Benchmark analítico de media móvil en FP64 |
| `nbody-sim` | Benchmark de simulación de N cuerpos |
| `nonlinear-nn` | Benchmark de red neuronal no lineal |
| `nr-solver` | Benchmark de solucionador Newton-Raphson |
| `ntt-kernel` | Benchmark de núcleo de transformada numérico-teórica |
| `packet-filter` | Benchmark de filtrado de paquetes |
| `pagerank` | Benchmark de grafo PageRank |
| `parrondo` | Benchmark de proceso/estrategia de Parrondo |
| `partition-equal` | Benchmark de partición de suma de subconjuntos iguales sobre conjuntos cifrados |
| `pca-analysis` | Benchmark de análisis de componentes principales |
| `primal-test` | Benchmark de prueba de primalidad |
| `private-join` | Benchmark de join (combinación) que preserva la privacidad |
| `psi` | Benchmark de intersección privada de conjuntos |
| `quartile-stats` | Benchmark analítico de cortes de cuartiles y promedio por cuartiles sobre datos cifrados |
| `rabinkarp-search` | Benchmark de búsqueda de patrones Rabin-Karp |
| `rad-to-deg` | Benchmark de conversión de radianes a grados |
| `randshell-sort` | Benchmark de ordenamiento Shell aleatorizado |
| `ransac` | Benchmark de ajuste de modelos RANSAC |
| `regex-match` | Benchmark de coincidencia de expresiones regulares |
| `risk-score` | Benchmark analítico de puntuación de riesgo |
| `scrambled-compare` | Benchmark de comparación de cadenas codificadas (scrambled) mediante programación dinámica cifrada |
| `seq-align` | Benchmark de alineamiento global de secuencias (Needleman-Wunsch) sobre cadenas cifradas |
| `shortest-path` | Benchmark de camino más corto en grafos |
| `sieve` | Benchmark de criba de números primos |
| `skeleton` | Benchmark esqueleto/plantilla usado como línea base de bring-up |
| `soundex` | Benchmark de codificación fonética Soundex |
| `string-search` | Benchmark de búsqueda de cadenas |
| `tea-cipher` | Benchmark de cifrado TEA |
| `tiny-NN` | Benchmark de inferencia de red neuronal pequeña |
| `triangle-count` | Benchmark de conteo de triángulos en grafos |
| `variability-sample` | Benchmark de variabilidad y estadísticas de muestreo |
| `verlet` | Benchmark de física con integración de Verlet |
## Resumen de los Demostradores de Divulgación Segura de Mojo-V
Mojo-V incluye tres benchmarks demostradores de divulgación segura en `bringup-bench`. Estas aplicaciones usan memoria cifrada proof-carrying más concesiones (grants) de datos cifrados para mostrar cómo un programa puede calcular sobre entradas sensibles, divulgar solo resultados derivados explícitamente autorizados y atrapar intentos de reutilizar una concesión para un valor diferente, una entrada sin procesar, un cálculo obsoleto, una concesión manipulada o un predicado intermedio.
| Programa | Entrada sensible | Divulgaciones autorizadas | Protecciones demostradas |
|:---------|:----------------|:------------------------|:--------------------------|
| `private-auction` | Ocho ofertas privadas cifradas. | ID del postor ganador y valor de la oferta ganadora. | Encuentra la oferta máxima con comparaciones cifradas y `cmov()`, y luego valida las concesiones de datos por salida. Los casos negativos rechazan concesiones no coincidentes, divulgación de la oferta ganadora sin procesar, concesiones falsas o manipuladas, concesiones obsoletas después de cambiar la subasta, valores derivados `winning_bid + 1` y predicados de comparación intermedios. |
| `vote-tally` | Treinta y dos votos cifrados entre tres candidatos, incluidos dos votos inválidos. | Recuentos agregados para los candidatos A, B y C, más predicados de curación por voto. | Calcula todos los recuentos de candidatos y los predicados de validez de votos en forma cifrada. Los casos negativos rechazan usar una concesión de recuento para otro recuento, divulgación de votos sin procesar, concesiones falsas o manipuladas, concesiones obsoletas después de modificar los votos, valores de recuento derivados y predicados intermedios de votos. |
| `gene-risk` | Ocho dosis de marcadores SNP cifrados para una carga de trabajo de riesgo genómico de juguete. | Una puntuación de riesgo poligénico derivada y un grupo de riesgo bajo/medio/alto. | Acumula una puntuación de riesgo ponderada y deriva el grupo de riesgo con predicados cifrados y `cmov()`. Los casos negativos rechazan el uso cruzado de concesiones de puntuación y de grupo, divulgación de marcadores sin procesar, concesiones falsas o manipuladas, concesiones obsoletas después de cambiar el genoma, valores de puntuación derivados y predicados intermedios de alto riesgo. |
Cada demostrador está listado en `MOJOV_DISCAPPS`, por lo que forma parte de la batería de aplicaciones de divulgación segura. Para ejecutar uno directamente, entre en su directorio de benchmark y use el objetivo Mojo-V, por ejemplo:```bash
cd bringup-bench/private-auction
make TARGET=mojov-spike clean build test
Utiliza la opción --mojov-arg=<n> de Spike para seleccionar la ruta positiva (0) o una de las pruebas de divulgación negativas (1 y superiores) al ejecutar un demostrador manualmente.
Mojo-V incluye tres demostradores de referencia de generador certificado de números aleatorios verdaderos (CERTRNG)
en bringup-bench. Utilizan distintos sitios CERTRNG,
computación encriptada con prueba de cargo, y nonces de solicitud para mostrar que un cliente
puede verificar dónde entraron valores aleatorios frescos en una computación aprobada. Los
resultados permanecen encriptados hasta la validación del recibo y el compromiso. Los casos
negativos demuestran que la aleatoriedad generada por software, extracciones faltantes o reutilizadas,
asignaciones de sitio incorrectas, solicitudes obsoletas, grafos de computación alterados y
remuestreo sesgado no satisfacen la concesión de datos honesta. También muestran un
límite importante: la aleatoriedad certificada por sí sola no puede detener la molienda si los resultados se divulgan
(usando las instrucciones DISC o FDISC de Mojo-V) antes del compromiso.
Estos demostradores están listados en MOJOV_CERTRNG_APPS, por lo que se incluyen en
la batería de referencia de Mojo-V. Ejecuta uno directamente desde su directorio, por ejemplo:```bash
cd bringup-bench/blind-audit
make TARGET=mojov-spike clean build test
Utilice la opción `--mojov-arg=<n>` de Spike al ejecutar un demostrador manualmente. El caso `0` es el camino honesto, los casos de números bajos son controles explicativos exitosos, y los casos `10` y superiores son ataques que se espera que terminen con una excepción de seguridad de Mojo-V. La matriz exacta para cada aplicación está documentada en su `README.md` local del benchmark.
## 🛠️ Uso de la Multiherramienta de Contrato de Datos Mojo-V
La multiherramienta de contrato de datos "dc-tool" se utiliza para crear y validar contratos de datos Mojo-V.
Para crear un par de claves pública/privada ML-KEM512, ejecute el siguiente comando. Tenga en cuenta que la clave pública debe compartirse con proveedores de datos de terceros para preparar contratos de datos. Las claves privadas se instalan en el hardware (o simulador).```bash
./dc-tool keygen <pk_file> <sk_file> # public key in <pk_file>, private key in <sk_file>
Una vez que existe un par de claves pública/privada, es posible crear contratos de datos cifrados. Un contrato de datos contiene una clave de acceso a datos cifrada (para que el hardware Mojo-V acceda a datos de terceros) y una configuración de modo de memoria cifrada. Ejecute el siguiente comando para crear un contrato de datos cifrado.```bash ./dc-tool dcgen <pk_file> {fast,strong,proof-carrying} <ct_file> # specify mem mode, contract in <ct_file>
Compartir un contrato de datos cifrado con el hardware Mojo-V que corresponde a la clave pública ML-KEM512 utilizada para cifrar el contrato permitirá que la CPU habilitada para Mojo-V realice cómputo secreto sobre los datos protegidos de terceros. Para validar que el contrato cifrado es válido, use los siguientes comandos.```bash
./dc-tool dcchk <sk_file> <ct_file> # decrypt contract <ct_file> with secret key <sk_file>
./dc-tool dcchk-v <sk_file> <ct_file> # same as above, but also dump decrypted contents of <ct_file>
Se han añadido las siguientes opciones a Spike, el simulador estándar de ISA RISC-V.```bash --mojov-verbose Mojo-V setup processing is verbose --mojov-fast Use Mojo-V fast encryption mode (default mode) --mojov-strong Use Mojo-V strong encryption format (otherwise using data contract specified mode) --mojov-proofcarrying Use Mojo-V proof-carrying encryption format (otherwise use data contract specified mode) --mojov-arg= Pass a numeric argument to a Mojo-V test code --mojov-pk=<pem_file> Load Mojo-V CPU public key from <pem_file> --mojov-sk=<pem_file> Load Mojo-V CPU secret key from <pem_file>
## 🧠 Descripción general de la programación en Mojo-V
El desarrollo de software para Mojo-V utiliza actualmente la biblioteca del compilador EXO y sigue prácticas de codificación seguras y oblivious a los datos:
1. **Programe con los encabezados de la biblioteca EXO**
- Incluya `exo/mojov-exo.h` para acceder al framework de programación Mojo-V y a las abstracciones de tipos cifrados.
- Incluya `exo/mojov-math.h` para acceder al soporte matemático cifrado y a las operaciones auxiliares.
2. **Use cómputo oblivious a los datos para variables cifradas**
- Los valores cifrados deben manipularse con flujo de control y patrones de acceso a memoria oblivious a los datos para preservar los objetivos de ejecución silenciosa y resistencia a canales laterales de Mojo-V.
3. **Siga el tutorial de programación de EXO**
- Consulte la guía de programación de EXO: [exo/EXO-library-programming.md](https://github.com/toddmaustin/mojo-v/blob/HEAD/exo/EXO-library-programming.md)
4. **Consulte los detalles de la estructura del compilador y la arquitectura en la documentación de EXO**
- La estructura interna y el contexto de diseño para el enfoque actual del compilador/biblioteca de Mojo-V están documentados en: [exo/EXO-library-overview.md](https://github.com/toddmaustin/mojo-v/blob/HEAD/exo/EXO-library-overview.md)
---
## Licencias de código
Todo el código relacionado con Mojo-V en este repositorio se publica bajo la licencia de la herramienta que modificó (por ejemplo, Spike, LLVM, Bringup-Bench). Consulte los directorios respectivos de las herramientas para obtener detalles sobre las licencias.
---
## 💬 Preguntas y comentarios
¡Agradecemos las contribuciones, los informes de errores y las sugerencias!
📧 **Correo electrónico:** [[email protected]](mailto:[email protected])
🌐 **Página del proyecto:** [https://github.com/toddmaustin/mojo-v](https://github.com/toddmaustin/mojo-v)
| Programa | Carga de trabajo aleatoria certificada | Comportamiento positivo | Protecciones demostradas |
|---|
blind-audit | Selecciona uno de ocho registros de auditoría tomando el mínimo de ocho prioridades aleatorias distintas vinculadas a la solicitud. | Certifica el grafo completo de argmin fijo; también muestra que las extracciones no utilizadas no afectan el recibo y que la divulgación prematura permite la molienda. | Rechaza un objetivo forzado, RNG de software, un nonce faltante u obsoleto, la reutilización de extracciones, un candidato eliminado, sitios intercambiados y la reproducción de una selección precalculada. |
diffpriv-count | Añade ruido binomial centrado, formado como la diferencia de dos valores independientes Binomial(8, 1/2), a un recuento encriptado usando 16 sitios aleatorios distintos. | Certifica el grafo preciso de generación de ruido y vinculación de solicitudes mientras mantiene ocultos tanto el ruido como la respuesta hasta la validación. | Rechaza ruido omitido o debilitado, RNG de software, remuestreo favorable y reproducción de solicitudes obsoletas; la aleatoriedad no utilizada no relacionada permanece fuera del recibo. |
certified-lotto | Elige al participante elegible con mayor puntuación entre ocho entradas encriptadas y usa prioridades aleatorias distintas vinculadas a la solicitud para desempatar. | Certifica a cada participante, sitio aleatorio, mezcla de nonces y paso del torneo; también demuestra el comportamiento de extracciones no utilizadas y el peligro de molienda por divulgación antes del compromiso. | Rechaza un participante omitido, RNG de software, un nonce omitido u obsoleto, la reutilización de extracciones, sitios intercambiados y un desempate determinista. |