Implementação CUDA de assinaturas digitais pós-quânticas baseadas em VOLE-in-the-Head — os esquemas FAEST e PERK — com foco em vazão de assinatura em lote. Em uma NVIDIA H100, a implementação assina e verifica em lote até ~34 mil assinaturas/s (FAEST-128f, em lotes de 16.384).
Este repositório é também o artefato do artigo "GPU Acceleration of
VOLEitH-Based Post-Quantum Signatures: A Reusable Fragment-Graph Framework"
(SBSeg 2026). Os scripts reexecutam a matriz completa de benchmarks com
verificação criptográfica e comparam cada medição H100
com os valores publicados segundo a tolerância registrada em benchmarks/.
A reconstrução da comparação CPU usa a implementação otimizada oficial do time
FAEST (v2 — o repositório hoje publicado como
faest-arch-opt, commit fixado
09b2ffb) e o benchmark com 16 processos incluído em cpu_baseline/. Ela
cobre as seis linhas FAEST; a coluna CPU de PERK não está incluída.
Este README segue o modelo do CTA: Selos Considerados, Informações básicas, Dependências, Preocupações com segurança, Instalação, Teste mínimo, Experimentos (uma subseção por reivindicação do artigo) e LICENSE.
Organização do repositório:
src/: projeto CMake (código CUDA de FAEST emsrc/protocols/faest/, PERK emsrc/protocols/perk/, primitivas comuns AES/Keccak emsrc/include/unified_gpu/, testes KAT emsrc/tests/kat/)benchmarks/: valores H100 do artigo (h100_reported_baselines.tsv), mapeamento alegação→comando (claim_command_map.tsv) e política de tolerância (tolerance_policy.tsv)cpu_baseline/: benchmark normalizado com 16 processos para a comparação com CPUbuild.sh: configuração, compilação e testesscripts/run_artifact_local.sh: execução localscripts/run_artifact_modal.py: execução remota via Modal
Os selos considerados são: Disponíveis (SeloD), Funcionais (SeloF), Sustentáveis (SeloS) e Reprodutíveis (SeloR).
A validação funcional completa requer Linux x86_64, CUDA Toolkit e uma GPU NVIDIA compatível (sm_86+). A reprodução dos resultados de desempenho (SeloR) usa uma H100 via Modal — a conta gratuita inclui créditos iniciais (US$ 30 em Agosto de 2026) que cobrem com folga a reprodução completa; confirme as condições atuais antes de executar.
Ambiente dos resultados do artigo:
- GPU: NVIDIA H100 80GB (HBM3), CUDA 12.x, via Modal
- Ambiente local testado: Ubuntu 24.04 x86_64, g++ 13, CMake ≥ 3.28, Ninja
Requisitos locais: Linux x86_64 e pelo menos 10 GiB livres. Para a validação funcional completa: GPU NVIDIA compatível, driver NVIDIA e CUDA Toolkit 12.x (o teste mínimo sem GPU dispensa os três).
sudo apt-get install -y git cmake ninja-build gcc g++ python3 python3-venvPara compilar e validar código CUDA em uma GPU local, também é necessário o
CUDA Toolkit 12.x (https://developer.nvidia.com/cuda-downloads). Para a
reprodução H100 via Modal, o CUDA Toolkit local é dispensável quando Docker
está disponível: o prebuild usa a imagem reproduzível de
Dockerfile.cuda-build (com o toolkit fixado) e recorre ao nvcc local
apenas na ausência de Docker.
O teste local não acessa serviços externos depois do checkout. A reprodução H100 requer rede e uma conta Modal com o CLI autenticado em um ambiente virtual na raiz do repositório, ativado durante a reprodução:
python3 -m venv .venv
source .venv/bin/activate
pip install modal
modal setupA reconstrução CPU também requer Meson (pip install meson ninja) e clona
faest-arch-opt no commit fixado.
O teste local não abre portas nem usa credenciais. A reprodução remota usa as credenciais Modal do próprio usuário e envia somente os binários e metadados necessários ao job H100.
Este é código de pesquisa orientado a desempenho: antes de qualquer consideração de uso real seriam necessárias, no mínimo, revisão de segurança cuidadosa, auditoria da geração de aleatoriedade das chaves e isolamento estrito de hardware.
git clone https://github.com/shyba/gpu-vole.git
cd gpu-vole
./build.shO script configura com CMake/Ninja, compila e executa os testes. Para um
diretório de build alternativo: BUILD_DIR=/tmp/gpu-vole-build ./build.sh.
Por padrão a compilação usa um único processo, o que funciona em qualquer
quantidade de RAM. Para acelerar, aumente JOBS conforme a memória
disponível — cada processo de compilação CUDA pode usar alguns GiB; por
exemplo, JOBS=6 ./build.sh em uma máquina com 32 GiB (vale também para
scripts/run_artifact_local.sh).
Em uma máquina com CUDA Toolkit e GPU NVIDIA compatível, o comando abaixo compila a implementação CUDA, executa a suíte criptográfica — incluindo KATs e assinatura/verificação — e valida a instalação produzida:
CLEAN=1 scripts/run_artifact_local.shSaída esperada: 100% tests passed, 0 tests failed e Artifact check passed.
Esta é a validação funcional do artefato CUDA e requer uma GPU compatível.
A mesma validação pode ser executada remotamente, sem GPU local:
python3 scripts/run_artifact_modal.py checkEm uma máquina sem CUDA Toolkit (sem nvcc no PATH), os mesmos comandos
compilam apenas a parte de host e executam os testes de API, despacho e
empacotamento:
CLEAN=1 scripts/run_artifact_local.shSaída esperada: 100% tests passed, 0 tests failed out of 9 e
Artifact check passed. (menos de um minuto, ~12 MB). Este caminho valida a
instalação e os contratos de host, mas não compila nem executa nenhum kernel
CUDA — a validação funcional completa continua exigindo uma GPU (local ou via
check remoto acima).
Ainda sem GPU, é possível exercitar criptografia real em CPU executando a
reconstrução do baseline (Reivindicação #3, cpu_baseline/run.sh): ela
compila a implementação FAEST de referência e assina/verifica as seis
variantes — note que isso cria o baseline de comparação, não exercita o
código CUDA deste repositório.
Os testes em src/tests/kat/ verificam assinaturas bit-exatas para as seis
variantes FAEST do artigo (128f/s, 192f/s, 256f/s) e para os IDs PERK 1, 3 e 5
(AES fast), além da aceitação dos vetores pela verificação. A origem conhecida,
as limitações de proveniência e os checksums das fixtures estão em
src/tests/kat/vectors/README.md. Fixtures ausentes ou malformadas causam
falha explícita.
Os resultados do artigo, os comandos que os reproduzem e as tolerâncias de
comparação estão registrados em benchmarks/ (h100_reported_baselines.tsv,
claim_command_map.tsv, tolerance_policy.tsv). As duas reivindicações
principais do artigo (tabelas FAEST e PERK na H100) são reproduzidas pelo
mesmo comando; a reconstrução da coluna CPU é separada.
python3 scripts/run_artifact_modal.py publicationO wrapper compila localmente para sm_90 — de preferência na imagem
Docker reproduzível de Dockerfile.cuda-build, que dispensa CUDA Toolkit
local, ou com o nvcc local quando Docker não está disponível. Outras
arquiteturas podem ser selecionadas com GPU_VOLE_CUDA_ARCHITECTURES.
Ele executa os testes CUDA quando há GPU local, envia os binários para uma
reserva Modal H100!, valida-os remotamente e baixa os logs para um diretório
timestampado sob results/. Hashes SHA-256 são conferidos entre build e H100.
Custo e tempo: o prebuild local leva ~10 min; a execução H100 usa poucos
minutos de GPU paga. Requer ~10 GiB de disco e ~40 GiB de RAM locais (pico de
um único ptxas; GPU_VOLE_BUILD_JOBS compila em paralelo e multiplica esse
pico). Timeouts são controlados
por GPU_VOLE_MODAL_TIMEOUT (padrão 3300 s) e GPU_VOLE_CASE_TIMEOUT
(padrão 180 s).
Cada execução requer um diretório de resultados vazio; para repetir, defina
GPU_VOLE_MODAL_RESULTS=results/h100-<identificador>.
Resultado esperado: ao final, o mesmo comando compara automaticamente as
medições com os valores do artigo usando benchmarks/tolerance_policy.tsv e
reporta cada linha FAEST e PERK dentro da tolerância (ou mais rápida). O
diretório de resultados é único por execução e aparece na saída.
Para PERK, esse fluxo usa diretamente as tuplas de publicação registradas em
benchmarks/perk_publication_tuples.tsv. Cada tupla passa por validação
integral das assinaturas, por um gate E2E byte a byte contra a referência PERK
v2.2.0 independente e, para o ID 5, por equivalência entre os caminhos fused e
materialized antes da medição.
O código e as tuplas foram corrigidos e retunados após a medição histórica. A comparação automática verifica a reivindicação de vazão da tabela na H100; ela não representa uma repetição do binário, da tupla ou do ambiente de driver históricos. O manifesto registra o ambiente e os controles efetivamente usados.
cpu_baseline/run.shClona a implementação otimizada oficial (faest-arch-opt, commit fixado
09b2ffb, FAEST v2.0.2), adiciona o benchmark normalizado com 16 processos
usado no artigo (cpu_baseline/bench_normalized_rss.cpp), compila com
Meson e mede sign/verify das seis variantes via API crypto_sign (setup fora
da região cronometrada, 2 s por caso). Os números absolutos dependem da CPU;
os do artigo foram medidos em um Intel i7-11800H (8C/16T). Este comando não
reproduz a coluna CPU de PERK.
- O teste mínimo sem GPU não compila nem exercita código CUDA; a validação
funcional completa requer uma GPU NVIDIA compatível (local ou via
python3 scripts/run_artifact_modal.py check). - Resultados H100 só são comparáveis aos do artigo quando GPU, lote,
aquecimento e iterações seguem o manifesto de execução (gravado
automaticamente em
run_manifest.txt).
GNU Affero General Public License v3.0 (LICENSE). Arquivos Keccak derivados
carregam avisos SPDX-License-Identifier: MIT (copyright Tatsuki Ono), que
devem ser preservados.