Struct curve25519_dalek::scalar::Scalar [−][src]
pub struct Scalar { /* fields omitted */ }The Scalar struct holds an integer \(s < 2^{255} \) which
represents an element of \(\mathbb Z / \ell\).
Implementations
impl Scalar[src]
impl Scalar[src]pub fn from_bytes_mod_order(bytes: [u8; 32]) -> Scalar[src]
Construct a Scalar by reducing a 256-bit little-endian integer
modulo the group order \( \ell \).
pub fn from_bytes_mod_order_wide(input: &[u8; 64]) -> Scalar[src]
Construct a Scalar by reducing a 512-bit little-endian integer
modulo the group order \( \ell \).
pub fn from_canonical_bytes(bytes: [u8; 32]) -> Option<Scalar>[src]
Attempt to construct a Scalar from a canonical byte representation.
Return
Some(s), wheresis theScalarcorresponding tobytes, ifbytesis a canonical byte representation;Noneifbytesis not a canonical byte representation.
pub const fn from_bits(bytes: [u8; 32]) -> Scalar[src]
Construct a Scalar from the low 255 bits of a 256-bit integer.
This function is intended for applications like X25519 which require specific bit-patterns when performing scalar multiplication.
impl Scalar[src]
impl Scalar[src]pub fn random<R: RngCore + CryptoRng>(rng: &mut R) -> Self[src]
Return a Scalar chosen uniformly at random using a user-provided RNG.
Inputs
rng: any RNG which implements theRngCore + CryptoRnginterface.
Returns
A random scalar within ℤ/lℤ.
Example
extern crate rand_core; use curve25519_dalek::scalar::Scalar; use rand_core::OsRng; let mut csprng = OsRng; let a: Scalar = Scalar::random(&mut csprng);
pub fn hash_from_bytes<D>(input: &[u8]) -> Scalar where
D: Digest<OutputSize = U64> + Default, [src]
D: Digest<OutputSize = U64> + Default,
Hash a slice of bytes into a scalar.
Takes a type parameter D, which is any Digest producing 64
bytes (512 bits) of output.
Convenience wrapper around from_hash.
Example
extern crate sha2; use sha2::Sha512; let msg = "To really appreciate architecture, you may even need to commit a murder"; let s = Scalar::hash_from_bytes::<Sha512>(msg.as_bytes());
pub fn from_hash<D>(hash: D) -> Scalar where
D: Digest<OutputSize = U64>, [src]
D: Digest<OutputSize = U64>,
Construct a scalar from an existing Digest instance.
Use this instead of hash_from_bytes if it is more convenient
to stream data into the Digest than to pass a single byte
slice.
Example
extern crate sha2; use sha2::Digest; use sha2::Sha512; let mut h = Sha512::new() .chain("To really appreciate architecture, you may even need to commit a murder.") .chain("While the programs used for The Manhattan Transcripts are of the most extreme") .chain("nature, they also parallel the most common formula plot: the archetype of") .chain("murder. Other phantasms were occasionally used to underline the fact that") .chain("perhaps all architecture, rather than being about functional standards, is") .chain("about love and death."); let s = Scalar::from_hash(h); println!("{:?}", s.to_bytes()); assert!(s == Scalar::from_bits([ 21, 88, 208, 252, 63, 122, 210, 152, 154, 38, 15, 23, 16, 167, 80, 150, 192, 221, 77, 226, 62, 25, 224, 148, 239, 48, 176, 10, 185, 69, 168, 11, ]));
pub fn to_bytes(&self) -> [u8; 32][src]
Convert this Scalar to its underlying sequence of bytes.
Example
use curve25519_dalek::scalar::Scalar; let s: Scalar = Scalar::zero(); assert!(s.to_bytes() == [0u8; 32]);
pub fn as_bytes(&self) -> &[u8; 32][src]
View the little-endian byte encoding of the integer representing this Scalar.
Example
use curve25519_dalek::scalar::Scalar; let s: Scalar = Scalar::zero(); assert!(s.as_bytes() == &[0u8; 32]);
pub fn zero() -> Self[src]
Construct the scalar \( 0 \).
pub fn one() -> Self[src]
Construct the scalar \( 1 \).
pub fn invert(&self) -> Scalar[src]
Given a nonzero Scalar, compute its multiplicative inverse.
Warning
self MUST be nonzero. If you cannot
prove that this is the case, you SHOULD NOT USE THIS
FUNCTION.
Returns
The multiplicative inverse of the this Scalar.
Example
use curve25519_dalek::scalar::Scalar; // x = 2238329342913194256032495932344128051776374960164957527413114840482143558222 let X: Scalar = Scalar::from_bytes_mod_order([ 0x4e, 0x5a, 0xb4, 0x34, 0x5d, 0x47, 0x08, 0x84, 0x59, 0x13, 0xb4, 0x64, 0x1b, 0xc2, 0x7d, 0x52, 0x52, 0xa5, 0x85, 0x10, 0x1b, 0xcc, 0x42, 0x44, 0xd4, 0x49, 0xf4, 0xa8, 0x79, 0xd9, 0xf2, 0x04, ]); // 1/x = 6859937278830797291664592131120606308688036382723378951768035303146619657244 let XINV: Scalar = Scalar::from_bytes_mod_order([ 0x1c, 0xdc, 0x17, 0xfc, 0xe0, 0xe9, 0xa5, 0xbb, 0xd9, 0x24, 0x7e, 0x56, 0xbb, 0x01, 0x63, 0x47, 0xbb, 0xba, 0x31, 0xed, 0xd5, 0xa9, 0xbb, 0x96, 0xd5, 0x0b, 0xcd, 0x7a, 0x3f, 0x96, 0x2a, 0x0f, ]); let inv_X: Scalar = X.invert(); assert!(XINV == inv_X); let should_be_one: Scalar = &inv_X * &X; assert!(should_be_one == Scalar::one());
pub fn batch_invert(inputs: &mut [Scalar]) -> Scalar[src]
Given a slice of nonzero (possibly secret) Scalars,
compute their inverses in a batch.
Return
Each element of inputs is replaced by its inverse.
The product of all inverses is returned.
Warning
All input Scalars MUST be nonzero. If you cannot
prove that this is the case, you SHOULD NOT USE THIS
FUNCTION.
Example
let mut scalars = [ Scalar::from(3u64), Scalar::from(5u64), Scalar::from(7u64), Scalar::from(11u64), ]; let allinv = Scalar::batch_invert(&mut scalars); assert_eq!(allinv, Scalar::from(3*5*7*11u64).invert()); assert_eq!(scalars[0], Scalar::from(3u64).invert()); assert_eq!(scalars[1], Scalar::from(5u64).invert()); assert_eq!(scalars[2], Scalar::from(7u64).invert()); assert_eq!(scalars[3], Scalar::from(11u64).invert());
pub fn reduce(&self) -> Scalar[src]
Reduce this Scalar modulo \(\ell\).
pub fn is_canonical(&self) -> bool[src]
Check whether this Scalar is the canonical representative mod \(\ell\).
This is intended for uses like input validation, where variable-time code is acceptable.
// 2^255 - 1, since `from_bits` clears the high bit let _2_255_minus_1 = Scalar::from_bits([0xff;32]); assert!(!_2_255_minus_1.is_canonical()); let reduced = _2_255_minus_1.reduce(); assert!(reduced.is_canonical());
Trait Implementations
impl ConditionallySelectable for Scalar[src]
impl ConditionallySelectable for Scalar[src]fn conditional_select(a: &Self, b: &Self, choice: Choice) -> Self[src]
pub fn conditional_assign(&mut self, other: &Self, choice: Choice)[src]
pub fn conditional_swap(a: &mut Self, b: &mut Self, choice: Choice)[src]
impl From<u64> for Scalar[src]
impl From<u64> for Scalar[src]fn from(x: u64) -> Scalar[src]
Construct a scalar from the given u64.
Inputs
An u64 to convert to a Scalar.
Returns
A Scalar corresponding to the input u64.
Example
use curve25519_dalek::scalar::Scalar; let fourtytwo = Scalar::from(42u64); let six = Scalar::from(6u64); let seven = Scalar::from(7u64); assert!(fourtytwo == six * seven);
impl<'a, 'b> Mul<&'a EdwardsBasepointTable> for &'b Scalar[src]
impl<'a, 'b> Mul<&'a EdwardsBasepointTable> for &'b Scalar[src]type Output = EdwardsPoint
The resulting type after applying the * operator.
fn mul(self, basepoint_table: &'a EdwardsBasepointTable) -> EdwardsPoint[src]
Construct an EdwardsPoint from a Scalar \(a\) by
computing the multiple \(aB\) of this basepoint \(B\).
impl<'a, 'b> Mul<&'a RistrettoBasepointTable> for &'b Scalar[src]
impl<'a, 'b> Mul<&'a RistrettoBasepointTable> for &'b Scalar[src]type Output = RistrettoPoint
The resulting type after applying the * operator.
fn mul(self, basepoint_table: &'a RistrettoBasepointTable) -> RistrettoPoint[src]
impl<'b> Mul<&'b EdwardsPoint> for Scalar[src]
impl<'b> Mul<&'b EdwardsPoint> for Scalar[src]type Output = EdwardsPoint
The resulting type after applying the * operator.
fn mul(self, rhs: &'b EdwardsPoint) -> EdwardsPoint[src]
impl<'a, 'b> Mul<&'b EdwardsPoint> for &'a Scalar[src]
impl<'a, 'b> Mul<&'b EdwardsPoint> for &'a Scalar[src]type Output = EdwardsPoint
The resulting type after applying the * operator.
fn mul(self, point: &'b EdwardsPoint) -> EdwardsPoint[src]
Scalar multiplication: compute scalar * self.
For scalar multiplication of a basepoint,
EdwardsBasepointTable is approximately 4x faster.
impl<'b> Mul<&'b MontgomeryPoint> for Scalar[src]
impl<'b> Mul<&'b MontgomeryPoint> for Scalar[src]type Output = MontgomeryPoint
The resulting type after applying the * operator.
fn mul(self, rhs: &'b MontgomeryPoint) -> MontgomeryPoint[src]
impl<'a, 'b> Mul<&'b MontgomeryPoint> for &'a Scalar[src]
impl<'a, 'b> Mul<&'b MontgomeryPoint> for &'a Scalar[src]type Output = MontgomeryPoint
The resulting type after applying the * operator.
fn mul(self, point: &'b MontgomeryPoint) -> MontgomeryPoint[src]
impl<'a, 'b> Mul<&'b RistrettoPoint> for &'a Scalar[src]
impl<'a, 'b> Mul<&'b RistrettoPoint> for &'a Scalar[src]type Output = RistrettoPoint
The resulting type after applying the * operator.
fn mul(self, point: &'b RistrettoPoint) -> RistrettoPoint[src]
Scalar multiplication: compute self * scalar.
impl<'b> Mul<&'b RistrettoPoint> for Scalar[src]
impl<'b> Mul<&'b RistrettoPoint> for Scalar[src]type Output = RistrettoPoint
The resulting type after applying the * operator.
fn mul(self, rhs: &'b RistrettoPoint) -> RistrettoPoint[src]
impl<'b> Mul<&'b Scalar> for MontgomeryPoint[src]
impl<'b> Mul<&'b Scalar> for MontgomeryPoint[src]type Output = MontgomeryPoint
The resulting type after applying the * operator.
fn mul(self, rhs: &'b Scalar) -> MontgomeryPoint[src]
impl<'a, 'b> Mul<&'b Scalar> for &'a MontgomeryPoint[src]
impl<'a, 'b> Mul<&'b Scalar> for &'a MontgomeryPoint[src]Multiply this MontgomeryPoint by a Scalar.
type Output = MontgomeryPoint
The resulting type after applying the * operator.
fn mul(self, scalar: &'b Scalar) -> MontgomeryPoint[src]
Given self \( = u_0(P) \), and a Scalar \(n\), return \( u_0([n]P) \).
impl<'b> Mul<&'b Scalar> for EdwardsPoint[src]
impl<'b> Mul<&'b Scalar> for EdwardsPoint[src]type Output = EdwardsPoint
The resulting type after applying the * operator.
fn mul(self, rhs: &'b Scalar) -> EdwardsPoint[src]
impl<'a, 'b> Mul<&'b Scalar> for &'a EdwardsPoint[src]
impl<'a, 'b> Mul<&'b Scalar> for &'a EdwardsPoint[src]type Output = EdwardsPoint
The resulting type after applying the * operator.
fn mul(self, scalar: &'b Scalar) -> EdwardsPoint[src]
Scalar multiplication: compute scalar * self.
For scalar multiplication of a basepoint,
EdwardsBasepointTable is approximately 4x faster.
impl<'a, 'b> Mul<&'b Scalar> for &'a EdwardsBasepointTable[src]
impl<'a, 'b> Mul<&'b Scalar> for &'a EdwardsBasepointTable[src]type Output = EdwardsPoint
The resulting type after applying the * operator.
fn mul(self, scalar: &'b Scalar) -> EdwardsPoint[src]
Construct an EdwardsPoint from a Scalar \(a\) by
computing the multiple \(aB\) of this basepoint \(B\).
impl<'a, 'b> Mul<&'b Scalar> for &'a RistrettoPoint[src]
impl<'a, 'b> Mul<&'b Scalar> for &'a RistrettoPoint[src]type Output = RistrettoPoint
The resulting type after applying the * operator.
fn mul(self, scalar: &'b Scalar) -> RistrettoPoint[src]
Scalar multiplication: compute scalar * self.
impl<'b> Mul<&'b Scalar> for RistrettoPoint[src]
impl<'b> Mul<&'b Scalar> for RistrettoPoint[src]type Output = RistrettoPoint
The resulting type after applying the * operator.
fn mul(self, rhs: &'b Scalar) -> RistrettoPoint[src]
impl<'a, 'b> Mul<&'b Scalar> for &'a RistrettoBasepointTable[src]
impl<'a, 'b> Mul<&'b Scalar> for &'a RistrettoBasepointTable[src]type Output = RistrettoPoint
The resulting type after applying the * operator.
fn mul(self, scalar: &'b Scalar) -> RistrettoPoint[src]
impl<'a> Mul<EdwardsPoint> for &'a Scalar[src]
impl<'a> Mul<EdwardsPoint> for &'a Scalar[src]type Output = EdwardsPoint
The resulting type after applying the * operator.
fn mul(self, rhs: EdwardsPoint) -> EdwardsPoint[src]
impl Mul<EdwardsPoint> for Scalar[src]
impl Mul<EdwardsPoint> for Scalar[src]type Output = EdwardsPoint
The resulting type after applying the * operator.
fn mul(self, rhs: EdwardsPoint) -> EdwardsPoint[src]
impl<'a> Mul<MontgomeryPoint> for &'a Scalar[src]
impl<'a> Mul<MontgomeryPoint> for &'a Scalar[src]type Output = MontgomeryPoint
The resulting type after applying the * operator.
fn mul(self, rhs: MontgomeryPoint) -> MontgomeryPoint[src]
impl Mul<MontgomeryPoint> for Scalar[src]
impl Mul<MontgomeryPoint> for Scalar[src]type Output = MontgomeryPoint
The resulting type after applying the * operator.
fn mul(self, rhs: MontgomeryPoint) -> MontgomeryPoint[src]
impl<'a> Mul<RistrettoPoint> for &'a Scalar[src]
impl<'a> Mul<RistrettoPoint> for &'a Scalar[src]type Output = RistrettoPoint
The resulting type after applying the * operator.
fn mul(self, rhs: RistrettoPoint) -> RistrettoPoint[src]
impl Mul<RistrettoPoint> for Scalar[src]
impl Mul<RistrettoPoint> for Scalar[src]type Output = RistrettoPoint
The resulting type after applying the * operator.
fn mul(self, rhs: RistrettoPoint) -> RistrettoPoint[src]
impl<'a> Mul<Scalar> for &'a MontgomeryPoint[src]
impl<'a> Mul<Scalar> for &'a MontgomeryPoint[src]type Output = MontgomeryPoint
The resulting type after applying the * operator.
fn mul(self, rhs: Scalar) -> MontgomeryPoint[src]
impl Mul<Scalar> for MontgomeryPoint[src]
impl Mul<Scalar> for MontgomeryPoint[src]type Output = MontgomeryPoint
The resulting type after applying the * operator.
fn mul(self, rhs: Scalar) -> MontgomeryPoint[src]
impl<'a> Mul<Scalar> for &'a EdwardsPoint[src]
impl<'a> Mul<Scalar> for &'a EdwardsPoint[src]type Output = EdwardsPoint
The resulting type after applying the * operator.
fn mul(self, rhs: Scalar) -> EdwardsPoint[src]
impl Mul<Scalar> for EdwardsPoint[src]
impl Mul<Scalar> for EdwardsPoint[src]type Output = EdwardsPoint
The resulting type after applying the * operator.
fn mul(self, rhs: Scalar) -> EdwardsPoint[src]
impl<'a> Mul<Scalar> for &'a RistrettoPoint[src]
impl<'a> Mul<Scalar> for &'a RistrettoPoint[src]type Output = RistrettoPoint
The resulting type after applying the * operator.
fn mul(self, rhs: Scalar) -> RistrettoPoint[src]
impl Mul<Scalar> for RistrettoPoint[src]
impl Mul<Scalar> for RistrettoPoint[src]type Output = RistrettoPoint
The resulting type after applying the * operator.
fn mul(self, rhs: Scalar) -> RistrettoPoint[src]
impl<'b> MulAssign<&'b Scalar> for MontgomeryPoint[src]
impl<'b> MulAssign<&'b Scalar> for MontgomeryPoint[src]fn mul_assign(&mut self, scalar: &'b Scalar)[src]
impl<'b> MulAssign<&'b Scalar> for EdwardsPoint[src]
impl<'b> MulAssign<&'b Scalar> for EdwardsPoint[src]fn mul_assign(&mut self, scalar: &'b Scalar)[src]
impl<'b> MulAssign<&'b Scalar> for RistrettoPoint[src]
impl<'b> MulAssign<&'b Scalar> for RistrettoPoint[src]fn mul_assign(&mut self, scalar: &'b Scalar)[src]
impl MulAssign<Scalar> for MontgomeryPoint[src]
impl MulAssign<Scalar> for MontgomeryPoint[src]fn mul_assign(&mut self, rhs: Scalar)[src]
impl MulAssign<Scalar> for EdwardsPoint[src]
impl MulAssign<Scalar> for EdwardsPoint[src]fn mul_assign(&mut self, rhs: Scalar)[src]
impl MulAssign<Scalar> for RistrettoPoint[src]
impl MulAssign<Scalar> for RistrettoPoint[src]