diff --git a/rust/logos-blockchain-circuits-poq-sys/src/ffi.rs b/rust/logos-blockchain-circuits-poq-sys/src/ffi.rs index e69de29..c414882 100644 --- a/rust/logos-blockchain-circuits-poq-sys/src/ffi.rs +++ b/rust/logos-blockchain-circuits-poq-sys/src/ffi.rs @@ -0,0 +1,12 @@ +use std::ffi::c_char; +use lbc_types::ffi::{Bytes, Status, WitnessInput}; + +unsafe extern "C" { + pub fn poq_generate_witness(input: *const WitnessInput, output: *mut Bytes) -> Status; + + pub fn poq_generate_witness_from_files( + dat: *const c_char, + inputs: *const c_char, + output: *const c_char, + ) -> Status; +} diff --git a/rust/logos-blockchain-circuits-poq-sys/src/lib.rs b/rust/logos-blockchain-circuits-poq-sys/src/lib.rs index 28f2da1..458eaf4 100644 --- a/rust/logos-blockchain-circuits-poq-sys/src/lib.rs +++ b/rust/logos-blockchain-circuits-poq-sys/src/lib.rs @@ -1 +1,4 @@ -pub mod ffi; \ No newline at end of file +mod ffi; +pub mod native; + +pub use native::{generate_witness, generate_witness_from_files}; diff --git a/rust/logos-blockchain-circuits-poq-sys/src/native.rs b/rust/logos-blockchain-circuits-poq-sys/src/native.rs new file mode 100644 index 0000000..ce49465 --- /dev/null +++ b/rust/logos-blockchain-circuits-poq-sys/src/native.rs @@ -0,0 +1,43 @@ +use std::ffi::c_char; +use std::path::Path; +use lbc_types::{ffi, native::{Bytes, Error, WitnessInput}}; +use crate::ffi::{poq_generate_witness, poq_generate_witness_from_files}; + +pub fn generate_witness( + input: WitnessInput, +) -> Result { + let ffi_input_guard = input.as_ffi(); + let ffi_input = ffi_input_guard.as_ref(); + + let mut ffi_output_bytes = ffi::Bytes { + data: std::ptr::null_mut(), + size: 0 + }; + + let status = unsafe { + poq_generate_witness( + ffi_input as *const ffi::WitnessInput, + &mut ffi_output_bytes as *mut ffi::Bytes + ) + }; + + status.try_into().map(|()| { Bytes::from(ffi_output_bytes) }) +} + +pub fn generate_witness_from_files( + dat: &Path, + inputs: &Path, + output: &Path, +) -> Result<(), Error> { + let dat = dat.to_str().ok_or_else(|| Error::InvalidInput)?; // TODO: Message + let inputs = inputs.to_str().ok_or_else(|| Error::InvalidInput)?; + let output = output.to_str().ok_or_else(|| Error::InvalidInput)?; + + unsafe { + poq_generate_witness_from_files ( + dat.as_ptr() as *const c_char, + inputs.as_ptr() as *const c_char, + output.as_ptr() as *const c_char + ) + }.try_into() +}