https://ristretto.group/

Ristretto is a technique for constructing prime order elliptic curve groups 
with non-malleable encodings. It extends Mike Hamburg's 
[Decaf](https://www.shiftleft.org/papers/decaf/) approach to cofactor 
elimination to support cofactor-\(8\) curves such as Curve25519.

In particular, this allows an existing Curve25519 library to implement a 
prime-order group with only a thin abstraction layer, and makes it possible for 
systems using Ed25519 signatures to be safely extended with zero-knowledge 
protocols, with no additional cryptographic assumptions and minimal code 
changes.

Ristretto can be used in conjunction with Edwards curves with cofactor \(4\) or 
\(8\), and provides the following specific parameter choices:

- ristretto255, built on top of Curve25519.

Background

Many cryptographic protocols require an implementation of a group of prime 
order \( \ell \), usually an elliptic curve group. However, modern elliptic 
curve implementations with fast, simple formulas don't provide a prime-order 
group. Instead, they provide a group of order \(h \cdot \ell \) for a small 
cofactor, usually \( h = 4 \) or \( h = 8\).

In many existing protocols, the complexity of managing this abstraction is 
pushed up the stack via ad-hoc protocol modifications. But these modifications 
are a recurring source of vulnerabilities and subtle design complications, and 
they usually prevent applying the security proofs of the abstract protocol.

On the other hand, prime-order curves provide the correct abstraction, but 
their formulas are slower and more difficult to implement in constant time. A 
clean solution to this dilemma is Mike Hamburg's [Decaf 
proposal](https://eprint.iacr.org/2015/673.pdf), which shows how to use a 
cofactor-\(4\) curve to provide a prime-order group – with no additional cost.

This provides the best of both choices: the correct abstraction required to 
implement complex protocols, and the simplicity, efficiency, and speed of a 
non-prime-order curve. However, many systems use Curve25519, which has cofactor 
\(8\), not cofactor \(4\).

Ristretto is a variant of Decaf designed for compatibility with cofactor-\(8\) 
curves, such as Curve25519. It is particularly well-suited for extending 
systems using Ed25519 signatures with complex zero-knowledge protocols.

Pitfalls of a cofactor

Curve cofactors have caused several vulnerabilities in higher-layer protocol 
implementations. The abstraction mismatch can also have subtle consequences for 
programs using these cryptographic protocols, as design quirks in the protocol 
bubble up—possibly even to the UX level.

The malleability in Ed25519 signatures [caused a double-spend 
vulnerability](https://moderncrypto.org/mail-archive/curves/2017/000898.html)—or,
 technically, octuple-spend as \( h = 8\)—in the CryptoNote scheme used by the 
Monero cryptocurrency, where the adversary could add a low-order point to an 
existing transaction, producing a new, seemingly-valid transaction.

In Tor, Ed25519 public key malleability would mean that every v3 onion service 
has eight different addresses, causing mismatches with user expectations and 
potential gotchas for service operators. Fixing this required [expensive 
runtime 
checks](https://trac.torproject.org/projects/tor/ticket/22006#comment:13) in 
the v3 onion services protocol, requiring a full scalar multiplication, point 
compression, and equality check. This check [must be called in several 
places](https://github.com/torproject/tor/search?q=hs_address_is_valid&unscoped_q=hs_address_is_valid)
 to validate that the onion service's key does not contain a small torsion 
component.

Why can't we just multiply by the cofactor?

In some protocols, designers can specify appropriate places to multiply by the 
cofactor \(h\) to "fix" the abstraction mismatches; in others, it's unfeasible 
or impossible. In any case, multiplying by the cofactor often means that 
security proofs are not cleanly applicable.

As touched upon earlier, a curve point consists of an \( h \)-torsion component 
and an \( \ell \)-torsion component. Multiplying by the cofactor is frequently 
referred to as "clearing" the low-order component, however doing so affects the 
\( \ell \)-torsion component, effectively mangling the point. While this works 
for some cases, it is not a validation method. To validate that a point is in 
the prime-order subgroup, one can alternately multiply by \( \ell \) and check 
that the result is the identity. But this is extremely expensive.

Another option is to mandate that all scalars have particular bit patterns, as 
in X25519 and Ed25519. However, this means that scalars are no longer 
well-defined \( \mathrm{mod} \ell \), which makes HKD schemes [much more 
complicated](https://moderncrypto.org/mail-archive/curves/2017/000858.html). 
Yet another approach is to choose a [torsion-safe 
representative](https://moderncrypto.org/mail-archive/curves/2017/000866.html): 
an integer which is \( 0 \mathrm{mod} h \) and with a particular value \( 
\mathrm{mod} \ell \), so that scalar multiplications remove the low-order 
component. But these representatives are a few bits too large to be used with 
existing implementations, and in any case aren't a comprehensive solution.

A comprehensive solution

Rather than bit-twiddling, point mangling, or otherwise kludged-in ad-hoc 
fixes, Ristretto is a thin layer that provides protocol implementors with the 
correct abstraction: a prime-order group.

What is Ristretto?

Ristretto is a construction of a prime-order group using a non-prime-order 
Edwards curve.

The Decaf paper suggests using a non-prime-order curve \(\mathcal E\) to 
implement a prime-order group by constructing a quotient group. Ristretto uses 
the same idea, but with different formulas, in order to allow the use of 
cofactor-\(8\) curves such as Curve25519.

Internally, a Ristretto point is represented by an Edwards point. Two Edwards 
points \(P, Q\) may represent the same Ristretto point, in the same way that 
different projective \( X, Y, Z \) coordinates may represent the same Edwards 
point. Group operations on Ristretto points are carried out with no overhead by 
performing the operations on the representative Edwards points.

To do this, Ristretto defines:

-

a new type for Ristretto points which contains the representative Edwards point;

-

equality on Ristretto points so that all equivalent representatives are 
considered equal;

-

an encoding function on Ristretto points so that all equivalent representatives 
are encoded as identical bitstrings;

-

a decoding function on bitstrings with built-in validation, so that only the 
canonical encodings of valid points are accepted;

-

a map from bitstrings to Ristretto points suitable for hash-to-point operations.

In other words, an existing Edwards curve implementation can implement the 
correct abstraction for complex protocols just by adding a new type and three 
or four functions. Moreover, equality checking for the Ristretto group is 
actually less expensive than equality checking for the underlying curve!

The Ristretto construction is described and justified in detail in the [next 
chapter](https://ristretto.group/details/index.html), and explicit formulas 
aimed at implementors are in the [Explicit 
Formulas](https://ristretto.group/formulas/index.html) chapter.

...

Reply via email to