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:
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 > 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 <= ?* < 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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
+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
-->