54 lines
1.5 KiB
Rust
54 lines
1.5 KiB
Rust
//! Scalar types.
|
|
|
|
#[cfg(feature = "arithmetic")]
|
|
mod blinded;
|
|
#[cfg(feature = "arithmetic")]
|
|
mod nonzero;
|
|
mod primitive;
|
|
|
|
pub use self::primitive::ScalarPrimitive;
|
|
#[cfg(feature = "arithmetic")]
|
|
pub use self::{blinded::BlindedScalar, nonzero::NonZeroScalar};
|
|
|
|
use crypto_bigint::Integer;
|
|
use subtle::Choice;
|
|
|
|
#[cfg(feature = "arithmetic")]
|
|
use crate::CurveArithmetic;
|
|
|
|
/// Scalar field element for a particular elliptic curve.
|
|
#[cfg(feature = "arithmetic")]
|
|
pub type Scalar<C> = <C as CurveArithmetic>::Scalar;
|
|
|
|
/// Bit representation of a scalar field element of a given curve.
|
|
#[cfg(feature = "bits")]
|
|
pub type ScalarBits<C> = ff::FieldBits<<Scalar<C> as ff::PrimeFieldBits>::ReprBits>;
|
|
|
|
/// Instantiate a scalar from an unsigned integer without checking for overflow.
|
|
pub trait FromUintUnchecked {
|
|
/// Unsigned integer type (i.e. `Curve::Uint`)
|
|
type Uint: Integer;
|
|
|
|
/// Instantiate scalar from an unsigned integer without checking
|
|
/// whether the value overflows the field modulus.
|
|
///
|
|
/// ⚠️ WARNING!
|
|
///
|
|
/// Incorrectly used this can lead to mathematically invalid results,
|
|
/// which can lead to potential security vulnerabilities.
|
|
///
|
|
/// Use with care!
|
|
fn from_uint_unchecked(uint: Self::Uint) -> Self;
|
|
}
|
|
|
|
/// Is this scalar greater than n / 2?
|
|
///
|
|
/// # Returns
|
|
///
|
|
/// - For scalars 0 through n / 2: `Choice::from(0)`
|
|
/// - For scalars (n / 2) + 1 through n - 1: `Choice::from(1)`
|
|
pub trait IsHigh {
|
|
/// Is this scalar greater than or equal to n / 2?
|
|
fn is_high(&self) -> Choice;
|
|
}
|