TFHE-rs is a pure Rust implementation of TFHE for boolean and integer arithmetics over encrypted data.
It includes:
a Rust API
a C API
and a client-side WASM API
TFHE-rs is designed for developers and researchers who want full control over
what they can do with TFHE, while not having to worry about the low-level
implementation. The goal is to have a stable, simple, high-performance, and
production-ready library for all the advanced features of TFHE.
Main features
Low-level cryptographic library that implements Zama’s variant of TFHE, including programmable bootstrapping
Implementation of the original TFHE boolean API that can be used as a drop-in replacement for other TFHE libraries
Short integer API that enables exact, unbounded FHE integer arithmetics with up to 8 bits of message space
Size-efficient public key encryption
Ciphertext and server key compression for efficient data transfer
Full Rust API, C bindings to the Rust High-Level API, and client-side Javascript API using WASM.
Learn more about TFHE-rs features in the documentation.
To use the latest version of TFHE-rs in your project, you first need to add it as a dependency in your Cargo.toml:
tfhe = { version = "*", features = ["boolean", "shortint", "integer"] }
[!Note]
Note: You need to use a Rust version >= 1.81 to compile TFHE-rs.
[!Note]
Note: aarch64-based machines are not yet supported for Windows as it's currently missing an entropy source to be able to seed the CSPRNGs used in TFHE-rs.
use tfhe::prelude::*;
use tfhe::{generate_keys, set_server_key, ConfigBuilder, FheUint32, FheUint8};
fnmain() ->Result<(), Box<dyn std::error::Error>> {
// Basic configuration to use homomorphic integersletconfig = ConfigBuilder::default().build();
// Key generationlet (client_key, server_keys) = generate_keys(config);
letclear_a = 1344u32;
letclear_b = 5u32;
letclear_c = 7u8;
// Encrypting the input data using the (private) client_key// FheUint32: Encrypted equivalent to u32letmut encrypted_a = FheUint32::try_encrypt(clear_a, &client_key)?;
letencrypted_b = FheUint32::try_encrypt(clear_b, &client_key)?;
// FheUint8: Encrypted equivalent to u8letencrypted_c = FheUint8::try_encrypt(clear_c, &client_key)?;
// On the server side:set_server_key(server_keys);
// Clear equivalent computations: 1344 * 5 = 6720letencrypted_res_mul = &encrypted_a * &encrypted_b;
// Clear equivalent computations: 6720 >> 5 = 210
encrypted_a = &encrypted_res_mul >> &encrypted_b;
// Clear equivalent computations: let casted_a = a as u8;letcasted_a: FheUint8 = encrypted_a.cast_into();
// Clear equivalent computations: min(210, 7) = 7letencrypted_res_min = &casted_a.min(&encrypted_c);
// Operation between clear and encrypted data:// Clear equivalent computations: 7 & 1 = 1letencrypted_res = encrypted_res_min & 1_u8;
// Decrypting on the client side:letclear_res: u8 = encrypted_res.decrypt(&client_key);
assert_eq!(clear_res, 1_u8);
Ok(())
}
To run this code, use the following command:
cargo run --release
[!Note]
Note that when running code that uses TFHE-rs, it is highly recommended
to run in release mode with cargo's --release flag to have the best performances possible.
Security estimations are done using the
Lattice Estimator
with red_cost_model = reduction.RC.BDGL16.
When a new update is published in the Lattice Estimator, we update parameters accordingly.
Security model
The default parameters for the TFHE-rs library are chosen considering the IND-CPA security model, and are selected with a bootstrapping failure probability fixed at p_error = $2^{-64}$. In particular, it is assumed that the results of decrypted computations are not shared by the secret key owner with any third parties, as such an action can lead to leakage of the secret encryption key. If you are designing an application where decryptions must be shared, you will need to craft custom encryption parameters which are chosen in consideration of the IND-CPA^D security model [1].
[1] Li, Baiyu, et al. "Securing approximate homomorphic encryption using differential privacy." Annual International Cryptology Conference. Cham: Springer Nature Switzerland, 2022. https://eprint.iacr.org/2022/816.pdf
Side-channel attacks
Mitigation for side-channel attacks has not yet been implemented in TFHE-rs,
and will be released in upcoming versions.
Citations
To cite TFHE-rs in academic papers, please use the following entry:
@Misc{TFHE-rs,
title={{TFHE-rs: A Pure Rust Implementation of the TFHE Scheme for Boolean and Integer Arithmetics Over Encrypted Data}},
author={Zama},
year={2022},
note={\url{https://github.com/zama-ai/tfhe-rs}},
}
Contributing
There are two ways to contribute to TFHE-rs:
Open issues to report bugs and typos, or to suggest new ideas
Request to become an official contributor by emailing hello@zama.ai.
Becoming an approved contributor involves signing our Contributor License Agreement (CLA). Only approved contributors can send pull requests, so please make sure to get in touch before you do!
License
This software is distributed under the BSD-3-Clause-Clear license. Read this for more details.
FAQ
Is Zama’s technology free to use?
Zama’s libraries are free to use under the BSD 3-Clause Clear license only for development, research, prototyping, and experimentation purposes. However, for any commercial use of Zama's open source code, companies must purchase Zama’s commercial patent license.
Everything we do is open source and we are very transparent on what it means for our users, you can read more about how we monetize our open source products at Zama in this blogpost.
What do I need to do if I want to use Zama’s technology for commercial purposes?
To commercially use Zama’s technology you need to be granted Zama’s patent license. Please contact us hello@zama.ai for more information.
Do you file IP on your technology?
Yes, all Zama’s technologies are patented.
Can you customize a solution for my specific use case?
We are open to collaborating and advancing the FHE space with our partners. If you have specific needs, please email us at hello@zama.ai.
🌟 If you find this project helpful or interesting, please consider giving it a star on GitHub! Your support helps to grow the community and motivates further development.
TFHE-rs is a fully homomorphic encryption (FHE) library that implements Zama's variant of TFHE.
We found that tfhe demonstrated a healthy version release cadence and project activity because the last version was released less than a year ago.It has 0 open source maintainers collaborating on the project.
Package last updated on 30 Jan 2025
Did you know?
Socket for GitHub automatically highlights issues in each pull request and monitors the health of all your open source dependencies. Discover the contents of your packages and block harmful activity before you install or update your dependencies.
Socket is joining TC54 to help develop standards for software supply chain security, contributing to the evolution of SBOMs, CycloneDX, and Package URL specifications.
Malicious npm package postcss-optimizer delivers BeaverTail malware, targeting developer systems; similarities to past campaigns suggest a North Korean connection.
By Kirill Boychenko, Peter van der Zee - Jan 29, 2025