pub struct RistrettoPoint(/* private fields */);
Expand description
A RistrettoPoint
represents a point in the Ristretto group for
Curve25519. Ristretto, a variant of Decaf, constructs a
prime-order group as a quotient group of a subgroup of (the
Edwards form of) Curve25519.
Internally, a RistrettoPoint
is implemented as a wrapper type
around EdwardsPoint
, with custom equality, compression, and
decompression routines to account for the quotient. This means that
operations on RistrettoPoint
s are exactly as fast as operations on
EdwardsPoint
s.
Implementations§
Source§impl RistrettoPoint
impl RistrettoPoint
Sourcepub fn compress(&self) -> CompressedRistretto
pub fn compress(&self) -> CompressedRistretto
Compress this point using the Ristretto encoding.
Sourcepub fn double_and_compress_batch<'a, I>(points: I) -> Vec<CompressedRistretto>where
I: IntoIterator<Item = &'a RistrettoPoint>,
pub fn double_and_compress_batch<'a, I>(points: I) -> Vec<CompressedRistretto>where
I: IntoIterator<Item = &'a RistrettoPoint>,
Double-and-compress a batch of points. The Ristretto encoding is not batchable, since it requires an inverse square root.
However, given input points \( P_1, \ldots, P_n, \) it is possible to compute the encodings of their doubles \( \mathrm{enc}( [2]P_1), \ldots, \mathrm{enc}( [2]P_n ) \) in a batch.
use rand_core::OsRng;
let mut rng = OsRng;
let points: Vec<RistrettoPoint> =
(0..32).map(|_| RistrettoPoint::random(&mut rng)).collect();
let compressed = RistrettoPoint::double_and_compress_batch(&points);
for (P, P2_compressed) in points.iter().zip(compressed.iter()) {
assert_eq!(*P2_compressed, (P + P).compress());
}
Sourcepub fn hash_from_bytes<D>(input: &[u8]) -> RistrettoPoint
pub fn hash_from_bytes<D>(input: &[u8]) -> RistrettoPoint
Hash a slice of bytes into a RistrettoPoint
.
Takes a type parameter D
, which is any Digest
producing 64
bytes of output.
Convenience wrapper around from_hash
.
§Implementation
Uses the Ristretto-flavoured Elligator 2 map, so that the discrete log of the output point with respect to any other point should be unknown. The map is applied twice and the results are added, to ensure a uniform distribution.
§Example
use sha2::Sha512;
let msg = "To really appreciate architecture, you may even need to commit a murder";
let P = RistrettoPoint::hash_from_bytes::<Sha512>(msg.as_bytes());
Sourcepub fn from_hash<D>(hash: D) -> RistrettoPoint
pub fn from_hash<D>(hash: D) -> RistrettoPoint
Construct a RistrettoPoint
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.
Sourcepub fn from_uniform_bytes(bytes: &[u8; 64]) -> RistrettoPoint
pub fn from_uniform_bytes(bytes: &[u8; 64]) -> RistrettoPoint
Construct a RistrettoPoint
from 64 bytes of data.
If the input bytes are uniformly distributed, the resulting point will be uniformly distributed over the group, and its discrete log with respect to other points should be unknown.
§Implementation
This function splits the input array into two 32-byte halves, takes the low 255 bits of each half mod p, applies the Ristretto-flavored Elligator map to each, and adds the results.
Source§impl RistrettoPoint
impl RistrettoPoint
Sourcepub fn vartime_double_scalar_mul_basepoint(
a: &Scalar,
A: &RistrettoPoint,
b: &Scalar,
) -> RistrettoPoint
pub fn vartime_double_scalar_mul_basepoint( a: &Scalar, A: &RistrettoPoint, b: &Scalar, ) -> RistrettoPoint
Compute \(aA + bB\) in variable time, where \(B\) is the Ristretto basepoint.
Trait Implementations§
Source§impl<'a, 'b> Add<&'b RistrettoPoint> for &'a RistrettoPoint
impl<'a, 'b> Add<&'b RistrettoPoint> for &'a RistrettoPoint
Source§type Output = RistrettoPoint
type Output = RistrettoPoint
+
operator.Source§fn add(self, other: &'b RistrettoPoint) -> RistrettoPoint
fn add(self, other: &'b RistrettoPoint) -> RistrettoPoint
+
operation. Read moreSource§impl<'b> Add<&'b RistrettoPoint> for RistrettoPoint
impl<'b> Add<&'b RistrettoPoint> for RistrettoPoint
Source§type Output = RistrettoPoint
type Output = RistrettoPoint
+
operator.Source§fn add(self, rhs: &'b RistrettoPoint) -> RistrettoPoint
fn add(self, rhs: &'b RistrettoPoint) -> RistrettoPoint
+
operation. Read moreSource§impl<'a> Add<RistrettoPoint> for &'a RistrettoPoint
impl<'a> Add<RistrettoPoint> for &'a RistrettoPoint
Source§type Output = RistrettoPoint
type Output = RistrettoPoint
+
operator.Source§fn add(self, rhs: RistrettoPoint) -> RistrettoPoint
fn add(self, rhs: RistrettoPoint) -> RistrettoPoint
+
operation. Read moreSource§impl Add for RistrettoPoint
impl Add for RistrettoPoint
Source§type Output = RistrettoPoint
type Output = RistrettoPoint
+
operator.Source§fn add(self, rhs: RistrettoPoint) -> RistrettoPoint
fn add(self, rhs: RistrettoPoint) -> RistrettoPoint
+
operation. Read moreSource§impl<'b> AddAssign<&'b RistrettoPoint> for RistrettoPoint
impl<'b> AddAssign<&'b RistrettoPoint> for RistrettoPoint
Source§fn add_assign(&mut self, _rhs: &RistrettoPoint)
fn add_assign(&mut self, _rhs: &RistrettoPoint)
+=
operation. Read moreSource§impl AddAssign for RistrettoPoint
impl AddAssign for RistrettoPoint
Source§fn add_assign(&mut self, rhs: RistrettoPoint)
fn add_assign(&mut self, rhs: RistrettoPoint)
+=
operation. Read moreSource§impl Clone for RistrettoPoint
impl Clone for RistrettoPoint
Source§fn clone(&self) -> RistrettoPoint
fn clone(&self) -> RistrettoPoint
1.0.0 · Source§fn clone_from(&mut self, source: &Self)
fn clone_from(&mut self, source: &Self)
source
. Read moreSource§impl ConditionallySelectable for RistrettoPoint
impl ConditionallySelectable for RistrettoPoint
Source§fn conditional_select(
a: &RistrettoPoint,
b: &RistrettoPoint,
choice: Choice,
) -> RistrettoPoint
fn conditional_select( a: &RistrettoPoint, b: &RistrettoPoint, choice: Choice, ) -> RistrettoPoint
Conditionally select between self
and other
.
§Example
use subtle::ConditionallySelectable;
use subtle::Choice;
let A = RistrettoPoint::identity();
let B = constants::RISTRETTO_BASEPOINT_POINT;
let mut P = A;
P = RistrettoPoint::conditional_select(&A, &B, Choice::from(0));
assert_eq!(P, A);
P = RistrettoPoint::conditional_select(&A, &B, Choice::from(1));
assert_eq!(P, B);
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 RistrettoPoint
impl ConstantTimeEq for RistrettoPoint
Source§impl Debug for RistrettoPoint
impl Debug for RistrettoPoint
Source§impl Default for RistrettoPoint
impl Default for RistrettoPoint
Source§fn default() -> RistrettoPoint
fn default() -> RistrettoPoint
Source§impl<'de> Deserialize<'de> for RistrettoPoint
impl<'de> Deserialize<'de> for RistrettoPoint
Source§fn deserialize<D>(deserializer: D) -> Result<Self, D::Error>where
D: Deserializer<'de>,
fn deserialize<D>(deserializer: D) -> Result<Self, D::Error>where
D: Deserializer<'de>,
Source§impl Identity for RistrettoPoint
impl Identity for RistrettoPoint
Source§fn identity() -> RistrettoPoint
fn identity() -> RistrettoPoint
Source§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 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 RistrettoPoint
impl<'b> Mul<&'b Scalar> for RistrettoPoint
Source§type Output = RistrettoPoint
type Output = RistrettoPoint
*
operator.Source§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 RistrettoPoint
impl<'a> Mul<Scalar> for &'a RistrettoPoint
Source§type Output = RistrettoPoint
type Output = RistrettoPoint
*
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 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 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 MultiscalarMul for RistrettoPoint
impl MultiscalarMul for RistrettoPoint
Source§type Point = RistrettoPoint
type Point = RistrettoPoint
RistrettoPoint
.Source§fn multiscalar_mul<I, J>(scalars: I, points: J) -> RistrettoPoint
fn multiscalar_mul<I, J>(scalars: I, points: J) -> RistrettoPoint
Source§impl<'a> Neg for &'a RistrettoPoint
impl<'a> Neg for &'a RistrettoPoint
Source§type Output = RistrettoPoint
type Output = RistrettoPoint
-
operator.Source§fn neg(self) -> RistrettoPoint
fn neg(self) -> RistrettoPoint
-
operation. Read moreSource§impl Neg for RistrettoPoint
impl Neg for RistrettoPoint
Source§type Output = RistrettoPoint
type Output = RistrettoPoint
-
operator.Source§fn neg(self) -> RistrettoPoint
fn neg(self) -> RistrettoPoint
-
operation. Read moreSource§impl PartialEq for RistrettoPoint
impl PartialEq for RistrettoPoint
Source§impl Serialize for RistrettoPoint
impl Serialize for RistrettoPoint
Source§impl<'a, 'b> Sub<&'b RistrettoPoint> for &'a RistrettoPoint
impl<'a, 'b> Sub<&'b RistrettoPoint> for &'a RistrettoPoint
Source§type Output = RistrettoPoint
type Output = RistrettoPoint
-
operator.Source§fn sub(self, other: &'b RistrettoPoint) -> RistrettoPoint
fn sub(self, other: &'b RistrettoPoint) -> RistrettoPoint
-
operation. Read moreSource§impl<'b> Sub<&'b RistrettoPoint> for RistrettoPoint
impl<'b> Sub<&'b RistrettoPoint> for RistrettoPoint
Source§type Output = RistrettoPoint
type Output = RistrettoPoint
-
operator.Source§fn sub(self, rhs: &'b RistrettoPoint) -> RistrettoPoint
fn sub(self, rhs: &'b RistrettoPoint) -> RistrettoPoint
-
operation. Read moreSource§impl<'a> Sub<RistrettoPoint> for &'a RistrettoPoint
impl<'a> Sub<RistrettoPoint> for &'a RistrettoPoint
Source§type Output = RistrettoPoint
type Output = RistrettoPoint
-
operator.Source§fn sub(self, rhs: RistrettoPoint) -> RistrettoPoint
fn sub(self, rhs: RistrettoPoint) -> RistrettoPoint
-
operation. Read moreSource§impl Sub for RistrettoPoint
impl Sub for RistrettoPoint
Source§type Output = RistrettoPoint
type Output = RistrettoPoint
-
operator.Source§fn sub(self, rhs: RistrettoPoint) -> RistrettoPoint
fn sub(self, rhs: RistrettoPoint) -> RistrettoPoint
-
operation. Read moreSource§impl<'b> SubAssign<&'b RistrettoPoint> for RistrettoPoint
impl<'b> SubAssign<&'b RistrettoPoint> for RistrettoPoint
Source§fn sub_assign(&mut self, _rhs: &RistrettoPoint)
fn sub_assign(&mut self, _rhs: &RistrettoPoint)
-=
operation. Read moreSource§impl SubAssign for RistrettoPoint
impl SubAssign for RistrettoPoint
Source§fn sub_assign(&mut self, rhs: RistrettoPoint)
fn sub_assign(&mut self, rhs: RistrettoPoint)
-=
operation. Read moreSource§impl<T> Sum<T> for RistrettoPointwhere
T: Borrow<RistrettoPoint>,
impl<T> Sum<T> for RistrettoPointwhere
T: Borrow<RistrettoPoint>,
Source§impl VartimeMultiscalarMul for RistrettoPoint
impl VartimeMultiscalarMul for RistrettoPoint
Source§type Point = RistrettoPoint
type Point = RistrettoPoint
RistrettoPoint
.Source§fn optional_multiscalar_mul<I, J>(
scalars: I,
points: J,
) -> Option<RistrettoPoint>
fn optional_multiscalar_mul<I, J>( scalars: I, points: J, ) -> Option<RistrettoPoint>
Option
s of points, compute either Some(Q)
, where
$$
Q = c_1 P_1 + \cdots + c_n P_n,
$$
if all points were Some(P_i)
, or else return None
. Read more