pub trait Field:
Sized
+ Eq
+ Copy
+ Clone
+ Default
+ Send
+ Sync
+ Debug
+ 'static
+ ConditionallySelectable
+ ConstantTimeEq
+ Neg<Output = Self>
+ Add<Output = Self, Output = Self>
+ Sub<Output = Self, Output = Self>
+ Mul<Output = Self, Output = Self>
+ Sum
+ Product
+ for<'a> Add<&'a Self>
+ for<'a> Sub<&'a Self>
+ for<'a> Mul<&'a Self>
+ for<'a> Sum<&'a Self>
+ for<'a> Product<&'a Self>
+ AddAssign
+ SubAssign
+ MulAssign
+ for<'a> AddAssign<&'a Self>
+ for<'a> SubAssign<&'a Self>
+ for<'a> MulAssign<&'a Self> {
const ZERO: Self;
const ONE: Self;
// Required methods
fn random(rng: impl RngCore) -> Self;
fn square(&self) -> Self;
fn double(&self) -> Self;
fn invert(&self) -> CtOption<Self>;
fn sqrt_ratio(num: &Self, div: &Self) -> (Choice, Self);
// Provided methods
fn is_zero(&self) -> Choice { ... }
fn is_zero_vartime(&self) -> bool { ... }
fn cube(&self) -> Self { ... }
fn sqrt_alt(&self) -> (Choice, Self) { ... }
fn sqrt(&self) -> CtOption<Self> { ... }
fn pow<S>(&self, exp: S) -> Self
where S: AsRef<[u64]> { ... }
fn pow_vartime<S>(&self, exp: S) -> Self
where S: AsRef<[u64]> { ... }
}
Expand description
This trait represents an element of a field.
Required Associated Constants§
Required Methods§
Sourcefn random(rng: impl RngCore) -> Self
fn random(rng: impl RngCore) -> Self
Returns an element chosen uniformly at random using a user-provided RNG.
Sourcefn invert(&self) -> CtOption<Self>
fn invert(&self) -> CtOption<Self>
Computes the multiplicative inverse of this element, failing if the element is zero.
Sourcefn sqrt_ratio(num: &Self, div: &Self) -> (Choice, Self)
fn sqrt_ratio(num: &Self, div: &Self) -> (Choice, Self)
Computes:
- $(\textsf{true}, \sqrt{\textsf{num}/\textsf{div}})$, if $\textsf{num}$ and $\textsf{div}$ are nonzero and $\textsf{num}/\textsf{div}$ is a square in the field;
- $(\textsf{true}, 0)$, if $\textsf{num}$ is zero;
- $(\textsf{false}, 0)$, if $\textsf{num}$ is nonzero and $\textsf{div}$ is zero;
- $(\textsf{false}, \sqrt{G_S \cdot \textsf{num}/\textsf{div}})$, if $\textsf{num}$ and $\textsf{div}$ are nonzero and $\textsf{num}/\textsf{div}$ is a nonsquare in the field;
where $G_S$ is a non-square.
§Warnings
- The choice of root from
sqrt
is unspecified. - The value of $G_S$ is unspecified, and cannot be assumed to have any specific value in a generic context.
Provided Methods§
Sourcefn is_zero_vartime(&self) -> bool
fn is_zero_vartime(&self) -> bool
Returns true iff this element is zero.
§Security
This method provides no constant-time guarantees. Implementors of the
Field
trait may optimise this method using non-constant-time logic.
Sourcefn sqrt_alt(&self) -> (Choice, Self)
fn sqrt_alt(&self) -> (Choice, Self)
Equivalent to Self::sqrt_ratio(self, one())
.
The provided method is implemented in terms of Self::sqrt_ratio
.
Sourcefn sqrt(&self) -> CtOption<Self>
fn sqrt(&self) -> CtOption<Self>
Returns the square root of the field element, if it is quadratic residue.
The provided method is implemented in terms of Self::sqrt_ratio
.
Sourcefn pow<S>(&self, exp: S) -> Self
fn pow<S>(&self, exp: S) -> Self
Exponentiates self
by exp
, where exp
is a little-endian order integer
exponent.
§Guarantees
This operation is constant time with respect to self
, for all exponents with the
same number of digits (exp.as_ref().len()
). It is variable time with respect to
the number of digits in the exponent.
Sourcefn pow_vartime<S>(&self, exp: S) -> Self
fn pow_vartime<S>(&self, exp: S) -> Self
Exponentiates self
by exp
, where exp
is a little-endian order integer
exponent.
§Guarantees
This operation is variable time with respect to self
, for all exponent. If
the exponent is fixed, this operation is effectively constant time. However, for
stronger constant-time guarantees, Field::pow
should be used.
Dyn Compatibility§
This trait is not dyn compatible.
In older versions of Rust, dyn compatibility was called "object safety", so this trait is not object safe.
Implementations on Foreign Types§
Source§impl Field for Fp2
impl Field for Fp2
const ZERO: Fp2 = _
const ONE: Fp2 = _
fn random(rng: impl RngCore) -> Fp2
fn is_zero(&self) -> Choice
fn square(&self) -> Fp2
fn double(&self) -> Fp2
fn sqrt(&self) -> CtOption<Fp2>
fn invert(&self) -> CtOption<Fp2>
fn sqrt_ratio(num: &Fp2, div: &Fp2) -> (Choice, Fp2)
Source§impl Field for Fp12
impl Field for Fp12
const ZERO: Fp12 = _
const ONE: Fp12 = _
fn random(rng: impl RngCore) -> Fp12
fn is_zero(&self) -> Choice
fn square(&self) -> Fp12
fn double(&self) -> Fp12
fn sqrt(&self) -> CtOption<Fp12>
fn invert(&self) -> CtOption<Fp12>
fn sqrt_ratio(_num: &Fp12, _div: &Fp12) -> (Choice, Fp12)
Source§impl Field for Scalar
impl Field for Scalar
const ZERO: Scalar = _
const ONE: Scalar = _
fn random(rng: impl RngCore) -> Scalar
fn square(&self) -> Scalar
fn double(&self) -> Scalar
fn invert(&self) -> CtOption<Scalar>
fn sqrt_ratio(num: &Scalar, div: &Scalar) -> (Choice, Scalar)
fn sqrt(&self) -> CtOption<Scalar>
fn is_zero_vartime(&self) -> bool
Source§impl Field for Fq2
impl Field for Fq2
const ZERO: Fq2 = _
const ONE: Fq2 = _
fn random(rng: impl RngCore) -> Fq2
fn is_zero(&self) -> Choice
fn square(&self) -> Fq2
fn double(&self) -> Fq2
fn sqrt(&self) -> CtOption<Fq2>
fn sqrt_ratio(num: &Fq2, div: &Fq2) -> (Choice, Fq2)
fn invert(&self) -> CtOption<Fq2>
Source§impl Field for Fq6
impl Field for Fq6
const ZERO: Fq6 = _
const ONE: Fq6 = _
fn random(rng: impl RngCore) -> Fq6
fn is_zero(&self) -> Choice
fn square(&self) -> Fq6
fn double(&self) -> Fq6
fn sqrt(&self) -> CtOption<Fq6>
fn sqrt_ratio(_num: &Fq6, _div: &Fq6) -> (Choice, Fq6)
fn invert(&self) -> CtOption<Fq6>
Source§impl Field for Fq12
impl Field for Fq12
const ZERO: Fq12 = _
const ONE: Fq12 = _
fn random(rng: impl RngCore) -> Fq12
fn is_zero(&self) -> Choice
fn square(&self) -> Fq12
fn double(&self) -> Fq12
fn sqrt(&self) -> CtOption<Fq12>
fn sqrt_ratio(_num: &Fq12, _div: &Fq12) -> (Choice, Fq12)
fn invert(&self) -> CtOption<Fq12>
Source§impl Field for Fq
impl Field for Fq
Source§fn invert(&self) -> CtOption<Fq>
fn invert(&self) -> CtOption<Fq>
Returns the multiplicative inverse of the element. If it is zero, the method fails.
const ZERO: Fq = _
const ONE: Fq = _
fn random(rng: impl RngCore) -> Fq
fn double(&self) -> Fq
fn square(&self) -> Fq
fn sqrt_ratio(num: &Fq, div: &Fq) -> (Choice, Fq)
Source§impl Field for Fr
impl Field for Fr
Source§fn invert(&self) -> CtOption<Fr>
fn invert(&self) -> CtOption<Fr>
Returns the multiplicative inverse of the element. If it is zero, the method fails.
const ZERO: Fr = _
const ONE: Fr = _
fn random(rng: impl RngCore) -> Fr
fn double(&self) -> Fr
fn square(&self) -> Fr
fn sqrt(&self) -> CtOption<Fr>
fn sqrt_ratio(num: &Fr, div: &Fr) -> (Choice, Fr)
Source§impl Field for Fq
impl Field for Fq
Source§fn invert(&self) -> CtOption<Fq>
fn invert(&self) -> CtOption<Fq>
Computes the multiplicative inverse of this element, failing if the element is zero.
const ZERO: Fq = _
const ONE: Fq = _
fn random(rng: impl RngCore) -> Fq
fn double(&self) -> Fq
fn square(&self) -> Fq
fn sqrt_ratio(num: &Fq, div: &Fq) -> (Choice, Fq)
fn pow_vartime<S>(&self, exp: S) -> Fq
Source§impl Field for Fr
impl Field for Fr
Source§fn invert(&self) -> CtOption<Fr>
fn invert(&self) -> CtOption<Fr>
Computes the multiplicative inverse of this element, failing if the element is zero.
const ZERO: Fr = _
const ONE: Fr = _
fn random(rng: impl RngCore) -> Fr
fn double(&self) -> Fr
fn square(&self) -> Fr
fn sqrt_ratio(num: &Fr, div: &Fr) -> (Choice, Fr)
fn pow_vartime<S>(&self, exp: S) -> Fr
Source§impl Field for Fp
impl Field for Fp
Source§fn invert(&self) -> CtOption<Fp>
fn invert(&self) -> CtOption<Fp>
Computes the multiplicative inverse of this element, failing if the element is zero.
const ZERO: Fp = _
const ONE: Fp = _
fn random(rng: impl RngCore) -> Fp
fn double(&self) -> Fp
fn square(&self) -> Fp
fn sqrt(&self) -> CtOption<Fp>
fn sqrt_ratio(num: &Fp, div: &Fp) -> (Choice, Fp)
Source§impl Field for Fq
impl Field for Fq
Source§fn invert(&self) -> CtOption<Fq>
fn invert(&self) -> CtOption<Fq>
Computes the multiplicative inverse of this element, failing if the element is zero.
const ZERO: Fq = _
const ONE: Fq = _
fn random(rng: impl RngCore) -> Fq
fn double(&self) -> Fq
fn square(&self) -> Fq
fn sqrt(&self) -> CtOption<Fq>
fn sqrt_ratio(num: &Fq, div: &Fq) -> (Choice, Fq)
Source§impl Field for Fp
impl Field for Fp
Source§fn invert(&self) -> CtOption<Fp>
fn invert(&self) -> CtOption<Fp>
Returns the multiplicative inverse of the element. If it is zero, the method fails.
const ZERO: Fp = _
const ONE: Fp = _
fn random(rng: impl RngCore) -> Fp
fn double(&self) -> Fp
fn square(&self) -> Fp
fn pow_vartime<S>(&self, exp: S) -> Fp
fn sqrt_ratio(num: &Fp, div: &Fp) -> (Choice, Fp)
Source§impl Field for Fq
impl Field for Fq
Source§fn invert(&self) -> CtOption<Fq>
fn invert(&self) -> CtOption<Fq>
Returns the multiplicative inverse of the element. If it is zero, the method fails.
const ZERO: Fq = _
const ONE: Fq = _
fn random(rng: impl RngCore) -> Fq
fn double(&self) -> Fq
fn square(&self) -> Fq
fn pow_vartime<S>(&self, exp: S) -> Fq
fn sqrt(&self) -> CtOption<Fq>
fn sqrt_ratio(num: &Fq, div: &Fq) -> (Choice, Fq)
Source§impl Field for Fp
impl Field for Fp
Source§fn invert(&self) -> CtOption<Fp>
fn invert(&self) -> CtOption<Fp>
Returns the multiplicative inverse of the element. If it is zero, the method fails.
const ZERO: Fp = _
const ONE: Fp = _
fn random(rng: impl RngCore) -> Fp
fn double(&self) -> Fp
fn square(&self) -> Fp
fn pow_vartime<S>(&self, exp: S) -> Fp
fn sqrt_ratio(num: &Fp, div: &Fp) -> (Choice, Fp)
Source§impl Field for Fq
impl Field for Fq
Source§fn invert(&self) -> CtOption<Fq>
fn invert(&self) -> CtOption<Fq>
Returns the multiplicative inverse of the element. If it is zero, the method fails.
const ZERO: Fq = _
const ONE: Fq = _
fn random(rng: impl RngCore) -> Fq
fn double(&self) -> Fq
fn square(&self) -> Fq
fn pow_vartime<S>(&self, exp: S) -> Fq
fn sqrt(&self) -> CtOption<Fq>
fn sqrt_ratio(num: &Fq, div: &Fq) -> (Choice, Fq)
Source§impl Field for Scalar
impl Field for Scalar
Source§fn sqrt(&self) -> CtOption<Scalar>
fn sqrt(&self) -> CtOption<Scalar>
Tonelli-Shank’s algorithm for q mod 16 = 1 https://eprint.iacr.org/2012/685.pdf (page 12, algorithm 5)
const ZERO: Scalar = Self::ZERO
const ONE: Scalar = Self::ONE
fn random(rng: impl RngCore) -> Scalar
fn square(&self) -> Scalar
fn double(&self) -> Scalar
fn invert(&self) -> CtOption<Scalar>
fn sqrt_ratio(num: &Scalar, div: &Scalar) -> (Choice, Scalar)
Source§impl Field for Fp
impl Field for Fp
Source§fn invert(&self) -> CtOption<Fp>
fn invert(&self) -> CtOption<Fp>
Computes the multiplicative inverse of this element, failing if the element is zero.
const ZERO: Fp = _
const ONE: Fp = _
fn random(rng: impl RngCore) -> Fp
fn double(&self) -> Fp
fn square(&self) -> Fp
fn sqrt_ratio(num: &Fp, div: &Fp) -> (Choice, Fp)
fn sqrt_alt(&self) -> (Choice, Fp)
fn pow_vartime<S>(&self, exp: S) -> Fp
Source§impl Field for Fq
impl Field for Fq
Source§fn invert(&self) -> CtOption<Fq>
fn invert(&self) -> CtOption<Fq>
Computes the multiplicative inverse of this element, failing if the element is zero.