D. J. Bernstein
Authenticators and signatures
A state-of-the-art public-key signature system

Expanded signatures

An expanded signature of a message m under a public key pq has five pieces: The pieces satisfy the equation e H0(r,m) = fs^2 - pqt.

Signers are actually required to generate s in the smaller interval [0,(pq-1)/2], but verifiers do not need to bother checking for this.

How do I encode an expanded signature as a string of bytes?

The standard format is

How do I expand a signature?

Anyone can compute t as (fs^2 - e H0(r,m))/pq. If (e,f,r,s) is a signature, with s in the required range, then the division is exact, and t is in {0,1,...,2^1536-1}. Otherwise the expander can simply set t = 0; the output isn't valid, but the input wasn't valid either.

There are two ways to speed up exact division: first, don't bother computing the remainder; second, compute the bottom half of the quotient 2-adically.

Converting from an expanded signature back to a signature simply means throwing away t.

How do I verify an expanded signature?

The verifier can check the equation e H0(r,m) = fs^2 - pqt modulo a prime v chosen secretly by the verifier. This means computing f(s mod v)^2 - (pq mod v)(t mod v) - e(H0(r,m) mod v) and checking that the result is divisible by v. The same prime v can be reused for many verifications.

If the input is an expanded signature, this procedure says ``yes''; otherwise, this procedure has probability at most 2^{-115} of saying ``yes,'' if v is a uniform random 128-bit prime. This procedure is extremely fast.

Verifiers without a safe source of secret data can instead check the equation modulo several primes v with product larger than 2^{3080}. There are several ways to speed this up.