The basic steps for using the high-level API of TFHE-rs are:
Importing the TFHE-rs prelude;
Client-side: Configuring and creating keys;
Client-side: Encrypting data;
Server-side: Setting the server key;
Server-side: Computing over encrypted data;
Client-side: Decrypting data.
Here is a full example (combining the client and server parts):
The default configuration for x86 Unix machines:
Configuration options for different platforms can be found here. Other rust and homomorphic types features can be found here.
tfhe
uses traits
to have a consistent API for creating FHE types and enable users to write generic functions. To be able to use associated functions and methods of a trait, the trait has to be in scope.
To make it easier, the prelude
'pattern' is used. All of the important tfhe
traits are in a prelude
module that you can glob import. With this, there is no need to remember or know the traits that you want to import.
The first step is the creation of the configuration. The configuration is used to declare which type you will (or will not) use, as well as enabling you to use custom crypto-parameters for these types. Custom parameters should only be used for more advanced usage and/or testing.
A configuration can be created by using the ConfigBuilder type.
In this example, 8-bit unsigned integers with default parameters are used. The integers
feature must also be enabled, as per the table on this page.
The config is generated by first creating a builder with all types deactivated. Then, the integer types with default parameters are activated, since we are going to use FheUint8 values.
The generate_keys
command returns a client key and a server key.
The client_key
is meant to stay private and not leave the client, whereas the server_key
can be made public and sent to a server for it to enable FHE computations.
The next step is to call set_server_key
This function will move the server key to an internal state of the crate and manage the details to give a simpler interface.
Encrypting data is achieved via the encrypt
associated function of the FheEncrypt trait.
Types exposed by this crate implement at least one of FheEncrypt or FheTryEncrypt to allow encryption.
Computations should be as easy as normal Rust to write, thanks to the usage of operator overloading.
The decryption is achieved by using the decrypt
method, which comes from the FheDecrypt trait.