chore: wasm bench

This commit is contained in:
Arthur Meyre
2024-05-16 18:32:24 +02:00
parent 3d74cb9980
commit 066b4ed993
9 changed files with 363 additions and 86 deletions

View File

@@ -50,12 +50,13 @@ struct GroupElements<G: Curve> {
}
impl<G: Curve> GroupElements<G> {
pub fn new(message_len: usize, alpha: G::Zp) -> Self {
pub fn new(message_len: usize, _alpha: G::Zp) -> Self {
let (g_list, g_hat_list) = rayon::join(
|| {
let mut g_list = Vec::new();
let mut g_cur = G::G1::GENERATOR.mul_scalar(alpha);
// let mut g_cur = G::G1::GENERATOR.mul_scalar(alpha);
let mut g_cur = G::G1::GENERATOR + G::G1::GENERATOR;
for i in 0..2 * message_len {
if i == message_len {
@@ -63,17 +64,20 @@ impl<G: Curve> GroupElements<G> {
} else {
g_list.push(g_cur);
}
g_cur = g_cur.mul_scalar(alpha);
// g_cur = g_cur.mul_scalar(alpha);
g_cur = g_cur + g_cur;
}
g_list
},
|| {
let mut g_hat_list = Vec::new();
let mut g_hat_cur = G::G2::GENERATOR.mul_scalar(alpha);
// let mut g_hat_cur = G::G2::GENERATOR.mul_scalar(alpha);
let mut g_hat_cur = G::G2::GENERATOR + G::G2::GENERATOR;
for _ in 0..message_len {
g_hat_list.push(g_hat_cur);
g_hat_cur = (g_hat_cur).mul_scalar(alpha);
// g_hat_cur = (g_hat_cur).mul_scalar(alpha);
g_hat_cur = g_hat_cur + g_hat_cur;
}
g_hat_list
},

View File

@@ -1,6 +1,7 @@
use crate::core_crypto::commons::generators::DeterministicSeeder;
use crate::core_crypto::commons::math::random::Seed;
use crate::core_crypto::prelude::ActivatedRandomGenerator;
use crate::shortint::parameters::bc::*;
use crate::shortint::parameters::classic::compact_pk::*;
use crate::shortint::parameters::*;
use std::panic::set_hook;
@@ -358,6 +359,19 @@ expose_predefined_parameters! {
PARAM_SMALL_MESSAGE_2_CARRY_2,
PARAM_SMALL_MESSAGE_3_CARRY_3,
PARAM_SMALL_MESSAGE_4_CARRY_4,
// ZK_TESTS
PARAM_PKE_1_1_2048,
PARAM_PKE_2_2_2048,
PARAM_PKE_3_3_2048,
PARAM_PKE_4_4_2048,
PARAM_PKE_1_1_4096,
PARAM_PKE_2_2_4096,
PARAM_PKE_3_3_4096,
PARAM_PKE_4_4_4096,
PARAM_PKE_1_1_1024,
PARAM_PKE_2_2_1024,
PARAM_PKE_3_3_1024,
PARAM_PKE_4_4_1024,
}
#[wasm_bindgen]

View File

@@ -7760,5 +7760,221 @@ pub const OLD_PARAM_PKE_2_2: ClassicPBSParameters = ClassicPBSParameters {
max_noise_level: MaxNoiseLevel::new(5),
log2_p_fail: -40.0,
ciphertext_modulus: CiphertextModulus::new_native(),
encryption_key_choice: EncryptionKeyChoice::Big,
};
pub const PARAM_PKE_1_1_4096: ClassicPBSParameters = ClassicPBSParameters {
lwe_dimension: LweDimension(4096),
glwe_dimension: GlweDimension(1),
polynomial_size: PolynomialSize(2048),
lwe_noise_distribution: DynamicDistribution::new_t_uniform(3),
glwe_noise_distribution: DynamicDistribution::new_t_uniform(15),
pbs_base_log: DecompositionBaseLog(21),
pbs_level: DecompositionLevelCount(1),
ks_base_log: DecompositionBaseLog(6),
ks_level: DecompositionLevelCount(3),
message_modulus: MessageModulus(2),
carry_modulus: CarryModulus(2),
max_noise_level: MaxNoiseLevel::new(3),
log2_p_fail: -40.0,
ciphertext_modulus: CiphertextModulus::new_native(),
encryption_key_choice: EncryptionKeyChoice::Small,
};
pub const PARAM_PKE_2_2_4096: ClassicPBSParameters = ClassicPBSParameters {
lwe_dimension: LweDimension(4096),
glwe_dimension: GlweDimension(1),
polynomial_size: PolynomialSize(2048),
lwe_noise_distribution: DynamicDistribution::new_t_uniform(3),
glwe_noise_distribution: DynamicDistribution::new_t_uniform(15),
pbs_base_log: DecompositionBaseLog(21),
pbs_level: DecompositionLevelCount(1),
ks_base_log: DecompositionBaseLog(6),
ks_level: DecompositionLevelCount(3),
message_modulus: MessageModulus(4),
carry_modulus: CarryModulus(4),
max_noise_level: MaxNoiseLevel::new(5),
log2_p_fail: -40.0,
ciphertext_modulus: CiphertextModulus::new_native(),
encryption_key_choice: EncryptionKeyChoice::Small,
};
pub const PARAM_PKE_3_3_4096: ClassicPBSParameters = ClassicPBSParameters {
lwe_dimension: LweDimension(4096),
glwe_dimension: GlweDimension(1),
polynomial_size: PolynomialSize(2048),
lwe_noise_distribution: DynamicDistribution::new_t_uniform(3),
glwe_noise_distribution: DynamicDistribution::new_t_uniform(15),
pbs_base_log: DecompositionBaseLog(21),
pbs_level: DecompositionLevelCount(1),
ks_base_log: DecompositionBaseLog(6),
ks_level: DecompositionLevelCount(3),
message_modulus: MessageModulus(8),
carry_modulus: CarryModulus(8),
max_noise_level: MaxNoiseLevel::new(9),
log2_p_fail: -40.0,
ciphertext_modulus: CiphertextModulus::new_native(),
encryption_key_choice: EncryptionKeyChoice::Small,
};
pub const PARAM_PKE_4_4_4096: ClassicPBSParameters = ClassicPBSParameters {
lwe_dimension: LweDimension(4096),
glwe_dimension: GlweDimension(1),
polynomial_size: PolynomialSize(2048),
lwe_noise_distribution: DynamicDistribution::new_t_uniform(3),
glwe_noise_distribution: DynamicDistribution::new_t_uniform(15),
pbs_base_log: DecompositionBaseLog(21),
pbs_level: DecompositionLevelCount(1),
ks_base_log: DecompositionBaseLog(6),
ks_level: DecompositionLevelCount(3),
message_modulus: MessageModulus(16),
carry_modulus: CarryModulus(16),
max_noise_level: MaxNoiseLevel::new(17),
log2_p_fail: -40.0,
ciphertext_modulus: CiphertextModulus::new_native(),
encryption_key_choice: EncryptionKeyChoice::Small,
};
pub const PARAM_PKE_1_1_2048: ClassicPBSParameters = ClassicPBSParameters {
lwe_dimension: LweDimension(2048),
glwe_dimension: GlweDimension(1),
polynomial_size: PolynomialSize(2048),
lwe_noise_distribution: DynamicDistribution::new_t_uniform(15),
glwe_noise_distribution: DynamicDistribution::new_t_uniform(15),
pbs_base_log: DecompositionBaseLog(21),
pbs_level: DecompositionLevelCount(1),
ks_base_log: DecompositionBaseLog(6),
ks_level: DecompositionLevelCount(3),
message_modulus: MessageModulus(2),
carry_modulus: CarryModulus(2),
max_noise_level: MaxNoiseLevel::new(3),
log2_p_fail: -40.0,
ciphertext_modulus: CiphertextModulus::new_native(),
encryption_key_choice: EncryptionKeyChoice::Small,
};
pub const PARAM_PKE_2_2_2048: ClassicPBSParameters = ClassicPBSParameters {
lwe_dimension: LweDimension(2048),
glwe_dimension: GlweDimension(1),
polynomial_size: PolynomialSize(2048),
lwe_noise_distribution: DynamicDistribution::new_t_uniform(15),
glwe_noise_distribution: DynamicDistribution::new_t_uniform(15),
pbs_base_log: DecompositionBaseLog(21),
pbs_level: DecompositionLevelCount(1),
ks_base_log: DecompositionBaseLog(6),
ks_level: DecompositionLevelCount(3),
message_modulus: MessageModulus(4),
carry_modulus: CarryModulus(4),
max_noise_level: MaxNoiseLevel::new(5),
log2_p_fail: -40.0,
ciphertext_modulus: CiphertextModulus::new_native(),
encryption_key_choice: EncryptionKeyChoice::Small,
};
pub const PARAM_PKE_3_3_2048: ClassicPBSParameters = ClassicPBSParameters {
lwe_dimension: LweDimension(2048),
glwe_dimension: GlweDimension(1),
polynomial_size: PolynomialSize(2048),
lwe_noise_distribution: DynamicDistribution::new_t_uniform(15),
glwe_noise_distribution: DynamicDistribution::new_t_uniform(15),
pbs_base_log: DecompositionBaseLog(21),
pbs_level: DecompositionLevelCount(1),
ks_base_log: DecompositionBaseLog(6),
ks_level: DecompositionLevelCount(3),
message_modulus: MessageModulus(8),
carry_modulus: CarryModulus(8),
max_noise_level: MaxNoiseLevel::new(9),
log2_p_fail: -40.0,
ciphertext_modulus: CiphertextModulus::new_native(),
encryption_key_choice: EncryptionKeyChoice::Small,
};
pub const PARAM_PKE_4_4_2048: ClassicPBSParameters = ClassicPBSParameters {
lwe_dimension: LweDimension(2048),
glwe_dimension: GlweDimension(1),
polynomial_size: PolynomialSize(2048),
lwe_noise_distribution: DynamicDistribution::new_t_uniform(15),
glwe_noise_distribution: DynamicDistribution::new_t_uniform(15),
pbs_base_log: DecompositionBaseLog(21),
pbs_level: DecompositionLevelCount(1),
ks_base_log: DecompositionBaseLog(6),
ks_level: DecompositionLevelCount(3),
message_modulus: MessageModulus(16),
carry_modulus: CarryModulus(16),
max_noise_level: MaxNoiseLevel::new(17),
log2_p_fail: -40.0,
ciphertext_modulus: CiphertextModulus::new_native(),
encryption_key_choice: EncryptionKeyChoice::Small,
};
pub const PARAM_PKE_1_1_1024: ClassicPBSParameters = ClassicPBSParameters {
lwe_dimension: LweDimension(1024),
glwe_dimension: GlweDimension(1),
polynomial_size: PolynomialSize(2048),
lwe_noise_distribution: DynamicDistribution::new_t_uniform(42),
glwe_noise_distribution: DynamicDistribution::new_t_uniform(15),
pbs_base_log: DecompositionBaseLog(21),
pbs_level: DecompositionLevelCount(1),
ks_base_log: DecompositionBaseLog(6),
ks_level: DecompositionLevelCount(3),
message_modulus: MessageModulus(2),
carry_modulus: CarryModulus(2),
max_noise_level: MaxNoiseLevel::new(3),
log2_p_fail: -40.0,
ciphertext_modulus: CiphertextModulus::new_native(),
encryption_key_choice: EncryptionKeyChoice::Small,
};
pub const PARAM_PKE_2_2_1024: ClassicPBSParameters = ClassicPBSParameters {
lwe_dimension: LweDimension(1024),
glwe_dimension: GlweDimension(1),
polynomial_size: PolynomialSize(2048),
lwe_noise_distribution: DynamicDistribution::new_t_uniform(42),
glwe_noise_distribution: DynamicDistribution::new_t_uniform(15),
pbs_base_log: DecompositionBaseLog(21),
pbs_level: DecompositionLevelCount(1),
ks_base_log: DecompositionBaseLog(6),
ks_level: DecompositionLevelCount(3),
message_modulus: MessageModulus(4),
carry_modulus: CarryModulus(4),
max_noise_level: MaxNoiseLevel::new(5),
log2_p_fail: -40.0,
ciphertext_modulus: CiphertextModulus::new_native(),
encryption_key_choice: EncryptionKeyChoice::Small,
};
pub const PARAM_PKE_3_3_1024: ClassicPBSParameters = ClassicPBSParameters {
lwe_dimension: LweDimension(1024),
glwe_dimension: GlweDimension(1),
polynomial_size: PolynomialSize(2048),
lwe_noise_distribution: DynamicDistribution::new_t_uniform(42),
glwe_noise_distribution: DynamicDistribution::new_t_uniform(15),
pbs_base_log: DecompositionBaseLog(21),
pbs_level: DecompositionLevelCount(1),
ks_base_log: DecompositionBaseLog(6),
ks_level: DecompositionLevelCount(3),
message_modulus: MessageModulus(8),
carry_modulus: CarryModulus(8),
max_noise_level: MaxNoiseLevel::new(9),
log2_p_fail: -40.0,
ciphertext_modulus: CiphertextModulus::new_native(),
encryption_key_choice: EncryptionKeyChoice::Small,
};
pub const PARAM_PKE_4_4_1024: ClassicPBSParameters = ClassicPBSParameters {
lwe_dimension: LweDimension(1024),
glwe_dimension: GlweDimension(1),
polynomial_size: PolynomialSize(2048),
lwe_noise_distribution: DynamicDistribution::new_t_uniform(42),
glwe_noise_distribution: DynamicDistribution::new_t_uniform(15),
pbs_base_log: DecompositionBaseLog(21),
pbs_level: DecompositionLevelCount(1),
ks_base_log: DecompositionBaseLog(6),
ks_level: DecompositionLevelCount(3),
message_modulus: MessageModulus(16),
carry_modulus: CarryModulus(16),
max_noise_level: MaxNoiseLevel::new(17),
log2_p_fail: -40.0,
ciphertext_modulus: CiphertextModulus::new_native(),
encryption_key_choice: EncryptionKeyChoice::Small,
};

View File

@@ -23,21 +23,21 @@ async function setup() {
const demos = await Comlink.wrap(worker).demos;
const demoNames = [
"publicKeyTest",
"compressedPublicKeyTest",
"compactPublicKeyTest32BitBig",
"compactPublicKeyTest32BitSmall",
"compactPublicKeyTest256BitBig",
"compactPublicKeyTest256BitSmall",
"compressedCompactPublicKeyTest256BitBig",
"compressedCompactPublicKeyTest256BitSmall",
"compactPublicKeyZeroKnowledge",
"compactPublicKeyBench32BitBig",
"compactPublicKeyBench32BitSmall",
"compactPublicKeyBench256BitBig",
"compactPublicKeyBench256BitSmall",
"compressedServerKeyBenchMessage1Carry1",
"compressedServerKeyBenchMessage2Carry2",
// "publicKeyTest",
// "compressedPublicKeyTest",
// "compactPublicKeyTest32BitBig",
// "compactPublicKeyTest32BitSmall",
// "compactPublicKeyTest256BitBig",
// "compactPublicKeyTest256BitSmall",
// "compressedCompactPublicKeyTest256BitBig",
// "compressedCompactPublicKeyTest256BitSmall",
// "compactPublicKeyZeroKnowledge",
// "compactPublicKeyBench32BitBig",
// "compactPublicKeyBench32BitSmall",
// "compactPublicKeyBench256BitBig",
// "compactPublicKeyBench256BitSmall",
// "compressedServerKeyBenchMessage1Carry1",
// "compressedServerKeyBenchMessage2Carry2",
"compactPublicKeyZeroKnowledgeBench",
];

View File

@@ -1,4 +1,4 @@
const secs = 1200; // 20 Minutes
const secs = 1_000_000; // 20 Minutes
const config = {
verbose: true,

View File

@@ -9,7 +9,7 @@
"build": "cp -r ../../tfhe/pkg ./ && webpack build ./index.js --mode production -o dist --output-filename index.js && cp index.html dist/ && cp favicon.ico dist/",
"server": "serve --config ../serve.json dist/",
"test-separate-processes": "jest --listTests | xargs -L 1 jest --runInBand --testNamePattern=Test",
"bench-separate-processes": "jest --listTests | xargs -L 1 jest --runInBand --testNamePattern=Bench",
"bench-separate-processes": "jest --listTests | xargs -L 1 jest --runInBand --testNamePattern=ZeroKnowledgeBench",
"test2": "mocha",
"format": "prettier . --write",
"check-format": "prettier . --check"

View File

@@ -50,7 +50,7 @@ async function runActualTest(page, buttonId) {
}
}
const TWENTY_MINUTES = 1200 * 1000;
const TWENTY_MINUTES = 1_000_000 * 1000;
async function runTestAttachedToButton(buttonId) {
let browser;
@@ -63,6 +63,7 @@ async function runTestAttachedToButton(buttonId) {
} else {
browser = await puppeteer.launch({
headless: "new",
args: ["--no-sandbox"],
protocolTimeout: TWENTY_MINUTES,
});
}

View File

@@ -1,33 +1,33 @@
import { runTestAttachedToButton } from "./common.mjs";
it("Compact Public Key Test Big 32 Bit", async () => {
await runTestAttachedToButton("compactPublicKeyTest32BitBig");
});
// it("Compact Public Key Test Big 32 Bit", async () => {
// await runTestAttachedToButton("compactPublicKeyTest32BitBig");
// });
it("Compact Public Key Test Small 32 Bit", async () => {
await runTestAttachedToButton("compactPublicKeyTest32BitSmall");
});
// it("Compact Public Key Test Small 32 Bit", async () => {
// await runTestAttachedToButton("compactPublicKeyTest32BitSmall");
// });
it("Compact Public Key Test Small 256 Bit", async () => {
await runTestAttachedToButton("compactPublicKeyTest256BitSmall");
});
// it("Compact Public Key Test Small 256 Bit", async () => {
// await runTestAttachedToButton("compactPublicKeyTest256BitSmall");
// });
it("Compact Public Key Test Big 256 Bit", async () => {
await runTestAttachedToButton("compactPublicKeyTest256BitBig");
});
// it("Compact Public Key Test Big 256 Bit", async () => {
// await runTestAttachedToButton("compactPublicKeyTest256BitBig");
// });
it("Compressed Compact Public Key Test Small 256 Bit", async () => {
await runTestAttachedToButton("compressedCompactPublicKeyTest256BitSmall");
});
// it("Compressed Compact Public Key Test Small 256 Bit", async () => {
// await runTestAttachedToButton("compressedCompactPublicKeyTest256BitSmall");
// });
it("Compressed Compact Public Key Test Big 256 Bit", async () => {
await runTestAttachedToButton("compressedCompactPublicKeyTest256BitBig");
});
// it("Compressed Compact Public Key Test Big 256 Bit", async () => {
// await runTestAttachedToButton("compressedCompactPublicKeyTest256BitBig");
// });
it(
"Compact Public Key Test Big 64 Bit With Zero Knowledge",
"Compact Public Key Bench Big 64 Bit With ZeroKnowledgeBench",
async () => {
await runTestAttachedToButton("compactPublicKeyZeroKnowledge");
await runTestAttachedToButton("compactPublicKeyZeroKnowledgeBench");
},
1200 * 1000,
1_000_000 * 1000,
); // 20 minutes timeout

View File

@@ -648,53 +648,95 @@ async function compressedServerKeyBenchMessage2Carry2() {
}
async function compactPublicKeyZeroKnowledgeBench() {
let block_params = new ShortintParameters(
ShortintParametersName.PARAM_MESSAGE_2_CARRY_2_COMPACT_PK_KS_PBS_TUNIFORM_2M40,
);
let params_to_bench = [
ShortintParametersName.PARAM_PKE_1_1_2048,
ShortintParametersName.PARAM_PKE_2_2_2048,
// ShortintParametersName.PARAM_PKE_3_3_2048,
// ShortintParametersName.PARAM_PKE_4_4_2048,
ShortintParametersName.PARAM_PKE_1_1_4096,
ShortintParametersName.PARAM_PKE_2_2_4096,
// ShortintParametersName.PARAM_PKE_3_3_4096,
// ShortintParametersName.PARAM_PKE_4_4_4096,
ShortintParametersName.PARAM_PKE_1_1_1024,
ShortintParametersName.PARAM_PKE_2_2_1024,
// ShortintParametersName.PARAM_PKE_3_3_1024,
// ShortintParametersName.PARAM_PKE_4_4_1024,
];
let config = TfheConfigBuilder.default()
.use_custom_parameters(block_params)
.build();
// let block_params = new ShortintParameters(
// ShortintParametersName.PARAM_MESSAGE_2_CARRY_2_COMPACT_PK_KS_PBS_TUNIFORM_2M40,
// );
let clientKey = TfheClientKey.generate(config);
let publicKey = TfheCompactPublicKey.new(clientKey);
console.log("Start CRS generation");
console.time("CRS generation");
let crs = CompactPkeCrs.from_config(config, 4 * 64);
console.timeEnd("CRS generation");
let public_params = crs.public_params();
const bench_loops = 4; // The computation is expensive
let bench_results = {};
let load_choices = [ZkComputeLoad.Proof, ZkComputeLoad.Verify];
const load_to_str = {
[ZkComputeLoad.Proof]: "compute_load_proof",
[ZkComputeLoad.Verify]: "compute_load_verify",
};
for (const loadChoice of load_choices) {
let timing = 0;
for (let i = 0; i < bench_loops; i++) {
let input = generateRandomBigInt(64);
const start = performance.now();
let _ = ProvenCompactFheUint64.encrypt_with_compact_public_key(
input,
public_params,
publicKey,
loadChoice,
);
const end = performance.now();
timing += end - start;
for (const block_params_name of params_to_bench) {
let block_params = new ShortintParameters(block_params_name);
let config = TfheConfigBuilder.default()
.use_custom_parameters(block_params)
.build();
let clientKey = TfheClientKey.generate(config);
let publicKey = TfheCompactPublicKey.new(clientKey);
const bench_loops = 5; // The computation is expensive
let load_choices = [ZkComputeLoad.Proof, ZkComputeLoad.Verify];
const load_to_str = {
[ZkComputeLoad.Proof]: "costly_proof",
[ZkComputeLoad.Verify]: "cheap_proof",
};
const param_to_name = {
[ShortintParametersName.PARAM_PKE_1_1_2048]: "PARAM_PKE_1_1_2048",
[ShortintParametersName.PARAM_PKE_2_2_2048]: "PARAM_PKE_2_2_2048",
[ShortintParametersName.PARAM_PKE_3_3_2048]: "PARAM_PKE_3_3_2048",
[ShortintParametersName.PARAM_PKE_4_4_2048]: "PARAM_PKE_4_4_2048",
[ShortintParametersName.PARAM_PKE_1_1_4096]: "PARAM_PKE_1_1_4096",
[ShortintParametersName.PARAM_PKE_2_2_4096]: "PARAM_PKE_2_2_4096",
[ShortintParametersName.PARAM_PKE_3_3_4096]: "PARAM_PKE_3_3_4096",
[ShortintParametersName.PARAM_PKE_4_4_4096]: "PARAM_PKE_4_4_4096",
[ShortintParametersName.PARAM_PKE_1_1_1024]: "PARAM_PKE_1_1_1024",
[ShortintParametersName.PARAM_PKE_2_2_1024]: "PARAM_PKE_2_2_1024",
[ShortintParametersName.PARAM_PKE_3_3_1024]: "PARAM_PKE_3_3_1024",
[ShortintParametersName.PARAM_PKE_4_4_1024]: "PARAM_PKE_4_4_1024",
};
let encrypt_counts = [5, 10];
for (const encrypt_count of encrypt_counts) {
console.log("Start CRS generation");
console.time("CRS generation");
let crs = CompactPkeCrs.from_config(config, encrypt_count * 64);
console.timeEnd("CRS generation");
let public_params = crs.public_params();
let inputs = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9].map((e) => BigInt(e));
let input = inputs.slice(0, encrypt_count);
for (const loadChoice of load_choices) {
let timing = 0;
for (let i = 0; i < bench_loops; i++) {
console.time("Loop " + i);
const start = performance.now();
let _ = ProvenCompactFheUint64List.encrypt_with_compact_public_key(
input,
public_params,
publicKey,
loadChoice,
);
const end = performance.now();
console.timeEnd("Loop " + i);
timing += end - start;
}
const mean = timing / bench_loops;
// pke_zk__PARAM_PKE_1_1_1024_10_cheap_proof
const bench_str =
"pke_zk__" +
param_to_name[block_params_name] +
"_" + encrypt_count + "_" + load_to_str[loadChoice];
console.log(bench_str, ": ", mean, " ms");
bench_results[bench_str] = mean;
}
}
const mean = timing / bench_loops;
const bench_str =
"compact_fhe_uint64_proven_encryption_" +
load_to_str[loadChoice] +
"_mean";
console.log(bench_str, ": ", mean, " ms");
bench_results["compact_fhe_uint64_proven_encryption_"] = mean;
}
return bench_results;