Skip to main content

ClientKey

Struct ClientKey 

Source
pub struct ClientKey { /* private fields */ }
Expand description

A structure containing the client key, which must be kept secret.

This key can be used to encrypt both in Radix and CRT decompositions.

Using this key, for both decompositions, each block will use the same crypto parameters.

Implementations§

Source§

impl ClientKey

Source

pub fn new<P>(parameter_set: P) -> Self

Creates a Client Key.

§Example
use tfhe::integer::ClientKey;
use tfhe::shortint::parameters::PARAM_MESSAGE_2_CARRY_2_KS_PBS_GAUSSIAN_2M128;

// Generate the client key, that can encrypt in
// radix and crt decomposition, where each block of the decomposition
// have over 2 bits of message modulus.
let cks = ClientKey::new(PARAM_MESSAGE_2_CARRY_2_KS_PBS_GAUSSIAN_2M128);
Source

pub fn into_raw_parts(self) -> ShortintClientKey

Deconstruct a ClientKey into its constituents.

§Example
use tfhe::integer::ClientKey;
use tfhe::shortint::parameters::PARAM_MESSAGE_2_CARRY_2_KS_PBS_GAUSSIAN_2M128;

// Generate the client key, that can encrypt in
// radix and crt decomposition, where each block of the decomposition
// have over 2 bits of message modulus.
let cks = ClientKey::new(PARAM_MESSAGE_2_CARRY_2_KS_PBS_GAUSSIAN_2M128);

let key = cks.into_raw_parts();
Source

pub fn from_raw_parts(key: ShortintClientKey) -> Self

Construct a ClientKey from its constituents.

§Example
use tfhe::integer::ClientKey;
use tfhe::shortint::parameters::PARAM_MESSAGE_2_CARRY_2_KS_PBS_GAUSSIAN_2M128;

// Generate the client key, that can encrypt in
// radix and crt decomposition, where each block of the decomposition
// have over 2 bits of message modulus.
let cks = ClientKey::new(PARAM_MESSAGE_2_CARRY_2_KS_PBS_GAUSSIAN_2M128);

let key = cks.into_raw_parts();

let cks = ClientKey::from_raw_parts(key);
Source

pub fn parameters(&self) -> AtomicPatternParameters

Source

pub fn encrypt_radix<T>(&self, message: T, num_blocks: usize) -> RadixCiphertext

Encrypts an integer in radix decomposition

§Example
use tfhe::integer::ClientKey;
use tfhe::shortint::parameters::PARAM_MESSAGE_2_CARRY_2_KS_PBS_GAUSSIAN_2M128;

let cks = ClientKey::new(PARAM_MESSAGE_2_CARRY_2_KS_PBS_GAUSSIAN_2M128);
let num_block = 4;

let msg = 167_u64;

// 2 * 4 = 8 bits of message
let ct = cks.encrypt_radix(msg, num_block);

let dec = cks.decrypt_radix(&ct);
assert_eq!(msg, dec);
Source

pub fn encrypt_radix_without_padding<T: DecomposableInto<u64> + UnsignedNumeric>( &self, message: T, num_blocks: usize, ) -> RadixCiphertext

Encrypts an integer in radix decomposition without padding bit

§Example
use tfhe::integer::ClientKey;
use tfhe::shortint::parameters::PARAM_MESSAGE_2_CARRY_2_KS_PBS_GAUSSIAN_2M128;

let cks = ClientKey::new(PARAM_MESSAGE_2_CARRY_2_KS_PBS_GAUSSIAN_2M128);
let num_block = 4;

let msg = 167_u64;

// 2 * 4 = 8 bits of message
let ct = cks.encrypt_radix_without_padding(msg, num_block);

let dec = cks.decrypt_radix_without_padding(&ct);
assert_eq!(msg, dec);
Source

pub fn encrypt_radix_compressed<T: DecomposableInto<u64> + UnsignedNumeric>( &self, message: T, num_blocks: usize, ) -> CompressedRadixCiphertext

Source

pub fn encrypt_radix_without_padding_compressed<T: DecomposableInto<u64> + UnsignedNumeric>( &self, message: T, num_blocks: usize, ) -> CompressedRadixCiphertext

Source

pub fn encrypt_words_radix<Block, RadixCiphertextType, T, F>( &self, message_words: T, num_blocks: usize, encrypt_block: F, ) -> RadixCiphertextType
where T: DecomposableInto<u64> + UnsignedNumeric, F: Fn(&ClientKey, u64) -> Block, RadixCiphertextType: From<Vec<Block>>,

Encrypts 64-bits words into a ciphertext in radix decomposition

The words are assumed to be in little endian order.

If there are not enough words for the requested num_block, encryptions of zeros will be appended.

Source

pub fn decrypt_radix<T>(&self, ctxt: &RadixCiphertext) -> T

Decrypts a ciphertext encrypting an radix integer

§Example
use tfhe::integer::ClientKey;
use tfhe::shortint::parameters::PARAM_MESSAGE_2_CARRY_2_KS_PBS_GAUSSIAN_2M128;

let cks = ClientKey::new(PARAM_MESSAGE_2_CARRY_2_KS_PBS_GAUSSIAN_2M128);
let num_block = 4;

let msg = 191_u64;

let ct = cks.encrypt_radix(msg, num_block);

let dec = cks.decrypt_radix(&ct);
assert_eq!(msg, dec);
Source

pub fn decrypt_radix_without_padding<T>(&self, ctxt: &RadixCiphertext) -> T

Decrypts a ciphertext encrypting an radix integer encrypted without padding

§Example
use tfhe::integer::ClientKey;
use tfhe::shortint::parameters::PARAM_MESSAGE_2_CARRY_2_KS_PBS_GAUSSIAN_2M128;

let cks = ClientKey::new(PARAM_MESSAGE_2_CARRY_2_KS_PBS_GAUSSIAN_2M128);
let num_block = 4;

let msg = 191_u64;

let ct = cks.encrypt_radix_without_padding(msg, num_block);

let dec = cks.decrypt_radix_without_padding(&ct);
assert_eq!(msg, dec);
Source

pub fn encrypt_signed_radix<T>( &self, message: T, num_blocks: usize, ) -> SignedRadixCiphertext

Source

pub fn encrypt_signed_radix_without_padding<T>( &self, message: T, num_blocks: usize, ) -> SignedRadixCiphertext

Source

pub fn encrypt_signed_radix_compressed<T: DecomposableInto<u64> + SignedNumeric>( &self, message: T, num_blocks: usize, ) -> CompressedSignedRadixCiphertext

Source

pub fn encrypt_signed_radix_without_padding_compressed<T: DecomposableInto<u64> + SignedNumeric>( &self, message: T, num_blocks: usize, ) -> CompressedSignedRadixCiphertext

Source

pub fn decrypt_signed_radix<T>(&self, ctxt: &SignedRadixCiphertext) -> T

Source

pub fn decrypt_signed_radix_impl<T, F>( &self, ctxt: &SignedRadixCiphertext, decrypt_block: F, ) -> T

Source

pub fn encrypt_one_block(&self, message: u64) -> Ciphertext

Encrypts one block.

This returns a shortint ciphertext.

§Example
use tfhe::integer::ClientKey;
use tfhe::shortint::parameters::PARAM_MESSAGE_2_CARRY_2_KS_PBS_GAUSSIAN_2M128;

let cks = ClientKey::new(PARAM_MESSAGE_2_CARRY_2_KS_PBS_GAUSSIAN_2M128);

let msg = 2_u64;

let ct = cks.encrypt_one_block(msg);

let dec = cks.decrypt_one_block(&ct);
assert_eq!(msg, dec);
Source

pub fn encrypt_bool(&self, msg: bool) -> BooleanBlock

Encrypts a bool to a BooleanBlock

§Example
use tfhe::integer::gen_keys_radix;
use tfhe::shortint::parameters::PARAM_MESSAGE_2_CARRY_2_KS_PBS_GAUSSIAN_2M128;

// We have 4 * 2 = 8 bits of message
let size = 4;
let (cks, sks) = gen_keys_radix(PARAM_MESSAGE_2_CARRY_2_KS_PBS_GAUSSIAN_2M128, size);

let a = cks.encrypt_bool(false);
let dec = cks.decrypt_bool(&a);
assert!(!dec);

let a = a.into_radix(size, &sks);
let dec: u64 = cks.decrypt(&a);
assert_eq!(dec, 0);
Source

pub fn decrypt_one_block(&self, ct: &Ciphertext) -> u64

Decrypts one block.

This takes a shortint ciphertext as input.

Source

pub fn decrypt_bool(&self, ct: &BooleanBlock) -> bool

Decrypts a ciphertext marked as holding a boolean value to a bool

Treats 0 as false and the rest as true

§Example
use tfhe::integer::{BooleanBlock, ClientKey};
use tfhe::shortint::parameters::PARAM_MESSAGE_2_CARRY_2_KS_PBS_GAUSSIAN_2M128;

let cks = ClientKey::new(PARAM_MESSAGE_2_CARRY_2_KS_PBS_GAUSSIAN_2M128);

let a = cks.encrypt_one_block(1u64);
let wrapped = BooleanBlock::new_unchecked(a);
let dec = cks.decrypt_bool(&wrapped);
assert!(dec);
Source

pub fn encrypt_crt(&self, message: u64, base_vec: Vec<u64>) -> CrtCiphertext

Encrypts an integer using crt representation

§Example
use tfhe::integer::ClientKey;
use tfhe::shortint::parameters::PARAM_MESSAGE_2_CARRY_2_KS_PBS_GAUSSIAN_2M128;

let cks = ClientKey::new(PARAM_MESSAGE_2_CARRY_2_KS_PBS_GAUSSIAN_2M128);

let msg = 13_u64;

// Encryption:
let basis: Vec<u64> = vec![2, 3, 5];
let ct = cks.encrypt_crt(msg, basis);

// Decryption:
let dec = cks.decrypt_crt(&ct);
assert_eq!(msg, dec);
Source

pub fn encrypt_crt_compressed( &self, message: u64, base_vec: Vec<u64>, ) -> CompressedCrtCiphertext

Source

pub fn decrypt_crt(&self, ctxt: &CrtCiphertext) -> u64

Decrypts an integer in crt decomposition

§Example
use tfhe::integer::ClientKey;
use tfhe::shortint::parameters::PARAM_MESSAGE_2_CARRY_2_KS_PBS_GAUSSIAN_2M128;

// Generate the client key and the server key:
let cks = ClientKey::new(PARAM_MESSAGE_2_CARRY_2_KS_PBS_GAUSSIAN_2M128);

let msg = 27_u64;
let basis: Vec<u64> = vec![2, 3, 5];

// Encryption:
let ct = cks.encrypt_crt(msg, basis);

// Decryption:
let dec = cks.decrypt_crt(&ct);
assert_eq!(msg, dec);
Source

pub fn encrypt_native_crt( &self, message: u64, base_vec: Vec<u64>, ) -> CrtCiphertext

Encrypts a small integer message using the client key and some moduli without padding bit.

§Example
use tfhe::integer::ClientKey;
use tfhe::shortint::parameters::PARAM_MESSAGE_3_CARRY_3_KS_PBS_GAUSSIAN_2M128;

let cks = ClientKey::new(PARAM_MESSAGE_3_CARRY_3_KS_PBS_GAUSSIAN_2M128);

let msg = 13_u64;

// Encryption of one message:
let basis: Vec<u64> = vec![2, 3, 5];
let ct = cks.encrypt_native_crt(msg, basis);

// Decryption:
let dec = cks.decrypt_native_crt(&ct);
assert_eq!(msg, dec);
Source

pub fn encrypt_native_crt_compressed( &self, message: u64, base_vec: Vec<u64>, ) -> CompressedCrtCiphertext

Source

pub fn decrypt_native_crt(&self, ct: &CrtCiphertext) -> u64

Decrypts a ciphertext encrypting an integer message with some moduli basis without padding bit.

§Example
use tfhe::integer::ClientKey;
use tfhe::shortint::parameters::PARAM_MESSAGE_3_CARRY_3_KS_PBS_GAUSSIAN_2M128;

let cks = ClientKey::new(PARAM_MESSAGE_3_CARRY_3_KS_PBS_GAUSSIAN_2M128);

let msg = 27_u64;
let basis: Vec<u64> = vec![2, 3, 5];
// Encryption of one message:
let ct = cks.encrypt_native_crt(msg, basis);

// Decryption:
let dec = cks.decrypt_native_crt(&ct);
assert_eq!(msg, dec);
Source

pub fn new_compression_private_key( &self, params: CompressionParameters, ) -> CompressionPrivateKeys

Source

pub fn new_compression_decompression_keys( &self, private_compression_key: &CompressionPrivateKeys, ) -> (CompressionKey, DecompressionKey)

Source§

impl ClientKey

Source§

impl ClientKey

Trait Implementations§

Source§

impl AsRef<ClientKey> for CrtClientKey

Source§

fn as_ref(&self) -> &ClientKey

Converts this type into a shared reference of the (usually inferred) input type.
Source§

impl AsRef<ClientKey> for RadixClientKey

Source§

fn as_ref(&self) -> &ClientKey

Converts this type into a shared reference of the (usually inferred) input type.
Source§

impl AsRef<ClientKey> for ClientKey

Source§

fn as_ref(&self) -> &Self

Converts this type into a shared reference of the (usually inferred) input type.
Source§

impl AsRef<ClientKey> for ClientKey

Source§

fn as_ref(&self) -> &ClientKey

Converts this type into a shared reference of the (usually inferred) input type.
Source§

impl AsRef<GenericClientKey<AtomicPatternClientKey>> for ClientKey

Source§

fn as_ref(&self) -> &ShortintClientKey

Converts this type into a shared reference of the (usually inferred) input type.
Source§

impl Clone for ClientKey

Source§

fn clone(&self) -> ClientKey

Returns a duplicate of the value. Read more
1.0.0 (const: unstable) · Source§

fn clone_from(&mut self, source: &Self)

Performs copy-assignment from source. Read more
Source§

impl Debug for ClientKey

Source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more
Source§

impl<'de> Deserialize<'de> for ClientKey

Source§

fn deserialize<__D>(__deserializer: __D) -> Result<Self, __D::Error>
where __D: Deserializer<'de>,

Deserialize this value from the given Serde deserializer. Read more
Source§

impl From<ClientKey> for ClientKey

Source§

fn from(key: ClientKey) -> Self

Converts to this type from the input type.
Source§

impl From<GenericClientKey<AtomicPatternClientKey>> for ClientKey

Source§

fn from(key: ShortintClientKey) -> Self

Converts to this type from the input type.
Source§

impl From<RadixClientKey> for ClientKey

Source§

fn from(ck: RadixClientKey) -> Self

Converts to this type from the input type.
Source§

impl PartialEq for ClientKey

Source§

fn eq(&self, other: &ClientKey) -> bool

Equality operator ==. Read more
1.0.0 (const: unstable) · Source§

fn ne(&self, other: &Rhs) -> bool

Inequality operator !=. Read more
Source§

impl Serialize for ClientKey

Source§

fn serialize<__S>(&self, __serializer: __S) -> Result<__S::Ok, __S::Error>
where __S: Serializer,

Serialize this value into the given Serde serializer. Read more
Source§

impl StructuralPartialEq for ClientKey

Source§

impl<'key> TryFrom<&'key ClientKey> for CompactPrivateKey<&'key [u64]>

Source§

type Error = Error

The type returned in the event of a conversion error.
Source§

fn try_from(client_key: &'key ClientKey) -> Result<Self, Self::Error>

Performs the conversion.
Source§

impl Unversionize for ClientKey

Source§

fn unversionize( versioned: Self::VersionedOwned, ) -> Result<Self, UnversionizeError>

Creates an object from a versioned enum, and eventually upgrades from previous variants.
Source§

impl UnversionizeVec for ClientKey

Source§

impl Version for ClientKey

Source§

type Ref<'vers> = ClientKeyVersion<'vers>

Source§

type Owned = ClientKeyVersionOwned

Source§

impl Versionize for ClientKey

Source§

type Versioned<'vers> = <ClientKeyVersions as VersionsDispatch<ClientKey>>::Ref<'vers>

The equivalent versioned type. It should have a variant for each version. It may own the underlying data or only hold a read-only reference to it.
Source§

fn versionize(&self) -> Self::Versioned<'_>

Wraps the object into a versioned enum with a variant for each version. This will use references on the underlying types if possible.
Source§

impl VersionizeOwned for ClientKey

Source§

type VersionedOwned = <ClientKeyVersions as VersionsDispatch<ClientKey>>::Owned

Source§

fn versionize_owned(self) -> Self::VersionedOwned

Wraps the object into a versioned enum with a variant for each version. This will clone the underlying types.
Source§

impl VersionizeSlice for ClientKey

Source§

type VersionedSlice<'vers> = Vec<<ClientKey as Versionize>::Versioned<'vers>>

Source§

fn versionize_slice(slice: &[Self]) -> Self::VersionedSlice<'_>

Source§

impl VersionizeVec for ClientKey

Source§

impl VersionsDispatch<ClientKey> for ClientKeyVersions

Source§

type Ref<'vers> = ClientKeyVersionsDispatch<'vers>

Source§

type Owned = ClientKeyVersionsDispatchOwned

Auto Trait Implementations§

Blanket Implementations§

Source§

impl<T> Any for T
where T: 'static + ?Sized,

Source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
Source§

impl<T> Borrow<T> for T
where T: ?Sized,

Source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
Source§

impl<T> BorrowMut<T> for T
where T: ?Sized,

Source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
Source§

impl<Input, Output> CastInto<Output> for Input
where Output: CastFrom<Input>,

Source§

fn cast_into(self) -> Output

Source§

impl<T> CloneToUninit for T
where T: Clone,

Source§

unsafe fn clone_to_uninit(&self, dest: *mut u8)

🔬This is a nightly-only experimental API. (clone_to_uninit)
Performs copy-assignment from self to dest. Read more
Source§

impl<T> DeserializeOwned for T
where T: for<'de> Deserialize<'de>,

Source§

impl<T> From<T> for T

Source§

fn from(t: T) -> T

Returns the argument unchanged.

Source§

impl<T> Instrument for T

Source§

fn instrument(self, span: Span) -> Instrumented<Self>

Instruments this type with the provided Span, returning an Instrumented wrapper. Read more
Source§

fn in_current_span(self) -> Instrumented<Self>

Instruments this type with the current Span, returning an Instrumented wrapper. Read more
Source§

impl<T, U> Into<U> for T
where U: From<T>,

Source§

fn into(self) -> U

Calls U::from(self).

That is, this conversion is whatever the implementation of From<T> for U chooses to do.

Source§

impl<T> IntoEither for T

Source§

fn into_either(self, into_left: bool) -> Either<Self, Self>

Converts self into a Left variant of Either<Self, Self> if into_left is true. Converts self into a Right variant of Either<Self, Self> otherwise. Read more
Source§

fn into_either_with<F>(self, into_left: F) -> Either<Self, Self>
where F: FnOnce(&Self) -> bool,

Converts self into a Left variant of Either<Self, Self> if into_left(&self) returns true. Converts self into a Right variant of Either<Self, Self> otherwise. Read more
Source§

impl<T> Pointable for T

Source§

const ALIGN: usize

The alignment of pointer.
Source§

type Init = T

The type for initializers.
Source§

unsafe fn init(init: <T as Pointable>::Init) -> usize

Initializes a with the given initializer. Read more
Source§

unsafe fn deref<'a>(ptr: usize) -> &'a T

Dereferences the given pointer. Read more
Source§

unsafe fn deref_mut<'a>(ptr: usize) -> &'a mut T

Mutably dereferences the given pointer. Read more
Source§

unsafe fn drop(ptr: usize)

Drops the object pointed to by the given pointer. Read more
Source§

impl<A> SafeAs for A

Source§

fn sas<T>(self) -> T
where A: TryInto<T>,

Source§

impl<T> Same for T

Source§

type Output = T

Should always be Self
Source§

impl<T> ToOwned for T
where T: Clone,

Source§

type Owned = T

The resulting type after obtaining ownership.
Source§

fn to_owned(&self) -> T

Creates owned data from borrowed data, usually by cloning. Read more
Source§

fn clone_into(&self, target: &mut T)

Uses borrowed data to replace owned data, usually by cloning. Read more
Source§

impl<T, U> TryFrom<U> for T
where U: Into<T>,

Source§

type Error = Infallible

The type returned in the event of a conversion error.
Source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
Source§

impl<T, U> TryInto<U> for T
where U: TryFrom<T>,

Source§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
Source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
Source§

impl<V, T> VZip<V> for T
where V: MultiLane<T>,

Source§

fn vzip(self) -> V

Source§

impl<T> WithSubscriber for T

Source§

fn with_subscriber<S>(self, subscriber: S) -> WithDispatch<Self>
where S: Into<Dispatch>,

Attaches the provided Subscriber to this type, returning a WithDispatch wrapper. Read more
Source§

fn with_current_subscriber(self) -> WithDispatch<Self>

Attaches the current default Subscriber to this type, returning a WithDispatch wrapper. Read more