From 977a8e8daba41b912e07ad059ce4a3d0a2b331ca Mon Sep 17 00:00:00 2001 From: Sean Bowe Date: Thu, 4 Aug 2016 20:22:31 -0600 Subject: [PATCH] Add Fr::inverse --- Cargo.lock | 4 ++++ snark/Cargo.lock | 24 ------------------------ snark/src/fr.rs | 18 ++++++++++++++++++ snark/src/libsnarkwrap.cpp | 4 ++++ 4 files changed, 26 insertions(+), 24 deletions(-) delete mode 100644 snark/Cargo.lock diff --git a/Cargo.lock b/Cargo.lock index 7cefcdf..c8b9f1e 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -29,3 +29,7 @@ dependencies = [ "libc 0.2.14 (registry+https://github.com/rust-lang/crates.io-index)", ] +[metadata] +"checksum gcc 0.3.32 (registry+https://github.com/rust-lang/crates.io-index)" = "dcb000abd6df9df4c637f75190297ebe56c1d7e66b56bbf3b4aa7aece15f61a2" +"checksum lazy_static 0.1.16 (registry+https://github.com/rust-lang/crates.io-index)" = "cf186d1a8aa5f5bee5fd662bc9c1b949e0259e1bcc379d1f006847b0080c7417" +"checksum libc 0.2.14 (registry+https://github.com/rust-lang/crates.io-index)" = "39dfaaa0f4da0f1a06876c5d94329d739ad0150868069cc235f1ddf80a0480e7" diff --git a/snark/Cargo.lock b/snark/Cargo.lock deleted file mode 100644 index 9d0bfe6..0000000 --- a/snark/Cargo.lock +++ /dev/null @@ -1,24 +0,0 @@ -[root] -name = "snark" -version = "0.0.1" -dependencies = [ - "gcc 0.3.32 (registry+https://github.com/rust-lang/crates.io-index)", - "lazy_static 0.1.16 (registry+https://github.com/rust-lang/crates.io-index)", - "libc 0.2.14 (registry+https://github.com/rust-lang/crates.io-index)", -] - -[[package]] -name = "gcc" -version = "0.3.32" -source = "registry+https://github.com/rust-lang/crates.io-index" - -[[package]] -name = "lazy_static" -version = "0.1.16" -source = "registry+https://github.com/rust-lang/crates.io-index" - -[[package]] -name = "libc" -version = "0.2.14" -source = "registry+https://github.com/rust-lang/crates.io-index" - diff --git a/snark/src/fr.rs b/snark/src/fr.rs index 7daf521..51cd4ee 100644 --- a/snark/src/fr.rs +++ b/snark/src/fr.rs @@ -17,6 +17,7 @@ extern "C" { fn libsnarkwrap_Fr_mul(a: *const Fr, b: *const Fr) -> Fr; fn libsnarkwrap_Fr_sub(a: *const Fr, b: *const Fr) -> Fr; fn libsnarkwrap_Fr_neg(a: *const Fr) -> Fr; + fn libsnarkwrap_Fr_inverse(a: *const Fr) -> Fr; fn libsnarkwrap_Fr_is_zero(a: *const Fr) -> bool; } @@ -33,6 +34,10 @@ impl Fr { unsafe { libsnarkwrap_Fr_random() } } + pub fn inverse(&self) -> Self { + unsafe { libsnarkwrap_Fr_inverse(self) } + } + pub fn is_zero(&self) -> bool { unsafe { libsnarkwrap_Fr_is_zero(self) } } @@ -105,6 +110,19 @@ impl Neg for Fr { } } +#[test] +fn test_inverses() { + super::initialize(); + + for _ in 0..50 { + let a = Fr::random(); + assert!(a != Fr::zero()); + let b = a.inverse(); + + assert!(a * b == Fr::one()); + } +} + #[test] fn test_basic_arith() { super::initialize(); diff --git a/snark/src/libsnarkwrap.cpp b/snark/src/libsnarkwrap.cpp index b2626bf..761d640 100644 --- a/snark/src/libsnarkwrap.cpp +++ b/snark/src/libsnarkwrap.cpp @@ -75,6 +75,10 @@ extern "C" curve_Fr libsnarkwrap_Fr_neg(const curve_Fr *a) { return -(*a); } +extern "C" curve_Fr libsnarkwrap_Fr_inverse(const curve_Fr *a) { + return a->inverse(); +} + extern "C" bool libsnarkwrap_Fr_is_zero(const curve_Fr *a) { return a->is_zero(); }