This document explains the encryption types and operations supported by TFHE-rs.
TFHE-rs supports two main types of encrypted data:
FheUint
: homomorphic equivalent of Rust unsigned integers u8, u16, ...
FheInt
: homomorphic equivalent of Rust signed integers i8, i16, ...
TFHE-rs uses integers to encrypt all messages which are larger than 4 bits.
Similar to Rust integers, you need to specify the bit size of data when declaring a variable:
TFHE-rs supports various operations on encrypted integers (Enc
) of any size between 1 and 256 bits. These operations can also work between encrypted integers and clear integers (Int
).
Homomorphic integer types (FheUint
and FheInt
) support the following arithmetic operations:
Specifications for operations with zero:
Division by zero: returns modulus - 1.
Remainder operator: returns the first input unchanged.
Example: if ct1 = FheUint8(63)
and ct2 = FheUint8(0)
, then ct1 % ct2 returns FheUint8(63).
The following example shows how to perform arithmetic operations:
Homomorphic integer types support the following bitwise operations:
The following example shows how to perform bitwise operations:
Homomorphic integers support comparison operations. However, due to Rust's limitations, you cannot overload comparison symbols. This is because Rust requires Boolean outputs from such operations, but homomorphic types return ciphertexts. Therefore, you should use the following methods, which conform to the naming conventions of Rust’s standard traits:
Supported operations:
The following example shows how to perform comparison operations:
Homomorphic integers support the min/max operations:
The following example shows how to perform min/max operations:
The ternary conditional operator execute conditional instructions in the form if cond { choice_if } else { choice_else }
.
The syntax is encrypted_condition.if_then_else(encrypted_choice_if, encrypted_choice_else)
. The valid encrypted_condition
must be an encryption of 0 or 1.
The following example shows how to perform ternary conditional operations:
You can cast between integer types using either the cast_from
associated function or the cast_into
method.
The following example shows how to perform casting operations:
Native homomorphic Booleans support the following common Boolean operations: