editing section 3
This commit is contained in:
parent
1d81549408
commit
4651d62751
@ -557,7 +557,9 @@ at the exchange, and keep receipts in a transaction history. Wallets can be
|
||||
realized as browser extensions, mobile Apps or even in custom
|
||||
hardware. If a user's digital wallet is compromised, the current
|
||||
balance may be lost, just like with an ordinary wallet containing cash.
|
||||
|
||||
A wallet also includes a list of acceptable auditors, and will warn
|
||||
users against using an exchange that is not certified by one of these
|
||||
auditors.
|
||||
|
||||
\begin{figure}[t!]%[36]{R}{0.5\linewidth}
|
||||
\subfloat[Bank login. (Simplified for demonstration.)]{
|
||||
@ -584,7 +586,7 @@ customers to withdraw anonymous digital coins,
|
||||
and merchants to deposit digital coins, in exchange for
|
||||
bank money. Coins are signed by the exchange using
|
||||
a blind signing scheme~\cite{chaum1983blind}. Thus, only
|
||||
the exchange can issue new coins, but coins cannot be traced back
|
||||
an exchange can issue new coins, but coins cannot be traced back
|
||||
to the customer that withdrew them.
|
||||
Furthermore, exchanges learn the amounts withdrawn by customers
|
||||
and deposited by merchants, but they do not learn the relationship
|
||||
@ -595,7 +597,11 @@ of double spending, thus providing merchants instant feedback
|
||||
\item
|
||||
{\em Merchants} provide goods or services in exchange for coins held
|
||||
by customers' wallets. Merchants deposit these coins at the
|
||||
exchange for their regular currency value. Merchants consist of a
|
||||
exchange used by the customer in return for a bank wire
|
||||
transfer of their value. While the exchange is determined by
|
||||
the customer, the merchant's contract specifies the currency,
|
||||
a list of accepted auditors and the maximum exchange deposit
|
||||
fee the merchant is willing to pay. Merchants consist of a
|
||||
{\em frontend}, which interacts with the customer's wallet, and a {\em
|
||||
backend}, which interacts with the exchange. Typical frontends include
|
||||
Web shops and point-of-sale systems.
|
||||
@ -608,6 +614,9 @@ Depending on local legislation, auditors mandate that exchanges
|
||||
have enough financial reserves before authorizing them to create a given
|
||||
volume of signed digital coins in order to compensate for potential risks due to
|
||||
operational failures (such as data loss or theft of private keys) of the exchange.
|
||||
Auditors certify exchanges that they audit using digital signatures. The
|
||||
respective signing keys of the auditors are distributed to customer and
|
||||
merchants.
|
||||
\end{itemize}
|
||||
|
||||
|
||||
@ -622,7 +631,7 @@ Initially, the customer installs the Taler wallet extension for
|
||||
their browser. This only needs to be done once per
|
||||
browser. Naturally, this step may become superfluous if Taler is
|
||||
integrated tightly with browsers in the future. Regardless,
|
||||
installing the extension involves one or two clicks to confirm the
|
||||
installing the extension involves only one or two clicks to confirm the
|
||||
operation. Restarting the browser is not required.
|
||||
|
||||
|
||||
@ -683,13 +692,13 @@ customers, and may help create a competitive market.
|
||||
% \tinyskip
|
||||
|
||||
\begin{figure}[t!]
|
||||
\subfloat[Select article. (Generated by Web shop.)]{
|
||||
\subfloat[Select article. \\ Generated by Web shop.]{
|
||||
\includegraphics[width=0.30\textwidth]{figs/cart.png}
|
||||
\label{subfig:cart}} \hfill
|
||||
\subfloat[Confirm payment. (Generated by Taler wallet.)]{
|
||||
\subfloat[Confirm payment. \\ Generated by Taler wallet.]{
|
||||
\includegraphics[width=0.30\textwidth]{figs/pay.png}
|
||||
\label{subfig:payment}} \hfill
|
||||
\subfloat[Receive article. (Generated by Web shop.)]{
|
||||
\subfloat[Receive article. \\ Generated by Web shop.]{
|
||||
\includegraphics[width=0.30\textwidth]{figs/fulfillment.png}
|
||||
\label{subfig:fulfillment}}
|
||||
\caption{Required steps in a Taler checkout process.}
|
||||
@ -751,35 +760,42 @@ merchant, the customer may choose to cover them.
|
||||
As with traditional Web transactions, customers first select which
|
||||
items they wish to buy. This can involve building a traditional
|
||||
shopping cart, or simply clicking on a particular link for the
|
||||
respective article (Figure~\ref{subfig:cart}).
|
||||
Taler also allows the Web shop to detect
|
||||
the presence of a Taler wallet (Figure~\ref{listing:presence}), so
|
||||
that the selection of other payment methods can be skipped
|
||||
if a Taler wallet is installed (as it is in Figure~\ref{fig:shopping}).
|
||||
respective article (Figure~\ref{subfig:cart}). Once the articles have
|
||||
been selected, the Web shop directs the user to the {\em offer} URL,
|
||||
where the payment details are negotiated. The process usually starts
|
||||
by allowing the user to select a {\em payment method} from a set of
|
||||
methods supported by the Web shop. Taler also allows the Web shop to
|
||||
detect the presence of a Taler wallet (Figure~\ref{listing:presence}),
|
||||
so that the selection of alternative payment methods can be skipped if
|
||||
a Taler wallet is installed (as it is in Figure~\ref{fig:shopping}).
|
||||
|
||||
Web pages can initiate payments by sending a \emph{contract proposal} to the
|
||||
wallet, either via the status code HTTP 402 Payment Required, or via a
|
||||
JavaScript API. The wallet then presents the contract to the user. The format
|
||||
of the contract is in an extensible JSON-based format defined by Taler and not
|
||||
HTML, as the rendering of the contract is done by the wallet to ensure correct
|
||||
visual representation of the terms and price. In case that transaction fees need to be covered by the
|
||||
customer, these are shown together with the rest of the proposed contract.
|
||||
% FIXME: add figure for 402 payment!
|
||||
The offer URL of the Web shop can then initiate payments by sending a
|
||||
\emph{contract proposal} to the wallet, either via the HTTP status
|
||||
code {\tt 402 Payment Required}, or via Taler's JavaScript API
|
||||
(Figure~\ref{listing:contract}). The wallet then presents the
|
||||
contract to the user. The format of the contract is in an extensible
|
||||
JSON-based format defined by Taler and not HTML, as the rendering of
|
||||
the contract is done by the wallet to ensure correct visual
|
||||
representation of the terms and prices. In case that transaction fees
|
||||
need to be covered by the customer, these are shown together with the
|
||||
rest of the proposed contract.
|
||||
|
||||
If the customer approves the contract by clicking the ``Confirm
|
||||
Payment'' button (Figure~\ref{subfig:payment}), their wallet signs the
|
||||
contract with enough coins to cover the contract's cost, stores all of
|
||||
the information in its local database, and redirects the browser to a
|
||||
{\em fulfillment} URL provided by the merchant
|
||||
(Figure~\ref{subfig:fulfillment}).
|
||||
the information in its local database, and transmits the payment to
|
||||
the {\em payment} URI of the Web shop. Once the Web shop confirms the
|
||||
payment, the wallet redirects the browser to the {\em fulfillment} URL
|
||||
provided by the merchant (Figure~\ref{subfig:fulfillment}).
|
||||
|
||||
\subsection{Browser security}
|
||||
|
||||
The Taler wallet operates from a securely isolated {\em background} context on
|
||||
the client side. The user interface that displays
|
||||
the contract and allows the user to confirm the payment is displayed by
|
||||
this background context. If the user accepts, the
|
||||
resulting signed coins are transferred from the client to the
|
||||
merchant's server.
|
||||
The Taler wallet operates from a securely isolated {\em background}
|
||||
context on the client side. The user interface that displays the
|
||||
contract and allows the user to confirm the payment is displayed by
|
||||
this background context. If the user accepts, the resulting signed
|
||||
coins are transferred from the client to the merchant's server.
|
||||
|
||||
By running in the background context, the wallet can perform the
|
||||
cryptographic operations protected from the main process of the Web
|
||||
@ -789,10 +805,9 @@ that generates a page that looks like the wallet's payment page
|
||||
access to the private keys of the coins that are exclusive to the
|
||||
background context.
|
||||
|
||||
The current Taler specification is written to accommodate for
|
||||
the rather restrictive set of APIs that WebExtension, a
|
||||
cross-browser extension API, provides.
|
||||
|
||||
%The current Taler specification is written to accommodate for
|
||||
%the rather restrictive set of APIs that WebExtension, a
|
||||
%cross-browser extension API, provides.
|
||||
|
||||
\subsection{Managing browser session state}
|
||||
|
||||
@ -810,38 +825,48 @@ cross-browser extension API, provides.
|
||||
|
||||
% design that allows merchant to not store any information
|
||||
|
||||
A purchase by a customer, completed or in progress, is uniquely identified by a URL, called
|
||||
the \emph{fulfillment URL}. The information contained in the fulfillment
|
||||
URL must allow the merchant to restore the full contract that was associated
|
||||
with purchase, either directly or indirectly from an identifier in a database%
|
||||
\footnote{Storing information about incomplete purchases potential for abuse from malicious customers.}.
|
||||
A purchase by a customer, completed or in progress, is uniquely
|
||||
identified by a URL, called the \emph{fulfillment URL}. The
|
||||
information contained in the fulfillment URL must allow the merchant
|
||||
to restore the full contract that was associated with the purchase,
|
||||
either directly from the URL or indirectly from an identifier in a
|
||||
database. Efficiently reconstructing the contract entirely from the
|
||||
URL instead of using costly database transactions can be important, as
|
||||
costly disk operations for incomplete purchases make merchants
|
||||
more susceptible to denial-of-service attacks from adversaries
|
||||
pretending to be customers.
|
||||
|
||||
When a customer completed a purchase, navigating to the fulfillment URL in a browser
|
||||
will show the resource associated with the purchase. This resource can be a
|
||||
digital good such as a news article, or simply a confirmation for products that
|
||||
are delivered by other means.
|
||||
When a customer completed a purchase, navigating to the fulfillment
|
||||
URL in a browser will show the resource associated with the purchase.
|
||||
This resource can be a digital good such as a news article, or simply
|
||||
a confirmation for products that are delivered by other means.
|
||||
|
||||
In order to ensure that only the paying customer has access to the web
|
||||
resources behind the fulfillment URL, the web store's server must check the
|
||||
browser's session state. Visiting the fulfillment URL for the first
|
||||
time\footnote{Or after deleting the session state, which e.g. happens when
|
||||
privacy conscious users delete their cookies. Some user agents (such as the TOR browser)
|
||||
do not support persistent (non-session) cookies.} triggers the wallet to send the
|
||||
signed coins that are associated with the contract for the fulfillment URL to
|
||||
the merchant. This process can be triggered via a JavaScript API for the
|
||||
wallet, or by a \emph{HTTP 402 Payment Required} status code.
|
||||
In order to ensure that only the paying customer has access to the Web
|
||||
resources behind the fulfillment URL, the Web store's server must
|
||||
check the browser's session state. If the merchant can confirm that
|
||||
the visitor has paid, the respective Web resource is returned. If the
|
||||
merchant cannot confirm that the visitor has paid for the contract,
|
||||
for example because the session state was lost,\footnote{This can
|
||||
happen when when privacy conscious users delete their cookies.
|
||||
Also, some user agents (such as the TOR browser) do not support
|
||||
persistent (non-session) cookies.} it {\em again} triggers a payment
|
||||
process (either via JavaScript or using {\tt 402 Payment Required}).
|
||||
If the wallet remembers paying for the contract previously, this
|
||||
causes the wallet to retransmit the signed coins that are associated
|
||||
with the purchase to the merchant.
|
||||
|
||||
When a user visits a fulfillment URL without having the associated contract
|
||||
in their wallet, the wallet redirects the browser to the offer URL for that
|
||||
purchase, if applicable. This behavior is useful when a user wishes to
|
||||
send a fulfillment link to another user.
|
||||
When a user visits a fulfillment URL without having the associated
|
||||
contract in their wallet, the wallet redirects the browser to the {\em
|
||||
offer} URL for that purchase, if applicable. This behavior is
|
||||
useful when a user wishes to share a fulfillment link with another
|
||||
user to point him to the same resource.
|
||||
|
||||
Note that due to the limited WebExtensions API, the session
|
||||
state can only be acquired when the browser navigates to
|
||||
the fulfillment URL (without session state), since the session
|
||||
state must be set on the same origin as the fulfillment URL.
|
||||
|
||||
Various failure modes are considered:
|
||||
Various failure modes are considered in this design:
|
||||
|
||||
\begin{itemize}
|
||||
\item If the payment fails on the network, the request is typically
|
||||
@ -860,7 +885,7 @@ Various failure modes are considered:
|
||||
refresh protocol. In this case, later deposits by the merchant
|
||||
will simply fail. If the merchant already succeeded with the payment
|
||||
before the network failure, the customer can either retry the
|
||||
operation via the transaction history, or demand a refund (see
|
||||
operation via the transaction history kept by the wallet, or demand a refund (see
|
||||
below). Handling these errors does not require the customer to give
|
||||
up his privacy.
|
||||
\item If the payment fails due to the exchange
|
||||
@ -876,14 +901,15 @@ Various failure modes are considered:
|
||||
the transaction.
|
||||
\end{itemize}
|
||||
|
||||
|
||||
While our design has a few extra roundtrips,
|
||||
it has the following advantages:
|
||||
\noindent
|
||||
While our design requires a few extra roundtrips,
|
||||
it has the following key advantages:
|
||||
\begin{itemize}
|
||||
\item It works in the confines of the WebExtensions API.
|
||||
\item It supports restoring session state for bookedmarked
|
||||
web resources when session state is cleared in the user agent.
|
||||
\item Sending deep links to other users has the expected behavior
|
||||
\item Sending deep links to fullfilment or offer pages to
|
||||
other users has the expected behavior
|
||||
of asking the other user to pay for the resource.
|
||||
\item Asynchronously POSTing coins from injected JavaScript costs
|
||||
one roundtrip, but does not interfer with navigation and allows
|
||||
@ -895,13 +921,16 @@ it has the following advantages:
|
||||
control of the fulfillment page over the transmission of the payment
|
||||
information minimizes the need for exceptions to handle cross-origin
|
||||
resource sharing~\cite{rfc6454,cors}.
|
||||
\item The architecture supports security-conscious users that may have
|
||||
disabled JavaScript, as it is not necessary to execute JavaScript
|
||||
originating from Web pages to execute the payment process.
|
||||
\end{itemize}
|
||||
|
||||
% \smallskip
|
||||
|
||||
\subsection{Giving change and refunds} % FIXME: maybe leave out change entirely?
|
||||
\subsection{Giving change and refunds}
|
||||
|
||||
An important technical difference between Taler and previous
|
||||
An important cryptographic difference between Taler and previous
|
||||
transaction systems based on blind signing is that Taler is able to
|
||||
provide unlinkable change and refunds. From the user's point of view,
|
||||
obtaining change is automatic and handled by the wallet, i.e., if the
|
||||
@ -1060,7 +1089,7 @@ shops.
|
||||
Figure~\ref{fig:frobearch} shows how the secure payment components
|
||||
interact with the existing Web shop logic. First, the Web shop
|
||||
frontend is responsible for constructing the shopping cart. For this,
|
||||
the shop frontend generates the usual Web pages, which are transmitted
|
||||
the shop frontend generates the customary Web shop pages, which are transmitted
|
||||
to the customer's browser. Once the order has been constructed, the
|
||||
shop frontend provides a {\em proposed contract} in JSON format to the
|
||||
payment backend, which signs it and returns it to the frontend. The
|
||||
@ -1087,7 +1116,8 @@ for a contract to the backend; and, {\bf (8)} executing fulfillment
|
||||
business logic if the backend confirms the validity of the payment.
|
||||
|
||||
To setup a Taler backend, the merchant only needs to configure the
|
||||
wire transfer routing details, such as the merchant's IBAN number.
|
||||
wire transfer routing details, such as the merchant's IBAN number, as
|
||||
well as a list of acceptable auditors and limits for transaction fees.
|
||||
Ideally, the merchant might also want to obtain a certificate for the
|
||||
public key generated by the backend for improved authentication.
|
||||
Otherwise, the customer's authentication of the Web shop simply
|
||||
|
Loading…
Reference in New Issue
Block a user