
Расширение системы команд RISC-V для аппаратно-обеспечиваемых секретных вычислений с использованием инкапсуляции ключей ML-KEM-512 и шифрования SIMON-128, обеспечивающее не зависящее от данных выполнение с производительностью, близкой к нативной.
Mojo-V (произносится «mojo-five») — это новое расширение RISC-V, которое добавляет возможности программирования, ориентированные на конфиденциальность, для RISC-V. Mojo-V реализует секретные вычисления, обеспечивая безопасное, эффективное и не зависящее от данных исполнение без опоры на хрупкое программное обеспечение и доверие к программисту. Изолируя конфиденциальные данные в выделенных секретных регистрах и шифруя память с помощью стороннего ключа, Mojo-V предотвращает раскрытие информации и обеспечивает вычисления, которые являются одновременно «слепыми» (без прямых раскрытий) и «тихими» (без утечек по побочным каналам). Архитектура бесшовно интегрируется в существующую ISA RISC-V всего лишь с одним битом режима и четырьмя новыми инструкциями, контроль которых осуществляется полностью на этапе декодирования. Ранние результаты демонстрируют скорость исполнения, близкую к нативной, обеспечивая при этом улучшение производительности на 5–7 порядков по сравнению с полностью гомоморфным шифрованием (FHE), а также содержат чёткую дорожную карту интеграции в CPU, GPU и специализированные ускорители.
Чтобы узнать больше...
Текущая спецификация расширения ISA Mojo-V (релиз 1.02):
Для связи с разработчиками Mojo-V:
Выпуск 1.03 эталонной платформы Mojo-V реализует эталонную платформу симулятора Spike для RISC-V RV64GC и компилятор EXO для спецификации ISA Mojo-V v1.02. Текущая реализация поддерживает быстрые, строгие и proof-carrying режимы шифрования, а также безопасное раскрытие результатов зашифрованных вычислений и сертифицированную генерацию случайных чисел. Релиз включает широкий набор тестов Mojo-V, ориентированных на конфиденциальность бенчмарков и демонстрационных приложений для безопасного раскрытия. Он также включает полную спецификацию ISA Mojo-V и документацию для разработчиков.
Этот выпуск подходит для использования в качестве i) платформы разработки приложений Mojo-V, ii) эталонной модели для проверки аппаратных реализаций Mojo-V и iii) эталонной реализации для анализа безопасности. Текущая работа сосредоточена на разработке i) компилятора Mojo-V на основе LLVM, ii) модели Mojo-V на основе gem5 для архитектурных исследований и анализа, и iii) эталонной реализации CVA6 SystemVerilog RTL для RISC-V RV64GC с расширениями Mojo-V.
Версия спецификации: 1.02 (август 2026)
Контакт: [email protected]
Спецификация ISA Mojo-V v1.02
doc/Spike (симулятор набора инструкций) с расширениями Mojo-V
riscv-isa-sim и функционально полон для процессора RV64GC с инкапсуляцией ключей ML-KEM-512 для загрузки контрактов данных и симметричным шифрованием SIMON-128 для защиты секретных вычислений.--isa=rv64gc_zicond_zkmojov_zicntr при запуске spikeData Contract Multi-tool
Контракты данных — это зашифрованные пакеты, которые позволяют аппаратному обеспечению процессора Mojo-V получать доступ к ключу доступа к данным и информации о конфигурации (например, режиму шифрования памяти) для набора данных, зашифрованного с помощью Mojo-V. Инструмент DC Multi-tool предоставляет следующие возможности:
Бенчмарки Mojo-V Bringup-Bench
Обратите внимание: остальная часть бенчмарков Bringup-bench пока НЕ перенесена на Mojo-V.
Вам понадобится кросс-компилятор RISC-V на основе LLVM, способный создавать бинарные файлы 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. Сборка симулятора RISC-V Spike с поддержкой 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
Контракты данных — это зашифрованные пакеты, которые позволяют аппаратному обеспечению CPU Mojo-V получить доступ к ключу доступа к данным и конфигурационной информации (например, режиму шифрования памяти) для зашифрованного набора данных Mojo-V.``` cd dc-tool make clean build test
### **E. Сборка и запуск бенчмарк-тестов Mojo-V Bringup-Bench**
1. **Соберите драйвер устройства Spike** ```bash
cd bringup-bench/target
make
Настройте ваш компилятор
Отредактируйте ../Makefile и укажите TARGET_CC для цели mojov на расположение вашего LVM Clang-based 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
| 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` | Тесты проверки зашифрованной математической библиотеки EXO для `_sincos`, `mojov_sin`, `mojov_cos`, `mojov_fabs`, `mojov_floor`, `mojov_pow`, `mojov_round` и `mojov_sqrt` |
Эти тестовые бенчмарки демонстрируют правила ISA Mojo-V, поведение библиотеки EXO и семантику безопасности.
## 🧪 Обзор бенчмарков Mojo-V Bringup-Bench
Текущий набор бенчмарков bring-up включает следующие бенчмарк-приложения 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) |
| `flood-fill-On2` | Вариант бенчмарка заливки с поведением O(n²) |
| `fuzzy-match` | Бенчмарк нечёткого сопоставления строк |
| `gcd-list` | Бенчмарк наибольшего общего делителя для списка |
| `gemm` | Бенчмарк общего перемножения матриц |
| `gemm-strong` | Бенчмарк GEMM, настроенный на сильное шифрование |
| `grad-descent` | Бенчмарк оптимизации градиентным спуском |
| `heat-calc` | Бенчмарк расчёта теплопередачи/уравнения теплопроводности |
| `heldkarp-tsp` | Бенчмарк задачи коммивояжёра методом динамического программирования Хелда–Карпа на зашифрованных графах |
| `highlife` | Бенчмарк клеточного автомата HighLife с эволюцией зашифрованного состояния поля |
| `kadane` | Бенчмарк поиска максимального подмассива (алгоритм Кадане) |
| `kalman-filter` | Бенчмарк фильтра Калмана |
| `kcore-decomp` | Бенчмарк декомпозиции графа на k-ядра |
| `kepler-calc` | Бенчмарк численного расчёта уравнения Кеплера |
| `knapsack` | Бенчмарк оптимизации задачи о рюкзаке |
| `lcs` | Бенчмарк не зависящей от данных наибольшей общей подпоследовательности на зашифрованных строках |
| `lda` | Бенчмарк латентного размещения Дирихле |
| `manacher-lps` | Бенчмарк поиска наибольшей палиндромной подстроки (алгоритм Манакера) |
| `mersenne` | Бенчмарк вычисления чисел Мерсенна |
| `minspan` | Бенчмарк минимальной остовной структуры |
| `monte-carlo` | Бенчмарк моделирования методом Монте-Карло |
| `moving-average` | Бенчмарк аналитики скользящего среднего |
| `moving-average-fp64` | Бенчмарк аналитики скользящего среднего в FP64 |
| `nbody-sim` | Бенчмарк моделирования задачи N тел |
| `nonlinear-nn` | Бенчмарк нелинейной нейронной сети |
| `nr-solver` | Бенчмарк решателя Ньютона–Рафсона |
| `ntt-kernel` | Бенчмарк ядра теоретико-числового преобразования |
| `packet-filter` | Бенчмарк фильтрации пакетов |
| `pagerank` | Графовый бенчмарк PageRank |
| `parrondo` | Бенчмарк процесса/стратегии Паррондо |
| `partition-equal` | Бенчмарк разбиения на подмножества с равной суммой на зашифрованных множествах |
| `pca-analysis` | Бенчмарк анализа главных компонент |
| `primal-test` | Бенчмарк проверки чисел на простоту |
| `private-join` | Бенчмарк соединения данных с сохранением конфиденциальности |
| `psi` | Бенчмарк приватного пересечения множеств |
| `quartile-stats` | Бенчмарк аналитики квартильных границ и квартильных средних на зашифрованных данных |
| `rabinkarp-search` | Бенчмарк поиска по образцу с помощью алгоритма Рабина–Карпа |
| `rad-to-deg` | Бенчмарк преобразования радианов в градусы |
| `randshell-sort` | Бенчмарк рандомизированной сортировки Шелла |
| `ransac` | Бенчмарк подгонки модели методом RANSAC |
| `regex-match` | Бенчмарк сопоставления с регулярными выражениями |
| `risk-score` | Бенчмарк аналитики оценки рисков |
| `scrambled-compare` | Бенчмарк сравнения переставленных строк с использованием зашифрованного динамического программирования |
| `seq-align` | Бенчмарк глобального выравнивания последовательностей (Нидлмана–Вунша) на зашифрованных строках |
| `shortest-path` | Графовый бенчмарк кратчайшего пути |
| `sieve` | Бенчмарк решета простых чисел |
| `skeleton` | Бенчмарк-скелет/шаблон, используемый в качестве базового для bring-up |
| `soundex` | Бенчмарк фонетического кодирования Soundex |
| `string-search` | Бенчмарк поиска в строке |
| `tea-cipher` | Бенчмарк шифра TEA |
| `tiny-NN` | Бенчмарк инференса крошечной нейронной сети |
| `triangle-count` | Графовый бенчмарк подсчёта треугольников |
| `variability-sample` | Бенчмарк вариативности и выборочных статистик |
| `verlet` | Физический бенчмарк интегрирования по Верле |
## Обзор демонстраторов безопасного раскрытия Mojo-V
Mojo-V включает три демонстрационных бенчмарка безопасного раскрытия в `bringup-bench`. Эти приложения используют зашифрованную память с доказательством (proof-carrying) и зашифрованные гранты на данные, чтобы показать, как программа может выполнять вычисления над чувствительными входными данными, раскрывать только явно разрешённые производные результаты и перехватывать попытки повторного использования гранта для другого значения, исходного ввода, устаревшего вычисления, подделанного гранта или промежуточного предиката.
| Program | Чувствительные входные данные | Разрешённые раскрытия | Демонстрируемые защиты |
|:---------|:----------------|:------------------------|:--------------------------|
| `private-auction` | Восемь зашифрованных приватных ставок. | Идентификатор победителя и стоимость выигравшей ставки. | Находит максимальную ставку с помощью зашифрованных сравнений и `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
Используйте опцию Spike --mojov-arg=<n>, чтобы выбрать положительный путь (0) или один из негативных тестов раскрытия (1 и выше) при ручном запуске демонстратора.
Mojo-V включает три демонстрационных бенчмарка сертифицированного генератора истинных случайных чисел (CERTRNG) в bringup-bench. Они используют различные участки CERTRNG, шифрованное вычисление с доказательством и nonce запросов, чтобы показать, что клиент может проверить, где свежие случайные значения вошли в одобренное вычисление. Результаты остаются зашифрованными до проверки квитанции и коммитмента. Негативные случаи демонстрируют, что программно сгенерированная случайность, отсутствующие или повторно используемые выборки, неправильные назначения участков, устаревшие запросы, изменённые графы вычислений и смещённая повторная выборка не удовлетворяют условиям честного предоставления данных. Они также показывают важное ограничение: сертифицированная случайность сама по себе не может остановить перебор (grinding), если результаты раскрываются (с использованием инструкций Mojo-V DISC или FDISC) до коммитмента.
Эти демонстраторы перечислены в 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>
Предоставление зашифрованного контракта данных оборудованию Mojo-V, которое соответствует открытому ключу ML-KEM512, использованному для шифрования контракта, позволит процессору с поддержкой Mojo-V выполнять секретные вычисления над защищёнными сторонними данными. Чтобы проверить, что зашифрованный контракт является действительным, используйте следующие команды.```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, стандартный симулятор 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>
## 🧠 Обзор программирования 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/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; также показывает, что неиспользуемые выборки не влияют на квитанцию и что преждевременное раскрытие позволяет перебор. | Отклоняет навязанную цель, программный ГСЧ, отсутствующий или устаревший nonce, повторное использование выборок, отброшенного кандидата, переставленные участки и воспроизведение предвычисленного выбора. |
diffpriv-count | Добавляет центрированный биномиальный шум, образованный как разность двух независимых значений Binomial(8, 1/2), к зашифрованному счётчику, используя 16 различных случайных участков. | Сертифицирует точный граф генерации шума и привязки к запросу, сохраняя как шум, так и ответ скрытыми до проверки. | Отклоняет пропущенный или ослабленный шум, программный ГСЧ, благоприятную повторную выборку и повтор устаревшего запроса; несвязанная неиспользуемая случайность остаётся вне квитанции. |
certified-lotto | Выбирает допустимого участника с наибольшим количеством очков среди восьми зашифрованных записей и использует различные привязанные к запросу приоритеты для разрешения равенства очков. | Сертифицирует каждого участника, случайный участок, смесь nonce и каждый шаг турнира; также демонстрирует поведение неиспользуемых выборок и опасность перебора при раскрытии до коммитмента. | Отклоняет пропущенного участника, программный ГСЧ, пропущенный или устаревший nonce, повторное использование выборок, переставленные участки и детерминированный критерий разрешения равенства. |