lsd0009

LSD0009: The GNU Taler Protocol
Log | Files | Refs | README

commit 443203a6b584700ce027524f3b902e91f77164ef
parent f7b4c68be6c17c8bc68937fe82b3409e74bce15d
Author: Mikolai Gütschow <mikolai.guetschow@tu-dresden.de>
Date:   Mon, 26 May 2025 11:43:27 +0200

protocol: update withdrawal to v1

Diffstat:
Mdraft-guetschow-taler-protocol.md | 20++++++++++----------
Mdraft-guetschow-taler-protocol.xml | 204++++++++++++++++++++++++++++++++++++++++----------------------------------------
2 files changed, 112 insertions(+), 112 deletions(-)

diff --git a/draft-guetschow-taler-protocol.md b/draft-guetschow-taler-protocol.md @@ -351,13 +351,13 @@ out = (data == exp) The wallet creates `n > 0` coins and requests `n` signatures from the exchange, attributing value to the coins according to `n` chosen denominations. -The total value and withdrawal fee (defined by the Exchange per denomination) +The total value and withdrawal fee (defined by the exchange per denomination) must be smaller or equal to the amount stored in the single reserve used for withdrawal. The symbol `*` in front of a certain part means that it is repeated `n` times for the `n` coins, where `?*` denotes the index number `0 <= ?* < n`. ~~~ - Wallet Exchange + wallet exchange knows *denom.pub knows *denom.priv | | reserve = EdDSA-Keygen() | @@ -374,8 +374,9 @@ persist master_secret | *blind_coin = RSA-FDH-Blind(SHA-512(coin.pub), blind_secret, denom.pub) sig = EdDSA-Sign(reserve.priv, msg) | | | - |--- /reserves/{reserve.pub}/withdraw -->| - |(*SHA-512(denom.pub), *blind_coin, sig) | + |-------------- /withdraw -------------->| + | (reserve.pub, *SHA-512(denom.pub), | + | *blind_coin, sig) | | | | check *denom.pub known and not withdrawal-expired | check EdDSA-Verify(reserve.pub, msg, sig) @@ -395,12 +396,11 @@ persist *(coin, blind_secret, coin_sig) where `msg` is formed as follows: ~~~ -commit = reserve.pub - | bigEndianAmount(sum(*denom.value)) | bigEndianAmount(sum(*denom.fee_withdrawal)) - | SHA-512( *SHA-512(SHA-512(denom.pub) | bigEndian(32, 0x1) | b) ) - | bigEndian(32, 0x00) | bigEndian(32, 0x00) -msg = bigEndian(32, 40) | bigEndian(32, 1200) /* TALER_SIGNATURE_WALLET_RESERVE_WITHDRAW */ - | SHA-512(commit) +msg = bigEndian(32, 160) | bigEndian(32, 1200) /* TALER_SIGNATURE_WALLET_RESERVE_WITHDRAW */ + | bigEndianAmount(sum(*denom.value)) | bigEndianAmount(sum(*denom.fee_withdrawal)) + | SHA-512( *(SHA-512(denom.pub) | bigEndian(32, 0x1) | blind_coin) ) + | bigEndian(256, 0x0) + | bigEndian(32, 0x0) | bigEndian(32, 0x0) ~~~ The wallet derives coins and blinding secrets using `GenerateCoin` from a master secret and an integer index. diff --git a/draft-guetschow-taler-protocol.xml b/draft-guetschow-taler-protocol.xml @@ -29,7 +29,7 @@ </address> </author> - <date year="2025" month="February" day="03"/> + <date year="2025" month="May" day="26"/> <workgroup>independent</workgroup> @@ -382,13 +382,13 @@ out = (data == exp) <t>The wallet creates <spanx style="verb">n &gt; 0</spanx> coins and requests <spanx style="verb">n</spanx> signatures from the exchange, attributing value to the coins according to <spanx style="verb">n</spanx> chosen denominations. -The total value and withdrawal fee (defined by the Exchange per denomination) +The total value and withdrawal fee (defined by the exchange per denomination) must be smaller or equal to the amount stored in the single reserve used for withdrawal. The symbol <spanx style="verb">*</spanx> in front of a certain part means that it is repeated <spanx style="verb">n</spanx> times for the <spanx style="verb">n</spanx> coins, where <spanx style="verb">?*</spanx> denotes the index number <spanx style="verb">0 &lt;= ?* &lt; n</spanx>.</t> <figure><artwork><![CDATA[ - Wallet Exchange + wallet exchange knows *denom.pub knows *denom.priv | | reserve = EdDSA-Keygen() | @@ -405,8 +405,9 @@ persist master_secret | *blind_coin = RSA-FDH-Blind(SHA-512(coin.pub), blind_secret, denom.pub) sig = EdDSA-Sign(reserve.priv, msg) | | | - |--- /reserves/{reserve.pub}/withdraw -->| - |(*SHA-512(denom.pub), *blind_coin, sig) | + |-------------- /withdraw -------------->| + | (reserve.pub, *SHA-512(denom.pub), | + | *blind_coin, sig) | | | | check *denom.pub known and not withdrawal-expired | check EdDSA-Verify(reserve.pub, msg, sig) @@ -426,12 +427,11 @@ persist *(coin, blind_secret, coin_sig) <t>where <spanx style="verb">msg</spanx> is formed as follows:</t> <figure><artwork><![CDATA[ -commit = reserve.pub - | bigEndianAmount(sum(*denom.value)) | bigEndianAmount(sum(*denom.fee_withdrawal)) - | SHA-512( *SHA-512(SHA-512(denom.pub) | bigEndian(32, 0x1) | b) ) - | bigEndian(32, 0x00) | bigEndian(32, 0x00) -msg = bigEndian(32, 40) | bigEndian(32, 1200) /* TALER_SIGNATURE_WALLET_RESERVE_WITHDRAW */ - | SHA-512(commit) +msg = bigEndian(32, 160) | bigEndian(32, 1200) /* TALER_SIGNATURE_WALLET_RESERVE_WITHDRAW */ + | bigEndianAmount(sum(*denom.value)) | bigEndianAmount(sum(*denom.fee_withdrawal)) + | SHA-512( *(SHA-512(denom.pub) | bigEndian(32, 0x1) | blind_coin) ) + | bigEndian(256, 0x0) + | bigEndian(32, 0x0) | bigEndian(32, 0x0) ]]></artwork></figure> <t>The wallet derives coins and blinding secrets using <spanx style="verb">GenerateCoin</spanx> from a master secret and an integer index. @@ -588,97 +588,97 @@ Education and Research (BMBF) within the project Concrete Contracts.</t> </back> <!-- ##markdown-source: -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 -->