parasol_cpu/
runner.rs

1use std::sync::Arc;
2
3use parasol_runtime::{ComputeKey, Encryption, Evaluation};
4
5use crate::{CallData, Error, FheComputer, Memory, ToArg, error::Result};
6
7/// Runs a program by generating a new [`crate::FheComputer`]. This function is meant
8/// for simple testing of a program; for full applications see the
9/// [`crate::FheComputer`] struct.
10pub fn run_program<T: ToArg>(
11    compute_key: ComputeKey,
12    elf_file: &[u8],
13    program_name: &str,
14    arguments: CallData<T>,
15) -> Result<T> {
16    let memory = Arc::new(Memory::new_from_elf(elf_file)?);
17    let enc = Encryption::default();
18    let eval = Evaluation::with_default_params(Arc::new(compute_key));
19
20    let mut proc = FheComputer::new(&enc, &eval);
21
22    let prog = memory
23        .get_function_entry(program_name)
24        .ok_or(Error::ElfSymbolNotFound(program_name.to_string()))?;
25
26    proc.run_program(prog, &memory, arguments)
27}
28
29#[cfg(test)]
30mod tests {
31    use std::borrow::Borrow;
32
33    use crate::ArgsBuilder;
34
35    use super::*;
36    use parasol_runtime::{
37        Encryption,
38        fluent::UInt8,
39        test_utils::{get_compute_key_128, get_secret_keys_128},
40    };
41
42    const CMUX_ELF: &[u8] = include_bytes!("../tests/test_data/cmux");
43
44    // TODO: We need to update our compiler's calling convention to fix E2E tests.
45    #[ignore]
46    #[test]
47    fn test_run_program() {
48        let compute_key = get_compute_key_128();
49        let compute_key: &ComputeKey = compute_key.borrow();
50
51        let enc = Encryption::default();
52        let sk = get_secret_keys_128();
53
54        let arguments = ArgsBuilder::new()
55            .arg(UInt8::encrypt_secret(42, &enc, &sk))
56            .arg(UInt8::encrypt_secret(54, &enc, &sk))
57            .arg(UInt8::encrypt_secret(11, &enc, &sk))
58            .return_value::<UInt8>();
59
60        let result = run_program(compute_key.clone(), CMUX_ELF, "cmux", arguments).unwrap();
61
62        assert_eq!(result.decrypt(&enc, &sk), 54);
63    }
64}