concrete-integer 0.1.1

Homomorphic Integer circuit interface for the concrete FHE library.
Documentation
use super::ClientKey;
use crate::CrtCiphertext;

use serde::{Deserialize, Serialize};

/// Client key "specialized" for CRT decomposition.
///
/// This key is a simple wrapper of the [ClientKey],
/// that only encrypt and decrypt in CRT decomposition.
///
/// # Example
///
/// ```rust
/// use concrete_integer::CrtClientKey;
/// use concrete_shortint::parameters::PARAM_MESSAGE_2_CARRY_2;
///
/// let basis = vec![2, 3, 5];
/// let cks = CrtClientKey::new(PARAM_MESSAGE_2_CARRY_2, basis);
///
/// let msg = 13_u64;
///
/// // Encryption:
/// let ct = cks.encrypt(msg);
///
/// // Decryption:
/// let dec = cks.decrypt(&ct);
/// assert_eq!(msg, dec);
/// ```
#[derive(Serialize, Deserialize, PartialEq, Debug, Clone)]
pub struct CrtClientKey {
    key: ClientKey,
    moduli: Vec<u64>,
}

impl AsRef<ClientKey> for CrtClientKey {
    fn as_ref(&self) -> &ClientKey {
        &self.key
    }
}

impl CrtClientKey {
    pub fn new(parameters: concrete_shortint::Parameters, moduli: Vec<u64>) -> Self {
        Self {
            key: ClientKey::new(parameters),
            moduli,
        }
    }

    pub fn encrypt(&self, message: u64) -> CrtCiphertext {
        self.key.encrypt_crt(message, self.moduli.clone())
    }

    pub fn decrypt(&self, ciphertext: &CrtCiphertext) -> u64 {
        self.key.decrypt_crt(ciphertext)
    }

    /// Returns the parameters used by the client key.
    pub fn parameters(&self) -> concrete_shortint::Parameters {
        self.key.parameters()
    }
}

impl From<(ClientKey, Vec<u64>)> for CrtClientKey {
    fn from((key, moduli): (ClientKey, Vec<u64>)) -> Self {
        Self { key, moduli }
    }
}