taler-docs

Documentation for GNU Taler components, APIs and protocols
Log | Files | Refs | README | LICENSE

commit abc193e19b81d2341eb6a1bf40e7592550f0473d
parent 51cc3553559392d3d782afd20fceb8999a85d3a3
Author: Christian Grothoff <christian@grothoff.org>
Date:   Tue, 22 Apr 2025 14:52:35 +0200

-clarify

Diffstat:
Mdesign-documents/062-pq-refresh.rst | 48++++++++++++++++++++++++++----------------------
1 file changed, 26 insertions(+), 22 deletions(-)

diff --git a/design-documents/062-pq-refresh.rst b/design-documents/062-pq-refresh.rst @@ -89,12 +89,12 @@ fresh coins from a dirty coin is as follows: m[i] = Blind(C2_p[i], b[i], pkD) return (s, c2_s, C2_p, m) -Note that the above deriviation will need to be done ``kappa`` times with -``kappa - 1`` of the signatures ``s`` being checked by the exchange as part of -the reveal state of the cut-and-choose protocol. Again, each of the ``kappa`` +Note that the above deriviation will need to be done ``κ`` times with +``κ - 1`` of the signatures ``s`` being checked by the exchange as part of +the reveal state of the cut-and-choose protocol. Again, each of the ``κ`` values ``r`` is a public value and can be considered as a kind of a commitment ("I'm going to sign this value") by the dirty coin. The actual *secrets* are -the ``kappa`` signatures ``s`` which need to be disclosed during the +the ``κ`` signatures ``s`` which need to be disclosed during the reveal-part of the refresh operation. @@ -107,16 +107,20 @@ published. 1. **Melting/Commit Phase**: - - Client chooses a master (public) seed r and derives κ nonces r_1, ... r_κ. - - Client generates, using RefreshDeriveBatch, κ*n blinded coin planchets - m[1][1],...,m[1][n],...,m[κ][1],..,m[κ][n] from the nonces - - Sends dirty coin, r, all m[i][j] and new denom-info pkD[] to the exchange, - with signature σ_c of the dirty coins' private key over the request. + - Client chooses a master (public) seed ``r`` and derives ``κ`` nonces ``r_1, ... r_κ``. + - Client generates, using RefreshDeriveBatch, ``κ*n`` blinded coin planchets + ``m[1][1],...,m[1][n],...,m[κ][1],...,m[κ][n]`` from the nonces + - Sends dirty coin public key ``Cp``, seed ``r``, all ``m[i][j]`` and + fresh coin denomination selections ``pkD[1],...pkD[n]`` to the exchange, + with signature ``σ_c`` made with the dirty coins' private key ``cs`` over the request. - Exchange verifies the request. - - Exchange calculates h_m = H(r, pkD[], m[][], meta, <maybe more>) - - Exchange chooses γ from 1...κ and signs all m[γ][], resulting in σ[γ][]. - - Exchange persists h_m → (r, γ, pkD[], m[γ][], σ[γ][], σ_c) and - returns γ to the client. + - Exchange calculates ``h_m = H(r, pkD[], m[][], meta, <maybe more>)`` + - Exchange chooses ``γ`` from ``1...κ`` and signs all ``m[γ][]``, + resulting in ``σ[γ][]``. This is done now as the exchange may later + have deleted (or lost) its private signing key. + - Exchange persists ``h_m → (r, γ, pkD[], m[γ][], σ[γ][], σ_c)``, + deducts the cost for the operation from the old coin balance + (in the same database transaction) and returns ``γ`` to the client. 2. **Reveal Phase**: @@ -179,10 +183,10 @@ API endpoints A new ``/melt`` request is needed, that takes the new `NewMeltRequest` as request body, see below. As in the existing melting/commit phase, it invalidates the coin and prepares -for exchanging of fresh coins. Taler uses a global parameter ``kappa`` for the +for exchanging of fresh coins. Taler uses a global parameter ``κ`` for the cut-and-choose component of the protocol, for which this request is the -commitment. Thus, various arguments are given ``kappa``-times in this step. -At present ``kappa`` is always 3. +commitment. Thus, various arguments are given ``κ``-times in this step. +At present ``κ`` is always 3. The base URL for ``/melt/``-requests may differ from the main base URL of the exchange. The exchange MUST return a 307 or 308 redirection to the correct base @@ -253,12 +257,12 @@ Modified melt request structure: // denominations is of type Clause-Schnorr. blinding_seed?: BlindingMasterSeed; - // ``kappa``` arrays of ``n`` entries for blinded coin candidates, + // ``κ``` arrays of ``n`` entries for blinded coin candidates, // each matching the respective entries in ``denoms_h``. // // Note: These are essentially the m_i values in the RefreshDerivePQ // function. - coin_evs: CoinEnvelope[kappa][]; + coin_evs: CoinEnvelope[κ][]; // Signature by the `coin <coin-priv>` over `TALER_RefreshMeltCoinAffirmationPS`. confirm_sig: CoinSignature; @@ -285,15 +289,15 @@ TODO: explain /reveal-melt endpoint. // 2. blinding_seed, if provided, skip otherwise // 3. denominations in order // 4. amount_with_fee - // 5. kappa*n blinded planchet hashes (which include denomination information), + // 5. κ*n blinded planchet hashes (which include denomination information), // depths first: [0..n)[0..n)[0..n) rc: HashCode; - // The disclosed kappa-1 signatures by the old coin's private key, + // The disclosed κ-1 signatures by the old coin's private key, // over Hash1a("Refresh", Cp, r, i), where Cp is the melted coin's public key, // r is the public refresh nonce from the metling step and i runs over the - // _disclosed_ kappa-1 indices. - signatures: CoinSignature[kappa-1]; + // _disclosed_ κ-1 indices. + signatures: CoinSignature[κ-1]; // IFF the denomination of the old coin had support for age restriction, // the client MUST provide the original age commitment, i. e. the