Compare commits
19 Commits
31f74059e0
...
9865febb17
Author | SHA1 | Date | |
---|---|---|---|
9865febb17 | |||
|
372a103a80 | ||
|
2443ee672d | ||
|
7b62174d00 | ||
|
2508d4bb5c | ||
|
fd9fc9f0cd | ||
|
646c410ace | ||
|
5575194afd | ||
|
ea21572b54 | ||
|
ce515a1f75 | ||
|
eb4c765e30 | ||
|
07be0fd21d | ||
|
3b9e9eed11 | ||
|
76ad5baec7 | ||
|
5b800f800a | ||
|
64ad01dba7 | ||
|
40856734e8 | ||
|
6dfa18c2c4 | ||
|
b390d1a6e6 |
@ -22,6 +22,12 @@
|
|||||||
<anchorfile>microhttpd.h</anchorfile>
|
<anchorfile>microhttpd.h</anchorfile>
|
||||||
<arglist></arglist>
|
<arglist></arglist>
|
||||||
</member>
|
</member>
|
||||||
|
<member kind="define">
|
||||||
|
<type>#define</type>
|
||||||
|
<name>MHD_HTTP_UNAVAILABLE_FOR_LEGAL_REASONS</name>
|
||||||
|
<anchorfile>microhttpd.h</anchorfile>
|
||||||
|
<arglist></arglist>
|
||||||
|
</member>
|
||||||
<member kind="define">
|
<member kind="define">
|
||||||
<type>#define</type>
|
<type>#define</type>
|
||||||
<name>MHD_HTTP_BAD_REQUEST</name>
|
<name>MHD_HTTP_BAD_REQUEST</name>
|
||||||
|
@ -1,12 +1,12 @@
|
|||||||
%!TEX root = ../thesis.tex
|
%!TEX root = ../thesis.tex
|
||||||
|
|
||||||
%
|
%
|
||||||
% vorher in Konsole folgendes aufrufen:
|
% vorher in Konsole folgendes aufrufen:
|
||||||
% makeglossaries makeglossaries dokumentation.acn && makeglossaries dokumentation.glo
|
% makeglossaries makeglossaries dokumentation.acn && makeglossaries dokumentation.glo
|
||||||
%
|
%
|
||||||
|
|
||||||
%
|
%
|
||||||
% Glossareintraege --> referenz, name, beschreibung
|
% Glossareintraege --> reference, name, beschreibung
|
||||||
% Aufruf mit \gls{...}
|
% Aufruf mit \gls{...}
|
||||||
%
|
%
|
||||||
% \newglossaryentry{non-repudiation}{name={non-repudiation},plural={non-repudiation},description={After a message is signed, one can not dispute that a message was signed}}
|
% \newglossaryentry{non-repudiation}{name={non-repudiation},plural={non-repudiation},description={After a message is signed, one can not dispute that a message was signed}}
|
||||||
@ -18,36 +18,36 @@
|
|||||||
}
|
}
|
||||||
|
|
||||||
\newglossaryentry{25519}{
|
\newglossaryentry{25519}{
|
||||||
name = {Curve25519},
|
name = {Curve25519},
|
||||||
description = {A popular elliptic curve used in many cryptographic systems based on elliptic curve cryptography. See section \ref{par:curve25519}}
|
description = {A popular elliptic curve used in many cryptographic systems based on elliptic curve cryptography. See section \ref{par:curve25519}}
|
||||||
}
|
}
|
||||||
|
|
||||||
\newglossaryentry{fdh}{
|
\newglossaryentry{fdh}{
|
||||||
name = {FDH},
|
name = {FDH},
|
||||||
description = {A Full-Domain Hash is a hash function with an image size equal to the original gorup. See section \ref{sec:rsa-fdh}}.
|
description = {A Full-Domain Hash is a hash function with an image size equal to the original gorup. See section \ref{sec:rsa-fdh}}.
|
||||||
}
|
}
|
||||||
|
|
||||||
\newglossaryentry{idempotence}{
|
\newglossaryentry{idempotence}{
|
||||||
name = {idempotence},
|
name = {idempotence},
|
||||||
description = {Idempotence in the context of computer science is a property to ensure that the state of system will not change, no matter how many times the same request was made. See section \ref{abort-idempotency}}
|
description = {Idempotence in the context of computer science is a property to ensure that the state of system will not change, no matter how many times the same request was made. See section \ref{abort-idempotency}}
|
||||||
}
|
}
|
||||||
|
|
||||||
\newglossaryentry{abort-idempotency}{
|
\newglossaryentry{abort-idempotency}{
|
||||||
name = {abort-idempotency},
|
name = {abort-idempotency},
|
||||||
description = {Abort-idempotency is a special case of \gls{idempotence}. On every step in a protocol it needs to be ensured that even on an abort, the same request always receives the same response. See section \ref{abort-idempotency}}
|
description = {Abort-idempotency is a special case of \gls{idempotence}. On every step in a protocol it needs to be ensured that even on an abort, the same request always receives the same response. See section \ref{abort-idempotency}}
|
||||||
}
|
}
|
||||||
|
|
||||||
\newglossaryentry{RSABS}{
|
\newglossaryentry{RSABS}{
|
||||||
name = {RSA Blind Signatures},
|
name = {RSA Blind Signatures},
|
||||||
description = {Chaums Blind Signature Scheme based on RSA. See section \ref{sec:blind-rsa-sign}}
|
description = {Chaums Blind Signature Scheme based on RSA. See section \ref{sec:blind-rsa-sign}}
|
||||||
}
|
}
|
||||||
|
|
||||||
\newglossaryentry{CSBS}{
|
\newglossaryentry{CSBS}{
|
||||||
name = {Clause Blind Schnorr Signatures},
|
name = {Clause Blind Schnorr Signatures},
|
||||||
description = {A secure variant of Blind Schnorr Signature Schemes introduced in section \ref{sec:clause-blind-schnorr-sig}}
|
description = {A secure variant of Blind Schnorr Signature Schemes introduced in section \ref{sec:clause-blind-schnorr-sig}}
|
||||||
}
|
}
|
||||||
|
|
||||||
% \newglossaryentry{25519}{
|
% \newglossaryentry{25519}{
|
||||||
% name = {},
|
% name = {},
|
||||||
% description = {}
|
% description = {}
|
||||||
% }
|
% }
|
||||||
|
@ -51,7 +51,7 @@ In scope are all necessary changes on the protocol(s) and components for the fol
|
|||||||
\item design and implement a protocol where the user proves to the exchange the knowledge of the coin that is to be signed (optional)
|
\item design and implement a protocol where the user proves to the exchange the knowledge of the coin that is to be signed (optional)
|
||||||
\end{itemize}
|
\end{itemize}
|
||||||
|
|
||||||
Out of scope is production readyness of the implementation.
|
Out of scope is production readiness of the implementation.
|
||||||
This is because changes in the protocos and code need to be thoroughly vetted to ensure that no weaknesses or security vulnerabilities were introduced.
|
This is because changes in the protocos and code need to be thoroughly vetted to ensure that no weaknesses or security vulnerabilities were introduced.
|
||||||
Such an audit is out of scope for the thesis and is recommended to be performed in the future.
|
Such an audit is out of scope for the thesis and is recommended to be performed in the future.
|
||||||
The iOS wallet will not be considered in this work.
|
The iOS wallet will not be considered in this work.
|
||||||
@ -69,4 +69,4 @@ Scope changes during the project:
|
|||||||
\item \textbf{Adjusted: } Focus is on the implementation of the exchange protocols (Withdraw, Spend, Refresh and cryptographic utilities)
|
\item \textbf{Adjusted: } Focus is on the implementation of the exchange protocols (Withdraw, Spend, Refresh and cryptographic utilities)
|
||||||
\item \textbf{Adjusted: } Implementation of the refresh protocol and wallet-core are nice-to-have goals
|
\item \textbf{Adjusted: } Implementation of the refresh protocol and wallet-core are nice-to-have goals
|
||||||
\item \textbf{Removed: } The Merchant and the android wallet implementations are out of scope
|
\item \textbf{Removed: } The Merchant and the android wallet implementations are out of scope
|
||||||
\end{itemize}
|
\end{itemize}
|
||||||
|
@ -141,7 +141,6 @@ This can be used to detect compromised signing keys or a malicious exchange.
|
|||||||
|
|
||||||
\subsection{Properties}
|
\subsection{Properties}
|
||||||
\label{sec:taler-properties}
|
\label{sec:taler-properties}
|
||||||
%Alle Taler Eigenschaften die wir angreifen wollen auflisten und bezug nehmen wie diese erreicht werden
|
|
||||||
This section describes Taler's properties.
|
This section describes Taler's properties.
|
||||||
|
|
||||||
\subsubsection{Free Software}
|
\subsubsection{Free Software}
|
||||||
@ -299,7 +298,7 @@ If verification is successful, only Alice knows her private key and Bob uses Ali
|
|||||||
A digital signature scheme has a message space M, a signature space S and three algorithms:
|
A digital signature scheme has a message space M, a signature space S and three algorithms:
|
||||||
\begin{itemize}
|
\begin{itemize}
|
||||||
\item Key generation: $(pk,sk) \gets keyGen()$
|
\item Key generation: $(pk,sk) \gets keyGen()$
|
||||||
\item Signatue generation: $s \gets $sign$_sk(m)$
|
\item Signature generation: $s \gets $sign$_sk(m)$
|
||||||
\item Verification: $ v \gets $verify$_pk(m,s)$ where $v \in {0,1}$
|
\item Verification: $ v \gets $verify$_pk(m,s)$ where $v \in {0,1}$
|
||||||
\end{itemize}
|
\end{itemize}
|
||||||
If the result of the verification algorithm equals 1, a signature for m is called valid.
|
If the result of the verification algorithm equals 1, a signature for m is called valid.
|
||||||
@ -783,7 +782,7 @@ A good introduction to cut and choose protocols gives the Paper from Claude Cré
|
|||||||
The expression cut-and-choose was later introduced by David Chaum in analogy to a popular cake sharing problem:
|
The expression cut-and-choose was later introduced by David Chaum in analogy to a popular cake sharing problem:
|
||||||
Given a complete cake to be shared among two parties distrusting of each other (for reasons of serious appetite).
|
Given a complete cake to be shared among two parties distrusting of each other (for reasons of serious appetite).
|
||||||
A fair way for them to share the cake is to have one of them cut the cake in two equals hares, and let the other one choose his favourite share.
|
A fair way for them to share the cake is to have one of them cut the cake in two equals hares, and let the other one choose his favourite share.
|
||||||
This solution guarantes that it is in the formers best interest to cut the shares as evenly as possible."
|
This solution guarantees that it is in the formers best interest to cut the shares as evenly as possible."
|
||||||
}
|
}
|
||||||
\end{center}
|
\end{center}
|
||||||
|
|
||||||
@ -870,10 +869,10 @@ Figure \ref{fig:withdraw-loophole-exploit} explains how such a payment would wor
|
|||||||
Note that we omitted the parts leading up to the coin creation (contract, agreement of price, number of coins and their denominations).
|
Note that we omitted the parts leading up to the coin creation (contract, agreement of price, number of coins and their denominations).
|
||||||
This is how it works on a high level:
|
This is how it works on a high level:
|
||||||
\begin{enumerate}
|
\begin{enumerate}
|
||||||
\item The malicous merchant generates and blinds coins, which are then transmitted to the customer
|
\item The malicious merchant generates and blinds coins, which are then transmitted to the customer
|
||||||
\item The customer authorizes the withdraw from his reserve by signing the blinded coins with the private key of his reserve, thus generating withdraw confirmations.
|
\item The customer authorizes the withdraw from his reserve by signing the blinded coins with the private key of his reserve, thus generating withdraw confirmations.
|
||||||
\item The withdraw confirmations are transmitted to the exchange, which generates the signatures and returns them to the malicous merchant.
|
\item The withdraw confirmations are transmitted to the exchange, which generates the signatures and returns them to the malicious merchant.
|
||||||
\item The malicous merchant unblinds the signatures.
|
\item The malicious merchant unblinds the signatures.
|
||||||
He is now in possession of the coin, thus the payment is completed.
|
He is now in possession of the coin, thus the payment is completed.
|
||||||
\end{enumerate}
|
\end{enumerate}
|
||||||
|
|
||||||
@ -882,7 +881,7 @@ This is how it works on a high level:
|
|||||||
\resizebox{1.0\textwidth}{!}{$\displaystyle
|
\resizebox{1.0\textwidth}{!}{$\displaystyle
|
||||||
\begin{array}{ l c l}
|
\begin{array}{ l c l}
|
||||||
% preliminaries
|
% preliminaries
|
||||||
\textbf{Customer} & & \textbf{malicous Merchant}
|
\textbf{Customer} & & \textbf{malicious Merchant}
|
||||||
\\ \text{knows:} & & \text{knows:}
|
\\ \text{knows:} & & \text{knows:}
|
||||||
\\ \text{reserve keys } w_s, W_p
|
\\ \text{reserve keys } w_s, W_p
|
||||||
\\ \text{denomination public key } D_p = \langle e, N \rangle & & \text{denomination public key } D_p = \langle e, N \rangle
|
\\ \text{denomination public key } D_p = \langle e, N \rangle & & \text{denomination public key } D_p = \langle e, N \rangle
|
||||||
@ -903,7 +902,7 @@ This is how it works on a high level:
|
|||||||
\\
|
\\
|
||||||
\hline
|
\hline
|
||||||
\\
|
\\
|
||||||
\textbf{malicous Merchant} & & \textbf{Exchange}
|
\textbf{malicious Merchant} & & \textbf{Exchange}
|
||||||
\\\text{knows:} & & \text{knows:}
|
\\\text{knows:} & & \text{knows:}
|
||||||
\\& & \text{reserve public key } W_p
|
\\& & \text{reserve public key } W_p
|
||||||
\\ \text{denomination public key } D_p = \langle e, N \rangle & & \text{denomination keys } d_s, D_p
|
\\ \text{denomination public key } D_p = \langle e, N \rangle & & \text{denomination keys } d_s, D_p
|
||||||
@ -949,7 +948,6 @@ Chapter 4.1.4 describes more general aspects as well as the contract header and
|
|||||||
\subsubsection{Spend Protocol}
|
\subsubsection{Spend Protocol}
|
||||||
The payment process begins when a customer submits a shopping cart (one or more items to buy) and commits his intent to buy them.
|
The payment process begins when a customer submits a shopping cart (one or more items to buy) and commits his intent to buy them.
|
||||||
The merchant has a key pair skM, pkM of which the customer knows the public key.
|
The merchant has a key pair skM, pkM of which the customer knows the public key.
|
||||||
% besseres Wort als commit?
|
|
||||||
Note that certain details contained in contract header or deposit permission like merchant \ac{KYC} information, deposit and refund deadlines and fees are left out.
|
Note that certain details contained in contract header or deposit permission like merchant \ac{KYC} information, deposit and refund deadlines and fees are left out.
|
||||||
The deposit state machine can be seen in figure \ref{fig:deposit:states}.
|
The deposit state machine can be seen in figure \ref{fig:deposit:states}.
|
||||||
\begin{figure}[htp]
|
\begin{figure}[htp]
|
||||||
@ -1033,7 +1031,7 @@ In cases where there are multiple deposit permissions (meaning that multiple coi
|
|||||||
\item Is the signature of the coin valid?
|
\item Is the signature of the coin valid?
|
||||||
\item Is $ f $ (the value to be spent) smaller or equal the residual value of the coin (check for overspending attempt)?
|
\item Is $ f $ (the value to be spent) smaller or equal the residual value of the coin (check for overspending attempt)?
|
||||||
\end{itemize}
|
\end{itemize}
|
||||||
If all checks are successful, the exchange saves the deposit record containing the deposit permission and its signature in a database, substracts the spent value from the residual value of the coin and schedules the money transfer to the merchant's account $ A_m $ (grouping payments is done to reduce payment fees).
|
If all checks are successful, the exchange saves the deposit record containing the deposit permission and its signature in a database, subtracts the spent value from the residual value of the coin and schedules the money transfer to the merchant's account $ A_m $ (grouping payments is done to reduce payment fees).
|
||||||
\\The exchange calculates a deposit confirmation signature $ \sigma_{DC} $ for the deposit permission with the exchange signing private key and returns them to the merchant.
|
\\The exchange calculates a deposit confirmation signature $ \sigma_{DC} $ for the deposit permission with the exchange signing private key and returns them to the merchant.
|
||||||
\\This signature is also used to prove that a merchant was the first to receive payment from a certain coin.
|
\\This signature is also used to prove that a merchant was the first to receive payment from a certain coin.
|
||||||
Without this, an evil exchange could later deny confirming a payment and claim double spending.
|
Without this, an evil exchange could later deny confirming a payment and claim double spending.
|
||||||
@ -1180,7 +1178,7 @@ The customer, which holds the old partially spend coin and knows \\$C_{old} = \t
|
|||||||
On the exchange's side various checks are done to validate the request.
|
On the exchange's side various checks are done to validate the request.
|
||||||
Detailed steps of the commit phase are shown in figure \ref{fig:refresh-part1}.
|
Detailed steps of the commit phase are shown in figure \ref{fig:refresh-part1}.
|
||||||
|
|
||||||
|
|
||||||
\begin{figure}
|
\begin{figure}
|
||||||
\begin{equation*}
|
\begin{equation*}
|
||||||
\resizebox{1.0\textwidth}{!}{$\displaystyle
|
\resizebox{1.0\textwidth}{!}{$\displaystyle
|
||||||
@ -1464,4 +1462,4 @@ When the list of trusted auditor certs of a customer/merchant somehow can be man
|
|||||||
One attack scenario would be to attack customers/merchants with a supply-chain attack on the wallets or merchant backends' implementation.
|
One attack scenario would be to attack customers/merchants with a supply-chain attack on the wallets or merchant backends' implementation.
|
||||||
With software supply-chain attacks on the rise in 2020/21 (although the concept is not new) such an attack could have a big impact. \\
|
With software supply-chain attacks on the rise in 2020/21 (although the concept is not new) such an attack could have a big impact. \\
|
||||||
Since auditor certs are coupled with the wallet (or merchant) implementation, a bank, country, central bank or auditor will most likely publish a wallet and a merchant implementation for the corresponding Taler ecosystem.
|
Since auditor certs are coupled with the wallet (or merchant) implementation, a bank, country, central bank or auditor will most likely publish a wallet and a merchant implementation for the corresponding Taler ecosystem.
|
||||||
%This would make it possible for the publisher to make changes on the Taler protocol for this specific implementation.
|
%This would make it possible for the publisher to make changes on the Taler protocol for this specific implementation.
|
||||||
|
@ -256,7 +256,7 @@ Further, the API ensures that a caller must generate two secret $r$ as in the Cl
|
|||||||
* To ensure unpredictability a new nonce should be used when a new r needs to be derived.
|
* To ensure unpredictability a new nonce should be used when a new r needs to be derived.
|
||||||
* Uses HKDF internally.
|
* Uses HKDF internally.
|
||||||
* Comment: Can be done in one HKDF shot and split output.
|
* Comment: Can be done in one HKDF shot and split output.
|
||||||
*
|
*
|
||||||
* @param nonce is a random nonce
|
* @param nonce is a random nonce
|
||||||
* @param lts is a long-term-secret in form of a private key
|
* @param lts is a long-term-secret in form of a private key
|
||||||
* @param[out] r array containing derived secrets r0 and r1
|
* @param[out] r array containing derived secrets r0 and r1
|
||||||
@ -265,8 +265,8 @@ Further, the API ensures that a caller must generate two secret $r$ as in the Cl
|
|||||||
GNUNET_CRYPTO_cs_r_derive (const struct GNUNET_CRYPTO_CsNonce *nonce,
|
GNUNET_CRYPTO_cs_r_derive (const struct GNUNET_CRYPTO_CsNonce *nonce,
|
||||||
const struct GNUNET_CRYPTO_CsPrivateKey *lts,
|
const struct GNUNET_CRYPTO_CsPrivateKey *lts,
|
||||||
struct GNUNET_CRYPTO_CsRSecret r[2]);
|
struct GNUNET_CRYPTO_CsRSecret r[2]);
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Extract the public R of the given secret r.
|
* Extract the public R of the given secret r.
|
||||||
*
|
*
|
||||||
@ -289,7 +289,7 @@ The blinding secrets are generated by a client who provides a secret as seed to
|
|||||||
* To provide abort-idempotency, blinding factors need to be derived but still need to be UNPREDICTABLE
|
* To provide abort-idempotency, blinding factors need to be derived but still need to be UNPREDICTABLE
|
||||||
* To ensure unpredictability a new nonce has to be used.
|
* To ensure unpredictability a new nonce has to be used.
|
||||||
* Uses HKDF internally
|
* Uses HKDF internally
|
||||||
*
|
*
|
||||||
* @param secret is secret to derive blinding factors
|
* @param secret is secret to derive blinding factors
|
||||||
* @param secret_len secret length
|
* @param secret_len secret length
|
||||||
* @param[out] bs array containing the two derivedGNUNET_CRYPTO_CsBlindingSecret
|
* @param[out] bs array containing the two derivedGNUNET_CRYPTO_CsBlindingSecret
|
||||||
@ -306,7 +306,7 @@ Further the Clause Blind Schnorr API provides an API to calculate the two blinde
|
|||||||
/**
|
/**
|
||||||
* Calculate two blinded c's
|
* Calculate two blinded c's
|
||||||
* Comment: One would be insecure due to Wagner's algorithm solving ROS
|
* Comment: One would be insecure due to Wagner's algorithm solving ROS
|
||||||
*
|
*
|
||||||
* @param bs array of the two blinding factor structs each containing alpha and beta
|
* @param bs array of the two blinding factor structs each containing alpha and beta
|
||||||
* @param r_pub array of the two signer's nonce R
|
* @param r_pub array of the two signer's nonce R
|
||||||
* @param pub the public key of the signer
|
* @param pub the public key of the signer
|
||||||
@ -336,7 +336,7 @@ See listing \ref{lst:crypto-sign-api}.
|
|||||||
* To ensure unpredictability a new nonce has to be used for every signature
|
* To ensure unpredictability a new nonce has to be used for every signature
|
||||||
* HKDF is used internally for derivation
|
* HKDF is used internally for derivation
|
||||||
* r0 and r1 can be derived prior by using GNUNET_CRYPTO_cs_r_derive
|
* r0 and r1 can be derived prior by using GNUNET_CRYPTO_cs_r_derive
|
||||||
*
|
*
|
||||||
* @param priv private key to use for the signing and as LTS in HKDF
|
* @param priv private key to use for the signing and as LTS in HKDF
|
||||||
* @param r array of the two secret nonce from the signer
|
* @param r array of the two secret nonce from the signer
|
||||||
* @param c array of the two blinded c to sign c_b
|
* @param c array of the two blinded c to sign c_b
|
||||||
@ -370,7 +370,7 @@ GNUNET_CRYPTO_cs_unblind (
|
|||||||
struct GNUNET_CRYPTO_CsS *signature_scalar);
|
struct GNUNET_CRYPTO_CsS *signature_scalar);
|
||||||
\end{lstlisting}
|
\end{lstlisting}
|
||||||
|
|
||||||
The verify API takes the message and its signature with the public key and returns GNUNET\_OK for a valid signature and GNUNET\_SYSERR otherwhise.
|
The verify API takes the message and its signature with the public key and returns GNUNET\_OK for a valid signature and GNUNET\_SYSERR otherwise.
|
||||||
See listing \ref{lst:crypto-verify-api}.
|
See listing \ref{lst:crypto-verify-api}.
|
||||||
|
|
||||||
\begin{lstlisting}[style=bfh-c,language=C,, caption={GNUnet verify API}, label={lst:crypto-verify-api}]
|
\begin{lstlisting}[style=bfh-c,language=C,, caption={GNUnet verify API}, label={lst:crypto-verify-api}]
|
||||||
@ -411,7 +411,7 @@ In crypto.c many utility functions are provided to create planchets (for planche
|
|||||||
One difference between \gls{RSABS} and \gls{CSBS} is, that the coin private key and RSA blinding secret can be created at the same point in time, since the RSA blinding secret is created randomly.
|
One difference between \gls{RSABS} and \gls{CSBS} is, that the coin private key and RSA blinding secret can be created at the same point in time, since the RSA blinding secret is created randomly.
|
||||||
However, for Clause Blind Schnorr secrets an additional step is needed, the public $R_0$ and $R_1$ are required to calculate the blinding seed to derive the secrets.
|
However, for Clause Blind Schnorr secrets an additional step is needed, the public $R_0$ and $R_1$ are required to calculate the blinding seed to derive the secrets.
|
||||||
|
|
||||||
A planchet in the Clause Blind Schnorr Signature Scheme can be created as followed (implementation details ommited).
|
A planchet in the Clause Blind Schnorr Signature Scheme can be created as followed (implementation details omitted).
|
||||||
|
|
||||||
\begin{enumerate}
|
\begin{enumerate}
|
||||||
\item Create planchet with new \ac{EdDSA} private key
|
\item Create planchet with new \ac{EdDSA} private key
|
||||||
|
@ -94,8 +94,8 @@ The corresponding crypto helper, that talks with the security module, and its te
|
|||||||
\item \texttt{src/util/test\_helper\_cs.c}: Tests and benchmarks for the \gls{CSBS} crypto helper
|
\item \texttt{src/util/test\_helper\_cs.c}: Tests and benchmarks for the \gls{CSBS} crypto helper
|
||||||
\end{itemize}
|
\end{itemize}
|
||||||
% Crypto API offene Punkte:
|
% Crypto API offene Punkte:
|
||||||
%Input-Validierung von Punkten und Skalar
|
%Input-validation of points and scalars:
|
||||||
% Clamping beschreiben: https://neilmadden.blog/2020/05/28/whats-the-curve25519-clamping-all-about/
|
% describe clamping: https://neilmadden.blog/2020/05/28/whats-the-curve25519-clamping-all-about/
|
||||||
% Testing: inverse operations, blinded signature test
|
% Testing: inverse operations, blinded signature test
|
||||||
|
|
||||||
|
|
||||||
@ -219,7 +219,7 @@ Tests for deposit are implemented here:
|
|||||||
\begin{itemize}
|
\begin{itemize}
|
||||||
\item \url{/src/testing/test_exchange_api.c}: Add tests (see "struct TALER\_TESTING\_Command\ spend\_cs[]") that spend \gls{CSBS} coins withdrawn in tests added for withdrawal
|
\item \url{/src/testing/test_exchange_api.c}: Add tests (see "struct TALER\_TESTING\_Command\ spend\_cs[]") that spend \gls{CSBS} coins withdrawn in tests added for withdrawal
|
||||||
\item \url{/src/json/json_pack.c}: Implement \gls{CSBS} case in function TALER\_JSON\_pack\_denom\_sig
|
\item \url{/src/json/json_pack.c}: Implement \gls{CSBS} case in function TALER\_JSON\_pack\_denom\_sig
|
||||||
\end{itemize}
|
\end{itemize}
|
||||||
|
|
||||||
\section{Fixing a Minor Security Issue in Taler's RSA Blind Signature Protocols}
|
\section{Fixing a Minor Security Issue in Taler's RSA Blind Signature Protocols}
|
||||||
\label{sec:taler-vuln}
|
\label{sec:taler-vuln}
|
||||||
@ -230,7 +230,7 @@ The issue was only in the implementation of the current RSA Blind Signature prot
|
|||||||
\label{sec:taler-vuln-desc}
|
\label{sec:taler-vuln-desc}
|
||||||
|
|
||||||
The redesigned \gls{CSBS} protocols already include the denomination key in the nonce check, which fixes this issue (see \ref{sec:withdraw-protocol-schnorr}).
|
The redesigned \gls{CSBS} protocols already include the denomination key in the nonce check, which fixes this issue (see \ref{sec:withdraw-protocol-schnorr}).
|
||||||
In the case of \gls{RSABS}, the current protocol includes an \gls{idempotence} check by persisting the hash value of the blinded coin $m'$.
|
In the case of \gls{RSABS}, the current protocol includes an \gls{idempotence} check by persisting the hash value of the blinded coin $m'$.
|
||||||
On a withdrawal/refresh the \gls{idempotence} check compares if the hash value of $m'$ was seen in the past and returns the 'old' signature on a match.
|
On a withdrawal/refresh the \gls{idempotence} check compares if the hash value of $m'$ was seen in the past and returns the 'old' signature on a match.
|
||||||
This could lead to the following scenario:
|
This could lead to the following scenario:
|
||||||
|
|
||||||
@ -277,7 +277,7 @@ After discussing this issue with Christian Grothoff, the conclusion was to inclu
|
|||||||
return GNUNET_OK;
|
return GNUNET_OK;
|
||||||
case TALER_DENOMINATION_CS:
|
case TALER_DENOMINATION_CS:
|
||||||
...
|
...
|
||||||
|
|
||||||
\end{lstlisting}
|
\end{lstlisting}
|
||||||
|
|
||||||
The issue is fixed by adding a hash of the current denomination key into the calculation of the hash used in the \gls{idempotence} check.
|
The issue is fixed by adding a hash of the current denomination key into the calculation of the hash used in the \gls{idempotence} check.
|
||||||
@ -295,7 +295,7 @@ The applied fix can be seen in listing \ref{lst:fixed-idempotence}.
|
|||||||
{
|
{
|
||||||
struct GNUNET_HashContext *hash_context;
|
struct GNUNET_HashContext *hash_context;
|
||||||
hash_context = GNUNET_CRYPTO_hash_context_start ();
|
hash_context = GNUNET_CRYPTO_hash_context_start ();
|
||||||
|
|
||||||
GNUNET_CRYPTO_hash_context_read (hash_context,
|
GNUNET_CRYPTO_hash_context_read (hash_context,
|
||||||
&denom_hash->hash,
|
&denom_hash->hash,
|
||||||
sizeof(denom_hash->hash));
|
sizeof(denom_hash->hash));
|
||||||
@ -312,7 +312,7 @@ The applied fix can be seen in listing \ref{lst:fixed-idempotence}.
|
|||||||
{
|
{
|
||||||
struct GNUNET_HashContext *hash_context;
|
struct GNUNET_HashContext *hash_context;
|
||||||
hash_context = GNUNET_CRYPTO_hash_context_start ();
|
hash_context = GNUNET_CRYPTO_hash_context_start ();
|
||||||
|
|
||||||
GNUNET_CRYPTO_hash_context_read (hash_context,
|
GNUNET_CRYPTO_hash_context_read (hash_context,
|
||||||
&denom_hash->hash,
|
&denom_hash->hash,
|
||||||
sizeof(denom_hash->hash));
|
sizeof(denom_hash->hash));
|
||||||
|
@ -57,7 +57,7 @@ This section compares how the two schemes perform regarding CPU usage, latency,
|
|||||||
Clause Schnorr has fixed key sizes with 256 bits (32 bytes), which we compare against different RSA key sizes (1024, 2048, 3072 and 4096 bits).
|
Clause Schnorr has fixed key sizes with 256 bits (32 bytes), which we compare against different RSA key sizes (1024, 2048, 3072 and 4096 bits).
|
||||||
In terms of security, \gls{CSBS} 256 bit keys could be compared to 3072 bit RSA keys (see \url{https://www.keylength.com/} for more information).
|
In terms of security, \gls{CSBS} 256 bit keys could be compared to 3072 bit RSA keys (see \url{https://www.keylength.com/} for more information).
|
||||||
|
|
||||||
\subsection{CPU Usage}
|
\subsection{CPU Usage}
|
||||||
Various benchmarks were made on different CPU architectures.
|
Various benchmarks were made on different CPU architectures.
|
||||||
This section discusses the main results, detailed information about the performance comparison can be found in appendix \ref{chap:app-perf}.
|
This section discusses the main results, detailed information about the performance comparison can be found in appendix \ref{chap:app-perf}.
|
||||||
We thank the Taler team for providing measurements from additional systems and architectures.
|
We thank the Taler team for providing measurements from additional systems and architectures.
|
||||||
@ -75,7 +75,7 @@ Signing and blinding operations are much faster in \gls{CSBS}, also \gls{CSBS} s
|
|||||||
\begin{bfhBox}[BFH-MediumBlue]{Setup}
|
\begin{bfhBox}[BFH-MediumBlue]{Setup}
|
||||||
CPU: 8-core AMD Ryzen 7 PRO 5850U \\
|
CPU: 8-core AMD Ryzen 7 PRO 5850U \\
|
||||||
OS: Ubuntu 21.10 Linux 5.13.0-25-generic \#26-Ubuntu SMP Fri Jan 7 15:48:31 UTC 2022 x86\_64 x86\_64 x86\_64 GNU/Linux \\
|
OS: Ubuntu 21.10 Linux 5.13.0-25-generic \#26-Ubuntu SMP Fri Jan 7 15:48:31 UTC 2022 x86\_64 x86\_64 x86\_64 GNU/Linux \\
|
||||||
libsodium version: 1.0.18-1build1 \\
|
libsodium version: 1.0.18-1build1 \\
|
||||||
libgcrypt version: 1.8.7-5ubuntu2 \\\\
|
libgcrypt version: 1.8.7-5ubuntu2 \\\\
|
||||||
Benchmarks with other hardware setups can be found in appendix \ref{chap:app-perf}.
|
Benchmarks with other hardware setups can be found in appendix \ref{chap:app-perf}.
|
||||||
\end{bfhBox}
|
\end{bfhBox}
|
||||||
@ -112,7 +112,7 @@ RSA 1024 is in some situations faster than the \gls{CSBS} implementation.
|
|||||||
Note that 1024 bit keys are not recommended for many use cases, but the highest currently known RSA factorization done is 829 bits \cite{enwiki:1055393696}.
|
Note that 1024 bit keys are not recommended for many use cases, but the highest currently known RSA factorization done is 829 bits \cite{enwiki:1055393696}.
|
||||||
The following section \ref{sec:disc-risk} explains the risk running RSA 1024 or \gls{CSBS} denominations further.\\
|
The following section \ref{sec:disc-risk} explains the risk running RSA 1024 or \gls{CSBS} denominations further.\\
|
||||||
The blind and unblind operations are running in a wallet implementation, therefore the comparison with RSA 1024 is very interesting for devices with less CPU power.
|
The blind and unblind operations are running in a wallet implementation, therefore the comparison with RSA 1024 is very interesting for devices with less CPU power.
|
||||||
Comparison of such hardware can be found in appendix \ref{chap:app-perf}, these comparison results come to the same conlcusion.\\
|
Comparison of such hardware can be found in appendix \ref{chap:app-perf}, these comparison results come to the same conclusion.\\
|
||||||
Although RSA 1024 bit is much faster in the blinding operation, \gls{CSBS} still perform better when calculating the blinding and unblinding operations together.
|
Although RSA 1024 bit is much faster in the blinding operation, \gls{CSBS} still perform better when calculating the blinding and unblinding operations together.
|
||||||
\gls{CSBS} unblinding computes only an addition of two scalars $s + \alpha \mod p$, while RSA computes $s * r^{-1}$.
|
\gls{CSBS} unblinding computes only an addition of two scalars $s + \alpha \mod p$, while RSA computes $s * r^{-1}$.
|
||||||
To conclude, \gls{CSBS} are faster than RSA 1024 bit and provide a better level of security.
|
To conclude, \gls{CSBS} are faster than RSA 1024 bit and provide a better level of security.
|
||||||
@ -205,7 +205,7 @@ The disk space comparison for a wallet can be found in \ref{tab:comp-wallet-spac
|
|||||||
These are theoretical calculations, implementations may choose to persist additional values.
|
These are theoretical calculations, implementations may choose to persist additional values.
|
||||||
\end{bfhWarnBox}
|
\end{bfhWarnBox}
|
||||||
The reasons that \gls{CSBS} use less bandwidth is mostly because the signature/key sizes are much smaller.
|
The reasons that \gls{CSBS} use less bandwidth is mostly because the signature/key sizes are much smaller.
|
||||||
The bandwith improvements for the \texttt{/keys} API is the same as specified in the table with disk space comparison \ref{tab:comp-sign-space}.
|
The bandwidth improvements for the \texttt{/keys} API is the same as specified in the table with disk space comparison \ref{tab:comp-sign-space}.
|
||||||
For \gls{CSBS} many calculations are performed twice, therefore also two values are submitted.
|
For \gls{CSBS} many calculations are performed twice, therefore also two values are submitted.
|
||||||
Table \ref{tab:comp-band-withd} compares the bandwidth used in a withdrawal.
|
Table \ref{tab:comp-band-withd} compares the bandwidth used in a withdrawal.
|
||||||
The 32 byte values $2 * n_w, 2 * D_p, R_0, R_1, s,W_p, c_0, c_1, \sigma_W$ as well as an integer $b$ are transmitted for \gls{CSBS}.\\
|
The 32 byte values $2 * n_w, 2 * D_p, R_0, R_1, s,W_p, c_0, c_1, \sigma_W$ as well as an integer $b$ are transmitted for \gls{CSBS}.\\
|
||||||
@ -222,14 +222,14 @@ Depending on the hash size another 32 byte (or 64 byte) value is transmitted.
|
|||||||
\setupBfhTabular
|
\setupBfhTabular
|
||||||
\begin{tabular}{lccr}
|
\begin{tabular}{lccr}
|
||||||
\rowcolor{BFH-tablehead}
|
\rowcolor{BFH-tablehead}
|
||||||
\textbf{Signature Scheme} & \textbf{Bandwith used} & \textbf{Factor} & \textbf{1M coins}\\\hline
|
\textbf{Signature Scheme} & \textbf{Bandwidth used} & \textbf{Factor} & \textbf{1M coins}\\\hline
|
||||||
CS 256 bits & 356 bytes & 1x & 324 MB\\\hline
|
CS 256 bits & 356 bytes & 1x & 324 MB\\\hline
|
||||||
RSA 1024 bit & 448 bytes & 1.3x & 448 MB \\\hline
|
RSA 1024 bit & 448 bytes & 1.3x & 448 MB \\\hline
|
||||||
RSA 2048 bit & 832 bytes & 2.5x & 832 MB\\\hline
|
RSA 2048 bit & 832 bytes & 2.5x & 832 MB\\\hline
|
||||||
RSA 3072 bit & 1216 bytes & 3.75x & 1216 MB\\\hline
|
RSA 3072 bit & 1216 bytes & 3.75x & 1216 MB\\\hline
|
||||||
RSA 4096 bit & 1600 bytes & 4.9x & 1600 MB\\\hline
|
RSA 4096 bit & 1600 bytes & 4.9x & 1600 MB\\\hline
|
||||||
\end{tabular}
|
\end{tabular}
|
||||||
\caption{Bandwith comparison withdrawal}
|
\caption{Bandwidth comparison withdrawal}
|
||||||
\label{tab:comp-band-withd}
|
\label{tab:comp-band-withd}
|
||||||
\end{table}
|
\end{table}
|
||||||
|
|
||||||
|
@ -25,8 +25,8 @@ The thesis provides several results to add support for Schnorr's blind signature
|
|||||||
\end{itemize}
|
\end{itemize}
|
||||||
\item Comparison and Analysis
|
\item Comparison and Analysis
|
||||||
\begin{itemize}
|
\begin{itemize}
|
||||||
\item Performance (speed, space, latency \& bandwith)
|
\item Performance (speed, space, latency \& bandwidth)
|
||||||
\item Security
|
\item Security
|
||||||
\item Scheme Comparison
|
\item Scheme Comparison
|
||||||
\end{itemize}
|
\end{itemize}
|
||||||
\item Fixing a minor security issue in Taler's current protocols
|
\item Fixing a minor security issue in Taler's current protocols
|
||||||
@ -47,7 +47,7 @@ This section provides an outlook on what can be done in future work.
|
|||||||
\item Evaluating \& implementing \gls{CSBS} on other curves
|
\item Evaluating \& implementing \gls{CSBS} on other curves
|
||||||
\end{itemize}
|
\end{itemize}
|
||||||
|
|
||||||
There are some remaining protocols to implement, which were out of scope for this thesis.
|
There are some remaining protocols to implement, which were out of scope for this thesis.
|
||||||
To run \gls{CSBS} in production, these protocols have to be implemented too.
|
To run \gls{CSBS} in production, these protocols have to be implemented too.
|
||||||
Further, the merchant needs to support \gls{CSBS} too.
|
Further, the merchant needs to support \gls{CSBS} too.
|
||||||
The merchant implementation can be done fast, as the merchant only verifies denomination signatures in most cases. \\
|
The merchant implementation can be done fast, as the merchant only verifies denomination signatures in most cases. \\
|
||||||
@ -58,7 +58,7 @@ A security audit should always be made when implementing big changes like these.
|
|||||||
As mentioned in the scope section, the optional goal to find and implement a good solution for the withdraw loophole was dropped.
|
As mentioned in the scope section, the optional goal to find and implement a good solution for the withdraw loophole was dropped.
|
||||||
This was due to the scope shift and because the analysis of the problem showed that finding a good solution needs more research and is a whole project in itself (see \ref{sec:scope} for more information).\\
|
This was due to the scope shift and because the analysis of the problem showed that finding a good solution needs more research and is a whole project in itself (see \ref{sec:scope} for more information).\\
|
||||||
Furthermore, \gls{CSBS} could be implemented on other curves.
|
Furthermore, \gls{CSBS} could be implemented on other curves.
|
||||||
For example Curve448 \cite{cryptoeprint:2015:625} could be used, as it provides 224 bits of security, wheras \gls{25519} \cite{bern:curve25519} provides about 128 bits of security.
|
For example Curve448 \cite{cryptoeprint:2015:625} could be used, as it provides 224 bits of security, whereas \gls{25519} \cite{bern:curve25519} provides about 128 bits of security.
|
||||||
Curve secp256k1 could further improve \gls{CSBS} performance.
|
Curve secp256k1 could further improve \gls{CSBS} performance.
|
||||||
While providing support for Curve448 should not be problematic, a potential implementation for secp256k1 needs further analysis (see \cite{bernlange:safecurves} and \cite{bip:schnorr-bitc} for more information).
|
While providing support for Curve448 should not be problematic, a potential implementation for secp256k1 needs further analysis (see \cite{bernlange:safecurves} and \cite{bip:schnorr-bitc} for more information).
|
||||||
|
|
||||||
@ -67,4 +67,4 @@ This thesis includes understanding, analyzing, integrating and implementing a re
|
|||||||
Furthermore, the implementation is done in Taler, an intuitive and modern solution for a social responsible payment system with high ethical standards.
|
Furthermore, the implementation is done in Taler, an intuitive and modern solution for a social responsible payment system with high ethical standards.
|
||||||
Although there was a lot of work, we enjoyed working on such a modern and very interesting topic.
|
Although there was a lot of work, we enjoyed working on such a modern and very interesting topic.
|
||||||
Especially the first successful signature verification and the signature scheme performance benchmarks motivated us to push the implementation and integration into Taler forward.\\
|
Especially the first successful signature verification and the signature scheme performance benchmarks motivated us to push the implementation and integration into Taler forward.\\
|
||||||
We are happy to provide an implementation of a modern scheme and making it available as free software.
|
We are happy to provide an implementation of a modern scheme and making it available as free software.
|
||||||
|
@ -1,6 +1,3 @@
|
|||||||
[arm]
|
|
||||||
CONFIG = /research/taler/exchange/src/auditor/auditor-basedb.conf
|
|
||||||
|
|
||||||
[benchmark]
|
[benchmark]
|
||||||
MERCHANT_DETAILS = merchant_details.json
|
MERCHANT_DETAILS = merchant_details.json
|
||||||
BANK_DETAILS = bank_details.json
|
BANK_DETAILS = bank_details.json
|
||||||
@ -184,4 +181,3 @@ TALER_CACHE_HOME = $TALER_HOME/.cache/taler/
|
|||||||
TALER_CONFIG_HOME = $TALER_HOME/.config/taler/
|
TALER_CONFIG_HOME = $TALER_HOME/.config/taler/
|
||||||
TALER_DATA_HOME = $TALER_HOME/.local/share/taler/
|
TALER_DATA_HOME = $TALER_HOME/.local/share/taler/
|
||||||
TALER_HOME = ${PWD}/generate_auditordb_home/
|
TALER_HOME = ${PWD}/generate_auditordb_home/
|
||||||
|
|
||||||
|
@ -1442,7 +1442,7 @@ BEGIN
|
|||||||
PERFORM create_partitioned_table(
|
PERFORM create_partitioned_table(
|
||||||
'CREATE TABLE IF NOT EXISTS %I'
|
'CREATE TABLE IF NOT EXISTS %I'
|
||||||
'(aggregation_serial_id BIGINT GENERATED BY DEFAULT AS IDENTITY' -- UNIQUE'
|
'(aggregation_serial_id BIGINT GENERATED BY DEFAULT AS IDENTITY' -- UNIQUE'
|
||||||
',deposit_serial_id INT8 PRIMARY KEY' -- REFERENCES deposits (deposit_serial_id) ON DELETE CASCADE' -- FIXME chnage to coint_pub + deposit_serial_id for more efficient depost -- or something else ???
|
',deposit_serial_id INT8 PRIMARY KEY' -- REFERENCES deposits (deposit_serial_id) ON DELETE CASCADE' -- FIXME change to coint_pub + deposit_serial_id for more efficient depost -- or something else ???
|
||||||
',wtid_raw BYTEA NOT NULL' -- CONSTRAINT wire_out_ref REFERENCES wire_out(wtid_raw) ON DELETE CASCADE DEFERRABLE'
|
',wtid_raw BYTEA NOT NULL' -- CONSTRAINT wire_out_ref REFERENCES wire_out(wtid_raw) ON DELETE CASCADE DEFERRABLE'
|
||||||
') %s ;'
|
') %s ;'
|
||||||
,table_name
|
,table_name
|
||||||
@ -16989,4 +16989,3 @@ ALTER TABLE ONLY public.signkey_revocations
|
|||||||
--
|
--
|
||||||
-- PostgreSQL database dump complete
|
-- PostgreSQL database dump complete
|
||||||
--
|
--
|
||||||
|
|
||||||
|
@ -1,6 +1,3 @@
|
|||||||
[arm]
|
|
||||||
CONFIG = /research/taler/exchange/src/auditor/batch.conf
|
|
||||||
|
|
||||||
[benchmark]
|
[benchmark]
|
||||||
MERCHANT_DETAILS = merchant_details.json
|
MERCHANT_DETAILS = merchant_details.json
|
||||||
BANK_DETAILS = bank_details.json
|
BANK_DETAILS = bank_details.json
|
||||||
|
@ -3,6 +3,9 @@ DB = postgres
|
|||||||
TINY_AMOUNT = TESTKUDOS:0.01
|
TINY_AMOUNT = TESTKUDOS:0.01
|
||||||
BASE_URL = http://localhost:8083/
|
BASE_URL = http://localhost:8083/
|
||||||
|
|
||||||
|
# Where do we store the auditor's private key?
|
||||||
|
AUDITOR_PRIV_FILE = ${TALER_DATA_HOME}/auditor/offline-keys/auditor.priv
|
||||||
|
|
||||||
[exchange-account-1]
|
[exchange-account-1]
|
||||||
PAYTO_URI = payto://x-taler-bank/localhost/Exchange
|
PAYTO_URI = payto://x-taler-bank/localhost/Exchange
|
||||||
enable_debit = yes
|
enable_debit = yes
|
||||||
|
@ -1442,7 +1442,7 @@ BEGIN
|
|||||||
PERFORM create_partitioned_table(
|
PERFORM create_partitioned_table(
|
||||||
'CREATE TABLE IF NOT EXISTS %I'
|
'CREATE TABLE IF NOT EXISTS %I'
|
||||||
'(aggregation_serial_id BIGINT GENERATED BY DEFAULT AS IDENTITY' -- UNIQUE'
|
'(aggregation_serial_id BIGINT GENERATED BY DEFAULT AS IDENTITY' -- UNIQUE'
|
||||||
',deposit_serial_id INT8 PRIMARY KEY' -- REFERENCES deposits (deposit_serial_id) ON DELETE CASCADE' -- FIXME chnage to coint_pub + deposit_serial_id for more efficient depost -- or something else ???
|
',deposit_serial_id INT8 PRIMARY KEY' -- REFERENCES deposits (deposit_serial_id) ON DELETE CASCADE' -- FIXME change to coint_pub + deposit_serial_id for more efficient depost -- or something else ???
|
||||||
',wtid_raw BYTEA NOT NULL' -- CONSTRAINT wire_out_ref REFERENCES wire_out(wtid_raw) ON DELETE CASCADE DEFERRABLE'
|
',wtid_raw BYTEA NOT NULL' -- CONSTRAINT wire_out_ref REFERENCES wire_out(wtid_raw) ON DELETE CASCADE DEFERRABLE'
|
||||||
') %s ;'
|
') %s ;'
|
||||||
,table_name
|
,table_name
|
||||||
@ -17001,4 +17001,3 @@ ALTER TABLE ONLY public.signkey_revocations
|
|||||||
--
|
--
|
||||||
-- PostgreSQL database dump complete
|
-- PostgreSQL database dump complete
|
||||||
--
|
--
|
||||||
|
|
||||||
|
@ -1207,6 +1207,7 @@ check_known_coin (
|
|||||||
* @param cls closure
|
* @param cls closure
|
||||||
* @param rowid unique serial ID for the refresh session in our DB
|
* @param rowid unique serial ID for the refresh session in our DB
|
||||||
* @param denom_pub denomination public key of @a coin_pub
|
* @param denom_pub denomination public key of @a coin_pub
|
||||||
|
* @param h_age_commitment hash of the age commitment for the coin
|
||||||
* @param coin_pub public key of the coin
|
* @param coin_pub public key of the coin
|
||||||
* @param coin_sig signature from the coin
|
* @param coin_sig signature from the coin
|
||||||
* @param amount_with_fee amount that was deposited including fee
|
* @param amount_with_fee amount that was deposited including fee
|
||||||
@ -2281,7 +2282,7 @@ recoup_refresh_cb (void *cls,
|
|||||||
*
|
*
|
||||||
* @param cls closure, NULL
|
* @param cls closure, NULL
|
||||||
* @param denom_pub public key, sometimes NULL (!)
|
* @param denom_pub public key, sometimes NULL (!)
|
||||||
* @param validity issuing information with value, fees and other info about the denomination.
|
* @param issue issuing information with value, fees and other info about the denomination.
|
||||||
*/
|
*/
|
||||||
static void
|
static void
|
||||||
check_denomination (
|
check_denomination (
|
||||||
|
@ -1262,7 +1262,6 @@ verify_reserve_balance (void *cls,
|
|||||||
* @param rowid unique serial ID for the deposit in our DB
|
* @param rowid unique serial ID for the deposit in our DB
|
||||||
* @param deposit deposit details
|
* @param deposit deposit details
|
||||||
* @param reserve_pub which reserve is the purse merged into, NULL if unknown
|
* @param reserve_pub which reserve is the purse merged into, NULL if unknown
|
||||||
* @param auditor_balance balance of the purse calculated by auditor
|
|
||||||
* @param flags purse flags
|
* @param flags purse flags
|
||||||
* @param auditor_balance purse balance (according to the
|
* @param auditor_balance purse balance (according to the
|
||||||
* auditor during auditing)
|
* auditor during auditing)
|
||||||
@ -1530,6 +1529,16 @@ handle_purse_merged (
|
|||||||
*
|
*
|
||||||
* @param cls closure
|
* @param cls closure
|
||||||
* @param rowid unique serial ID for the deposit in our DB
|
* @param rowid unique serial ID for the deposit in our DB
|
||||||
|
* @param reserve_pub reserve affected by the merge
|
||||||
|
* @param purse_pub purse being merged
|
||||||
|
* @param h_contract_terms hash over contract of the purse
|
||||||
|
* @param purse_expiration when would the purse expire
|
||||||
|
* @param amount total amount in the purse
|
||||||
|
* @param min_age minimum age of all coins deposited into the purse
|
||||||
|
* @param flags how was the purse created
|
||||||
|
* @param purse_fee if a purse fee was paid, how high is it
|
||||||
|
* @param merge_timestamp when was the merge approved
|
||||||
|
* @param reserve_sig signature by reserve approving the merge
|
||||||
* @return #GNUNET_OK to continue to iterate, #GNUNET_SYSERR to stop
|
* @return #GNUNET_OK to continue to iterate, #GNUNET_SYSERR to stop
|
||||||
*/
|
*/
|
||||||
static enum GNUNET_GenericReturnValue
|
static enum GNUNET_GenericReturnValue
|
||||||
@ -1604,6 +1613,10 @@ handle_account_merged (
|
|||||||
*
|
*
|
||||||
* @param cls closure
|
* @param cls closure
|
||||||
* @param rowid unique serial ID for the deposit in our DB
|
* @param rowid unique serial ID for the deposit in our DB
|
||||||
|
* @param history_fee fee paid for the request
|
||||||
|
* @param ts timestamp of the request
|
||||||
|
* @param reserve_pub reserve history was requested for
|
||||||
|
* @param reserve_sig signature approving the @a history_fee
|
||||||
* @return #GNUNET_OK to continue to iterate, #GNUNET_SYSERR to stop
|
* @return #GNUNET_OK to continue to iterate, #GNUNET_SYSERR to stop
|
||||||
*/
|
*/
|
||||||
static enum GNUNET_GenericReturnValue
|
static enum GNUNET_GenericReturnValue
|
||||||
|
@ -2068,6 +2068,8 @@ postgres_insert_reserve_summary (
|
|||||||
* @param reserve_balance amount stored in the reserve
|
* @param reserve_balance amount stored in the reserve
|
||||||
* @param withdraw_fee_balance amount the exchange gained in withdraw fees
|
* @param withdraw_fee_balance amount the exchange gained in withdraw fees
|
||||||
* due to withdrawals from this reserve
|
* due to withdrawals from this reserve
|
||||||
|
* @param purse_fee_balance amount the exchange gained in purse fees
|
||||||
|
* @param history_fee_balance amount the exchange gained in history fees
|
||||||
* @return transaction status code
|
* @return transaction status code
|
||||||
*/
|
*/
|
||||||
static enum GNUNET_DB_QueryStatus
|
static enum GNUNET_DB_QueryStatus
|
||||||
|
@ -252,7 +252,7 @@ main (int argc,
|
|||||||
GNUNET_GETOPT_option_uint ('R',
|
GNUNET_GETOPT_option_uint ('R',
|
||||||
"reset-shard",
|
"reset-shard",
|
||||||
"OLD_SHARD_IDX",
|
"OLD_SHARD_IDX",
|
||||||
"reset a shard database, does not reinitialize i.e. call taler-exchange-dbinit -S afterwards (DANGEROUS: all existsing data is lost!)",
|
"reset a shard database, does not reinitialize i.e. call taler-exchange-dbinit -S afterwards (DANGEROUS: all existing data is lost!)",
|
||||||
&reset_shard_db),
|
&reset_shard_db),
|
||||||
GNUNET_GETOPT_option_flag ('f',
|
GNUNET_GETOPT_option_flag ('f',
|
||||||
"force",
|
"force",
|
||||||
|
@ -729,7 +729,7 @@ do_shutdown (void *cls)
|
|||||||
GNUNET_log (GNUNET_ERROR_TYPE_ERROR,
|
GNUNET_log (GNUNET_ERROR_TYPE_ERROR,
|
||||||
"Aborting incomplete extensions signature upload #%u\n",
|
"Aborting incomplete extensions signature upload #%u\n",
|
||||||
(unsigned int) uer->idx);
|
(unsigned int) uer->idx);
|
||||||
TALER_EXCHANGE_post_management_extensions_cancel (uer->h);
|
TALER_EXCHANGE_management_post_extensions_cancel (uer->h);
|
||||||
GNUNET_CONTAINER_DLL_remove (uer_head,
|
GNUNET_CONTAINER_DLL_remove (uer_head,
|
||||||
uer_tail,
|
uer_tail,
|
||||||
uer);
|
uer);
|
||||||
|
@ -426,7 +426,7 @@ handle_post_reserves (struct TEH_RequestContext *rc,
|
|||||||
/**
|
/**
|
||||||
* Signature of functions that handle operations on purses.
|
* Signature of functions that handle operations on purses.
|
||||||
*
|
*
|
||||||
* @param rc request context
|
* @param connection HTTP request handle
|
||||||
* @param purse_pub the public key of the purse
|
* @param purse_pub the public key of the purse
|
||||||
* @param root uploaded JSON data
|
* @param root uploaded JSON data
|
||||||
* @return MHD result code
|
* @return MHD result code
|
||||||
|
@ -246,7 +246,6 @@ TEH_keys_denomination_by_hash2 (
|
|||||||
*
|
*
|
||||||
* @param h_denom_pub hash of the public key to use to sign
|
* @param h_denom_pub hash of the public key to use to sign
|
||||||
* @param bp blinded planchet to sign
|
* @param bp blinded planchet to sign
|
||||||
* @param is_melt should we use the KDF for melting?
|
|
||||||
* @param[out] bs set to the blind signature on success
|
* @param[out] bs set to the blind signature on success
|
||||||
* @return #TALER_EC_NONE on success
|
* @return #TALER_EC_NONE on success
|
||||||
*/
|
*/
|
||||||
@ -263,7 +262,6 @@ TEH_keys_denomination_sign_withdraw (
|
|||||||
*
|
*
|
||||||
* @param h_denom_pub hash of the public key to use to sign
|
* @param h_denom_pub hash of the public key to use to sign
|
||||||
* @param bp blinded planchet to sign
|
* @param bp blinded planchet to sign
|
||||||
* @param is_melt should we use the KDF for melting?
|
|
||||||
* @param[out] bs set to the blind signature on success
|
* @param[out] bs set to the blind signature on success
|
||||||
* @return #TALER_EC_NONE on success
|
* @return #TALER_EC_NONE on success
|
||||||
*/
|
*/
|
||||||
|
@ -101,17 +101,17 @@ extern unsigned long long TEH_METRICS_batch_withdraw_num_coins;
|
|||||||
extern unsigned long long TEH_METRICS_num_conflict[TEH_MT_REQUEST_COUNT];
|
extern unsigned long long TEH_METRICS_num_conflict[TEH_MT_REQUEST_COUNT];
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Number of signatures created by the respecitve cipher.
|
* Number of signatures created by the respective cipher.
|
||||||
*/
|
*/
|
||||||
extern unsigned long long TEH_METRICS_num_signatures[TEH_MT_SIGNATURE_COUNT];
|
extern unsigned long long TEH_METRICS_num_signatures[TEH_MT_SIGNATURE_COUNT];
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Number of signatures verified by the respecitve cipher.
|
* Number of signatures verified by the respective cipher.
|
||||||
*/
|
*/
|
||||||
extern unsigned long long TEH_METRICS_num_verifications[TEH_MT_SIGNATURE_COUNT];
|
extern unsigned long long TEH_METRICS_num_verifications[TEH_MT_SIGNATURE_COUNT];
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Number of key exchnages done with the respective cipher.
|
* Number of key exchanges done with the respective cipher.
|
||||||
*/
|
*/
|
||||||
extern unsigned long long TEH_METRICS_num_keyexchanges[TEH_MT_KEYX_COUNT];
|
extern unsigned long long TEH_METRICS_num_keyexchanges[TEH_MT_KEYX_COUNT];
|
||||||
|
|
||||||
|
@ -135,6 +135,12 @@ struct PurseCreateContext
|
|||||||
* Minimum age for deposits into this purse.
|
* Minimum age for deposits into this purse.
|
||||||
*/
|
*/
|
||||||
uint32_t min_age;
|
uint32_t min_age;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Do we have an @e econtract?
|
||||||
|
*/
|
||||||
|
bool no_econtract;
|
||||||
|
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
@ -370,61 +376,64 @@ create_transaction (void *cls,
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
/* 3) if present, persist contract */
|
/* 3) if present, persist contract */
|
||||||
in_conflict = true;
|
if (! pcc->no_econtract)
|
||||||
qs = TEH_plugin->insert_contract (TEH_plugin->cls,
|
|
||||||
pcc->purse_pub,
|
|
||||||
&pcc->econtract,
|
|
||||||
&in_conflict);
|
|
||||||
if (qs < 0)
|
|
||||||
{
|
{
|
||||||
if (GNUNET_DB_STATUS_SOFT_ERROR == qs)
|
in_conflict = true;
|
||||||
return qs;
|
qs = TEH_plugin->insert_contract (TEH_plugin->cls,
|
||||||
TALER_LOG_WARNING ("Failed to store purse information in database\n");
|
pcc->purse_pub,
|
||||||
*mhd_ret = TALER_MHD_reply_with_error (connection,
|
&pcc->econtract,
|
||||||
MHD_HTTP_INTERNAL_SERVER_ERROR,
|
&in_conflict);
|
||||||
TALER_EC_GENERIC_DB_STORE_FAILED,
|
if (qs < 0)
|
||||||
"purse create contract");
|
|
||||||
return GNUNET_DB_STATUS_HARD_ERROR;
|
|
||||||
}
|
|
||||||
if (in_conflict)
|
|
||||||
{
|
|
||||||
struct TALER_EncryptedContract econtract;
|
|
||||||
struct GNUNET_HashCode h_econtract;
|
|
||||||
|
|
||||||
qs = TEH_plugin->select_contract_by_purse (
|
|
||||||
TEH_plugin->cls,
|
|
||||||
pcc->purse_pub,
|
|
||||||
&econtract);
|
|
||||||
if (qs <= 0)
|
|
||||||
{
|
{
|
||||||
if (GNUNET_DB_STATUS_SOFT_ERROR == qs)
|
if (GNUNET_DB_STATUS_SOFT_ERROR == qs)
|
||||||
return qs;
|
return qs;
|
||||||
GNUNET_break (0 != qs);
|
TALER_LOG_WARNING ("Failed to store purse information in database\n");
|
||||||
TALER_LOG_WARNING (
|
|
||||||
"Failed to store fetch contract information from database\n");
|
|
||||||
*mhd_ret = TALER_MHD_reply_with_error (connection,
|
*mhd_ret = TALER_MHD_reply_with_error (connection,
|
||||||
MHD_HTTP_INTERNAL_SERVER_ERROR,
|
MHD_HTTP_INTERNAL_SERVER_ERROR,
|
||||||
TALER_EC_GENERIC_DB_FETCH_FAILED,
|
TALER_EC_GENERIC_DB_STORE_FAILED,
|
||||||
"select contract");
|
"purse create contract");
|
||||||
|
return GNUNET_DB_STATUS_HARD_ERROR;
|
||||||
|
}
|
||||||
|
if (in_conflict)
|
||||||
|
{
|
||||||
|
struct TALER_EncryptedContract econtract;
|
||||||
|
struct GNUNET_HashCode h_econtract;
|
||||||
|
|
||||||
|
qs = TEH_plugin->select_contract_by_purse (
|
||||||
|
TEH_plugin->cls,
|
||||||
|
pcc->purse_pub,
|
||||||
|
&econtract);
|
||||||
|
if (qs <= 0)
|
||||||
|
{
|
||||||
|
if (GNUNET_DB_STATUS_SOFT_ERROR == qs)
|
||||||
|
return qs;
|
||||||
|
GNUNET_break (0 != qs);
|
||||||
|
TALER_LOG_WARNING (
|
||||||
|
"Failed to store fetch contract information from database\n");
|
||||||
|
*mhd_ret = TALER_MHD_reply_with_error (connection,
|
||||||
|
MHD_HTTP_INTERNAL_SERVER_ERROR,
|
||||||
|
TALER_EC_GENERIC_DB_FETCH_FAILED,
|
||||||
|
"select contract");
|
||||||
|
return GNUNET_DB_STATUS_HARD_ERROR;
|
||||||
|
}
|
||||||
|
GNUNET_CRYPTO_hash (econtract.econtract,
|
||||||
|
econtract.econtract_size,
|
||||||
|
&h_econtract);
|
||||||
|
*mhd_ret
|
||||||
|
= TALER_MHD_REPLY_JSON_PACK (
|
||||||
|
connection,
|
||||||
|
MHD_HTTP_CONFLICT,
|
||||||
|
TALER_JSON_pack_ec (
|
||||||
|
TALER_EC_EXCHANGE_PURSE_ECONTRACT_CONFLICTING_META_DATA),
|
||||||
|
GNUNET_JSON_pack_data_auto ("h_econtract",
|
||||||
|
&h_econtract),
|
||||||
|
GNUNET_JSON_pack_data_auto ("econtract_sig",
|
||||||
|
&econtract.econtract_sig),
|
||||||
|
GNUNET_JSON_pack_data_auto ("contract_pub",
|
||||||
|
&econtract.contract_pub));
|
||||||
|
GNUNET_free (econtract.econtract);
|
||||||
return GNUNET_DB_STATUS_HARD_ERROR;
|
return GNUNET_DB_STATUS_HARD_ERROR;
|
||||||
}
|
}
|
||||||
GNUNET_CRYPTO_hash (econtract.econtract,
|
|
||||||
econtract.econtract_size,
|
|
||||||
&h_econtract);
|
|
||||||
*mhd_ret
|
|
||||||
= TALER_MHD_REPLY_JSON_PACK (
|
|
||||||
connection,
|
|
||||||
MHD_HTTP_CONFLICT,
|
|
||||||
TALER_JSON_pack_ec (
|
|
||||||
TALER_EC_EXCHANGE_PURSE_ECONTRACT_CONFLICTING_META_DATA),
|
|
||||||
GNUNET_JSON_pack_data_auto ("h_econtract",
|
|
||||||
&h_econtract),
|
|
||||||
GNUNET_JSON_pack_data_auto ("econtract_sig",
|
|
||||||
&econtract.econtract_sig),
|
|
||||||
GNUNET_JSON_pack_data_auto ("contract_pub",
|
|
||||||
&econtract.contract_pub));
|
|
||||||
GNUNET_free (econtract.econtract);
|
|
||||||
return GNUNET_DB_STATUS_HARD_ERROR;
|
|
||||||
}
|
}
|
||||||
return qs;
|
return qs;
|
||||||
}
|
}
|
||||||
@ -434,8 +443,8 @@ create_transaction (void *cls,
|
|||||||
* Parse a coin and check signature of the coin and the denomination
|
* Parse a coin and check signature of the coin and the denomination
|
||||||
* signature over the coin.
|
* signature over the coin.
|
||||||
*
|
*
|
||||||
* @param[in,out] our HTTP connection
|
* @param[in,out] connection our HTTP connection
|
||||||
* @param[in,out] request context
|
* @param[in,out] pcc request context
|
||||||
* @param[out] coin coin to initialize
|
* @param[out] coin coin to initialize
|
||||||
* @param jcoin coin to parse
|
* @param jcoin coin to parse
|
||||||
* @return #GNUNET_OK on success, #GNUNET_NO if an error was returned,
|
* @return #GNUNET_OK on success, #GNUNET_NO if an error was returned,
|
||||||
@ -664,7 +673,6 @@ TEH_handler_purses_create (
|
|||||||
json_t *deposits;
|
json_t *deposits;
|
||||||
json_t *deposit;
|
json_t *deposit;
|
||||||
unsigned int idx;
|
unsigned int idx;
|
||||||
bool no_econtract = true;
|
|
||||||
struct GNUNET_JSON_Specification spec[] = {
|
struct GNUNET_JSON_Specification spec[] = {
|
||||||
TALER_JSON_spec_amount ("amount",
|
TALER_JSON_spec_amount ("amount",
|
||||||
TEH_currency,
|
TEH_currency,
|
||||||
@ -674,7 +682,7 @@ TEH_handler_purses_create (
|
|||||||
GNUNET_JSON_spec_mark_optional (
|
GNUNET_JSON_spec_mark_optional (
|
||||||
TALER_JSON_spec_econtract ("econtract",
|
TALER_JSON_spec_econtract ("econtract",
|
||||||
&pcc.econtract),
|
&pcc.econtract),
|
||||||
&no_econtract),
|
&pcc.no_econtract),
|
||||||
GNUNET_JSON_spec_fixed_auto ("merge_pub",
|
GNUNET_JSON_spec_fixed_auto ("merge_pub",
|
||||||
&pcc.merge_pub),
|
&pcc.merge_pub),
|
||||||
GNUNET_JSON_spec_fixed_auto ("purse_sig",
|
GNUNET_JSON_spec_fixed_auto ("purse_sig",
|
||||||
@ -815,7 +823,7 @@ TEH_handler_purses_create (
|
|||||||
TALER_EC_EXCHANGE_PURSE_CREATE_SIGNATURE_INVALID,
|
TALER_EC_EXCHANGE_PURSE_CREATE_SIGNATURE_INVALID,
|
||||||
NULL);
|
NULL);
|
||||||
}
|
}
|
||||||
if ( (! no_econtract) &&
|
if ( (! pcc.no_econtract) &&
|
||||||
(GNUNET_OK !=
|
(GNUNET_OK !=
|
||||||
TALER_wallet_econtract_upload_verify (pcc.econtract.econtract,
|
TALER_wallet_econtract_upload_verify (pcc.econtract.econtract,
|
||||||
pcc.econtract.econtract_size,
|
pcc.econtract.econtract_size,
|
||||||
|
@ -287,8 +287,8 @@ deposit_transaction (void *cls,
|
|||||||
* Parse a coin and check signature of the coin and the denomination
|
* Parse a coin and check signature of the coin and the denomination
|
||||||
* signature over the coin.
|
* signature over the coin.
|
||||||
*
|
*
|
||||||
* @param[in,out] our HTTP connection
|
* @param[in,out] connection our HTTP connection
|
||||||
* @param[in,out] request context
|
* @param[in,out] pcc request context
|
||||||
* @param[out] coin coin to initialize
|
* @param[out] coin coin to initialize
|
||||||
* @param jcoin coin to parse
|
* @param jcoin coin to parse
|
||||||
* @return #GNUNET_OK on success, #GNUNET_NO if an error was returned,
|
* @return #GNUNET_OK on success, #GNUNET_NO if an error was returned,
|
||||||
|
@ -166,6 +166,7 @@ recoup_refresh_transaction (void *cls,
|
|||||||
* @param exchange_vals values contributed by the exchange
|
* @param exchange_vals values contributed by the exchange
|
||||||
* during refresh
|
* during refresh
|
||||||
* @param coin_bks blinding data of the coin (to be checked)
|
* @param coin_bks blinding data of the coin (to be checked)
|
||||||
|
* @param nonce withdraw nonce (if CS is used)
|
||||||
* @param coin_sig signature of the coin
|
* @param coin_sig signature of the coin
|
||||||
* @return MHD result code
|
* @return MHD result code
|
||||||
*/
|
*/
|
||||||
|
@ -169,6 +169,7 @@ recoup_transaction (void *cls,
|
|||||||
* @param exchange_vals values contributed by the exchange
|
* @param exchange_vals values contributed by the exchange
|
||||||
* during withdrawal
|
* during withdrawal
|
||||||
* @param coin_bks blinding data of the coin (to be checked)
|
* @param coin_bks blinding data of the coin (to be checked)
|
||||||
|
* @param nonce coin's nonce if CS is used
|
||||||
* @param coin_sig signature of the coin
|
* @param coin_sig signature of the coin
|
||||||
* @return MHD result code
|
* @return MHD result code
|
||||||
*/
|
*/
|
||||||
|
@ -111,7 +111,7 @@ struct RevealContext
|
|||||||
/**
|
/**
|
||||||
* Array of information about fresh coins being revealed.
|
* Array of information about fresh coins being revealed.
|
||||||
*/
|
*/
|
||||||
/* FIXME: const would be nicer here, but we initalize
|
/* FIXME: const would be nicer here, but we initialize
|
||||||
the 'alg_values' in the verification
|
the 'alg_values' in the verification
|
||||||
routine; suboptimal to be fixed... */
|
routine; suboptimal to be fixed... */
|
||||||
struct TALER_EXCHANGEDB_RefreshRevealedCoin *rrcs;
|
struct TALER_EXCHANGEDB_RefreshRevealedCoin *rrcs;
|
||||||
|
@ -80,7 +80,7 @@ struct ReserveHistoryContext
|
|||||||
* Send reserve history to client.
|
* Send reserve history to client.
|
||||||
*
|
*
|
||||||
* @param connection connection to the client
|
* @param connection connection to the client
|
||||||
* @param rh reserve history to return
|
* @param rhc reserve history to return
|
||||||
* @return MHD result code
|
* @return MHD result code
|
||||||
*/
|
*/
|
||||||
static MHD_RESULT
|
static MHD_RESULT
|
||||||
|
@ -33,7 +33,7 @@
|
|||||||
* will ultimately lead to the "purses create" being executed, or rejected.
|
* will ultimately lead to the "purses create" being executed, or rejected.
|
||||||
*
|
*
|
||||||
* @param rc request context
|
* @param rc request context
|
||||||
* @param purse_pub public key of the purse
|
* @param reserve_pub public key of the reserve
|
||||||
* @param root uploaded JSON data
|
* @param root uploaded JSON data
|
||||||
* @return MHD result code
|
* @return MHD result code
|
||||||
*/
|
*/
|
||||||
|
@ -69,7 +69,7 @@ struct ReserveStatusContext
|
|||||||
* Send reserve status to client.
|
* Send reserve status to client.
|
||||||
*
|
*
|
||||||
* @param connection connection to the client
|
* @param connection connection to the client
|
||||||
* @param rh reserve history to return
|
* @param rhc reserve history to return
|
||||||
* @return MHD result code
|
* @return MHD result code
|
||||||
*/
|
*/
|
||||||
static MHD_RESULT
|
static MHD_RESULT
|
||||||
|
@ -70,7 +70,7 @@ BEGIN
|
|||||||
END
|
END
|
||||||
$$;
|
$$;
|
||||||
|
|
||||||
-- We need a seperate function for this, as we call create_table only once but need to add
|
-- We need a separate function for this, as we call create_table only once but need to add
|
||||||
-- those constraints to each partition which gets created
|
-- those constraints to each partition which gets created
|
||||||
CREATE OR REPLACE FUNCTION add_constraints_to_wire_targets_partition(
|
CREATE OR REPLACE FUNCTION add_constraints_to_wire_targets_partition(
|
||||||
IN partition_suffix VARCHAR
|
IN partition_suffix VARCHAR
|
||||||
@ -866,7 +866,7 @@ BEGIN
|
|||||||
PERFORM create_partitioned_table(
|
PERFORM create_partitioned_table(
|
||||||
'CREATE TABLE IF NOT EXISTS %I'
|
'CREATE TABLE IF NOT EXISTS %I'
|
||||||
'(aggregation_serial_id BIGINT GENERATED BY DEFAULT AS IDENTITY' -- UNIQUE'
|
'(aggregation_serial_id BIGINT GENERATED BY DEFAULT AS IDENTITY' -- UNIQUE'
|
||||||
',deposit_serial_id INT8 PRIMARY KEY' -- REFERENCES deposits (deposit_serial_id) ON DELETE CASCADE' -- FIXME chnage to coint_pub + deposit_serial_id for more efficient depost -- or something else ???
|
',deposit_serial_id INT8 PRIMARY KEY' -- REFERENCES deposits (deposit_serial_id) ON DELETE CASCADE' -- FIXME change to coin_pub + deposit_serial_id for more efficient depost -- or something else ???
|
||||||
',wtid_raw BYTEA NOT NULL' -- CONSTRAINT wire_out_ref REFERENCES wire_out(wtid_raw) ON DELETE CASCADE DEFERRABLE'
|
',wtid_raw BYTEA NOT NULL' -- CONSTRAINT wire_out_ref REFERENCES wire_out(wtid_raw) ON DELETE CASCADE DEFERRABLE'
|
||||||
') %s ;'
|
') %s ;'
|
||||||
,table_name
|
,table_name
|
||||||
|
@ -6188,6 +6188,7 @@ postgres_do_deposit (
|
|||||||
* of the coin and possibly persisting the melt details.
|
* of the coin and possibly persisting the melt details.
|
||||||
*
|
*
|
||||||
* @param cls the `struct PostgresClosure` with the plugin-specific state
|
* @param cls the `struct PostgresClosure` with the plugin-specific state
|
||||||
|
* @param rms client-contributed input for CS denominations that must be checked for idempotency, or NULL for non-CS withdrawals
|
||||||
* @param[in,out] refresh refresh operation details; the noreveal_index
|
* @param[in,out] refresh refresh operation details; the noreveal_index
|
||||||
* is set in case the coin was already melted before
|
* is set in case the coin was already melted before
|
||||||
* @param known_coin_id row of the coin in the known_coins table
|
* @param known_coin_id row of the coin in the known_coins table
|
||||||
@ -9694,12 +9695,14 @@ postgres_insert_wire_fee (void *cls,
|
|||||||
* Insert global fee data into database.
|
* Insert global fee data into database.
|
||||||
*
|
*
|
||||||
* @param cls closure
|
* @param cls closure
|
||||||
* @param start_date when does the fee go into effect
|
* @param start_date when does the fees go into effect
|
||||||
|
* @param end_date when does the fees end being valid
|
||||||
* @param fees how high is are the global fees
|
* @param fees how high is are the global fees
|
||||||
* @param purse_timeout when do purses time out
|
* @param purse_timeout when do purses time out
|
||||||
* @param kyc_timeout when do reserves without KYC time out
|
* @param kyc_timeout when do reserves without KYC time out
|
||||||
* @param history_expiration how long are account histories preserved
|
* @param history_expiration how long are account histories preserved
|
||||||
* @param purse_account_limit how many purses are free per account * @param master_sig signature over the above by the exchange master key
|
* @param purse_account_limit how many purses are free per account
|
||||||
|
* @param master_sig signature over the above by the exchange master key
|
||||||
* @return transaction status code
|
* @return transaction status code
|
||||||
*/
|
*/
|
||||||
static enum GNUNET_DB_QueryStatus
|
static enum GNUNET_DB_QueryStatus
|
||||||
@ -14967,7 +14970,7 @@ postgres_delete_shard_locks (void *cls)
|
|||||||
|
|
||||||
/**
|
/**
|
||||||
* Function called to save the configuration of an extension
|
* Function called to save the configuration of an extension
|
||||||
* (age-restriction, peer2peer, ...). After succesfull storage of the
|
* (age-restriction, peer2peer, ...). After successful storage of the
|
||||||
* configuration it triggers the corresponding event.
|
* configuration it triggers the corresponding event.
|
||||||
*
|
*
|
||||||
* @param cls the @e cls of this struct with the plugin-specific state
|
* @param cls the @e cls of this struct with the plugin-specific state
|
||||||
@ -15222,7 +15225,7 @@ postgres_insert_contract (
|
|||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Function called to reutrn meta data about a purse by the
|
* Function called to return meta data about a purse by the
|
||||||
* purse public key.
|
* purse public key.
|
||||||
*
|
*
|
||||||
* @param cls the @e cls of this struct with the plugin-specific state
|
* @param cls the @e cls of this struct with the plugin-specific state
|
||||||
@ -15293,7 +15296,7 @@ postgres_select_purse_request (
|
|||||||
* @param[out] in_conflict set to true if the meta data
|
* @param[out] in_conflict set to true if the meta data
|
||||||
* conflicts with an existing purse;
|
* conflicts with an existing purse;
|
||||||
* in this case, the return value will be
|
* in this case, the return value will be
|
||||||
* #GNUNET_DB_STATUS_SUCCESS_ONE despite the failure
|
* #GNUNET_DB_STATUS_SUCCESS_ONE_RESULT despite the failure
|
||||||
* @return transaction status code
|
* @return transaction status code
|
||||||
*/
|
*/
|
||||||
static enum GNUNET_DB_QueryStatus
|
static enum GNUNET_DB_QueryStatus
|
||||||
@ -15541,7 +15544,9 @@ postgres_select_purse_by_merge_pub (
|
|||||||
* @param[out] balance_ok set to false if the coin's
|
* @param[out] balance_ok set to false if the coin's
|
||||||
* remaining balance is below @a amount;
|
* remaining balance is below @a amount;
|
||||||
* in this case, the return value will be
|
* in this case, the return value will be
|
||||||
* #GNUNET_DB_STATUS_SUCCESS_ONE despite the failure
|
* #GNUNET_DB_STATUS_SUCCESS_ONE_RESULT despite the failure
|
||||||
|
* @param[out] conflict set to true if the deposit failed due to a conflict (coin already spent,
|
||||||
|
* or deposited into this purse with a different amount)
|
||||||
* @return transaction status code
|
* @return transaction status code
|
||||||
*/
|
*/
|
||||||
static enum GNUNET_DB_QueryStatus
|
static enum GNUNET_DB_QueryStatus
|
||||||
@ -15891,7 +15896,7 @@ postgres_insert_history_request (
|
|||||||
const struct TALER_ReservePublicKeyP *reserve_pub,
|
const struct TALER_ReservePublicKeyP *reserve_pub,
|
||||||
const struct TALER_ReserveSignatureP *reserve_sig,
|
const struct TALER_ReserveSignatureP *reserve_sig,
|
||||||
struct GNUNET_TIME_Timestamp request_timestamp,
|
struct GNUNET_TIME_Timestamp request_timestamp,
|
||||||
const struct TALER_Amount *history,
|
const struct TALER_Amount *history_fee,
|
||||||
bool *balance_ok,
|
bool *balance_ok,
|
||||||
bool *idempotent)
|
bool *idempotent)
|
||||||
{
|
{
|
||||||
@ -15900,7 +15905,7 @@ postgres_insert_history_request (
|
|||||||
GNUNET_PQ_query_param_auto_from_type (reserve_pub),
|
GNUNET_PQ_query_param_auto_from_type (reserve_pub),
|
||||||
GNUNET_PQ_query_param_auto_from_type (reserve_sig),
|
GNUNET_PQ_query_param_auto_from_type (reserve_sig),
|
||||||
GNUNET_PQ_query_param_timestamp (&request_timestamp),
|
GNUNET_PQ_query_param_timestamp (&request_timestamp),
|
||||||
TALER_PQ_query_param_amount (history),
|
TALER_PQ_query_param_amount (history_fee),
|
||||||
GNUNET_PQ_query_param_end
|
GNUNET_PQ_query_param_end
|
||||||
};
|
};
|
||||||
struct GNUNET_PQ_ResultSpec rs[] = {
|
struct GNUNET_PQ_ResultSpec rs[] = {
|
||||||
|
@ -136,7 +136,7 @@ TALER_age_mask_to_string (
|
|||||||
|
|
||||||
/* ==================================================
|
/* ==================================================
|
||||||
*
|
*
|
||||||
* Age Restriction TALER_Extension imlementation
|
* Age Restriction TALER_Extension implementation
|
||||||
*
|
*
|
||||||
* ==================================================
|
* ==================================================
|
||||||
*/
|
*/
|
||||||
|
@ -1762,7 +1762,7 @@ TALER_test_coin_valid (const struct TALER_CoinPublicInfo *coin_public_info,
|
|||||||
* @param blinded_planchet blinded planchet
|
* @param blinded_planchet blinded planchet
|
||||||
* @param denom_hash hash of the denomination publick key
|
* @param denom_hash hash of the denomination publick key
|
||||||
* @param[out] bch where to write the hash
|
* @param[out] bch where to write the hash
|
||||||
* @return #GNUNET_OK when successful, #GNUNET_SYSERR if an internal error occured
|
* @return #GNUNET_OK when successful, #GNUNET_SYSERR if an internal error occurred
|
||||||
*/
|
*/
|
||||||
enum GNUNET_GenericReturnValue
|
enum GNUNET_GenericReturnValue
|
||||||
TALER_coin_ev_hash (const struct TALER_BlindedPlanchet *blinded_planchet,
|
TALER_coin_ev_hash (const struct TALER_BlindedPlanchet *blinded_planchet,
|
||||||
@ -2872,7 +2872,7 @@ TALER_wallet_purse_status_sign (
|
|||||||
* Verify a purse status request signature.
|
* Verify a purse status request signature.
|
||||||
*
|
*
|
||||||
* @param purse_pub purse’s public key
|
* @param purse_pub purse’s public key
|
||||||
* @param purse_sig the signature made with purpose #TALER_SIGNATURE_WALLET_PURSE_STATUS_REQUEST
|
* @param purse_sig the signature made with purpose #TALER_SIGNATURE_WALLET_PURSE_STATUS
|
||||||
* @return #GNUNET_OK if the signature is valid
|
* @return #GNUNET_OK if the signature is valid
|
||||||
*/
|
*/
|
||||||
enum GNUNET_GenericReturnValue
|
enum GNUNET_GenericReturnValue
|
||||||
@ -3155,7 +3155,7 @@ TALER_wallet_deposit_verify (
|
|||||||
const struct TALER_Amount *deposit_fee,
|
const struct TALER_Amount *deposit_fee,
|
||||||
const struct TALER_MerchantWireHashP *h_wire,
|
const struct TALER_MerchantWireHashP *h_wire,
|
||||||
const struct TALER_PrivateContractHashP *h_contract_terms,
|
const struct TALER_PrivateContractHashP *h_contract_terms,
|
||||||
const struct TALER_AgeCommitmentHash *h_commitment_hash,
|
const struct TALER_AgeCommitmentHash *h_age_commitment,
|
||||||
const struct TALER_ExtensionContractHashP *h_extensions,
|
const struct TALER_ExtensionContractHashP *h_extensions,
|
||||||
const struct TALER_DenominationHashP *h_denom_pub,
|
const struct TALER_DenominationHashP *h_denom_pub,
|
||||||
struct GNUNET_TIME_Timestamp wallet_timestamp,
|
struct GNUNET_TIME_Timestamp wallet_timestamp,
|
||||||
@ -3389,7 +3389,7 @@ TALER_wallet_reserve_history_verify (
|
|||||||
*
|
*
|
||||||
* @param ts timestamp used
|
* @param ts timestamp used
|
||||||
* @param history_fee how much do we expect to pay
|
* @param history_fee how much do we expect to pay
|
||||||
* @param reserve_pub reserve the history request is for
|
* @param reserve_priv private key of the reserve the history request is for
|
||||||
* @param[out] reserve_sig resulting signature
|
* @param[out] reserve_sig resulting signature
|
||||||
*/
|
*/
|
||||||
void
|
void
|
||||||
@ -3419,7 +3419,7 @@ TALER_wallet_reserve_status_verify (
|
|||||||
* Create reserve status request signature.
|
* Create reserve status request signature.
|
||||||
*
|
*
|
||||||
* @param ts timestamp used
|
* @param ts timestamp used
|
||||||
* @param reserve_pub reserve the status request is for
|
* @param reserve_priv private key of the reserve the status request is for
|
||||||
* @param[out] reserve_sig resulting signature
|
* @param[out] reserve_sig resulting signature
|
||||||
*/
|
*/
|
||||||
void
|
void
|
||||||
@ -3481,7 +3481,6 @@ TALER_merchant_refund_verify (
|
|||||||
* @param h_contract_terms hash of contract terms
|
* @param h_contract_terms hash of contract terms
|
||||||
* @param h_wire hash of the merchant account details
|
* @param h_wire hash of the merchant account details
|
||||||
* @param coin_pub coin to be deposited
|
* @param coin_pub coin to be deposited
|
||||||
* @param merchant_pub merchant public key
|
|
||||||
* @param merchant_priv private key to sign with
|
* @param merchant_priv private key to sign with
|
||||||
* @param[out] merchant_sig where to write the signature
|
* @param[out] merchant_sig where to write the signature
|
||||||
*/
|
*/
|
||||||
@ -3490,15 +3489,15 @@ TALER_merchant_deposit_sign (
|
|||||||
const struct TALER_PrivateContractHashP *h_contract_terms,
|
const struct TALER_PrivateContractHashP *h_contract_terms,
|
||||||
const struct TALER_MerchantWireHashP *h_wire,
|
const struct TALER_MerchantWireHashP *h_wire,
|
||||||
const struct TALER_CoinSpendPublicKeyP *coin_pub,
|
const struct TALER_CoinSpendPublicKeyP *coin_pub,
|
||||||
const struct TALER_MerchantPublicKeyP *merchant_pub,
|
|
||||||
const struct TALER_MerchantPrivateKeyP *merchant_priv,
|
const struct TALER_MerchantPrivateKeyP *merchant_priv,
|
||||||
struct TALER_MerchantSignatureP *merchant_sig);
|
struct TALER_MerchantSignatureP *merchant_sig);
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Verify a deposit.
|
* Verify a deposit.
|
||||||
*
|
*
|
||||||
* @param merchant merchant public key
|
* @param merchant merchant public key
|
||||||
* @param public key of the deposited coin
|
* @param coin_pub public key of the deposited coin
|
||||||
* @param h_contract_terms hash of contract terms
|
* @param h_contract_terms hash of contract terms
|
||||||
* @param h_wire hash of the merchant account details
|
* @param h_wire hash of the merchant account details
|
||||||
* @param merchant_sig signature of the merchant
|
* @param merchant_sig signature of the merchant
|
||||||
@ -3571,6 +3570,7 @@ typedef enum TALER_ErrorCode
|
|||||||
* @param merchant_pub the public key of the merchant (used to identify the merchant for refund requests)
|
* @param merchant_pub the public key of the merchant (used to identify the merchant for refund requests)
|
||||||
* @param[out] pub where to write the public key
|
* @param[out] pub where to write the public key
|
||||||
* @param[out] sig where to write the signature
|
* @param[out] sig where to write the signature
|
||||||
|
* @return #TALER_EC_NONE on success
|
||||||
*/
|
*/
|
||||||
enum TALER_ErrorCode
|
enum TALER_ErrorCode
|
||||||
TALER_exchange_online_deposit_confirmation_sign (
|
TALER_exchange_online_deposit_confirmation_sign (
|
||||||
@ -3602,6 +3602,7 @@ TALER_exchange_online_deposit_confirmation_sign (
|
|||||||
* @param merchant_pub the public key of the merchant (used to identify the merchant for refund requests)
|
* @param merchant_pub the public key of the merchant (used to identify the merchant for refund requests)
|
||||||
* @param pub where to write the public key
|
* @param pub where to write the public key
|
||||||
* @param sig where to write the signature
|
* @param sig where to write the signature
|
||||||
|
* @return #GNUNET_OK if the signature is valid
|
||||||
*/
|
*/
|
||||||
enum GNUNET_GenericReturnValue
|
enum GNUNET_GenericReturnValue
|
||||||
TALER_exchange_online_deposit_confirmation_verify (
|
TALER_exchange_online_deposit_confirmation_verify (
|
||||||
@ -3622,9 +3623,14 @@ TALER_exchange_online_deposit_confirmation_verify (
|
|||||||
* Create refund confirmation signature.
|
* Create refund confirmation signature.
|
||||||
*
|
*
|
||||||
* @param scb function to call to create the signature
|
* @param scb function to call to create the signature
|
||||||
* @param XXX wire transfer subject used
|
* @param h_contract_terms hash of contract being refunded
|
||||||
* @param[out] pub where to write the public key
|
* @param coin_pub public key of the coin receiving the refund
|
||||||
* @param[out] sig where to write the signature
|
* @param merchant public key of the merchant that granted the refund
|
||||||
|
* @param rtransaction_id refund transaction ID used by the merchant
|
||||||
|
* @param refund_amount amount refunded
|
||||||
|
* @param[out] pub where to write the exchange public key
|
||||||
|
* @param[out] sig where to write the exchange signature
|
||||||
|
* @return #TALER_EC_NONE on success
|
||||||
*/
|
*/
|
||||||
enum TALER_ErrorCode
|
enum TALER_ErrorCode
|
||||||
TALER_exchange_online_refund_confirmation_sign (
|
TALER_exchange_online_refund_confirmation_sign (
|
||||||
@ -3641,8 +3647,14 @@ TALER_exchange_online_refund_confirmation_sign (
|
|||||||
/**
|
/**
|
||||||
* Verify refund confirmation signature.
|
* Verify refund confirmation signature.
|
||||||
*
|
*
|
||||||
|
* @param h_contract_terms hash of contract being refunded
|
||||||
|
* @param coin_pub public key of the coin receiving the refund
|
||||||
|
* @param merchant public key of the merchant that granted the refund
|
||||||
|
* @param rtransaction_id refund transaction ID used by the merchant
|
||||||
|
* @param refund_amount amount refunded
|
||||||
* @param pub where to write the public key
|
* @param pub where to write the public key
|
||||||
* @param sig where to write the signature
|
* @param sig where to write the signature
|
||||||
|
* @return #GNUNET_OK if the signature is valid
|
||||||
*/
|
*/
|
||||||
enum GNUNET_GenericReturnValue
|
enum GNUNET_GenericReturnValue
|
||||||
TALER_exchange_online_refund_confirmation_verify (
|
TALER_exchange_online_refund_confirmation_verify (
|
||||||
@ -3659,9 +3671,11 @@ TALER_exchange_online_refund_confirmation_verify (
|
|||||||
* Create refresh melt confirmation signature.
|
* Create refresh melt confirmation signature.
|
||||||
*
|
*
|
||||||
* @param scb function to call to create the signature
|
* @param scb function to call to create the signature
|
||||||
* @param XXX
|
* @param rc refresh commitment that identifies the melt operation
|
||||||
* @param[out] pub where to write the public key
|
* @param noreveal_index gamma cut-and-choose value chosen by the exchange
|
||||||
* @param[out] sig where to write the signature
|
* @param[out] pub where to write the exchange public key
|
||||||
|
* @param[out] sig where to write the exchange signature
|
||||||
|
* @return #TALER_EC_NONE on success
|
||||||
*/
|
*/
|
||||||
enum TALER_ErrorCode
|
enum TALER_ErrorCode
|
||||||
TALER_exchange_online_melt_confirmation_sign (
|
TALER_exchange_online_melt_confirmation_sign (
|
||||||
@ -3675,8 +3689,11 @@ TALER_exchange_online_melt_confirmation_sign (
|
|||||||
/**
|
/**
|
||||||
* Verify refresh melt confirmation signature.
|
* Verify refresh melt confirmation signature.
|
||||||
*
|
*
|
||||||
|
* @param rc refresh commitment that identifies the melt operation
|
||||||
|
* @param noreveal_index gamma cut-and-choose value chosen by the exchange
|
||||||
* @param pub where to write the public key
|
* @param pub where to write the public key
|
||||||
* @param sig where to write the signature
|
* @param sig where to write the signature
|
||||||
|
* @return #GNUNET_OK if the signature is valid
|
||||||
*/
|
*/
|
||||||
enum GNUNET_GenericReturnValue
|
enum GNUNET_GenericReturnValue
|
||||||
TALER_exchange_online_melt_confirmation_verify (
|
TALER_exchange_online_melt_confirmation_verify (
|
||||||
@ -3690,10 +3707,12 @@ TALER_exchange_online_melt_confirmation_verify (
|
|||||||
* Create exchange key set signature.
|
* Create exchange key set signature.
|
||||||
*
|
*
|
||||||
* @param scb function to call to create the signature
|
* @param scb function to call to create the signature
|
||||||
|
* @param cls closure for @a scb
|
||||||
* @param timestamp time when the key set was issued
|
* @param timestamp time when the key set was issued
|
||||||
* @param hc hash over all the keys
|
* @param hc hash over all the keys
|
||||||
* @param[out] pub where to write the public key
|
* @param[out] pub where to write the public key
|
||||||
* @param[out] sig where to write the signature
|
* @param[out] sig where to write the signature
|
||||||
|
* @return #TALER_EC_NONE on success
|
||||||
*/
|
*/
|
||||||
enum TALER_ErrorCode
|
enum TALER_ErrorCode
|
||||||
TALER_exchange_online_key_set_sign (
|
TALER_exchange_online_key_set_sign (
|
||||||
@ -3712,6 +3731,7 @@ TALER_exchange_online_key_set_sign (
|
|||||||
* @param hc hash over all the keys
|
* @param hc hash over all the keys
|
||||||
* @param pub where to write the public key
|
* @param pub where to write the public key
|
||||||
* @param sig where to write the signature
|
* @param sig where to write the signature
|
||||||
|
* @return #GNUNET_OK if the signature is valid
|
||||||
*/
|
*/
|
||||||
enum GNUNET_GenericReturnValue
|
enum GNUNET_GenericReturnValue
|
||||||
TALER_exchange_online_key_set_verify (
|
TALER_exchange_online_key_set_verify (
|
||||||
@ -3729,6 +3749,7 @@ TALER_exchange_online_key_set_verify (
|
|||||||
* @param timestamp time when the KYC was confirmed
|
* @param timestamp time when the KYC was confirmed
|
||||||
* @param[out] pub where to write the public key
|
* @param[out] pub where to write the public key
|
||||||
* @param[out] sig where to write the signature
|
* @param[out] sig where to write the signature
|
||||||
|
* @return #TALER_EC_NONE on success
|
||||||
*/
|
*/
|
||||||
enum TALER_ErrorCode
|
enum TALER_ErrorCode
|
||||||
TALER_exchange_online_account_setup_success_sign (
|
TALER_exchange_online_account_setup_success_sign (
|
||||||
@ -3746,6 +3767,7 @@ TALER_exchange_online_account_setup_success_sign (
|
|||||||
* @param timestamp time when the KYC was confirmed
|
* @param timestamp time when the KYC was confirmed
|
||||||
* @param pub where to write the public key
|
* @param pub where to write the public key
|
||||||
* @param sig where to write the signature
|
* @param sig where to write the signature
|
||||||
|
* @return #GNUNET_OK if the signature is valid
|
||||||
*/
|
*/
|
||||||
enum GNUNET_GenericReturnValue
|
enum GNUNET_GenericReturnValue
|
||||||
TALER_exchange_online_account_setup_success_verify (
|
TALER_exchange_online_account_setup_success_verify (
|
||||||
@ -3755,6 +3777,17 @@ TALER_exchange_online_account_setup_success_verify (
|
|||||||
const struct TALER_ExchangeSignatureP *sig);
|
const struct TALER_ExchangeSignatureP *sig);
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Update the @a hash_context in the computation of the
|
||||||
|
* h_details for a wire status signature.
|
||||||
|
*
|
||||||
|
* @param[in,out] hash_context context to update
|
||||||
|
* @param h_contract_terms hash of the contract
|
||||||
|
* @param execution_time when was the wire transfer initiated
|
||||||
|
* @param coin_pub deposited coin
|
||||||
|
* @param deposit_value contribution of the coin
|
||||||
|
* @param deposit_fee how high was the deposit fee
|
||||||
|
*/
|
||||||
void
|
void
|
||||||
TALER_exchange_online_wire_deposit_append (
|
TALER_exchange_online_wire_deposit_append (
|
||||||
struct GNUNET_HashContext *hash_context,
|
struct GNUNET_HashContext *hash_context,
|
||||||
@ -3769,9 +3802,14 @@ TALER_exchange_online_wire_deposit_append (
|
|||||||
* Create wire deposit signature.
|
* Create wire deposit signature.
|
||||||
*
|
*
|
||||||
* @param scb function to call to create the signature
|
* @param scb function to call to create the signature
|
||||||
* @param XXX
|
* @param total amount the merchant was credited
|
||||||
|
* @param wire_fee fee charged by the exchange for the wire transfer
|
||||||
|
* @param merchant_pub which merchant was credited
|
||||||
|
* @param payto payto://-URI of the merchant account
|
||||||
|
* @param h_details hash over the aggregation details
|
||||||
* @param[out] pub where to write the public key
|
* @param[out] pub where to write the public key
|
||||||
* @param[out] sig where to write the signature
|
* @param[out] sig where to write the signature
|
||||||
|
* @return #TALER_EC_NONE on success
|
||||||
*/
|
*/
|
||||||
enum TALER_ErrorCode
|
enum TALER_ErrorCode
|
||||||
TALER_exchange_online_wire_deposit_sign (
|
TALER_exchange_online_wire_deposit_sign (
|
||||||
@ -3788,8 +3826,14 @@ TALER_exchange_online_wire_deposit_sign (
|
|||||||
/**
|
/**
|
||||||
* Verify wire deposit signature.
|
* Verify wire deposit signature.
|
||||||
*
|
*
|
||||||
|
* @param total amount the merchant was credited
|
||||||
|
* @param wire_fee fee charged by the exchange for the wire transfer
|
||||||
|
* @param merchant_pub which merchant was credited
|
||||||
|
* @param h_payto hash of the payto://-URI of the merchant account
|
||||||
|
* @param h_details hash over the aggregation details
|
||||||
* @param pub where to write the public key
|
* @param pub where to write the public key
|
||||||
* @param sig where to write the signature
|
* @param sig where to write the signature
|
||||||
|
* @return #GNUNET_OK if the signature is valid
|
||||||
*/
|
*/
|
||||||
enum GNUNET_GenericReturnValue
|
enum GNUNET_GenericReturnValue
|
||||||
TALER_exchange_online_wire_deposit_verify (
|
TALER_exchange_online_wire_deposit_verify (
|
||||||
@ -3806,9 +3850,15 @@ TALER_exchange_online_wire_deposit_verify (
|
|||||||
* Create wire confirmation signature.
|
* Create wire confirmation signature.
|
||||||
*
|
*
|
||||||
* @param scb function to call to create the signature
|
* @param scb function to call to create the signature
|
||||||
* @param XXX
|
* @param h_wire hash of the merchant's account
|
||||||
|
* @param h_contract_terms hash of the contract
|
||||||
|
* @param wtid wire transfer this deposit was aggregated into
|
||||||
|
* @param coin_pub public key of the deposited coin
|
||||||
|
* @param execution_time when was wire transfer initiated
|
||||||
|
* @param coin_contribution what was @a coin_pub's contribution to the wire transfer
|
||||||
* @param[out] pub where to write the public key
|
* @param[out] pub where to write the public key
|
||||||
* @param[out] sig where to write the signature
|
* @param[out] sig where to write the signature
|
||||||
|
* @return #TALER_EC_NONE on success
|
||||||
*/
|
*/
|
||||||
enum TALER_ErrorCode
|
enum TALER_ErrorCode
|
||||||
TALER_exchange_online_confirm_wire_sign (
|
TALER_exchange_online_confirm_wire_sign (
|
||||||
@ -3826,8 +3876,15 @@ TALER_exchange_online_confirm_wire_sign (
|
|||||||
/**
|
/**
|
||||||
* Verify confirm wire signature.
|
* Verify confirm wire signature.
|
||||||
*
|
*
|
||||||
|
* @param h_wire hash of the merchant's account
|
||||||
|
* @param h_contract_terms hash of the contract
|
||||||
|
* @param wtid wire transfer this deposit was aggregated into
|
||||||
|
* @param coin_pub public key of the deposited coin
|
||||||
|
* @param execution_time when was wire transfer initiated
|
||||||
|
* @param coin_contribution what was @a coin_pub's contribution to the wire transfer
|
||||||
* @param pub where to write the public key
|
* @param pub where to write the public key
|
||||||
* @param sig where to write the signature
|
* @param sig where to write the signature
|
||||||
|
* @return #GNUNET_OK if the signature is valid
|
||||||
*/
|
*/
|
||||||
enum GNUNET_GenericReturnValue
|
enum GNUNET_GenericReturnValue
|
||||||
TALER_exchange_online_confirm_wire_verify (
|
TALER_exchange_online_confirm_wire_verify (
|
||||||
@ -3845,9 +3902,13 @@ TALER_exchange_online_confirm_wire_verify (
|
|||||||
* Create confirm recoup signature.
|
* Create confirm recoup signature.
|
||||||
*
|
*
|
||||||
* @param scb function to call to create the signature
|
* @param scb function to call to create the signature
|
||||||
* @param XXX
|
* @param timestamp when was the recoup done
|
||||||
|
* @param recoup_amount how much was recouped
|
||||||
|
* @param coin_pub coin that was recouped
|
||||||
|
* @param reserve_pub reserve that was credited
|
||||||
* @param[out] pub where to write the public key
|
* @param[out] pub where to write the public key
|
||||||
* @param[out] sig where to write the signature
|
* @param[out] sig where to write the signature
|
||||||
|
* @return #TALER_EC_NONE on success
|
||||||
*/
|
*/
|
||||||
enum TALER_ErrorCode
|
enum TALER_ErrorCode
|
||||||
TALER_exchange_online_confirm_recoup_sign (
|
TALER_exchange_online_confirm_recoup_sign (
|
||||||
@ -3863,8 +3924,13 @@ TALER_exchange_online_confirm_recoup_sign (
|
|||||||
/**
|
/**
|
||||||
* Verify confirm recoup signature.
|
* Verify confirm recoup signature.
|
||||||
*
|
*
|
||||||
|
* @param timestamp when was the recoup done
|
||||||
|
* @param recoup_amount how much was recouped
|
||||||
|
* @param coin_pub coin that was recouped
|
||||||
|
* @param reserve_pub reserve that was credited
|
||||||
* @param pub where to write the public key
|
* @param pub where to write the public key
|
||||||
* @param sig where to write the signature
|
* @param sig where to write the signature
|
||||||
|
* @return #GNUNET_OK if the signature is valid
|
||||||
*/
|
*/
|
||||||
enum GNUNET_GenericReturnValue
|
enum GNUNET_GenericReturnValue
|
||||||
TALER_exchange_online_confirm_recoup_verify (
|
TALER_exchange_online_confirm_recoup_verify (
|
||||||
@ -3880,9 +3946,13 @@ TALER_exchange_online_confirm_recoup_verify (
|
|||||||
* Create confirm recoup refresh signature.
|
* Create confirm recoup refresh signature.
|
||||||
*
|
*
|
||||||
* @param scb function to call to create the signature
|
* @param scb function to call to create the signature
|
||||||
* @param XXX
|
* @param timestamp when was the recoup done
|
||||||
|
* @param recoup_amount how much was recouped
|
||||||
|
* @param coin_pub coin that was recouped
|
||||||
|
* @param old_coin_pub old coin that was credited
|
||||||
* @param[out] pub where to write the public key
|
* @param[out] pub where to write the public key
|
||||||
* @param[out] sig where to write the signature
|
* @param[out] sig where to write the signature
|
||||||
|
* @return #TALER_EC_NONE on success
|
||||||
*/
|
*/
|
||||||
enum TALER_ErrorCode
|
enum TALER_ErrorCode
|
||||||
TALER_exchange_online_confirm_recoup_refresh_sign (
|
TALER_exchange_online_confirm_recoup_refresh_sign (
|
||||||
@ -3898,8 +3968,13 @@ TALER_exchange_online_confirm_recoup_refresh_sign (
|
|||||||
/**
|
/**
|
||||||
* Verify confirm recoup refresh signature.
|
* Verify confirm recoup refresh signature.
|
||||||
*
|
*
|
||||||
|
* @param timestamp when was the recoup done
|
||||||
|
* @param recoup_amount how much was recouped
|
||||||
|
* @param coin_pub coin that was recouped
|
||||||
|
* @param old_coin_pub old coin that was credited
|
||||||
* @param pub where to write the public key
|
* @param pub where to write the public key
|
||||||
* @param sig where to write the signature
|
* @param sig where to write the signature
|
||||||
|
* @return #GNUNET_OK if the signature is valid
|
||||||
*/
|
*/
|
||||||
enum GNUNET_GenericReturnValue
|
enum GNUNET_GenericReturnValue
|
||||||
TALER_exchange_online_confirm_recoup_refresh_verify (
|
TALER_exchange_online_confirm_recoup_refresh_verify (
|
||||||
@ -3915,9 +3990,11 @@ TALER_exchange_online_confirm_recoup_refresh_verify (
|
|||||||
* Create denomination unknown signature.
|
* Create denomination unknown signature.
|
||||||
*
|
*
|
||||||
* @param scb function to call to create the signature
|
* @param scb function to call to create the signature
|
||||||
* @param XXX
|
* @param timestamp when was the error created
|
||||||
|
* @param h_denom_pub hash of denomination that is unknown
|
||||||
* @param[out] pub where to write the public key
|
* @param[out] pub where to write the public key
|
||||||
* @param[out] sig where to write the signature
|
* @param[out] sig where to write the signature
|
||||||
|
* @return #TALER_EC_NONE on success
|
||||||
*/
|
*/
|
||||||
enum TALER_ErrorCode
|
enum TALER_ErrorCode
|
||||||
TALER_exchange_online_denomination_unknown_sign (
|
TALER_exchange_online_denomination_unknown_sign (
|
||||||
@ -3931,8 +4008,11 @@ TALER_exchange_online_denomination_unknown_sign (
|
|||||||
/**
|
/**
|
||||||
* Verify denomination unknown signature.
|
* Verify denomination unknown signature.
|
||||||
*
|
*
|
||||||
|
* @param timestamp when was the error created
|
||||||
|
* @param h_denom_pub hash of denomination that is unknown
|
||||||
* @param pub where to write the public key
|
* @param pub where to write the public key
|
||||||
* @param sig where to write the signature
|
* @param sig where to write the signature
|
||||||
|
* @return #GNUNET_OK if the signature is valid
|
||||||
*/
|
*/
|
||||||
enum GNUNET_GenericReturnValue
|
enum GNUNET_GenericReturnValue
|
||||||
TALER_exchange_online_denomination_unknown_verify (
|
TALER_exchange_online_denomination_unknown_verify (
|
||||||
@ -3946,9 +4026,13 @@ TALER_exchange_online_denomination_unknown_verify (
|
|||||||
* Create denomination expired signature.
|
* Create denomination expired signature.
|
||||||
*
|
*
|
||||||
* @param scb function to call to create the signature
|
* @param scb function to call to create the signature
|
||||||
* @param XXX
|
* @param timestamp when was the error created
|
||||||
|
* @param h_denom_pub hash of denomination that is expired
|
||||||
|
* @param op character string describing the operation for which
|
||||||
|
* the denomination is expired
|
||||||
* @param[out] pub where to write the public key
|
* @param[out] pub where to write the public key
|
||||||
* @param[out] sig where to write the signature
|
* @param[out] sig where to write the signature
|
||||||
|
* @return #TALER_EC_NONE on success
|
||||||
*/
|
*/
|
||||||
enum TALER_ErrorCode
|
enum TALER_ErrorCode
|
||||||
TALER_exchange_online_denomination_expired_sign (
|
TALER_exchange_online_denomination_expired_sign (
|
||||||
@ -3963,8 +4047,13 @@ TALER_exchange_online_denomination_expired_sign (
|
|||||||
/**
|
/**
|
||||||
* Verify denomination expired signature.
|
* Verify denomination expired signature.
|
||||||
*
|
*
|
||||||
|
* @param timestamp when was the error created
|
||||||
|
* @param h_denom_pub hash of denomination that is expired
|
||||||
|
* @param op character string describing the operation for which
|
||||||
|
* the denomination is expired
|
||||||
* @param pub where to write the public key
|
* @param pub where to write the public key
|
||||||
* @param sig where to write the signature
|
* @param sig where to write the signature
|
||||||
|
* @return #GNUNET_OK if the signature is valid
|
||||||
*/
|
*/
|
||||||
enum GNUNET_GenericReturnValue
|
enum GNUNET_GenericReturnValue
|
||||||
TALER_exchange_online_denomination_expired_verify (
|
TALER_exchange_online_denomination_expired_verify (
|
||||||
@ -3987,6 +4076,7 @@ TALER_exchange_online_denomination_expired_verify (
|
|||||||
* @param reserve_pub public key of the closed reserve
|
* @param reserve_pub public key of the closed reserve
|
||||||
* @param[out] pub where to write the public key
|
* @param[out] pub where to write the public key
|
||||||
* @param[out] sig where to write the signature
|
* @param[out] sig where to write the signature
|
||||||
|
* @return #TALER_EC_NONE on success
|
||||||
*/
|
*/
|
||||||
enum TALER_ErrorCode
|
enum TALER_ErrorCode
|
||||||
TALER_exchange_online_reserve_closed_sign (
|
TALER_exchange_online_reserve_closed_sign (
|
||||||
@ -4010,8 +4100,9 @@ TALER_exchange_online_reserve_closed_sign (
|
|||||||
* @param payto target of the wire transfer
|
* @param payto target of the wire transfer
|
||||||
* @param wtid wire transfer subject used
|
* @param wtid wire transfer subject used
|
||||||
* @param reserve_pub public key of the closed reserve
|
* @param reserve_pub public key of the closed reserve
|
||||||
* @param pub where to write the public key
|
* @param pub the public key of the exchange to check against
|
||||||
* @param sig where to write the signature
|
* @param sig the signature to check
|
||||||
|
* @return #GNUNET_OK if the signature is valid
|
||||||
*/
|
*/
|
||||||
enum GNUNET_GenericReturnValue
|
enum GNUNET_GenericReturnValue
|
||||||
TALER_exchange_online_reserve_closed_verify (
|
TALER_exchange_online_reserve_closed_verify (
|
||||||
@ -4025,6 +4116,20 @@ TALER_exchange_online_reserve_closed_verify (
|
|||||||
const struct TALER_ExchangeSignatureP *sig);
|
const struct TALER_ExchangeSignatureP *sig);
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Create signature by exchange affirming that a purse was created.
|
||||||
|
*
|
||||||
|
* @param scb function to call to create the signature
|
||||||
|
* @param exchange_time our time
|
||||||
|
* @param purse_expiration when will the purse expire
|
||||||
|
* @param amount_without_fee total amount to be put into the purse (without deposit fees)
|
||||||
|
* @param total_deposited total currently in the purse
|
||||||
|
* @param purse_pub public key of the purse
|
||||||
|
* @param h_contract_terms hash of the contract for the purse
|
||||||
|
* @param[out] pub where to write the public key
|
||||||
|
* @param[out] sig where to write the signature
|
||||||
|
* @return #TALER_EC_NONE on success
|
||||||
|
*/
|
||||||
enum TALER_ErrorCode
|
enum TALER_ErrorCode
|
||||||
TALER_exchange_online_purse_created_sign (
|
TALER_exchange_online_purse_created_sign (
|
||||||
TALER_ExchangeSignCallback scb,
|
TALER_ExchangeSignCallback scb,
|
||||||
@ -4038,6 +4143,19 @@ TALER_exchange_online_purse_created_sign (
|
|||||||
struct TALER_ExchangeSignatureP *sig);
|
struct TALER_ExchangeSignatureP *sig);
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Verify exchange signature about a purse creation and balance.
|
||||||
|
*
|
||||||
|
* @param exchange_time our time
|
||||||
|
* @param purse_expiration when will the purse expire
|
||||||
|
* @param amount_without_fee total amount to be put into the purse (without deposit fees)
|
||||||
|
* @param total_deposited total currently in the purse
|
||||||
|
* @param purse_pub public key of the purse
|
||||||
|
* @param h_contract_terms hash of the contract for the purse
|
||||||
|
* @param pub the public key of the exchange to check against
|
||||||
|
* @param sig the signature to check
|
||||||
|
* @return #GNUNET_OK if the signature is valid
|
||||||
|
*/
|
||||||
enum GNUNET_GenericReturnValue
|
enum GNUNET_GenericReturnValue
|
||||||
TALER_exchange_online_purse_created_verify (
|
TALER_exchange_online_purse_created_verify (
|
||||||
struct GNUNET_TIME_Timestamp exchange_time,
|
struct GNUNET_TIME_Timestamp exchange_time,
|
||||||
@ -4050,6 +4168,21 @@ TALER_exchange_online_purse_created_verify (
|
|||||||
const struct TALER_ExchangeSignatureP *sig);
|
const struct TALER_ExchangeSignatureP *sig);
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Sign affirmation that a purse was merged.
|
||||||
|
*
|
||||||
|
* @param scb function to call to create the signature
|
||||||
|
* @param exchange_time our time
|
||||||
|
* @param purse_expiration when does the purse expire
|
||||||
|
* @param amount_without_fee total amount that should be in the purse without deposit fees
|
||||||
|
* @param purse_pub public key of the purse
|
||||||
|
* @param h_contract_terms hash of the contract of the purse
|
||||||
|
* @param reserve_pub reserve the purse will be merged into
|
||||||
|
* @param exchange_url exchange at which the @a reserve_pub lives
|
||||||
|
* @param[out] pub where to write the public key
|
||||||
|
* @param[out] sig where to write the signature
|
||||||
|
* @return #TALER_EC_NONE on success
|
||||||
|
*/
|
||||||
enum TALER_ErrorCode
|
enum TALER_ErrorCode
|
||||||
TALER_exchange_online_purse_merged_sign (
|
TALER_exchange_online_purse_merged_sign (
|
||||||
TALER_ExchangeSignCallback scb,
|
TALER_ExchangeSignCallback scb,
|
||||||
@ -4064,6 +4197,20 @@ TALER_exchange_online_purse_merged_sign (
|
|||||||
struct TALER_ExchangeSignatureP *sig);
|
struct TALER_ExchangeSignatureP *sig);
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Verify affirmation that a purse will be merged.
|
||||||
|
*
|
||||||
|
* @param exchange_time our time
|
||||||
|
* @param purse_expiration when does the purse expire
|
||||||
|
* @param amount_without_fee total amount that should be in the purse without deposit fees
|
||||||
|
* @param purse_pub public key of the purse
|
||||||
|
* @param h_contract_terms hash of the contract of the purse
|
||||||
|
* @param reserve_pub reserve the purse will be merged into
|
||||||
|
* @param exchange_url exchange at which the @a reserve_pub lives
|
||||||
|
* @param pub the public key of the exchange to check against
|
||||||
|
* @param sig the signature to check
|
||||||
|
* @return #GNUNET_OK if the signature is valid
|
||||||
|
*/
|
||||||
enum GNUNET_GenericReturnValue
|
enum GNUNET_GenericReturnValue
|
||||||
TALER_exchange_online_purse_merged_verify (
|
TALER_exchange_online_purse_merged_verify (
|
||||||
struct GNUNET_TIME_Timestamp exchange_time,
|
struct GNUNET_TIME_Timestamp exchange_time,
|
||||||
@ -4077,6 +4224,17 @@ TALER_exchange_online_purse_merged_verify (
|
|||||||
const struct TALER_ExchangeSignatureP *sig);
|
const struct TALER_ExchangeSignatureP *sig);
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Sign information about the status of a purse.
|
||||||
|
*
|
||||||
|
* @param scb function to call to create the signature
|
||||||
|
* @param merge_timestamp when was the purse merged (can be never)
|
||||||
|
* @param deposit_timestamp when was the purse fully paid up (can be never)
|
||||||
|
* @param balance current balance of the purse
|
||||||
|
* @param[out] pub where to write the public key
|
||||||
|
* @param[out] sig where to write the signature
|
||||||
|
* @return #TALER_EC_NONE on success
|
||||||
|
*/
|
||||||
enum TALER_ErrorCode
|
enum TALER_ErrorCode
|
||||||
TALER_exchange_online_purse_status_sign (
|
TALER_exchange_online_purse_status_sign (
|
||||||
TALER_ExchangeSignCallback scb,
|
TALER_ExchangeSignCallback scb,
|
||||||
@ -4087,6 +4245,16 @@ TALER_exchange_online_purse_status_sign (
|
|||||||
struct TALER_ExchangeSignatureP *sig);
|
struct TALER_ExchangeSignatureP *sig);
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Verify signature over information about the status of a purse.
|
||||||
|
*
|
||||||
|
* @param merge_timestamp when was the purse merged (can be never)
|
||||||
|
* @param deposit_timestamp when was the purse fully paid up (can be never)
|
||||||
|
* @param balance current balance of the purse
|
||||||
|
* @param exchange_pub the public key of the exchange to check against
|
||||||
|
* @param exchange_sig the signature to check
|
||||||
|
* @return #GNUNET_OK if the signature is valid
|
||||||
|
*/
|
||||||
enum GNUNET_GenericReturnValue
|
enum GNUNET_GenericReturnValue
|
||||||
TALER_exchange_online_purse_status_verify (
|
TALER_exchange_online_purse_status_verify (
|
||||||
struct GNUNET_TIME_Timestamp merge_timestamp,
|
struct GNUNET_TIME_Timestamp merge_timestamp,
|
||||||
@ -4321,7 +4489,18 @@ TALER_exchange_offline_denom_validity_verify (
|
|||||||
const struct TALER_MasterSignatureP *master_sig);
|
const struct TALER_MasterSignatureP *master_sig);
|
||||||
|
|
||||||
|
|
||||||
// FIXME: document
|
/**
|
||||||
|
* Create offline signature about an exchange's partners.
|
||||||
|
*
|
||||||
|
* @param partner_pub master public key of the partner
|
||||||
|
* @param start_date validity period start
|
||||||
|
* @param end_date validity period end
|
||||||
|
* @param wad_frequency how often will we do wad transfers to this partner
|
||||||
|
* @param wad_fee what is the wad fee to this partner
|
||||||
|
* @param partner_base_url what is the base URL of the @a partner_pub exchange
|
||||||
|
* @param master_priv private key to sign with
|
||||||
|
* @param[out] master_sig where to write the signature
|
||||||
|
*/
|
||||||
void
|
void
|
||||||
TALER_exchange_offline_partner_details_sign (
|
TALER_exchange_offline_partner_details_sign (
|
||||||
const struct TALER_MasterPublicKeyP *partner_pub,
|
const struct TALER_MasterPublicKeyP *partner_pub,
|
||||||
@ -4334,7 +4513,19 @@ TALER_exchange_offline_partner_details_sign (
|
|||||||
struct TALER_MasterSignatureP *master_sig);
|
struct TALER_MasterSignatureP *master_sig);
|
||||||
|
|
||||||
|
|
||||||
// FIXME: document
|
/**
|
||||||
|
* Verify signature about an exchange's partners.
|
||||||
|
*
|
||||||
|
* @param partner_pub master public key of the partner
|
||||||
|
* @param start_date validity period start
|
||||||
|
* @param end_date validity period end
|
||||||
|
* @param wad_frequency how often will we do wad transfers to this partner
|
||||||
|
* @param wad_fee what is the wad fee to this partner
|
||||||
|
* @param partner_base_url what is the base URL of the @a partner_pub exchange
|
||||||
|
* @param master_pub public key to verify against
|
||||||
|
* @param master_sig the signature the signature
|
||||||
|
* @return #GNUNET_OK if the signature is valid
|
||||||
|
*/
|
||||||
enum GNUNET_GenericReturnValue
|
enum GNUNET_GenericReturnValue
|
||||||
TALER_exchange_offline_partner_details_verify (
|
TALER_exchange_offline_partner_details_verify (
|
||||||
const struct TALER_MasterPublicKeyP *partner_pub,
|
const struct TALER_MasterPublicKeyP *partner_pub,
|
||||||
@ -4780,6 +4971,7 @@ TALER_merchant_pay_sign (
|
|||||||
const struct TALER_MerchantPrivateKeyP *merch_priv,
|
const struct TALER_MerchantPrivateKeyP *merch_priv,
|
||||||
struct GNUNET_CRYPTO_EddsaSignature *merch_sig);
|
struct GNUNET_CRYPTO_EddsaSignature *merch_sig);
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Verify payment confirmation signature.
|
* Verify payment confirmation signature.
|
||||||
*
|
*
|
||||||
@ -4841,7 +5033,8 @@ TALER_exchange_offline_extension_config_hash_verify (
|
|||||||
const struct TALER_MasterSignatureP *master_sig
|
const struct TALER_MasterSignatureP *master_sig
|
||||||
);
|
);
|
||||||
|
|
||||||
/*
|
|
||||||
|
/**
|
||||||
* @brief Representation of an age commitment: one public key per age group.
|
* @brief Representation of an age commitment: one public key per age group.
|
||||||
*
|
*
|
||||||
* The number of keys must be be the same as the number of bits set in the
|
* The number of keys must be be the same as the number of bits set in the
|
||||||
@ -4850,30 +5043,37 @@ TALER_exchange_offline_extension_config_hash_verify (
|
|||||||
struct TALER_AgeCommitment
|
struct TALER_AgeCommitment
|
||||||
{
|
{
|
||||||
|
|
||||||
/* The age mask defines the age groups that were a parameter during the
|
/**
|
||||||
* generation of this age commitment */
|
* The age mask defines the age groups that were a parameter during the
|
||||||
|
* generation of this age commitment
|
||||||
|
*/
|
||||||
struct TALER_AgeMask mask;
|
struct TALER_AgeMask mask;
|
||||||
|
|
||||||
/* The number of public keys, which must be the same as the number of
|
/**
|
||||||
|
* The number of public keys, which must be the same as the number of
|
||||||
* groups in the mask.
|
* groups in the mask.
|
||||||
*/
|
*/
|
||||||
size_t num;
|
size_t num;
|
||||||
|
|
||||||
/* The list of #num_pub public keys. In must have same size as the number of
|
/**
|
||||||
|
* The list of @e num public keys. In must have same size as the number of
|
||||||
* age groups defined in the mask.
|
* age groups defined in the mask.
|
||||||
*
|
*
|
||||||
* A hash of this list is the hashed commitment that goes into FDC
|
* A hash of this list is the hashed commitment that goes into FDC
|
||||||
* calculation during the withdraw and refresh operations for new coins. That
|
* calculation during the withdraw and refresh operations for new coins. That
|
||||||
* way, the particular age commitment becomes mandatory and bound to a coin.
|
* way, the particular age commitment becomes mandatory and bound to a coin.
|
||||||
*
|
*
|
||||||
* The list has been allocated via GNUNET_malloc.
|
* The list has been allocated via GNUNET_malloc().
|
||||||
*/
|
*/
|
||||||
struct TALER_AgeCommitmentPublicKeyP *keys;
|
struct TALER_AgeCommitmentPublicKeyP *keys;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
|
// FIXME-oec: document!
|
||||||
struct TALER_AgeProof
|
struct TALER_AgeProof
|
||||||
{
|
{
|
||||||
/* The number of private keys, which must be at most num_pub_keys. One minus
|
/**
|
||||||
|
* The number of private keys, which must be at most num_pub_keys. One minus
|
||||||
* this number corresponds to the largest age group that is supported with
|
* this number corresponds to the largest age group that is supported with
|
||||||
* this age commitment.
|
* this age commitment.
|
||||||
* **Note**, that this and the next field are only relevant on the wallet
|
* **Note**, that this and the next field are only relevant on the wallet
|
||||||
@ -4881,7 +5081,8 @@ struct TALER_AgeProof
|
|||||||
*/
|
*/
|
||||||
size_t num;
|
size_t num;
|
||||||
|
|
||||||
/* List of #num_priv private keys.
|
/**
|
||||||
|
* List of @e num private keys.
|
||||||
*
|
*
|
||||||
* Note that the list can be _smaller_ than the corresponding list of public
|
* Note that the list can be _smaller_ than the corresponding list of public
|
||||||
* keys. In that case, the wallet can sign off only for a subset of the age
|
* keys. In that case, the wallet can sign off only for a subset of the age
|
||||||
@ -4892,9 +5093,13 @@ struct TALER_AgeProof
|
|||||||
struct TALER_AgeCommitmentPrivateKeyP *keys;
|
struct TALER_AgeCommitmentPrivateKeyP *keys;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
|
// FIXME-oec: document!
|
||||||
struct TALER_AgeCommitmentProof
|
struct TALER_AgeCommitmentProof
|
||||||
{
|
{
|
||||||
|
// FIXME-oec: document!
|
||||||
struct TALER_AgeCommitment commitment;
|
struct TALER_AgeCommitment commitment;
|
||||||
|
// FIXME-oec: document!
|
||||||
struct TALER_AgeProof proof;
|
struct TALER_AgeProof proof;
|
||||||
};
|
};
|
||||||
|
|
||||||
@ -4916,8 +5121,8 @@ TALER_age_commitment_hash (
|
|||||||
*
|
*
|
||||||
* @param mask The age mask the defines the age groups
|
* @param mask The age mask the defines the age groups
|
||||||
* @param age The actual age for which an age commitment is generated
|
* @param age The actual age for which an age commitment is generated
|
||||||
* @param seed The seed that goes into the key generation. MUST be choosen uniformly random.
|
* @param seed The seed that goes into the key generation. MUST be chosen uniformly random.
|
||||||
* @param comm_proof[out] The generated age commitment, ->priv and ->pub allocated via GNUNET_malloc on success
|
* @param[out] comm_proof The generated age commitment, ->priv and ->pub allocated via GNUNET_malloc() on success
|
||||||
* @return #GNUNET_OK on success, #GNUNET_SYSERR otherwise
|
* @return #GNUNET_OK on success, #GNUNET_SYSERR otherwise
|
||||||
*/
|
*/
|
||||||
enum GNUNET_GenericReturnValue
|
enum GNUNET_GenericReturnValue
|
||||||
@ -4933,7 +5138,7 @@ TALER_age_restriction_commit (
|
|||||||
*
|
*
|
||||||
* @param orig Original age commitment
|
* @param orig Original age commitment
|
||||||
* @param salt Salt to randomly move the points on the elliptic curve in order to generate another, equivalent commitment.
|
* @param salt Salt to randomly move the points on the elliptic curve in order to generate another, equivalent commitment.
|
||||||
* @param[out] derived The resulting age commitment, ->priv and ->pub allocated via GNUNET_malloc on success.
|
* @param[out] derived The resulting age commitment, ->priv and ->pub allocated via GNUNET_malloc() on success.
|
||||||
* @return #GNUNET_OK on success, #GNUNET_SYSERR otherwise
|
* @return #GNUNET_OK on success, #GNUNET_SYSERR otherwise
|
||||||
*/
|
*/
|
||||||
enum GNUNET_GenericReturnValue
|
enum GNUNET_GenericReturnValue
|
||||||
@ -4957,13 +5162,14 @@ TALER_age_commitment_attest (
|
|||||||
uint8_t age,
|
uint8_t age,
|
||||||
struct TALER_AgeAttestation *attest);
|
struct TALER_AgeAttestation *attest);
|
||||||
|
|
||||||
/*
|
|
||||||
|
/**
|
||||||
* @brief Verify the attestation for an given age and age commitment
|
* @brief Verify the attestation for an given age and age commitment
|
||||||
*
|
*
|
||||||
* @param commitent The age commitment that went into the attestation. Only the public keys are needed.
|
* @param commitment The age commitment that went into the attestation. Only the public keys are needed.
|
||||||
* @param age Age (not age group) for which the an attestation should be done
|
* @param age Age (not age group) for which the an attestation should be done
|
||||||
* @param attest Signature of the age with the appropriate key from the age commitment for the corresponding age group, if applicaple.
|
* @param attest Signature of the age with the appropriate key from the age commitment for the corresponding age group, if applicaple.
|
||||||
* @return GNUNET_OK when the attestation was successfull, GNUNET_NO no attestation couldn't be verified, GNUNET_SYSERR otherwise
|
* @return #GNUNET_OK when the attestation was successful, #GNUNET_NO no attestation couldn't be verified, #GNUNET_SYSERR otherwise
|
||||||
*/
|
*/
|
||||||
enum GNUNET_GenericReturnValue
|
enum GNUNET_GenericReturnValue
|
||||||
TALER_age_commitment_verify (
|
TALER_age_commitment_verify (
|
||||||
@ -4971,7 +5177,8 @@ TALER_age_commitment_verify (
|
|||||||
uint8_t age,
|
uint8_t age,
|
||||||
const struct TALER_AgeAttestation *attest);
|
const struct TALER_AgeAttestation *attest);
|
||||||
|
|
||||||
/*
|
|
||||||
|
/**
|
||||||
* @brief helper function to free memory of a struct TALER_AgeCommitment
|
* @brief helper function to free memory of a struct TALER_AgeCommitment
|
||||||
*
|
*
|
||||||
* @param p the commitment from which all memory should be freed.
|
* @param p the commitment from which all memory should be freed.
|
||||||
@ -4980,7 +5187,8 @@ void
|
|||||||
TALER_age_commitment_free (
|
TALER_age_commitment_free (
|
||||||
struct TALER_AgeCommitment *p);
|
struct TALER_AgeCommitment *p);
|
||||||
|
|
||||||
/*
|
|
||||||
|
/**
|
||||||
* @brief helper function to free memory of a struct TALER_AgeProof
|
* @brief helper function to free memory of a struct TALER_AgeProof
|
||||||
*
|
*
|
||||||
* @param p the proof of commitment from which all memory should be freed.
|
* @param p the proof of commitment from which all memory should be freed.
|
||||||
@ -4989,7 +5197,8 @@ void
|
|||||||
TALER_age_proof_free (
|
TALER_age_proof_free (
|
||||||
struct TALER_AgeProof *p);
|
struct TALER_AgeProof *p);
|
||||||
|
|
||||||
/*
|
|
||||||
|
/**
|
||||||
* @brief helper function to free memory of a struct TALER_AgeCommitmentProof
|
* @brief helper function to free memory of a struct TALER_AgeCommitmentProof
|
||||||
*
|
*
|
||||||
* @param p the commitment and its proof from which all memory should be freed.
|
* @param p the commitment and its proof from which all memory should be freed.
|
||||||
|
@ -1170,6 +1170,7 @@ struct TALER_EXCHANGE_NonceKey
|
|||||||
* Get a set of CS R values using a /csr-melt request.
|
* Get a set of CS R values using a /csr-melt request.
|
||||||
*
|
*
|
||||||
* @param exchange the exchange handle; the exchange must be ready to operate
|
* @param exchange the exchange handle; the exchange must be ready to operate
|
||||||
|
* @param rms master key used for the derivation of the CS values
|
||||||
* @param nks_len length of the @a nks array
|
* @param nks_len length of the @a nks array
|
||||||
* @param nks array of denominations and nonces
|
* @param nks array of denominations and nonces
|
||||||
* @param res_cb the callback to call when the final result for this request is available
|
* @param res_cb the callback to call when the final result for this request is available
|
||||||
@ -1263,7 +1264,7 @@ typedef void
|
|||||||
* Get a CS R using a /csr-withdraw request.
|
* Get a CS R using a /csr-withdraw request.
|
||||||
*
|
*
|
||||||
* @param exchange the exchange handle; the exchange must be ready to operate
|
* @param exchange the exchange handle; the exchange must be ready to operate
|
||||||
* @param dk Which denomination key is the /csr request for
|
* @param pk Which denomination key is the /csr request for
|
||||||
* @param nonce client nonce for the request
|
* @param nonce client nonce for the request
|
||||||
* @param res_cb the callback to call when the final result for this request is available
|
* @param res_cb the callback to call when the final result for this request is available
|
||||||
* @param res_cb_cls closure for the above callback
|
* @param res_cb_cls closure for the above callback
|
||||||
@ -2377,7 +2378,7 @@ struct TALER_EXCHANGE_MeltResponse
|
|||||||
union
|
union
|
||||||
{
|
{
|
||||||
/**
|
/**
|
||||||
* Results for status #MHD_HTTP_SUCCESS.
|
* Results for status #MHD_HTTP_OK.
|
||||||
*/
|
*/
|
||||||
struct
|
struct
|
||||||
{
|
{
|
||||||
@ -2512,7 +2513,7 @@ struct TALER_EXCHANGE_RevealResult
|
|||||||
union
|
union
|
||||||
{
|
{
|
||||||
/**
|
/**
|
||||||
* Results for status #MHD_HTTP_SUCCESS.
|
* Results for status #MHD_HTTP_OK.
|
||||||
*/
|
*/
|
||||||
struct
|
struct
|
||||||
{
|
{
|
||||||
@ -2660,7 +2661,7 @@ struct TALER_EXCHANGE_LinkResult
|
|||||||
union
|
union
|
||||||
{
|
{
|
||||||
/**
|
/**
|
||||||
* Results for status #MHD_HTTP_SUCCESS.
|
* Results for status #MHD_HTTP_OK.
|
||||||
*/
|
*/
|
||||||
struct
|
struct
|
||||||
{
|
{
|
||||||
@ -2704,7 +2705,7 @@ typedef void
|
|||||||
*
|
*
|
||||||
* @param exchange the exchange handle; the exchange must be ready to operate
|
* @param exchange the exchange handle; the exchange must be ready to operate
|
||||||
* @param coin_priv private key to request link data for
|
* @param coin_priv private key to request link data for
|
||||||
* @param age_commitment age commitment to the corresponding coin, might be NULL
|
* @param age_commitment_proof age commitment to the corresponding coin, might be NULL
|
||||||
* @param link_cb the callback to call with the useful result of the
|
* @param link_cb the callback to call with the useful result of the
|
||||||
* refresh operation the @a coin_priv was involved in (if any)
|
* refresh operation the @a coin_priv was involved in (if any)
|
||||||
* @param link_cb_cls closure for @a link_cb
|
* @param link_cb_cls closure for @a link_cb
|
||||||
@ -3773,13 +3774,14 @@ TALER_EXCHANGE_management_post_extensions (
|
|||||||
TALER_EXCHANGE_ManagementPostExtensionsCallback cb,
|
TALER_EXCHANGE_ManagementPostExtensionsCallback cb,
|
||||||
void *cb_cls);
|
void *cb_cls);
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Cancel #TALER_EXCHANGE_post_management_extensions() operation.
|
* Cancel #TALER_EXCHANGE_management_post_extensions() operation.
|
||||||
*
|
*
|
||||||
* @param ph handle of the operation to cancel
|
* @param ph handle of the operation to cancel
|
||||||
*/
|
*/
|
||||||
void
|
void
|
||||||
TALER_EXCHANGE_post_management_extensions_cancel (
|
TALER_EXCHANGE_management_post_extensions_cancel (
|
||||||
struct TALER_EXCHANGE_ManagementPostExtensionsHandle *ph);
|
struct TALER_EXCHANGE_ManagementPostExtensionsHandle *ph);
|
||||||
|
|
||||||
|
|
||||||
@ -4205,7 +4207,7 @@ TALER_EXCHANGE_management_set_global_fees (
|
|||||||
/**
|
/**
|
||||||
* Cancel #TALER_EXCHANGE_management_enable_wire() operation.
|
* Cancel #TALER_EXCHANGE_management_enable_wire() operation.
|
||||||
*
|
*
|
||||||
* @param swfh handle of the operation to cancel
|
* @param sgfh handle of the operation to cancel
|
||||||
*/
|
*/
|
||||||
void
|
void
|
||||||
TALER_EXCHANGE_management_set_global_fees_cancel (
|
TALER_EXCHANGE_management_set_global_fees_cancel (
|
||||||
@ -4637,7 +4639,7 @@ struct TALER_EXCHANGE_AccountMergeResponse
|
|||||||
* operation.
|
* operation.
|
||||||
*
|
*
|
||||||
* @param cls closure
|
* @param cls closure
|
||||||
* @param pcr HTTP response data
|
* @param amr HTTP response data
|
||||||
*/
|
*/
|
||||||
typedef void
|
typedef void
|
||||||
(*TALER_EXCHANGE_AccountMergeCallback) (
|
(*TALER_EXCHANGE_AccountMergeCallback) (
|
||||||
@ -4663,7 +4665,7 @@ struct TALER_EXCHANGE_AccountMergeHandle;
|
|||||||
* @param h_contract_terms hash of the purses' contract
|
* @param h_contract_terms hash of the purses' contract
|
||||||
* @param min_age minimum age of deposits into the purse
|
* @param min_age minimum age of deposits into the purse
|
||||||
* @param purse_value_after_fees amount that should be in the purse
|
* @param purse_value_after_fees amount that should be in the purse
|
||||||
* @paran purse_expiration when will the purse expire
|
* @param purse_expiration when will the purse expire
|
||||||
* @param merge_timestamp when is the merge happening (current time)
|
* @param merge_timestamp when is the merge happening (current time)
|
||||||
* @param cb function to call with the exchange's result
|
* @param cb function to call with the exchange's result
|
||||||
* @param cb_cls closure for @a cb
|
* @param cb_cls closure for @a cb
|
||||||
@ -4758,7 +4760,7 @@ struct TALER_EXCHANGE_PurseCreateMergeHandle;
|
|||||||
* @param contract_terms contract the purse is about
|
* @param contract_terms contract the purse is about
|
||||||
* @param upload_contract true to upload the contract
|
* @param upload_contract true to upload the contract
|
||||||
* @param pay_for_purse true to pay for purse creation
|
* @param pay_for_purse true to pay for purse creation
|
||||||
* @paran merge_timestamp when should the merge happen (use current time)
|
* @param merge_timestamp when should the merge happen (use current time)
|
||||||
* @param cb function to call with the exchange's result
|
* @param cb function to call with the exchange's result
|
||||||
* @param cb_cls closure for @a cb
|
* @param cb_cls closure for @a cb
|
||||||
* @return the request handle; NULL upon error
|
* @return the request handle; NULL upon error
|
||||||
|
@ -1420,7 +1420,7 @@ struct TALER_EXCHANGEDB_DepositListEntry
|
|||||||
struct TALER_DenominationHashP h_denom_pub;
|
struct TALER_DenominationHashP h_denom_pub;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Age commitment hash, if applicable ot the denomination. Should be all
|
* Age commitment hash, if applicable to the denomination. Should be all
|
||||||
* zeroes if age commitment is not applicable to the denonimation.
|
* zeroes if age commitment is not applicable to the denonimation.
|
||||||
*/
|
*/
|
||||||
struct TALER_AgeCommitmentHash h_age_commitment;
|
struct TALER_AgeCommitmentHash h_age_commitment;
|
||||||
@ -2017,6 +2017,16 @@ typedef enum GNUNET_GenericReturnValue
|
|||||||
*
|
*
|
||||||
* @param cls closure
|
* @param cls closure
|
||||||
* @param rowid unique serial ID for the deposit in our DB
|
* @param rowid unique serial ID for the deposit in our DB
|
||||||
|
* @param reserve_pub reserve affected by the merge
|
||||||
|
* @param purse_pub purse being merged
|
||||||
|
* @param h_contract_terms hash over contract of the purse
|
||||||
|
* @param purse_expiration when would the purse expire
|
||||||
|
* @param amount total amount in the purse
|
||||||
|
* @param min_age minimum age of all coins deposited into the purse
|
||||||
|
* @param flags how was the purse created
|
||||||
|
* @param purse_fee if a purse fee was paid, how high is it
|
||||||
|
* @param merge_timestamp when was the merge approved
|
||||||
|
* @param reserve_sig signature by reserve approving the merge
|
||||||
* @return #GNUNET_OK to continue to iterate, #GNUNET_SYSERR to stop
|
* @return #GNUNET_OK to continue to iterate, #GNUNET_SYSERR to stop
|
||||||
*/
|
*/
|
||||||
typedef enum GNUNET_GenericReturnValue
|
typedef enum GNUNET_GenericReturnValue
|
||||||
@ -2075,6 +2085,10 @@ typedef enum GNUNET_GenericReturnValue
|
|||||||
*
|
*
|
||||||
* @param cls closure
|
* @param cls closure
|
||||||
* @param rowid unique serial ID for the deposit in our DB
|
* @param rowid unique serial ID for the deposit in our DB
|
||||||
|
* @param history_fee fee paid for the request
|
||||||
|
* @param ts timestamp of the request
|
||||||
|
* @param reserve_pub reserve history was requested for
|
||||||
|
* @param reserve_sig signature approving the @a history_fee
|
||||||
* @return #GNUNET_OK to continue to iterate, #GNUNET_SYSERR to stop
|
* @return #GNUNET_OK to continue to iterate, #GNUNET_SYSERR to stop
|
||||||
*/
|
*/
|
||||||
typedef enum GNUNET_GenericReturnValue
|
typedef enum GNUNET_GenericReturnValue
|
||||||
@ -2108,6 +2122,7 @@ typedef enum GNUNET_GenericReturnValue
|
|||||||
* the goal of auditing the purse refund's execution.
|
* the goal of auditing the purse refund's execution.
|
||||||
*
|
*
|
||||||
* @param cls closure
|
* @param cls closure
|
||||||
|
* @param rowid row of the refund event
|
||||||
* @param amount_with_fee amount of the deposit into the purse
|
* @param amount_with_fee amount of the deposit into the purse
|
||||||
* @param coin_pub coin that is to be refunded the @a given amount_with_fee
|
* @param coin_pub coin that is to be refunded the @a given amount_with_fee
|
||||||
* @param denom_pub denomination of @a coin_pub
|
* @param denom_pub denomination of @a coin_pub
|
||||||
@ -3935,8 +3950,8 @@ struct TALER_EXCHANGEDB_Plugin
|
|||||||
* Insert global fee set into database.
|
* Insert global fee set into database.
|
||||||
*
|
*
|
||||||
* @param cls closure
|
* @param cls closure
|
||||||
* @param start_date when does the fee go into effect
|
* @param start_date when does the fees go into effect
|
||||||
* @param end_date when does the fee end being valid
|
* @param end_date when does the fees end being valid
|
||||||
* @param fees how high is are the global fees
|
* @param fees how high is are the global fees
|
||||||
* @param purse_timeout when do purses time out
|
* @param purse_timeout when do purses time out
|
||||||
* @param kyc_timeout when do reserves without KYC time out
|
* @param kyc_timeout when do reserves without KYC time out
|
||||||
@ -5101,7 +5116,7 @@ struct TALER_EXCHANGEDB_Plugin
|
|||||||
* @param[out] in_conflict set to true if @a econtract
|
* @param[out] in_conflict set to true if @a econtract
|
||||||
* conflicts with an existing contract;
|
* conflicts with an existing contract;
|
||||||
* in this case, the return value will be
|
* in this case, the return value will be
|
||||||
* #GNUNET_DB_STATUS_SUCCESS_ONE despite the failure
|
* #GNUNET_DB_STATUS_SUCCESS_ONE_RESULT despite the failure
|
||||||
* @return transaction status code
|
* @return transaction status code
|
||||||
*/
|
*/
|
||||||
enum GNUNET_DB_QueryStatus
|
enum GNUNET_DB_QueryStatus
|
||||||
@ -5163,7 +5178,7 @@ struct TALER_EXCHANGEDB_Plugin
|
|||||||
* @param[out] in_conflict set to true if the meta data
|
* @param[out] in_conflict set to true if the meta data
|
||||||
* conflicts with an existing purse;
|
* conflicts with an existing purse;
|
||||||
* in this case, the return value will be
|
* in this case, the return value will be
|
||||||
* #GNUNET_DB_STATUS_SUCCESS_ONE despite the failure
|
* #GNUNET_DB_STATUS_SUCCESS_ONE_RESULT despite the failure
|
||||||
* @return transaction status code
|
* @return transaction status code
|
||||||
*/
|
*/
|
||||||
enum GNUNET_DB_QueryStatus
|
enum GNUNET_DB_QueryStatus
|
||||||
@ -5220,7 +5235,7 @@ struct TALER_EXCHANGEDB_Plugin
|
|||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Function called to reutrn meta data about a purse by the
|
* Function called to return meta data about a purse by the
|
||||||
* purse public key.
|
* purse public key.
|
||||||
*
|
*
|
||||||
* @param cls the @e cls of this struct with the plugin-specific state
|
* @param cls the @e cls of this struct with the plugin-specific state
|
||||||
@ -5292,7 +5307,7 @@ struct TALER_EXCHANGEDB_Plugin
|
|||||||
* @param[out] balance_ok set to false if the coin's
|
* @param[out] balance_ok set to false if the coin's
|
||||||
* remaining balance is below @a amount;
|
* remaining balance is below @a amount;
|
||||||
* in this case, the return value will be
|
* in this case, the return value will be
|
||||||
* #GNUNET_DB_STATUS_SUCCESS_ONE despite the failure
|
* #GNUNET_DB_STATUS_SUCCESS_ONE_RESULT despite the failure
|
||||||
* @param[out] conflict the same coin was deposited into
|
* @param[out] conflict the same coin was deposited into
|
||||||
* this purse with a different amount already
|
* this purse with a different amount already
|
||||||
* @return transaction status code
|
* @return transaction status code
|
||||||
|
@ -99,8 +99,8 @@ TALER_extensions_is_json_config (
|
|||||||
* he JSON object must be of type ExchangeKeysResponse as described in
|
* he JSON object must be of type ExchangeKeysResponse as described in
|
||||||
* https://docs.taler.net/design-documents/006-extensions.html#exchange
|
* https://docs.taler.net/design-documents/006-extensions.html#exchange
|
||||||
*
|
*
|
||||||
* @param cfg JSON object containting the configuration for all extensions
|
* @param cfg JSON object containing the configuration for all extensions
|
||||||
* @return GNUNET_OK on success, GNUNET_SYSERR if unknown extensions were found
|
* @return #GNUNET_OK on success, #GNUNET_SYSERR if unknown extensions were found
|
||||||
* or any particular configuration couldn't be parsed.
|
* or any particular configuration couldn't be parsed.
|
||||||
*/
|
*/
|
||||||
enum GNUNET_GenericReturnValue
|
enum GNUNET_GenericReturnValue
|
||||||
@ -267,7 +267,7 @@ TALER_extensions_age_restriction_num_groups ();
|
|||||||
* Parses a JSON object { "age_groups": "a:b:...y:z" }.
|
* Parses a JSON object { "age_groups": "a:b:...y:z" }.
|
||||||
*
|
*
|
||||||
* @param root is the json object
|
* @param root is the json object
|
||||||
* @param[out] mask on succes, will contain the age mask
|
* @param[out] mask on success, will contain the age mask
|
||||||
* @return #GNUNET_OK on success and #GNUNET_SYSERR on failure.
|
* @return #GNUNET_OK on success and #GNUNET_SYSERR on failure.
|
||||||
*/
|
*/
|
||||||
enum GNUNET_GenericReturnValue
|
enum GNUNET_GenericReturnValue
|
||||||
|
@ -2229,6 +2229,7 @@ TALER_TESTING_cmd_auditor_add_denom_sig (const char *label,
|
|||||||
* @param wire_method wire method to set wire fees for
|
* @param wire_method wire method to set wire fees for
|
||||||
* @param wire_fee the wire fee to affirm
|
* @param wire_fee the wire fee to affirm
|
||||||
* @param closing_fee the closing fee to affirm
|
* @param closing_fee the closing fee to affirm
|
||||||
|
* @param wad_fee wad fee to charge
|
||||||
* @param expected_http_status expected HTTP status from exchange
|
* @param expected_http_status expected HTTP status from exchange
|
||||||
* @param bad_sig should we use a bogus signature?
|
* @param bad_sig should we use a bogus signature?
|
||||||
* @return the command
|
* @return the command
|
||||||
|
@ -494,12 +494,12 @@ TALER_yna_to_string (enum TALER_EXCHANGE_YesNoAll yna);
|
|||||||
|
|
||||||
#ifdef __APPLE__
|
#ifdef __APPLE__
|
||||||
/**
|
/**
|
||||||
* Returns the first occurence of `c` in `s`, or returns the null-byte
|
* Returns the first occurrence of `c` in `s`, or returns the null-byte
|
||||||
* terminating the string if it does not occur.
|
* terminating the string if it does not occur.
|
||||||
*
|
*
|
||||||
* @param s the string to search in
|
* @param s the string to search in
|
||||||
* @param c the character to search for
|
* @param c the character to search for
|
||||||
* @return char* the first occurence of `c` in `s`
|
* @return char* the first occurrence of `c` in `s`
|
||||||
*/
|
*/
|
||||||
char *strchrnul (const char *s, int c);
|
char *strchrnul (const char *s, int c);
|
||||||
|
|
||||||
|
@ -156,6 +156,7 @@ handle_deposit_confirmation_finished (void *cls,
|
|||||||
* @param h_extensions hash over the extensions, if any
|
* @param h_extensions hash over the extensions, if any
|
||||||
* @param h_contract_terms hash of the contact of the merchant with the customer (further details are never disclosed to the auditor)
|
* @param h_contract_terms hash of the contact of the merchant with the customer (further details are never disclosed to the auditor)
|
||||||
* @param exchange_timestamp timestamp when the deposit was received by the wallet
|
* @param exchange_timestamp timestamp when the deposit was received by the wallet
|
||||||
|
* @param wire_deadline by what time must the amount be wired to the merchant
|
||||||
* @param refund_deadline date until which the merchant can issue a refund to the customer via the auditor (can be zero if refunds are not allowed); must not be after the @a wire_deadline
|
* @param refund_deadline date until which the merchant can issue a refund to the customer via the auditor (can be zero if refunds are not allowed); must not be after the @a wire_deadline
|
||||||
* @param amount_without_fee the amount confirmed to be wired by the exchange to the merchant
|
* @param amount_without_fee the amount confirmed to be wired by the exchange to the merchant
|
||||||
* @param coin_pub coin’s public key
|
* @param coin_pub coin’s public key
|
||||||
|
@ -145,7 +145,8 @@ struct TALER_EXCHANGE_BatchWithdrawHandle
|
|||||||
*
|
*
|
||||||
* @param cls the `struct TALER_EXCHANGE_BatchWithdrawHandle`
|
* @param cls the `struct TALER_EXCHANGE_BatchWithdrawHandle`
|
||||||
* @param hr HTTP response data
|
* @param hr HTTP response data
|
||||||
* @param blind_sig blind signature over the coin, NULL on error
|
* @param blind_sigs array of blind signatures over the coins, NULL on error
|
||||||
|
* @param blind_sigs_length length of the @a blind_sigs array
|
||||||
*/
|
*/
|
||||||
static void
|
static void
|
||||||
handle_reserve_batch_withdraw_finished (
|
handle_reserve_batch_withdraw_finished (
|
||||||
|
@ -50,6 +50,7 @@ TALER_EXCHANGE_check_purse_create_conflict_ (
|
|||||||
* not match the signature from the proof)
|
* not match the signature from the proof)
|
||||||
* @param merge_pub the public key (must match
|
* @param merge_pub the public key (must match
|
||||||
* the signature from the proof)
|
* the signature from the proof)
|
||||||
|
* @param purse_pub the public key of the purse
|
||||||
* @param exchange_url the base URL of this exchange
|
* @param exchange_url the base URL of this exchange
|
||||||
* @param proof the proof to check
|
* @param proof the proof to check
|
||||||
* @return #GNUNET_OK if the @a proof is OK for @a purse_pub and @a merge_pub and conflicts with @a cmerge_sig
|
* @return #GNUNET_OK if the @a proof is OK for @a purse_pub and @a merge_pub and conflicts with @a cmerge_sig
|
||||||
@ -93,7 +94,6 @@ TALER_EXCHANGE_check_purse_coin_conflict_ (
|
|||||||
* @param ccontract_sig conflicting signature (must
|
* @param ccontract_sig conflicting signature (must
|
||||||
* not match the signature from the proof)
|
* not match the signature from the proof)
|
||||||
* @param purse_pub public key of the purse
|
* @param purse_pub public key of the purse
|
||||||
* @param exchange_url the base URL of this exchange
|
|
||||||
* @param proof the proof to check
|
* @param proof the proof to check
|
||||||
* @return #GNUNET_OK if the @a proof is OK for @a purse_pub and conflicts with @a ccontract_sig
|
* @return #GNUNET_OK if the @a proof is OK for @a purse_pub and conflicts with @a ccontract_sig
|
||||||
*/
|
*/
|
||||||
|
@ -323,7 +323,6 @@ TALER_EXCHANGE_deposits_get (
|
|||||||
TALER_merchant_deposit_sign (h_contract_terms,
|
TALER_merchant_deposit_sign (h_contract_terms,
|
||||||
h_wire,
|
h_wire,
|
||||||
coin_pub,
|
coin_pub,
|
||||||
&merchant,
|
|
||||||
merchant_priv,
|
merchant_priv,
|
||||||
&merchant_sig);
|
&merchant_sig);
|
||||||
{
|
{
|
||||||
|
@ -118,7 +118,7 @@ handle_post_extensions_finished (void *cls,
|
|||||||
&hr);
|
&hr);
|
||||||
ph->cb = NULL;
|
ph->cb = NULL;
|
||||||
}
|
}
|
||||||
TALER_EXCHANGE_post_management_extensions_cancel (ph);
|
TALER_EXCHANGE_management_post_extensions_cancel (ph);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@ -180,7 +180,7 @@ TALER_EXCHANGE_management_post_extensions (
|
|||||||
ph);
|
ph);
|
||||||
if (NULL == ph->job)
|
if (NULL == ph->job)
|
||||||
{
|
{
|
||||||
TALER_EXCHANGE_post_management_extensions_cancel (ph);
|
TALER_EXCHANGE_management_post_extensions_cancel (ph);
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
return ph;
|
return ph;
|
||||||
@ -188,7 +188,7 @@ TALER_EXCHANGE_management_post_extensions (
|
|||||||
|
|
||||||
|
|
||||||
void
|
void
|
||||||
TALER_EXCHANGE_post_management_extensions_cancel (
|
TALER_EXCHANGE_management_post_extensions_cancel (
|
||||||
struct TALER_EXCHANGE_ManagementPostExtensionsHandle *ph)
|
struct TALER_EXCHANGE_ManagementPostExtensionsHandle *ph)
|
||||||
{
|
{
|
||||||
if (NULL != ph->job)
|
if (NULL != ph->job)
|
||||||
|
@ -417,6 +417,7 @@ start_melt (struct TALER_EXCHANGE_MeltHandle *mh)
|
|||||||
* the application and cancel the operation.
|
* the application and cancel the operation.
|
||||||
*
|
*
|
||||||
* @param[in] mh melt request that failed
|
* @param[in] mh melt request that failed
|
||||||
|
* @param ec error code to fail with
|
||||||
*/
|
*/
|
||||||
static void
|
static void
|
||||||
fail_mh (struct TALER_EXCHANGE_MeltHandle *mh,
|
fail_mh (struct TALER_EXCHANGE_MeltHandle *mh,
|
||||||
|
@ -62,7 +62,7 @@ struct PurseMergeState
|
|||||||
const char *merge_ref;
|
const char *merge_ref;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Refernece to the reserve, or NULL (!).
|
* Reference to the reserve, or NULL (!).
|
||||||
*/
|
*/
|
||||||
const char *reserve_ref;
|
const char *reserve_ref;
|
||||||
|
|
||||||
|
@ -348,15 +348,7 @@ do_reveal_retry (void *cls)
|
|||||||
* coming from the exchange, namely the fresh coins.
|
* coming from the exchange, namely the fresh coins.
|
||||||
*
|
*
|
||||||
* @param cls closure, a `struct RefreshRevealState`
|
* @param cls closure, a `struct RefreshRevealState`
|
||||||
* @param hr HTTP response details
|
* @param rr HTTP response details
|
||||||
* @param num_coins number of fresh coins created, length of the
|
|
||||||
* @a sigs and @a coin_privs arrays, 0 if the operation
|
|
||||||
* failed.
|
|
||||||
* @param coin_privs array of @a num_coins private keys for the
|
|
||||||
* coins that were created, NULL on error.
|
|
||||||
* @param psa array of @a num_coins planchet secrets (derived from the transfer secret) for each of the coins
|
|
||||||
* @param sigs array of signature over @a num_coins coins,
|
|
||||||
* NULL on error.
|
|
||||||
*/
|
*/
|
||||||
static void
|
static void
|
||||||
reveal_cb (void *cls,
|
reveal_cb (void *cls,
|
||||||
@ -594,16 +586,7 @@ do_link_retry (void *cls)
|
|||||||
* withdrawn by the "refresh reveal" CMD.
|
* withdrawn by the "refresh reveal" CMD.
|
||||||
*
|
*
|
||||||
* @param cls closure.
|
* @param cls closure.
|
||||||
* @param hr HTTP response details
|
* @param lr HTTP response details
|
||||||
* @param num_coins number of fresh coins created, length of the
|
|
||||||
* @a sigs and @a coin_privs arrays, 0 if the operation
|
|
||||||
* failed.
|
|
||||||
* @param coin_privs array of @a num_coins private keys for the
|
|
||||||
* coins that were created, NULL on error.
|
|
||||||
* @param sigs array of signature over @a num_coins coins, NULL on
|
|
||||||
* error.
|
|
||||||
* @param pubs array of public keys for the @a sigs,
|
|
||||||
* NULL on error.
|
|
||||||
*/
|
*/
|
||||||
static void
|
static void
|
||||||
link_cb (void *cls,
|
link_cb (void *cls,
|
||||||
|
@ -17,7 +17,7 @@
|
|||||||
<http://www.gnu.org/licenses/>
|
<http://www.gnu.org/licenses/>
|
||||||
*/
|
*/
|
||||||
/**
|
/**
|
||||||
* @file testing/testing_api_cmd_history.c
|
* @file testing/testing_api_cmd_reserve_history.c
|
||||||
* @brief Implement the /reserve/history test command.
|
* @brief Implement the /reserve/history test command.
|
||||||
* @author Marcello Stanisci
|
* @author Marcello Stanisci
|
||||||
*/
|
*/
|
||||||
|
@ -103,7 +103,7 @@ struct ReservePurseState
|
|||||||
json_t *contract_terms;
|
json_t *contract_terms;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Refernece to the reserve, or NULL (!).
|
* Reference to the reserve, or NULL (!).
|
||||||
*/
|
*/
|
||||||
const char *reserve_ref;
|
const char *reserve_ref;
|
||||||
|
|
||||||
|
@ -17,7 +17,7 @@
|
|||||||
<http://www.gnu.org/licenses/>
|
<http://www.gnu.org/licenses/>
|
||||||
*/
|
*/
|
||||||
/**
|
/**
|
||||||
* @file testing/testing_api_cmd_status.c
|
* @file testing/testing_api_cmd_reserve_status.c
|
||||||
* @brief Implement the /reserve/$RID/status test command.
|
* @brief Implement the /reserve/$RID/status test command.
|
||||||
* @author Marcello Stanisci
|
* @author Marcello Stanisci
|
||||||
*/
|
*/
|
||||||
|
@ -46,12 +46,6 @@ struct TALER_DepositTrackPS
|
|||||||
*/
|
*/
|
||||||
struct TALER_MerchantWireHashP h_wire GNUNET_PACKED;
|
struct TALER_MerchantWireHashP h_wire GNUNET_PACKED;
|
||||||
|
|
||||||
/**
|
|
||||||
* The Merchant's public key. The deposit inquiry request is to be
|
|
||||||
* signed by the corresponding private key (using EdDSA).
|
|
||||||
*/
|
|
||||||
struct TALER_MerchantPublicKeyP merchant;
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* The coin's public key. This is the value that must have been
|
* The coin's public key. This is the value that must have been
|
||||||
* signed (blindly) by the Exchange.
|
* signed (blindly) by the Exchange.
|
||||||
@ -68,7 +62,6 @@ TALER_merchant_deposit_sign (
|
|||||||
const struct TALER_PrivateContractHashP *h_contract_terms,
|
const struct TALER_PrivateContractHashP *h_contract_terms,
|
||||||
const struct TALER_MerchantWireHashP *h_wire,
|
const struct TALER_MerchantWireHashP *h_wire,
|
||||||
const struct TALER_CoinSpendPublicKeyP *coin_pub,
|
const struct TALER_CoinSpendPublicKeyP *coin_pub,
|
||||||
const struct TALER_MerchantPublicKeyP *merchant_pub,
|
|
||||||
const struct TALER_MerchantPrivateKeyP *merchant_priv,
|
const struct TALER_MerchantPrivateKeyP *merchant_priv,
|
||||||
struct TALER_MerchantSignatureP *merchant_sig)
|
struct TALER_MerchantSignatureP *merchant_sig)
|
||||||
{
|
{
|
||||||
@ -77,9 +70,9 @@ TALER_merchant_deposit_sign (
|
|||||||
.purpose.size = htonl (sizeof (dtp)),
|
.purpose.size = htonl (sizeof (dtp)),
|
||||||
.h_contract_terms = *h_contract_terms,
|
.h_contract_terms = *h_contract_terms,
|
||||||
.h_wire = *h_wire,
|
.h_wire = *h_wire,
|
||||||
.merchant = *merchant_pub,
|
|
||||||
.coin_pub = *coin_pub
|
.coin_pub = *coin_pub
|
||||||
};
|
};
|
||||||
|
|
||||||
GNUNET_CRYPTO_eddsa_sign (&merchant_priv->eddsa_priv,
|
GNUNET_CRYPTO_eddsa_sign (&merchant_priv->eddsa_priv,
|
||||||
&dtp,
|
&dtp,
|
||||||
&merchant_sig->eddsa_sig);
|
&merchant_sig->eddsa_sig);
|
||||||
@ -97,7 +90,6 @@ TALER_merchant_deposit_verify (
|
|||||||
struct TALER_DepositTrackPS tps = {
|
struct TALER_DepositTrackPS tps = {
|
||||||
.purpose.size = htonl (sizeof (tps)),
|
.purpose.size = htonl (sizeof (tps)),
|
||||||
.purpose.purpose = htonl (TALER_SIGNATURE_MERCHANT_TRACK_TRANSACTION),
|
.purpose.purpose = htonl (TALER_SIGNATURE_MERCHANT_TRACK_TRANSACTION),
|
||||||
.merchant = *merchant,
|
|
||||||
.coin_pub = *coin_pub,
|
.coin_pub = *coin_pub,
|
||||||
.h_contract_terms = *h_contract_terms,
|
.h_contract_terms = *h_contract_terms,
|
||||||
.h_wire = *h_wire
|
.h_wire = *h_wire
|
||||||
@ -107,7 +99,7 @@ TALER_merchant_deposit_verify (
|
|||||||
GNUNET_CRYPTO_eddsa_verify (TALER_SIGNATURE_MERCHANT_TRACK_TRANSACTION,
|
GNUNET_CRYPTO_eddsa_verify (TALER_SIGNATURE_MERCHANT_TRACK_TRANSACTION,
|
||||||
&tps,
|
&tps,
|
||||||
&merchant_sig->eddsa_sig,
|
&merchant_sig->eddsa_sig,
|
||||||
&tps.merchant.eddsa_pub);
|
&merchant->eddsa_pub);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@ -162,7 +162,7 @@ generate (
|
|||||||
sizeof(seed));
|
sizeof(seed));
|
||||||
|
|
||||||
json_object_set (j_top,
|
json_object_set (j_top,
|
||||||
"commited_age",
|
"committed_age",
|
||||||
json_integer (age));
|
json_integer (age));
|
||||||
|
|
||||||
ret = TALER_age_restriction_commit (mask,
|
ret = TALER_age_restriction_commit (mask,
|
||||||
@ -214,7 +214,7 @@ generate (
|
|||||||
"not required: age group is 0");
|
"not required: age group is 0");
|
||||||
else if (min_group > age_group)
|
else if (min_group > age_group)
|
||||||
j_reason = json_string (
|
j_reason = json_string (
|
||||||
"not applicable: commited age too small");
|
"not applicable: committed age too small");
|
||||||
else
|
else
|
||||||
j_reason = GNUNET_JSON_PACK (
|
j_reason = GNUNET_JSON_PACK (
|
||||||
GNUNET_JSON_pack_data_auto (NULL, &at));
|
GNUNET_JSON_pack_data_auto (NULL, &at));
|
||||||
|
@ -640,7 +640,7 @@ struct TALER_ReserveHistoryRequestPS
|
|||||||
struct GNUNET_CRYPTO_EccSignaturePurpose purpose;
|
struct GNUNET_CRYPTO_EccSignaturePurpose purpose;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* When did the wallet make the requst.
|
* When did the wallet make the request.
|
||||||
*/
|
*/
|
||||||
struct GNUNET_TIME_TimestampNBO request_timestamp;
|
struct GNUNET_TIME_TimestampNBO request_timestamp;
|
||||||
|
|
||||||
@ -708,7 +708,7 @@ struct TALER_ReserveStatusRequestPS
|
|||||||
struct GNUNET_CRYPTO_EccSignaturePurpose purpose;
|
struct GNUNET_CRYPTO_EccSignaturePurpose purpose;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* When did the wallet make the requst.
|
* When did the wallet make the request.
|
||||||
*/
|
*/
|
||||||
struct GNUNET_TIME_TimestampNBO request_timestamp;
|
struct GNUNET_TIME_TimestampNBO request_timestamp;
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user