pub struct Scalar {
pub(crate) bytes: [u8; 32],
}Expand description
The Scalar struct holds an element of \(\mathbb Z / \ell\mathbb Z \).
Fields§
§bytes: [u8; 32]bytes is a little-endian byte encoding of an integer representing a scalar modulo the
group order.
§Invariant #1
The integer representing this scalar is less than \(2^{255}\). That is, the most
significant bit of bytes[31] is 0.
This is required for EdwardsPoint variable- and fixed-base multiplication, because most
integers above 2^255 are unrepresentable in our radix-16 NAF (see Self::as_radix_16).
The invariant is also required because our MontgomeryPoint multiplication assumes the MSB
is 0 (see MontgomeryPoint::mul).
§Invariant #2 (weak)
The integer representing this scalar is less than \(2^{255} - 19 \), i.e., it represents a canonical representative of an element of \( \mathbb Z / \ell\mathbb Z \). This is stronger than invariant #1. It also sometimes has to be broken.
This invariant is deliberately broken in the implementation of EdwardsPoint::{mul_clamped, mul_base_clamped}, MontgomeryPoint::{mul_clamped, mul_base_clamped}, and
BasepointTable::mul_base_clamped. This is not an issue though. As mentioned above,
scalar-point multiplication is defined for any choice of bytes that satisfies invariant
#1. Since clamping guarantees invariant #1 is satisfied, these operations are well defined.
Note: Scalar-point mult is the only thing you can do safely with an unreduced scalar. Scalar-scalar addition and subtraction are NOT correct when using unreduced scalars. Multiplication is correct, but this is only due to a quirk of our implementation, and not guaranteed to hold in general in the future.
Note: It is not possible to construct an unreduced Scalar from the public API unless the
legacy_compatibility is enabled (thus making Scalar::from_bits public). Thus, for all
public non-legacy uses, invariant #2
always holds.
Implementations§
Source§impl Scalar
impl Scalar
Sourcepub fn from_bytes_mod_order(bytes: [u8; 32]) -> Scalar
pub fn from_bytes_mod_order(bytes: [u8; 32]) -> Scalar
Construct a Scalar by reducing a 256-bit little-endian integer
modulo the group order \( \ell \).
Sourcepub fn from_bytes_mod_order_wide(input: &[u8; 64]) -> Scalar
pub fn from_bytes_mod_order_wide(input: &[u8; 64]) -> Scalar
Construct a Scalar by reducing a 512-bit little-endian integer
modulo the group order \( \ell \).
Sourcepub fn from_canonical_bytes(bytes: [u8; 32]) -> CtOption<Scalar>
pub fn from_canonical_bytes(bytes: [u8; 32]) -> CtOption<Scalar>
Attempt to construct a Scalar from a canonical byte representation.
§Return
Some(s), wheresis theScalarcorresponding tobytes, ifbytesis a canonical byte representation modulo the group order \( \ell \);Noneifbytesis not a canonical byte representation.
Source§impl Scalar
impl Scalar
Sourcepub const fn to_bytes(&self) -> [u8; 32]
pub const fn to_bytes(&self) -> [u8; 32]
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]);Sourcepub const fn as_bytes(&self) -> &[u8; 32]
pub const fn as_bytes(&self) -> &[u8; 32]
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]);Sourcepub fn invert(&self) -> Scalar
pub fn invert(&self) -> Scalar
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);Sourcepub fn batch_invert(inputs: &mut [Scalar]) -> Scalar
pub fn batch_invert(inputs: &mut [Scalar]) -> Scalar
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());Sourcepub(crate) fn bits_le(&self) -> impl DoubleEndedIterator<Item = bool> + '_
pub(crate) fn bits_le(&self) -> impl DoubleEndedIterator<Item = bool> + '_
Get the bits of the scalar, in little-endian order
Sourcepub(crate) fn non_adjacent_form(&self, w: usize) -> [i8; 256]
pub(crate) fn non_adjacent_form(&self, w: usize) -> [i8; 256]
Compute a width-\(w\) “Non-Adjacent Form” of this scalar.
A width-\(w\) NAF of a positive integer \(k\) is an expression $$ k = \sum_{i=0}^m n_i 2^i, $$ where each nonzero coefficient \(n_i\) is odd and bounded by \(|n_i| < 2^{w-1}\), \(n_{m-1}\) is nonzero, and at most one of any \(w\) consecutive coefficients is nonzero. (Hankerson, Menezes, Vanstone; def 3.32).
The length of the NAF is at most one more than the length of
the binary representation of \(k\). This is why the
Scalar type maintains an invariant (invariant #1) that the top bit is
\(0\), so that the NAF of a scalar has at most 256 digits.
Intuitively, this is like a binary expansion, except that we allow some coefficients to grow in magnitude up to \(2^{w-1}\) so that the nonzero coefficients are as sparse as possible.
When doing scalar multiplication, we can then use a lookup table of precomputed multiples of a point to add the nonzero terms \( k_i P \). Using signed digits cuts the table size in half, and using odd digits cuts the table size in half again.
To compute a \(w\)-NAF, we use a modification of Algorithm 3.35 of HMV:
- \( i \gets 0 \)
- While \( k \ge 1 \):
- If \(k\) is odd, \( n_i \gets k \operatorname{mods} 2^w \), \( k \gets k - n_i \).
- If \(k\) is even, \( n_i \gets 0 \).
- \( k \gets k / 2 \), \( i \gets i + 1 \).
- Return \( n_0, n_1, … , \)
Here \( \bar x = x \operatorname{mods} 2^w \) means the \( \bar x \) with \( \bar x \equiv x \pmod{2^w} \) and \( -2^{w-1} \leq \bar x < 2^{w-1} \).
We implement this by scanning across the bits of \(k\) from least-significant bit to most-significant-bit. Write the bits of \(k\) as $$ k = \sum_{i=0}^m k_i 2^i, $$ and split the sum as $$ k = \sum_{i=0}^{w-1} k_i 2^i + 2^w \sum_{i=0} k_{i+w} 2^i $$ where the first part is \( k \mod 2^w \).
If \( k \mod 2^w\) is odd, and \( k \mod 2^w < 2^{w-1} \), then we emit \( n_0 = k \mod 2^w \). Instead of computing \( k - n_0 \), we just advance \(w\) bits and reindex.
If \( k \mod 2^w\) is odd, and \( k \mod 2^w \ge 2^{w-1} \), then \( n_0 = k \operatorname{mods} 2^w = k \mod 2^w - 2^w \). The quantity \( k - n_0 \) is $$ \begin{aligned} k - n_0 &= \sum_{i=0}^{w-1} k_i 2^i + 2^w \sum_{i=0} k_{i+w} 2^i - \sum_{i=0}^{w-1} k_i 2^i + 2^w \\ &= 2^w + 2^w \sum_{i=0} k_{i+w} 2^i \end{aligned} $$ so instead of computing the subtraction, we can set a carry bit, advance \(w\) bits, and reindex.
If \( k \mod 2^w\) is even, we emit \(0\), advance 1 bit and reindex. In fact, by setting all digits to \(0\) initially, we don’t need to emit anything.
Sourcepub(crate) fn as_radix_16(&self) -> [i8; 64]
pub(crate) fn as_radix_16(&self) -> [i8; 64]
Write this scalar in radix 16, with coefficients in \([-8,8)\), i.e., compute \(a_i\) such that $$ a = a_0 + a_1 16^1 + \cdots + a_{63} 16^{63}, $$ with \(-8 \leq a_i < 8\) for \(0 \leq i < 63\) and \(-8 \leq a_{63} \leq 8\).
The largest value that can be decomposed like this is just over \(2^{255}\). Thus, in
order to not error, the top bit MUST NOT be set, i.e., Self MUST be less than
\(2^{255}\).
Sourcepub(crate) fn to_radix_2w_size_hint(w: usize) -> usize
pub(crate) fn to_radix_2w_size_hint(w: usize) -> usize
Returns a size hint indicating how many entries of the return
value of to_radix_2w are nonzero.
Sourcepub(crate) fn as_radix_2w(&self, w: usize) -> [i8; 64]
pub(crate) fn as_radix_2w(&self, w: usize) -> [i8; 64]
Creates a representation of a Scalar in radix \( 2^w \) with \(w = 4, 5, 6, 7, 8\) for use with the Pippenger algorithm. Higher radixes are not supported to save cache space. Radix 256 is near-optimal even for very large inputs.
Radix below 16 or above 256 is prohibited. This method returns digits in a fixed-sized array, excess digits are zeroes.
For radix 16, Self must be less than \(2^{255}\). This is because most integers larger
than \(2^{255}\) are unrepresentable in the form described below for \(w = 4\). This
would be true for \(w = 8\) as well, but it is compensated for by increasing the size
hint by 1.
§Scalar representation
Radix \(2^w\), with \(n = ceil(256/w)\) coefficients in \([-(2^w)/2,(2^w)/2)\), i.e., scalar is represented using digits \(a_i\) such that $$ a = a_0 + a_1 2^1w + \cdots + a_{n-1} 2^{w*(n-1)}, $$ with \(-2^w/2 \leq a_i < 2^w/2\) for \(0 \leq i < (n-1)\) and \(-2^w/2 \leq a_{n-1} \leq 2^w/2\).
Sourcepub(crate) fn unpack(&self) -> Scalar52
pub(crate) fn unpack(&self) -> Scalar52
Unpack this Scalar to an UnpackedScalar for faster arithmetic.
Sourcefn is_canonical(&self) -> Choice
fn is_canonical(&self) -> Choice
Check whether this Scalar is the canonical representative mod \(\ell\). This is not
public because any Scalar that is publicly observed is reduced, by scalar invariant #2.
Trait Implementations§
Source§impl<'b> AddAssign<&'b Scalar> for Scalar
impl<'b> AddAssign<&'b Scalar> for Scalar
Source§fn add_assign(&mut self, _rhs: &'b Scalar)
fn add_assign(&mut self, _rhs: &'b 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 From<u64> for Scalar
impl From<u64> for Scalar
Source§fn from(x: u64) -> Scalar
fn from(x: u64) -> Scalar
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);Source§impl<'a, 'b> Mul<&'a EdwardsBasepointTable> for &'b Scalar
impl<'a, 'b> Mul<&'a EdwardsBasepointTable> for &'b Scalar
Source§fn mul(self, basepoint_table: &'a EdwardsBasepointTable) -> EdwardsPoint
fn mul(self, basepoint_table: &'a EdwardsBasepointTable) -> EdwardsPoint
Construct an EdwardsPoint from a Scalar \(a\) by
computing the multiple \(aB\) of this basepoint \(B\).
Source§type Output = EdwardsPoint
type Output = EdwardsPoint
* operator.Source§impl<'a, 'b> Mul<&'a EdwardsBasepointTableRadix128> for &'b Scalar
impl<'a, 'b> Mul<&'a EdwardsBasepointTableRadix128> for &'b Scalar
Source§fn mul(self, basepoint_table: &'a EdwardsBasepointTableRadix128) -> EdwardsPoint
fn mul(self, basepoint_table: &'a EdwardsBasepointTableRadix128) -> EdwardsPoint
Construct an EdwardsPoint from a Scalar \(a\) by
computing the multiple \(aB\) of this basepoint \(B\).
Source§type Output = EdwardsPoint
type Output = EdwardsPoint
* operator.Source§impl<'a, 'b> Mul<&'a EdwardsBasepointTableRadix256> for &'b Scalar
impl<'a, 'b> Mul<&'a EdwardsBasepointTableRadix256> for &'b Scalar
Source§fn mul(self, basepoint_table: &'a EdwardsBasepointTableRadix256) -> EdwardsPoint
fn mul(self, basepoint_table: &'a EdwardsBasepointTableRadix256) -> EdwardsPoint
Construct an EdwardsPoint from a Scalar \(a\) by
computing the multiple \(aB\) of this basepoint \(B\).
Source§type Output = EdwardsPoint
type Output = EdwardsPoint
* operator.Source§impl<'a, 'b> Mul<&'a EdwardsBasepointTableRadix32> for &'b Scalar
impl<'a, 'b> Mul<&'a EdwardsBasepointTableRadix32> for &'b Scalar
Source§fn mul(self, basepoint_table: &'a EdwardsBasepointTableRadix32) -> EdwardsPoint
fn mul(self, basepoint_table: &'a EdwardsBasepointTableRadix32) -> EdwardsPoint
Construct an EdwardsPoint from a Scalar \(a\) by
computing the multiple \(aB\) of this basepoint \(B\).
Source§type Output = EdwardsPoint
type Output = EdwardsPoint
* operator.Source§impl<'a, 'b> Mul<&'a EdwardsBasepointTableRadix64> for &'b Scalar
impl<'a, 'b> Mul<&'a EdwardsBasepointTableRadix64> for &'b Scalar
Source§fn mul(self, basepoint_table: &'a EdwardsBasepointTableRadix64) -> EdwardsPoint
fn mul(self, basepoint_table: &'a EdwardsBasepointTableRadix64) -> EdwardsPoint
Construct an EdwardsPoint from a Scalar \(a\) by
computing the multiple \(aB\) of this basepoint \(B\).
Source§type Output = EdwardsPoint
type Output = EdwardsPoint
* operator.Source§impl<'a, 'b> Mul<&'b EdwardsPoint> for &'a Scalar
impl<'a, 'b> Mul<&'b EdwardsPoint> for &'a Scalar
Source§fn mul(self, point: &'b EdwardsPoint) -> EdwardsPoint
fn mul(self, point: &'b EdwardsPoint) -> EdwardsPoint
Scalar multiplication: compute scalar * self.
For scalar multiplication of a basepoint,
EdwardsBasepointTable is approximately 4x faster.
Source§type Output = EdwardsPoint
type Output = EdwardsPoint
* operator.Source§impl<'b> Mul<&'b EdwardsPoint> for Scalar
impl<'b> Mul<&'b EdwardsPoint> for Scalar
Source§type Output = EdwardsPoint
type Output = EdwardsPoint
* operator.Source§fn mul(self, rhs: &'b EdwardsPoint) -> EdwardsPoint
fn mul(self, rhs: &'b EdwardsPoint) -> EdwardsPoint
* operation. Read moreSource§impl Mul<&MontgomeryPoint> for &Scalar
impl Mul<&MontgomeryPoint> for &Scalar
Source§type Output = MontgomeryPoint
type Output = MontgomeryPoint
* operator.Source§fn mul(self, point: &MontgomeryPoint) -> MontgomeryPoint
fn mul(self, point: &MontgomeryPoint) -> MontgomeryPoint
* operation. Read moreSource§impl<'b> Mul<&'b MontgomeryPoint> for Scalar
impl<'b> Mul<&'b MontgomeryPoint> for Scalar
Source§type Output = MontgomeryPoint
type Output = MontgomeryPoint
* operator.Source§fn mul(self, rhs: &'b MontgomeryPoint) -> MontgomeryPoint
fn mul(self, rhs: &'b MontgomeryPoint) -> MontgomeryPoint
* operation. Read moreSource§impl<'a, 'b> Mul<&'a RistrettoBasepointTable> for &'b Scalar
impl<'a, 'b> Mul<&'a RistrettoBasepointTable> for &'b Scalar
Source§type Output = RistrettoPoint
type Output = RistrettoPoint
* operator.Source§fn mul(self, basepoint_table: &'a RistrettoBasepointTable) -> RistrettoPoint
fn mul(self, basepoint_table: &'a RistrettoBasepointTable) -> RistrettoPoint
* operation. Read moreSource§impl<'a, 'b> Mul<&'b RistrettoPoint> for &'a Scalar
impl<'a, 'b> Mul<&'b RistrettoPoint> for &'a Scalar
Source§fn mul(self, point: &'b RistrettoPoint) -> RistrettoPoint
fn mul(self, point: &'b RistrettoPoint) -> RistrettoPoint
Scalar multiplication: compute self * scalar.
Source§type Output = RistrettoPoint
type Output = RistrettoPoint
* operator.Source§impl<'b> Mul<&'b RistrettoPoint> for Scalar
impl<'b> Mul<&'b RistrettoPoint> for Scalar
Source§type Output = RistrettoPoint
type Output = RistrettoPoint
* operator.Source§fn mul(self, rhs: &'b RistrettoPoint) -> RistrettoPoint
fn mul(self, rhs: &'b RistrettoPoint) -> RistrettoPoint
* operation. Read moreSource§impl<'a, 'b> Mul<&'b Scalar> for &'a EdwardsBasepointTable
impl<'a, 'b> Mul<&'b Scalar> for &'a EdwardsBasepointTable
Source§fn mul(self, scalar: &'b Scalar) -> EdwardsPoint
fn mul(self, scalar: &'b Scalar) -> EdwardsPoint
Construct an EdwardsPoint from a Scalar \(a\) by
computing the multiple \(aB\) of this basepoint \(B\).
Source§type Output = EdwardsPoint
type Output = EdwardsPoint
* operator.Source§impl<'a, 'b> Mul<&'b Scalar> for &'a EdwardsBasepointTableRadix128
impl<'a, 'b> Mul<&'b Scalar> for &'a EdwardsBasepointTableRadix128
Source§fn mul(self, scalar: &'b Scalar) -> EdwardsPoint
fn mul(self, scalar: &'b Scalar) -> EdwardsPoint
Construct an EdwardsPoint from a Scalar \(a\) by
computing the multiple \(aB\) of this basepoint \(B\).
Source§type Output = EdwardsPoint
type Output = EdwardsPoint
* operator.Source§impl<'a, 'b> Mul<&'b Scalar> for &'a EdwardsBasepointTableRadix256
impl<'a, 'b> Mul<&'b Scalar> for &'a EdwardsBasepointTableRadix256
Source§fn mul(self, scalar: &'b Scalar) -> EdwardsPoint
fn mul(self, scalar: &'b Scalar) -> EdwardsPoint
Construct an EdwardsPoint from a Scalar \(a\) by
computing the multiple \(aB\) of this basepoint \(B\).
Source§type Output = EdwardsPoint
type Output = EdwardsPoint
* operator.Source§impl<'a, 'b> Mul<&'b Scalar> for &'a EdwardsBasepointTableRadix32
impl<'a, 'b> Mul<&'b Scalar> for &'a EdwardsBasepointTableRadix32
Source§fn mul(self, scalar: &'b Scalar) -> EdwardsPoint
fn mul(self, scalar: &'b Scalar) -> EdwardsPoint
Construct an EdwardsPoint from a Scalar \(a\) by
computing the multiple \(aB\) of this basepoint \(B\).
Source§type Output = EdwardsPoint
type Output = EdwardsPoint
* operator.Source§impl<'a, 'b> Mul<&'b Scalar> for &'a EdwardsBasepointTableRadix64
impl<'a, 'b> Mul<&'b Scalar> for &'a EdwardsBasepointTableRadix64
Source§fn mul(self, scalar: &'b Scalar) -> EdwardsPoint
fn mul(self, scalar: &'b Scalar) -> EdwardsPoint
Construct an EdwardsPoint from a Scalar \(a\) by
computing the multiple \(aB\) of this basepoint \(B\).
Source§type Output = EdwardsPoint
type Output = EdwardsPoint
* operator.Source§impl<'a, 'b> Mul<&'b Scalar> for &'a EdwardsPoint
impl<'a, 'b> Mul<&'b Scalar> for &'a EdwardsPoint
Source§fn mul(self, scalar: &'b Scalar) -> EdwardsPoint
fn mul(self, scalar: &'b Scalar) -> EdwardsPoint
Scalar multiplication: compute scalar * self.
For scalar multiplication of a basepoint,
EdwardsBasepointTable is approximately 4x faster.
Source§type Output = EdwardsPoint
type Output = EdwardsPoint
* operator.Source§impl Mul<&Scalar> for &MontgomeryPoint
Multiply this MontgomeryPoint by a Scalar.
impl Mul<&Scalar> for &MontgomeryPoint
Multiply this MontgomeryPoint by a Scalar.
Source§fn mul(self, scalar: &Scalar) -> MontgomeryPoint
fn mul(self, scalar: &Scalar) -> MontgomeryPoint
Given self \( = u_0(P) \), and a Scalar \(n\), return \( u_0([n]P) \)
Source§type Output = MontgomeryPoint
type Output = MontgomeryPoint
* operator.Source§impl<'a, 'b> Mul<&'b Scalar> for &'a RistrettoBasepointTable
impl<'a, 'b> Mul<&'b Scalar> for &'a RistrettoBasepointTable
Source§type Output = RistrettoPoint
type Output = RistrettoPoint
* operator.Source§impl<'a, 'b> Mul<&'b Scalar> for &'a RistrettoPoint
impl<'a, 'b> Mul<&'b Scalar> for &'a RistrettoPoint
Source§fn mul(self, scalar: &'b Scalar) -> RistrettoPoint
fn mul(self, scalar: &'b Scalar) -> RistrettoPoint
Scalar multiplication: compute scalar * self.
Source§type Output = RistrettoPoint
type Output = RistrettoPoint
* operator.Source§impl<'b> Mul<&'b Scalar> for EdwardsPoint
impl<'b> Mul<&'b Scalar> for EdwardsPoint
Source§type Output = EdwardsPoint
type Output = EdwardsPoint
* operator.Source§impl<'b> Mul<&'b Scalar> for MontgomeryPoint
impl<'b> Mul<&'b Scalar> for MontgomeryPoint
Source§type Output = MontgomeryPoint
type Output = MontgomeryPoint
* operator.Source§impl<'b> Mul<&'b Scalar> for RistrettoPoint
impl<'b> Mul<&'b Scalar> for RistrettoPoint
Source§type Output = RistrettoPoint
type Output = RistrettoPoint
* operator.Source§impl<'a> Mul<EdwardsPoint> for &'a Scalar
impl<'a> Mul<EdwardsPoint> for &'a Scalar
Source§type Output = EdwardsPoint
type Output = EdwardsPoint
* operator.Source§fn mul(self, rhs: EdwardsPoint) -> EdwardsPoint
fn mul(self, rhs: EdwardsPoint) -> EdwardsPoint
* operation. Read moreSource§impl Mul<EdwardsPoint> for Scalar
impl Mul<EdwardsPoint> for Scalar
Source§type Output = EdwardsPoint
type Output = EdwardsPoint
* operator.Source§fn mul(self, rhs: EdwardsPoint) -> EdwardsPoint
fn mul(self, rhs: EdwardsPoint) -> EdwardsPoint
* operation. Read moreSource§impl<'a> Mul<MontgomeryPoint> for &'a Scalar
impl<'a> Mul<MontgomeryPoint> for &'a Scalar
Source§type Output = MontgomeryPoint
type Output = MontgomeryPoint
* operator.Source§fn mul(self, rhs: MontgomeryPoint) -> MontgomeryPoint
fn mul(self, rhs: MontgomeryPoint) -> MontgomeryPoint
* operation. Read moreSource§impl Mul<MontgomeryPoint> for Scalar
impl Mul<MontgomeryPoint> for Scalar
Source§type Output = MontgomeryPoint
type Output = MontgomeryPoint
* operator.Source§fn mul(self, rhs: MontgomeryPoint) -> MontgomeryPoint
fn mul(self, rhs: MontgomeryPoint) -> MontgomeryPoint
* operation. Read moreSource§impl<'a> Mul<RistrettoPoint> for &'a Scalar
impl<'a> Mul<RistrettoPoint> for &'a Scalar
Source§type Output = RistrettoPoint
type Output = RistrettoPoint
* operator.Source§fn mul(self, rhs: RistrettoPoint) -> RistrettoPoint
fn mul(self, rhs: RistrettoPoint) -> RistrettoPoint
* operation. Read moreSource§impl Mul<RistrettoPoint> for Scalar
impl Mul<RistrettoPoint> for Scalar
Source§type Output = RistrettoPoint
type Output = RistrettoPoint
* operator.Source§fn mul(self, rhs: RistrettoPoint) -> RistrettoPoint
fn mul(self, rhs: RistrettoPoint) -> RistrettoPoint
* operation. Read moreSource§impl<'a> Mul<Scalar> for &'a EdwardsPoint
impl<'a> Mul<Scalar> for &'a EdwardsPoint
Source§type Output = EdwardsPoint
type Output = EdwardsPoint
* operator.Source§impl<'a> Mul<Scalar> for &'a MontgomeryPoint
impl<'a> Mul<Scalar> for &'a MontgomeryPoint
Source§type Output = MontgomeryPoint
type Output = MontgomeryPoint
* operator.Source§impl<'a> Mul<Scalar> for &'a RistrettoPoint
impl<'a> Mul<Scalar> for &'a RistrettoPoint
Source§type Output = RistrettoPoint
type Output = RistrettoPoint
* operator.Source§impl Mul<Scalar> for EdwardsPoint
impl Mul<Scalar> for EdwardsPoint
Source§type Output = EdwardsPoint
type Output = EdwardsPoint
* operator.Source§impl Mul<Scalar> for MontgomeryPoint
impl Mul<Scalar> for MontgomeryPoint
Source§type Output = MontgomeryPoint
type Output = MontgomeryPoint
* operator.Source§impl Mul<Scalar> for RistrettoPoint
impl Mul<Scalar> for RistrettoPoint
Source§type Output = RistrettoPoint
type Output = RistrettoPoint
* operator.Source§impl<'b> MulAssign<&'b Scalar> for EdwardsPoint
impl<'b> MulAssign<&'b Scalar> for EdwardsPoint
Source§fn mul_assign(&mut self, scalar: &'b Scalar)
fn mul_assign(&mut self, scalar: &'b Scalar)
*= operation. Read moreSource§impl MulAssign<&Scalar> for MontgomeryPoint
impl MulAssign<&Scalar> for MontgomeryPoint
Source§fn mul_assign(&mut self, scalar: &Scalar)
fn mul_assign(&mut self, scalar: &Scalar)
*= operation. Read moreSource§impl<'b> MulAssign<&'b Scalar> for RistrettoPoint
impl<'b> MulAssign<&'b Scalar> for RistrettoPoint
Source§fn mul_assign(&mut self, scalar: &'b Scalar)
fn mul_assign(&mut self, scalar: &'b Scalar)
*= operation. Read moreSource§impl<'b> MulAssign<&'b Scalar> for Scalar
impl<'b> MulAssign<&'b Scalar> for Scalar
Source§fn mul_assign(&mut self, _rhs: &'b Scalar)
fn mul_assign(&mut self, _rhs: &'b Scalar)
*= operation. Read moreSource§impl MulAssign<Scalar> for EdwardsPoint
impl MulAssign<Scalar> for EdwardsPoint
Source§fn mul_assign(&mut self, rhs: Scalar)
fn mul_assign(&mut self, rhs: Scalar)
*= operation. Read moreSource§impl MulAssign<Scalar> for MontgomeryPoint
impl MulAssign<Scalar> for MontgomeryPoint
Source§fn mul_assign(&mut self, rhs: Scalar)
fn mul_assign(&mut self, rhs: Scalar)
*= operation. Read moreSource§impl MulAssign<Scalar> for RistrettoPoint
impl MulAssign<Scalar> for RistrettoPoint
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<'b> SubAssign<&'b Scalar> for Scalar
impl<'b> SubAssign<&'b Scalar> for Scalar
Source§fn sub_assign(&mut self, _rhs: &'b Scalar)
fn sub_assign(&mut self, _rhs: &'b 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 more