From c9c79e1c20cbc910f35ba06d070e31978ccbe019 Mon Sep 17 00:00:00 2001 From: Tom French Date: Sat, 30 Nov 2024 20:30:15 +0000 Subject: [PATCH 1/4] feat: switch to using an external noir implementation of Schnorr --- .../contracts/schnorr_account_contract/Nargo.toml | 1 + .../contracts/schnorr_account_contract/src/main.nr | 12 +++++++----- .../schnorr_hardcoded_account_contract/Nargo.toml | 1 + .../schnorr_hardcoded_account_contract/src/main.nr | 9 ++++++--- .../schnorr_single_key_account_contract/Nargo.toml | 1 + .../schnorr_single_key_account_contract/src/util.nr | 12 +++++++----- 6 files changed, 23 insertions(+), 13 deletions(-) diff --git a/noir-projects/noir-contracts/contracts/schnorr_account_contract/Nargo.toml b/noir-projects/noir-contracts/contracts/schnorr_account_contract/Nargo.toml index 12cf4db0fe8a..c3f56a36c642 100644 --- a/noir-projects/noir-contracts/contracts/schnorr_account_contract/Nargo.toml +++ b/noir-projects/noir-contracts/contracts/schnorr_account_contract/Nargo.toml @@ -7,3 +7,4 @@ type = "contract" [dependencies] aztec = { path = "../../../aztec-nr/aztec" } authwit = { path = "../../../aztec-nr/authwit" } +schnorr = { tag = "v0.1.0", git = "https://github.com/noir-lang/schnorr" } diff --git a/noir-projects/noir-contracts/contracts/schnorr_account_contract/src/main.nr b/noir-projects/noir-contracts/contracts/schnorr_account_contract/src/main.nr index 84379b702a15..7c16d702b2ae 100644 --- a/noir-projects/noir-contracts/contracts/schnorr_account_contract/src/main.nr +++ b/noir-projects/noir-contracts/contracts/schnorr_account_contract/src/main.nr @@ -6,8 +6,6 @@ use dep::aztec::macros::aztec; #[aztec] contract SchnorrAccount { - use dep::std; - use dep::authwit::{ account::AccountActions, auth::{compute_authwit_message_hash, compute_authwit_nullifier}, @@ -24,6 +22,7 @@ contract SchnorrAccount { use dep::aztec::prelude::{AztecAddress, PrivateContext, PrivateImmutable}; use crate::public_key_note::PublicKeyNote; + use std::embedded_curve_ops::EmbeddedCurvePoint; #[storage] struct Storage { @@ -78,9 +77,12 @@ contract SchnorrAccount { } // Verify signature of the payload bytes - std::schnorr::verify_signature( - public_key.x, - public_key.y, + schnorr::verify_signature( + std::embedded_curve_ops::EmbeddedCurvePoint { + x: public_key.x, + y: public_key.y, + is_infinite: false, + }, signature, outer_hash.to_be_bytes::<32>(), ) diff --git a/noir-projects/noir-contracts/contracts/schnorr_hardcoded_account_contract/Nargo.toml b/noir-projects/noir-contracts/contracts/schnorr_hardcoded_account_contract/Nargo.toml index 877f369a8005..d31c206d4852 100644 --- a/noir-projects/noir-contracts/contracts/schnorr_hardcoded_account_contract/Nargo.toml +++ b/noir-projects/noir-contracts/contracts/schnorr_hardcoded_account_contract/Nargo.toml @@ -7,3 +7,4 @@ type = "contract" [dependencies] aztec = { path = "../../../aztec-nr/aztec" } authwit = { path = "../../../aztec-nr/authwit" } +schnorr = { tag = "v0.1.0", git = "https://github.com/noir-lang/schnorr" } diff --git a/noir-projects/noir-contracts/contracts/schnorr_hardcoded_account_contract/src/main.nr b/noir-projects/noir-contracts/contracts/schnorr_hardcoded_account_contract/src/main.nr index 1eea24b7356f..870126778530 100644 --- a/noir-projects/noir-contracts/contracts/schnorr_hardcoded_account_contract/src/main.nr +++ b/noir-projects/noir-contracts/contracts/schnorr_hardcoded_account_contract/src/main.nr @@ -41,9 +41,12 @@ contract SchnorrHardcodedAccount { } // Verify signature using hardcoded public key - std::schnorr::verify_signature( - public_key_x, - public_key_y, + schnorr::verify_signature( + std::embedded_curve_ops::EmbeddedCurvePoint { + x: public_key_x, + y: public_key_y, + is_infinite: false, + }, signature, outer_hash.to_be_bytes::<32>(), ) diff --git a/noir-projects/noir-contracts/contracts/schnorr_single_key_account_contract/Nargo.toml b/noir-projects/noir-contracts/contracts/schnorr_single_key_account_contract/Nargo.toml index 80c39efcba25..25c622e552f9 100644 --- a/noir-projects/noir-contracts/contracts/schnorr_single_key_account_contract/Nargo.toml +++ b/noir-projects/noir-contracts/contracts/schnorr_single_key_account_contract/Nargo.toml @@ -7,3 +7,4 @@ type = "contract" [dependencies] aztec = { path = "../../../aztec-nr/aztec" } authwit = { path = "../../../aztec-nr/authwit" } +schnorr = { tag = "v0.1.0", git = "https://github.com/noir-lang/schnorr" } diff --git a/noir-projects/noir-contracts/contracts/schnorr_single_key_account_contract/src/util.nr b/noir-projects/noir-contracts/contracts/schnorr_single_key_account_contract/src/util.nr index b4abeeff7355..b14c65fc2eba 100644 --- a/noir-projects/noir-contracts/contracts/schnorr_single_key_account_contract/src/util.nr +++ b/noir-projects/noir-contracts/contracts/schnorr_single_key_account_contract/src/util.nr @@ -1,17 +1,19 @@ use crate::auth_oracle::AuthWitness; use dep::aztec::prelude::AztecAddress; -use std::schnorr::verify_signature; pub fn recover_address(message_hash: Field, witness: AuthWitness) -> AztecAddress { let message_bytes: [u8; 32] = message_hash.to_be_bytes(); // In a single key account contract we re-used ivpk_m as signing key - let verification = verify_signature( - witness.keys.ivpk_m.inner.x, - witness.keys.ivpk_m.inner.y, + + schnorr::assert_valid_signature( + std::embedded_curve_ops::EmbeddedCurvePoint { + x: witness.keys.ivpk_m.inner.x, + y: witness.keys.ivpk_m.inner.y, + is_infinite: false, + }, witness.signature, message_bytes, ); - assert(verification == true); AztecAddress::compute(witness.keys, witness.partial_address) } From d3b5478913159a0bb8fc971a66689143e6c365c8 Mon Sep 17 00:00:00 2001 From: Tom French <15848336+TomAFrench@users.noreply.github.com> Date: Sat, 30 Nov 2024 20:31:39 +0000 Subject: [PATCH 2/4] Update noir-projects/noir-contracts/contracts/schnorr_account_contract/src/main.nr --- .../contracts/schnorr_account_contract/src/main.nr | 1 - 1 file changed, 1 deletion(-) diff --git a/noir-projects/noir-contracts/contracts/schnorr_account_contract/src/main.nr b/noir-projects/noir-contracts/contracts/schnorr_account_contract/src/main.nr index 7c16d702b2ae..028f1e6cf4b0 100644 --- a/noir-projects/noir-contracts/contracts/schnorr_account_contract/src/main.nr +++ b/noir-projects/noir-contracts/contracts/schnorr_account_contract/src/main.nr @@ -22,7 +22,6 @@ contract SchnorrAccount { use dep::aztec::prelude::{AztecAddress, PrivateContext, PrivateImmutable}; use crate::public_key_note::PublicKeyNote; - use std::embedded_curve_ops::EmbeddedCurvePoint; #[storage] struct Storage { From 6ea6acb937877fdc3cfa49e0152757fcaabdb4eb Mon Sep 17 00:00:00 2001 From: Tom French <15848336+TomAFrench@users.noreply.github.com> Date: Tue, 3 Dec 2024 19:25:47 +0000 Subject: [PATCH 3/4] Apply suggestions from code review --- .../contracts/schnorr_account_contract/Nargo.toml | 2 +- .../contracts/schnorr_hardcoded_account_contract/Nargo.toml | 2 +- .../contracts/schnorr_single_key_account_contract/Nargo.toml | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/noir-projects/noir-contracts/contracts/schnorr_account_contract/Nargo.toml b/noir-projects/noir-contracts/contracts/schnorr_account_contract/Nargo.toml index c3f56a36c642..1211ad63c05f 100644 --- a/noir-projects/noir-contracts/contracts/schnorr_account_contract/Nargo.toml +++ b/noir-projects/noir-contracts/contracts/schnorr_account_contract/Nargo.toml @@ -7,4 +7,4 @@ type = "contract" [dependencies] aztec = { path = "../../../aztec-nr/aztec" } authwit = { path = "../../../aztec-nr/authwit" } -schnorr = { tag = "v0.1.0", git = "https://github.com/noir-lang/schnorr" } +schnorr = { tag = "v0.1.1", git = "https://github.com/noir-lang/schnorr" } diff --git a/noir-projects/noir-contracts/contracts/schnorr_hardcoded_account_contract/Nargo.toml b/noir-projects/noir-contracts/contracts/schnorr_hardcoded_account_contract/Nargo.toml index d31c206d4852..771cfa8fd284 100644 --- a/noir-projects/noir-contracts/contracts/schnorr_hardcoded_account_contract/Nargo.toml +++ b/noir-projects/noir-contracts/contracts/schnorr_hardcoded_account_contract/Nargo.toml @@ -7,4 +7,4 @@ type = "contract" [dependencies] aztec = { path = "../../../aztec-nr/aztec" } authwit = { path = "../../../aztec-nr/authwit" } -schnorr = { tag = "v0.1.0", git = "https://github.com/noir-lang/schnorr" } +schnorr = { tag = "v0.1.1", git = "https://github.com/noir-lang/schnorr" } diff --git a/noir-projects/noir-contracts/contracts/schnorr_single_key_account_contract/Nargo.toml b/noir-projects/noir-contracts/contracts/schnorr_single_key_account_contract/Nargo.toml index 25c622e552f9..161993c5a732 100644 --- a/noir-projects/noir-contracts/contracts/schnorr_single_key_account_contract/Nargo.toml +++ b/noir-projects/noir-contracts/contracts/schnorr_single_key_account_contract/Nargo.toml @@ -7,4 +7,4 @@ type = "contract" [dependencies] aztec = { path = "../../../aztec-nr/aztec" } authwit = { path = "../../../aztec-nr/authwit" } -schnorr = { tag = "v0.1.0", git = "https://github.com/noir-lang/schnorr" } +schnorr = { tag = "v0.1.1", git = "https://github.com/noir-lang/schnorr" } From 2925f5554e51b5475f0fe843ec530a6fe93a99ae Mon Sep 17 00:00:00 2001 From: Tom French <15848336+TomAFrench@users.noreply.github.com> Date: Tue, 3 Dec 2024 20:48:03 +0000 Subject: [PATCH 4/4] Update noir-projects/noir-contracts/contracts/schnorr_single_key_account_contract/src/util.nr --- .../schnorr_single_key_account_contract/src/util.nr | 7 +------ 1 file changed, 1 insertion(+), 6 deletions(-) diff --git a/noir-projects/noir-contracts/contracts/schnorr_single_key_account_contract/src/util.nr b/noir-projects/noir-contracts/contracts/schnorr_single_key_account_contract/src/util.nr index 6c1ef891c627..e77e943006eb 100644 --- a/noir-projects/noir-contracts/contracts/schnorr_single_key_account_contract/src/util.nr +++ b/noir-projects/noir-contracts/contracts/schnorr_single_key_account_contract/src/util.nr @@ -11,12 +11,7 @@ pub fn recover_address(message_hash: Field, witness: AuthWitness) -> AztecAddres }; // In a single key account contract we re-used ivpk_m as signing key - - schnorr::assert_valid_signature( - public_key, - witness.signature, - message_bytes, - ); + schnorr::assert_valid_signature(public_key, witness.signature, message_bytes); AztecAddress::compute(witness.keys, witness.partial_address) }