TFHE-rs interoperability example
This is the full execution for the example explained in the TFHE-rs Interoperability Guide (use case 1). You can find the TFHE-rs code here, while the Python code is under this direcotry here. Both are CLI tools, so that we can execute the example step by step. You can refer to the code at every step to see how it's implemented.
Make tmpdir
We want to setup a temporary working directory first:
export TDIR=`mktemp -d`
KeyGen
First we need to build the TFHE-rs utility in this directory by running the following:
cd ../../tests/tfhers-utils/
make build
cd -
Then we can generate keys in two different ways. You only need to run one of the following methods.
Generate the Secret Key in Concrete
We start by doing keygen in Concrete:
python example.py keygen -o $TDIR/concrete_sk -k $TDIR/concrete_keyset
Then we do a partial keygen in TFHE-rs:
../../tests/tfhers-utils/target/release/tfhers_utils keygen --lwe-sk $TDIR/concrete_sk --output-lwe-sk $TDIR/tfhers_sk -c $TDIR/tfhers_client_key -s $TDIR/tfhers_server_key
Generate the Secret Key in TFHE-rs
We start by doing keygen in TFHE-rs:
../../tests/tfhers-utils/target/release/tfhers_utils keygen --output-lwe-sk $TDIR/tfhers_sk -c $TDIR/tfhers_client_key -s $TDIR/tfhers_server_key
Then we do a partial keygen in Concrete:
python example.py keygen -s $TDIR/tfhers_sk -o $TDIR/concrete_sk -k $TDIR/concrete_keyset
Encrypt in TFHE-rs
../../tests/tfhers-utils/target/release/tfhers_utils encrypt-with-key --value 162 --ciphertext $TDIR/tfhers_ct_1 --client-key $TDIR/tfhers_client_key
../../tests/tfhers-utils/target/release/tfhers_utils encrypt-with-key --value 73 --ciphertext $TDIR/tfhers_ct_2 --client-key $TDIR/tfhers_client_key
{% hint style="info" %}
If you have tensor inputs, then you can encrypt by passing your flat tensor in --value. Concrete will take care of reshaping the values to the corresponding shape. For example --value=1,2,3,4 can represent a 2 by 2 tensor, or a flat vector of 4 values.
{% endhint %}
Compute in TFHE-rs
# encrypt value to add first
../../tests/tfhers-utils/target/release/tfhers_utils encrypt-with-key --value 9 --ciphertext $TDIR/tfhers_ct_inc --client-key $TDIR/tfhers_client_key
# add two ciphertexts
../../tests/tfhers-utils/target/release/tfhers_utils add --server-key $TDIR/tfhers_server_key --cts $TDIR/tfhers_ct_2 $TDIR/tfhers_ct_inc --output-ct $TDIR/tfhers_ct_2
Run in Concrete
python example.py run -k $TDIR/concrete_keyset -c1 $TDIR/tfhers_ct_1 -c2 $TDIR/tfhers_ct_2 -o $TDIR/tfhers_ct_out
Decrypt in TFHE-rs
../../tests/tfhers-utils/target/release/tfhers_utils decrypt-with-key --ciphertext $TDIR/tfhers_ct_out --client-key $TDIR/tfhers_client_key
Clean tmpdir
rm -rf $TDIR