This is an implementation of the VERITAS system described in the paper "VERITAS: Plaintext Encoders for Practical Verifiable Homomorphic Encryption" by Sylvain Chatel, Christian Knabenhans, Apostolos Pyrgelis, Carmela Troncoso, and Jean-Pierre Hubaux appearing in the Proceedings of the 2024 ACM SIGSAC Conference on Computer and Communications Security (CCS `24).
VERITAS enables verifiability of homomorphic computations performed by a malicious-but-rational computing server. In particular, VERITAS implements encodings that enable the decryptor to verify the correctness of the executed operations. It is built on top of the Lattigo BFV implementation.
VERITAS implements two encodings:
- The Replication Encoding -- REP (VCHE1) -- See Section 4 of the paper.
- The Polynomial Encoding -- PE (VCHE2) -- See Section 5 of the paper.
This system requires Go 1.15.7 or newer (tested on 1.15.7 and 1.17.3) with benchstat. It can be installed by running:
wget https://golang.org/dl/go1.17.3.linux-amd64.tar.gz
rm -rf /usr/local/go && tar -C /usr/local -xzf go1.17.3.linux-amd64.tar.gz
export PATH=$PATH:/usr/local/go/bin
go get golang.org/x/perf/cmd/benchstat
Some additional requirements can be installed using the command:
apt-get install build-essential
This code was tested on Ubuntu Focal (20.04.3) and macOS Big Sur (11.5.2).
The code of VERITAS is organized in the following folders:
bfv_genericprovides a wrapper of the Lattigo BFVvcheprovides encoding agnostic VERITAS components for BFV integration.vche_1provides the REP encoding source codevche_1_CFPRFprovides the tests for the REP encoding with PRF optimisationvche_2provides the REP encoding source code for the PE encodingvche_2_CFPRFprovides the tests for the PE encoding with PRF optimisationexamplesprovides examples of use of VERITAS on five use-cases; for each example, we implement abaselineusing plain FHE, as well as an implementation ofvche_1,vche_1_CFPRF,vche_2,vche_2_CFPRF, respectively corresponding to the REP and PE encodings. For each of these,main.goimplements the application, andbenchmark_test.gocontains a test and benchmarking harness for the application.ObliviousRidingimplements an encrypted ride-sharing application.FedAvgimplements a federated averaging step from a federated learning deploymentweightscontains the weights of a neural network to be averaged.
EncDNSimplements an encrypted DNS lookupdnsDB.csvanddnsDB(512).csvcontain a database of DNS records.
DiseaseSusceptibilityPackedimplements a disease susceptibility prediction modeldata/weightscontains the weights of the modeldata/Cancercontains inputs to be submitted to the model.
NeuralNetworkInferenceimplements a classifier inference application for the MNIST digits datasetdatacontains the MNIST digit datasetneural_networkimplements machine learning inference in FHEneural_network_pythonimplements machine learning training in Python, from which the weights of the model are derivedmodelscontains the weights of a trained MNIST classifier
plotscontains Jupyter notebooks and Python utilities that were used to generate the plots in the paper.
Running bench.sh in the root directory will microbenchmark operations for the REP and PE encodings for varying parameter sizes.
We use Go's built-in benchmarking tool. In order to reproduce the results from the paper, go the desired directory (e.g., cd examples/ObliviousRiding/vche_2), and run the following command (the paper reports benchmarks for 1000 runs):
go test -run=1000 -bench=. -timeout=60mFor your convenience, the bench.sh script in examples runs all the benchmarks for subdirectories of the current directory. To use it, first go to the desired application directory (e.g., cd examples/ObliviousRiding), and run ../bench.sh.
This script writes the benchmarking output to bench.out (text) and bench.csv(CSV) files in each subdirectory.
We also provide a similar script in examples/run.sh (to be used in the same way as examples/bench.sh), which only runs each implementation of an example once, without benchmarking it.
This software and its source code are licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. You may obtain a copy of the License at
http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License.
@inproceedings{chatel2024veritas,
title={VERITAS: Plaintext Encoders for Practical Verifiable Homomorphic Encryption},
author={Chatel, Sylvain and Knabenhans, Christian and Pyrgelis, Apostolos and Troncoso, Carmela and Hubaux, Jean-Pierre},
year={2024},
booktitle = {Proceedings of the 2024 ACM SIGSAC Conference on Computer and Communications Security},
doi = {10.1145/3658644.3670282},
url = {https://doi.org/10.1145/3658644.3670282},
series = {CCS `24}
}