1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
//! Module with primitives pertaining to [`SeededLwePublicKey`] decompression.

use crate::core_crypto::algorithms::*;
use crate::core_crypto::commons::generators::MaskRandomGenerator;
use crate::core_crypto::commons::traits::*;
use crate::core_crypto::entities::*;

/// Decompress a [`SeededLwePublicKey`], without consuming it, into a standard
/// [`LwePublicKey`].
pub fn decompress_seeded_lwe_public_key<Scalar, InputCont, OutputCont, Gen>(
    output_pk: &mut LwePublicKey<OutputCont>,
    input_pk: &SeededLwePublicKey<InputCont>,
) where
    Scalar: UnsignedTorus,
    InputCont: Container<Element = Scalar>,
    OutputCont: ContainerMut<Element = Scalar>,
    Gen: ByteRandomGenerator,
{
    assert_eq!(
        output_pk.ciphertext_modulus(),
        input_pk.ciphertext_modulus(),
        "Mismatched CiphertextModulus \
    between input SeededLwePublicKey ({:?}) and output LwePublicKey ({:?})",
        output_pk.ciphertext_modulus(),
        input_pk.ciphertext_modulus(),
    );

    let mut generator = MaskRandomGenerator::<Gen>::new(input_pk.compression_seed().seed);
    decompress_seeded_lwe_ciphertext_list_with_existing_generator::<_, _, _, Gen>(
        output_pk,
        input_pk,
        &mut generator,
    );
}

/// Decompress a [`SeededLwePublicKey`], without consuming it, into a standard
/// [`LwePublicKey`] using multiple threads.
pub fn par_decompress_seeded_lwe_public_key<Scalar, InputCont, OutputCont, Gen>(
    output_pk: &mut LwePublicKey<OutputCont>,
    input_pk: &SeededLwePublicKey<InputCont>,
) where
    Scalar: UnsignedTorus + Send + Sync,
    InputCont: Container<Element = Scalar>,
    OutputCont: ContainerMut<Element = Scalar>,
    Gen: ParallelByteRandomGenerator,
{
    assert_eq!(
        output_pk.ciphertext_modulus(),
        input_pk.ciphertext_modulus(),
        "Mismatched CiphertextModulus \
    between input SeededLwePublicKey ({:?}) and output LwePublicKey ({:?})",
        output_pk.ciphertext_modulus(),
        input_pk.ciphertext_modulus(),
    );

    let mut generator = MaskRandomGenerator::<Gen>::new(input_pk.compression_seed().seed);
    par_decompress_seeded_lwe_ciphertext_list_with_existing_generator::<_, _, _, Gen>(
        output_pk,
        input_pk,
        &mut generator,
    );
}