diff --git a/Cargo.toml b/Cargo.toml index e80b73c..ce9bc0f 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -14,3 +14,4 @@ wee_alloc = "0.4.4" default = [ "std" ] std = [] debug = [] +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/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..145c623 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -31,6 +31,9 @@ mod utils; #[cfg(feature = "debug")] pub mod debug; +#[cfg(feature = "experimental")] +pub mod bignum; + #[cfg(not(feature = "std"))] pub mod convert;