Implement ffi and native PoQ functions.

This commit is contained in:
Alejandro Cabeza Romero 2026-04-27 16:56:36 +02:00
parent de11d81252
commit 67b35faf4f
No known key found for this signature in database
GPG Key ID: DA3D14AE478030FD
3 changed files with 59 additions and 1 deletions

View File

@ -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;
}

View File

@ -1 +1,4 @@
pub mod ffi;
mod ffi;
pub mod native;
pub use native::{generate_witness, generate_witness_from_files};

View File

@ -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<Bytes, Error> {
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()
}