-more work on p2p payments and tests thereof

This commit is contained in:
Christian Grothoff 2022-06-04 21:59:55 +02:00
parent 6512456dc2
commit a17781ba8d
No known key found for this signature in database
GPG Key ID: 939E6BE1E29FC3CC
13 changed files with 349 additions and 89 deletions

View File

@ -226,19 +226,20 @@ merge_transaction (void *cls,
bool no_kyc = true;
bool no_reserve = true;
// FIXME: add KYC-check logic!
qs = TEH_plugin->do_purse_merge (TEH_plugin->cls,
pcc->purse_pub,
&pcc->merge_sig,
pcc->merge_timestamp,
&pcc->reserve_sig,
pcc->provider_url,
&pcc->reserve_pub,
&no_partner,
&no_balance,
&no_reserve,
&no_kyc,
&in_conflict);
qs = TEH_plugin->do_purse_merge (
TEH_plugin->cls,
pcc->purse_pub,
&pcc->merge_sig,
pcc->merge_timestamp,
&pcc->reserve_sig,
pcc->provider_url,
&pcc->reserve_pub,
TEH_KYC_NONE != TEH_kyc_config.mode,
&no_partner,
&no_balance,
&no_reserve,
&no_kyc,
&in_conflict);
if (qs < 0)
{
if (GNUNET_DB_STATUS_SOFT_ERROR == qs)
@ -270,7 +271,8 @@ merge_transaction (void *cls,
NULL);
return GNUNET_DB_STATUS_HARD_ERROR;
}
if (no_kyc)
if ( (no_kyc) &&
(TEH_KYC_NONE != TEH_kyc_config.mode) )
{
*mhd_ret
= TALER_MHD_REPLY_JSON_PACK (

View File

@ -301,6 +301,9 @@ purse_transaction (void *cls,
bool no_reserve = true;
bool no_kyc = true;
GNUNET_log (GNUNET_ERROR_TYPE_INFO,
"Creating purse with flags %d\n",
rpc->flags);
qs = TEH_plugin->do_reserve_purse (
TEH_plugin->cls,
&rpc->purse_pub,
@ -312,6 +315,7 @@ purse_transaction (void *cls,
? NULL
: &rpc->gf->fees.purse,
rpc->reserve_pub,
TEH_KYC_NONE != TEH_kyc_config.mode,
&in_conflict,
&no_reserve,
&no_kyc,
@ -387,7 +391,8 @@ purse_transaction (void *cls,
TALER_EC_EXCHANGE_GENERIC_RESERVE_UNKNOWN));
return GNUNET_DB_STATUS_HARD_ERROR;
}
if (no_kyc)
if ( (no_kyc) &&
(TEH_KYC_NONE != TEH_kyc_config.mode) )
{
*mhd_ret
= TALER_MHD_REPLY_JSON_PACK (

View File

@ -3090,6 +3090,7 @@ CREATE OR REPLACE FUNCTION exchange_do_purse_merge(
IN in_reserve_sig BYTEA,
IN in_partner_url VARCHAR,
IN in_reserve_pub BYTEA,
IN in_require_kyc BOOLEAN,
OUT out_no_partner BOOLEAN,
OUT out_no_balance BOOLEAN,
OUT out_no_kyc BOOLEAN,
@ -3197,7 +3198,8 @@ out_conflict=FALSE;
ASSERT NOT my_finished, 'internal invariant failed';
IF in_partner_url IS NULL
IF ( (in_partner_url IS NULL) AND
(in_require_kyc) )
THEN
-- Need to do KYC check.
SELECT NOT kyc_passed
@ -3272,7 +3274,7 @@ RETURN;
END $$;
COMMENT ON FUNCTION exchange_do_purse_merge(BYTEA, BYTEA, INT8, BYTEA, VARCHAR, BYTEA)
COMMENT ON FUNCTION exchange_do_purse_merge(BYTEA, BYTEA, INT8, BYTEA, VARCHAR, BYTEA, BOOLEAN)
IS 'Checks that the partner exists, the purse has not been merged with a different reserve and that the purse is full. If so, persists the merge data and either merges the purse with the reserve or marks it as ready for the taler-exchange-router. Caller MUST abort the transaction on failures so as to not persist data by accident.';
@ -3285,6 +3287,7 @@ CREATE OR REPLACE FUNCTION exchange_do_reserve_purse(
IN in_purse_fee_val INT8,
IN in_purse_fee_frac INT4,
IN in_reserve_pub BYTEA,
IN in_require_kyc BOOLEAN,
OUT out_no_funds BOOLEAN,
OUT out_no_kyc BOOLEAN,
OUT out_no_reserve BOOLEAN,
@ -3350,7 +3353,7 @@ THEN
END IF;
out_no_reserve=FALSE;
IF (out_no_kyc)
IF (out_no_kyc AND in_require_kyc)
THEN
out_no_funds=FALSE;
RETURN;
@ -3412,6 +3415,12 @@ INSERT INTO account_merges
END $$;
COMMENT ON FUNCTION exchange_do_reserve_purse(BYTEA, BYTEA, INT8, BYTEA, BOOLEAN, INT8, INT4, BYTEA, BOOLEAN)
IS 'Create a purse for a reserve.';
CREATE OR REPLACE FUNCTION exchange_do_account_merge(

View File

@ -3977,8 +3977,8 @@ prepare_statements (struct PostgresClosure *pg)
",out_no_reserve AS no_reserve"
",out_conflict AS conflict"
" FROM exchange_do_purse_merge"
" ($1, $2, $3, $4, $5, $6);",
6),
" ($1, $2, $3, $4, $5, $6, $7);",
7),
/* Used in #postgres_do_reserve_purse() */
GNUNET_PQ_make_prepare (
"call_reserve_purse",
@ -3988,8 +3988,8 @@ prepare_statements (struct PostgresClosure *pg)
",out_no_kyc AS no_kyc"
",out_conflict AS conflict"
" FROM exchange_do_reserve_purse"
" ($1, $2, $3, $4, $5, $6, $7, $8);",
8),
" ($1, $2, $3, $4, $5, $6, $7, $8, $9);",
9),
/* Used in #postgres_select_purse_merge */
GNUNET_PQ_make_prepare (
"select_purse_merge",
@ -14492,6 +14492,7 @@ postgres_get_purse_deposit (
* @param reserve_sig signature of the reserve affirming the merge
* @param partner_url URL of the partner exchange, can be NULL if the reserves lives with us
* @param reserve_pub public key of the reserve to credit
* @param require_kyc true if we should check for KYC
* @param[out] no_partner set to true if @a partner_url is unknown
* @param[out] no_balance set to true if the @a purse_pub is not paid up yet
* @param[out] no_reserve set to true if the @a reserve_pub is not known
@ -14508,6 +14509,7 @@ postgres_do_purse_merge (
const struct TALER_ReserveSignatureP *reserve_sig,
const char *partner_url,
const struct TALER_ReservePublicKeyP *reserve_pub,
bool require_kyc,
bool *no_partner,
bool *no_balance,
bool *no_reserve,
@ -14524,6 +14526,7 @@ postgres_do_purse_merge (
? GNUNET_PQ_query_param_null ()
: GNUNET_PQ_query_param_string (partner_url),
GNUNET_PQ_query_param_auto_from_type (reserve_pub),
GNUNET_PQ_query_param_bool (require_kyc),
GNUNET_PQ_query_param_end
};
struct GNUNET_PQ_ResultSpec rs[] = {
@ -14559,7 +14562,10 @@ postgres_do_purse_merge (
* @param reserve_sig signature of the reserve affirming the merge
* @param purse_fee amount to charge the reserve for the purse creation, NULL to use the quota
* @param reserve_pub public key of the reserve to credit
* @param require_kyc true if we should check for KYC
* @param[out] in_conflict set to true if @a purse_pub was merged into a different reserve already
* @param[out] no_reserve set to true if @a reserve_pub is not a known reserve
* @param[out] no_kyc set to true if @a reserve_pub has not passed KYC checks
* @param[out] insufficient_funds set to true if @a reserve_pub has insufficient capacity to create another purse
* @return transaction status code
*/
@ -14572,6 +14578,7 @@ postgres_do_reserve_purse (
const struct TALER_ReserveSignatureP *reserve_sig,
const struct TALER_Amount *purse_fee,
const struct TALER_ReservePublicKeyP *reserve_pub,
bool require_kyc,
bool *in_conflict,
bool *no_reserve,
bool *no_kyc,
@ -14589,6 +14596,7 @@ postgres_do_reserve_purse (
? &zero_fee
: purse_fee),
GNUNET_PQ_query_param_auto_from_type (reserve_pub),
GNUNET_PQ_query_param_bool (require_kyc),
GNUNET_PQ_query_param_end
};
struct GNUNET_PQ_ResultSpec rs[] = {

View File

@ -2839,6 +2839,23 @@ TALER_wallet_econtract_upload_verify (
const struct TALER_PurseContractSignatureP *purse_sig);
/**
* Verify a signature over encrypted contract.
*
* @param h_econtract hashed encrypted contract
* @param contract_pub public key for the DH-encryption
* @param purse_pub purses public key
* @param purse_sig the signature made with purpose #TALER_SIGNATURE_WALLET_PURSE_CREATE
* @return #GNUNET_OK if the signature is valid
*/
enum GNUNET_GenericReturnValue
TALER_wallet_econtract_upload_verify2 (
const struct GNUNET_HashCode *h_econtract,
const struct TALER_ContractDiffiePublicP *contract_pub,
const struct TALER_PurseContractPublicKeyP *purse_pub,
const struct TALER_PurseContractSignatureP *purse_sig);
/**
* Sign a request to inquire about a purse's status.
*

View File

@ -5037,6 +5037,7 @@ struct TALER_EXCHANGEDB_Plugin
* @param reserve_sig signature of the reserve affirming the merge
* @param partner_url URL of the partner exchange, can be NULL if the reserves lives with us
* @param reserve_pub public key of the reserve to credit
* @param require_kyc true if we should check for KYC
* @param[out] no_partner set to true if @a partner_url is unknown
* @param[out] no_balance set to true if the @a purse_pub is not paid up yet
* @param[out] no_reserve set to true if the @a reserve_pub is not known
@ -5053,6 +5054,7 @@ struct TALER_EXCHANGEDB_Plugin
const struct TALER_ReserveSignatureP *reserve_sig,
const char *partner_url,
const struct TALER_ReservePublicKeyP *reserve_pub,
bool require_kyc,
bool *no_partner,
bool *no_balance,
bool *no_reserve,
@ -5072,6 +5074,7 @@ struct TALER_EXCHANGEDB_Plugin
* @param reserve_sig signature of the reserve affirming the merge
* @param purse_fee amount to charge the reserve for the purse creation, NULL to use the quota
* @param reserve_pub public key of the reserve to credit
* @param require_kyc true if we should check for KYC
* @param[out] in_conflict set to true if @a purse_pub was merged into a different reserve already
* @param[out] no_reserve set to true if @a reserve_pub is not a known reserve
* @param[out] no_kyc set to true if @a reserve_pub has not passed KYC checks
@ -5087,6 +5090,7 @@ struct TALER_EXCHANGEDB_Plugin
const struct TALER_ReserveSignatureP *reserve_sig,
const struct TALER_Amount *purse_fee,
const struct TALER_ReservePublicKeyP *reserve_pub,
bool require_kyc,
bool *in_conflict,
bool *no_reserve,
bool *no_kyc,

View File

@ -398,6 +398,7 @@ parse_merge (struct TALER_EXCHANGE_ReserveHistoryEntry *rh,
const json_t *transaction)
{
uint32_t flags32;
struct TALER_Amount total;
struct GNUNET_JSON_Specification merge_spec[] = {
GNUNET_JSON_spec_fixed_auto ("h_contract_terms",
&rh->details.merge_details.h_contract_terms),
@ -433,13 +434,21 @@ parse_merge (struct TALER_EXCHANGE_ReserveHistoryEntry *rh,
}
rh->details.merge_details.flags =
(enum TALER_WalletAccountMergeFlags) flags32;
if (0 >
TALER_amount_add (&total,
&rh->amount,
&rh->details.merge_details.purse_fee))
{
GNUNET_break_op (0);
return GNUNET_SYSERR;
}
if (GNUNET_OK !=
TALER_wallet_account_merge_verify (
rh->details.merge_details.merge_timestamp,
&rh->details.merge_details.purse_pub,
rh->details.merge_details.purse_expiration,
&rh->details.merge_details.h_contract_terms,
&rh->amount,
&total,
&rh->details.merge_details.purse_fee,
rh->details.merge_details.min_age,
rh->details.merge_details.flags,

View File

@ -85,11 +85,31 @@ struct TALER_EXCHANGE_PurseCreateMergeHandle
*/
struct TALER_ReserveSignatureP reserve_sig;
/**
* Merge capability key.
*/
struct TALER_PurseMergePublicKeyP merge_pub;
/**
* Our merge signature (if any).
*/
struct TALER_PurseMergeSignatureP merge_sig;
/**
* Our contract signature (if any).
*/
struct TALER_PurseContractSignatureP contract_sig;
/**
* Public key of the purse.
*/
struct TALER_PurseContractPublicKeyP purse_pub;
/**
* Request data we signed over.
*/
struct TALER_PurseContractSignatureP purse_sig;
/**
* Hash over the purse's contrac terms.
*/
@ -136,13 +156,14 @@ handle_purse_create_with_merge_finished (void *cls,
break;
case MHD_HTTP_OK:
{
#if FIXME
const struct TALER_EXCHANGE_Keys *key_state;
struct GNUNET_TIME_Timestamp etime;
struct TALER_Amount total_deposited;
struct TALER_ExchangeSignatureP exchange_sig;
struct TALER_ExchangePublicKeyP exchange_pub;
struct GNUNET_JSON_Specification spec[] = {
TALER_JSON_spec_amount_any ("total_deposited",
&total_deposited),
GNUNET_JSON_spec_fixed_auto ("exchange_sig",
&exchange_sig),
GNUNET_JSON_spec_fixed_auto ("exchange_pub",
@ -169,29 +190,25 @@ handle_purse_create_with_merge_finished (void *cls,
{
GNUNET_break_op (0);
dr.hr.http_status = 0;
dr.hr.ec =
TALER_EC_EXCHANGE_PURSE_CREATE_WITH_MERGE_EXCHANGE_SIGNATURE_INVALID;
dr.hr.ec = TALER_EC_GENERIC_REPLY_MALFORMED;
break;
}
if (GNUNET_OK !=
TALER_exchange_online_purse_create_with_merged_verify (
TALER_exchange_online_purse_created_verify (
etime,
pcm->purse_expiration,
&pcm->purse_value_after_fees,
&total_deposited,
&pcm->purse_pub,
&pcm->h_contract_terms,
&pcm->reserve_pub,
pcm->provider_url,
&exchange_pub,
&exchange_sig))
{
GNUNET_break_op (0);
dr.hr.http_status = 0;
dr.hr.ec =
TALER_EC_EXCHANGE_PURSE_CREATE_WITH_MERGE_EXCHANGE_SIGNATURE_INVALID;
dr.hr.ec = TALER_EC_GENERIC_REPLY_MALFORMED;
break;
}
#endif
}
break;
case MHD_HTTP_BAD_REQUEST:
@ -214,7 +231,184 @@ handle_purse_create_with_merge_finished (void *cls,
happen, we should pass the JSON reply to the application */
break;
case MHD_HTTP_CONFLICT:
// FIXME: check reply!
dr.hr.ec = TALER_JSON_get_error_code (j);
switch (dr.hr.ec)
{
case TALER_EC_EXCHANGE_RESERVES_PURSE_CREATE_CONFLICTING_META_DATA:
{
struct TALER_Amount amount;
uint32_t min_age;
struct GNUNET_TIME_Timestamp purse_expiration;
struct TALER_PurseContractSignatureP purse_sig;
struct TALER_PrivateContractHashP h_contract_terms;
struct TALER_PurseMergePublicKeyP merge_pub;
struct GNUNET_JSON_Specification spec[] = {
TALER_JSON_spec_amount_any ("amount",
&amount),
GNUNET_JSON_spec_uint32 ("min_age",
&min_age),
GNUNET_JSON_spec_timestamp ("purse_expiration",
&purse_expiration),
GNUNET_JSON_spec_fixed_auto ("purse_sig",
&purse_sig),
GNUNET_JSON_spec_fixed_auto ("h_contract_terms",
&h_contract_terms),
GNUNET_JSON_spec_fixed_auto ("merge_pub",
&merge_pub),
GNUNET_JSON_spec_end ()
};
if (GNUNET_OK !=
GNUNET_JSON_parse (j,
spec,
NULL, NULL))
{
GNUNET_break_op (0);
dr.hr.http_status = 0;
dr.hr.ec = TALER_EC_GENERIC_REPLY_MALFORMED;
break;
}
if (GNUNET_OK !=
TALER_wallet_purse_create_verify (purse_expiration,
&h_contract_terms,
&merge_pub,
min_age,
&amount,
&pcm->purse_pub,
&purse_sig))
{
GNUNET_break_op (0);
dr.hr.http_status = 0;
dr.hr.ec = TALER_EC_GENERIC_REPLY_MALFORMED;
break;
}
if (0 ==
GNUNET_memcmp (&purse_sig,
&pcm->purse_sig))
{
/* Must be the SAME data, not a conflict! */
GNUNET_break_op (0);
dr.hr.http_status = 0;
dr.hr.ec = TALER_EC_GENERIC_REPLY_MALFORMED;
break;
}
break;
}
case TALER_EC_EXCHANGE_RESERVES_PURSE_MERGE_CONFLICTING_META_DATA:
{
struct TALER_PurseMergeSignatureP merge_sig;
struct GNUNET_TIME_Timestamp merge_timestamp;
const char *partner_url = pcm->exchange->url;
struct TALER_ReservePublicKeyP reserve_pub;
struct GNUNET_JSON_Specification spec[] = {
GNUNET_JSON_spec_mark_optional (
GNUNET_JSON_spec_string ("partner_url",
&partner_url),
NULL),
GNUNET_JSON_spec_timestamp ("merge_timestamp",
&merge_timestamp),
GNUNET_JSON_spec_fixed_auto ("merge_sig",
&merge_sig),
GNUNET_JSON_spec_fixed_auto ("reserve_pub",
&reserve_pub),
GNUNET_JSON_spec_end ()
};
if (GNUNET_OK !=
GNUNET_JSON_parse (j,
spec,
NULL, NULL))
{
GNUNET_break_op (0);
dr.hr.http_status = 0;
dr.hr.ec = TALER_EC_GENERIC_REPLY_MALFORMED;
break;
}
if (GNUNET_OK !=
TALER_wallet_purse_merge_verify (
partner_url,
merge_timestamp,
&pcm->purse_pub,
&pcm->merge_pub,
&merge_sig))
{
GNUNET_break_op (0);
dr.hr.http_status = 0;
dr.hr.ec = TALER_EC_GENERIC_REPLY_MALFORMED;
break;
}
if (0 ==
GNUNET_memcmp (&merge_sig,
&pcm->merge_sig))
{
/* Must be the SAME data, not a conflict! */
GNUNET_break_op (0);
dr.hr.http_status = 0;
dr.hr.ec = TALER_EC_GENERIC_REPLY_MALFORMED;
break;
}
}
break;
case TALER_EC_EXCHANGE_RESERVES_PURSE_CREATE_INSUFFICIENT_FUNDS:
/* nothing to verify */
break;
case TALER_EC_EXCHANGE_PURSE_ECONTRACT_CONFLICTING_META_DATA:
{
struct TALER_ContractDiffiePublicP pub_ckey;
struct TALER_PurseContractSignatureP contract_sig;
struct GNUNET_HashCode h_econtract;
struct GNUNET_JSON_Specification spec[] = {
GNUNET_JSON_spec_fixed_auto ("h_econtract",
&h_econtract),
GNUNET_JSON_spec_fixed_auto ("econtract_sig",
&contract_sig),
GNUNET_JSON_spec_fixed_auto ("pub_ckey",
&pub_ckey),
GNUNET_JSON_spec_end ()
};
if (GNUNET_OK !=
GNUNET_JSON_parse (j,
spec,
NULL, NULL))
{
GNUNET_break_op (0);
dr.hr.http_status = 0;
dr.hr.ec = TALER_EC_GENERIC_REPLY_MALFORMED;
break;
}
if (GNUNET_OK !=
TALER_wallet_econtract_upload_verify2 (
&h_econtract,
&pub_ckey,
&pcm->purse_pub,
&contract_sig))
{
GNUNET_break_op (0);
dr.hr.http_status = 0;
dr.hr.ec = TALER_EC_GENERIC_REPLY_MALFORMED;
break;
}
if (0 ==
GNUNET_memcmp (&contract_sig,
&pcm->contract_sig))
{
/* Must be the SAME data, not a conflict! */
GNUNET_break_op (0);
dr.hr.http_status = 0;
dr.hr.ec = TALER_EC_GENERIC_REPLY_MALFORMED;
break;
}
break;
}
default:
/* unexpected EC! */
GNUNET_break_op (0);
dr.hr.http_status = 0;
dr.hr.ec = TALER_EC_GENERIC_REPLY_MALFORMED;
break;
} /* end inner (EC) switch */
break;
case MHD_HTTP_GONE:
/* could happen if denomination was revoked */
@ -272,11 +466,7 @@ TALER_EXCHANGE_purse_create_with_merge (
CURL *eh;
char arg_str[sizeof (pcm->reserve_pub) * 2 + 32];
uint32_t min_age = 0;
struct TALER_PurseMergePublicKeyP merge_pub;
struct TALER_PurseMergeSignatureP merge_sig;
struct TALER_ContractDiffiePublicP contract_pub;
struct TALER_PurseContractSignatureP contract_sig;
struct TALER_PurseContractSignatureP purse_sig;
void *econtract = NULL;
size_t econtract_size = 0;
struct TALER_Amount purse_fee;
@ -301,7 +491,7 @@ TALER_EXCHANGE_purse_create_with_merge (
GNUNET_CRYPTO_eddsa_key_get_public (&reserve_priv->eddsa_priv,
&pcm->reserve_pub.eddsa_pub);
GNUNET_CRYPTO_eddsa_key_get_public (&merge_priv->eddsa_priv,
&merge_pub.eddsa_pub);
&pcm->merge_pub.eddsa_pub);
GNUNET_CRYPTO_ecdhe_key_get_public (&contract_priv->ecdhe_priv,
&contract_pub.ecdhe_pub);
@ -372,16 +562,16 @@ TALER_EXCHANGE_purse_create_with_merge (
}
TALER_wallet_purse_create_sign (pcm->purse_expiration,
&pcm->h_contract_terms,
&merge_pub,
&pcm->merge_pub,
min_age,
&pcm->purse_value_after_fees,
purse_priv,
&purse_sig);
&pcm->purse_sig);
TALER_wallet_purse_merge_sign (exchange->url,
merge_timestamp,
&pcm->purse_pub,
merge_priv,
&merge_sig);
&pcm->merge_sig);
TALER_wallet_account_merge_sign (merge_timestamp,
&pcm->purse_pub,
pcm->purse_expiration,
@ -405,7 +595,7 @@ TALER_EXCHANGE_purse_create_with_merge (
econtract_size,
&contract_pub,
purse_priv,
&contract_sig);
&pcm->contract_sig);
}
create_with_merge_obj = GNUNET_JSON_PACK (
TALER_JSON_pack_amount ("purse_value",
@ -419,7 +609,7 @@ TALER_EXCHANGE_purse_create_with_merge (
GNUNET_JSON_pack_allow_null (
upload_contract
? GNUNET_JSON_pack_data_auto ("econtract_sig",
&contract_sig)
&pcm->contract_sig)
: GNUNET_JSON_pack_string ("dummy",
NULL)),
GNUNET_JSON_pack_allow_null (
@ -435,15 +625,15 @@ TALER_EXCHANGE_purse_create_with_merge (
: GNUNET_JSON_pack_string ("dummy2",
NULL)),
GNUNET_JSON_pack_data_auto ("merge_pub",
&merge_pub),
&pcm->merge_pub),
GNUNET_JSON_pack_data_auto ("merge_sig",
&merge_sig),
&pcm->merge_sig),
GNUNET_JSON_pack_data_auto ("reserve_sig",
&pcm->reserve_sig),
GNUNET_JSON_pack_data_auto ("purse_pub",
&pcm->purse_pub),
GNUNET_JSON_pack_data_auto ("purse_sig",
&purse_sig),
&pcm->purse_sig),
GNUNET_JSON_pack_data_auto ("h_contract_terms",
&pcm->h_contract_terms),
GNUNET_JSON_pack_timestamp ("merge_timestamp",

View File

@ -127,10 +127,6 @@ libtalertesting_la_LIBADD = \
AM_TESTS_ENVIRONMENT=export TALER_PREFIX=$${TALER_PREFIX:-@libdir@};export PATH=$${TALER_PREFIX:-@prefix@}/bin:$$PATH;
noinst_PROGRAMS = \
test_exchange_p2p_cs \
test_exchange_p2p_rsa
.NOTPARALLEL:
check_PROGRAMS = \
@ -152,7 +148,9 @@ check_PROGRAMS = \
test_exchange_management_api_rsa \
test_kyc_api \
test_taler_exchange_aggregator-postgres \
test_taler_exchange_wirewatch-postgres
test_taler_exchange_wirewatch-postgres \
test_exchange_p2p_cs \
test_exchange_p2p_rsa
if HAVE_TWISTER
check_PROGRAMS += \
test_exchange_api_twisted_cs \

View File

@ -116,16 +116,16 @@ run (void *cls,
* Move money to the exchange's bank account.
*/
CMD_TRANSFER_TO_EXCHANGE ("create-reserve-1",
"EUR:5.01"),
"EUR:5.04"),
CMD_TRANSFER_TO_EXCHANGE ("create-reserve-2",
"EUR:5.01"),
TALER_TESTING_cmd_reserve_poll ("poll-reserve-1",
"create-reserve-1",
"EUR:5.01",
"EUR:5.04",
GNUNET_TIME_UNIT_MINUTES,
MHD_HTTP_OK),
TALER_TESTING_cmd_check_bank_admin_transfer ("check-create-reserve-1",
"EUR:5.01",
"EUR:5.04",
bc.user42_payto,
bc.exchange_payto,
"create-reserve-1"),
@ -155,7 +155,7 @@ run (void *cls,
*/
TALER_TESTING_cmd_status ("status-1",
"create-reserve-1",
"EUR:0",
"EUR:0.03",
MHD_HTTP_OK),
TALER_TESTING_cmd_end ()
};
@ -195,13 +195,13 @@ run (void *cls,
TALER_TESTING_cmd_status (
"push-check-post-merge-reserve-balance-get",
"create-reserve-1",
"EUR:1",
"EUR:1.03",
MHD_HTTP_OK),
/* POST history doesn't yet support P2P transfers */
TALER_TESTING_cmd_reserve_status (
"push-check-post-merge-reserve-balance-post",
"create-reserve-1",
"EUR:1",
"EUR:1.03",
MHD_HTTP_OK),
/* Test conflicting merge */
TALER_TESTING_cmd_purse_merge (
@ -249,13 +249,13 @@ run (void *cls,
TALER_TESTING_cmd_status (
"pull-check-post-merge-reserve-balance-get",
"create-reserve-1",
"EUR:2",
"EUR:2.02",
MHD_HTTP_OK),
/* POST history doesn't yet support P2P transfers */
TALER_TESTING_cmd_reserve_status (
"push-check-post-merge-reserve-balance-post",
"create-reserve-1",
"EUR:2",
"EUR:2.02",
MHD_HTTP_OK),
/* create 2nd purse for a deposit conflict */
TALER_TESTING_cmd_purse_create_with_reserve (

View File

@ -201,9 +201,6 @@ deposit_cb (void *cls,
/* Deposits complete, create trait! */
ds->reserve_history.type = TALER_EXCHANGE_RTT_MERGE;
ds->reserve_history.amount
= dr->details.success.purse_value_after_fees;
#if 0
{
const struct TALER_EXCHANGE_Keys *keys;
const struct TALER_EXCHANGE_GlobalFee *gf;
@ -213,12 +210,26 @@ deposit_cb (void *cls,
gf = TALER_EXCHANGE_get_global_fee (keys,
*merge_timestamp);
GNUNET_assert (NULL != gf);
/* Note: change when flags below changes! */
if (true)
{
/* If we paid a purse fee, we need to subtract the
purse fee from the reserve history amount */
TALER_amount_subtract (&ds->reserve_history.amount,
&dr->details.success.purse_value_after_fees,
&gf->fees.purse);
ds->reserve_history.details.merge_details.purse_fee = gf->fees.purse;
}
else
{
ds->reserve_history.amount
= dr->details.success.purse_value_after_fees;
TALER_amount_set_zero (
ds->reserve_history.amount.currency,
&ds->reserve_history.details.merge_details.purse_fee);
}
}
#endif
/* Note: change when flags below changes! */
TALER_amount_set_zero (
ds->reserve_history.amount.currency,
&ds->reserve_history.details.merge_details.purse_fee);
ds->reserve_history.details.merge_details.h_contract_terms
= dr->details.success.h_contract_terms;
ds->reserve_history.details.merge_details.merge_pub
@ -234,7 +245,7 @@ deposit_cb (void *cls,
ds->reserve_history.details.merge_details.min_age
= ds->min_age;
ds->reserve_history.details.merge_details.flags
= TALER_WAMF_MODE_CREATE_FROM_PURSE_QUOTA;
= TALER_WAMF_MODE_CREATE_WITH_PURSE_FEE;
ds->purse_complete = true;
}
}

View File

@ -208,7 +208,7 @@ purse_run (void *cls,
&ds->contract_priv,
ds->contract_terms,
true /* upload contract */,
false /* do not pay purse fee -- FIXME: make this a choice to test this case; then update testing_api_cmd_purse_deposit flags logic to match! */,
true /* do pay purse fee -- FIXME: make this a choice to test this case; then update testing_api_cmd_purse_deposit flags logic to match! */,
ds->merge_timestamp,
&purse_cb,
ds);

View File

@ -1248,16 +1248,27 @@ TALER_wallet_econtract_upload_sign (
}
/**
* Verify a signature over encrypted contract.
*
* @param econtract encrypted contract
* @param econtract_size number of bytes in @a econtract
* @param contract_pub public key for the DH-encryption
* @param purse_pub purses public key
* @param purse_sig the signature made with purpose #TALER_SIGNATURE_WALLET_PURSE_CREATE
* @return #GNUNET_OK if the signature is valid
*/
enum GNUNET_GenericReturnValue
TALER_wallet_econtract_upload_verify2 (
const struct GNUNET_HashCode *h_econtract,
const struct TALER_ContractDiffiePublicP *contract_pub,
const struct TALER_PurseContractPublicKeyP *purse_pub,
const struct TALER_PurseContractSignatureP *purse_sig)
{
struct TALER_PurseContractPS pc = {
.purpose.size = htonl (sizeof (pc)),
.purpose.purpose = htonl (TALER_SIGNATURE_WALLET_PURSE_ECONTRACT),
.contract_pub = *contract_pub,
.h_econtract = *h_econtract
};
return GNUNET_CRYPTO_eddsa_verify_ (TALER_SIGNATURE_WALLET_PURSE_ECONTRACT,
&pc.purpose,
&purse_sig->eddsa_signature,
&purse_pub->eddsa_pub);
}
enum GNUNET_GenericReturnValue
TALER_wallet_econtract_upload_verify (
const void *econtract,
@ -1266,19 +1277,15 @@ TALER_wallet_econtract_upload_verify (
const struct TALER_PurseContractPublicKeyP *purse_pub,
const struct TALER_PurseContractSignatureP *purse_sig)
{
struct TALER_PurseContractPS pc = {
.purpose.size = htonl (sizeof (pc)),
.purpose.purpose = htonl (TALER_SIGNATURE_WALLET_PURSE_ECONTRACT),
.contract_pub = *contract_pub
};
struct GNUNET_HashCode h_econtract;
GNUNET_CRYPTO_hash (econtract,
econtract_size,
&pc.h_econtract);
return GNUNET_CRYPTO_eddsa_verify_ (TALER_SIGNATURE_WALLET_PURSE_ECONTRACT,
&pc.purpose,
&purse_sig->eddsa_signature,
&purse_pub->eddsa_pub);
&h_econtract);
return TALER_wallet_econtract_upload_verify2 (&h_econtract,
contract_pub,
purse_pub,
purse_sig);
}