Skip to content
This repository has been archived by the owner on Oct 31, 2023. It is now read-only.

Commit

Permalink
feat!: return boolean rather than FieldElement from `verify_signatu…
Browse files Browse the repository at this point in the history
…re` (#123)

feat: return boolean from `verify_signature`
  • Loading branch information
TomAFrench committed Apr 18, 2023
1 parent a775af1 commit e560602
Show file tree
Hide file tree
Showing 5 changed files with 39 additions and 62 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -15,12 +15,7 @@ impl BarretenbergShared for Barretenberg {
Barretenberg::new()
}

fn verify_signature(
&mut self,
pub_key: [u8; 64],
sig: [u8; 64],
message: &[u8],
) -> FieldElement {
fn verify_signature(&mut self, pub_key: [u8; 64], sig: [u8; 64], message: &[u8]) -> bool {
self.verify_signature(pub_key, sig, message)
}

Expand Down
36 changes: 13 additions & 23 deletions barretenberg_static_lib/src/schnorr.rs
Original file line number Diff line number Diff line change
@@ -1,4 +1,3 @@
use common::acvm::FieldElement;
use std::convert::TryInto;

use super::Barretenberg;
Expand All @@ -14,22 +13,13 @@ impl Barretenberg {
barretenberg_sys::schnorr::construct_public_key(&private_key)
}

pub fn verify_signature(
&mut self,
pub_key: [u8; 64],
sig: [u8; 64],
message: &[u8],
) -> FieldElement {
let r: bool = barretenberg_sys::schnorr::verify_signature(
pub fn verify_signature(&mut self, pub_key: [u8; 64], sig: [u8; 64], message: &[u8]) -> bool {
barretenberg_sys::schnorr::verify_signature(
pub_key,
sig[0..32].try_into().unwrap(),
sig[32..64].try_into().unwrap(),
message,
);
match r {
false => FieldElement::zero(),
true => FieldElement::one(),
}
)

// Note, currently for Barretenberg plonk, if the signature fails
// then the whole circuit fails.
Expand All @@ -46,26 +36,26 @@ fn basic_interop() {

let public_key = barretenberg.construct_public_key(private_key);
let signature = barretenberg.construct_signature(&message, private_key);
let result = barretenberg.verify_signature(public_key, signature, &message);
assert_eq!(result, FieldElement::one());
let valid_signature = barretenberg.verify_signature(public_key, signature, &message);
assert!(valid_signature);

// Should fail, since the messages are different
let private_key = [2; 32];
let message = vec![0, 1, 2, 3, 4, 5, 6, 7, 8, 9];

let public_key = barretenberg.construct_public_key(private_key);
let signature = barretenberg.construct_signature(&message, private_key);
let result = barretenberg.verify_signature(public_key, signature, &[0, 2]);
assert_eq!(result, FieldElement::zero());
let valid_signature = barretenberg.verify_signature(public_key, signature, &[0, 2]);
assert!(!valid_signature);

// Should fail, since the signature is not valid
let private_key = [2; 32];
let message = vec![0, 1, 2, 3, 4, 5, 6, 7, 8, 9];
let signature = [1; 64];

let public_key = barretenberg.construct_public_key(private_key);
let result = barretenberg.verify_signature(public_key, signature, &message);
assert_eq!(result, FieldElement::zero());
let valid_signature = barretenberg.verify_signature(public_key, signature, &message);
assert!(!valid_signature);

// Should fail, since the public key does not match
let private_key_a = [1; 32];
Expand All @@ -74,15 +64,15 @@ fn basic_interop() {

let public_key_b = barretenberg.construct_public_key(private_key_b);
let signature_a = barretenberg.construct_signature(&message, private_key_a);
let result = barretenberg.verify_signature(public_key_b, signature_a, &message);
assert_eq!(result, FieldElement::zero());
let valid_signature = barretenberg.verify_signature(public_key_b, signature_a, &message);
assert!(!valid_signature);

// Test the first case again, to check if memory is being freed and overwritten properly
let private_key = [2; 32];
let message = vec![0, 1, 2, 3, 4, 5, 6, 7, 8, 9];

let public_key = barretenberg.construct_public_key(private_key);
let signature = barretenberg.construct_signature(&message, private_key);
let result = barretenberg.verify_signature(public_key, signature, &message);
assert_eq!(result, FieldElement::one());
let valid_signature = barretenberg.verify_signature(public_key, signature, &message);
assert!(valid_signature);
}
Original file line number Diff line number Diff line change
Expand Up @@ -15,12 +15,7 @@ impl BarretenbergShared for Barretenberg {
Barretenberg::new()
}

fn verify_signature(
&mut self,
pub_key: [u8; 64],
sig: [u8; 64],
message: &[u8],
) -> FieldElement {
fn verify_signature(&mut self, pub_key: [u8; 64], sig: [u8; 64], message: &[u8]) -> bool {
self.verify_signature(pub_key, sig, message)
}

Expand Down
34 changes: 15 additions & 19 deletions barretenberg_wasm/src/schnorr.rs
Original file line number Diff line number Diff line change
@@ -1,4 +1,3 @@
use common::acvm::FieldElement;
use std::convert::TryInto;
use wasmer::Value;

Expand All @@ -22,19 +21,16 @@ impl Barretenberg {
let sig_bytes = self.slice_memory(0, 64);
sig_bytes.try_into().unwrap()
}

pub fn construct_public_key(&mut self, private_key: [u8; 32]) -> [u8; 64] {
self.transfer_to_heap(&private_key, 0);

self.call_multiple("compute_public_key", vec![&Value::I32(0), &Value::I32(32)]);

self.slice_memory(32, 96).try_into().unwrap()
}
pub fn verify_signature(
&mut self,
pub_key: [u8; 64],
sig: [u8; 64],
message: &[u8],
) -> FieldElement {

pub fn verify_signature(&mut self, pub_key: [u8; 64], sig: [u8; 64], message: &[u8]) -> bool {
self.transfer_to_heap(&pub_key, 0);
self.transfer_to_heap(&sig[0..32], 64);
self.transfer_to_heap(&sig[32..64], 96);
Expand All @@ -51,8 +47,8 @@ impl Barretenberg {
],
);
match wasm_value.into_i32() {
0 => FieldElement::zero(),
1 => FieldElement::one(),
0 => false,
1 => true,
_=> unreachable!("verify signature should return a boolean to indicate whether the signature + parameters were valid")
}

Expand All @@ -71,26 +67,26 @@ fn basic_interop() {

let public_key = barretenberg.construct_public_key(private_key);
let signature = barretenberg.construct_signature(&message, private_key);
let result = barretenberg.verify_signature(public_key, signature, &message);
assert_eq!(result, FieldElement::one());
let valid_signature = barretenberg.verify_signature(public_key, signature, &message);
assert!(valid_signature);

// Should fail, since the messages are different
let private_key = [2; 32];
let message = vec![0, 1, 2, 3, 4, 5, 6, 7, 8, 9];

let public_key = barretenberg.construct_public_key(private_key);
let signature = barretenberg.construct_signature(&message, private_key);
let result = barretenberg.verify_signature(public_key, signature, &[0, 2]);
assert_eq!(result, FieldElement::zero());
let valid_signature = barretenberg.verify_signature(public_key, signature, &[0, 2]);
assert!(!valid_signature);

// Should fail, since the signature is not valid
let private_key = [2; 32];
let message = vec![0, 1, 2, 3, 4, 5, 6, 7, 8, 9];
let signature = [1; 64];

let public_key = barretenberg.construct_public_key(private_key);
let result = barretenberg.verify_signature(public_key, signature, &message);
assert_eq!(result, FieldElement::zero());
let valid_signature = barretenberg.verify_signature(public_key, signature, &message);
assert!(!valid_signature);

// Should fail, since the public key does not match
let private_key_a = [1; 32];
Expand All @@ -99,15 +95,15 @@ fn basic_interop() {

let public_key_b = barretenberg.construct_public_key(private_key_b);
let signature_a = barretenberg.construct_signature(&message, private_key_a);
let result = barretenberg.verify_signature(public_key_b, signature_a, &message);
assert_eq!(result, FieldElement::zero());
let valid_signature = barretenberg.verify_signature(public_key_b, signature_a, &message);
assert!(!valid_signature);

// Test the first case again, to check if memory is being freed and overwritten properly
let private_key = [2; 32];
let message = vec![0, 1, 2, 3, 4, 5, 6, 7, 8, 9];

let public_key = barretenberg.construct_public_key(private_key);
let signature = barretenberg.construct_signature(&message, private_key);
let result = barretenberg.verify_signature(public_key, signature, &message);
assert_eq!(result, FieldElement::one());
let valid_signature = barretenberg.verify_signature(public_key, signature, &message);
assert!(valid_signature);
}
17 changes: 9 additions & 8 deletions common/src/black_box_functions.rs
Original file line number Diff line number Diff line change
Expand Up @@ -14,12 +14,7 @@ use crate::merkle::PathHasher;
// that the PWG needs from Barretenberg
pub trait BarretenbergShared: PathHasher {
fn new() -> Self;
fn verify_signature(
&mut self,
pub_key: [u8; 64],
sig: [u8; 64],
message: &[u8],
) -> FieldElement;
fn verify_signature(&mut self, pub_key: [u8; 64], sig: [u8; 64], message: &[u8]) -> bool;
fn fixed_base(&mut self, input: &FieldElement) -> (FieldElement, FieldElement);
fn encrypt(&mut self, inputs: Vec<FieldElement>) -> (FieldElement, FieldElement);
}
Expand Down Expand Up @@ -100,11 +95,17 @@ pub fn solve_black_box_func_call<B: BarretenbergShared>(

let mut barretenberg = <B as BarretenbergShared>::new();

let result = barretenberg.verify_signature(pub_key, signature, &message);
if result != FieldElement::one() {
let valid_signature = barretenberg.verify_signature(pub_key, signature, &message);
if !valid_signature {
dbg!("signature has failed to verify");
}

let result = if valid_signature {
FieldElement::one()
} else {
FieldElement::zero()
};

initial_witness.insert(gadget_call.outputs[0], result);
}
BlackBoxFunc::Pedersen => {
Expand Down

0 comments on commit e560602

Please sign in to comment.