taler-docs

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

commit 375d7bcce35d1a8c3e1dd6a732261759b61f58fb
parent dad47e3bdf5ffefcb19831910a7f8d1eacd8d57d
Author: Özgür Kesim <oec-taler@kesim.org>
Date:   Sat, 12 Apr 2025 18:40:03 +0200

[dd:pq-refresh] refine protocol

Diffstat:
Mdesign-documents/062-pq-refresh.rst | 55++++++++++++++++++++++++++++++-------------------------
1 file changed, 30 insertions(+), 25 deletions(-)

diff --git a/design-documents/062-pq-refresh.rst b/design-documents/062-pq-refresh.rst @@ -38,45 +38,52 @@ derive the key material of a fresh coin from the old coin: # Notation: # r = random seed, cs = coin secret, Cp = coin public key - # pkDt = denomination key + # pkD = denomination key - def RefreshDerivePQ(r, cs, Cp, pkDt): - t = ("Refresh", Cp) - s = SignDeterministic(cs, Hash1(t), r) - x = Hash1(s) - X = Hash1(x) + def RefreshDerivePQ(r, cs, Cp, pkD): + t = Hash1a("Refresh", Cp, r) + s = SignDeterministic(cs, t) + x = Hash1b(s) c2_s, C2_p = KeyGen(x) b = Hash2(x) - m = Blind(C2_p, b, pkDt) - return (t, s, X, c2_s, C2_p, m) + m = Blind(C2_p, b, pkD) + return (t, s, c2_s, C2_p, m) Key Changes to the existing RefreshDerive: 1. *Deterministic Signatures*: ``s`` proves ownership without DH - 2. *Hash Chain*: ``x``/``X`` derived through sequential hashing - 3. *PQ Commitments*: ``X`` serves as public pre-image commitment + 2. *Hash Chain*: ``x`` derived through hashing + +The hash functions ``Hash1x`` might be the same, but can be pair-wise +different. However, the hash function ``Hash2`` must be different from +all of the other. Protocol Modifications ^^^^^^^^^^^^^^^^^^^^^^ 1. **Melting/Commit Phase**: - - Client generates κ refresh sessions - - Includes m_i, X_i in commitment - - Exchange verifies signature s_i over Hash1("Refresh", C_p) + - Client generates κ refresh blinded coin candidates m_1,... m_κ. + - Sends dirty coin, new denomination and all m_i to the exchange, signed with diry coins' private key + - Exchange verifies the request. + - Exchange calculates h_m = H(m_1,...m_κ) + - Exchange chooses γ from 1...K and signs m_γ. + - Exchange persists h_m → (γ, m_γ, σ_γ) and returns γ to the client. 2. **Reveal Phase**: - - Client discloses all except γ-th session - - Exchange reconstructs hash chains - - Verifies h_C = H(h_X, h_m) consistency + - Client discloses together with h_m all except the γ-th random seeds r_i + and signatures s_i from the call to RefreshDerive. + - Exchange verifies signature s_i over Hash1a("Refresh", C_p, r_i). + - Exchange reconstructs the blinded coins m'_i. + - Exchange verifies h_m = H(m'_1, ..., m_γ, ... m'_κ) equality. + - Exchange returns σ_γ on success. -It is worth noting that, in contrast to the existing refresh protocol -and the proposed protocol [1]_, the client sents all κ tuples of (m_i, X_i) -pairs in the commitment phase. This is necessary such that the exchange -can sign the request with a valid denomination key *at the moment of melting*. -This ensures idempotency of the melting/commit request and that caries over to -the reveal phase. +It is worth noting that, in contrast to the existing refresh protocol, the +client sents all κ tuples of m_i already in the commitment phase. This is +necessary such that the exchange can sign the request with a valid denomination +key *at the moment of melting*. This ensures idempotency of the melting/commit +request and that caries over to the reveal phase. Database Changes ^^^^^^^^^^^^^^^^ @@ -159,7 +166,7 @@ Modified melt request structure: // for the new coins to order. denoms_h: HashCode[]; - // Hash of all the commitments k*n X_i as defined in the + // Hash of all the commitments k*n X_i as defined in the // RefreshDerivePQ function. h_Xs: HashCode; @@ -233,5 +240,3 @@ TODO References ========== .. [1] Work by Jonathan Levine et al., TU Eindhoven. Reference be added here once published - -