Mojo-V(发音为 “mojo-five”)是一种新的 RISC-V 扩展,为 RISC-V 引入了面向隐私的编程能力。Mojo-V 实现了秘密计算,可在不依赖脆弱软件和程序员信任的情况下,实现安全、高效且数据无关的执行。通过将敏感数据隔离在专用的秘密寄存器中,并在第三方密钥下加密内存,Mojo-V 可防止泄露,并强制执行既盲(无直接泄露)又静默(无侧信道泄漏)的计算。该设计仅通过一个模式位和四条新指令即可无缝集成到现有 RISC-V ISA 中,并完全在译码阶段强制执行。早期结果显示,其执行速度接近原生水平,同时与全同态加密(FHE)相比,性能提升超过 5-7 个数量级,并拥有集成到 CPU、GPU 和专用加速器的清晰路线图。
了解更多...
当前 Mojo-V ISA 扩展规范(版本 1.02):
联系 Mojo-V 开发者:
Mojo-V 参考平台 1.03 版为 RISC-V RV64GC 实现了参考 Spike 模拟器平台,并为 Mojo-V ISA 规范 v1.02 实现了 EXO 编译器。当前实现支持快速、强安全和携带证明的加密模式,以及加密计算结果的安全披露和认证随机数生成。该版本包含广泛的 Mojo-V 测试、面向隐私的基准测试,以及用于安全披露的演示应用程序。它还包含完整的 Mojo-V ISA 规范和开发者文档。
此版本适合用作:i) Mojo-V 应用开发平台;ii) 用于验证 Mojo-V 硬件实现的黄金模型;iii) 用于安全分析的参考实现。当前工作重点在于开发:i) 基于 LLVM 的 Mojo-V 编译器;ii) 用于架构探索和分析的、基于 gem5 的 Mojo-V 模型;iii) 带 Mojo-V 扩展的 RISC-V RV64GC 参考 CVA6 SystemVerilog RTL 实现。
规范版本: 1.02 (2026 年 8 月)
联系方式: [email protected]
Mojo-V ISA 规范 v1.02
doc/ 发布Spike(指令集模拟器)及 Mojo-V 扩展
riscv-isa-sim 中,并且针对 RV64GC CPU 功能完善,支持用于数据契约加载的 ML-KEM-512 密钥封装,以及用于秘密计算保护的 SIMON-128 对称密钥加密。spike 时添加 --isa=rv64gc_zicond_zkmojov_zicntr 标志数据契约多工具
数据契约是经过加密的数据包,允许 Mojo-V CPU 的硬件访问 Mojo-V 加密数据集的访问密钥和配置信息(例如内存加密模式)。DC 多工具支持以下功能:
Mojo-V Bringup-Bench 基准测试
请注意,Bringup-bench 基准测试的其余部分尚未移植到 Mojo-V。
你需要一个基于 LLVM 的 RISC-V 交叉编译器,它能生成 RV64GC 二进制文件。
这里是一个很好的起点:https://github.com/openssl/openssl
你需要安装 OpenSSL 3.6 或更新版本的开发者安装包。这会提供实现 ML-KEM512 的库,Spike 使用该库进行受保护的密钥交换。
这里是一个很好的起点:https://clang.llvm.org/get_started.html
git clone https://github.com/toddmaustin/mojo-v.git cd mojo-v
### D. 构建支持 Mojo-V 的 RISC-V Spike 模拟器```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
数据合约是加密数据包,允许 Mojo-V CPU 的硬件访问 Mojo-V 加密数据集的数据访问密钥和配置信息(例如,内存加密模式)。``` cd dc-tool make clean build test
### **E. 构建和运行 Mojo-V Bringup-Bench 基准测试**
1. **构建 Spike 设备驱动程序** ```bash
cd bringup-bench/target
make
配置你的编译器
编辑 ../Makefile,为 mojov 目标设置 TARGET_CC,指向你的基于 LVM Clang 的 RISC-V 编译器位置。
构建并测试 Bringup-Bench 测试程序 ```bash cd .. # go to the top-level bringup-bench directory make TARGET=mojov-spike mojov-tests # run all Mojo-V tests
另外,您可以通过进入其目录并运行以下命令来运行单个基准测试。 ```bash cd ../mojov-test make TARGET=mojov-spike clean build test
## 🧪 Mojo-V Bringup-Bench 测试概述
| 程序 | 说明 |
|:---------|:-------------|
| `mojov-test` | 来自幻灯片的入门示例 |
| `mojov-test1` | 秘密寄存器和加密内存语义测试 |
| `mojov-test2` | 使用 Mojo-V 快速加密的手写数据无关整数冒泡排序基准测试 (int,fast) |
| `mojov-test3` | 使用 Mojo-V 快速加密的手写数据无关浮点冒泡排序基准测试 (fp,fast) |
| `mojov-test4` | 使用 Mojo-V 强加密的手写数据无关整数冒泡排序基准测试 (int,strong) |
| `mojov-test5` | 使用 Mojo-V 强加密的手写数据无关浮点冒泡排序基准测试 (fp,strong) |
| `mojov-typetests` | 用于 Mojo-V 加密类型和 EXO 库使用的类型系统验证测试 |
| `mojov-pctests` | 为 RV64GC+Mojo-V 手写的完整性检查测试套件,包含针对 Mojo-V 证明承载加密格式的正向和负向测试 (proofcarrying) |
| `mojov-sectests` | 为 RV64GC+Mojo-V 手写的安全测试套件,包含 130 个正向 + 245 个负向测试 == 共 375 个 (int,fp,fast,strong) |
| `mojov-stringtests` | 用于安全字符串操作和比较的加密 EXO 字符串库验证测试 |
| `mojov-mathtests` | 用于 `_sincos`、`mojov_sin`、`mojov_cos`、`mojov_fabs`、`mojov_floor`、`mojov_pow`、`mojov_round` 和 `mojov_sqrt` 的加密 EXO 数学库验证测试 |
这些测试基准展示了 Mojo-V ISA 规则、EXO 库行为和安全性语义。
## 🧪 Mojo-V Bringup-Bench 基准测试概述
当前的启动基准测试集包括以下 Mojo-V 基准测试应用程序:
| 程序 | 说明 |
|:---------|:-------------|
| `bitonic-sort` | 数据无关双调排序基准测试 |
| `bloom-filter` | Bloom 过滤器集合成员资格基准测试 |
| `bubble-sort` | 整数冒泡排序基准测试 |
| `bubble-sort-strong` | 配置为强加密的整数冒泡排序基准测试 |
| `chi-squared` | 卡方统计拟合优度基准测试 |
| `distinctness` | 差异性分析基准测试 |
| `distinctness-Onlog2n` | 采用 O(n log² n) 策略的差异性基准测试变体 |
| `edit-distance` | 编辑距离(字符串距离)基准测试 |
| `eulers-approx` | 欧拉常数/级数逼近基准测试 |
| `fft-int` | 整数 FFT 基准测试 |
| `flood-fill` | 洪水填充基准测试 |
| `flood-fill-On2` | 具有 O(n²) 行为的洪水填充基准测试变体 |
| `fuzzy-match` | 模糊字符串匹配基准测试 |
| `gcd-list` | 列表最大公约数基准测试 |
| `gemm` | 通用矩阵乘法基准测试 |
| `gemm-strong` | 配置为强加密的 GEMM 基准测试 |
| `grad-descent` | 梯度下降优化基准测试 |
| `heat-calc` | 热传导/热方程计算基准测试 |
| `heldkarp-tsp` | 基于加密图的 Held-Karp 动态规划旅行商问题基准测试 |
| `highlife` | 带加密棋盘状态演化的 HighLife 元胞自动机基准测试 |
| `kadane` | 最大子数组基准测试(Kadane 算法) |
| `kalman-filter` | 卡尔曼滤波基准测试 |
| `kcore-decomp` | 图 k-core 分解基准测试 |
| `kepler-calc` | 开普勒方程/数值计算基准测试 |
| `knapsack` | 背包优化基准测试 |
| `lcs` | 基于加密字符串的数据无关最长公共子序列基准测试 |
| `lda` | 潜在狄利克雷分配基准测试 |
| `manacher-lps` | 最长回文子串基准测试(Manacher 算法) |
| `mersenne` | 梅森数计算基准测试 |
| `minspan` | 最小生成结构基准测试 |
| `monte-carlo` | 蒙特卡洛模拟基准测试 |
| `moving-average` | 移动平均分析基准测试 |
| `moving-average-fp64` | FP64 移动平均分析基准测试 |
| `nbody-sim` | N 体模拟基准测试 |
| `nonlinear-nn` | 非线性神经网络基准测试 |
| `nr-solver` | Newton-Raphson 求解器基准测试 |
| `ntt-kernel` | 数论变换内核基准测试 |
| `packet-filter` | 数据包过滤基准测试 |
| `pagerank` | PageRank 图基准测试 |
| `parrondo` | Parrondo 过程/策略基准测试 |
| `partition-equal` | 基于加密集合的相等子集和分区基准测试 |
| `pca-analysis` | 主成分分析基准测试 |
| `primal-test` | 素性检验基准测试 |
| `private-join` | 隐私保护连接基准测试 |
| `psi` | 私有集合交集基准测试 |
| `quartile-stats` | 基于加密数据的四分位切割与四分位平均分析基准测试 |
| `rabinkarp-search` | Rabin-Karp 模式搜索基准测试 |
| `rad-to-deg` | 弧度到角度转换基准测试 |
| `randshell-sort` | 随机化希尔排序基准测试 |
| `ransac` | RANSAC 模型拟合基准测试 |
| `regex-match` | 正则表达式匹配基准测试 |
| `risk-score` | 风险评分分析基准测试 |
| `scrambled-compare` | 使用加密动态规划的扰乱字符串比较基准测试 |
| `seq-align` | 基于加密字符串的全局序列比对基准测试(Needleman-Wunsch) |
| `shortest-path` | 最短路径图基准测试 |
| `sieve` | 素数筛基准测试 |
| `skeleton` | 用作启动基线的骨架/模板基准测试 |
| `soundex` | Soundex 语音编码基准测试 |
| `string-search` | 字符串搜索基准测试 |
| `tea-cipher` | TEA 密码基准测试 |
| `tiny-NN` | 微型神经网络推理基准测试 |
| `triangle-count` | 三角形计数图基准测试 |
| `variability-sample` | 变异性和抽样统计基准测试 |
| `verlet` | Verlet 积分物理基准测试 |
## Mojo-V 安全披露演示程序概述
Mojo-V 在 `bringup-bench` 中包含了三个安全披露演示基准测试。这些应用程序使用证明承载加密内存和加密数据授权,以展示程序如何对敏感输入进行计算、仅披露经明确授权的派生结果,并捕获针对不同值、原始输入、过期计算、被篡改授权或中间谓词重用授权的尝试。
| 程序 | 敏感输入 | 授权披露 | 演示的保护 |
|:---------|:----------------|:------------------------|:--------------------------|
| `private-auction` | 八个加密的私人出价。 | 中标者 ID 和中标出价金额。 | 使用加密比较和 `cmov()` 找出最高出价,然后验证每个输出的数据授权。负向用例拒绝不匹配的授权、原始中标出价披露、伪造或篡改的授权、更改拍卖后过期的授权、派生的 `winning_bid + 1` 值以及中间比较谓词。 |
| `vote-tally` | 三名候选人共三十二张加密选票,其中包含两张无效选票。 | 候选人 A、B、C 的总计票数,以及每张选票的修复谓词。 | 以加密形式计算所有候选人计票数和选票有效性谓词。负向用例拒绝将某个计票授权用于另一计票、原始选票披露、伪造或篡改的授权、修改选票后过期的授权、派生的计票值以及中间选票谓词。 |
| `gene-risk` | 一个玩具基因组风险工作负载的八个加密 SNP 标记剂量。 | 派生的多基因风险评分和一个低/中/高风险分桶。 | 累加加权风险评分,并使用加密谓词和 `cmov()` 派生风险分桶。负向用例拒绝交叉使用评分和分桶授权、原始标记披露、伪造或篡改的授权、更改基因组后过期的授权、派生的评分值以及中间高风险谓词。 |
每个演示程序都列在 `MOJOV_DISCAPPS` 中,因此它们是安全披露应用程序测试集的一部分。要直接运行其中一个,请进入其基准测试目录并使用 Mojo-V 目标,例如:```bash
cd bringup-bench/private-auction
make TARGET=mojov-spike clean build test
Use Spike 的 --mojov-arg=<n> 选项,在手动运行演示程序时选择正向路径(0)或某个负向披露测试(1 及更高)。
Mojo-V 在 bringup-bench 中包含了三个经过认证的真随机数生成器(CERTRNG)演示基准测试。它们使用不同的 CERTRNG 站点、携带证明的加密计算和请求 nonce,以表明客户端可以验证新鲜随机值是在何处进入已批准的计算的。在收据验证和承诺完成之前,结果始终保持加密。负向用例表明,软件生成的随机性、缺失或重复使用的抽取、错误的站点分配、过期请求、被篡改的计算图以及有偏重采样均不满足诚实数据授权。它们还展示了一个重要限制:如果结果在承诺之前被披露(使用 Mojo-V DISC 或 FDISC 指令),仅靠认证随机性无法阻止 grinding。
这些演示程序列在 MOJOV_CERTRNG_APPS 中,因此它们被包含在
Mojo-V 基准测试套件中。可以直接从其目录运行一个,例如:```bash
cd bringup-bench/blind-audit
make TARGET=mojov-spike clean build test
使用 Spike 的 `--mojov-arg=<n>` 选项手动运行演示程序。用例
`0` 是诚实路径,编号较小的用例是成功的解释性控制,
编号 `10` 及以上的用例是预期以 Mojo-V 安全异常终止的攻击。每个应用程序的确切矩阵记录在其基准本地的 `README.md` 中。
## 🛠️ Mojo-V 数据契约多工具用法
数据契约多工具“dc-tool”用于创建和验证 Mojo-V 数据契约。
要创建 ML-KEM512 公钥/私钥对,请执行以下命令。请注意,公钥需要与第三方数据提供商共享,以准备数据契约。私钥将安装到硬件(或模拟器)中。```bash
./dc-tool keygen <pk_file> <sk_file> # public key in <pk_file>, private key in <sk_file>
一旦存在公钥/私钥对,就可以创建加密的数据合约。数据合约包含一个加密的数据访问密钥(用于 Mojo-V 硬件访问第三方数据)和一个加密的内存模式配置。执行以下命令以创建加密的数据合约。```bash ./dc-tool dcgen <pk_file> {fast,strong,proof-carrying} <ct_file> # specify mem mode, contract in <ct_file>
将加密数据合约共享给与用于加密该合约的公钥 ML-KEM512 相对应的 Mojo-V 硬件,将使支持 Mojo-V 的 CPU 能够对受保护的第三方数据执行秘密计算。要验证加密合约是否有效,请使用以下命令。```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>
以下选项已添加到 Spike(标准 RISC-V ISA 模拟器)中。```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>
## 🧠 Mojo-V 编程概述
Mojo-V 软件开发目前使用 EXO 编译器库,并遵循安全的数据无关编码实践:
1. **使用 EXO 库头文件编程**
- 包含 `exo/mojov-exo.h` 以访问 Mojo-V 编程框架和加密类型抽象。
- 包含 `exo/mojov-math.h` 以访问加密数学支持和辅助操作。
2. **对加密变量使用数据无关计算**
- 加密值必须使用数据无关的控制流和内存访问模式进行操作,以维持 Mojo-V 静默执行和侧信道抗性的目标。
3. **遵循 EXO 编程教程**
- 参见 EXO 编程指南:[exo/EXO-library-programming.md](https://github.com/toddmaustin/mojo-v/blob/HEAD/exo/EXO-library-programming.md)
4. **在 EXO 文档中查看编译器结构与架构细节**
- 当前 Mojo-V 编译器/库方法的内部结构和设计背景记录于:[exo/EXO-library-overview.md](https://github.com/toddmaustin/mojo-v/blob/HEAD/exo/EXO-library-overview.md)
---
## 代码许可
本仓库中所有与 Mojo-V 相关的代码均以其所修改工具的许可证发布(例如 Spike、LLVM、Bringup-Bench)。有关许可详情,请参阅各工具对应的目录。
---
## 💬 问题与反馈
我们欢迎贡献、错误报告和建议!
📧 **邮箱:** [[email protected]](mailto:[email protected])
🌐 **项目主页:** [https://github.com/toddmaustin/mojo-v](https://github.com/toddmaustin/mojo-v)
| 程序 | 认证随机工作负载 | 正向行为 | 展示的保护措施 |
|---|
blind-audit | 通过取八个不同的、绑定请求的随机优先级中的最小值,从八个审计记录中选择一个。 | 认证完整的固定 argmin 图;同时还表明未使用的抽取不会影响收据,并且过早披露会引发 grinding。 | 拒绝强制目标、软件 RNG、缺失或过期的 nonce、抽取重用、被丢弃的候选、交换站点以及重放预先计算的选择。 |
diffpriv-count | 使用 16 个不同的随机站点,向加密计数中添加由两个独立的 Binomial(8, 1/2) 值之差形成的中心二项噪声。 | 在保持噪声和答案在验证前均隐藏的同时,认证精确的噪声生成和请求绑定图。 | 拒绝缺失或削弱的噪声、软件 RNG、有利的重采样以及过期请求的重放;无关的未使用随机性保持在收据之外。 |
certified-lotto | 从八个加密条目中选择得分最高的合格参与者,并使用不同的、绑定请求的优先级来打破分数平局。 | 认证每个参与者、随机站点、nonce 混合和锦标赛步骤;还演示了未使用抽取行为以及承诺前披露的 grinding 风险。 | 拒绝缺失的参与者、软件 RNG、跳过或过期的 nonce、抽取重用、交换站点以及确定性平局决胜机制。 |