1use std::sync::Arc;
2
3use parasol_runtime::{ComputeKey, Encryption, Evaluation};
4
5use crate::{CallData, Error, FheComputer, Memory, ToArg, error::Result};
6
7pub 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 #[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}