From 68baa0224532d2659da3f52d9765e963db3278b6 Mon Sep 17 00:00:00 2001 From: Tom French Date: Thu, 10 Aug 2023 19:29:19 +0100 Subject: [PATCH] feat: expose black box solver functions in acvm_js --- acvm_js/src/black_box_solvers.rs | 82 ++++++++++++++++++++++++++++++++ acvm_js/src/lib.rs | 2 + 2 files changed, 84 insertions(+) create mode 100644 acvm_js/src/black_box_solvers.rs diff --git a/acvm_js/src/black_box_solvers.rs b/acvm_js/src/black_box_solvers.rs new file mode 100644 index 000000000..debcd5a25 --- /dev/null +++ b/acvm_js/src/black_box_solvers.rs @@ -0,0 +1,82 @@ +use js_sys::JsString; +use wasm_bindgen::prelude::*; + +use crate::js_witness_map::{field_element_to_js_string, js_value_to_field_element}; +use acvm::FieldElement; + +#[wasm_bindgen] +pub fn and(lhs: JsString, rhs: JsString) -> JsString { + let lhs = js_value_to_field_element(lhs.into()).unwrap(); + let rhs = js_value_to_field_element(rhs.into()).unwrap(); + let result = lhs.and(&rhs, FieldElement::max_num_bits()); + field_element_to_js_string(&result) +} + +#[wasm_bindgen] +pub fn xor(lhs: JsString, rhs: JsString) -> JsString { + let lhs = js_value_to_field_element(lhs.into()).unwrap(); + let rhs = js_value_to_field_element(rhs.into()).unwrap(); + let result = lhs.xor(&rhs, FieldElement::max_num_bits()); + field_element_to_js_string(&result) +} +#[wasm_bindgen] +pub fn sha256(inputs: &[u8]) -> Vec { + acvm::blackbox_solver::sha256(inputs).unwrap().into() +} + +#[wasm_bindgen] +pub fn blake2s256(inputs: &[u8]) -> Vec { + acvm::blackbox_solver::blake2s(inputs).unwrap().into() +} + +#[wasm_bindgen] +pub fn keccak256(inputs: &[u8]) -> Vec { + acvm::blackbox_solver::keccak256(inputs).unwrap().into() +} + +#[wasm_bindgen] +pub fn hash_to_field_128_security(inputs: &[u8]) -> JsString { + field_element_to_js_string(&acvm::blackbox_solver::hash_to_field_128_security(inputs).unwrap()) +} + +#[wasm_bindgen] +pub fn ecdsa_secp256k1_verify( + hashed_msg: &[u8], + public_key_x_bytes: &[u8], + public_key_y_bytes: &[u8], + signature: &[u8], +) -> bool { + let public_key_x_bytes: &[u8; 32] = public_key_x_bytes.try_into().unwrap(); + let public_key_y_bytes: &[u8; 32] = public_key_y_bytes.try_into().unwrap(); + let signature: &[u8; 64] = signature.try_into().unwrap(); + + acvm::blackbox_solver::ecdsa_secp256k1_verify( + hashed_msg, + public_key_x_bytes, + public_key_y_bytes, + signature, + ) + .unwrap() + .into() +} + +#[wasm_bindgen] +pub fn ecdsa_secp256r1_verify( + hashed_msg: &[u8], + public_key_x_bytes: &[u8], + public_key_y_bytes: &[u8], + signature: &[u8], +) -> bool { + let public_key_x_bytes: &[u8; 32] = public_key_x_bytes.try_into().unwrap(); + let public_key_y_bytes: &[u8; 32] = public_key_y_bytes.try_into().unwrap(); + let signature: &[u8; 64] = signature.try_into().unwrap(); + + acvm::blackbox_solver::ecdsa_secp256r1_verify( + hashed_msg, + public_key_x_bytes, + public_key_y_bytes, + signature, + ) + .unwrap() + .into() +} diff --git a/acvm_js/src/lib.rs b/acvm_js/src/lib.rs index 359ab771c..4771c11d7 100644 --- a/acvm_js/src/lib.rs +++ b/acvm_js/src/lib.rs @@ -8,6 +8,7 @@ cfg_if::cfg_if! { if #[cfg(target_arch = "wasm32")] { mod barretenberg; + mod black_box_solvers; mod build_info; mod compression; mod execute; @@ -17,6 +18,7 @@ cfg_if::cfg_if! { mod public_witness; pub use build_info::build_info; + pub use black_box_solvers::{and, xor, blake2s256, sha256, keccak256, hash_to_field_128_security, ecdsa_secp256k1_verify, ecdsa_secp256r1_verify}; pub use compression::{compress_witness, decompress_witness}; pub use execute::execute_circuit; pub use js_witness_map::JsWitnessMap;