server.rs 1.8 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273
  1. use std::os::raw::c_uchar;
  2. use std::sync::mpsc::*;
  3. use std::thread::*;
  4. use spiral_rs::client::PublicParameters;
  5. use spiral_rs::params::Params;
  6. use crate::params;
  7. enum Command {
  8. PubParams(Vec<u8>),
  9. PreProcMsg(Vec<u8>),
  10. }
  11. enum Response {
  12. PreProcResp(Vec<u8>),
  13. }
  14. pub struct Server {
  15. r: usize,
  16. thread_handle: JoinHandle<()>,
  17. incoming_cmd: SyncSender<Command>,
  18. outgoing_resp: Receiver<Response>,
  19. }
  20. impl Server {
  21. pub fn new(r: usize, pub_params: Vec<u8>) -> Self {
  22. let (incoming_cmd, incoming_cmd_recv) = sync_channel(0);
  23. let (outgoing_resp_send, outgoing_resp) = sync_channel(0);
  24. let thread_handle = spawn(move || {
  25. let spiral_params = params::get_spiral_params(r);
  26. let pub_params = PublicParameters::deserialize(&spiral_params, &pub_params);
  27. loop {
  28. match incoming_cmd_recv.recv() {
  29. Err(_) => break,
  30. _ => panic!("Received something unexpected"),
  31. }
  32. }
  33. });
  34. Server {
  35. r,
  36. thread_handle,
  37. incoming_cmd,
  38. outgoing_resp,
  39. }
  40. }
  41. }
  42. #[no_mangle]
  43. pub extern "C" fn spir_server_new(
  44. r: u8,
  45. pub_params: *const c_uchar,
  46. pub_params_len: usize,
  47. ) -> *mut Server {
  48. let pub_params_slice = unsafe {
  49. assert!(!pub_params.is_null());
  50. std::slice::from_raw_parts(pub_params, pub_params_len)
  51. };
  52. let mut pub_params_vec: Vec<u8> = Vec::new();
  53. pub_params_vec.extend_from_slice(pub_params_slice);
  54. let server = Server::new(r as usize, pub_params_vec);
  55. Box::into_raw(Box::new(server))
  56. }
  57. #[no_mangle]
  58. pub extern "C" fn spir_server_free(server: *mut Server) {
  59. if server.is_null() {
  60. return;
  61. }
  62. unsafe {
  63. Box::from_raw(server);
  64. }
  65. }