<p align="center"> <img src="https://assets.kitploit.com/production/public/readmes/9608/67cb1dbfb4bdedcc5db7b59178bbc7a64f6e88cc7f73952ed87aad1b818d6698.png" alt="Mojo-V 标志" width="550"/> </p> # Mojo-V:面向 RISC-V 的秘密计算 **Mojo-V**(发音为 *“mojo-five”*)是一种新的 RISC-V 扩展,为 RISC-V 引入了面向隐私的编程能力。Mojo-V 实现了秘密计算,可在不依赖脆弱软件和程序员信任的情况下,实现安全、高效且数据无关的执行。通过将敏感数据隔离在专用的秘密寄存器中,并在第三方密钥下加密内存,Mojo-V 可防止泄露,并强制执行既盲(无直接泄露)又静默(无侧信道泄漏)的计算。该设计仅通过一个模式位和四条新指令即可无缝集成到现有 RISC-V ISA 中,并完全在译码阶段强制执行。早期结果显示,其执行速度接近原生水平,同时与全同态加密(FHE)相比,性能提升超过 5-7 个数量级,并拥有集成到 CPU、GPU 和专用加速器的清晰路线图。 了解更多... - 这是一个介绍 Mojo-V 的视频:https://www.youtube.com/watch?v=HUT46TcNyyM - 概述 Mojo-V 项目的幻灯片: https://drive.google.com/file/d/1VVzZqYHvQgnKMgXZjg7I_cX2GzF7awSN 当前 Mojo-V ISA 扩展规范(版本 1.02): - [PDF 格式。] (https://drive.google.com/file/d/1yfiBqp0xyXD-S_G5d2o7Ggta5wI6nRot) 联系 Mojo-V 开发者: - 邮箱:[[email protected]](mailto:[email protected]) # 🧩 Mojo-V 参考平台 — 版本 1.03 ## 🚧 项目状态 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]](mailto:[email protected]) ## 当前组件 1. **Mojo-V ISA 规范 v1.02** - 随 `doc/` 发布 2. **Spike(指令集模拟器)及 Mojo-V 扩展** - Mojo-V 已集成到 `riscv-isa-sim` 中,并且针对 RV64GC CPU 功能完善,支持用于数据契约加载的 ML-KEM-512 密钥封装,以及用于秘密计算保护的 SIMON-128 对称密钥加密。 - 要在启用 Mojo-V 扩展的情况下运行 Spike,请在运行 `spike` 时添加 `--isa=rv64gc_zicond_zkmojov_zicntr` 标志 3. **数据契约多工具** 数据契约是经过加密的数据包,允许 Mojo-V CPU 的硬件访问 Mojo-V 加密数据集的访问密钥和配置信息(例如内存加密模式)。DC 多工具支持以下功能: * 硬件开发者可以创建 ML-KEM512 公钥/私钥对:公钥与服务提供商共享,私钥嵌入到 Mojo-V 硬件实现中。 * 数据所有者可以创建数据契约,并使用服务提供商的 ML-KEM512 公钥对其进行加密。匹配的 Mojo-V 硬件随后即可对受保护的第三方加密数据执行秘密计算。 4. **Mojo-V Bringup-Bench 基准测试** - 针对 RV64GC+Mojo-V 的全套安全测试 - 针对 RV64GC+Mojo-V 的全套完整性攻击测试 - 全套 EXO 编译器库测试 - 全套 EXO 数学库和字符串库测试 - 使用 EXO Mojo-V 编译器库构建的大量面向隐私的基准测试 - 全套安全披露演示应用程序 - 全套认证 TRNG 演示应用程序 - 展示 Mojo-V 秘密计算的手写示例(如冒泡排序) 请注意,Bringup-bench 基准测试的其余部分尚未移植到 Mojo-V。 ## ⚙️ 构建并运行 Mojo-V 参考平台 ### A. 安装 RISC-V LLVM 编译器 你需要一个基于 LLVM 的 RISC-V 交叉编译器,它能生成 `RV64GC` 二进制文件。 这里是一个很好的起点:https://github.com/openssl/openssl ### B. 安装 OpenSSL 3.6 或更新版本 你需要安装 OpenSSL 3.6 或更新版本的开发者安装包。这会提供实现 ML-KEM512 的库,Spike 使用该库进行受保护的密钥交换。 这里是一个很好的起点:https://clang.llvm.org/get_started.html ### C. 克隆 Mojo-V 仓库```bash 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 ``` ### **E. 构建并测试数据合约多功能工具** 数据合约是加密数据包,允许 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 ``` 2. **配置你的编译器** 编辑 `../Makefile`,为 `mojov` 目标设置 `TARGET_CC`,指向你的基于 LVM Clang 的 RISC-V 编译器位置。 3. **构建并测试 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 认证 TRNG 演示程序概览 Mojo-V 在 `bringup-bench` 中包含了三个经过认证的真随机数生成器(CERTRNG)演示基准测试。它们使用不同的 `CERTRNG` 站点、携带证明的加密计算和请求 nonce,以表明客户端可以验证新鲜随机值是在何处进入已批准的计算的。在收据验证和承诺完成之前,结果始终保持加密。负向用例表明,软件生成的随机性、缺失或重复使用的抽取、错误的站点分配、过期请求、被篡改的计算图以及有偏重采样均不满足诚实数据授权。它们还展示了一个重要限制:如果结果在承诺之前被披露(使用 Mojo-V DISC 或 FDISC 指令),仅靠认证随机性无法阻止 grinding。 | 程序 | 认证随机工作负载 | 正向行为 | 展示的保护措施 | |:---------|:--------------------------|:------------------|:--------------------------| | `blind-audit` | 通过取八个不同的、绑定请求的随机优先级中的最小值,从八个审计记录中选择一个。 | 认证完整的固定 argmin 图;同时还表明未使用的抽取不会影响收据,并且过早披露会引发 grinding。 | 拒绝强制目标、软件 RNG、缺失或过期的 nonce、抽取重用、被丢弃的候选、交换站点以及重放预先计算的选择。 | | `diffpriv-count` | 使用 16 个不同的随机站点,向加密计数中添加由两个独立的 `Binomial(8, 1/2)` 值之差形成的中心二项噪声。 | 在保持噪声和答案在验证前均隐藏的同时,认证精确的噪声生成和请求绑定图。 | 拒绝缺失或削弱的噪声、软件 RNG、有利的重采样以及过期请求的重放;无关的未使用随机性保持在收据之外。 | | `certified-lotto` | 从八个加密条目中选择得分最高的合格参与者,并使用不同的、绑定请求的优先级来打破分数平局。 | 认证每个参与者、随机站点、nonce 混合和锦标赛步骤;还演示了未使用抽取行为以及承诺前披露的 grinding 风险。 | 拒绝缺失的参与者、软件 RNG、跳过或过期的 nonce、抽取重用、交换站点以及确定性平局决胜机制。 | 这些演示程序列在 `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> ``` ## 🛠️ RISC-V Spike ISA 模拟器新增的 Mojo-V 特定选项 以下选项已添加到 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=<n> 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/main/exo/EXO-library-programming.md) 4. **在 EXO 文档中查看编译器结构与架构细节** - 当前 Mojo-V 编译器/库方法的内部结构和设计背景记录于:[exo/EXO-library-overview.md](https://github.com/toddmaustin/mojo-v/blob/main/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)