From 4a459f3f1ba5e7a33eb6a03cdb977ef1620dce03 Mon Sep 17 00:00:00 2001 From: Alex Beregszaszi Date: Fri, 26 Apr 2019 23:09:05 +0100 Subject: [PATCH 1/2] Add support for the bignum system library --- Cargo.toml | 1 + src/bignum.rs | 39 +++++++++++++++++++++++++++++++++++++++ src/lib.rs | 3 +++ 3 files changed, 43 insertions(+) create mode 100644 src/bignum.rs diff --git a/Cargo.toml b/Cargo.toml index e80b73c..b68eff0 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -14,3 +14,4 @@ wee_alloc = "0.4.4" default = [ "std" ] std = [] debug = [] +bignum = [] diff --git a/src/bignum.rs b/src/bignum.rs new file mode 100644 index 0000000..6a8ab5a --- /dev/null +++ b/src/bignum.rs @@ -0,0 +1,39 @@ +//! The bignum system library. + +use super::*; + +pub mod native { + extern "C" { + pub fn bignum_mul256(a: *const u32, b: *const u32, ret: *const u32); + pub fn bignum_umulmod256(a: *const u32, b: *const u32, modulo: *const u32, ret: *const u32); + } +} + +pub fn mul256(a: &Uint256, b: &Uint256) -> Uint256 { + let mut ret = Uint256::default(); + + unsafe { + native::bignum_mul256( + a.bytes.as_ptr() as *const u32, + b.bytes.as_ptr() as *const u32, + ret.bytes.as_mut_ptr() as *const u32, + ) + } + + ret +} + +pub fn umulmod256(a: &Uint256, b: &Uint256, modulo: &Uint256) -> Uint256 { + let mut ret = Uint256::default(); + + unsafe { + native::bignum_umulmod256( + a.bytes.as_ptr() as *const u32, + b.bytes.as_ptr() as *const u32, + modulo.bytes.as_ptr() as *const u32, + ret.bytes.as_mut_ptr() as *const u32, + ) + } + + ret +} diff --git a/src/lib.rs b/src/lib.rs index 30cd945..46c61cb 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -31,6 +31,9 @@ mod utils; #[cfg(feature = "debug")] pub mod debug; +#[cfg(feature = "bignum")] +pub mod bignum; + #[cfg(not(feature = "std"))] pub mod convert; From 9f7aef7832f12daa07f63b083f500f170f2299f9 Mon Sep 17 00:00:00 2001 From: Alex Beregszaszi Date: Tue, 28 May 2019 20:16:10 +0100 Subject: [PATCH 2/2] Move bignum under the "experimental" feature flag Previously it was the "bignum" feature flag --- Cargo.toml | 2 +- circle.yml | 4 ++++ src/lib.rs | 2 +- 3 files changed, 6 insertions(+), 2 deletions(-) diff --git a/Cargo.toml b/Cargo.toml index b68eff0..ce9bc0f 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -14,4 +14,4 @@ wee_alloc = "0.4.4" default = [ "std" ] std = [] debug = [] -bignum = [] +experimental = [] diff --git a/circle.yml b/circle.yml index c1c1c1f..402a919 100644 --- a/circle.yml +++ b/circle.yml @@ -30,3 +30,7 @@ jobs: cargo build --release --no-default-features cargo build --release --features debug cargo build --release --no-default-features --features debug + cargo build --release --features experimental + cargo build --release --no-default-features --features experimental + cargo build --release --features experimental,debug + cargo build --release --no-default-features --features experimental,debug diff --git a/src/lib.rs b/src/lib.rs index 46c61cb..145c623 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -31,7 +31,7 @@ mod utils; #[cfg(feature = "debug")] pub mod debug; -#[cfg(feature = "bignum")] +#[cfg(feature = "experimental")] pub mod bignum; #[cfg(not(feature = "std"))]