pub struct Scalar(pub(crate) U256);Expand description
Scalars are elements in the finite field modulo n.
§Trait impls
Much of the important functionality is provided by traits from the ff crate:
Fieldrepresents elements of finite fields and provides:Field::randomgenerate a random field elementdouble,square, andinvertoperations- Bounds for
Add,Sub,Mul, andNeg(and*Assignequivalents) - Bounds for
ConditionallySelectablefrom thesubtlecrate
PrimeFieldrepresents elements of prime fields and provides:from_repr/to_reprfor converting field elements from/to big integers.MULTIPLICATIVE_GENERATORandROOT_OF_UNITYconstants.
Please see the documentation for the relevant traits for more information.
Tuple Fields§
§0: U256Implementations§
Source§impl Scalar
impl Scalar
Sourcepub fn to_bytes(&self) -> FieldBytes
pub fn to_bytes(&self) -> FieldBytes
Returns the SEC1 encoding of this scalar.
Sourcepub const fn shr_vartime(&self, shift: u32) -> Scalar
pub const fn shr_vartime(&self, shift: u32) -> Scalar
Right shifts the scalar.
Note: not constant-time with respect to the shift parameter.
Sourcepub fn invert_vartime(&self) -> CtOption<Self>
pub fn invert_vartime(&self) -> CtOption<Self>
Compute [FieldElement] inversion: 1 / self in variable-time.
Sourceconst fn invert_unwrap(&self) -> Self
const fn invert_unwrap(&self) -> Self
Sourcepub const fn pow_vartime<const RHS_LIMBS: usize>(
&self,
exp: &Uint<RHS_LIMBS>,
) -> Self
pub const fn pow_vartime<const RHS_LIMBS: usize>( &self, exp: &Uint<RHS_LIMBS>, ) -> Self
Returns self^exp, where exp is a little-endian integer exponent.
This operation is variable time with respect to the exponent exp.
If the exponent is fixed, this operation is constant time.
Sourcepub const fn sqn_vartime(&self, n: usize) -> Self
pub const fn sqn_vartime(&self, n: usize) -> Self
Returns self^(2^n) mod p.
This operation is variable time with respect to the exponent n.
If the exponent is fixed, this operation is constant time.
Trait Implementations§
Source§impl AddAssign<&Scalar> for Scalar
impl AddAssign<&Scalar> for Scalar
Source§fn add_assign(&mut self, rhs: &Scalar)
fn add_assign(&mut self, rhs: &Scalar)
+= operation. Read moreSource§impl AddAssign for Scalar
impl AddAssign for Scalar
Source§fn add_assign(&mut self, rhs: Scalar)
fn add_assign(&mut self, rhs: Scalar)
+= operation. Read moreSource§impl ConditionallySelectable for Scalar
impl ConditionallySelectable for Scalar
Source§fn conditional_select(a: &Self, b: &Self, choice: Choice) -> Self
fn conditional_select(a: &Self, b: &Self, choice: Choice) -> Self
Source§fn conditional_assign(&mut self, other: &Self, choice: Choice)
fn conditional_assign(&mut self, other: &Self, choice: Choice)
Source§fn conditional_swap(a: &mut Self, b: &mut Self, choice: Choice)
fn conditional_swap(a: &mut Self, b: &mut Self, choice: Choice)
self and other if choice == 1; otherwise,
reassign both unto themselves. Read moreSource§impl ConstantTimeEq for Scalar
impl ConstantTimeEq for Scalar
Source§impl Field for Scalar
impl Field for Scalar
Source§fn sqrt(&self) -> CtOption<Self>
fn sqrt(&self) -> CtOption<Self>
Tonelli-Shank’s algorithm for q mod 16 = 1 https://eprint.iacr.org/2012/685.pdf (page 12, algorithm 5)
Source§fn try_random<R: TryRng + ?Sized>(rng: &mut R) -> Result<Self, R::Error>
fn try_random<R: TryRng + ?Sized>(rng: &mut R) -> Result<Self, R::Error>
Source§fn invert(&self) -> CtOption<Self>
fn invert(&self) -> CtOption<Self>
Source§fn sqrt_ratio(num: &Self, div: &Self) -> (Choice, Self)
fn sqrt_ratio(num: &Self, div: &Self) -> (Choice, Self)
Source§fn random<R>(rng: &mut R) -> Self
fn random<R>(rng: &mut R) -> Self
Source§fn is_zero_vartime(&self) -> bool
fn is_zero_vartime(&self) -> bool
Source§impl From<&NonZeroScalar<NistP256>> for Scalar
impl From<&NonZeroScalar<NistP256>> for Scalar
Source§fn from(scalar: &NonZeroScalar<NistP256>) -> Self
fn from(scalar: &NonZeroScalar<NistP256>) -> Self
Source§impl From<&Scalar> for FieldBytes
impl From<&Scalar> for FieldBytes
Source§impl From<NonZeroScalar<NistP256>> for Scalar
impl From<NonZeroScalar<NistP256>> for Scalar
Source§fn from(scalar: NonZeroScalar<NistP256>) -> Self
fn from(scalar: NonZeroScalar<NistP256>) -> Self
Source§impl From<Scalar> for FieldBytes
impl From<Scalar> for FieldBytes
Source§impl From<ScalarValue<NistP256>> for Scalar
impl From<ScalarValue<NistP256>> for Scalar
Source§fn from(w: ScalarValue<NistP256>) -> Self
fn from(w: ScalarValue<NistP256>) -> Self
Source§impl FromUintUnchecked for Scalar
impl FromUintUnchecked for Scalar
Source§impl FromUniformBytes<64> for Scalar
impl FromUniformBytes<64> for Scalar
Source§fn from_uniform_bytes(bytes: &[u8; 64]) -> Self
fn from_uniform_bytes(bytes: &[u8; 64]) -> Self
Source§impl Generate for Scalar
impl Generate for Scalar
Source§fn try_generate_from_rng<R: TryRng + ?Sized>(
rng: &mut R,
) -> Result<Self, R::Error>
fn try_generate_from_rng<R: TryRng + ?Sized>( rng: &mut R, ) -> Result<Self, R::Error>
TryCryptoRng. Read moreSource§fn generate_from_rng<R>(rng: &mut R) -> Self
fn generate_from_rng<R>(rng: &mut R) -> Self
CryptoRng.Source§impl Mul<&<NistP256 as CurveArithmetic>::AffinePoint> for &Scalar
impl Mul<&<NistP256 as CurveArithmetic>::AffinePoint> for &Scalar
Source§type Output = <NistP256 as CurveArithmetic>::ProjectivePoint
type Output = <NistP256 as CurveArithmetic>::ProjectivePoint
* operator.Source§fn mul(self, rhs: &AffinePoint<NistP256>) -> ProjectivePoint<NistP256>
fn mul(self, rhs: &AffinePoint<NistP256>) -> ProjectivePoint<NistP256>
* operation. Read moreSource§impl Mul<&<NistP256 as CurveArithmetic>::AffinePoint> for Scalar
impl Mul<&<NistP256 as CurveArithmetic>::AffinePoint> for Scalar
Source§type Output = <NistP256 as CurveArithmetic>::ProjectivePoint
type Output = <NistP256 as CurveArithmetic>::ProjectivePoint
* operator.Source§fn mul(self, rhs: &AffinePoint<NistP256>) -> ProjectivePoint<NistP256>
fn mul(self, rhs: &AffinePoint<NistP256>) -> ProjectivePoint<NistP256>
* operation. Read moreSource§impl Mul<&<NistP256 as CurveArithmetic>::ProjectivePoint> for &Scalar
impl Mul<&<NistP256 as CurveArithmetic>::ProjectivePoint> for &Scalar
Source§type Output = <NistP256 as CurveArithmetic>::ProjectivePoint
type Output = <NistP256 as CurveArithmetic>::ProjectivePoint
* operator.Source§fn mul(self, rhs: &ProjectivePoint<NistP256>) -> ProjectivePoint<NistP256>
fn mul(self, rhs: &ProjectivePoint<NistP256>) -> ProjectivePoint<NistP256>
* operation. Read moreSource§impl Mul<&<NistP256 as CurveArithmetic>::ProjectivePoint> for Scalar
impl Mul<&<NistP256 as CurveArithmetic>::ProjectivePoint> for Scalar
Source§type Output = <NistP256 as CurveArithmetic>::ProjectivePoint
type Output = <NistP256 as CurveArithmetic>::ProjectivePoint
* operator.Source§fn mul(self, rhs: &ProjectivePoint<NistP256>) -> ProjectivePoint<NistP256>
fn mul(self, rhs: &ProjectivePoint<NistP256>) -> ProjectivePoint<NistP256>
* operation. Read moreSource§impl Mul<<NistP256 as CurveArithmetic>::AffinePoint> for &Scalar
impl Mul<<NistP256 as CurveArithmetic>::AffinePoint> for &Scalar
Source§type Output = <NistP256 as CurveArithmetic>::ProjectivePoint
type Output = <NistP256 as CurveArithmetic>::ProjectivePoint
* operator.Source§fn mul(self, rhs: AffinePoint<NistP256>) -> ProjectivePoint<NistP256>
fn mul(self, rhs: AffinePoint<NistP256>) -> ProjectivePoint<NistP256>
* operation. Read moreSource§impl Mul<<NistP256 as CurveArithmetic>::AffinePoint> for Scalar
impl Mul<<NistP256 as CurveArithmetic>::AffinePoint> for Scalar
Source§type Output = <NistP256 as CurveArithmetic>::ProjectivePoint
type Output = <NistP256 as CurveArithmetic>::ProjectivePoint
* operator.Source§fn mul(self, rhs: AffinePoint<NistP256>) -> ProjectivePoint<NistP256>
fn mul(self, rhs: AffinePoint<NistP256>) -> ProjectivePoint<NistP256>
* operation. Read moreSource§impl Mul<<NistP256 as CurveArithmetic>::ProjectivePoint> for &Scalar
impl Mul<<NistP256 as CurveArithmetic>::ProjectivePoint> for &Scalar
Source§type Output = <NistP256 as CurveArithmetic>::ProjectivePoint
type Output = <NistP256 as CurveArithmetic>::ProjectivePoint
* operator.Source§fn mul(self, rhs: ProjectivePoint<NistP256>) -> ProjectivePoint<NistP256>
fn mul(self, rhs: ProjectivePoint<NistP256>) -> ProjectivePoint<NistP256>
* operation. Read moreSource§impl Mul<<NistP256 as CurveArithmetic>::ProjectivePoint> for Scalar
impl Mul<<NistP256 as CurveArithmetic>::ProjectivePoint> for Scalar
Source§type Output = <NistP256 as CurveArithmetic>::ProjectivePoint
type Output = <NistP256 as CurveArithmetic>::ProjectivePoint
* operator.Source§fn mul(self, rhs: ProjectivePoint<NistP256>) -> ProjectivePoint<NistP256>
fn mul(self, rhs: ProjectivePoint<NistP256>) -> ProjectivePoint<NistP256>
* operation. Read moreSource§impl MulAssign<&Scalar> for Scalar
impl MulAssign<&Scalar> for Scalar
Source§fn mul_assign(&mut self, rhs: &Scalar)
fn mul_assign(&mut self, rhs: &Scalar)
*= operation. Read moreSource§impl MulAssign for Scalar
impl MulAssign for Scalar
Source§fn mul_assign(&mut self, rhs: Scalar)
fn mul_assign(&mut self, rhs: Scalar)
*= operation. Read moreSource§impl MulVartime<&<NistP256 as CurveArithmetic>::AffinePoint> for &Scalar
impl MulVartime<&<NistP256 as CurveArithmetic>::AffinePoint> for &Scalar
Source§fn mul_vartime(self, rhs: &AffinePoint<NistP256>) -> ProjectivePoint<NistP256>
fn mul_vartime(self, rhs: &AffinePoint<NistP256>) -> ProjectivePoint<NistP256>
self by rhs in variable-time.Source§impl MulVartime<&<NistP256 as CurveArithmetic>::AffinePoint> for Scalar
impl MulVartime<&<NistP256 as CurveArithmetic>::AffinePoint> for Scalar
Source§fn mul_vartime(self, rhs: &AffinePoint<NistP256>) -> ProjectivePoint<NistP256>
fn mul_vartime(self, rhs: &AffinePoint<NistP256>) -> ProjectivePoint<NistP256>
self by rhs in variable-time.Source§impl MulVartime<&<NistP256 as CurveArithmetic>::ProjectivePoint> for &Scalar
impl MulVartime<&<NistP256 as CurveArithmetic>::ProjectivePoint> for &Scalar
Source§fn mul_vartime(
self,
rhs: &ProjectivePoint<NistP256>,
) -> ProjectivePoint<NistP256>
fn mul_vartime( self, rhs: &ProjectivePoint<NistP256>, ) -> ProjectivePoint<NistP256>
self by rhs in variable-time.Source§impl MulVartime<&<NistP256 as CurveArithmetic>::ProjectivePoint> for Scalar
impl MulVartime<&<NistP256 as CurveArithmetic>::ProjectivePoint> for Scalar
Source§fn mul_vartime(
self,
rhs: &ProjectivePoint<NistP256>,
) -> ProjectivePoint<NistP256>
fn mul_vartime( self, rhs: &ProjectivePoint<NistP256>, ) -> ProjectivePoint<NistP256>
self by rhs in variable-time.Source§impl MulVartime<<NistP256 as CurveArithmetic>::AffinePoint> for &Scalar
impl MulVartime<<NistP256 as CurveArithmetic>::AffinePoint> for &Scalar
Source§fn mul_vartime(self, rhs: AffinePoint<NistP256>) -> ProjectivePoint<NistP256>
fn mul_vartime(self, rhs: AffinePoint<NistP256>) -> ProjectivePoint<NistP256>
self by rhs in variable-time.Source§impl MulVartime<<NistP256 as CurveArithmetic>::AffinePoint> for Scalar
impl MulVartime<<NistP256 as CurveArithmetic>::AffinePoint> for Scalar
Source§fn mul_vartime(self, rhs: AffinePoint<NistP256>) -> ProjectivePoint<NistP256>
fn mul_vartime(self, rhs: AffinePoint<NistP256>) -> ProjectivePoint<NistP256>
self by rhs in variable-time.Source§impl MulVartime<<NistP256 as CurveArithmetic>::ProjectivePoint> for &Scalar
impl MulVartime<<NistP256 as CurveArithmetic>::ProjectivePoint> for &Scalar
Source§fn mul_vartime(
self,
rhs: ProjectivePoint<NistP256>,
) -> ProjectivePoint<NistP256>
fn mul_vartime( self, rhs: ProjectivePoint<NistP256>, ) -> ProjectivePoint<NistP256>
self by rhs in variable-time.Source§impl MulVartime<<NistP256 as CurveArithmetic>::ProjectivePoint> for Scalar
impl MulVartime<<NistP256 as CurveArithmetic>::ProjectivePoint> for Scalar
Source§fn mul_vartime(
self,
rhs: ProjectivePoint<NistP256>,
) -> ProjectivePoint<NistP256>
fn mul_vartime( self, rhs: ProjectivePoint<NistP256>, ) -> ProjectivePoint<NistP256>
self by rhs in variable-time.Source§impl Ord for Scalar
impl Ord for Scalar
Source§impl PartialOrd for Scalar
impl PartialOrd for Scalar
Source§impl PrimeField for Scalar
impl PrimeField for Scalar
Source§fn from_repr(bytes: FieldBytes) -> CtOption<Self>
fn from_repr(bytes: FieldBytes) -> CtOption<Self>
Attempts to parse the given byte array as an SEC1-encoded scalar.
Returns None if the byte array does not contain a big-endian integer in the range [0, p).
Source§const MODULUS: &'static str = ORDER_HEX
const MODULUS: &'static str = ORDER_HEX
Source§const CAPACITY: u32 = 255
const CAPACITY: u32 = 255
Source§const MULTIPLICATIVE_GENERATOR: Self
const MULTIPLICATIVE_GENERATOR: Self
modulus - 1 order. This element must also be
a quadratic nonresidue. Read moreSource§const ROOT_OF_UNITY: Self
const ROOT_OF_UNITY: Self
2^s root of unity. Read moreSource§const ROOT_OF_UNITY_INV: Self
const ROOT_OF_UNITY_INV: Self
Self::ROOT_OF_UNITY.Source§type Repr = Array<u8, <NistP256 as Curve>::FieldBytesSize>
type Repr = Array<u8, <NistP256 as Curve>::FieldBytesSize>
Source§fn to_repr(&self) -> FieldBytes
fn to_repr(&self) -> FieldBytes
Source§fn from_str_vartime(s: &str) -> Option<Self>
fn from_str_vartime(s: &str) -> Option<Self>
Source§impl PrimeFieldExt for Scalar
impl PrimeFieldExt for Scalar
Source§const REPR_ENDIANNESS: ByteOrder = ByteOrder::BigEndian
const REPR_ENDIANNESS: ByteOrder = ByteOrder::BigEndian
ff::PrimeField::Repr.Source§fn to_be_repr(&self) -> Self::Repr
fn to_be_repr(&self) -> Self::Repr
self using a big endian representation.Source§fn to_le_repr(&self) -> Self::Repr
fn to_le_repr(&self) -> Self::Repr
self using a little endian representation.Source§impl Reduce<Array<u8, <NistP256 as Curve>::FieldBytesSize>> for Scalar
impl Reduce<Array<u8, <NistP256 as Curve>::FieldBytesSize>> for Scalar
Source§fn reduce(bytes: &FieldBytes) -> Self
fn reduce(bytes: &FieldBytes) -> Self
self modulo Modulus.Source§impl ReduceNonZero<Array<u8, <NistP256 as Curve>::FieldBytesSize>> for Scalar
impl ReduceNonZero<Array<u8, <NistP256 as Curve>::FieldBytesSize>> for Scalar
Source§fn reduce_nonzero(bytes: &FieldBytes) -> Self
fn reduce_nonzero(bytes: &FieldBytes) -> Self
Source§impl ReduceNonZero<Uint<crypto_bigint::::uint::U256::{constant#0}>> for Scalar
impl ReduceNonZero<Uint<crypto_bigint::::uint::U256::{constant#0}>> for Scalar
Source§fn reduce_nonzero(w: &U256) -> Self
fn reduce_nonzero(w: &U256) -> Self
Source§impl ShrAssign<usize> for Scalar
impl ShrAssign<usize> for Scalar
Source§fn shr_assign(&mut self, rhs: usize)
fn shr_assign(&mut self, rhs: usize)
>>= operation. Read moreSource§impl SubAssign<&Scalar> for Scalar
impl SubAssign<&Scalar> for Scalar
Source§fn sub_assign(&mut self, rhs: &Scalar)
fn sub_assign(&mut self, rhs: &Scalar)
-= operation. Read moreSource§impl SubAssign for Scalar
impl SubAssign for Scalar
Source§fn sub_assign(&mut self, rhs: Scalar)
fn sub_assign(&mut self, rhs: Scalar)
-= operation. Read moreSource§impl TryFrom<Scalar> for NonZeroScalar<NistP256>
The constant-time alternative is available at
elliptic_curve::NonZeroScalar<NistP256>::new().
impl TryFrom<Scalar> for NonZeroScalar<NistP256>
The constant-time alternative is available at
elliptic_curve::NonZeroScalar<NistP256>::new().