e2e.rs 2.5 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980
  1. use rand::thread_rng;
  2. use rand::Rng;
  3. use spiral_rs::arith::*;
  4. use spiral_rs::client::*;
  5. use spiral_rs::params::*;
  6. use spiral_rs::server::*;
  7. use spiral_rs::util::*;
  8. use std::env;
  9. use std::fs;
  10. use std::time::Instant;
  11. fn print_params_summary(params: &Params) {
  12. let db_elem_size = params.item_size();
  13. let total_size = params.num_items() * db_elem_size;
  14. println!(
  15. "Using a {} x {} byte database ({} bytes total)",
  16. params.num_items(),
  17. db_elem_size,
  18. total_size
  19. );
  20. }
  21. fn main() {
  22. let params;
  23. let args: Vec<String> = env::args().collect();
  24. if args.len() == 2 {
  25. let inp_params_fname = &args[1];
  26. let params_json_str = fs::read_to_string(inp_params_fname).unwrap();
  27. params = params_from_json(&params_json_str);
  28. } else {
  29. let target_num_log2: usize = args[1].parse().unwrap();
  30. let item_size_bytes: usize = args[2].parse().unwrap();
  31. params = get_params_from_store(target_num_log2, item_size_bytes);
  32. }
  33. print_params_summary(&params);
  34. let mut rng = thread_rng();
  35. let idx_target: usize = rng.gen::<usize>() % params.num_items();
  36. println!(
  37. "fetching index {} out of {} items",
  38. idx_target,
  39. params.num_items()
  40. );
  41. println!("initializing client");
  42. let mut client = Client::init(&params, &mut rng);
  43. println!("generating public parameters");
  44. let pub_params = client.generate_keys();
  45. let pub_params_buf = pub_params.serialize();
  46. println!("public parameters size: {} bytes", pub_params_buf.len());
  47. let query = client.generate_query(idx_target);
  48. let query_buf = query.serialize();
  49. println!("initial query size: {} bytes", query_buf.len());
  50. println!("generating db");
  51. let (corr_item, db) = generate_random_db_and_get_item(&params, idx_target);
  52. println!("processing query");
  53. let now = Instant::now();
  54. let response = process_query(&params, &pub_params, &query, db.as_slice());
  55. println!("done processing (took {} us).", now.elapsed().as_micros());
  56. println!("response size: {} bytes", response.len());
  57. println!("decoding response");
  58. let result = client.decode_response(response.as_slice());
  59. let p_bits = log2_ceil(params.pt_modulus) as usize;
  60. let corr_result = corr_item.to_vec(p_bits, params.modp_words_per_chunk());
  61. assert_eq!(result.len(), corr_result.len());
  62. for z in 0..corr_result.len() {
  63. assert_eq!(result[z], corr_result[z], "error in response at {:?}", z);
  64. }
  65. println!("completed correctly!");
  66. }