diff --git a/test.sh b/test.sh index ceb08918..daa96f90 100755 --- a/test.sh +++ b/test.sh @@ -5,7 +5,7 @@ set -e if [ -n "$WITH_LIBSNARK" ]; then # run specifically the libsnark tests inside zokrates_core - cargo test --release --package zokrates_core --features="libsnark" libsnark + cargo test --release --package zokrates_core --features="libsnark" libsnark -- --test-threads=1 fi # run all tests without libsnark on diff --git a/zokrates_core/lib/ffi.cpp b/zokrates_core/lib/ffi.cpp index 3ea355bb..a4e0f72a 100644 --- a/zokrates_core/lib/ffi.cpp +++ b/zokrates_core/lib/ffi.cpp @@ -1,6 +1,6 @@ #include "ffi.hpp" -void __free(uint8_t* ptr) +void c_free(uint8_t* ptr) { free(ptr); } \ No newline at end of file diff --git a/zokrates_core/lib/ffi.hpp b/zokrates_core/lib/ffi.hpp index 068f94b5..b1c32ea6 100644 --- a/zokrates_core/lib/ffi.hpp +++ b/zokrates_core/lib/ffi.hpp @@ -30,7 +30,7 @@ struct proof_result_t { } }; -void __free(uint8_t* ptr); +void c_free(uint8_t* ptr); #ifdef __cplusplus } // extern "C" diff --git a/zokrates_core/src/proof_system/libsnark/ffi.rs b/zokrates_core/src/proof_system/libsnark/ffi.rs index 7a13d6bb..0cc03f94 100644 --- a/zokrates_core/src/proof_system/libsnark/ffi.rs +++ b/zokrates_core/src/proof_system/libsnark/ffi.rs @@ -1,6 +1,6 @@ #[repr(C)] pub struct Buffer { - pub data: *mut u8, + pub data: *const u8, pub length: i32, } @@ -16,33 +16,17 @@ pub struct ProofResult { } extern "C" { - fn __free(ptr: *mut u8); + pub fn c_free(ptr: *const u8); } impl Buffer { pub fn from_vec(v: &Vec) -> Buffer { - let mut buf = vec![0; v.len()].into_boxed_slice(); - buf.copy_from_slice(v.as_slice()); - - let data = buf.as_mut_ptr(); - let len = buf.len(); - - std::mem::forget(buf); + let data = v.as_ptr(); + let len = v.len(); Buffer { data, length: len as i32, } } - - pub unsafe fn drop(&self) { - let s = std::slice::from_raw_parts_mut(self.data, self.length as usize); - let s = s.as_mut_ptr(); - Box::from_raw(s); - } - - /// The purpose of this function is to free memory allocated by C. Do not use otherwise. - pub fn free(self) { - unsafe { __free(self.data) }; - } } diff --git a/zokrates_core/src/proof_system/libsnark/gm17.rs b/zokrates_core/src/proof_system/libsnark/gm17.rs index f3743a73..1c1b4ab4 100644 --- a/zokrates_core/src/proof_system/libsnark/gm17.rs +++ b/zokrates_core/src/proof_system/libsnark/gm17.rs @@ -1,6 +1,6 @@ use crate::ir::{Prog, Witness}; use crate::proof_system::gm17::{ProofPoints, VerificationKey, GM17}; -use crate::proof_system::libsnark::ffi::{Buffer, ProofResult, SetupResult}; +use crate::proof_system::libsnark::ffi::{c_free, Buffer, ProofResult, SetupResult}; use crate::proof_system::libsnark::{ prepare_generate_proof, prepare_public_inputs, prepare_setup, serialization::*, Libsnark, }; @@ -64,8 +64,8 @@ impl Backend for Libsnark { std::slice::from_raw_parts(result.pk.data, result.pk.length as usize).to_vec(); // free c allocated buffers - result.vk.free(); - result.pk.free(); + c_free(result.vk.data); + c_free(result.pk.data); (vk, pk) }; @@ -104,9 +104,9 @@ impl Backend for Libsnark { let (public_inputs_arr, public_inputs_length, private_inputs_arr, private_inputs_length) = prepare_generate_proof(program.clone(), witness.clone()); - let proof = unsafe { - let mut pk_buffer = Buffer::from_vec(&proving_key); + let mut pk_buffer = Buffer::from_vec(&proving_key); + let proof = unsafe { let result = gm17_bn128_generate_proof( &mut pk_buffer as *mut _, public_inputs_arr[0].as_ptr(), @@ -115,14 +115,11 @@ impl Backend for Libsnark { private_inputs_length as i32, ); - pk_buffer.drop(); // drop the buffer manually - - let proof: Vec = - std::slice::from_raw_parts(result.proof.data, result.proof.length as usize) - .to_vec(); + let proof = std::slice::from_raw_parts(result.proof.data, result.proof.length as usize) + .to_vec(); // free c allocated buffer - result.proof.free(); + c_free(result.proof.data); proof }; @@ -175,21 +172,16 @@ impl Backend for Libsnark { let (public_inputs_arr, public_inputs_length) = prepare_public_inputs(public_inputs); - unsafe { - let mut vk_buffer = Buffer::from_vec(vk_writer.get_ref()); - let mut proof_buffer = Buffer::from_vec(proof_writer.get_ref()); + let mut vk_buffer = Buffer::from_vec(vk_writer.get_ref()); + let mut proof_buffer = Buffer::from_vec(proof_writer.get_ref()); - let ans = gm17_bn128_verify( + unsafe { + gm17_bn128_verify( &mut vk_buffer as *mut _, &mut proof_buffer as *mut _, public_inputs_arr[0].as_ptr(), public_inputs_length as i32, - ); - - vk_buffer.drop(); - proof_buffer.drop(); - - ans + ) } } } diff --git a/zokrates_core/src/proof_system/libsnark/pghr13.rs b/zokrates_core/src/proof_system/libsnark/pghr13.rs index 1c4bb3b7..df5ff231 100644 --- a/zokrates_core/src/proof_system/libsnark/pghr13.rs +++ b/zokrates_core/src/proof_system/libsnark/pghr13.rs @@ -1,4 +1,4 @@ -use crate::proof_system::libsnark::ffi::{Buffer, ProofResult, SetupResult}; +use crate::proof_system::libsnark::ffi::{c_free, Buffer, ProofResult, SetupResult}; use crate::proof_system::libsnark::{ prepare_generate_proof, prepare_public_inputs, prepare_setup, Libsnark, }; @@ -67,8 +67,8 @@ impl Backend for Libsnark { std::slice::from_raw_parts(result.pk.data, result.pk.length as usize).to_vec(); // free c allocated buffers - result.vk.free(); - result.pk.free(); + c_free(result.vk.data); + c_free(result.pk.data); (vk, pk) }; @@ -111,9 +111,9 @@ impl Backend for Libsnark { let (public_inputs_arr, public_inputs_length, private_inputs_arr, private_inputs_length) = prepare_generate_proof(program.clone(), witness.clone()); - let proof = unsafe { - let mut pk_buffer = Buffer::from_vec(&proving_key); + let mut pk_buffer = Buffer::from_vec(&proving_key); + let proof = unsafe { let result = pghr13_bn128_generate_proof( &mut pk_buffer as *mut _, public_inputs_arr[0].as_ptr(), @@ -122,14 +122,11 @@ impl Backend for Libsnark { private_inputs_length as i32, ); - pk_buffer.drop(); // drop the buffer manually - - let proof: Vec = - std::slice::from_raw_parts(result.proof.data, result.proof.length as usize) - .to_vec(); + let proof = std::slice::from_raw_parts(result.proof.data, result.proof.length as usize) + .to_vec(); // free c allocated buffer - result.proof.free(); + c_free(result.proof.data); proof }; @@ -205,21 +202,16 @@ impl Backend for Libsnark { let (public_inputs_arr, public_inputs_length) = prepare_public_inputs(public_inputs); - unsafe { - let mut vk_buffer = Buffer::from_vec(vk_writer.get_ref()); - let mut proof_buffer = Buffer::from_vec(proof_writer.get_ref()); + let mut vk_buffer = Buffer::from_vec(vk_writer.get_ref()); + let mut proof_buffer = Buffer::from_vec(proof_writer.get_ref()); - let ans = pghr13_bn128_verify( + unsafe { + pghr13_bn128_verify( &mut vk_buffer as *mut _, &mut proof_buffer as *mut _, public_inputs_arr[0].as_ptr(), public_inputs_length as i32, - ); - - vk_buffer.drop(); - proof_buffer.drop(); - - ans + ) } } }