
ML-KEM-512鍵カプセル化とSIMON-128暗号化を用いたハードウェア強制型秘密計算のためのRISC-V ISA拡張であり、ネイティブに近いパフォーマンスでデータ非依存実行を可能にします。
<p align="center"> <img src="https://assets.kitploit.com/production/public/readmes/9608/67cb1dbfb4bdedcc5db7b59178bbc7a64f6e88cc7f73952ed87aad1b818d6698.png" alt="Mojo-V Logo" width="550"/> </p> # Mojo-V: RISC-V向け秘密計算 **Mojo-V**(*“mojo-five”* と発音)は、RISC-Vにプライバシー指向のプログラミング機能をもたらす新しいRISC-V拡張機能です。Mojo-Vは秘密計算を実装し、脆弱なソフトウェアやプログラマの信頼に依存することなく、安全・効率的・データ非依存(data-oblivious)な実行を可能にします。機密データを専用のシークレットレジスタに隔離し、第三者鍵でメモリを暗号化することで、Mojo-Vは情報漏えいを防ぎ、ブラインド(直接的な漏えいなし)かつサイレント(サイドチャネル漏えいなし)な計算を強制します。この設計は、モードビット1つと新しい命令4つのみで既存の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: [[email protected]](mailto:[email protected]) # 🧩 Mojo-Vリファレンスプラットフォーム — リリース1.03 ## 🚧 プロジェクトの状況 Mojo-Vリファレンスプラットフォーム リリース1.03は、RISC-V RV64GC向けのリファレンスSpikeシミュレータプラットフォームと、Mojo-V ISA仕様v1.02向けのEXOコンパイラを実装しています。現在の実装は、高速・強力・証明運搬(proof-carrying)暗号化モードに加え、暗号化された計算結果の安全な開示と認定乱数生成をサポートしています。このリリースには、多種多様な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. **Mojo-V拡張機能を備えたSpike(命令セットシミュレータ)** - Mojo-Vは `riscv-isa-sim` に統合され、データコントラクト読み込み用のML-KEM-512鍵カプセル化と、秘密計算保護用のSIMON-128対称鍵暗号化を備えたRV64GC CPU向けに機能完全となっています。 - 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コンパイラをインストールする `RV64GC` バイナリを生成できるLLVMベースのRISC-Vクロスコンパイラが必要です。 ここから始めるのが良いでしょう: https://github.com/openssl/openssl ### B. OpenSSLバージョン3.6以降をインストールする OpenSSLバージョン3.6以降の開発者向けインストールが必要です。これにより、Spikeが保護された鍵交換に使用するML-KEM512を実装するライブラリが提供されます。 ここから始めるのが良いでしょう: 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. Data Contract Multi-tool のビルドとテスト** データ契約は、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 テスト概要 | Program | 説明 | |:---------|:-------------| | `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 ベンチマークアプリケーションが含まれています。 | Program | 説明 | |:---------|:-------------| | `bitonic-sort` | データ非依存バイトニックソートベンチマーク | | `bloom-filter` | ブルームフィルタの集合所属ベンチマーク | | `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)ベンチマーク | | `gemm-strong` | 強力な暗号化向けに構成された GEMM ベンチマーク | | `grad-descent` | 勾配降下最適化ベンチマーク | | `heat-calc` | 熱伝達・熱方程式計算ベンチマーク | | `heldkarp-tsp` | 暗号化されたグラフ上の Held-Karp 動的計画法巡回セールスマンベンチマーク | | `highlife` | 暗号化された盤面状態の進化を伴う HighLife セルオートマトンベンチマーク | | `kadane` | 最大部分配列ベンチマーク(Kadane のアルゴリズム) | | `kalman-filter` | カルマンフィルタリングベンチマーク | | `kcore-decomp` | グラフ k コア分解ベンチマーク | | `kepler-calc` | ケプラー方程式・数値計算ベンチマーク | | `knapsack` | ナップサック最適化ベンチマーク | | `lcs` | 暗号化文字列に対するデータ非依存最長共通部分列ベンチマーク | | `lda` | 潜在的ディリクレ配分(LDA)ベンチマーク | | `manacher-lps` | 最長回文部分文字列ベンチマーク(Manacher のアルゴリズム) | | `mersenne` | メルセンヌ数の計算ベンチマーク | | `minspan` | 最小全域構造ベンチマーク | | `monte-carlo` | モンテカルロシミュレーションベンチマーク | | `moving-average` | 移動平均分析ベンチマーク | | `moving-average-fp64` | FP64 移動平均分析ベンチマーク | | `nbody-sim` | N 体シミュレーションベンチマーク | | `nonlinear-nn` | 非線形ニューラルネットワークベンチマーク | | `nr-solver` | ニュートン・ラフソン法ソルバーベンチマーク | | `ntt-kernel` | 数論変換(NTT)カーネルベンチマーク | | `packet-filter` | パケットフィルタリングベンチマーク | | `pagerank` | PageRank グラフベンチマーク | | `parrondo` | Parrondo プロセス・戦略ベンチマーク | | `partition-equal` | 暗号化された集合に対する Partition Equal Subset Sum ベンチマーク | | `pca-analysis` | 主成分分析ベンチマーク | | `primal-test` | 素数判定ベンチマーク | | `private-join` | プライバシー保護ジョインベンチマーク | | `psi` | プライベート集合交差(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` 内に3つのセーフディスクロージャデモンストレータベンチマークが含まれています。これらのアプリケーションは、証明担持暗号化メモリと暗号化データグラントを使用して、プログラムが機密入力に対して計算を行い、明示的に許可された導出結果のみを開示し、別の値、生の入力、古い計算、改ざんされたグラント、または中間述語に対するグラントの再利用を試みる操作をトラップできることを示します。 | Program | 機密入力 | 許可された開示 | 実証される保護 | |:---------|:----------------|:------------------------|:--------------------------| | `private-auction` | 8つの暗号化されたプライベート入札 | 落札者 ID と落札額 | 暗号化比較と`cmov()`を使用して最大入札を見つけ、出力ごとのデータグラントを検証します。ネガティブケースでは、一致しないグラント、生の落札額の開示、偽造または改ざんされたグラント、オークション変更後の古いグラント、導出された`winning_bid + 1`値、および中間比較述語を拒否します。 | | `vote-tally` | 3人の候補者にわたる32票の暗号化された投票(2票の無効投票を含む) | 候補者 A、B、C の集計結果に加え、投票ごとのキュア述語 | すべての候補者数と投票妥当性述語を暗号化形式で計算します。ネガティブケースでは、ある集計グラントを別の集計に使用すること、生の投票の開示、偽造または改ざんされたグラント、投票変更後の古いグラント、導出された集計値、および中間投票述語を拒否します。 | | `gene-risk` | おもちゃのゲノムリスクワークロード向けの8つの暗号化された SNP マーカー用量 | 導出された多遺伝子リスクスコアと低/中/高のリスクバケット | 加重リスクスコアを蓄積し、暗号化述語と`cmov()`を使用してリスクバケットを導出します。ネガティブケースでは、スコアとバケットのグラントの相互使用、生のマーカー開示、偽造または改ざんされたグラント、ゲノム変更後の古いグラント、導出されたスコア値、および中間の高リスク述語を拒否します。 | 各デモンストレータは`MOJOV_DISCAPPS`にリストされているため、セーフディスクロージャアプリケーションバッテリの一部です。直接実行するには、そのベンチマークディレクトリに移動し、Mojo-V ターゲットを使用します。例:```bash cd bringup-bench/private-auction make TARGET=mojov-spike clean build test ``` Spikeの`--mojov-arg=<n>`オプションを使用して、デモンストレーターを手動で実行する場合に、正のパス(`0`)または負の開示テストのいずれか(`1`以上)を選択します。 ## Mojo-V認定TRNGデモンストレーター概要 Mojo-Vには、`bringup-bench`内に3つの認定済み真性乱数生成器(CERTRNG)デモンストレーターベンチマークが含まれています。これらは、それぞれ異なる`CERTRNG`サイト、証明運搬型の暗号化計算、および要求ノンスを使用して、クライアントが新鮮な乱数が承認された計算のどこに入力されたかを検証できることを示します。結果は、レシート検証とコミットメントが行われるまで暗号化されたままです。負のケースは、ソフトウェア生成の乱数、欠落または再利用された抽出、誤ったサイト割り当て、古い要求、変更された計算グラフ、および偏った再サンプリングが、正直なデータ許諾を満たさないことを示しています。また、重要な限界も示しています。認定された乱数だけでは、コミットメントの前に結果が開示された場合(Mojo-VのDISCまたはFDISC命令を使用)、グラインディングを止めることはできません。 | Program | Certified-random workload | Positive behavior | Demonstrated protections | |:---------|:--------------------------|:------------------|:--------------------------| | `blind-audit` | 8つの監査レコードのうち1つを、8つの個別の要求バインドされた乱数優先度の最小値を取ることによって選択します。 | 完全な固定argminグラフを認定します。また、未使用の抽出がレシートに影響を与えないこと、および早期開示がグラインディングを可能にすることを示します。 | 強制されたターゲット、ソフトウェアRNG、欠落または古いノンス、抽出の再利用、候補の欠落、サイトの入れ替え、および事前計算された選択のリプレイを拒否します。 | | `diffpriv-count` | 16の個別の乱数サイトを使用して、2つの独立した`Binomial(8, 1/2)`値の差として形成された中心化二項ノイズを、暗号化されたカウントに追加します。 | ノイズと回答の両方を検証まで隠したまま、正確なノイズ生成および要求バインドのグラフを認定します。 | 省略または弱められたノイズ、ソフトウェアRNG、有利な再サンプリング、および古い要求のリプレイを拒否します。無関係な未使用の乱数はレシートの範囲外に残ります。 | | `certified-lotto` | 8つの暗号化エントリの中から最高スコアの適格参加者を選択し、個別の要求バインドされた優先度を使用してスコアの同点を解決します。 | すべての参加者、乱数サイト、ノンスミックス、およびトーナメントステップを認定します。また、未使用抽出の動作と、コミットメント前の開示によるグラインディングの危険性を示します。 | 省略された参加者、ソフトウェアRNG、スキップまたは古いノンス、抽出の再利用、サイトの入れ替え、および決定論的なタイブレーカーを拒否します。 | これらのデモンストレーターは`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 固有のオプション 以下のオプションが、標準の RISC-V ISA シミュレータである Spike に追加されました。```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 コンパイラライブラリを使用し、安全なデータ非依存(data-oblivious)コーディングプラクティスに従っています。 1. **EXO ライブラリヘッダーでプログラミングする** - `exo/mojov-exo.h` をインクルードして、Mojo-V プログラミングフレームワークと暗号化型の抽象化にアクセスします。 - `exo/mojov-math.h` をインクルードして、暗号化数学サポートとヘルパー演算にアクセスします。 2. **暗号化変数にはデータ非依存(data-oblivious)計算を使用する** - 暗号化された値は、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)