privatize more signature structs, simplify code
This commit is contained in:
parent
eadee56dcf
commit
747ae5ef09
@ -68,7 +68,7 @@ struct GNUNET_TIME_Absolute start_time;
|
|||||||
|
|
||||||
/**
|
/**
|
||||||
* Results about denominations, cached per-transaction, maps denomination pub hashes
|
* Results about denominations, cached per-transaction, maps denomination pub hashes
|
||||||
* to `struct TALER_DenominationKeyValidityPS`.
|
* to `const struct TALER_EXCHANGEDB_DenominationKeyInformation`.
|
||||||
*/
|
*/
|
||||||
static struct GNUNET_CONTAINER_MultiHashMap *denominations;
|
static struct GNUNET_CONTAINER_MultiHashMap *denominations;
|
||||||
|
|
||||||
@ -114,16 +114,14 @@ TALER_ARL_report (json_t *array,
|
|||||||
*
|
*
|
||||||
* @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
|
||||||
add_denomination (
|
add_denomination (
|
||||||
void *cls,
|
void *cls,
|
||||||
const struct TALER_DenominationPublicKey *denom_pub,
|
const struct TALER_DenominationPublicKey *denom_pub,
|
||||||
const struct TALER_EXCHANGEDB_DenominationKeyInformationP *validity)
|
const struct TALER_EXCHANGEDB_DenominationKeyInformation *issue)
|
||||||
{
|
{
|
||||||
const struct TALER_DenominationKeyValidityPS *issue = &validity->properties;
|
|
||||||
|
|
||||||
(void) cls;
|
(void) cls;
|
||||||
(void) denom_pub;
|
(void) denom_pub;
|
||||||
if (NULL !=
|
if (NULL !=
|
||||||
@ -132,35 +130,26 @@ add_denomination (
|
|||||||
return; /* value already known */
|
return; /* value already known */
|
||||||
#if GNUNET_EXTRA_LOGGING >= 1
|
#if GNUNET_EXTRA_LOGGING >= 1
|
||||||
{
|
{
|
||||||
struct TALER_Amount value;
|
|
||||||
|
|
||||||
TALER_amount_ntoh (&value,
|
|
||||||
&issue->value);
|
|
||||||
GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
|
GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
|
||||||
"Tracking denomination `%s' (%s)\n",
|
"Tracking denomination `%s' (%s)\n",
|
||||||
GNUNET_h2s (&issue->denom_hash.hash),
|
GNUNET_h2s (&issue->denom_hash.hash),
|
||||||
TALER_amount2s (&value));
|
TALER_amount2s (&issue->value));
|
||||||
TALER_amount_ntoh (&value,
|
|
||||||
&issue->fees.withdraw);
|
|
||||||
GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
|
GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
|
||||||
"Withdraw fee is %s\n",
|
"Withdraw fee is %s\n",
|
||||||
TALER_amount2s (&value));
|
TALER_amount2s (&issue->fees.withdraw));
|
||||||
GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
|
GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
|
||||||
"Start time is %s\n",
|
"Start time is %s\n",
|
||||||
GNUNET_TIME_timestamp2s
|
GNUNET_TIME_timestamp2s (issue->start));
|
||||||
(GNUNET_TIME_timestamp_ntoh (issue->start)));
|
|
||||||
GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
|
GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
|
||||||
"Expire deposit time is %s\n",
|
"Expire deposit time is %s\n",
|
||||||
GNUNET_TIME_timestamp2s
|
GNUNET_TIME_timestamp2s (issue->expire_deposit));
|
||||||
(GNUNET_TIME_timestamp_ntoh (issue->expire_deposit)));
|
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
{
|
{
|
||||||
struct TALER_DenominationKeyValidityPS *i;
|
struct TALER_EXCHANGEDB_DenominationKeyInformation *i;
|
||||||
|
|
||||||
i = GNUNET_new (struct TALER_DenominationKeyValidityPS);
|
i = GNUNET_new (struct TALER_EXCHANGEDB_DenominationKeyInformation);
|
||||||
*i = *issue;
|
*i = *issue;
|
||||||
i->master = TALER_ARL_master_pub;
|
|
||||||
GNUNET_assert (GNUNET_OK ==
|
GNUNET_assert (GNUNET_OK ==
|
||||||
GNUNET_CONTAINER_multihashmap_put (denominations,
|
GNUNET_CONTAINER_multihashmap_put (denominations,
|
||||||
&issue->denom_hash.hash,
|
&issue->denom_hash.hash,
|
||||||
@ -173,7 +162,7 @@ add_denomination (
|
|||||||
enum GNUNET_DB_QueryStatus
|
enum GNUNET_DB_QueryStatus
|
||||||
TALER_ARL_get_denomination_info_by_hash (
|
TALER_ARL_get_denomination_info_by_hash (
|
||||||
const struct TALER_DenominationHashP *dh,
|
const struct TALER_DenominationHashP *dh,
|
||||||
const struct TALER_DenominationKeyValidityPS **issue)
|
const struct TALER_EXCHANGEDB_DenominationKeyInformation **issue)
|
||||||
{
|
{
|
||||||
enum GNUNET_DB_QueryStatus qs;
|
enum GNUNET_DB_QueryStatus qs;
|
||||||
|
|
||||||
@ -192,7 +181,7 @@ TALER_ARL_get_denomination_info_by_hash (
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
{
|
{
|
||||||
const struct TALER_DenominationKeyValidityPS *i;
|
const struct TALER_EXCHANGEDB_DenominationKeyInformation *i;
|
||||||
|
|
||||||
i = GNUNET_CONTAINER_multihashmap_get (denominations,
|
i = GNUNET_CONTAINER_multihashmap_get (denominations,
|
||||||
&dh->hash);
|
&dh->hash);
|
||||||
@ -205,7 +194,7 @@ TALER_ARL_get_denomination_info_by_hash (
|
|||||||
}
|
}
|
||||||
/* maybe database changed since we last iterated, give it one more shot */
|
/* maybe database changed since we last iterated, give it one more shot */
|
||||||
{
|
{
|
||||||
struct TALER_EXCHANGEDB_DenominationKeyInformationP issue;
|
struct TALER_EXCHANGEDB_DenominationKeyInformation issue;
|
||||||
|
|
||||||
qs = TALER_ARL_edb->get_denomination_info (TALER_ARL_edb->cls,
|
qs = TALER_ARL_edb->get_denomination_info (TALER_ARL_edb->cls,
|
||||||
dh,
|
dh,
|
||||||
@ -224,7 +213,7 @@ TALER_ARL_get_denomination_info_by_hash (
|
|||||||
&issue);
|
&issue);
|
||||||
}
|
}
|
||||||
{
|
{
|
||||||
const struct TALER_DenominationKeyValidityPS *i;
|
const struct TALER_EXCHANGEDB_DenominationKeyInformation *i;
|
||||||
|
|
||||||
i = GNUNET_CONTAINER_multihashmap_get (denominations,
|
i = GNUNET_CONTAINER_multihashmap_get (denominations,
|
||||||
&dh->hash);
|
&dh->hash);
|
||||||
@ -246,7 +235,7 @@ TALER_ARL_get_denomination_info_by_hash (
|
|||||||
enum GNUNET_DB_QueryStatus
|
enum GNUNET_DB_QueryStatus
|
||||||
TALER_ARL_get_denomination_info (
|
TALER_ARL_get_denomination_info (
|
||||||
const struct TALER_DenominationPublicKey *denom_pub,
|
const struct TALER_DenominationPublicKey *denom_pub,
|
||||||
const struct TALER_DenominationKeyValidityPS **issue,
|
const struct TALER_EXCHANGEDB_DenominationKeyInformation **issue,
|
||||||
struct TALER_DenominationHashP *dh)
|
struct TALER_DenominationHashP *dh)
|
||||||
{
|
{
|
||||||
struct TALER_DenominationHashP hc;
|
struct TALER_DenominationHashP hc;
|
||||||
|
@ -102,7 +102,7 @@ TALER_ARL_report (json_t *array,
|
|||||||
enum GNUNET_DB_QueryStatus
|
enum GNUNET_DB_QueryStatus
|
||||||
TALER_ARL_get_denomination_info_by_hash (
|
TALER_ARL_get_denomination_info_by_hash (
|
||||||
const struct TALER_DenominationHashP *dh,
|
const struct TALER_DenominationHashP *dh,
|
||||||
const struct TALER_DenominationKeyValidityPS **issue);
|
const struct TALER_EXCHANGEDB_DenominationKeyInformation **issue);
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -117,7 +117,7 @@ TALER_ARL_get_denomination_info_by_hash (
|
|||||||
enum GNUNET_DB_QueryStatus
|
enum GNUNET_DB_QueryStatus
|
||||||
TALER_ARL_get_denomination_info (
|
TALER_ARL_get_denomination_info (
|
||||||
const struct TALER_DenominationPublicKey *denom_pub,
|
const struct TALER_DenominationPublicKey *denom_pub,
|
||||||
const struct TALER_DenominationKeyValidityPS **issue,
|
const struct TALER_EXCHANGEDB_DenominationKeyInformation **issue,
|
||||||
struct TALER_DenominationHashP *dh);
|
struct TALER_DenominationHashP *dh);
|
||||||
|
|
||||||
|
|
||||||
|
@ -32,6 +32,50 @@
|
|||||||
#include "taler-auditor-httpd_deposit-confirmation.h"
|
#include "taler-auditor-httpd_deposit-confirmation.h"
|
||||||
|
|
||||||
|
|
||||||
|
GNUNET_NETWORK_STRUCT_BEGIN
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Information about a signing key of the exchange. Signing keys are used
|
||||||
|
* to sign exchange messages other than coins, i.e. to confirm that a
|
||||||
|
* deposit was successful or that a refresh was accepted.
|
||||||
|
*/
|
||||||
|
struct ExchangeSigningKeyDataP
|
||||||
|
{
|
||||||
|
|
||||||
|
/**
|
||||||
|
* When does this signing key begin to be valid?
|
||||||
|
*/
|
||||||
|
struct GNUNET_TIME_TimestampNBO start;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* When does this signing key expire? Note: This is currently when
|
||||||
|
* the Exchange will definitively stop using it. Signatures made with
|
||||||
|
* the key remain valid until @e end. When checking validity periods,
|
||||||
|
* clients should allow for some overlap between keys and tolerate
|
||||||
|
* the use of either key during the overlap time (due to the
|
||||||
|
* possibility of clock skew).
|
||||||
|
*/
|
||||||
|
struct GNUNET_TIME_TimestampNBO expire;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* When do signatures with this signing key become invalid? After
|
||||||
|
* this point, these signatures cannot be used in (legal) disputes
|
||||||
|
* anymore, as the Exchange is then allowed to destroy its side of the
|
||||||
|
* evidence. @e end is expected to be significantly larger than @e
|
||||||
|
* expire (by a year or more).
|
||||||
|
*/
|
||||||
|
struct GNUNET_TIME_TimestampNBO end;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* The public online signing key that the exchange will use
|
||||||
|
* between @e start and @e expire.
|
||||||
|
*/
|
||||||
|
struct TALER_ExchangePublicKeyP signkey_pub;
|
||||||
|
};
|
||||||
|
|
||||||
|
GNUNET_NETWORK_STRUCT_END
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Cache of already verified exchange signing keys. Maps the hash of the
|
* Cache of already verified exchange signing keys. Maps the hash of the
|
||||||
* `struct TALER_ExchangeSigningKeyValidityPS` to the (static) string
|
* `struct TALER_ExchangeSigningKeyValidityPS` to the (static) string
|
||||||
@ -65,9 +109,7 @@ verify_and_execute_deposit_confirmation (
|
|||||||
enum GNUNET_DB_QueryStatus qs;
|
enum GNUNET_DB_QueryStatus qs;
|
||||||
struct GNUNET_HashCode h;
|
struct GNUNET_HashCode h;
|
||||||
const char *cached;
|
const char *cached;
|
||||||
struct TALER_ExchangeSigningKeyValidityPS skv = {
|
struct ExchangeSigningKeyDataP skv = {
|
||||||
.purpose.purpose = htonl (TALER_SIGNATURE_MASTER_SIGNING_KEY_VALIDITY),
|
|
||||||
.purpose.size = htonl (sizeof (struct TALER_ExchangeSigningKeyValidityPS)),
|
|
||||||
.start = GNUNET_TIME_timestamp_hton (es->ep_start),
|
.start = GNUNET_TIME_timestamp_hton (es->ep_start),
|
||||||
.expire = GNUNET_TIME_timestamp_hton (es->ep_expire),
|
.expire = GNUNET_TIME_timestamp_hton (es->ep_expire),
|
||||||
.end = GNUNET_TIME_timestamp_hton (es->ep_end),
|
.end = GNUNET_TIME_timestamp_hton (es->ep_end),
|
||||||
|
@ -390,7 +390,7 @@ check_transaction_history_for_deposit (
|
|||||||
const struct TALER_CoinSpendPublicKeyP *coin_pub,
|
const struct TALER_CoinSpendPublicKeyP *coin_pub,
|
||||||
const struct TALER_PrivateContractHashP *h_contract_terms,
|
const struct TALER_PrivateContractHashP *h_contract_terms,
|
||||||
const struct TALER_MerchantPublicKeyP *merchant_pub,
|
const struct TALER_MerchantPublicKeyP *merchant_pub,
|
||||||
const struct TALER_DenominationKeyValidityPS *issue,
|
const struct TALER_EXCHANGEDB_DenominationKeyInformation *issue,
|
||||||
const struct TALER_EXCHANGEDB_TransactionList *tl_head,
|
const struct TALER_EXCHANGEDB_TransactionList *tl_head,
|
||||||
struct TALER_Amount *merchant_gain,
|
struct TALER_Amount *merchant_gain,
|
||||||
struct TALER_Amount *deposit_gain)
|
struct TALER_Amount *deposit_gain)
|
||||||
@ -461,24 +461,17 @@ check_transaction_history_for_deposit (
|
|||||||
deposit_fee = fee_claimed; /* We had a deposit, remember the fee, we may need it */
|
deposit_fee = fee_claimed; /* We had a deposit, remember the fee, we may need it */
|
||||||
}
|
}
|
||||||
/* Check that the fees given in the transaction list and in dki match */
|
/* Check that the fees given in the transaction list and in dki match */
|
||||||
{
|
|
||||||
struct TALER_Amount fee_expected;
|
|
||||||
|
|
||||||
/* Fee according to denomination data of auditor */
|
|
||||||
TALER_amount_ntoh (&fee_expected,
|
|
||||||
&issue->fees.deposit);
|
|
||||||
if (0 !=
|
if (0 !=
|
||||||
TALER_amount_cmp (&fee_expected,
|
TALER_amount_cmp (&issue->fees.deposit,
|
||||||
fee_claimed))
|
fee_claimed))
|
||||||
{
|
{
|
||||||
/* Disagreement in fee structure between auditor and exchange DB! */
|
/* Disagreement in fee structure between auditor and exchange DB! */
|
||||||
report_amount_arithmetic_inconsistency ("deposit fee",
|
report_amount_arithmetic_inconsistency ("deposit fee",
|
||||||
0,
|
0,
|
||||||
fee_claimed,
|
fee_claimed,
|
||||||
&fee_expected,
|
&issue->fees.deposit,
|
||||||
1);
|
1);
|
||||||
}
|
}
|
||||||
}
|
|
||||||
break;
|
break;
|
||||||
case TALER_EXCHANGEDB_TT_MELT:
|
case TALER_EXCHANGEDB_TT_MELT:
|
||||||
amount_with_fee = &tl->details.melt->amount_with_fee;
|
amount_with_fee = &tl->details.melt->amount_with_fee;
|
||||||
@ -487,23 +480,17 @@ check_transaction_history_for_deposit (
|
|||||||
&expenditures,
|
&expenditures,
|
||||||
amount_with_fee);
|
amount_with_fee);
|
||||||
/* Check that the fees given in the transaction list and in dki match */
|
/* Check that the fees given in the transaction list and in dki match */
|
||||||
{
|
|
||||||
struct TALER_Amount fee_expected;
|
|
||||||
|
|
||||||
TALER_amount_ntoh (&fee_expected,
|
|
||||||
&issue->fees.refresh);
|
|
||||||
if (0 !=
|
if (0 !=
|
||||||
TALER_amount_cmp (&fee_expected,
|
TALER_amount_cmp (&issue->fees.refresh,
|
||||||
fee_claimed))
|
fee_claimed))
|
||||||
{
|
{
|
||||||
/* Disagreement in fee structure between exchange and auditor */
|
/* Disagreement in fee structure between exchange and auditor */
|
||||||
report_amount_arithmetic_inconsistency ("melt fee",
|
report_amount_arithmetic_inconsistency ("melt fee",
|
||||||
0,
|
0,
|
||||||
fee_claimed,
|
fee_claimed,
|
||||||
&fee_expected,
|
&issue->fees.refresh,
|
||||||
1);
|
1);
|
||||||
}
|
}
|
||||||
}
|
|
||||||
break;
|
break;
|
||||||
case TALER_EXCHANGEDB_TT_REFUND:
|
case TALER_EXCHANGEDB_TT_REFUND:
|
||||||
amount_with_fee = &tl->details.refund->refund_amount;
|
amount_with_fee = &tl->details.refund->refund_amount;
|
||||||
@ -531,23 +518,17 @@ check_transaction_history_for_deposit (
|
|||||||
refund_deposit_fee = GNUNET_YES;
|
refund_deposit_fee = GNUNET_YES;
|
||||||
}
|
}
|
||||||
/* Check that the fees given in the transaction list and in dki match */
|
/* Check that the fees given in the transaction list and in dki match */
|
||||||
{
|
|
||||||
struct TALER_Amount fee_expected;
|
|
||||||
|
|
||||||
TALER_amount_ntoh (&fee_expected,
|
|
||||||
&issue->fees.refund);
|
|
||||||
if (0 !=
|
if (0 !=
|
||||||
TALER_amount_cmp (&fee_expected,
|
TALER_amount_cmp (&issue->fees.refund,
|
||||||
fee_claimed))
|
fee_claimed))
|
||||||
{
|
{
|
||||||
/* Disagreement in fee structure between exchange and auditor! */
|
/* Disagreement in fee structure between exchange and auditor! */
|
||||||
report_amount_arithmetic_inconsistency ("refund fee",
|
report_amount_arithmetic_inconsistency ("refund fee",
|
||||||
0,
|
0,
|
||||||
fee_claimed,
|
fee_claimed,
|
||||||
&fee_expected,
|
&issue->fees.refund,
|
||||||
1);
|
1);
|
||||||
}
|
}
|
||||||
}
|
|
||||||
break;
|
break;
|
||||||
case TALER_EXCHANGEDB_TT_OLD_COIN_RECOUP:
|
case TALER_EXCHANGEDB_TT_OLD_COIN_RECOUP:
|
||||||
amount_with_fee = &tl->details.old_coin_recoup->value;
|
amount_with_fee = &tl->details.old_coin_recoup->value;
|
||||||
@ -641,18 +622,14 @@ check_transaction_history_for_deposit (
|
|||||||
else
|
else
|
||||||
{
|
{
|
||||||
/* Now check that 'spent' is less or equal than the total coin value */
|
/* Now check that 'spent' is less or equal than the total coin value */
|
||||||
struct TALER_Amount value;
|
|
||||||
|
|
||||||
TALER_amount_ntoh (&value,
|
|
||||||
&issue->value);
|
|
||||||
if (1 == TALER_amount_cmp (&spent,
|
if (1 == TALER_amount_cmp (&spent,
|
||||||
&value))
|
&issue->value))
|
||||||
{
|
{
|
||||||
/* spent > value */
|
/* spent > value */
|
||||||
report_coin_arithmetic_inconsistency ("spend",
|
report_coin_arithmetic_inconsistency ("spend",
|
||||||
coin_pub,
|
coin_pub,
|
||||||
&spent,
|
&spent,
|
||||||
&value,
|
&issue->value,
|
||||||
-1);
|
-1);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -703,7 +680,7 @@ wire_transfer_information_cb (
|
|||||||
const struct TALER_Amount *deposit_fee)
|
const struct TALER_Amount *deposit_fee)
|
||||||
{
|
{
|
||||||
struct WireCheckContext *wcc = cls;
|
struct WireCheckContext *wcc = cls;
|
||||||
const struct TALER_DenominationKeyValidityPS *issue;
|
const struct TALER_EXCHANGEDB_DenominationKeyInformation *issue;
|
||||||
struct TALER_Amount computed_value;
|
struct TALER_Amount computed_value;
|
||||||
struct TALER_Amount total_deposit_without_refunds;
|
struct TALER_Amount total_deposit_without_refunds;
|
||||||
struct TALER_EXCHANGEDB_TransactionList *tl;
|
struct TALER_EXCHANGEDB_TransactionList *tl;
|
||||||
|
@ -276,7 +276,7 @@ get_cached_history (const struct TALER_CoinSpendPublicKeyP *coin_pub)
|
|||||||
*/
|
*/
|
||||||
static void
|
static void
|
||||||
report_emergency_by_amount (
|
report_emergency_by_amount (
|
||||||
const struct TALER_DenominationKeyValidityPS *issue,
|
const struct TALER_EXCHANGEDB_DenominationKeyInformation *issue,
|
||||||
const struct TALER_Amount *risk,
|
const struct TALER_Amount *risk,
|
||||||
const struct TALER_Amount *loss)
|
const struct TALER_Amount *loss)
|
||||||
{
|
{
|
||||||
@ -293,11 +293,11 @@ report_emergency_by_amount (
|
|||||||
risk),
|
risk),
|
||||||
TALER_JSON_pack_amount ("denom_loss",
|
TALER_JSON_pack_amount ("denom_loss",
|
||||||
loss),
|
loss),
|
||||||
TALER_JSON_pack_time_abs_nbo_human ("start",
|
TALER_JSON_pack_time_abs_human ("start",
|
||||||
issue->start.abs_time_nbo),
|
issue->start.abs_time),
|
||||||
TALER_JSON_pack_time_abs_nbo_human ("deposit_end",
|
TALER_JSON_pack_time_abs_human ("deposit_end",
|
||||||
issue->expire_deposit.abs_time_nbo),
|
issue->expire_deposit.abs_time),
|
||||||
TALER_JSON_pack_amount_nbo ("value",
|
TALER_JSON_pack_amount ("value",
|
||||||
&issue->value)));
|
&issue->value)));
|
||||||
TALER_ARL_amount_add (&reported_emergency_risk_by_amount,
|
TALER_ARL_amount_add (&reported_emergency_risk_by_amount,
|
||||||
&reported_emergency_risk_by_amount,
|
&reported_emergency_risk_by_amount,
|
||||||
@ -324,13 +324,11 @@ report_emergency_by_amount (
|
|||||||
*/
|
*/
|
||||||
static void
|
static void
|
||||||
report_emergency_by_count (
|
report_emergency_by_count (
|
||||||
const struct TALER_DenominationKeyValidityPS *issue,
|
const struct TALER_EXCHANGEDB_DenominationKeyInformation *issue,
|
||||||
uint64_t num_issued,
|
uint64_t num_issued,
|
||||||
uint64_t num_known,
|
uint64_t num_known,
|
||||||
const struct TALER_Amount *risk)
|
const struct TALER_Amount *risk)
|
||||||
{
|
{
|
||||||
struct TALER_Amount denom_value;
|
|
||||||
|
|
||||||
TALER_ARL_report (
|
TALER_ARL_report (
|
||||||
report_emergencies_by_count,
|
report_emergencies_by_count,
|
||||||
GNUNET_JSON_PACK (
|
GNUNET_JSON_PACK (
|
||||||
@ -342,21 +340,19 @@ report_emergency_by_count (
|
|||||||
num_known),
|
num_known),
|
||||||
TALER_JSON_pack_amount ("denom_risk",
|
TALER_JSON_pack_amount ("denom_risk",
|
||||||
risk),
|
risk),
|
||||||
TALER_JSON_pack_time_abs_nbo_human ("start",
|
TALER_JSON_pack_time_abs_human ("start",
|
||||||
issue->start.abs_time_nbo),
|
issue->start.abs_time),
|
||||||
TALER_JSON_pack_time_abs_nbo_human ("deposit_end",
|
TALER_JSON_pack_time_abs_human ("deposit_end",
|
||||||
issue->expire_deposit.abs_time_nbo),
|
issue->expire_deposit.abs_time),
|
||||||
TALER_JSON_pack_amount_nbo ("value",
|
TALER_JSON_pack_amount ("value",
|
||||||
&issue->value)));
|
&issue->value)));
|
||||||
TALER_ARL_amount_add (&reported_emergency_risk_by_count,
|
TALER_ARL_amount_add (&reported_emergency_risk_by_count,
|
||||||
&reported_emergency_risk_by_count,
|
&reported_emergency_risk_by_count,
|
||||||
risk);
|
risk);
|
||||||
TALER_amount_ntoh (&denom_value,
|
|
||||||
&issue->value);
|
|
||||||
for (uint64_t i = num_issued; i<num_known; i++)
|
for (uint64_t i = num_issued; i<num_known; i++)
|
||||||
TALER_ARL_amount_add (&reported_emergency_loss_by_count,
|
TALER_ARL_amount_add (&reported_emergency_loss_by_count,
|
||||||
&reported_emergency_loss_by_count,
|
&reported_emergency_loss_by_count,
|
||||||
&denom_value);
|
&issue->value);
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -624,7 +620,7 @@ struct DenominationSummary
|
|||||||
/**
|
/**
|
||||||
* Denomination key information for this denomination.
|
* Denomination key information for this denomination.
|
||||||
*/
|
*/
|
||||||
const struct TALER_DenominationKeyValidityPS *issue;
|
const struct TALER_EXCHANGEDB_DenominationKeyInformation *issue;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* #GNUNET_YES if this record already existed in the DB.
|
* #GNUNET_YES if this record already existed in the DB.
|
||||||
@ -759,7 +755,8 @@ init_denomination (const struct TALER_DenominationHashP *denom_hash,
|
|||||||
*/
|
*/
|
||||||
static struct DenominationSummary *
|
static struct DenominationSummary *
|
||||||
get_denomination_summary (struct CoinContext *cc,
|
get_denomination_summary (struct CoinContext *cc,
|
||||||
const struct TALER_DenominationKeyValidityPS *issue,
|
const struct
|
||||||
|
TALER_EXCHANGEDB_DenominationKeyInformation *issue,
|
||||||
const struct TALER_DenominationHashP *dh)
|
const struct TALER_DenominationHashP *dh)
|
||||||
{
|
{
|
||||||
struct DenominationSummary *ds;
|
struct DenominationSummary *ds;
|
||||||
@ -806,14 +803,14 @@ sync_denomination (void *cls,
|
|||||||
.hash = *denom_hash
|
.hash = *denom_hash
|
||||||
};
|
};
|
||||||
struct DenominationSummary *ds = value;
|
struct DenominationSummary *ds = value;
|
||||||
const struct TALER_DenominationKeyValidityPS *issue = ds->issue;
|
const struct TALER_EXCHANGEDB_DenominationKeyInformation *issue = ds->issue;
|
||||||
struct GNUNET_TIME_Absolute now;
|
struct GNUNET_TIME_Absolute now;
|
||||||
struct GNUNET_TIME_Timestamp expire_deposit;
|
struct GNUNET_TIME_Timestamp expire_deposit;
|
||||||
struct GNUNET_TIME_Absolute expire_deposit_grace;
|
struct GNUNET_TIME_Absolute expire_deposit_grace;
|
||||||
enum GNUNET_DB_QueryStatus qs;
|
enum GNUNET_DB_QueryStatus qs;
|
||||||
|
|
||||||
now = GNUNET_TIME_absolute_get ();
|
now = GNUNET_TIME_absolute_get ();
|
||||||
expire_deposit = GNUNET_TIME_timestamp_ntoh (issue->expire_deposit);
|
expire_deposit = issue->expire_deposit;
|
||||||
/* add day grace period to deal with clocks not being perfectly synchronized */
|
/* add day grace period to deal with clocks not being perfectly synchronized */
|
||||||
expire_deposit_grace = GNUNET_TIME_absolute_add (expire_deposit.abs_time,
|
expire_deposit_grace = GNUNET_TIME_absolute_add (expire_deposit.abs_time,
|
||||||
DEPOSIT_GRACE_PERIOD);
|
DEPOSIT_GRACE_PERIOD);
|
||||||
@ -973,8 +970,7 @@ withdraw_cb (void *cls,
|
|||||||
struct CoinContext *cc = cls;
|
struct CoinContext *cc = cls;
|
||||||
struct DenominationSummary *ds;
|
struct DenominationSummary *ds;
|
||||||
struct TALER_DenominationHashP dh;
|
struct TALER_DenominationHashP dh;
|
||||||
const struct TALER_DenominationKeyValidityPS *issue;
|
const struct TALER_EXCHANGEDB_DenominationKeyInformation *issue;
|
||||||
struct TALER_Amount value;
|
|
||||||
enum GNUNET_DB_QueryStatus qs;
|
enum GNUNET_DB_QueryStatus qs;
|
||||||
|
|
||||||
/* Note: some optimization potential here: lots of fields we
|
/* Note: some optimization potential here: lots of fields we
|
||||||
@ -1016,29 +1012,27 @@ withdraw_cb (void *cls,
|
|||||||
GNUNET_break (GNUNET_DB_STATUS_SOFT_ERROR == cc->qs);
|
GNUNET_break (GNUNET_DB_STATUS_SOFT_ERROR == cc->qs);
|
||||||
return GNUNET_SYSERR;
|
return GNUNET_SYSERR;
|
||||||
}
|
}
|
||||||
TALER_amount_ntoh (&value,
|
|
||||||
&issue->value);
|
|
||||||
GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
|
GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
|
||||||
"Issued coin in denomination `%s' of total value %s\n",
|
"Issued coin in denomination `%s' of total value %s\n",
|
||||||
GNUNET_h2s (&dh.hash),
|
GNUNET_h2s (&dh.hash),
|
||||||
TALER_amount2s (&value));
|
TALER_amount2s (&issue->value));
|
||||||
ds->num_issued++;
|
ds->num_issued++;
|
||||||
TALER_ARL_amount_add (&ds->denom_balance,
|
TALER_ARL_amount_add (&ds->denom_balance,
|
||||||
&ds->denom_balance,
|
&ds->denom_balance,
|
||||||
&value);
|
&issue->value);
|
||||||
GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
|
GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
|
||||||
"New balance of denomination `%s' is %s\n",
|
"New balance of denomination `%s' is %s\n",
|
||||||
GNUNET_h2s (&dh.hash),
|
GNUNET_h2s (&dh.hash),
|
||||||
TALER_amount2s (&ds->denom_balance));
|
TALER_amount2s (&ds->denom_balance));
|
||||||
TALER_ARL_amount_add (&total_escrow_balance,
|
TALER_ARL_amount_add (&total_escrow_balance,
|
||||||
&total_escrow_balance,
|
&total_escrow_balance,
|
||||||
&value);
|
&issue->value);
|
||||||
TALER_ARL_amount_add (&total_risk,
|
TALER_ARL_amount_add (&total_risk,
|
||||||
&total_risk,
|
&total_risk,
|
||||||
&value);
|
&issue->value);
|
||||||
TALER_ARL_amount_add (&ds->denom_risk,
|
TALER_ARL_amount_add (&ds->denom_risk,
|
||||||
&ds->denom_risk,
|
&ds->denom_risk,
|
||||||
&value);
|
&issue->value);
|
||||||
if (TALER_ARL_do_abort ())
|
if (TALER_ARL_do_abort ())
|
||||||
return GNUNET_SYSERR;
|
return GNUNET_SYSERR;
|
||||||
return GNUNET_OK;
|
return GNUNET_OK;
|
||||||
@ -1054,7 +1048,7 @@ struct RevealContext
|
|||||||
/**
|
/**
|
||||||
* Denomination public data of the new coins.
|
* Denomination public data of the new coins.
|
||||||
*/
|
*/
|
||||||
const struct TALER_DenominationKeyValidityPS **new_issues;
|
const struct TALER_EXCHANGEDB_DenominationKeyInformation **new_issues;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Set to the size of the @a new_issues array.
|
* Set to the size of the @a new_issues array.
|
||||||
@ -1071,7 +1065,7 @@ struct RevealContext
|
|||||||
* #GNUNET_NO if a denomination key was not found
|
* #GNUNET_NO if a denomination key was not found
|
||||||
* #GNUNET_SYSERR if we had a database error.
|
* #GNUNET_SYSERR if we had a database error.
|
||||||
*/
|
*/
|
||||||
int err;
|
enum GNUNET_GenericReturnValue err;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Database error, if @e err is #GNUNET_SYSERR.
|
* Database error, if @e err is #GNUNET_SYSERR.
|
||||||
@ -1097,7 +1091,7 @@ reveal_data_cb (void *cls,
|
|||||||
rctx->num_freshcoins = num_freshcoins;
|
rctx->num_freshcoins = num_freshcoins;
|
||||||
rctx->new_issues = GNUNET_new_array (
|
rctx->new_issues = GNUNET_new_array (
|
||||||
num_freshcoins,
|
num_freshcoins,
|
||||||
const struct TALER_DenominationKeyValidityPS *);
|
const struct TALER_EXCHANGEDB_DenominationKeyInformation *);
|
||||||
|
|
||||||
/* Update outstanding amounts for all new coin's denominations */
|
/* Update outstanding amounts for all new coin's denominations */
|
||||||
for (unsigned int i = 0; i<num_freshcoins; i++)
|
for (unsigned int i = 0; i<num_freshcoins; i++)
|
||||||
@ -1141,7 +1135,8 @@ reveal_data_cb (void *cls,
|
|||||||
*/
|
*/
|
||||||
static enum GNUNET_DB_QueryStatus
|
static enum GNUNET_DB_QueryStatus
|
||||||
check_known_coin (const char *operation,
|
check_known_coin (const char *operation,
|
||||||
const struct TALER_DenominationKeyValidityPS *issue,
|
const struct
|
||||||
|
TALER_EXCHANGEDB_DenominationKeyInformation *issue,
|
||||||
uint64_t rowid,
|
uint64_t rowid,
|
||||||
const struct TALER_CoinSpendPublicKeyP *coin_pub,
|
const struct TALER_CoinSpendPublicKeyP *coin_pub,
|
||||||
const struct TALER_DenominationPublicKey *denom_pub,
|
const struct TALER_DenominationPublicKey *denom_pub,
|
||||||
@ -1152,14 +1147,10 @@ check_known_coin (const char *operation,
|
|||||||
|
|
||||||
if (NULL == get_cached_history (coin_pub))
|
if (NULL == get_cached_history (coin_pub))
|
||||||
{
|
{
|
||||||
struct TALER_Amount value;
|
|
||||||
|
|
||||||
TALER_amount_ntoh (&value,
|
|
||||||
&issue->value);
|
|
||||||
qs = check_coin_history (coin_pub,
|
qs = check_coin_history (coin_pub,
|
||||||
rowid,
|
rowid,
|
||||||
operation,
|
operation,
|
||||||
&value);
|
&issue->value);
|
||||||
if (0 > qs)
|
if (0 > qs)
|
||||||
{
|
{
|
||||||
GNUNET_break (GNUNET_DB_STATUS_SOFT_ERROR == qs);
|
GNUNET_break (GNUNET_DB_STATUS_SOFT_ERROR == qs);
|
||||||
@ -1232,7 +1223,7 @@ refresh_session_cb (void *cls,
|
|||||||
const struct TALER_RefreshCommitmentP *rc)
|
const struct TALER_RefreshCommitmentP *rc)
|
||||||
{
|
{
|
||||||
struct CoinContext *cc = cls;
|
struct CoinContext *cc = cls;
|
||||||
const struct TALER_DenominationKeyValidityPS *issue;
|
const struct TALER_EXCHANGEDB_DenominationKeyInformation *issue;
|
||||||
struct DenominationSummary *dso;
|
struct DenominationSummary *dso;
|
||||||
struct TALER_Amount amount_without_fee;
|
struct TALER_Amount amount_without_fee;
|
||||||
struct TALER_Amount tmp;
|
struct TALER_Amount tmp;
|
||||||
@ -1276,15 +1267,12 @@ refresh_session_cb (void *cls,
|
|||||||
/* verify melt signature */
|
/* verify melt signature */
|
||||||
{
|
{
|
||||||
struct TALER_DenominationHashP h_denom_pub;
|
struct TALER_DenominationHashP h_denom_pub;
|
||||||
struct TALER_Amount fee_refresh;
|
|
||||||
|
|
||||||
TALER_denom_pub_hash (denom_pub,
|
TALER_denom_pub_hash (denom_pub,
|
||||||
&h_denom_pub);
|
&h_denom_pub);
|
||||||
TALER_amount_ntoh (&fee_refresh,
|
|
||||||
&issue->fees.refresh);
|
|
||||||
if (GNUNET_OK !=
|
if (GNUNET_OK !=
|
||||||
TALER_wallet_melt_verify (amount_with_fee,
|
TALER_wallet_melt_verify (amount_with_fee,
|
||||||
&fee_refresh,
|
&issue->fees.refresh,
|
||||||
rc,
|
rc,
|
||||||
&h_denom_pub,
|
&h_denom_pub,
|
||||||
h_age_commitment,
|
h_age_commitment,
|
||||||
@ -1370,39 +1358,30 @@ refresh_session_cb (void *cls,
|
|||||||
&refresh_cost));
|
&refresh_cost));
|
||||||
for (unsigned int i = 0; i<reveal_ctx.num_freshcoins; i++)
|
for (unsigned int i = 0; i<reveal_ctx.num_freshcoins; i++)
|
||||||
{
|
{
|
||||||
|
const struct TALER_EXCHANGEDB_DenominationKeyInformation *ni
|
||||||
|
= reveal_ctx.new_issues[i];
|
||||||
/* update cost of refresh */
|
/* update cost of refresh */
|
||||||
struct TALER_Amount fee;
|
|
||||||
struct TALER_Amount value;
|
|
||||||
|
|
||||||
TALER_amount_ntoh (&fee,
|
|
||||||
&reveal_ctx.new_issues[i]->fees.withdraw);
|
|
||||||
TALER_amount_ntoh (&value,
|
|
||||||
&reveal_ctx.new_issues[i]->value);
|
|
||||||
TALER_ARL_amount_add (&refresh_cost,
|
TALER_ARL_amount_add (&refresh_cost,
|
||||||
&refresh_cost,
|
&refresh_cost,
|
||||||
&fee);
|
&ni->fees.withdraw);
|
||||||
TALER_ARL_amount_add (&refresh_cost,
|
TALER_ARL_amount_add (&refresh_cost,
|
||||||
&refresh_cost,
|
&refresh_cost,
|
||||||
&value);
|
&ni->value);
|
||||||
}
|
}
|
||||||
|
|
||||||
/* compute contribution of old coin */
|
/* compute contribution of old coin */
|
||||||
{
|
|
||||||
struct TALER_Amount melt_fee;
|
|
||||||
|
|
||||||
TALER_amount_ntoh (&melt_fee,
|
|
||||||
&issue->fees.refresh);
|
|
||||||
if (TALER_ARL_SR_POSITIVE !=
|
if (TALER_ARL_SR_POSITIVE !=
|
||||||
TALER_ARL_amount_subtract_neg (&amount_without_fee,
|
TALER_ARL_amount_subtract_neg (&amount_without_fee,
|
||||||
amount_with_fee,
|
amount_with_fee,
|
||||||
&melt_fee))
|
&issue->fees.refresh))
|
||||||
{
|
{
|
||||||
/* Melt fee higher than contribution of melted coin; this makes
|
/* Melt fee higher than contribution of melted coin; this makes
|
||||||
no sense (exchange should never have accepted the operation) */
|
no sense (exchange should never have accepted the operation) */
|
||||||
report_amount_arithmetic_inconsistency ("melt contribution vs. fee",
|
report_amount_arithmetic_inconsistency ("melt contribution vs. fee",
|
||||||
rowid,
|
rowid,
|
||||||
amount_with_fee,
|
amount_with_fee,
|
||||||
&melt_fee,
|
&issue->fees.refresh,
|
||||||
-1);
|
-1);
|
||||||
/* To continue, best assumption is the melted coin contributed
|
/* To continue, best assumption is the melted coin contributed
|
||||||
nothing (=> all withdrawal amounts will be counted as losses) */
|
nothing (=> all withdrawal amounts will be counted as losses) */
|
||||||
@ -1410,7 +1389,6 @@ refresh_session_cb (void *cls,
|
|||||||
TALER_amount_set_zero (TALER_ARL_currency,
|
TALER_amount_set_zero (TALER_ARL_currency,
|
||||||
&amount_without_fee));
|
&amount_without_fee));
|
||||||
}
|
}
|
||||||
}
|
|
||||||
|
|
||||||
/* check old coin covers complete expenses (of withdraw operations) */
|
/* check old coin covers complete expenses (of withdraw operations) */
|
||||||
if (1 == TALER_amount_cmp (&refresh_cost,
|
if (1 == TALER_amount_cmp (&refresh_cost,
|
||||||
@ -1427,12 +1405,13 @@ refresh_session_cb (void *cls,
|
|||||||
/* update outstanding denomination amounts for fresh coins withdrawn */
|
/* update outstanding denomination amounts for fresh coins withdrawn */
|
||||||
for (unsigned int i = 0; i<reveal_ctx.num_freshcoins; i++)
|
for (unsigned int i = 0; i<reveal_ctx.num_freshcoins; i++)
|
||||||
{
|
{
|
||||||
|
const struct TALER_EXCHANGEDB_DenominationKeyInformation *ni
|
||||||
|
= reveal_ctx.new_issues[i];
|
||||||
struct DenominationSummary *dsi;
|
struct DenominationSummary *dsi;
|
||||||
struct TALER_Amount value;
|
|
||||||
|
|
||||||
dsi = get_denomination_summary (cc,
|
dsi = get_denomination_summary (cc,
|
||||||
reveal_ctx.new_issues[i],
|
ni,
|
||||||
&reveal_ctx.new_issues[i]->denom_hash);
|
&ni->denom_hash);
|
||||||
if (NULL == dsi)
|
if (NULL == dsi)
|
||||||
{
|
{
|
||||||
report_row_inconsistency ("refresh_reveal",
|
report_row_inconsistency ("refresh_reveal",
|
||||||
@ -1441,29 +1420,27 @@ refresh_session_cb (void *cls,
|
|||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
TALER_amount_ntoh (&value,
|
|
||||||
&reveal_ctx.new_issues[i]->value);
|
|
||||||
GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
|
GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
|
||||||
"Created fresh coin in denomination `%s' of value %s\n",
|
"Created fresh coin in denomination `%s' of value %s\n",
|
||||||
GNUNET_h2s (&reveal_ctx.new_issues[i]->denom_hash.hash),
|
GNUNET_h2s (&ni->denom_hash.hash),
|
||||||
TALER_amount2s (&value));
|
TALER_amount2s (&ni->value));
|
||||||
dsi->num_issued++;
|
dsi->num_issued++;
|
||||||
TALER_ARL_amount_add (&dsi->denom_balance,
|
TALER_ARL_amount_add (&dsi->denom_balance,
|
||||||
&dsi->denom_balance,
|
&dsi->denom_balance,
|
||||||
&value);
|
&ni->value);
|
||||||
TALER_ARL_amount_add (&dsi->denom_risk,
|
TALER_ARL_amount_add (&dsi->denom_risk,
|
||||||
&dsi->denom_risk,
|
&dsi->denom_risk,
|
||||||
&value);
|
&ni->value);
|
||||||
GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
|
GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
|
||||||
"New balance of denomination `%s' is %s\n",
|
"New balance of denomination `%s' is %s\n",
|
||||||
GNUNET_h2s (&reveal_ctx.new_issues[i]->denom_hash.hash),
|
GNUNET_h2s (&ni->denom_hash.hash),
|
||||||
TALER_amount2s (&dsi->denom_balance));
|
TALER_amount2s (&dsi->denom_balance));
|
||||||
TALER_ARL_amount_add (&total_escrow_balance,
|
TALER_ARL_amount_add (&total_escrow_balance,
|
||||||
&total_escrow_balance,
|
&total_escrow_balance,
|
||||||
&value);
|
&ni->value);
|
||||||
TALER_ARL_amount_add (&total_risk,
|
TALER_ARL_amount_add (&total_risk,
|
||||||
&total_risk,
|
&total_risk,
|
||||||
&value);
|
&ni->value);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
GNUNET_free (reveal_ctx.new_issues);
|
GNUNET_free (reveal_ctx.new_issues);
|
||||||
@ -1524,15 +1501,9 @@ refresh_session_cb (void *cls,
|
|||||||
}
|
}
|
||||||
|
|
||||||
/* update global melt fees */
|
/* update global melt fees */
|
||||||
{
|
|
||||||
struct TALER_Amount rfee;
|
|
||||||
|
|
||||||
TALER_amount_ntoh (&rfee,
|
|
||||||
&issue->fees.refresh);
|
|
||||||
TALER_ARL_amount_add (&total_melt_fee_income,
|
TALER_ARL_amount_add (&total_melt_fee_income,
|
||||||
&total_melt_fee_income,
|
&total_melt_fee_income,
|
||||||
&rfee);
|
&issue->fees.refresh);
|
||||||
}
|
|
||||||
if (TALER_ARL_do_abort ())
|
if (TALER_ARL_do_abort ())
|
||||||
return GNUNET_SYSERR;
|
return GNUNET_SYSERR;
|
||||||
return GNUNET_OK;
|
return GNUNET_OK;
|
||||||
@ -1560,7 +1531,7 @@ deposit_cb (void *cls,
|
|||||||
bool done)
|
bool done)
|
||||||
{
|
{
|
||||||
struct CoinContext *cc = cls;
|
struct CoinContext *cc = cls;
|
||||||
const struct TALER_DenominationKeyValidityPS *issue;
|
const struct TALER_EXCHANGEDB_DenominationKeyInformation *issue;
|
||||||
struct DenominationSummary *ds;
|
struct DenominationSummary *ds;
|
||||||
enum GNUNET_DB_QueryStatus qs;
|
enum GNUNET_DB_QueryStatus qs;
|
||||||
|
|
||||||
@ -1613,21 +1584,18 @@ deposit_cb (void *cls,
|
|||||||
{
|
{
|
||||||
struct TALER_MerchantWireHashP h_wire;
|
struct TALER_MerchantWireHashP h_wire;
|
||||||
struct TALER_DenominationHashP h_denom_pub;
|
struct TALER_DenominationHashP h_denom_pub;
|
||||||
struct TALER_Amount deposit_fee;
|
|
||||||
|
|
||||||
TALER_denom_pub_hash (denom_pub,
|
TALER_denom_pub_hash (denom_pub,
|
||||||
&h_denom_pub);
|
&h_denom_pub);
|
||||||
TALER_merchant_wire_signature_hash (deposit->receiver_wire_account,
|
TALER_merchant_wire_signature_hash (deposit->receiver_wire_account,
|
||||||
&deposit->wire_salt,
|
&deposit->wire_salt,
|
||||||
&h_wire);
|
&h_wire);
|
||||||
TALER_amount_ntoh (&deposit_fee,
|
|
||||||
&issue->fees.deposit);
|
|
||||||
/* NOTE: This is one of the operations we might eventually
|
/* NOTE: This is one of the operations we might eventually
|
||||||
want to do in parallel in the background to improve
|
want to do in parallel in the background to improve
|
||||||
auditor performance! */
|
auditor performance! */
|
||||||
if (GNUNET_OK !=
|
if (GNUNET_OK !=
|
||||||
TALER_wallet_deposit_verify (&deposit->amount_with_fee,
|
TALER_wallet_deposit_verify (&deposit->amount_with_fee,
|
||||||
&deposit_fee,
|
&issue->fees.deposit,
|
||||||
&h_wire,
|
&h_wire,
|
||||||
&deposit->h_contract_terms,
|
&deposit->h_contract_terms,
|
||||||
&deposit->coin.h_age_commitment,
|
&deposit->coin.h_age_commitment,
|
||||||
@ -1722,15 +1690,9 @@ deposit_cb (void *cls,
|
|||||||
}
|
}
|
||||||
|
|
||||||
/* update global deposit fees */
|
/* update global deposit fees */
|
||||||
{
|
|
||||||
struct TALER_Amount dfee;
|
|
||||||
|
|
||||||
TALER_amount_ntoh (&dfee,
|
|
||||||
&issue->fees.deposit);
|
|
||||||
TALER_ARL_amount_add (&total_deposit_fee_income,
|
TALER_ARL_amount_add (&total_deposit_fee_income,
|
||||||
&total_deposit_fee_income,
|
&total_deposit_fee_income,
|
||||||
&dfee);
|
&issue->fees.deposit);
|
||||||
}
|
|
||||||
if (TALER_ARL_do_abort ())
|
if (TALER_ARL_do_abort ())
|
||||||
return GNUNET_SYSERR;
|
return GNUNET_SYSERR;
|
||||||
return GNUNET_OK;
|
return GNUNET_OK;
|
||||||
@ -1766,10 +1728,9 @@ refund_cb (void *cls,
|
|||||||
const struct TALER_Amount *amount_with_fee)
|
const struct TALER_Amount *amount_with_fee)
|
||||||
{
|
{
|
||||||
struct CoinContext *cc = cls;
|
struct CoinContext *cc = cls;
|
||||||
const struct TALER_DenominationKeyValidityPS *issue;
|
const struct TALER_EXCHANGEDB_DenominationKeyInformation *issue;
|
||||||
struct DenominationSummary *ds;
|
struct DenominationSummary *ds;
|
||||||
struct TALER_Amount amount_without_fee;
|
struct TALER_Amount amount_without_fee;
|
||||||
struct TALER_Amount refund_fee;
|
|
||||||
enum GNUNET_DB_QueryStatus qs;
|
enum GNUNET_DB_QueryStatus qs;
|
||||||
|
|
||||||
GNUNET_assert (rowid >= ppc.last_refund_serial_id); /* should be monotonically increasing */
|
GNUNET_assert (rowid >= ppc.last_refund_serial_id); /* should be monotonically increasing */
|
||||||
@ -1820,17 +1781,15 @@ refund_cb (void *cls,
|
|||||||
return GNUNET_OK;
|
return GNUNET_OK;
|
||||||
}
|
}
|
||||||
|
|
||||||
TALER_amount_ntoh (&refund_fee,
|
|
||||||
&issue->fees.refund);
|
|
||||||
if (TALER_ARL_SR_INVALID_NEGATIVE ==
|
if (TALER_ARL_SR_INVALID_NEGATIVE ==
|
||||||
TALER_ARL_amount_subtract_neg (&amount_without_fee,
|
TALER_ARL_amount_subtract_neg (&amount_without_fee,
|
||||||
amount_with_fee,
|
amount_with_fee,
|
||||||
&refund_fee))
|
&issue->fees.refund))
|
||||||
{
|
{
|
||||||
report_amount_arithmetic_inconsistency ("refund (fee)",
|
report_amount_arithmetic_inconsistency ("refund (fee)",
|
||||||
rowid,
|
rowid,
|
||||||
&amount_without_fee,
|
&amount_without_fee,
|
||||||
&refund_fee,
|
&issue->fees.refund,
|
||||||
-1);
|
-1);
|
||||||
if (TALER_ARL_do_abort ())
|
if (TALER_ARL_do_abort ())
|
||||||
return GNUNET_SYSERR;
|
return GNUNET_SYSERR;
|
||||||
@ -1875,7 +1834,7 @@ refund_cb (void *cls,
|
|||||||
/* update total refund fee balance */
|
/* update total refund fee balance */
|
||||||
TALER_ARL_amount_add (&total_refund_fee_income,
|
TALER_ARL_amount_add (&total_refund_fee_income,
|
||||||
&total_refund_fee_income,
|
&total_refund_fee_income,
|
||||||
&refund_fee);
|
&issue->fees.refund);
|
||||||
if (TALER_ARL_do_abort ())
|
if (TALER_ARL_do_abort ())
|
||||||
return GNUNET_SYSERR;
|
return GNUNET_SYSERR;
|
||||||
return GNUNET_OK;
|
return GNUNET_OK;
|
||||||
@ -1908,7 +1867,7 @@ check_recoup (struct CoinContext *cc,
|
|||||||
{
|
{
|
||||||
struct DenominationSummary *ds;
|
struct DenominationSummary *ds;
|
||||||
enum GNUNET_DB_QueryStatus qs;
|
enum GNUNET_DB_QueryStatus qs;
|
||||||
const struct TALER_DenominationKeyValidityPS *issue;
|
const struct TALER_EXCHANGEDB_DenominationKeyInformation *issue;
|
||||||
|
|
||||||
if (GNUNET_OK !=
|
if (GNUNET_OK !=
|
||||||
TALER_test_coin_valid (coin,
|
TALER_test_coin_valid (coin,
|
||||||
@ -2096,7 +2055,7 @@ recoup_refresh_cb (void *cls,
|
|||||||
const union TALER_DenominationBlindingKeyP *coin_blind)
|
const union TALER_DenominationBlindingKeyP *coin_blind)
|
||||||
{
|
{
|
||||||
struct CoinContext *cc = cls;
|
struct CoinContext *cc = cls;
|
||||||
const struct TALER_DenominationKeyValidityPS *issue;
|
const struct TALER_EXCHANGEDB_DenominationKeyInformation *issue;
|
||||||
enum GNUNET_DB_QueryStatus qs;
|
enum GNUNET_DB_QueryStatus qs;
|
||||||
|
|
||||||
(void) timestamp;
|
(void) timestamp;
|
||||||
@ -2195,24 +2154,13 @@ static void
|
|||||||
check_denomination (
|
check_denomination (
|
||||||
void *cls,
|
void *cls,
|
||||||
const struct TALER_DenominationPublicKey *denom_pub,
|
const struct TALER_DenominationPublicKey *denom_pub,
|
||||||
const struct TALER_EXCHANGEDB_DenominationKeyInformationP *validity)
|
const struct TALER_EXCHANGEDB_DenominationKeyInformation *issue)
|
||||||
{
|
{
|
||||||
const struct TALER_DenominationKeyValidityPS *issue = &validity->properties;
|
|
||||||
enum GNUNET_DB_QueryStatus qs;
|
enum GNUNET_DB_QueryStatus qs;
|
||||||
struct TALER_AuditorSignatureP auditor_sig;
|
struct TALER_AuditorSignatureP auditor_sig;
|
||||||
struct TALER_Amount coin_value;
|
|
||||||
struct TALER_DenomFeeSet fees;
|
|
||||||
struct GNUNET_TIME_Timestamp start;
|
|
||||||
struct GNUNET_TIME_Timestamp end;
|
|
||||||
|
|
||||||
(void) cls;
|
(void) cls;
|
||||||
(void) denom_pub;
|
(void) denom_pub;
|
||||||
TALER_amount_ntoh (&coin_value,
|
|
||||||
&issue->value);
|
|
||||||
TALER_denom_fee_set_ntoh (&fees,
|
|
||||||
&issue->fees);
|
|
||||||
start = GNUNET_TIME_timestamp_ntoh (issue->start);
|
|
||||||
end = GNUNET_TIME_timestamp_ntoh (issue->expire_legal);
|
|
||||||
qs = TALER_ARL_edb->select_auditor_denom_sig (TALER_ARL_edb->cls,
|
qs = TALER_ARL_edb->select_auditor_denom_sig (TALER_ARL_edb->cls,
|
||||||
&issue->denom_hash,
|
&issue->denom_hash,
|
||||||
&TALER_ARL_auditor_pub,
|
&TALER_ARL_auditor_pub,
|
||||||
@ -2227,10 +2175,10 @@ check_denomination (
|
|||||||
GNUNET_log (GNUNET_ERROR_TYPE_WARNING,
|
GNUNET_log (GNUNET_ERROR_TYPE_WARNING,
|
||||||
"Encountered denomination `%s' (%s) valid from %s (%llu-%llu) that this auditor is not auditing!\n",
|
"Encountered denomination `%s' (%s) valid from %s (%llu-%llu) that this auditor is not auditing!\n",
|
||||||
GNUNET_h2s (&issue->denom_hash.hash),
|
GNUNET_h2s (&issue->denom_hash.hash),
|
||||||
TALER_amount2s (&coin_value),
|
TALER_amount2s (&issue->value),
|
||||||
GNUNET_TIME_timestamp2s (start),
|
GNUNET_TIME_timestamp2s (issue->start),
|
||||||
(unsigned long long) start.abs_time.abs_value_us,
|
(unsigned long long) issue->start.abs_time.abs_value_us,
|
||||||
(unsigned long long) end.abs_time.abs_value_us);
|
(unsigned long long) issue->expire_legal.abs_time.abs_value_us);
|
||||||
return; /* skip! */
|
return; /* skip! */
|
||||||
}
|
}
|
||||||
if (GNUNET_OK !=
|
if (GNUNET_OK !=
|
||||||
@ -2238,12 +2186,12 @@ check_denomination (
|
|||||||
TALER_ARL_auditor_url,
|
TALER_ARL_auditor_url,
|
||||||
&issue->denom_hash,
|
&issue->denom_hash,
|
||||||
&TALER_ARL_master_pub,
|
&TALER_ARL_master_pub,
|
||||||
start,
|
issue->start,
|
||||||
GNUNET_TIME_timestamp_ntoh (issue->expire_withdraw),
|
issue->expire_withdraw,
|
||||||
GNUNET_TIME_timestamp_ntoh (issue->expire_deposit),
|
issue->expire_deposit,
|
||||||
end,
|
issue->expire_legal,
|
||||||
&coin_value,
|
&issue->value,
|
||||||
&fees,
|
&issue->fees,
|
||||||
&TALER_ARL_auditor_pub,
|
&TALER_ARL_auditor_pub,
|
||||||
&auditor_sig))
|
&auditor_sig))
|
||||||
{
|
{
|
||||||
@ -2252,11 +2200,12 @@ check_denomination (
|
|||||||
GNUNET_JSON_pack_data_auto ("denomination",
|
GNUNET_JSON_pack_data_auto ("denomination",
|
||||||
&issue->denom_hash),
|
&issue->denom_hash),
|
||||||
TALER_JSON_pack_amount ("value",
|
TALER_JSON_pack_amount ("value",
|
||||||
&coin_value),
|
&issue->value),
|
||||||
TALER_JSON_pack_time_abs_human ("start_time",
|
TALER_JSON_pack_time_abs_human ("start_time",
|
||||||
start.abs_time),
|
issue->start.abs_time),
|
||||||
TALER_JSON_pack_time_abs_human ("end_time",
|
TALER_JSON_pack_time_abs_human ("end_time",
|
||||||
end.abs_time)));
|
issue->expire_legal.
|
||||||
|
abs_time)));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -501,12 +501,8 @@ handle_reserve_out (void *cls,
|
|||||||
struct ReserveContext *rc = cls;
|
struct ReserveContext *rc = cls;
|
||||||
struct GNUNET_HashCode key;
|
struct GNUNET_HashCode key;
|
||||||
struct ReserveSummary *rs;
|
struct ReserveSummary *rs;
|
||||||
const struct TALER_DenominationKeyValidityPS *issue;
|
const struct TALER_EXCHANGEDB_DenominationKeyInformation *issue;
|
||||||
struct TALER_Amount withdraw_fee;
|
|
||||||
struct TALER_Amount auditor_value;
|
|
||||||
struct TALER_Amount auditor_amount_with_fee;
|
struct TALER_Amount auditor_amount_with_fee;
|
||||||
struct GNUNET_TIME_Timestamp valid_start;
|
|
||||||
struct GNUNET_TIME_Timestamp expire_withdraw;
|
|
||||||
enum GNUNET_DB_QueryStatus qs;
|
enum GNUNET_DB_QueryStatus qs;
|
||||||
struct TALER_DenominationHashP h_denom_pub;
|
struct TALER_DenominationHashP h_denom_pub;
|
||||||
|
|
||||||
@ -541,17 +537,15 @@ handle_reserve_out (void *cls,
|
|||||||
}
|
}
|
||||||
|
|
||||||
/* check that execution date is within withdraw range for denom_pub */
|
/* check that execution date is within withdraw range for denom_pub */
|
||||||
valid_start = GNUNET_TIME_timestamp_ntoh (issue->start);
|
|
||||||
expire_withdraw = GNUNET_TIME_timestamp_ntoh (issue->expire_withdraw);
|
|
||||||
GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
|
GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
|
||||||
"Checking withdraw timing: %llu, expire: %llu, timing: %llu\n",
|
"Checking withdraw timing: %llu, expire: %llu, timing: %llu\n",
|
||||||
(unsigned long long) valid_start.abs_time.abs_value_us,
|
(unsigned long long) issue->start.abs_time.abs_value_us,
|
||||||
(unsigned long long) expire_withdraw.abs_time.abs_value_us,
|
(unsigned long long) issue->expire_withdraw.abs_time.abs_value_us,
|
||||||
(unsigned long long) execution_date.abs_time.abs_value_us);
|
(unsigned long long) execution_date.abs_time.abs_value_us);
|
||||||
if (GNUNET_TIME_timestamp_cmp (valid_start,
|
if (GNUNET_TIME_timestamp_cmp (issue->start,
|
||||||
>,
|
>,
|
||||||
execution_date) ||
|
execution_date) ||
|
||||||
GNUNET_TIME_timestamp_cmp (expire_withdraw,
|
GNUNET_TIME_timestamp_cmp (issue->expire_withdraw,
|
||||||
<,
|
<,
|
||||||
execution_date))
|
execution_date))
|
||||||
{
|
{
|
||||||
@ -593,13 +587,9 @@ handle_reserve_out (void *cls,
|
|||||||
return GNUNET_OK; /* exit function here, we cannot add this to the legitimate withdrawals */
|
return GNUNET_OK; /* exit function here, we cannot add this to the legitimate withdrawals */
|
||||||
}
|
}
|
||||||
|
|
||||||
TALER_amount_ntoh (&withdraw_fee,
|
|
||||||
&issue->fees.withdraw);
|
|
||||||
TALER_amount_ntoh (&auditor_value,
|
|
||||||
&issue->value);
|
|
||||||
TALER_ARL_amount_add (&auditor_amount_with_fee,
|
TALER_ARL_amount_add (&auditor_amount_with_fee,
|
||||||
&auditor_value,
|
&issue->value,
|
||||||
&withdraw_fee);
|
&issue->fees.withdraw);
|
||||||
if (0 !=
|
if (0 !=
|
||||||
TALER_amount_cmp (&auditor_amount_with_fee,
|
TALER_amount_cmp (&auditor_amount_with_fee,
|
||||||
amount_with_fee))
|
amount_with_fee))
|
||||||
@ -652,10 +642,10 @@ handle_reserve_out (void *cls,
|
|||||||
TALER_amount2s (&auditor_amount_with_fee));
|
TALER_amount2s (&auditor_amount_with_fee));
|
||||||
GNUNET_log (GNUNET_ERROR_TYPE_INFO,
|
GNUNET_log (GNUNET_ERROR_TYPE_INFO,
|
||||||
"Increasing withdraw profits by fee %s\n",
|
"Increasing withdraw profits by fee %s\n",
|
||||||
TALER_amount2s (&withdraw_fee));
|
TALER_amount2s (&issue->fees.withdraw));
|
||||||
TALER_ARL_amount_add (&rs->total_fee,
|
TALER_ARL_amount_add (&rs->total_fee,
|
||||||
&rs->total_fee,
|
&rs->total_fee,
|
||||||
&withdraw_fee);
|
&issue->fees.withdraw);
|
||||||
if (TALER_ARL_do_abort ())
|
if (TALER_ARL_do_abort ())
|
||||||
return GNUNET_SYSERR;
|
return GNUNET_SYSERR;
|
||||||
return GNUNET_OK;
|
return GNUNET_OK;
|
||||||
|
@ -143,29 +143,6 @@ make_amount (unsigned int val,
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Initialize @a out with an amount given by @a val and
|
|
||||||
* @a frac using the main "currency".
|
|
||||||
*
|
|
||||||
* @param val value to set
|
|
||||||
* @param frac fraction to set
|
|
||||||
* @param[out] out where to write the amount
|
|
||||||
*/
|
|
||||||
static void
|
|
||||||
make_amountN (unsigned int val,
|
|
||||||
unsigned int frac,
|
|
||||||
struct TALER_AmountNBO *out)
|
|
||||||
{
|
|
||||||
struct TALER_Amount in;
|
|
||||||
|
|
||||||
make_amount (val,
|
|
||||||
frac,
|
|
||||||
&in);
|
|
||||||
TALER_amount_hton (out,
|
|
||||||
&in);
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Create random-ish timestamp.
|
* Create random-ish timestamp.
|
||||||
*
|
*
|
||||||
@ -430,7 +407,7 @@ run (void *cls,
|
|||||||
const char *cfgfile,
|
const char *cfgfile,
|
||||||
const struct GNUNET_CONFIGURATION_Handle *c)
|
const struct GNUNET_CONFIGURATION_Handle *c)
|
||||||
{
|
{
|
||||||
struct TALER_EXCHANGEDB_DenominationKeyInformationP issue;
|
struct TALER_EXCHANGEDB_DenominationKeyInformation issue;
|
||||||
|
|
||||||
(void) cls;
|
(void) cls;
|
||||||
(void) args;
|
(void) args;
|
||||||
@ -466,24 +443,18 @@ run (void *cls,
|
|||||||
GNUNET_SCHEDULER_add_shutdown (&do_shutdown,
|
GNUNET_SCHEDULER_add_shutdown (&do_shutdown,
|
||||||
NULL);
|
NULL);
|
||||||
RANDOMIZE (&issue.signature);
|
RANDOMIZE (&issue.signature);
|
||||||
issue.properties.purpose.purpose = htonl (
|
issue.start
|
||||||
TALER_SIGNATURE_MASTER_DENOMINATION_KEY_VALIDITY);
|
= start;
|
||||||
issue.properties.purpose.size = htonl (sizeof (issue.properties));
|
issue.expire_withdraw
|
||||||
RANDOMIZE (&issue.properties.master);
|
= GNUNET_TIME_absolute_to_timestamp (
|
||||||
issue.properties.start
|
|
||||||
= GNUNET_TIME_timestamp_hton (start);
|
|
||||||
issue.properties.expire_withdraw
|
|
||||||
= GNUNET_TIME_timestamp_hton (
|
|
||||||
GNUNET_TIME_absolute_to_timestamp (
|
|
||||||
GNUNET_TIME_absolute_add (start.abs_time,
|
GNUNET_TIME_absolute_add (start.abs_time,
|
||||||
GNUNET_TIME_UNIT_DAYS)));
|
GNUNET_TIME_UNIT_DAYS));
|
||||||
issue.properties.expire_deposit
|
issue.expire_deposit
|
||||||
= GNUNET_TIME_timestamp_hton (end);
|
= end;
|
||||||
issue.properties.expire_legal
|
issue.expire_legal
|
||||||
= GNUNET_TIME_timestamp_hton (
|
= GNUNET_TIME_absolute_to_timestamp (
|
||||||
GNUNET_TIME_absolute_to_timestamp (
|
|
||||||
GNUNET_TIME_absolute_add (end.abs_time,
|
GNUNET_TIME_absolute_add (end.abs_time,
|
||||||
GNUNET_TIME_UNIT_YEARS)));
|
GNUNET_TIME_UNIT_YEARS));
|
||||||
{
|
{
|
||||||
struct TALER_DenominationPrivateKey pk;
|
struct TALER_DenominationPrivateKey pk;
|
||||||
struct TALER_DenominationPublicKey denom_pub;
|
struct TALER_DenominationPublicKey denom_pub;
|
||||||
@ -505,12 +476,12 @@ run (void *cls,
|
|||||||
alg_values.cipher = TALER_DENOMINATION_RSA;
|
alg_values.cipher = TALER_DENOMINATION_RSA;
|
||||||
TALER_denom_pub_hash (&denom_pub,
|
TALER_denom_pub_hash (&denom_pub,
|
||||||
&h_denom_pub);
|
&h_denom_pub);
|
||||||
make_amountN (2, 0, &issue.properties.value);
|
make_amount (2, 0, &issue.value);
|
||||||
make_amountN (0, 5, &issue.properties.fees.withdraw);
|
make_amount (0, 5, &issue.fees.withdraw);
|
||||||
make_amountN (0, 5, &issue.properties.fees.deposit);
|
make_amount (0, 5, &issue.fees.deposit);
|
||||||
make_amountN (0, 5, &issue.properties.fees.refresh);
|
make_amount (0, 5, &issue.fees.refresh);
|
||||||
make_amountN (0, 5, &issue.properties.fees.refund);
|
make_amount (0, 5, &issue.fees.refund);
|
||||||
issue.properties.denom_hash = h_denom_pub;
|
issue.denom_hash = h_denom_pub;
|
||||||
if (0 >=
|
if (0 >=
|
||||||
plugin->insert_denomination_info (plugin->cls,
|
plugin->insert_denomination_info (plugin->cls,
|
||||||
&denom_pub,
|
&denom_pub,
|
||||||
|
@ -3550,27 +3550,26 @@ static enum GNUNET_DB_QueryStatus
|
|||||||
postgres_insert_denomination_info (
|
postgres_insert_denomination_info (
|
||||||
void *cls,
|
void *cls,
|
||||||
const struct TALER_DenominationPublicKey *denom_pub,
|
const struct TALER_DenominationPublicKey *denom_pub,
|
||||||
const struct TALER_EXCHANGEDB_DenominationKeyInformationP *issue)
|
const struct TALER_EXCHANGEDB_DenominationKeyInformation *issue)
|
||||||
{
|
{
|
||||||
struct PostgresClosure *pg = cls;
|
struct PostgresClosure *pg = cls;
|
||||||
struct TALER_DenominationHashP denom_hash;
|
struct TALER_DenominationHashP denom_hash;
|
||||||
struct GNUNET_PQ_QueryParam params[] = {
|
struct GNUNET_PQ_QueryParam params[] = {
|
||||||
GNUNET_PQ_query_param_auto_from_type (&issue->properties.denom_hash),
|
GNUNET_PQ_query_param_auto_from_type (&issue->denom_hash),
|
||||||
TALER_PQ_query_param_denom_pub (denom_pub),
|
TALER_PQ_query_param_denom_pub (denom_pub),
|
||||||
GNUNET_PQ_query_param_auto_from_type (&issue->signature),
|
GNUNET_PQ_query_param_auto_from_type (&issue->signature),
|
||||||
GNUNET_PQ_query_param_timestamp_nbo (&issue->properties.start),
|
GNUNET_PQ_query_param_timestamp (&issue->start),
|
||||||
GNUNET_PQ_query_param_timestamp_nbo (&issue->properties.expire_withdraw),
|
GNUNET_PQ_query_param_timestamp (&issue->expire_withdraw),
|
||||||
GNUNET_PQ_query_param_timestamp_nbo (&issue->properties.expire_deposit),
|
GNUNET_PQ_query_param_timestamp (&issue->expire_deposit),
|
||||||
GNUNET_PQ_query_param_timestamp_nbo (&issue->properties.expire_legal),
|
GNUNET_PQ_query_param_timestamp (&issue->expire_legal),
|
||||||
TALER_PQ_query_param_amount_nbo (&issue->properties.value),
|
TALER_PQ_query_param_amount (&issue->value),
|
||||||
TALER_PQ_query_param_amount_nbo (&issue->properties.fees.withdraw),
|
TALER_PQ_query_param_amount (&issue->fees.withdraw),
|
||||||
TALER_PQ_query_param_amount_nbo (&issue->properties.fees.deposit),
|
TALER_PQ_query_param_amount (&issue->fees.deposit),
|
||||||
TALER_PQ_query_param_amount_nbo (&issue->properties.fees.refresh),
|
TALER_PQ_query_param_amount (&issue->fees.refresh),
|
||||||
TALER_PQ_query_param_amount_nbo (&issue->properties.fees.refund),
|
TALER_PQ_query_param_amount (&issue->fees.refund),
|
||||||
GNUNET_PQ_query_param_uint32 (&denom_pub->age_mask.bits),
|
GNUNET_PQ_query_param_uint32 (&denom_pub->age_mask.bits),
|
||||||
GNUNET_PQ_query_param_end
|
GNUNET_PQ_query_param_end
|
||||||
};
|
};
|
||||||
struct TALER_DenomFeeSet fees;
|
|
||||||
|
|
||||||
GNUNET_assert (denom_pub->age_mask.bits ==
|
GNUNET_assert (denom_pub->age_mask.bits ==
|
||||||
issue->age_mask.bits);
|
issue->age_mask.bits);
|
||||||
@ -3578,26 +3577,20 @@ postgres_insert_denomination_info (
|
|||||||
&denom_hash);
|
&denom_hash);
|
||||||
GNUNET_assert (0 ==
|
GNUNET_assert (0 ==
|
||||||
GNUNET_memcmp (&denom_hash,
|
GNUNET_memcmp (&denom_hash,
|
||||||
&issue->properties.denom_hash));
|
&issue->denom_hash));
|
||||||
GNUNET_assert (! GNUNET_TIME_absolute_is_zero (
|
GNUNET_assert (! GNUNET_TIME_absolute_is_zero (
|
||||||
GNUNET_TIME_timestamp_ntoh (
|
issue->start.abs_time));
|
||||||
issue->properties.start).abs_time));
|
|
||||||
GNUNET_assert (! GNUNET_TIME_absolute_is_zero (
|
GNUNET_assert (! GNUNET_TIME_absolute_is_zero (
|
||||||
GNUNET_TIME_timestamp_ntoh (
|
issue->expire_withdraw.abs_time));
|
||||||
issue->properties.expire_withdraw).abs_time));
|
|
||||||
GNUNET_assert (! GNUNET_TIME_absolute_is_zero (
|
GNUNET_assert (! GNUNET_TIME_absolute_is_zero (
|
||||||
GNUNET_TIME_timestamp_ntoh (
|
issue->expire_deposit.abs_time));
|
||||||
issue->properties.expire_deposit).abs_time));
|
|
||||||
GNUNET_assert (! GNUNET_TIME_absolute_is_zero (
|
GNUNET_assert (! GNUNET_TIME_absolute_is_zero (
|
||||||
GNUNET_TIME_timestamp_ntoh (
|
issue->expire_legal.abs_time));
|
||||||
issue->properties.expire_legal).abs_time));
|
|
||||||
/* check fees match denomination currency */
|
/* check fees match denomination currency */
|
||||||
TALER_denom_fee_set_ntoh (&fees,
|
|
||||||
&issue->properties.fees);
|
|
||||||
GNUNET_assert (GNUNET_YES ==
|
GNUNET_assert (GNUNET_YES ==
|
||||||
TALER_denom_fee_check_currency (
|
TALER_denom_fee_check_currency (
|
||||||
issue->properties.value.currency,
|
issue->value.currency,
|
||||||
&fees));
|
&issue->fees));
|
||||||
return GNUNET_PQ_eval_prepared_non_select (pg->conn,
|
return GNUNET_PQ_eval_prepared_non_select (pg->conn,
|
||||||
"denomination_insert",
|
"denomination_insert",
|
||||||
params);
|
params);
|
||||||
@ -3616,7 +3609,7 @@ static enum GNUNET_DB_QueryStatus
|
|||||||
postgres_get_denomination_info (
|
postgres_get_denomination_info (
|
||||||
void *cls,
|
void *cls,
|
||||||
const struct TALER_DenominationHashP *denom_pub_hash,
|
const struct TALER_DenominationHashP *denom_pub_hash,
|
||||||
struct TALER_EXCHANGEDB_DenominationKeyInformationP *issue)
|
struct TALER_EXCHANGEDB_DenominationKeyInformation *issue)
|
||||||
{
|
{
|
||||||
struct PostgresClosure *pg = cls;
|
struct PostgresClosure *pg = cls;
|
||||||
enum GNUNET_DB_QueryStatus qs;
|
enum GNUNET_DB_QueryStatus qs;
|
||||||
@ -3627,43 +3620,36 @@ postgres_get_denomination_info (
|
|||||||
struct GNUNET_PQ_ResultSpec rs[] = {
|
struct GNUNET_PQ_ResultSpec rs[] = {
|
||||||
GNUNET_PQ_result_spec_auto_from_type ("master_sig",
|
GNUNET_PQ_result_spec_auto_from_type ("master_sig",
|
||||||
&issue->signature),
|
&issue->signature),
|
||||||
GNUNET_PQ_result_spec_timestamp_nbo ("valid_from",
|
GNUNET_PQ_result_spec_timestamp ("valid_from",
|
||||||
&issue->properties.start),
|
&issue->start),
|
||||||
GNUNET_PQ_result_spec_timestamp_nbo ("expire_withdraw",
|
GNUNET_PQ_result_spec_timestamp ("expire_withdraw",
|
||||||
&issue->properties.expire_withdraw),
|
&issue->expire_withdraw),
|
||||||
GNUNET_PQ_result_spec_timestamp_nbo ("expire_deposit",
|
GNUNET_PQ_result_spec_timestamp ("expire_deposit",
|
||||||
&issue->properties.expire_deposit),
|
&issue->expire_deposit),
|
||||||
GNUNET_PQ_result_spec_timestamp_nbo ("expire_legal",
|
GNUNET_PQ_result_spec_timestamp ("expire_legal",
|
||||||
&issue->properties.expire_legal),
|
&issue->expire_legal),
|
||||||
TALER_PQ_RESULT_SPEC_AMOUNT_NBO ("coin",
|
TALER_PQ_RESULT_SPEC_AMOUNT ("coin",
|
||||||
&issue->properties.value),
|
&issue->value),
|
||||||
TALER_PQ_RESULT_SPEC_AMOUNT_NBO ("fee_withdraw",
|
TALER_PQ_RESULT_SPEC_AMOUNT ("fee_withdraw",
|
||||||
&issue->properties.fees.withdraw),
|
&issue->fees.withdraw),
|
||||||
TALER_PQ_RESULT_SPEC_AMOUNT_NBO ("fee_deposit",
|
TALER_PQ_RESULT_SPEC_AMOUNT ("fee_deposit",
|
||||||
&issue->properties.fees.deposit),
|
&issue->fees.deposit),
|
||||||
TALER_PQ_RESULT_SPEC_AMOUNT_NBO ("fee_refresh",
|
TALER_PQ_RESULT_SPEC_AMOUNT ("fee_refresh",
|
||||||
&issue->properties.fees.refresh),
|
&issue->fees.refresh),
|
||||||
TALER_PQ_RESULT_SPEC_AMOUNT_NBO ("fee_refund",
|
TALER_PQ_RESULT_SPEC_AMOUNT ("fee_refund",
|
||||||
&issue->properties.fees.refund),
|
&issue->fees.refund),
|
||||||
GNUNET_PQ_result_spec_uint32 ("age_mask",
|
GNUNET_PQ_result_spec_uint32 ("age_mask",
|
||||||
&issue->age_mask.bits),
|
&issue->age_mask.bits),
|
||||||
GNUNET_PQ_result_spec_end
|
GNUNET_PQ_result_spec_end
|
||||||
};
|
};
|
||||||
|
|
||||||
memset (&issue->properties.master,
|
|
||||||
0,
|
|
||||||
sizeof (issue->properties.master));
|
|
||||||
qs = GNUNET_PQ_eval_prepared_singleton_select (pg->conn,
|
qs = GNUNET_PQ_eval_prepared_singleton_select (pg->conn,
|
||||||
"denomination_get",
|
"denomination_get",
|
||||||
params,
|
params,
|
||||||
rs);
|
rs);
|
||||||
if (GNUNET_DB_STATUS_SUCCESS_ONE_RESULT != qs)
|
if (GNUNET_DB_STATUS_SUCCESS_ONE_RESULT != qs)
|
||||||
return qs;
|
return qs;
|
||||||
issue->properties.purpose.size
|
issue->denom_hash = *denom_pub_hash;
|
||||||
= htonl (sizeof (struct TALER_DenominationKeyValidityPS));
|
|
||||||
issue->properties.purpose.purpose = htonl (
|
|
||||||
TALER_SIGNATURE_MASTER_DENOMINATION_KEY_VALIDITY);
|
|
||||||
issue->properties.denom_hash = *denom_pub_hash;
|
|
||||||
return qs;
|
return qs;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -3708,7 +3694,7 @@ domination_cb_helper (void *cls,
|
|||||||
|
|
||||||
for (unsigned int i = 0; i<num_results; i++)
|
for (unsigned int i = 0; i<num_results; i++)
|
||||||
{
|
{
|
||||||
struct TALER_EXCHANGEDB_DenominationKeyInformationP issue;
|
struct TALER_EXCHANGEDB_DenominationKeyInformation issue;
|
||||||
struct TALER_DenominationPublicKey denom_pub;
|
struct TALER_DenominationPublicKey denom_pub;
|
||||||
struct TALER_DenominationHashP denom_hash;
|
struct TALER_DenominationHashP denom_hash;
|
||||||
struct GNUNET_PQ_ResultSpec rs[] = {
|
struct GNUNET_PQ_ResultSpec rs[] = {
|
||||||
@ -3716,24 +3702,24 @@ domination_cb_helper (void *cls,
|
|||||||
&issue.signature),
|
&issue.signature),
|
||||||
GNUNET_PQ_result_spec_auto_from_type ("denom_pub_hash",
|
GNUNET_PQ_result_spec_auto_from_type ("denom_pub_hash",
|
||||||
&denom_hash),
|
&denom_hash),
|
||||||
GNUNET_PQ_result_spec_timestamp_nbo ("valid_from",
|
GNUNET_PQ_result_spec_timestamp ("valid_from",
|
||||||
&issue.properties.start),
|
&issue.start),
|
||||||
GNUNET_PQ_result_spec_timestamp_nbo ("expire_withdraw",
|
GNUNET_PQ_result_spec_timestamp ("expire_withdraw",
|
||||||
&issue.properties.expire_withdraw),
|
&issue.expire_withdraw),
|
||||||
GNUNET_PQ_result_spec_timestamp_nbo ("expire_deposit",
|
GNUNET_PQ_result_spec_timestamp ("expire_deposit",
|
||||||
&issue.properties.expire_deposit),
|
&issue.expire_deposit),
|
||||||
GNUNET_PQ_result_spec_timestamp_nbo ("expire_legal",
|
GNUNET_PQ_result_spec_timestamp ("expire_legal",
|
||||||
&issue.properties.expire_legal),
|
&issue.expire_legal),
|
||||||
TALER_PQ_RESULT_SPEC_AMOUNT_NBO ("coin",
|
TALER_PQ_RESULT_SPEC_AMOUNT ("coin",
|
||||||
&issue.properties.value),
|
&issue.value),
|
||||||
TALER_PQ_RESULT_SPEC_AMOUNT_NBO ("fee_withdraw",
|
TALER_PQ_RESULT_SPEC_AMOUNT ("fee_withdraw",
|
||||||
&issue.properties.fees.withdraw),
|
&issue.fees.withdraw),
|
||||||
TALER_PQ_RESULT_SPEC_AMOUNT_NBO ("fee_deposit",
|
TALER_PQ_RESULT_SPEC_AMOUNT ("fee_deposit",
|
||||||
&issue.properties.fees.deposit),
|
&issue.fees.deposit),
|
||||||
TALER_PQ_RESULT_SPEC_AMOUNT_NBO ("fee_refresh",
|
TALER_PQ_RESULT_SPEC_AMOUNT ("fee_refresh",
|
||||||
&issue.properties.fees.refresh),
|
&issue.fees.refresh),
|
||||||
TALER_PQ_RESULT_SPEC_AMOUNT_NBO ("fee_refund",
|
TALER_PQ_RESULT_SPEC_AMOUNT ("fee_refund",
|
||||||
&issue.properties.fees.refund),
|
&issue.fees.refund),
|
||||||
TALER_PQ_result_spec_denom_pub ("denom_pub",
|
TALER_PQ_result_spec_denom_pub ("denom_pub",
|
||||||
&denom_pub),
|
&denom_pub),
|
||||||
GNUNET_PQ_result_spec_uint32 ("age_mask",
|
GNUNET_PQ_result_spec_uint32 ("age_mask",
|
||||||
@ -3741,10 +3727,6 @@ domination_cb_helper (void *cls,
|
|||||||
GNUNET_PQ_result_spec_end
|
GNUNET_PQ_result_spec_end
|
||||||
};
|
};
|
||||||
|
|
||||||
memset (&issue.properties.master,
|
|
||||||
0,
|
|
||||||
sizeof (issue.properties.master));
|
|
||||||
|
|
||||||
if (GNUNET_OK !=
|
if (GNUNET_OK !=
|
||||||
GNUNET_PQ_extract_result (result,
|
GNUNET_PQ_extract_result (result,
|
||||||
rs,
|
rs,
|
||||||
@ -3756,18 +3738,13 @@ domination_cb_helper (void *cls,
|
|||||||
|
|
||||||
/* Unfortunately we have to carry the age mask in both, the
|
/* Unfortunately we have to carry the age mask in both, the
|
||||||
* TALER_DenominationPublicKey and
|
* TALER_DenominationPublicKey and
|
||||||
* TALER_EXCHANGEDB_DenominationKeyInformationP at different times.
|
* TALER_EXCHANGEDB_DenominationKeyInformation at different times.
|
||||||
* Here we use _both_ so let's make sure the values are the same. */
|
* Here we use _both_ so let's make sure the values are the same. */
|
||||||
denom_pub.age_mask = issue.age_mask;
|
denom_pub.age_mask = issue.age_mask;
|
||||||
|
|
||||||
issue.properties.purpose.size
|
|
||||||
= htonl (sizeof (struct TALER_DenominationKeyValidityPS));
|
|
||||||
issue.properties.purpose.purpose
|
|
||||||
= htonl (TALER_SIGNATURE_MASTER_DENOMINATION_KEY_VALIDITY);
|
|
||||||
TALER_denom_pub_hash (&denom_pub,
|
TALER_denom_pub_hash (&denom_pub,
|
||||||
&issue.properties.denom_hash);
|
&issue.denom_hash);
|
||||||
if (0 !=
|
if (0 !=
|
||||||
GNUNET_memcmp (&issue.properties.denom_hash,
|
GNUNET_memcmp (&issue.denom_hash,
|
||||||
&denom_hash))
|
&denom_hash))
|
||||||
{
|
{
|
||||||
GNUNET_break (0);
|
GNUNET_break (0);
|
||||||
|
@ -275,7 +275,7 @@ create_denom_key_pair (unsigned int size,
|
|||||||
{
|
{
|
||||||
struct DenomKeyPair *dkp;
|
struct DenomKeyPair *dkp;
|
||||||
struct TALER_EXCHANGEDB_DenominationKey dki;
|
struct TALER_EXCHANGEDB_DenominationKey dki;
|
||||||
struct TALER_EXCHANGEDB_DenominationKeyInformationP issue2;
|
struct TALER_EXCHANGEDB_DenominationKeyInformation issue2;
|
||||||
|
|
||||||
dkp = GNUNET_new (struct DenomKeyPair);
|
dkp = GNUNET_new (struct DenomKeyPair);
|
||||||
GNUNET_assert (GNUNET_OK ==
|
GNUNET_assert (GNUNET_OK ==
|
||||||
@ -289,38 +289,28 @@ create_denom_key_pair (unsigned int size,
|
|||||||
0,
|
0,
|
||||||
sizeof (struct TALER_EXCHANGEDB_DenominationKey));
|
sizeof (struct TALER_EXCHANGEDB_DenominationKey));
|
||||||
dki.denom_pub = dkp->pub;
|
dki.denom_pub = dkp->pub;
|
||||||
dki.issue.properties.start = GNUNET_TIME_timestamp_hton (now);
|
dki.issue.start = now;
|
||||||
dki.issue.properties.expire_withdraw
|
dki.issue.expire_withdraw
|
||||||
= GNUNET_TIME_timestamp_hton
|
= GNUNET_TIME_absolute_to_timestamp (
|
||||||
(GNUNET_TIME_absolute_to_timestamp
|
GNUNET_TIME_absolute_add (
|
||||||
(GNUNET_TIME_absolute_add (
|
now.abs_time,
|
||||||
|
GNUNET_TIME_UNIT_HOURS));
|
||||||
|
dki.issue.expire_deposit
|
||||||
|
= GNUNET_TIME_absolute_to_timestamp (
|
||||||
|
GNUNET_TIME_absolute_add (
|
||||||
now.abs_time,
|
now.abs_time,
|
||||||
GNUNET_TIME_UNIT_HOURS)));
|
|
||||||
dki.issue.properties.expire_deposit
|
|
||||||
= GNUNET_TIME_timestamp_hton (
|
|
||||||
GNUNET_TIME_absolute_to_timestamp
|
|
||||||
(GNUNET_TIME_absolute_add
|
|
||||||
(now.abs_time,
|
|
||||||
GNUNET_TIME_relative_multiply (
|
GNUNET_TIME_relative_multiply (
|
||||||
GNUNET_TIME_UNIT_HOURS, 2))));
|
GNUNET_TIME_UNIT_HOURS, 2)));
|
||||||
dki.issue.properties.expire_legal
|
dki.issue.expire_legal
|
||||||
= GNUNET_TIME_timestamp_hton (
|
= GNUNET_TIME_absolute_to_timestamp (
|
||||||
GNUNET_TIME_absolute_to_timestamp
|
GNUNET_TIME_absolute_add (
|
||||||
(GNUNET_TIME_absolute_add
|
now.abs_time,
|
||||||
(now.abs_time,
|
|
||||||
GNUNET_TIME_relative_multiply (
|
GNUNET_TIME_relative_multiply (
|
||||||
GNUNET_TIME_UNIT_HOURS, 3))));
|
GNUNET_TIME_UNIT_HOURS, 3)));
|
||||||
TALER_amount_hton (&dki.issue.properties.value,
|
dki.issue.value = *value;
|
||||||
value);
|
dki.issue.fees = *fees;
|
||||||
TALER_denom_fee_set_hton (&dki.issue.properties.fees,
|
|
||||||
fees);
|
|
||||||
TALER_denom_pub_hash (&dkp->pub,
|
TALER_denom_pub_hash (&dkp->pub,
|
||||||
&dki.issue.properties.denom_hash);
|
&dki.issue.denom_hash);
|
||||||
|
|
||||||
dki.issue.properties.purpose.size
|
|
||||||
= htonl (sizeof (struct TALER_DenominationKeyValidityPS));
|
|
||||||
dki.issue.properties.purpose.purpose = htonl (
|
|
||||||
TALER_SIGNATURE_MASTER_DENOMINATION_KEY_VALIDITY);
|
|
||||||
if (GNUNET_DB_STATUS_SUCCESS_ONE_RESULT !=
|
if (GNUNET_DB_STATUS_SUCCESS_ONE_RESULT !=
|
||||||
plugin->insert_denomination_info (plugin->cls,
|
plugin->insert_denomination_info (plugin->cls,
|
||||||
&dki.denom_pub,
|
&dki.denom_pub,
|
||||||
@ -334,7 +324,7 @@ create_denom_key_pair (unsigned int size,
|
|||||||
plugin->commit (plugin->cls);
|
plugin->commit (plugin->cls);
|
||||||
if (GNUNET_DB_STATUS_SUCCESS_ONE_RESULT !=
|
if (GNUNET_DB_STATUS_SUCCESS_ONE_RESULT !=
|
||||||
plugin->get_denomination_info (plugin->cls,
|
plugin->get_denomination_info (plugin->cls,
|
||||||
&dki.issue.properties.denom_hash,
|
&dki.issue.denom_hash,
|
||||||
&issue2))
|
&issue2))
|
||||||
{
|
{
|
||||||
GNUNET_break (0);
|
GNUNET_break (0);
|
||||||
@ -764,7 +754,7 @@ test_gc (void)
|
|||||||
struct DenomKeyPair *dkp;
|
struct DenomKeyPair *dkp;
|
||||||
struct GNUNET_TIME_Timestamp now;
|
struct GNUNET_TIME_Timestamp now;
|
||||||
struct GNUNET_TIME_Timestamp past;
|
struct GNUNET_TIME_Timestamp past;
|
||||||
struct TALER_EXCHANGEDB_DenominationKeyInformationP issue2;
|
struct TALER_EXCHANGEDB_DenominationKeyInformation issue2;
|
||||||
struct TALER_DenominationHashP denom_hash;
|
struct TALER_DenominationHashP denom_hash;
|
||||||
|
|
||||||
now = GNUNET_TIME_timestamp_get ();
|
now = GNUNET_TIME_timestamp_get ();
|
||||||
|
@ -1455,132 +1455,6 @@ struct TALER_ExchangeWithdrawValues
|
|||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @brief Information about a signing key of the exchange. Signing keys are used
|
|
||||||
* to sign exchange messages other than coins, i.e. to confirm that a
|
|
||||||
* deposit was successful or that a refresh was accepted.
|
|
||||||
*
|
|
||||||
* FIXME: remove this from the public API...
|
|
||||||
*/
|
|
||||||
struct TALER_ExchangeSigningKeyValidityPS
|
|
||||||
{
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Purpose is #TALER_SIGNATURE_MASTER_SIGNING_KEY_VALIDITY.
|
|
||||||
*/
|
|
||||||
struct GNUNET_CRYPTO_EccSignaturePurpose purpose;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* When does this signing key begin to be valid?
|
|
||||||
*/
|
|
||||||
struct GNUNET_TIME_TimestampNBO start;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* When does this signing key expire? Note: This is currently when
|
|
||||||
* the Exchange will definitively stop using it. Signatures made with
|
|
||||||
* the key remain valid until @e end. When checking validity periods,
|
|
||||||
* clients should allow for some overlap between keys and tolerate
|
|
||||||
* the use of either key during the overlap time (due to the
|
|
||||||
* possibility of clock skew).
|
|
||||||
*/
|
|
||||||
struct GNUNET_TIME_TimestampNBO expire;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* When do signatures with this signing key become invalid? After
|
|
||||||
* this point, these signatures cannot be used in (legal) disputes
|
|
||||||
* anymore, as the Exchange is then allowed to destroy its side of the
|
|
||||||
* evidence. @e end is expected to be significantly larger than @e
|
|
||||||
* expire (by a year or more).
|
|
||||||
*/
|
|
||||||
struct GNUNET_TIME_TimestampNBO end;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* The public online signing key that the exchange will use
|
|
||||||
* between @e start and @e expire.
|
|
||||||
*/
|
|
||||||
struct TALER_ExchangePublicKeyP signkey_pub;
|
|
||||||
};
|
|
||||||
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @brief Information about a denomination key. Denomination keys
|
|
||||||
* are used to sign coins of a certain value into existence.
|
|
||||||
*
|
|
||||||
* FIXME: remove this from the public API...
|
|
||||||
*/
|
|
||||||
struct TALER_DenominationKeyValidityPS
|
|
||||||
{
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Purpose is #TALER_SIGNATURE_MASTER_DENOMINATION_KEY_VALIDITY.
|
|
||||||
*/
|
|
||||||
struct GNUNET_CRYPTO_EccSignaturePurpose purpose;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* The long-term offline master key of the exchange that was
|
|
||||||
* used to create @e signature.
|
|
||||||
*/
|
|
||||||
struct TALER_MasterPublicKeyP master;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Start time of the validity period for this key.
|
|
||||||
*/
|
|
||||||
struct GNUNET_TIME_TimestampNBO start;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* The exchange will sign fresh coins between @e start and this time.
|
|
||||||
* @e expire_withdraw will be somewhat larger than @e start to
|
|
||||||
* ensure a sufficiently large anonymity set, while also allowing
|
|
||||||
* the Exchange to limit the financial damage in case of a key being
|
|
||||||
* compromised. Thus, exchanges with low volume are expected to have a
|
|
||||||
* longer withdraw period (@e expire_withdraw - @e start) than exchanges
|
|
||||||
* with high transaction volume. The period may also differ between
|
|
||||||
* types of coins. A exchange may also have a few denomination keys
|
|
||||||
* with the same value with overlapping validity periods, to address
|
|
||||||
* issues such as clock skew.
|
|
||||||
*/
|
|
||||||
struct GNUNET_TIME_TimestampNBO expire_withdraw;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Coins signed with the denomination key must be spent or refreshed
|
|
||||||
* between @e start and this expiration time. After this time, the
|
|
||||||
* exchange will refuse transactions involving this key as it will
|
|
||||||
* "drop" the table with double-spending information (shortly after)
|
|
||||||
* this time. Note that wallets should refresh coins significantly
|
|
||||||
* before this time to be on the safe side. @e expire_deposit must be
|
|
||||||
* significantly larger than @e expire_withdraw (by months or even
|
|
||||||
* years).
|
|
||||||
*/
|
|
||||||
struct GNUNET_TIME_TimestampNBO expire_deposit;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* When do signatures with this denomination key become invalid?
|
|
||||||
* After this point, these signatures cannot be used in (legal)
|
|
||||||
* disputes anymore, as the Exchange is then allowed to destroy its side
|
|
||||||
* of the evidence. @e expire_legal is expected to be significantly
|
|
||||||
* larger than @e expire_deposit (by a year or more).
|
|
||||||
*/
|
|
||||||
struct GNUNET_TIME_TimestampNBO expire_legal;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* The value of the coins signed with this denomination key.
|
|
||||||
*/
|
|
||||||
struct TALER_AmountNBO value;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Fees for the coin.
|
|
||||||
*/
|
|
||||||
struct TALER_DenomFeeSetNBOP fees;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Hash code of the denomination public key. (Used to avoid having
|
|
||||||
* the variable-size RSA key in this struct.)
|
|
||||||
*/
|
|
||||||
struct TALER_DenominationHashP denom_hash GNUNET_PACKED;
|
|
||||||
|
|
||||||
};
|
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Free internals of @a denom_pub, but not @a denom_pub itself.
|
* Free internals of @a denom_pub, but not @a denom_pub itself.
|
||||||
*
|
*
|
||||||
|
@ -27,38 +27,10 @@
|
|||||||
#include "taler_signatures.h"
|
#include "taler_signatures.h"
|
||||||
|
|
||||||
|
|
||||||
GNUNET_NETWORK_STRUCT_BEGIN
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @brief On disk format used for a exchange signing key. Signing keys are used
|
|
||||||
* by the exchange to affirm its messages, but not to create coins.
|
|
||||||
* Includes the private key followed by the public information about
|
|
||||||
* the signing key.
|
|
||||||
*/
|
|
||||||
struct TALER_EXCHANGEDB_PrivateSigningKeyInformationP
|
|
||||||
{
|
|
||||||
/**
|
|
||||||
* Private key part of the exchange's signing key.
|
|
||||||
*/
|
|
||||||
struct TALER_ExchangePrivateKeyP signkey_priv;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Signature over @e issue
|
|
||||||
*/
|
|
||||||
struct TALER_MasterSignatureP master_sig;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Public information about a exchange signing key.
|
|
||||||
*/
|
|
||||||
struct TALER_ExchangeSigningKeyValidityPS issue;
|
|
||||||
|
|
||||||
};
|
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Information about a denomination key.
|
* Information about a denomination key.
|
||||||
*/
|
*/
|
||||||
struct TALER_EXCHANGEDB_DenominationKeyInformationP
|
struct TALER_EXCHANGEDB_DenominationKeyInformation
|
||||||
{
|
{
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -67,9 +39,60 @@ struct TALER_EXCHANGEDB_DenominationKeyInformationP
|
|||||||
struct TALER_MasterSignatureP signature;
|
struct TALER_MasterSignatureP signature;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Signed properties of the denomination key.
|
* Start time of the validity period for this key.
|
||||||
*/
|
*/
|
||||||
struct TALER_DenominationKeyValidityPS properties;
|
struct GNUNET_TIME_Timestamp start;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* The exchange will sign fresh coins between @e start and this time.
|
||||||
|
* @e expire_withdraw will be somewhat larger than @e start to
|
||||||
|
* ensure a sufficiently large anonymity set, while also allowing
|
||||||
|
* the Exchange to limit the financial damage in case of a key being
|
||||||
|
* compromised. Thus, exchanges with low volume are expected to have a
|
||||||
|
* longer withdraw period (@e expire_withdraw - @e start) than exchanges
|
||||||
|
* with high transaction volume. The period may also differ between
|
||||||
|
* types of coins. A exchange may also have a few denomination keys
|
||||||
|
* with the same value with overlapping validity periods, to address
|
||||||
|
* issues such as clock skew.
|
||||||
|
*/
|
||||||
|
struct GNUNET_TIME_Timestamp expire_withdraw;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Coins signed with the denomination key must be spent or refreshed
|
||||||
|
* between @e start and this expiration time. After this time, the
|
||||||
|
* exchange will refuse transactions involving this key as it will
|
||||||
|
* "drop" the table with double-spending information (shortly after)
|
||||||
|
* this time. Note that wallets should refresh coins significantly
|
||||||
|
* before this time to be on the safe side. @e expire_deposit must be
|
||||||
|
* significantly larger than @e expire_withdraw (by months or even
|
||||||
|
* years).
|
||||||
|
*/
|
||||||
|
struct GNUNET_TIME_Timestamp expire_deposit;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* When do signatures with this denomination key become invalid?
|
||||||
|
* After this point, these signatures cannot be used in (legal)
|
||||||
|
* disputes anymore, as the Exchange is then allowed to destroy its side
|
||||||
|
* of the evidence. @e expire_legal is expected to be significantly
|
||||||
|
* larger than @e expire_deposit (by a year or more).
|
||||||
|
*/
|
||||||
|
struct GNUNET_TIME_Timestamp expire_legal;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* The value of the coins signed with this denomination key.
|
||||||
|
*/
|
||||||
|
struct TALER_Amount value;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Fees for the coin.
|
||||||
|
*/
|
||||||
|
struct TALER_DenomFeeSet fees;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Hash code of the denomination public key. (Used to avoid having
|
||||||
|
* the variable-size RSA key in this struct.)
|
||||||
|
*/
|
||||||
|
struct TALER_DenominationHashP denom_hash;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* If denomination was setup for age restriction, non-zero age mask.
|
* If denomination was setup for age restriction, non-zero age mask.
|
||||||
@ -79,6 +102,8 @@ struct TALER_EXCHANGEDB_DenominationKeyInformationP
|
|||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
|
GNUNET_NETWORK_STRUCT_BEGIN
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Signature of events signalling a reserve got funding.
|
* Signature of events signalling a reserve got funding.
|
||||||
*/
|
*/
|
||||||
@ -474,7 +499,7 @@ struct TALER_EXCHANGEDB_DenominationKey
|
|||||||
/**
|
/**
|
||||||
* Signed public information about a denomination key.
|
* Signed public information about a denomination key.
|
||||||
*/
|
*/
|
||||||
struct TALER_EXCHANGEDB_DenominationKeyInformationP issue;
|
struct TALER_EXCHANGEDB_DenominationKeyInformation issue;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
@ -2188,7 +2213,7 @@ typedef void
|
|||||||
(*TALER_EXCHANGEDB_DenominationCallback)(
|
(*TALER_EXCHANGEDB_DenominationCallback)(
|
||||||
void *cls,
|
void *cls,
|
||||||
const struct TALER_DenominationPublicKey *denom_pub,
|
const struct TALER_DenominationPublicKey *denom_pub,
|
||||||
const struct TALER_EXCHANGEDB_DenominationKeyInformationP *issue);
|
const struct TALER_EXCHANGEDB_DenominationKeyInformation *issue);
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -2358,7 +2383,7 @@ struct TALER_EXCHANGEDB_Plugin
|
|||||||
(*insert_denomination_info)(
|
(*insert_denomination_info)(
|
||||||
void *cls,
|
void *cls,
|
||||||
const struct TALER_DenominationPublicKey *denom_pub,
|
const struct TALER_DenominationPublicKey *denom_pub,
|
||||||
const struct TALER_EXCHANGEDB_DenominationKeyInformationP *issue);
|
const struct TALER_EXCHANGEDB_DenominationKeyInformation *issue);
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -2373,7 +2398,7 @@ struct TALER_EXCHANGEDB_Plugin
|
|||||||
(*get_denomination_info)(
|
(*get_denomination_info)(
|
||||||
void *cls,
|
void *cls,
|
||||||
const struct TALER_DenominationHashP *denom_pub_hash,
|
const struct TALER_DenominationHashP *denom_pub_hash,
|
||||||
struct TALER_EXCHANGEDB_DenominationKeyInformationP *issue);
|
struct TALER_EXCHANGEDB_DenominationKeyInformation *issue);
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -79,40 +79,37 @@ struct InsertDepositState
|
|||||||
* @param[out] issue information to initialize with "valid" data
|
* @param[out] issue information to initialize with "valid" data
|
||||||
*/
|
*/
|
||||||
static void
|
static void
|
||||||
fake_issue (struct TALER_EXCHANGEDB_DenominationKeyInformationP *issue)
|
fake_issue (struct TALER_EXCHANGEDB_DenominationKeyInformation *issue)
|
||||||
{
|
{
|
||||||
struct GNUNET_TIME_Timestamp now;
|
struct GNUNET_TIME_Timestamp now;
|
||||||
|
|
||||||
memset (issue,
|
memset (issue,
|
||||||
0,
|
0,
|
||||||
sizeof (struct TALER_EXCHANGEDB_DenominationKeyInformationP));
|
sizeof (*issue));
|
||||||
now = GNUNET_TIME_timestamp_get ();
|
now = GNUNET_TIME_timestamp_get ();
|
||||||
issue->properties.start
|
issue->start
|
||||||
= GNUNET_TIME_timestamp_hton (now);
|
= now;
|
||||||
issue->properties.expire_withdraw
|
issue->expire_withdraw
|
||||||
= GNUNET_TIME_timestamp_hton (
|
= GNUNET_TIME_relative_to_timestamp (GNUNET_TIME_UNIT_MINUTES);
|
||||||
GNUNET_TIME_relative_to_timestamp (GNUNET_TIME_UNIT_MINUTES));
|
issue->expire_deposit
|
||||||
issue->properties.expire_deposit
|
= GNUNET_TIME_relative_to_timestamp (GNUNET_TIME_UNIT_HOURS);
|
||||||
= GNUNET_TIME_timestamp_hton (
|
issue->expire_legal
|
||||||
GNUNET_TIME_relative_to_timestamp (GNUNET_TIME_UNIT_HOURS));
|
= GNUNET_TIME_relative_to_timestamp (GNUNET_TIME_UNIT_DAYS);
|
||||||
issue->properties.expire_legal
|
|
||||||
= GNUNET_TIME_timestamp_hton (
|
|
||||||
GNUNET_TIME_relative_to_timestamp (GNUNET_TIME_UNIT_DAYS));
|
|
||||||
GNUNET_assert (GNUNET_OK ==
|
GNUNET_assert (GNUNET_OK ==
|
||||||
TALER_string_to_amount_nbo ("EUR:1",
|
TALER_string_to_amount ("EUR:1",
|
||||||
&issue->properties.value));
|
&issue->value));
|
||||||
GNUNET_assert (GNUNET_OK ==
|
GNUNET_assert (GNUNET_OK ==
|
||||||
TALER_string_to_amount_nbo ("EUR:0.1",
|
TALER_string_to_amount ("EUR:0.1",
|
||||||
&issue->properties.fees.withdraw));
|
&issue->fees.withdraw));
|
||||||
GNUNET_assert (GNUNET_OK ==
|
GNUNET_assert (GNUNET_OK ==
|
||||||
TALER_string_to_amount_nbo ("EUR:0.1",
|
TALER_string_to_amount ("EUR:0.1",
|
||||||
&issue->properties.fees.deposit));
|
&issue->fees.deposit));
|
||||||
GNUNET_assert (GNUNET_OK ==
|
GNUNET_assert (GNUNET_OK ==
|
||||||
TALER_string_to_amount_nbo ("EUR:0.1",
|
TALER_string_to_amount ("EUR:0.1",
|
||||||
&issue->properties.fees.refresh));
|
&issue->fees.refresh));
|
||||||
GNUNET_assert (GNUNET_OK ==
|
GNUNET_assert (GNUNET_OK ==
|
||||||
TALER_string_to_amount_nbo ("EUR:0.1",
|
TALER_string_to_amount ("EUR:0.1",
|
||||||
&issue->properties.fees.refund));
|
&issue->fees.refund));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@ -131,7 +128,7 @@ insert_deposit_run (void *cls,
|
|||||||
struct InsertDepositState *ids = cls;
|
struct InsertDepositState *ids = cls;
|
||||||
struct TALER_EXCHANGEDB_Deposit deposit;
|
struct TALER_EXCHANGEDB_Deposit deposit;
|
||||||
struct TALER_MerchantPrivateKeyP merchant_priv;
|
struct TALER_MerchantPrivateKeyP merchant_priv;
|
||||||
struct TALER_EXCHANGEDB_DenominationKeyInformationP issue;
|
struct TALER_EXCHANGEDB_DenominationKeyInformation issue;
|
||||||
struct TALER_DenominationPublicKey dpk;
|
struct TALER_DenominationPublicKey dpk;
|
||||||
struct TALER_DenominationPrivateKey denom_priv;
|
struct TALER_DenominationPrivateKey denom_priv;
|
||||||
|
|
||||||
@ -144,7 +141,7 @@ insert_deposit_run (void *cls,
|
|||||||
TALER_DENOMINATION_RSA,
|
TALER_DENOMINATION_RSA,
|
||||||
1024));
|
1024));
|
||||||
TALER_denom_pub_hash (&dpk,
|
TALER_denom_pub_hash (&dpk,
|
||||||
&issue.properties.denom_hash);
|
&issue.denom_hash);
|
||||||
|
|
||||||
if ( (GNUNET_OK !=
|
if ( (GNUNET_OK !=
|
||||||
ids->dbc->plugin->start (ids->dbc->plugin->cls,
|
ids->dbc->plugin->start (ids->dbc->plugin->cls,
|
||||||
|
@ -23,6 +23,8 @@
|
|||||||
#include "taler_signatures.h"
|
#include "taler_signatures.h"
|
||||||
|
|
||||||
|
|
||||||
|
GNUNET_NETWORK_STRUCT_BEGIN
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @brief Format used to generate the signature on a confirmation
|
* @brief Format used to generate the signature on a confirmation
|
||||||
* from the exchange that a deposit request succeeded.
|
* from the exchange that a deposit request succeeded.
|
||||||
@ -91,6 +93,8 @@ struct TALER_DepositConfirmationPS
|
|||||||
|
|
||||||
};
|
};
|
||||||
|
|
||||||
|
GNUNET_NETWORK_STRUCT_END
|
||||||
|
|
||||||
|
|
||||||
enum TALER_ErrorCode
|
enum TALER_ErrorCode
|
||||||
TALER_exchange_online_deposit_confirmation_sign (
|
TALER_exchange_online_deposit_confirmation_sign (
|
||||||
@ -172,6 +176,8 @@ TALER_exchange_online_deposit_confirmation_verify (
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
GNUNET_NETWORK_STRUCT_BEGIN
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @brief Format used to generate the signature on a request to refund
|
* @brief Format used to generate the signature on a request to refund
|
||||||
* a coin into the account of the customer.
|
* a coin into the account of the customer.
|
||||||
@ -213,6 +219,8 @@ struct TALER_RefundConfirmationPS
|
|||||||
struct TALER_AmountNBO refund_amount;
|
struct TALER_AmountNBO refund_amount;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
GNUNET_NETWORK_STRUCT_END
|
||||||
|
|
||||||
|
|
||||||
enum TALER_ErrorCode
|
enum TALER_ErrorCode
|
||||||
TALER_exchange_online_refund_confirmation_sign (
|
TALER_exchange_online_refund_confirmation_sign (
|
||||||
@ -276,6 +284,8 @@ TALER_exchange_online_refund_confirmation_verify (
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
GNUNET_NETWORK_STRUCT_BEGIN
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @brief Format of the block signed by the Exchange in response to a successful
|
* @brief Format of the block signed by the Exchange in response to a successful
|
||||||
* "/refresh/melt" request. Hereby the exchange affirms that all of the
|
* "/refresh/melt" request. Hereby the exchange affirms that all of the
|
||||||
@ -303,6 +313,8 @@ struct TALER_RefreshMeltConfirmationPS
|
|||||||
|
|
||||||
};
|
};
|
||||||
|
|
||||||
|
GNUNET_NETWORK_STRUCT_END
|
||||||
|
|
||||||
|
|
||||||
enum TALER_ErrorCode
|
enum TALER_ErrorCode
|
||||||
TALER_exchange_online_melt_confirmation_sign (
|
TALER_exchange_online_melt_confirmation_sign (
|
||||||
@ -347,6 +359,8 @@ TALER_exchange_online_melt_confirmation_verify (
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
GNUNET_NETWORK_STRUCT_BEGIN
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @brief Signature made by the exchange over the full set of keys, used
|
* @brief Signature made by the exchange over the full set of keys, used
|
||||||
* to detect cheating exchanges that give out different sets to
|
* to detect cheating exchanges that give out different sets to
|
||||||
@ -372,6 +386,8 @@ struct TALER_ExchangeKeySetPS
|
|||||||
struct GNUNET_HashCode hc GNUNET_PACKED;
|
struct GNUNET_HashCode hc GNUNET_PACKED;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
GNUNET_NETWORK_STRUCT_END
|
||||||
|
|
||||||
|
|
||||||
enum TALER_ErrorCode
|
enum TALER_ErrorCode
|
||||||
TALER_exchange_online_key_set_sign (
|
TALER_exchange_online_key_set_sign (
|
||||||
@ -418,6 +434,8 @@ TALER_exchange_online_key_set_verify (
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
GNUNET_NETWORK_STRUCT_BEGIN
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @brief Signature by which an exchange affirms that an account
|
* @brief Signature by which an exchange affirms that an account
|
||||||
* successfully passed the KYC checks.
|
* successfully passed the KYC checks.
|
||||||
@ -442,6 +460,8 @@ struct TALER_ExchangeAccountSetupSuccessPS
|
|||||||
struct GNUNET_TIME_TimestampNBO timestamp;
|
struct GNUNET_TIME_TimestampNBO timestamp;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
GNUNET_NETWORK_STRUCT_END
|
||||||
|
|
||||||
|
|
||||||
enum TALER_ErrorCode
|
enum TALER_ErrorCode
|
||||||
TALER_exchange_online_account_setup_success_sign (
|
TALER_exchange_online_account_setup_success_sign (
|
||||||
@ -490,6 +510,8 @@ TALER_exchange_online_account_setup_success_verify (
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
GNUNET_NETWORK_STRUCT_BEGIN
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @brief Format internally used for packing the detailed information
|
* @brief Format internally used for packing the detailed information
|
||||||
* to generate the signature for /track/transfer signatures.
|
* to generate the signature for /track/transfer signatures.
|
||||||
@ -524,6 +546,8 @@ struct TALER_WireDepositDetailP
|
|||||||
|
|
||||||
};
|
};
|
||||||
|
|
||||||
|
GNUNET_NETWORK_STRUCT_END
|
||||||
|
|
||||||
|
|
||||||
void
|
void
|
||||||
TALER_exchange_online_wire_deposit_append (
|
TALER_exchange_online_wire_deposit_append (
|
||||||
@ -549,6 +573,8 @@ TALER_exchange_online_wire_deposit_append (
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
GNUNET_NETWORK_STRUCT_BEGIN
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @brief Format used to generate the signature for /wire/deposit
|
* @brief Format used to generate the signature for /wire/deposit
|
||||||
* replies.
|
* replies.
|
||||||
@ -589,6 +615,8 @@ struct TALER_WireDepositDataPS
|
|||||||
|
|
||||||
};
|
};
|
||||||
|
|
||||||
|
GNUNET_NETWORK_STRUCT_END
|
||||||
|
|
||||||
|
|
||||||
enum TALER_ErrorCode
|
enum TALER_ErrorCode
|
||||||
TALER_exchange_online_wire_deposit_sign (
|
TALER_exchange_online_wire_deposit_sign (
|
||||||
@ -650,6 +678,8 @@ TALER_exchange_online_wire_deposit_verify (
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
GNUNET_NETWORK_STRUCT_BEGIN
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Details affirmed by the exchange about a wire transfer the exchange
|
* Details affirmed by the exchange about a wire transfer the exchange
|
||||||
* claims to have done with respect to a deposit operation.
|
* claims to have done with respect to a deposit operation.
|
||||||
@ -698,6 +728,8 @@ struct TALER_ConfirmWirePS
|
|||||||
|
|
||||||
};
|
};
|
||||||
|
|
||||||
|
GNUNET_NETWORK_STRUCT_END
|
||||||
|
|
||||||
|
|
||||||
enum TALER_ErrorCode
|
enum TALER_ErrorCode
|
||||||
TALER_exchange_online_confirm_wire_sign (
|
TALER_exchange_online_confirm_wire_sign (
|
||||||
@ -761,6 +793,8 @@ TALER_exchange_online_confirm_wire_verify (
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
GNUNET_NETWORK_STRUCT_BEGIN
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Response by which the exchange affirms that it will
|
* Response by which the exchange affirms that it will
|
||||||
* refund a coin as part of the emergency /recoup
|
* refund a coin as part of the emergency /recoup
|
||||||
@ -799,6 +833,8 @@ struct TALER_RecoupConfirmationPS
|
|||||||
struct TALER_ReservePublicKeyP reserve_pub;
|
struct TALER_ReservePublicKeyP reserve_pub;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
GNUNET_NETWORK_STRUCT_END
|
||||||
|
|
||||||
|
|
||||||
enum TALER_ErrorCode
|
enum TALER_ErrorCode
|
||||||
TALER_exchange_online_confirm_recoup_sign (
|
TALER_exchange_online_confirm_recoup_sign (
|
||||||
@ -851,6 +887,8 @@ TALER_exchange_online_confirm_recoup_verify (
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
GNUNET_NETWORK_STRUCT_BEGIN
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Response by which the exchange affirms that it will refund a refreshed coin
|
* Response by which the exchange affirms that it will refund a refreshed coin
|
||||||
* as part of the emergency /recoup protocol. The recoup will go back to the
|
* as part of the emergency /recoup protocol. The recoup will go back to the
|
||||||
@ -888,6 +926,8 @@ struct TALER_RecoupRefreshConfirmationPS
|
|||||||
struct TALER_CoinSpendPublicKeyP old_coin_pub;
|
struct TALER_CoinSpendPublicKeyP old_coin_pub;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
GNUNET_NETWORK_STRUCT_END
|
||||||
|
|
||||||
|
|
||||||
enum TALER_ErrorCode
|
enum TALER_ErrorCode
|
||||||
TALER_exchange_online_confirm_recoup_refresh_sign (
|
TALER_exchange_online_confirm_recoup_refresh_sign (
|
||||||
@ -945,6 +985,8 @@ TALER_exchange_online_confirm_recoup_refresh_verify (
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
GNUNET_NETWORK_STRUCT_BEGIN
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Response by which the exchange affirms that it does not
|
* Response by which the exchange affirms that it does not
|
||||||
* currently know a denomination by the given hash.
|
* currently know a denomination by the given hash.
|
||||||
@ -968,6 +1010,8 @@ struct TALER_DenominationUnknownAffirmationPS
|
|||||||
struct TALER_DenominationHashP h_denom_pub;
|
struct TALER_DenominationHashP h_denom_pub;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
GNUNET_NETWORK_STRUCT_END
|
||||||
|
|
||||||
|
|
||||||
enum TALER_ErrorCode
|
enum TALER_ErrorCode
|
||||||
TALER_exchange_online_denomination_unknown_sign (
|
TALER_exchange_online_denomination_unknown_sign (
|
||||||
@ -1012,6 +1056,8 @@ TALER_exchange_online_denomination_unknown_verify (
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
GNUNET_NETWORK_STRUCT_BEGIN
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Response by which the exchange affirms that it does not
|
* Response by which the exchange affirms that it does not
|
||||||
* currently consider the given denomination to be valid
|
* currently consider the given denomination to be valid
|
||||||
@ -1042,6 +1088,8 @@ struct TALER_DenominationExpiredAffirmationPS
|
|||||||
|
|
||||||
};
|
};
|
||||||
|
|
||||||
|
GNUNET_NETWORK_STRUCT_END
|
||||||
|
|
||||||
|
|
||||||
enum TALER_ErrorCode
|
enum TALER_ErrorCode
|
||||||
TALER_exchange_online_denomination_expired_sign (
|
TALER_exchange_online_denomination_expired_sign (
|
||||||
@ -1100,6 +1148,8 @@ TALER_exchange_online_denomination_expired_verify (
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
GNUNET_NETWORK_STRUCT_BEGIN
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Response by which the exchange affirms that it has
|
* Response by which the exchange affirms that it has
|
||||||
* closed a reserve and send back the funds.
|
* closed a reserve and send back the funds.
|
||||||
@ -1143,6 +1193,8 @@ struct TALER_ReserveCloseConfirmationPS
|
|||||||
struct TALER_WireTransferIdentifierRawP wtid;
|
struct TALER_WireTransferIdentifierRawP wtid;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
GNUNET_NETWORK_STRUCT_END
|
||||||
|
|
||||||
|
|
||||||
enum TALER_ErrorCode
|
enum TALER_ErrorCode
|
||||||
TALER_exchange_online_reserve_closed_sign (
|
TALER_exchange_online_reserve_closed_sign (
|
||||||
|
@ -23,6 +23,8 @@
|
|||||||
#include "taler_signatures.h"
|
#include "taler_signatures.h"
|
||||||
|
|
||||||
|
|
||||||
|
GNUNET_NETWORK_STRUCT_BEGIN
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @brief Signature made by the exchange offline key over the information of
|
* @brief Signature made by the exchange offline key over the information of
|
||||||
* an auditor to be added to the exchange's set of auditors.
|
* an auditor to be added to the exchange's set of auditors.
|
||||||
@ -51,6 +53,7 @@ struct TALER_MasterAddAuditorPS
|
|||||||
*/
|
*/
|
||||||
struct GNUNET_HashCode h_auditor_url GNUNET_PACKED;
|
struct GNUNET_HashCode h_auditor_url GNUNET_PACKED;
|
||||||
};
|
};
|
||||||
|
GNUNET_NETWORK_STRUCT_END
|
||||||
|
|
||||||
|
|
||||||
void
|
void
|
||||||
@ -103,6 +106,8 @@ TALER_exchange_offline_auditor_add_verify (
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
GNUNET_NETWORK_STRUCT_BEGIN
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @brief Signature made by the exchange offline key over the information of
|
* @brief Signature made by the exchange offline key over the information of
|
||||||
* an auditor to be removed from the exchange's set of auditors.
|
* an auditor to be removed from the exchange's set of auditors.
|
||||||
@ -127,6 +132,7 @@ struct TALER_MasterDelAuditorPS
|
|||||||
struct TALER_AuditorPublicKeyP auditor_pub;
|
struct TALER_AuditorPublicKeyP auditor_pub;
|
||||||
|
|
||||||
};
|
};
|
||||||
|
GNUNET_NETWORK_STRUCT_END
|
||||||
|
|
||||||
|
|
||||||
void
|
void
|
||||||
@ -171,6 +177,8 @@ TALER_exchange_offline_auditor_del_verify (
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
GNUNET_NETWORK_STRUCT_BEGIN
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @brief Message confirming that a denomination key was revoked.
|
* @brief Message confirming that a denomination key was revoked.
|
||||||
*/
|
*/
|
||||||
@ -188,6 +196,8 @@ struct TALER_MasterDenominationKeyRevocationPS
|
|||||||
|
|
||||||
};
|
};
|
||||||
|
|
||||||
|
GNUNET_NETWORK_STRUCT_END
|
||||||
|
|
||||||
|
|
||||||
void
|
void
|
||||||
TALER_exchange_offline_denomination_revoke_sign (
|
TALER_exchange_offline_denomination_revoke_sign (
|
||||||
@ -228,6 +238,8 @@ TALER_exchange_offline_denomination_revoke_verify (
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
GNUNET_NETWORK_STRUCT_BEGIN
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @brief Message confirming that an exchange online signing key was revoked.
|
* @brief Message confirming that an exchange online signing key was revoked.
|
||||||
*/
|
*/
|
||||||
@ -245,6 +257,8 @@ struct TALER_MasterSigningKeyRevocationPS
|
|||||||
|
|
||||||
};
|
};
|
||||||
|
|
||||||
|
GNUNET_NETWORK_STRUCT_END
|
||||||
|
|
||||||
|
|
||||||
void
|
void
|
||||||
TALER_exchange_offline_signkey_revoke_sign (
|
TALER_exchange_offline_signkey_revoke_sign (
|
||||||
@ -286,6 +300,55 @@ TALER_exchange_offline_signkey_revoke_verify (
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
GNUNET_NETWORK_STRUCT_BEGIN
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Information about a signing key of the exchange. Signing keys are used
|
||||||
|
* to sign exchange messages other than coins, i.e. to confirm that a
|
||||||
|
* deposit was successful or that a refresh was accepted.
|
||||||
|
*/
|
||||||
|
struct TALER_ExchangeSigningKeyValidityPS
|
||||||
|
{
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Purpose is #TALER_SIGNATURE_MASTER_SIGNING_KEY_VALIDITY.
|
||||||
|
*/
|
||||||
|
struct GNUNET_CRYPTO_EccSignaturePurpose purpose;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* When does this signing key begin to be valid?
|
||||||
|
*/
|
||||||
|
struct GNUNET_TIME_TimestampNBO start;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* When does this signing key expire? Note: This is currently when
|
||||||
|
* the Exchange will definitively stop using it. Signatures made with
|
||||||
|
* the key remain valid until @e end. When checking validity periods,
|
||||||
|
* clients should allow for some overlap between keys and tolerate
|
||||||
|
* the use of either key during the overlap time (due to the
|
||||||
|
* possibility of clock skew).
|
||||||
|
*/
|
||||||
|
struct GNUNET_TIME_TimestampNBO expire;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* When do signatures with this signing key become invalid? After
|
||||||
|
* this point, these signatures cannot be used in (legal) disputes
|
||||||
|
* anymore, as the Exchange is then allowed to destroy its side of the
|
||||||
|
* evidence. @e end is expected to be significantly larger than @e
|
||||||
|
* expire (by a year or more).
|
||||||
|
*/
|
||||||
|
struct GNUNET_TIME_TimestampNBO end;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* The public online signing key that the exchange will use
|
||||||
|
* between @e start and @e expire.
|
||||||
|
*/
|
||||||
|
struct TALER_ExchangePublicKeyP signkey_pub;
|
||||||
|
};
|
||||||
|
|
||||||
|
GNUNET_NETWORK_STRUCT_END
|
||||||
|
|
||||||
|
|
||||||
void
|
void
|
||||||
TALER_exchange_offline_signkey_validity_sign (
|
TALER_exchange_offline_signkey_validity_sign (
|
||||||
const struct TALER_ExchangePublicKeyP *exchange_pub,
|
const struct TALER_ExchangePublicKeyP *exchange_pub,
|
||||||
@ -339,6 +402,91 @@ TALER_exchange_offline_signkey_validity_verify (
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
GNUNET_NETWORK_STRUCT_BEGIN
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Information about a denomination key. Denomination keys
|
||||||
|
* are used to sign coins of a certain value into existence.
|
||||||
|
*
|
||||||
|
* FIXME: remove this from the public API...
|
||||||
|
*/
|
||||||
|
struct TALER_DenominationKeyValidityPS
|
||||||
|
{
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Purpose is #TALER_SIGNATURE_MASTER_DENOMINATION_KEY_VALIDITY.
|
||||||
|
*/
|
||||||
|
struct GNUNET_CRYPTO_EccSignaturePurpose purpose;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* The long-term offline master key of the exchange that was
|
||||||
|
* used to create @e signature.
|
||||||
|
*
|
||||||
|
* FIXME: remove this member?
|
||||||
|
*/
|
||||||
|
struct TALER_MasterPublicKeyP master;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Start time of the validity period for this key.
|
||||||
|
*/
|
||||||
|
struct GNUNET_TIME_TimestampNBO start;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* The exchange will sign fresh coins between @e start and this time.
|
||||||
|
* @e expire_withdraw will be somewhat larger than @e start to
|
||||||
|
* ensure a sufficiently large anonymity set, while also allowing
|
||||||
|
* the Exchange to limit the financial damage in case of a key being
|
||||||
|
* compromised. Thus, exchanges with low volume are expected to have a
|
||||||
|
* longer withdraw period (@e expire_withdraw - @e start) than exchanges
|
||||||
|
* with high transaction volume. The period may also differ between
|
||||||
|
* types of coins. A exchange may also have a few denomination keys
|
||||||
|
* with the same value with overlapping validity periods, to address
|
||||||
|
* issues such as clock skew.
|
||||||
|
*/
|
||||||
|
struct GNUNET_TIME_TimestampNBO expire_withdraw;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Coins signed with the denomination key must be spent or refreshed
|
||||||
|
* between @e start and this expiration time. After this time, the
|
||||||
|
* exchange will refuse transactions involving this key as it will
|
||||||
|
* "drop" the table with double-spending information (shortly after)
|
||||||
|
* this time. Note that wallets should refresh coins significantly
|
||||||
|
* before this time to be on the safe side. @e expire_deposit must be
|
||||||
|
* significantly larger than @e expire_withdraw (by months or even
|
||||||
|
* years).
|
||||||
|
*/
|
||||||
|
struct GNUNET_TIME_TimestampNBO expire_deposit;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* When do signatures with this denomination key become invalid?
|
||||||
|
* After this point, these signatures cannot be used in (legal)
|
||||||
|
* disputes anymore, as the Exchange is then allowed to destroy its side
|
||||||
|
* of the evidence. @e expire_legal is expected to be significantly
|
||||||
|
* larger than @e expire_deposit (by a year or more).
|
||||||
|
*/
|
||||||
|
struct GNUNET_TIME_TimestampNBO expire_legal;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* The value of the coins signed with this denomination key.
|
||||||
|
*/
|
||||||
|
struct TALER_AmountNBO value;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Fees for the coin.
|
||||||
|
*/
|
||||||
|
struct TALER_DenomFeeSetNBOP fees;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Hash code of the denomination public key. (Used to avoid having
|
||||||
|
* the variable-size RSA key in this struct.)
|
||||||
|
*/
|
||||||
|
struct TALER_DenominationHashP denom_hash GNUNET_PACKED;
|
||||||
|
|
||||||
|
};
|
||||||
|
|
||||||
|
GNUNET_NETWORK_STRUCT_END
|
||||||
|
|
||||||
|
|
||||||
void
|
void
|
||||||
TALER_exchange_offline_denom_validity_sign (
|
TALER_exchange_offline_denom_validity_sign (
|
||||||
const struct TALER_DenominationHashP *h_denom_pub,
|
const struct TALER_DenominationHashP *h_denom_pub,
|
||||||
@ -412,6 +560,8 @@ TALER_exchange_offline_denom_validity_verify (
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
GNUNET_NETWORK_STRUCT_BEGIN
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @brief Signature made by the exchange offline key over the information of
|
* @brief Signature made by the exchange offline key over the information of
|
||||||
* a payto:// URI to be added to the exchange's set of active wire accounts.
|
* a payto:// URI to be added to the exchange's set of active wire accounts.
|
||||||
@ -436,6 +586,8 @@ struct TALER_MasterAddWirePS
|
|||||||
struct TALER_PaytoHashP h_payto GNUNET_PACKED;
|
struct TALER_PaytoHashP h_payto GNUNET_PACKED;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
GNUNET_NETWORK_STRUCT_END
|
||||||
|
|
||||||
|
|
||||||
void
|
void
|
||||||
TALER_exchange_offline_wire_add_sign (
|
TALER_exchange_offline_wire_add_sign (
|
||||||
@ -482,6 +634,8 @@ TALER_exchange_offline_wire_add_verify (
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
GNUNET_NETWORK_STRUCT_BEGIN
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @brief Signature made by the exchange offline key over the information of
|
* @brief Signature made by the exchange offline key over the information of
|
||||||
* a wire method to be removed to the exchange's set of active accounts.
|
* a wire method to be removed to the exchange's set of active accounts.
|
||||||
@ -507,6 +661,8 @@ struct TALER_MasterDelWirePS
|
|||||||
|
|
||||||
};
|
};
|
||||||
|
|
||||||
|
GNUNET_NETWORK_STRUCT_END
|
||||||
|
|
||||||
|
|
||||||
void
|
void
|
||||||
TALER_exchange_offline_wire_del_sign (
|
TALER_exchange_offline_wire_del_sign (
|
||||||
@ -553,6 +709,8 @@ TALER_exchange_offline_wire_del_verify (
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
GNUNET_NETWORK_STRUCT_BEGIN
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @brief Information signed by the exchange's master
|
* @brief Information signed by the exchange's master
|
||||||
* key stating the wire fee to be paid per wire transfer.
|
* key stating the wire fee to be paid per wire transfer.
|
||||||
@ -590,6 +748,8 @@ struct TALER_MasterWireFeePS
|
|||||||
|
|
||||||
};
|
};
|
||||||
|
|
||||||
|
GNUNET_NETWORK_STRUCT_END
|
||||||
|
|
||||||
|
|
||||||
void
|
void
|
||||||
TALER_exchange_offline_wire_fee_sign (
|
TALER_exchange_offline_wire_fee_sign (
|
||||||
@ -647,6 +807,8 @@ TALER_exchange_offline_wire_fee_verify (
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
GNUNET_NETWORK_STRUCT_BEGIN
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Global fees charged by the exchange independent of
|
* Global fees charged by the exchange independent of
|
||||||
* denomination or wire method.
|
* denomination or wire method.
|
||||||
@ -705,9 +867,10 @@ struct TALER_MasterGlobalFeePS
|
|||||||
*/
|
*/
|
||||||
uint32_t purse_account_limit;
|
uint32_t purse_account_limit;
|
||||||
|
|
||||||
|
|
||||||
};
|
};
|
||||||
|
|
||||||
|
GNUNET_NETWORK_STRUCT_END
|
||||||
|
|
||||||
|
|
||||||
void
|
void
|
||||||
TALER_exchange_offline_global_fee_sign (
|
TALER_exchange_offline_global_fee_sign (
|
||||||
@ -773,6 +936,8 @@ TALER_exchange_offline_global_fee_verify (
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
GNUNET_NETWORK_STRUCT_BEGIN
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @brief Signature made by the exchange offline key over the
|
* @brief Signature made by the exchange offline key over the
|
||||||
* configuration of an extension.
|
* configuration of an extension.
|
||||||
@ -791,6 +956,8 @@ struct TALER_MasterExtensionConfigurationPS
|
|||||||
struct TALER_ExtensionConfigHashP h_config GNUNET_PACKED;
|
struct TALER_ExtensionConfigHashP h_config GNUNET_PACKED;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
GNUNET_NETWORK_STRUCT_END
|
||||||
|
|
||||||
|
|
||||||
void
|
void
|
||||||
TALER_exchange_offline_extension_config_hash_sign (
|
TALER_exchange_offline_extension_config_hash_sign (
|
||||||
@ -829,6 +996,8 @@ TALER_exchange_offline_extension_config_hash_verify (
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
GNUNET_NETWORK_STRUCT_BEGIN
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @brief Information signed by the exchange's master
|
* @brief Information signed by the exchange's master
|
||||||
* key affirming the IBAN details for the exchange.
|
* key affirming the IBAN details for the exchange.
|
||||||
@ -848,6 +1017,8 @@ struct TALER_MasterWireDetailsPS
|
|||||||
|
|
||||||
};
|
};
|
||||||
|
|
||||||
|
GNUNET_NETWORK_STRUCT_END
|
||||||
|
|
||||||
|
|
||||||
enum GNUNET_GenericReturnValue
|
enum GNUNET_GenericReturnValue
|
||||||
TALER_exchange_wire_signature_check (
|
TALER_exchange_wire_signature_check (
|
||||||
@ -888,6 +1059,8 @@ TALER_exchange_wire_signature_make (
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
GNUNET_NETWORK_STRUCT_BEGIN
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Message signed by account to merge a purse into a reserve.
|
* Message signed by account to merge a purse into a reserve.
|
||||||
*/
|
*/
|
||||||
@ -906,6 +1079,8 @@ struct TALER_PartnerConfigurationPS
|
|||||||
struct GNUNET_HashCode h_url;
|
struct GNUNET_HashCode h_url;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
GNUNET_NETWORK_STRUCT_END
|
||||||
|
|
||||||
|
|
||||||
void
|
void
|
||||||
TALER_exchange_offline_partner_details_sign (
|
TALER_exchange_offline_partner_details_sign (
|
||||||
|
Loading…
Reference in New Issue
Block a user