Support modular division of signed numbers.

This commit is contained in:
2018-12-23 21:55:07 -08:00
parent 2480bafe06
commit ae8266885b
66 changed files with 221461 additions and 1 deletions

View File

@@ -1,15 +1,21 @@
moddiv_impls!(I192, I384);
signed_impls!(I192, U192); signed_impls!(I192, U192);
subtraction_impls!(I192, I256, U256); subtraction_impls!(I192, I256, U256);
mul_impls!(I192, I384);
div_impls!(I192, U192);
conversion_impls!(I192, U192, I256, U256); conversion_impls!(I192, U192, I256, U256);
conversion_impls!(I192, U192, I384, U384);
conversion_impls!(I192, U192, I512, U512); conversion_impls!(I192, U192, I512, U512);
egcd_impls!(I256, U192, I192); egcd_impls!(I256, U192, I192);
modinv_impls!(U192, I256, U256); modinv_impls!(U192, I256, U256);
moddiv_impls!(I256, I512);
add_impls!(I256, I320, U320); add_impls!(I256, I320, U320);
signed_impls!(I256, U256); signed_impls!(I256, U256);
cmp_impls!(I256); cmp_impls!(I256);
shift_impls!(I256, U256); shift_impls!(I256, U256);
subtraction_impls!(I256, I320, U320); subtraction_impls!(I256, I320, U320);
mul_impls!(I256, I512); mul_impls!(I256, I512);
div_impls!(I256, U256);
conversion_impls!(I256, U256, I320, U320); conversion_impls!(I256, U256, I320, U320);
conversion_impls!(I256, U256, I512, U512); conversion_impls!(I256, U256, I512, U512);
conversion_impls!(I256, U256, I640, U640); conversion_impls!(I256, U256, I640, U640);
@@ -23,12 +29,23 @@ subtraction_impls!(I320, I384, U384);
mul_impls!(I320, I640); mul_impls!(I320, I640);
conversion_impls!(I320, U320, I384, U384); conversion_impls!(I320, U320, I384, U384);
conversion_impls!(I320, U320, I640, U640); conversion_impls!(I320, U320, I640, U640);
moddiv_impls!(I384, I768);
signed_impls!(I384, U384); signed_impls!(I384, U384);
subtraction_impls!(I384, I448, U448); subtraction_impls!(I384, I448, U448);
mul_impls!(I384, I768);
div_impls!(I384, U384);
conversion_impls!(I384, U384, I448, U448); conversion_impls!(I384, U384, I448, U448);
conversion_impls!(I384, U384, I768, U768);
conversion_impls!(I384, U384, I896, U896); conversion_impls!(I384, U384, I896, U896);
egcd_impls!(I448, U384, I384);
modinv_impls!(U384, I448, U448);
add_impls!(I448, I512, U512);
signed_impls!(I448, U448); signed_impls!(I448, U448);
cmp_impls!(I448);
shift_impls!(I448, U448);
subtraction_impls!(I448, I512, U512);
mul_impls!(I448, I896); mul_impls!(I448, I896);
conversion_impls!(I448, U448, I512, U512);
conversion_impls!(I448, U448, I896, U896); conversion_impls!(I448, U448, I896, U896);
signed_impls!(I512, U512); signed_impls!(I512, U512);
subtraction_impls!(I512, I576, U576); subtraction_impls!(I512, I576, U576);
@@ -38,20 +55,31 @@ conversion_impls!(I512, U512, I576, U576);
conversion_impls!(I512, U512, I1024, U1024); conversion_impls!(I512, U512, I1024, U1024);
egcd_impls!(I576, U512, I512); egcd_impls!(I576, U512, I512);
modinv_impls!(U512, I576, U576); modinv_impls!(U512, I576, U576);
moddiv_impls!(I576, I1152);
add_impls!(I576, I640, U640); add_impls!(I576, I640, U640);
signed_impls!(I576, U576); signed_impls!(I576, U576);
cmp_impls!(I576); cmp_impls!(I576);
shift_impls!(I576, U576); shift_impls!(I576, U576);
subtraction_impls!(I576, I640, U640); subtraction_impls!(I576, I640, U640);
mul_impls!(I576, I1152);
div_impls!(I576, U576);
conversion_impls!(I576, U576, I640, U640); conversion_impls!(I576, U576, I640, U640);
conversion_impls!(I576, U576, I1152, U1152);
conversion_impls!(I576, U576, I1280, U1280); conversion_impls!(I576, U576, I1280, U1280);
egcd_impls!(I640, U576, I576);
modinv_impls!(U576, I640, U640);
add_impls!(I640, I704, U704);
signed_impls!(I640, U640); signed_impls!(I640, U640);
cmp_impls!(I640);
shift_impls!(I640, U640);
subtraction_impls!(I640, I704, U704); subtraction_impls!(I640, I704, U704);
mul_impls!(I640, I1280); mul_impls!(I640, I1280);
div_impls!(I640, U640); div_impls!(I640, U640);
conversion_impls!(I640, U640, I704, U704); conversion_impls!(I640, U640, I704, U704);
conversion_impls!(I640, U640, I1280, U1280); conversion_impls!(I640, U640, I1280, U1280);
signed_impls!(I704, U704); signed_impls!(I704, U704);
signed_impls!(I768, U768);
div_impls!(I768, U768);
signed_impls!(I896, U896); signed_impls!(I896, U896);
subtraction_impls!(I896, I960, U960); subtraction_impls!(I896, I960, U960);
mul_impls!(I896, I1792); mul_impls!(I896, I1792);
@@ -70,6 +98,7 @@ shift_impls!(I1088, U1088);
subtraction_impls!(I1088, I1152, U1152); subtraction_impls!(I1088, I1152, U1152);
conversion_impls!(I1088, U1088, I1152, U1152); conversion_impls!(I1088, U1088, I1152, U1152);
signed_impls!(I1152, U1152); signed_impls!(I1152, U1152);
div_impls!(I1152, U1152);
signed_impls!(I1280, U1280); signed_impls!(I1280, U1280);
subtraction_impls!(I1280, I1344, U1344); subtraction_impls!(I1280, I1344, U1344);
mul_impls!(I1280, I2560); mul_impls!(I1280, I2560);
@@ -164,7 +193,9 @@ mod tests {
generate_sigadd_tests!(I256, U256, i256, I320, U320); generate_sigadd_tests!(I256, U256, i256, I320, U320);
generate_sigadd_tests!(I320, U320, i320, I384, U384); generate_sigadd_tests!(I320, U320, i320, I384, U384);
generate_sigadd_tests!(I448, U448, i448, I512, U512);
generate_sigadd_tests!(I576, U576, i576, I640, U640); generate_sigadd_tests!(I576, U576, i576, I640, U640);
generate_sigadd_tests!(I640, U640, i640, I704, U704);
generate_sigadd_tests!(I1088, U1088, i1088, I1152, U1152); generate_sigadd_tests!(I1088, U1088, i1088, I1152, U1152);
generate_sigadd_tests!(I1600, U1600, i1600, I1664, U1664); generate_sigadd_tests!(I1600, U1600, i1600, I1664, U1664);
generate_sigadd_tests!(I2112, U2112, i2112, I2176, U2176); generate_sigadd_tests!(I2112, U2112, i2112, I2176, U2176);
@@ -182,6 +213,7 @@ mod tests {
generate_sigsub_tests!(I256, U256, i256, I320, U320); generate_sigsub_tests!(I256, U256, i256, I320, U320);
generate_sigsub_tests!(I320, U320, i320, I384, U384); generate_sigsub_tests!(I320, U320, i320, I384, U384);
generate_sigsub_tests!(I384, U384, i384, I448, U448); generate_sigsub_tests!(I384, U384, i384, I448, U448);
generate_sigsub_tests!(I448, U448, i448, I512, U512);
generate_sigsub_tests!(I512, U512, i512, I576, U576); generate_sigsub_tests!(I512, U512, i512, I576, U576);
generate_sigsub_tests!(I576, U576, i576, I640, U640); generate_sigsub_tests!(I576, U576, i576, I640, U640);
generate_sigsub_tests!(I640, U640, i640, I704, U704); generate_sigsub_tests!(I640, U640, i640, I704, U704);
@@ -209,6 +241,7 @@ mod tests {
generate_signed_tests!(I576, U576, i576); generate_signed_tests!(I576, U576, i576);
generate_signed_tests!(I640, U640, i640); generate_signed_tests!(I640, U640, i640);
generate_signed_tests!(I704, U704, i704); generate_signed_tests!(I704, U704, i704);
generate_signed_tests!(I768, U768, i768);
generate_signed_tests!(I896, U896, i896); generate_signed_tests!(I896, U896, i896);
generate_signed_tests!(I960, U960, i960); generate_signed_tests!(I960, U960, i960);
generate_signed_tests!(I1024, U1024, i1024); generate_signed_tests!(I1024, U1024, i1024);
@@ -250,6 +283,7 @@ mod tests {
generate_sigconversion_tests!(I576, U576, i576); generate_sigconversion_tests!(I576, U576, i576);
generate_sigconversion_tests!(I640, U640, i640); generate_sigconversion_tests!(I640, U640, i640);
generate_sigconversion_tests!(I704, U704, i704); generate_sigconversion_tests!(I704, U704, i704);
generate_sigconversion_tests!(I768, U768, i768);
generate_sigconversion_tests!(I896, U896, i896); generate_sigconversion_tests!(I896, U896, i896);
generate_sigconversion_tests!(I960, U960, i960); generate_sigconversion_tests!(I960, U960, i960);
generate_sigconversion_tests!(I1024, U1024, i1024); generate_sigconversion_tests!(I1024, U1024, i1024);
@@ -287,7 +321,9 @@ mod tests {
generate_sigcmp_tests!(I256, U256, i256); generate_sigcmp_tests!(I256, U256, i256);
generate_sigcmp_tests!(I320, U320, i320); generate_sigcmp_tests!(I320, U320, i320);
generate_sigcmp_tests!(I448, U448, i448);
generate_sigcmp_tests!(I576, U576, i576); generate_sigcmp_tests!(I576, U576, i576);
generate_sigcmp_tests!(I640, U640, i640);
generate_sigcmp_tests!(I1088, U1088, i1088); generate_sigcmp_tests!(I1088, U1088, i1088);
generate_sigcmp_tests!(I1600, U1600, i1600); generate_sigcmp_tests!(I1600, U1600, i1600);
generate_sigcmp_tests!(I2112, U2112, i2112); generate_sigcmp_tests!(I2112, U2112, i2112);
@@ -301,10 +337,13 @@ mod tests {
use super::super::*; use super::super::*;
use testing::{build_test_path,run_test}; use testing::{build_test_path,run_test};
generate_sigmul_tests!(I192, U192, i192, I384, U384);
generate_sigmul_tests!(I256, U256, i256, I512, U512); generate_sigmul_tests!(I256, U256, i256, I512, U512);
generate_sigmul_tests!(I320, U320, i320, I640, U640); generate_sigmul_tests!(I320, U320, i320, I640, U640);
generate_sigmul_tests!(I384, U384, i384, I768, U768);
generate_sigmul_tests!(I448, U448, i448, I896, U896); generate_sigmul_tests!(I448, U448, i448, I896, U896);
generate_sigmul_tests!(I512, U512, i512, I1024, U1024); generate_sigmul_tests!(I512, U512, i512, I1024, U1024);
generate_sigmul_tests!(I576, U576, i576, I1152, U1152);
generate_sigmul_tests!(I640, U640, i640, I1280, U1280); generate_sigmul_tests!(I640, U640, i640, I1280, U1280);
generate_sigmul_tests!(I896, U896, i896, I1792, U1792); generate_sigmul_tests!(I896, U896, i896, I1792, U1792);
generate_sigmul_tests!(I1280, U1280, i1280, I2560, U2560); generate_sigmul_tests!(I1280, U1280, i1280, I2560, U2560);
@@ -313,9 +352,15 @@ mod tests {
use super::super::*; use super::super::*;
use testing::{build_test_path,run_test}; use testing::{build_test_path,run_test};
generate_sigdiv_tests!(I192, U192, i192);
generate_sigdiv_tests!(I256, U256, i256);
generate_sigdiv_tests!(I384, U384, i384);
generate_sigdiv_tests!(I512, U512, i512); generate_sigdiv_tests!(I512, U512, i512);
generate_sigdiv_tests!(I576, U576, i576);
generate_sigdiv_tests!(I640, U640, i640); generate_sigdiv_tests!(I640, U640, i640);
generate_sigdiv_tests!(I768, U768, i768);
generate_sigdiv_tests!(I896, U896, i896); generate_sigdiv_tests!(I896, U896, i896);
generate_sigdiv_tests!(I1152, U1152, i1152);
generate_sigdiv_tests!(I1280, U1280, i1280); generate_sigdiv_tests!(I1280, U1280, i1280);
} }
mod sigshiftl { mod sigshiftl {
@@ -324,7 +369,9 @@ mod tests {
generate_sigshiftl_tests!(I256, U256, i256); generate_sigshiftl_tests!(I256, U256, i256);
generate_sigshiftl_tests!(I320, U320, i320); generate_sigshiftl_tests!(I320, U320, i320);
generate_sigshiftl_tests!(I448, U448, i448);
generate_sigshiftl_tests!(I576, U576, i576); generate_sigshiftl_tests!(I576, U576, i576);
generate_sigshiftl_tests!(I640, U640, i640);
generate_sigshiftl_tests!(I1088, U1088, i1088); generate_sigshiftl_tests!(I1088, U1088, i1088);
generate_sigshiftl_tests!(I1600, U1600, i1600); generate_sigshiftl_tests!(I1600, U1600, i1600);
generate_sigshiftl_tests!(I2112, U2112, i2112); generate_sigshiftl_tests!(I2112, U2112, i2112);
@@ -340,7 +387,9 @@ mod tests {
generate_sigshiftr_tests!(I256, U256, i256); generate_sigshiftr_tests!(I256, U256, i256);
generate_sigshiftr_tests!(I320, U320, i320); generate_sigshiftr_tests!(I320, U320, i320);
generate_sigshiftr_tests!(I448, U448, i448);
generate_sigshiftr_tests!(I576, U576, i576); generate_sigshiftr_tests!(I576, U576, i576);
generate_sigshiftr_tests!(I640, U640, i640);
generate_sigshiftr_tests!(I1088, U1088, i1088); generate_sigshiftr_tests!(I1088, U1088, i1088);
generate_sigshiftr_tests!(I1600, U1600, i1600); generate_sigshiftr_tests!(I1600, U1600, i1600);
generate_sigshiftr_tests!(I2112, U2112, i2112); generate_sigshiftr_tests!(I2112, U2112, i2112);
@@ -356,7 +405,9 @@ mod tests {
generate_egcd_tests!(I192, U192, i192, I256, U256); generate_egcd_tests!(I192, U192, i192, I256, U256);
generate_egcd_tests!(I256, U256, i256, I320, U320); generate_egcd_tests!(I256, U256, i256, I320, U320);
generate_egcd_tests!(I384, U384, i384, I448, U448);
generate_egcd_tests!(I512, U512, i512, I576, U576); generate_egcd_tests!(I512, U512, i512, I576, U576);
generate_egcd_tests!(I576, U576, i576, I640, U640);
generate_egcd_tests!(ignore I1024, U1024, i1024, I1088, U1088); generate_egcd_tests!(ignore I1024, U1024, i1024, I1088, U1088);
generate_egcd_tests!(ignore I1536, U1536, i1536, I1600, U1600); generate_egcd_tests!(ignore I1536, U1536, i1536, I1600, U1600);
generate_egcd_tests!(ignore I2048, U2048, i2048, I2112, U2112); generate_egcd_tests!(ignore I2048, U2048, i2048, I2112, U2112);
@@ -366,13 +417,24 @@ mod tests {
generate_egcd_tests!(ignore I8192, U8192, i8192, I8256, U8256); generate_egcd_tests!(ignore I8192, U8192, i8192, I8256, U8256);
generate_egcd_tests!(ignore I15360, U15360, i15360, I15424, U15424); generate_egcd_tests!(ignore I15360, U15360, i15360, I15424, U15424);
} }
mod moddiv {
use super::super::*;
use testing::{build_test_path,run_test};
generate_moddiv_tests!(I192, U192, i192);
generate_moddiv_tests!(I256, U256, i256);
generate_moddiv_tests!(I384, U384, i384);
generate_moddiv_tests!(I576, U576, i576);
}
mod modinv { mod modinv {
use super::super::*; use super::super::*;
use testing::{build_test_path,run_test}; use testing::{build_test_path,run_test};
generate_modinv_tests!(I192, U192, i192); generate_modinv_tests!(I192, U192, i192);
generate_modinv_tests!(I256, U256, i256); generate_modinv_tests!(I256, U256, i256);
generate_modinv_tests!(I384, U384, i384);
generate_modinv_tests!(I512, U512, i512); generate_modinv_tests!(I512, U512, i512);
generate_modinv_tests!(I576, U576, i576);
generate_modinv_tests!(I1024, U1024, i1024); generate_modinv_tests!(I1024, U1024, i1024);
generate_modinv_tests!(ignore I2048, U2048, i2048); generate_modinv_tests!(ignore I2048, U2048, i2048);
generate_modinv_tests!(ignore I3072, U3072, i3072); generate_modinv_tests!(ignore I3072, U3072, i3072);

View File

@@ -22,6 +22,8 @@ mod div;
#[macro_use] #[macro_use]
mod egcd; mod egcd;
#[macro_use] #[macro_use]
mod moddiv;
#[macro_use]
mod modinv; mod modinv;
#[macro_use] #[macro_use]
mod mul; mod mul;
@@ -43,6 +45,7 @@ use std::ops::{Sub,SubAssign};
use unsigned::*; use unsigned::*;
pub use self::egcd::EGCD; pub use self::egcd::EGCD;
pub use self::moddiv::ModDiv;
pub use self::modinv::ModInv; pub use self::modinv::ModInv;
include!("invoc.rs"); include!("invoc.rs");

62
src/signed/moddiv.rs Normal file
View File

@@ -0,0 +1,62 @@
/// Computations of the modular inverse.
pub trait ModDiv: Sized {
/// Compute the modular division of the number by the given number and
/// modulus. The divisor *must* have a modular inverse for this function
/// to succeed.
fn moddiv(&self, divisor: &Self, phi: &Self) -> Self;
}
macro_rules! moddiv_impls {
($sname: ident, $dbl: ident) => {
impl ModDiv for $sname {
fn moddiv(&self, divisor: &Self, phi: &Self) -> Self
{
assert!(!divisor.is_negative());
let safe_divisor = divisor % phi;
let unsigned_i = safe_divisor.value.modinv(&phi.value).expect("no modular inverse of moddiv divisor");
let i = $sname::new(false, unsigned_i);
let selfi = i * self;
$sname::from( selfi % $dbl::from(phi) )
}
}
};
}
#[cfg(test)]
macro_rules! generate_moddiv_tests {
($sname: ident, $tname: ident, $mname: ident) => {
#[test]
fn $mname() {
generate_moddiv_tests!(body $sname, $tname, $mname);
}
};
(ignore $sname: ident, $tname: ident, $mname: ident) => {
#[test]
#[ignore]
fn $mname() {
generate_moddiv_tests!(body $sname, $tname, $mname);
}
};
(body $sname: ident, $tname: ident, $mname: ident) => {
let fname = build_test_path("moddiv", stringify!($sname));
run_test(fname.to_string(), 4, |case| {
let (nega, abytes) = case.get("a").unwrap();
let (negb, bbytes) = case.get("b").unwrap();
let (negm, mbytes) = case.get("m").unwrap();
let (negc, cbytes) = case.get("c").unwrap();
let a = $sname::new(*nega, $tname::from_bytes(abytes));
let b = $sname::new(*negb, $tname::from_bytes(bbytes));
let m = $sname::new(*negm, $tname::from_bytes(mbytes));
let c = $sname::new(*negc, $tname::from_bytes(cbytes));
let res = a.moddiv(&b, &m);
println!("-------------");
println!("a: {:x}", a);
println!("b: {:x}", b);
println!("m: {:x}", m);
println!("c: {:x}", c);
println!("r: {:x}", res);
assert_eq!(c, res);
});
};
}

View File

@@ -57,12 +57,14 @@ conversion_impls!(U320, U640);
addition_impls!(U384, U448); addition_impls!(U384, U448);
base_impls!(U384, 6); base_impls!(U384, 6);
random_impls!(U384, UniformU384); random_impls!(U384, UniformU384);
barrett_impl!(BarrettU384, U384, U448, U768, U832);
div_impls!(U384, U768); div_impls!(U384, U768);
multiply_impls!(U384, U768); multiply_impls!(U384, U768);
shift_impls!(U384, 6); shift_impls!(U384, 6);
subtraction_impls!(U384, 6); subtraction_impls!(U384, 6);
conversion_impls!(U384, U448); conversion_impls!(U384, U448);
conversion_impls!(U384, U768); conversion_impls!(U384, U768);
conversion_impls!(U384, U832);
conversion_impls!(U384, U896); conversion_impls!(U384, U896);
conversion_impls!(U384, U1024); conversion_impls!(U384, U1024);
addition_impls!(U448, U512); addition_impls!(U448, U512);
@@ -70,8 +72,11 @@ base_impls!(U448, 7);
random_impls!(U448, UniformU448); random_impls!(U448, UniformU448);
div_impls!(U448, U896); div_impls!(U448, U896);
multiply_impls!(U448, U896); multiply_impls!(U448, U896);
shift_impls!(U448, 7);
subtraction_impls!(U448, 7); subtraction_impls!(U448, 7);
conversion_impls!(U448, U512); conversion_impls!(U448, U512);
conversion_impls!(U448, U768);
conversion_impls!(U448, U832);
conversion_impls!(U448, U896); conversion_impls!(U448, U896);
addition_impls!(U512, U576); addition_impls!(U512, U576);
base_impls!(U512, 8); base_impls!(U512, 8);
@@ -95,6 +100,7 @@ prime_gen_impls!(U512);
addition_impls!(U576, U640); addition_impls!(U576, U640);
base_impls!(U576, 9); base_impls!(U576, 9);
random_impls!(U576, UniformU576); random_impls!(U576, UniformU576);
barrett_impl!(BarrettU576, U576, U640, U1152, U1216);
div_impls!(U576, U1152); div_impls!(U576, U1152);
multiply_impls!(U576, U1152); multiply_impls!(U576, U1152);
shift_impls!(U576, 9); shift_impls!(U576, 9);
@@ -103,6 +109,7 @@ conversion_impls!(U576, U640);
conversion_impls!(U576, U1024); conversion_impls!(U576, U1024);
conversion_impls!(U576, U1088); conversion_impls!(U576, U1088);
conversion_impls!(U576, U1152); conversion_impls!(U576, U1152);
conversion_impls!(U576, U1216);
conversion_impls!(U576, U1280); conversion_impls!(U576, U1280);
addition_impls!(U640, U704); addition_impls!(U640, U704);
base_impls!(U640, 10); base_impls!(U640, 10);
@@ -112,18 +119,35 @@ multiply_impls!(U640, U1280);
shift_impls!(U640, 10); shift_impls!(U640, 10);
subtraction_impls!(U640, 10); subtraction_impls!(U640, 10);
conversion_impls!(U640, U704); conversion_impls!(U640, U704);
conversion_impls!(U640, U1152);
conversion_impls!(U640, U1216);
conversion_impls!(U640, U1280); conversion_impls!(U640, U1280);
base_impls!(U704, 11); base_impls!(U704, 11);
random_impls!(U704, UniformU704); random_impls!(U704, UniformU704);
subtraction_impls!(U704, 11); subtraction_impls!(U704, 11);
addition_impls!(U768, U832);
base_impls!(U768, 12); base_impls!(U768, 12);
random_impls!(U768, UniformU768); random_impls!(U768, UniformU768);
div_impls!(U768, U1536);
multiply_impls!(U768, U1536);
shift_impls!(U768, 12);
subtraction_impls!(U768, 12); subtraction_impls!(U768, 12);
conversion_impls!(U768, U832);
conversion_impls!(U768, U1536);
addition_impls!(U832, U896);
base_impls!(U832, 13);
random_impls!(U832, UniformU832);
div_impls!(U832, U1664);
multiply_impls!(U832, U1664);
subtraction_impls!(U832, 13);
conversion_impls!(U832, U896);
conversion_impls!(U832, U1664);
addition_impls!(U896, U960); addition_impls!(U896, U960);
base_impls!(U896, 14); base_impls!(U896, 14);
random_impls!(U896, UniformU896); random_impls!(U896, UniformU896);
div_impls!(U896, U1792); div_impls!(U896, U1792);
multiply_impls!(U896, U1792); multiply_impls!(U896, U1792);
shift_impls!(U896, 14);
subtraction_impls!(U896, 14); subtraction_impls!(U896, 14);
conversion_impls!(U896, U960); conversion_impls!(U896, U960);
conversion_impls!(U896, U1792); conversion_impls!(U896, U1792);
@@ -161,18 +185,29 @@ conversion_impls!(U1088, U1152);
conversion_impls!(U1088, U2048); conversion_impls!(U1088, U2048);
conversion_impls!(U1088, U2112); conversion_impls!(U1088, U2112);
conversion_impls!(U1088, U2176); conversion_impls!(U1088, U2176);
addition_impls!(U1152, U1216);
base_impls!(U1152, 18); base_impls!(U1152, 18);
random_impls!(U1152, UniformU1152); random_impls!(U1152, UniformU1152);
div_impls!(U1152, U2304); div_impls!(U1152, U2304);
multiply_impls!(U1152, U2304); multiply_impls!(U1152, U2304);
shift_impls!(U1152, 18); shift_impls!(U1152, 18);
subtraction_impls!(U1152, 18); subtraction_impls!(U1152, 18);
conversion_impls!(U1152, U1216);
conversion_impls!(U1152, U2304); conversion_impls!(U1152, U2304);
addition_impls!(U1216, U1280);
base_impls!(U1216, 19);
random_impls!(U1216, UniformU1216);
div_impls!(U1216, U2432);
multiply_impls!(U1216, U2432);
subtraction_impls!(U1216, 19);
conversion_impls!(U1216, U1280);
conversion_impls!(U1216, U2432);
addition_impls!(U1280, U1344); addition_impls!(U1280, U1344);
base_impls!(U1280, 20); base_impls!(U1280, 20);
random_impls!(U1280, UniformU1280); random_impls!(U1280, UniformU1280);
div_impls!(U1280, U2560); div_impls!(U1280, U2560);
multiply_impls!(U1280, U2560); multiply_impls!(U1280, U2560);
shift_impls!(U1280, 20);
subtraction_impls!(U1280, 20); subtraction_impls!(U1280, 20);
conversion_impls!(U1280, U1344); conversion_impls!(U1280, U1344);
conversion_impls!(U1280, U2560); conversion_impls!(U1280, U2560);
@@ -249,6 +284,9 @@ subtraction_impls!(U2176, 34);
base_impls!(U2304, 36); base_impls!(U2304, 36);
random_impls!(U2304, UniformU2304); random_impls!(U2304, UniformU2304);
subtraction_impls!(U2304, 36); subtraction_impls!(U2304, 36);
base_impls!(U2432, 38);
random_impls!(U2432, UniformU2432);
subtraction_impls!(U2432, 38);
base_impls!(U2560, 40); base_impls!(U2560, 40);
random_impls!(U2560, UniformU2560); random_impls!(U2560, UniformU2560);
subtraction_impls!(U2560, 40); subtraction_impls!(U2560, 40);
@@ -523,11 +561,13 @@ mod tests {
generate_base_tests!(U640, u640); generate_base_tests!(U640, u640);
generate_base_tests!(U704, u704); generate_base_tests!(U704, u704);
generate_base_tests!(U768, u768); generate_base_tests!(U768, u768);
generate_base_tests!(U832, u832);
generate_base_tests!(U896, u896); generate_base_tests!(U896, u896);
generate_base_tests!(U960, u960); generate_base_tests!(U960, u960);
generate_base_tests!(U1024, u1024); generate_base_tests!(U1024, u1024);
generate_base_tests!(U1088, u1088); generate_base_tests!(U1088, u1088);
generate_base_tests!(U1152, u1152); generate_base_tests!(U1152, u1152);
generate_base_tests!(U1216, u1216);
generate_base_tests!(U1280, u1280); generate_base_tests!(U1280, u1280);
generate_base_tests!(U1344, u1344); generate_base_tests!(U1344, u1344);
generate_base_tests!(U1536, u1536); generate_base_tests!(U1536, u1536);
@@ -538,6 +578,7 @@ mod tests {
generate_base_tests!(U2112, u2112); generate_base_tests!(U2112, u2112);
generate_base_tests!(U2176, u2176); generate_base_tests!(U2176, u2176);
generate_base_tests!(U2304, u2304); generate_base_tests!(U2304, u2304);
generate_base_tests!(U2432, u2432);
generate_base_tests!(U2560, u2560); generate_base_tests!(U2560, u2560);
generate_base_tests!(U3072, u3072); generate_base_tests!(U3072, u3072);
generate_base_tests!(U3136, u3136); generate_base_tests!(U3136, u3136);
@@ -584,11 +625,13 @@ mod tests {
generate_conversion_tests!(U640, u640); generate_conversion_tests!(U640, u640);
generate_conversion_tests!(U704, u704); generate_conversion_tests!(U704, u704);
generate_conversion_tests!(U768, u768); generate_conversion_tests!(U768, u768);
generate_conversion_tests!(U832, u832);
generate_conversion_tests!(U896, u896); generate_conversion_tests!(U896, u896);
generate_conversion_tests!(U960, u960); generate_conversion_tests!(U960, u960);
generate_conversion_tests!(U1024, u1024); generate_conversion_tests!(U1024, u1024);
generate_conversion_tests!(U1088, u1088); generate_conversion_tests!(U1088, u1088);
generate_conversion_tests!(U1152, u1152); generate_conversion_tests!(U1152, u1152);
generate_conversion_tests!(U1216, u1216);
generate_conversion_tests!(U1280, u1280); generate_conversion_tests!(U1280, u1280);
generate_conversion_tests!(U1344, u1344); generate_conversion_tests!(U1344, u1344);
generate_conversion_tests!(U1536, u1536); generate_conversion_tests!(U1536, u1536);
@@ -599,6 +642,7 @@ mod tests {
generate_conversion_tests!(U2112, u2112); generate_conversion_tests!(U2112, u2112);
generate_conversion_tests!(U2176, u2176); generate_conversion_tests!(U2176, u2176);
generate_conversion_tests!(U2304, u2304); generate_conversion_tests!(U2304, u2304);
generate_conversion_tests!(U2432, u2432);
generate_conversion_tests!(U2560, u2560); generate_conversion_tests!(U2560, u2560);
generate_conversion_tests!(U3072, u3072); generate_conversion_tests!(U3072, u3072);
generate_conversion_tests!(U3136, u3136); generate_conversion_tests!(U3136, u3136);
@@ -645,11 +689,13 @@ mod tests {
generate_codec_tests!(U640, u640); generate_codec_tests!(U640, u640);
generate_codec_tests!(U704, u704); generate_codec_tests!(U704, u704);
generate_codec_tests!(U768, u768); generate_codec_tests!(U768, u768);
generate_codec_tests!(U832, u832);
generate_codec_tests!(U896, u896); generate_codec_tests!(U896, u896);
generate_codec_tests!(U960, u960); generate_codec_tests!(U960, u960);
generate_codec_tests!(U1024, u1024); generate_codec_tests!(U1024, u1024);
generate_codec_tests!(U1088, u1088); generate_codec_tests!(U1088, u1088);
generate_codec_tests!(U1152, u1152); generate_codec_tests!(U1152, u1152);
generate_codec_tests!(U1216, u1216);
generate_codec_tests!(U1280, u1280); generate_codec_tests!(U1280, u1280);
generate_codec_tests!(U1344, u1344); generate_codec_tests!(U1344, u1344);
generate_codec_tests!(U1536, u1536); generate_codec_tests!(U1536, u1536);
@@ -660,6 +706,7 @@ mod tests {
generate_codec_tests!(U2112, u2112); generate_codec_tests!(U2112, u2112);
generate_codec_tests!(U2176, u2176); generate_codec_tests!(U2176, u2176);
generate_codec_tests!(U2304, u2304); generate_codec_tests!(U2304, u2304);
generate_codec_tests!(U2432, u2432);
generate_codec_tests!(U2560, u2560); generate_codec_tests!(U2560, u2560);
generate_codec_tests!(U3072, u3072); generate_codec_tests!(U3072, u3072);
generate_codec_tests!(U3136, u3136); generate_codec_tests!(U3136, u3136);
@@ -709,11 +756,13 @@ mod tests {
generate_cmp_tests!(U640, u640); generate_cmp_tests!(U640, u640);
generate_cmp_tests!(U704, u704); generate_cmp_tests!(U704, u704);
generate_cmp_tests!(U768, u768); generate_cmp_tests!(U768, u768);
generate_cmp_tests!(U832, u832);
generate_cmp_tests!(U896, u896); generate_cmp_tests!(U896, u896);
generate_cmp_tests!(U960, u960); generate_cmp_tests!(U960, u960);
generate_cmp_tests!(U1024, u1024); generate_cmp_tests!(U1024, u1024);
generate_cmp_tests!(U1088, u1088); generate_cmp_tests!(U1088, u1088);
generate_cmp_tests!(U1152, u1152); generate_cmp_tests!(U1152, u1152);
generate_cmp_tests!(U1216, u1216);
generate_cmp_tests!(U1280, u1280); generate_cmp_tests!(U1280, u1280);
generate_cmp_tests!(U1344, u1344); generate_cmp_tests!(U1344, u1344);
generate_cmp_tests!(U1536, u1536); generate_cmp_tests!(U1536, u1536);
@@ -724,6 +773,7 @@ mod tests {
generate_cmp_tests!(U2112, u2112); generate_cmp_tests!(U2112, u2112);
generate_cmp_tests!(U2176, u2176); generate_cmp_tests!(U2176, u2176);
generate_cmp_tests!(U2304, u2304); generate_cmp_tests!(U2304, u2304);
generate_cmp_tests!(U2432, u2432);
generate_cmp_tests!(U2560, u2560); generate_cmp_tests!(U2560, u2560);
generate_cmp_tests!(U3072, u3072); generate_cmp_tests!(U3072, u3072);
generate_cmp_tests!(U3136, u3136); generate_cmp_tests!(U3136, u3136);
@@ -773,11 +823,13 @@ mod tests {
generate_sub_tests!(U640, u640); generate_sub_tests!(U640, u640);
generate_sub_tests!(U704, u704); generate_sub_tests!(U704, u704);
generate_sub_tests!(U768, u768); generate_sub_tests!(U768, u768);
generate_sub_tests!(U832, u832);
generate_sub_tests!(U896, u896); generate_sub_tests!(U896, u896);
generate_sub_tests!(U960, u960); generate_sub_tests!(U960, u960);
generate_sub_tests!(U1024, u1024); generate_sub_tests!(U1024, u1024);
generate_sub_tests!(U1088, u1088); generate_sub_tests!(U1088, u1088);
generate_sub_tests!(U1152, u1152); generate_sub_tests!(U1152, u1152);
generate_sub_tests!(U1216, u1216);
generate_sub_tests!(U1280, u1280); generate_sub_tests!(U1280, u1280);
generate_sub_tests!(U1344, u1344); generate_sub_tests!(U1344, u1344);
generate_sub_tests!(U1536, u1536); generate_sub_tests!(U1536, u1536);
@@ -788,6 +840,7 @@ mod tests {
generate_sub_tests!(U2112, u2112); generate_sub_tests!(U2112, u2112);
generate_sub_tests!(U2176, u2176); generate_sub_tests!(U2176, u2176);
generate_sub_tests!(U2304, u2304); generate_sub_tests!(U2304, u2304);
generate_sub_tests!(U2432, u2432);
generate_sub_tests!(U2560, u2560); generate_sub_tests!(U2560, u2560);
generate_sub_tests!(U3072, u3072); generate_sub_tests!(U3072, u3072);
generate_sub_tests!(U3136, u3136); generate_sub_tests!(U3136, u3136);
@@ -831,12 +884,16 @@ mod tests {
generate_shiftl_tests!(U256, u256); generate_shiftl_tests!(U256, u256);
generate_shiftl_tests!(U320, u320); generate_shiftl_tests!(U320, u320);
generate_shiftl_tests!(U384, u384); generate_shiftl_tests!(U384, u384);
generate_shiftl_tests!(U448, u448);
generate_shiftl_tests!(U512, u512); generate_shiftl_tests!(U512, u512);
generate_shiftl_tests!(U576, u576); generate_shiftl_tests!(U576, u576);
generate_shiftl_tests!(U640, u640); generate_shiftl_tests!(U640, u640);
generate_shiftl_tests!(U768, u768);
generate_shiftl_tests!(U896, u896);
generate_shiftl_tests!(U1024, u1024); generate_shiftl_tests!(U1024, u1024);
generate_shiftl_tests!(U1088, u1088); generate_shiftl_tests!(U1088, u1088);
generate_shiftl_tests!(U1152, u1152); generate_shiftl_tests!(U1152, u1152);
generate_shiftl_tests!(U1280, u1280);
generate_shiftl_tests!(U1536, u1536); generate_shiftl_tests!(U1536, u1536);
generate_shiftl_tests!(U1600, u1600); generate_shiftl_tests!(U1600, u1600);
generate_shiftl_tests!(U2048, u2048); generate_shiftl_tests!(U2048, u2048);
@@ -871,12 +928,16 @@ mod tests {
generate_shiftr_tests!(U256, u256); generate_shiftr_tests!(U256, u256);
generate_shiftr_tests!(U320, u320); generate_shiftr_tests!(U320, u320);
generate_shiftr_tests!(U384, u384); generate_shiftr_tests!(U384, u384);
generate_shiftr_tests!(U448, u448);
generate_shiftr_tests!(U512, u512); generate_shiftr_tests!(U512, u512);
generate_shiftr_tests!(U576, u576); generate_shiftr_tests!(U576, u576);
generate_shiftr_tests!(U640, u640); generate_shiftr_tests!(U640, u640);
generate_shiftr_tests!(U768, u768);
generate_shiftr_tests!(U896, u896);
generate_shiftr_tests!(U1024, u1024); generate_shiftr_tests!(U1024, u1024);
generate_shiftr_tests!(U1088, u1088); generate_shiftr_tests!(U1088, u1088);
generate_shiftr_tests!(U1152, u1152); generate_shiftr_tests!(U1152, u1152);
generate_shiftr_tests!(U1280, u1280);
generate_shiftr_tests!(U1536, u1536); generate_shiftr_tests!(U1536, u1536);
generate_shiftr_tests!(U1600, u1600); generate_shiftr_tests!(U1600, u1600);
generate_shiftr_tests!(U2048, u2048); generate_shiftr_tests!(U2048, u2048);
@@ -915,9 +976,13 @@ mod tests {
generate_add_tests!(U512, u512, U576); generate_add_tests!(U512, u512, U576);
generate_add_tests!(U576, u576, U640); generate_add_tests!(U576, u576, U640);
generate_add_tests!(U640, u640, U704); generate_add_tests!(U640, u640, U704);
generate_add_tests!(U768, u768, U832);
generate_add_tests!(U832, u832, U896);
generate_add_tests!(U896, u896, U960); generate_add_tests!(U896, u896, U960);
generate_add_tests!(U1024, u1024, U1088); generate_add_tests!(U1024, u1024, U1088);
generate_add_tests!(U1088, u1088, U1152); generate_add_tests!(U1088, u1088, U1152);
generate_add_tests!(U1152, u1152, U1216);
generate_add_tests!(U1216, u1216, U1280);
generate_add_tests!(U1280, u1280, U1344); generate_add_tests!(U1280, u1280, U1344);
generate_add_tests!(U1600, u1600, U1664); generate_add_tests!(U1600, u1600, U1664);
generate_add_tests!(U2048, u2048, U2112); generate_add_tests!(U2048, u2048, U2112);
@@ -946,10 +1011,13 @@ mod tests {
generate_mul_tests!(U512, u512, U1024); generate_mul_tests!(U512, u512, U1024);
generate_mul_tests!(U576, u576, U1152); generate_mul_tests!(U576, u576, U1152);
generate_mul_tests!(U640, u640, U1280); generate_mul_tests!(U640, u640, U1280);
generate_mul_tests!(U768, u768, U1536);
generate_mul_tests!(U832, u832, U1664);
generate_mul_tests!(U896, u896, U1792); generate_mul_tests!(U896, u896, U1792);
generate_mul_tests!(U1024, u1024, U2048); generate_mul_tests!(U1024, u1024, U2048);
generate_mul_tests!(U1088, u1088, U2176); generate_mul_tests!(U1088, u1088, U2176);
generate_mul_tests!(U1152, u1152, U2304); generate_mul_tests!(U1152, u1152, U2304);
generate_mul_tests!(U1216, u1216, U2432);
generate_mul_tests!(U1280, u1280, U2560); generate_mul_tests!(U1280, u1280, U2560);
generate_mul_tests!(U1536, u1536, U3072); generate_mul_tests!(U1536, u1536, U3072);
generate_mul_tests!(U1600, u1600, U3200); generate_mul_tests!(U1600, u1600, U3200);
@@ -986,10 +1054,13 @@ mod tests {
generate_div_tests!(U512, u512); generate_div_tests!(U512, u512);
generate_div_tests!(U576, u576); generate_div_tests!(U576, u576);
generate_div_tests!(U640, u640); generate_div_tests!(U640, u640);
generate_div_tests!(U768, u768);
generate_div_tests!(U832, u832);
generate_div_tests!(U896, u896); generate_div_tests!(U896, u896);
generate_div_tests!(U1024, u1024); generate_div_tests!(U1024, u1024);
generate_div_tests!(U1088, u1088); generate_div_tests!(U1088, u1088);
generate_div_tests!(U1152, u1152); generate_div_tests!(U1152, u1152);
generate_div_tests!(U1216, u1216);
generate_div_tests!(U1280, u1280); generate_div_tests!(U1280, u1280);
generate_div_tests!(U1536, u1536); generate_div_tests!(U1536, u1536);
generate_div_tests!(U2048, u2048); generate_div_tests!(U2048, u2048);
@@ -1019,7 +1090,9 @@ mod tests {
generate_barrett_gen_tests!(U192, u192, U256); generate_barrett_gen_tests!(U192, u192, U256);
generate_barrett_gen_tests!(U256, u256, U320); generate_barrett_gen_tests!(U256, u256, U320);
generate_barrett_gen_tests!(U384, u384, U448);
generate_barrett_gen_tests!(U512, u512, U576); generate_barrett_gen_tests!(U512, u512, U576);
generate_barrett_gen_tests!(U576, u576, U640);
generate_barrett_gen_tests!(U1024, u1024, U1088); generate_barrett_gen_tests!(U1024, u1024, U1088);
generate_barrett_gen_tests!(U1536, u1536, U1600); generate_barrett_gen_tests!(U1536, u1536, U1600);
generate_barrett_gen_tests!(ignore U2048, u2048, U2112); generate_barrett_gen_tests!(ignore U2048, u2048, U2112);
@@ -1035,7 +1108,9 @@ mod tests {
generate_barrett_red_tests!(U192, u192, U256, U384); generate_barrett_red_tests!(U192, u192, U256, U384);
generate_barrett_red_tests!(U256, u256, U320, U512); generate_barrett_red_tests!(U256, u256, U320, U512);
generate_barrett_red_tests!(U384, u384, U448, U768);
generate_barrett_red_tests!(U512, u512, U576, U1024); generate_barrett_red_tests!(U512, u512, U576, U1024);
generate_barrett_red_tests!(U576, u576, U640, U1152);
generate_barrett_red_tests!(U1024, u1024, U1088, U2048); generate_barrett_red_tests!(U1024, u1024, U1088, U2048);
generate_barrett_red_tests!(U1536, u1536, U1600, U3072); generate_barrett_red_tests!(U1536, u1536, U1600, U3072);
generate_barrett_red_tests!(U2048, u2048, U2112, U4096); generate_barrett_red_tests!(U2048, u2048, U2112, U4096);

View File

@@ -102,6 +102,7 @@ main = do
SignedMul -> hPutStrLn hndl ("mul_impls!(I" ++ show size ++ ", I" ++ show (size * 2) ++ ");") SignedMul -> hPutStrLn hndl ("mul_impls!(I" ++ show size ++ ", I" ++ show (size * 2) ++ ");")
SignedDiv -> hPutStrLn hndl ("div_impls!(I" ++ show size ++ ", U" ++ show size ++ ");") SignedDiv -> hPutStrLn hndl ("div_impls!(I" ++ show size ++ ", U" ++ show size ++ ");")
EGCD -> hPutStrLn hndl ("egcd_impls!(I" ++ show (size + 64) ++ ", U" ++ show size ++ ", I" ++ show size ++ ");") EGCD -> hPutStrLn hndl ("egcd_impls!(I" ++ show (size + 64) ++ ", U" ++ show size ++ ", I" ++ show size ++ ");")
ModDiv -> hPutStrLn hndl ("moddiv_impls!(I" ++ show size ++ ", I" ++ show (size * 2) ++ ");")
ModInv -> hPutStrLn hndl ("modinv_impls!(U" ++ show size ++ ", I" ++ show (size + 64) ++ ", U" ++ show (size + 64) ++ ");") ModInv -> hPutStrLn hndl ("modinv_impls!(U" ++ show size ++ ", I" ++ show (size + 64) ++ ", U" ++ show (size + 64) ++ ");")
SigConvert v -> hPutStrLn hndl ("conversion_impls!(I" ++ show size ++ ", U" ++ show size ++ ", I" ++ show v ++ ", U" ++ show v ++ ");") SigConvert v -> hPutStrLn hndl ("conversion_impls!(I" ++ show size ++ ", U" ++ show size ++ ", I" ++ show v ++ ", U" ++ show v ++ ");")
_ -> return () _ -> return ()
@@ -118,5 +119,6 @@ main = do
generateSigTestBlock hndl "sigshiftl" SignedShift True 16384 [] [] generateSigTestBlock hndl "sigshiftl" SignedShift True 16384 [] []
generateSigTestBlock hndl "sigshiftr" SignedShift True 16384 [] [] generateSigTestBlock hndl "sigshiftr" SignedShift True 16384 [] []
generateSigTestBlock hndl "egcd" EGCD True 1024 [(+ 64)] [(+ 64)] generateSigTestBlock hndl "egcd" EGCD True 1024 [(+ 64)] [(+ 64)]
generateSigTestBlock hndl "moddiv" ModDiv True 2048 [] []
generateSigTestBlock hndl "modinv" ModInv True 2048 [] [] generateSigTestBlock hndl "modinv" ModInv True 2048 [] []
hPutStrLn hndl "}" hPutStrLn hndl "}"

View File

@@ -4,11 +4,13 @@ module Math(
, barrett, computeK, base , barrett, computeK, base
, modulate, modulate' , modulate, modulate'
, isqrt , isqrt
, divmod
, showX, showB , showX, showB
) )
where where
import Data.Bits(shiftL,shiftR) import Data.Bits(shiftL,shiftR)
import GHC.Integer.GMP.Internals(recipModInteger)
import Numeric(showHex) import Numeric(showHex)
data AlgState = AlgState { data AlgState = AlgState {
@@ -122,6 +124,13 @@ isqrt bits val = final
| num >= (res + bit) = (num - (res + bit), res + (bit `shiftL` 1)) | num >= (res + bit) = (num - (res + bit), res + (bit `shiftL` 1))
| otherwise = (num, res) | otherwise = (num, res)
divmod :: Integer -> Integer -> Integer -> Maybe Integer
divmod x y m =
let y' = y `mod` m
in case recipModInteger y' m of
0 -> Nothing
i -> Just ((x * i) `mod` m)
_run :: Integer -> Integer -> IO () _run :: Integer -> Integer -> IO ()
_run inputx inputy = _run inputx inputy =
do let (x, y, g, initState) = initialState inputx inputy 1 do let (x, y, g, initState) = initialState inputx inputy 1

View File

@@ -11,6 +11,7 @@ data Operation = Add
| BaseOps | BaseOps
| Barretts | Barretts
| Div | Div
| ModDiv
| ModExp | ModExp
| ModMul | ModMul
| ModSq | ModSq
@@ -64,6 +65,7 @@ needs = [ Need RSA (\ size -> [Req (size `div` 2) Sub,
Req size (Convert (((size * 2) + 64) * 2)) Req size (Convert (((size * 2) + 64) * 2))
]) ])
, Need ECDSA (\ size -> [Req size SignedSub, , Need ECDSA (\ size -> [Req size SignedSub,
Req size ModDiv,
Req (size + 64) SignedMul, Req (size + 64) SignedMul,
Req ((size + 64) * 2) SignedSub, Req ((size + 64) * 2) SignedSub,
Req ((size + 64) * 2) SignedDiv, Req ((size + 64) * 2) SignedDiv,
@@ -117,6 +119,12 @@ needs = [ Need RSA (\ size -> [Req (size `div` 2) Sub,
Req size Mul, Req size Mul,
Req size (Convert (size + 64)) Req size (Convert (size + 64))
]) ])
, Need ModDiv (\ size -> [Req size ModInv,
Req size SignedMul,
Req size SignedDiv,
Req (size * 2) SignedDiv,
Req size (SigConvert (size * 2))
])
, Need ModSq (\ size -> [Req size BaseOps, , Need ModSq (\ size -> [Req size BaseOps,
Req (size * 2) BaseOps, Req (size * 2) BaseOps,
Req size Barretts, Req size Barretts,
@@ -160,7 +168,8 @@ needs = [ Need RSA (\ size -> [Req (size `div` 2) Sub,
Req (size * 2) SignedBase, Req (size * 2) SignedBase,
Req size (SigConvert (size * 2)) Req size (SigConvert (size * 2))
]) ])
, Need SignedDiv (\ size -> [Req size Div , Need SignedDiv (\ size -> [Req size Div,
Req size Add
]) ])
, Need EGCD (\ size -> [Req size SignedBase, , Need EGCD (\ size -> [Req size SignedBase,
Req size BaseOps, Req size BaseOps,

View File

@@ -43,6 +43,7 @@ testDatabase = [
(SignedSub, "sigsub", "signed subtraction", sigsubTest), (SignedSub, "sigsub", "signed subtraction", sigsubTest),
(SquareRoot, "sqrt", "square root", sqrtTest), (SquareRoot, "sqrt", "square root", sqrtTest),
(EGCD, "egcd", "EGCD", egcdTest), (EGCD, "egcd", "EGCD", egcdTest),
(ModDiv, "moddiv", "modular division", moddivTest),
(ModInv, "modinv", "modular inversion", modinvTest) (ModInv, "modinv", "modular inversion", modinvTest)
] ]
@@ -278,6 +279,22 @@ egcdTest size memory0 =
("v", showX v)] ("v", showX v)]
in assert (v == gcd x y) (res, v, memory2) in assert (v == gcd x y) (res, v, memory2)
moddivTest :: Test
moddivTest size memoryIn =
let attempt memory0 =
let (a, memory1) = genSign (generateNum memory0 "a" size)
(b, memory2) = generateNum memory1 "b" size
(m, memory3) = generateNum memory2 "m" size
maybe_res = divmod a b m
in case maybe_res of
Nothing ->
attempt memory3
Just c ->
let res = Map.fromList [("a", showX a), ("b", showX b),
("m", showX m), ("c", showX c)]
in (res, c, memory3)
in attempt memoryIn
modinvTest :: Test modinvTest :: Test
modinvTest size memoryIn = modinvTest size memoryIn =
let attempt memory0 = let attempt memory0 =

3003
testdata/add/00768.test vendored Normal file

File diff suppressed because it is too large Load Diff

3003
testdata/add/00832.test vendored Normal file

File diff suppressed because it is too large Load Diff

3003
testdata/add/01152.test vendored Normal file

File diff suppressed because it is too large Load Diff

3003
testdata/add/01216.test vendored Normal file

File diff suppressed because it is too large Load Diff

3003
testdata/barrett_gen/00384.test vendored Normal file

File diff suppressed because it is too large Load Diff

3003
testdata/barrett_gen/00576.test vendored Normal file

File diff suppressed because it is too large Load Diff

5005
testdata/barrett_reduce/00384.test vendored Normal file

File diff suppressed because it is too large Load Diff

5005
testdata/barrett_reduce/00576.test vendored Normal file

File diff suppressed because it is too large Load Diff

8008
testdata/base/00832.test vendored Normal file

File diff suppressed because it is too large Load Diff

8008
testdata/base/01216.test vendored Normal file

File diff suppressed because it is too large Load Diff

8008
testdata/base/02432.test vendored Normal file

File diff suppressed because it is too large Load Diff

5005
testdata/cmp/00832.test vendored Normal file

File diff suppressed because it is too large Load Diff

5005
testdata/cmp/01216.test vendored Normal file

File diff suppressed because it is too large Load Diff

5005
testdata/cmp/02432.test vendored Normal file

File diff suppressed because it is too large Load Diff

4004
testdata/div/00768.test vendored Normal file

File diff suppressed because it is too large Load Diff

4004
testdata/div/00832.test vendored Normal file

File diff suppressed because it is too large Load Diff

4004
testdata/div/01216.test vendored Normal file

File diff suppressed because it is too large Load Diff

5005
testdata/egcd/00384.test vendored Normal file

File diff suppressed because it is too large Load Diff

5005
testdata/egcd/00576.test vendored Normal file

File diff suppressed because it is too large Load Diff

4004
testdata/moddiv/00192.test vendored Normal file

File diff suppressed because it is too large Load Diff

4004
testdata/moddiv/00256.test vendored Normal file

File diff suppressed because it is too large Load Diff

4004
testdata/moddiv/00384.test vendored Normal file

File diff suppressed because it is too large Load Diff

4004
testdata/moddiv/00576.test vendored Normal file

File diff suppressed because it is too large Load Diff

3003
testdata/modinv/00384.test vendored Normal file

File diff suppressed because it is too large Load Diff

3003
testdata/modinv/00576.test vendored Normal file

File diff suppressed because it is too large Load Diff

3003
testdata/mul/00768.test vendored Normal file

File diff suppressed because it is too large Load Diff

3003
testdata/mul/00832.test vendored Normal file

File diff suppressed because it is too large Load Diff

3003
testdata/mul/01216.test vendored Normal file

File diff suppressed because it is too large Load Diff

3003
testdata/shiftl/00448.test vendored Normal file

File diff suppressed because it is too large Load Diff

3003
testdata/shiftl/00768.test vendored Normal file

File diff suppressed because it is too large Load Diff

3003
testdata/shiftl/00896.test vendored Normal file

File diff suppressed because it is too large Load Diff

3003
testdata/shiftl/01280.test vendored Normal file

File diff suppressed because it is too large Load Diff

3003
testdata/shiftr/00448.test vendored Normal file

File diff suppressed because it is too large Load Diff

3003
testdata/shiftr/00768.test vendored Normal file

File diff suppressed because it is too large Load Diff

3003
testdata/shiftr/00896.test vendored Normal file

File diff suppressed because it is too large Load Diff

3003
testdata/shiftr/01280.test vendored Normal file

File diff suppressed because it is too large Load Diff

3003
testdata/sigadd/00448.test vendored Normal file

File diff suppressed because it is too large Load Diff

3003
testdata/sigadd/00640.test vendored Normal file

File diff suppressed because it is too large Load Diff

5005
testdata/sigcmp/00448.test vendored Normal file

File diff suppressed because it is too large Load Diff

5005
testdata/sigcmp/00640.test vendored Normal file

File diff suppressed because it is too large Load Diff

4004
testdata/sigdiv/00192.test vendored Normal file

File diff suppressed because it is too large Load Diff

4004
testdata/sigdiv/00256.test vendored Normal file

File diff suppressed because it is too large Load Diff

4004
testdata/sigdiv/00384.test vendored Normal file

File diff suppressed because it is too large Load Diff

4004
testdata/sigdiv/00576.test vendored Normal file

File diff suppressed because it is too large Load Diff

4004
testdata/sigdiv/00768.test vendored Normal file

File diff suppressed because it is too large Load Diff

4004
testdata/sigdiv/01152.test vendored Normal file

File diff suppressed because it is too large Load Diff

3003
testdata/sigmul/00192.test vendored Normal file

File diff suppressed because it is too large Load Diff

3003
testdata/sigmul/00384.test vendored Normal file

File diff suppressed because it is too large Load Diff

3003
testdata/sigmul/00576.test vendored Normal file

File diff suppressed because it is too large Load Diff

4004
testdata/signed/00768.test vendored Normal file

File diff suppressed because it is too large Load Diff

3003
testdata/sigshiftl/00448.test vendored Normal file

File diff suppressed because it is too large Load Diff

3003
testdata/sigshiftl/00640.test vendored Normal file

File diff suppressed because it is too large Load Diff

3003
testdata/sigshiftr/00448.test vendored Normal file

File diff suppressed because it is too large Load Diff

3003
testdata/sigshiftr/00640.test vendored Normal file

File diff suppressed because it is too large Load Diff

3003
testdata/sigsub/00448.test vendored Normal file

File diff suppressed because it is too large Load Diff

3003
testdata/sub/00832.test vendored Normal file

File diff suppressed because it is too large Load Diff

3003
testdata/sub/01216.test vendored Normal file

File diff suppressed because it is too large Load Diff

3003
testdata/sub/02432.test vendored Normal file

File diff suppressed because it is too large Load Diff