From 4c1c8e405bdba1fafbf5cfb318b92b460e3f4855 Mon Sep 17 00:00:00 2001 From: Christian Grothoff Date: Sun, 12 Jul 2020 20:00:56 +0200 Subject: [PATCH] more figures --- doc/system/taler/coin.dot | 47 +++++++++++ doc/system/taler/coin.pdf | Bin 0 -> 17066 bytes doc/system/taler/deposit.dot | 31 +++++++ doc/system/taler/deposit.pdf | Bin 0 -> 15174 bytes doc/system/taler/design.tex | 125 ++++++++++++++++++++++++---- doc/system/taler/implementation.tex | 2 +- 6 files changed, 189 insertions(+), 16 deletions(-) create mode 100644 doc/system/taler/coin.dot create mode 100644 doc/system/taler/coin.pdf create mode 100644 doc/system/taler/deposit.dot create mode 100644 doc/system/taler/deposit.pdf diff --git a/doc/system/taler/coin.dot b/doc/system/taler/coin.dot new file mode 100644 index 000000000..ab1f8139f --- /dev/null +++ b/doc/system/taler/coin.dot @@ -0,0 +1,47 @@ +digraph Coin { + + planchet [color=blue, shape="box"]; + fresh [color=blue, label="fresh coin", shape="box"]; + rs [color=blue, label="refresh session", shape="box"]; + partial [color=blue, label="dirty coin", shape="box"]; + revoked [color=blue, label="revoked coin", shape="box"]; + zombie [color=blue, label="zombie coin", shape="box"]; + spent [color=blue, label="spent coin", shape="doublecircle"]; + expired [color=blue, label="expired coin", shape="doublecircle"]; + + subgraph { + rank = same; spent; expired; + } + + subgraph { + withdraw; melt; + } + + subgraph { + rank = same; melt; reveal; rs; + } + + + planchet->withdraw; + planchet->melt; + withdraw->fresh; + fresh->deposit; + fresh->melt; + deposit->partial; + deposit->spent; + melt->rs; + rs->reveal; + reveal->fresh; + melt->partial; + melt->spent; + spent->refund; + refund->partial; + partial->expired [style=dotted]; + partial->melt; + partial->deposit [color=red]; + fresh->expired [style=dotted]; + fresh->revoked [style=dotted]; + revoked->recoup; + recoup->zombie; + zombie->melt; +} diff --git a/doc/system/taler/coin.pdf b/doc/system/taler/coin.pdf new file mode 100644 index 0000000000000000000000000000000000000000..a5590b75ebc8dcfff9421339325322c5f70b4391 GIT binary patch literal 17066 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 A!vFvP literal 0 HcmV?d00001 diff --git a/doc/system/taler/deposit.dot b/doc/system/taler/deposit.dot new file mode 100644 index 000000000..bfe8c3bdf --- /dev/null +++ b/doc/system/taler/deposit.dot @@ -0,0 +1,31 @@ +digraph Deposit { + + deposited [color=blue, label="deposit created", shape="box"]; + ready [color=blue, label="deposit ready", shape="box"]; + due [color=blue, label="deposit due", shape="box"]; + tiny [color=blue, label="deposit tiny", shape="box"]; + done [color=blue, label="deposit done", shape="doublecircle"]; + wtid [color=blue, label="pending transfer", shape="box"]; + finished [color=blue, label="finished transfer", shape="doublecircle"]; + + subgraph { + rank = same; due; tiny; + } + + pay->deposited; + deposited->ready [style=dotted]; + deposited->refund; + refund->deposited; + refund->ready; + refund->done; + ready->due [style=dotted]; + ready->refund; + aggregate->tiny; + due->aggregate; + ready->aggregate; + tiny->aggregate; + aggregate->done; + aggregate->wtid; + wtid->transfer; + transfer->finished; +} diff --git a/doc/system/taler/deposit.pdf b/doc/system/taler/deposit.pdf new file mode 100644 index 0000000000000000000000000000000000000000..f66e3bd5a09393775a25a75c2f79996b9fd09425 GIT binary patch literal 15174 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 literal 0 HcmV?d00001 diff --git a/doc/system/taler/design.tex b/doc/system/taler/design.tex index ff43376a9..0d2484072 100644 --- a/doc/system/taler/design.tex +++ b/doc/system/taler/design.tex @@ -150,16 +150,19 @@ funds. If a wire transfer to the exchange does not include a valid reserve publ the exchange transfers the money back to the sender. Figure~\ref{fig:reserve:state} illustrates the state machine for a reserve. -Long-terms states are shown in boxes, while actions are in circles. The -final state is in a double-circle. -A reserve is first {\em filled} by a wire transfer. The amount in it is reduced -by withdraw operations. If the balance reaches zero, the reserve is -{\em drained}. If a reserve is not drained after a certain amount of time, -it is automatically closed. A reserve can also be filled via a recoup -action in case that the denomination of an unspent coin that was -withdrawn from the reserve is revoked. +Long-terms states are shown in boxes, while actions are in circles. The final +state is in a double-circle. A reserve is first {\em filled} by a wire +transfer. The amount in it is reduced by withdraw operations. If the balance +reaches zero, the reserve is {\em drained}. If a reserve is not drained after +a certain amount of time, it is automatically closed. A reserve can also be +filled via a recoup action (see Section~\ref{sec:revocation-recoup}) in case +that the denomination of an unspent coin that was withdrawn from the reserve +is revoked. + \begin{figure} - \includegraphics{reserve.pdf} + \begin{center} + \includegraphics{taler/reserve.pdf} + \end{center} \caption{State machine of a reserve.} \label{fig:reserve:states} \end{figure} @@ -261,11 +264,13 @@ deposit confirmation or an error that indicates double spending. When a coin is used in a completed or attempted/aborted payment, the coin's public key is revealed to the merchant/exchange, and further payments with the remaining amount would be linkable to the first spending event. To obtain -unlinkable change for a partially spent (or otherwise revealed coin), GNU Taler -introduces a \emph{refresh protocol}. The refresh protocol allows the customer -to obtain new coins for the remaining amount on a coin. The old coin is marked -as spent after it has been refreshed into new coins. Using blind signatures to -withdraw the refreshed coins makes them unlinkable from the old coin. +unlinkable change for a partially spent (or otherwise revealed coin), GNU +Taler introduces the \emph{refresh protocol}, which consists of three steps: +\emph{melt}, \emph{reveal} and \emph{link}. The refresh protocol allows the +customer to obtain new coins for the remaining amount on a coin. The old coin +is marked as spent after it has been melted, while the reveal step generates +the fresh coins. Using blind signatures to withdraw the refreshed coins makes +them unlinkable from the old coin. % FIXME: talk about logarithmic time, simulation @@ -317,6 +322,7 @@ over the funds. A useful application for sharing are peer-to-peer payments between mutually trusting parties, such as families and friends. \subsection{Aggregation} + For each payment, the merchant can specify a deadline before which the exchange must issue a wire transfer to the merchant's bank account. Before this deadline occurs, multiple payments from deposited coins to the same merchant @@ -326,8 +332,38 @@ transaction. To incentivize merchants to choose a longer wire transfer deadline, the exchange can charge the merchant a fee per aggregated wire transfer. +Figure~\ref{fig:deposit:states} illustrates the state machine for processing +deposits. Long-terms states are shown in boxes, while actions are in circles. +The final state is in a double-circle. Dashed arrows show transitions based +on timing and not external actions. A deposit is first {\em created} when a +wallet makes a payment. A deposit comes with a {\em refund deadline}, and the +wire transfer must not happen before that deadline. Once the refund deadline +has passed, the deposit becomes {\em ready}. Even if a deposit is ready, it +is not automatically wired. In fact, deposits may still be {\em refunded} in +this state. A refund may be full (resulting in the deposit being {\em done}) +or partial, in which case the remaining value is left in the same deposit +state. A deposit comes with a second deadline, the {\em wire deadline}. Once +that deadline has passed, the deposit is {\em due} and must be {\em + aggregated}. Aggregation combines {\bf all} deposits that are {\em due}, +{\em tiny} or {\em ready} into one wire transfer. However, the amount of even +an aggregated deposit may be too small to be executed by the banking +system. In this case, the deposit transitions into the special state {\em + tiny} until the aggregated amount meets the amount threshold. Once +aggregated, the deposits are {\em done}. A wire transfer is first prepared +and then {\em pending}. The transfer is {\em finished} once the bank has +confirmed the {\em transfer}. + +\begin{figure} + \begin{center} + \includegraphics[scale=0.8]{taler/deposit.pdf} + \end{center} + \caption{State machine of a deposit.} + \label{fig:deposit:states} +\end{figure} + \subsection{Refunds} + The aggregation period also opens the opportunity for cheap \emph{refunds}. If a customer is not happy with their product, the merchant can instruct the exchange to give the customer a refund before the wire transfer deadline has @@ -335,10 +371,10 @@ occurred. This effectively ``undoes'' the deposit of the coin, and restores the available amount left on it. The refresh protocol is then used by the customer on the coins involved in a refund, so that payments remain unlinkable. - % FIXME: mention EU customer laws / 14 weeks? \subsection{Fees} + In order to subsidize the operation of the exchange and enable a sustainable business model, the exchange can charge fees for most operations. For withdrawal, refreshing, deposit and refunds, the fee is dependent on the denomination, @@ -374,6 +410,7 @@ the total expected amount that it needs to pay for wire fees. \subsection{The Withdraw Loophole and Tipping}\label{taler:design:tipping} + The withdraw protocol can be (ab)used to illicitly transfer money, when the receiver generates the coin's secret key, and gives the public key to the party executing the withdraw protocol. We call this the ``withdraw loophole''. This @@ -437,12 +474,14 @@ financial regulator, fulfilling the following functionality: % FIXME: discuss indian merchant scenario \subsection{Exchange Compromise Modes} + The exchange is an attractive target for hackers and insider threats. We now discuss different ways that the exchange can be compromised, how to reduce the likelihood of such a compromise, and how to detect and react to such an event if it happens. \subsubsection{Compromise of Denomination Keys and Revocation}\label{sec:revocation-recoup} + When a denomination key pair is compromised, an attacker can ``print money'' by using it to sign coins of that denomination. An exchange (or its auditor) can detect this when the number of deposits for a certain denomination exceed the @@ -512,7 +551,10 @@ pre-programmed with a limit on the number of signatures it can produce. This might be mandated by certain auditors, who will also audit the operational security of an exchange as part of the certification process. + + \subsubsection{Compromise of Signing Keys} + When a signing key is compromised, the attacker can pretend to be a merchant and forge deposit confirmations. To forge a deposit confirmation, the attacker also needs to get a customer to sign a @@ -594,6 +636,7 @@ probabilistic deposit auditing, and honest merchants have proper incentives to participate in the process. \subsubsection{Compromise of the Database} + If an adversary would be able to modify the exchange, this would be detected rather quickly by the auditor, provided that the database has appropriate integrity mechanisms. An attacker could also prevent database updates to block @@ -602,6 +645,7 @@ equivalent to the compromise of signing keys, and can be detected with the same strategies. \subsubsection{Compromise of the Master Key} + If the master key was compromised, an attacker could de-anonymize customers by announcing different sets of denomination keys to each of them. If the exchange was audited, this would be detected quickly, as these denominations @@ -669,6 +713,57 @@ that they cannot immediately spend. Unfortunately our approach is limited to a kidnapping scenario, and not applicable in those blackmail scenarios where the attacker can do damage after they find out that their funds have been erased. +\subsection{Summary} + +Figure~\ref{fig:coin:states} illustrates the overall state machine for processing +coins. Long-terms states are shown in boxes, while actions are in circles. +The final state is in a double-circle. Dashed arrows show transitions based +on timing and not external actions. The red arrow shows an action that is +allowed by the exchange but should never be done by wallets as it would +break unlinkability. + +A coin begins as an unsigned {\em planchet}, which is either signed as part of +the {\em withdraw} protocol or the refresh protocol. The most common scenario +is that the {\em fresh coin} is {\em deposited}. This payment creates a +deposit (see Figure~\ref{fig:deposit:states}) and either a {\em dirty coin} +(if the payment was for a fraction of the coin's value) or a {\em spent coin}. +A spent coin can be {\em refunded} by the merchant (until the deposit is due), +creating a {\em dirty coin}. + +A {\em fresh coin} may also be subject to key {\em revocation}, at which point +the wallet ends up with a {\em revoked coin}. At this point, the wallet can +use the {\em recoup} protocol to recover the value of the coin. If the coin +originated from a {\em withdraw} operation, the value is added back into the +reserve, which is {\em filled} in the process (see +Figure~\ref{fig:reserve:states}). If the coin originated from the {\em + refresh} operation, this results in the old coin turning into a {\em zombie + coin}, which can be refreshed again. + +Dirty coins and fresh coins can be {\em melted}. Dirty coins should always be +melted automatically by the wallet as soon as possible as this is the only +good way to use them while preserving unlinkability. A wallet should also +automatically {\em melt} any {\em fresh coins} that are in danger of their +denomination key nearing its (deposit) {\em expiration} time. If a wallet +fails to do so, coins may {\em expire}, resulting in a loss for the coin's +owner. Dirty coins can also expire. In practice, this happens if the melt fee +exceeds the residual value of the dirty coin. To {\em melt} a coin, the +wallet must commit to one or more {\em planchets} and then demonstrate honesty +when the committment made for the {\em refresh session} is checked during the +{\em reveal} step. If the wallet was honest, {\em reveal} yields {\em fresh + coins}. + +\begin{figure} + \begin{center} + \includegraphics[scale=0.75]{taler/coin.pdf} + \end{center} + \caption{State machine of a coin.} + \label{fig:coin:states} +\end{figure} + + + + + \section{Related Work} % FIXME: Stuff to review/include: % Blindly Signed Contracts: Anonymous On-Blockchain and Off-Blockchain Bitcoin Transactions diff --git a/doc/system/taler/implementation.tex b/doc/system/taler/implementation.tex index e9fdf7991..f386228ff 100644 --- a/doc/system/taler/implementation.tex +++ b/doc/system/taler/implementation.tex @@ -907,7 +907,7 @@ The following APIs are offered by the exchange: the merchant additionally can use the exchange's \texttt{/transfers/\$WTID} API that returns the list of deposits for a wire transfer identifier (WTID) included in the wire transfer to the merchant, as well as the \texttt{/deposits/\$H\_WIRE/\$MERCHANT\_PUB/\$H\_CONTRACT\_TERMS/\$COIN\_PUB} API to look up which wire transfer included the payment for a given deposit. - \item[Refresh] Refreshing consists of two stages. First, using \texttt{/coins/\$COIN\_PUB/melt} an old, possibly dirty coin is melted and thus devaluted. The committment made by the wallet during the melt and the resulting $\gamma$-challenge from the exchange are associated with a {\em refresh session}. Then, using \texttt{/refreshes/$RCH/reveal} the wallet can answer the challenge and obtain fresh coins as change. Finally, \texttt{/coins/\$COIN\_PUB/link} provides the link deterrent against refresh abuse. + \item[Refresh] Refreshing consists of two stages. First, using \texttt{/coins/\$COIN\_PUB/melt} an old, possibly dirty coin is melted and thus devaluted. The committment made by the wallet during the melt and the resulting $\gamma$-challenge from the exchange are associated with a {\em refresh session}. Then, using \texttt{/refreshes/\$RCH/reveal} the wallet can answer the challenge and obtain fresh coins as change. Finally, \texttt{/coins/\$COIN\_PUB/link} provides the link deterrent against refresh abuse. \item[Refunds] The refund API (\texttt{/coins/\$COIN\_PUB/refund}) can ``undo'' a deposit if the merchant gave their signature, and the aggregation deadline for the payment has not occurred yet. \item[Recoup] The recoup API (\texttt{/coins/\$COIN\_PUB/recoup}) allows customers to be compensated