Define a ModInv trait, and clean up some lingering warnings.
This commit is contained in:
@@ -202,6 +202,7 @@ declareSafeSignedAddOperators bitsize _ =
|
|||||||
testFileLit = Lit [] (Str (testFile False bitsize) Cooked Unsuffixed mempty) mempty
|
testFileLit = Lit [] (Str (testFile False bitsize) Cooked Unsuffixed mempty) mempty
|
||||||
in [sourceFile|
|
in [sourceFile|
|
||||||
use core::ops::Add;
|
use core::ops::Add;
|
||||||
|
#[cfg(test)]
|
||||||
use crate::CryptoNum;
|
use crate::CryptoNum;
|
||||||
#[cfg(test)]
|
#[cfg(test)]
|
||||||
use crate::testing::{build_test_path,run_test};
|
use crate::testing::{build_test_path,run_test};
|
||||||
|
|||||||
@@ -36,13 +36,15 @@ declareModInv bitsize _ =
|
|||||||
testFileLit = Lit [] (Str (testFile True bitsize) Cooked Unsuffixed mempty) mempty
|
testFileLit = Lit [] (Str (testFile True bitsize) Cooked Unsuffixed mempty) mempty
|
||||||
in [sourceFile|
|
in [sourceFile|
|
||||||
use core::convert::TryFrom;
|
use core::convert::TryFrom;
|
||||||
use crate::CryptoNum;
|
use crate::{CryptoNum,ModularInversion};
|
||||||
use crate::signed::$$sname;
|
use crate::signed::$$sname;
|
||||||
#[cfg(test)]
|
#[cfg(test)]
|
||||||
use crate::testing::{build_test_path,run_test};
|
use crate::testing::{build_test_path,run_test};
|
||||||
use crate::unsigned::$$uname;
|
use crate::unsigned::$$uname;
|
||||||
|
|
||||||
impl $$uname {
|
impl ModularInversion for $$uname {
|
||||||
|
type Signed = $$sname;
|
||||||
|
|
||||||
fn modinv(&self, phi: &$$uname) -> Option<$$uname>
|
fn modinv(&self, phi: &$$uname) -> Option<$$uname>
|
||||||
{
|
{
|
||||||
let (_, mut b, g) = phi.egcd(&self);
|
let (_, mut b, g) = phi.egcd(&self);
|
||||||
|
|||||||
@@ -133,6 +133,7 @@ declareSafeSignedSubtractOperators bitsize _ =
|
|||||||
testFileLit = Lit [] (Str (testFile True bitsize) Cooked Unsuffixed mempty) mempty
|
testFileLit = Lit [] (Str (testFile True bitsize) Cooked Unsuffixed mempty) mempty
|
||||||
in [sourceFile|
|
in [sourceFile|
|
||||||
use core::ops::Sub;
|
use core::ops::Sub;
|
||||||
|
#[cfg(test)]
|
||||||
use crate::CryptoNum;
|
use crate::CryptoNum;
|
||||||
#[cfg(test)]
|
#[cfg(test)]
|
||||||
use crate::testing::{build_test_path,run_test};
|
use crate::testing::{build_test_path,run_test};
|
||||||
|
|||||||
18
src/lib.rs
18
src/lib.rs
@@ -52,8 +52,10 @@ pub trait DivMod: Sized {
|
|||||||
fn divmod(&self, rhs: &Self) -> (Self, Self);
|
fn divmod(&self, rhs: &Self) -> (Self, Self);
|
||||||
}
|
}
|
||||||
|
|
||||||
// Provides support for a variety of modular mathematical operations, as beloved
|
/// Provides support for a variety of modular mathematical operations, as beloved
|
||||||
// by cryptographers.
|
/// by cryptographers. Note that modular inversion and GCD calculations are shoved
|
||||||
|
/// off into another trait, because they operate on slightly different number
|
||||||
|
/// types.
|
||||||
pub trait ModularOperations<Modulus=Self> {
|
pub trait ModularOperations<Modulus=Self> {
|
||||||
// reduce the current value by the provided modulus
|
// reduce the current value by the provided modulus
|
||||||
fn reduce(&self, m: &Modulus) -> Self;
|
fn reduce(&self, m: &Modulus) -> Self;
|
||||||
@@ -66,6 +68,18 @@ pub trait ModularOperations<Modulus=Self> {
|
|||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// Provide support for modular inversion and GCD operations, which are useful
|
||||||
|
/// here and there. We provide default implementations for `modinv` and
|
||||||
|
/// `gcd_is_one`, based on the implementation of `egcd`. The built-in versions
|
||||||
|
/// explicitly define the latter, though, to improve performance.
|
||||||
|
pub trait ModularInversion: Sized {
|
||||||
|
type Signed;
|
||||||
|
|
||||||
|
fn modinv(&self, phi: &Self) -> Option<Self>;
|
||||||
|
fn egcd(&self, rhs: &Self) -> (Self::Signed, Self::Signed, Self::Signed);
|
||||||
|
fn gcd_is_one(&self, b: &Self) -> bool;
|
||||||
|
}
|
||||||
|
|
||||||
/// An error in conversion of large numbers (either to primitives or to other numbers
|
/// An error in conversion of large numbers (either to primitives or to other numbers
|
||||||
#[derive(Debug)]
|
#[derive(Debug)]
|
||||||
pub enum ConversionError {
|
pub enum ConversionError {
|
||||||
|
|||||||
Reference in New Issue
Block a user