diff options
Diffstat (limited to 'src/exchangedb/test_exchangedb.c')
-rw-r--r-- | src/exchangedb/test_exchangedb.c | 573 |
1 files changed, 323 insertions, 250 deletions
diff --git a/src/exchangedb/test_exchangedb.c b/src/exchangedb/test_exchangedb.c index db46aeae8..22788a562 100644 --- a/src/exchangedb/test_exchangedb.c +++ b/src/exchangedb/test_exchangedb.c @@ -1,6 +1,6 @@ /* This file is part of TALER - Copyright (C) 2014-2022 Taler Systems SA + Copyright (C) 2014-2023 Taler Systems SA TALER is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software @@ -33,9 +33,9 @@ static int result; /** * Report line of error if @a cond is true, and jump to label "drop". */ -#define FAILIF(cond) \ +#define FAILIF(cond) \ do { \ - if (! (cond)) { break;} \ + if (! (cond)) { break;} \ GNUNET_break (0); \ goto drop; \ } while (0) @@ -45,7 +45,8 @@ static int result; * Initializes @a ptr with random data. */ #define RND_BLK(ptr) \ - GNUNET_CRYPTO_random_block (GNUNET_CRYPTO_QUALITY_WEAK, ptr, sizeof (*ptr)) + GNUNET_CRYPTO_random_block (GNUNET_CRYPTO_QUALITY_WEAK, ptr, \ + sizeof (*ptr)) /** * Initializes @a ptr with zeros. @@ -112,53 +113,53 @@ mark_prepare_cb (void *cls, * Simple check that config retrieval and setting for extensions work */ static enum GNUNET_GenericReturnValue -test_extension_config (void) +test_extension_manifest (void) { - char *config; + char *manifest; FAILIF (GNUNET_DB_STATUS_SUCCESS_NO_RESULTS != - plugin->get_extension_config (plugin->cls, - "fnord", - &config)); + plugin->get_extension_manifest (plugin->cls, + "fnord", + &manifest)); FAILIF (GNUNET_DB_STATUS_SUCCESS_ONE_RESULT != - plugin->set_extension_config (plugin->cls, - "fnord", - "bar")); + plugin->set_extension_manifest (plugin->cls, + "fnord", + "bar")); FAILIF (GNUNET_DB_STATUS_SUCCESS_ONE_RESULT != - plugin->get_extension_config (plugin->cls, - "fnord", - &config)); + plugin->get_extension_manifest (plugin->cls, + "fnord", + &manifest)); - FAILIF (0 != strcmp ("bar", config)); - GNUNET_free (config); + FAILIF (0 != strcmp ("bar", manifest)); + GNUNET_free (manifest); /* let's do this again! */ FAILIF (GNUNET_DB_STATUS_SUCCESS_ONE_RESULT != - plugin->set_extension_config (plugin->cls, - "fnord", - "buzz")); + plugin->set_extension_manifest (plugin->cls, + "fnord", + "buzz")); FAILIF (GNUNET_DB_STATUS_SUCCESS_ONE_RESULT != - plugin->get_extension_config (plugin->cls, - "fnord", - &config)); + plugin->get_extension_manifest (plugin->cls, + "fnord", + &manifest)); - FAILIF (0 != strcmp ("buzz", config)); - GNUNET_free (config); + FAILIF (0 != strcmp ("buzz", manifest)); + GNUNET_free (manifest); /* let's do this again, with NULL */ FAILIF (GNUNET_DB_STATUS_SUCCESS_ONE_RESULT != - plugin->set_extension_config (plugin->cls, - "fnord", - NULL)); + plugin->set_extension_manifest (plugin->cls, + "fnord", + NULL)); FAILIF (GNUNET_DB_STATUS_SUCCESS_ONE_RESULT != - plugin->get_extension_config (plugin->cls, - "fnord", - &config)); + plugin->get_extension_manifest (plugin->cls, + "fnord", + &manifest)); - FAILIF (NULL != config); + FAILIF (NULL != manifest); return GNUNET_OK; drop: @@ -220,18 +221,15 @@ check_reserve (const struct TALER_ReservePublicKeyP *pub, const char *currency) { struct TALER_EXCHANGEDB_Reserve reserve; - struct TALER_EXCHANGEDB_KycStatus kyc; reserve.pub = *pub; FAILIF (GNUNET_DB_STATUS_SUCCESS_ONE_RESULT != plugin->reserves_get (plugin->cls, - &reserve, - &kyc)); + &reserve)); FAILIF (value != reserve.balance.value); FAILIF (fraction != reserve.balance.fraction); FAILIF (0 != strcmp (currency, reserve.balance.currency)); - FAILIF (kyc.ok); return GNUNET_OK; drop: return GNUNET_SYSERR; @@ -281,7 +279,7 @@ create_denom_key_pair (unsigned int size, GNUNET_assert (GNUNET_OK == TALER_denom_priv_create (&dkp->priv, &dkp->pub, - TALER_DENOMINATION_RSA, + GNUNET_CRYPTO_BSA_RSA, size)); /* Using memset() as fields like master key and signature are not properly initialized for this test. */ @@ -321,7 +319,6 @@ create_denom_key_pair (unsigned int size, return NULL; } memset (&issue2, 0, sizeof (issue2)); - plugin->commit (plugin->cls); if (GNUNET_DB_STATUS_SUCCESS_ONE_RESULT != plugin->get_denomination_info (plugin->cls, &dki.issue.denom_hash, @@ -449,16 +446,16 @@ static unsigned int auditor_row_cnt; * @return #GNUNET_OK to continue to iterate, #GNUNET_SYSERR to stop */ static enum GNUNET_GenericReturnValue -audit_refresh_session_cb (void *cls, - uint64_t rowid, - const struct TALER_DenominationPublicKey *denom_pub, - const struct - TALER_AgeCommitmentHash *h_age_commitment, - const struct TALER_CoinSpendPublicKeyP *coin_pub, - const struct TALER_CoinSpendSignatureP *coin_sig, - const struct TALER_Amount *amount_with_fee, - uint32_t noreveal_index, - const struct TALER_RefreshCommitmentP *rc) +audit_refresh_session_cb ( + void *cls, + uint64_t rowid, + const struct TALER_DenominationPublicKey *denom_pub, + const struct TALER_AgeCommitmentHash *h_age_commitment, + const struct TALER_CoinSpendPublicKeyP *coin_pub, + const struct TALER_CoinSpendSignatureP *coin_sig, + const struct TALER_Amount *amount_with_fee, + uint32_t noreveal_index, + const struct TALER_RefreshCommitmentP *rc) { (void) cls; (void) rowid; @@ -468,6 +465,7 @@ audit_refresh_session_cb (void *cls, (void) amount_with_fee; (void) noreveal_index; (void) rc; + (void) h_age_commitment; auditor_row_cnt++; return GNUNET_OK; } @@ -539,6 +537,7 @@ cb_wt_never (void *cls, (void) serial_id; (void) merchant_pub; (void) account_payto_uri; + (void) h_payto; (void) exec_time; (void) h_contract_terms; (void) denom_pub; @@ -578,6 +577,7 @@ cb_wt_check (void *cls, { (void) rowid; (void) denom_pub; + (void) h_payto; GNUNET_assert (cls == &cb_wt_never); GNUNET_assert (0 == GNUNET_memcmp (merchant_pub, &merchant_pub_wt)); @@ -604,7 +604,7 @@ static struct TALER_PaytoHashP wire_target_h_payto; /** - * Callback for #select_deposits_above_serial_id () + * Callback for #select_coin_deposits_above_serial_id () * * @param cls closure * @param rowid unique serial ID for the deposit in our DB @@ -820,9 +820,6 @@ test_wire_fees (void) GNUNET_assert (GNUNET_OK == TALER_string_to_amount (CURRENCY ":2.424242", &fees.closing)); - GNUNET_assert (GNUNET_OK == - TALER_string_to_amount (CURRENCY ":3.424242", - &fees.wad)); GNUNET_CRYPTO_random_block (GNUNET_CRYPTO_QUALITY_WEAK, &master_sig, sizeof (master_sig)); @@ -934,14 +931,17 @@ audit_wire_cb (void *cls, /** * Test API relating to wire_out handling. * + * @param bd batch deposit to test * @return #GNUNET_OK on success */ static enum GNUNET_GenericReturnValue -test_wire_out (const struct TALER_EXCHANGEDB_Deposit *deposit) +test_wire_out (const struct TALER_EXCHANGEDB_BatchDeposit *bd) { + const struct TALER_EXCHANGEDB_CoinDepositInformation *deposit = &bd->cdis[0]; struct TALER_PaytoHashP h_payto; - TALER_payto_hash (deposit->receiver_wire_account, + GNUNET_assert (0 < bd->num_cdis); + TALER_payto_hash (bd->receiver_wire_account, &h_payto); auditor_row_cnt = 0; memset (&wire_out_wtid, @@ -959,8 +959,8 @@ test_wire_out (const struct TALER_EXCHANGEDB_Deposit *deposit) plugin->start_deferred_wire_out (plugin->cls)); /* setup values for wire transfer aggregation data */ - merchant_pub_wt = deposit->merchant_pub; - h_contract_terms_wt = deposit->h_contract_terms; + merchant_pub_wt = bd->merchant_pub; + h_contract_terms_wt = bd->h_contract_terms; coin_pub_wt = deposit->coin.coin_pub; coin_value_wt = deposit->amount_with_fee; @@ -984,6 +984,7 @@ test_wire_out (const struct TALER_EXCHANGEDB_Deposit *deposit) struct TALER_Amount coin_fee2; struct GNUNET_TIME_Timestamp execution_time2; struct TALER_EXCHANGEDB_KycStatus kyc; + enum TALER_AmlDecisionState aml; h_contract_terms_wt2.hash.bits[0]++; FAILIF (GNUNET_DB_STATUS_SUCCESS_NO_RESULTS != @@ -997,20 +998,16 @@ test_wire_out (const struct TALER_EXCHANGEDB_Deposit *deposit) &execution_time2, &coin_contribution2, &coin_fee2, - &kyc)); + &kyc, + &aml)); } { struct TALER_ReservePublicKeyP rpub; - struct TALER_EXCHANGEDB_KycStatus kyc; memset (&rpub, 44, sizeof (rpub)); FAILIF (GNUNET_DB_STATUS_SUCCESS_ONE_RESULT != - plugin->inselect_wallet_kyc_status (plugin->cls, - &rpub, - &kyc)); - FAILIF (GNUNET_DB_STATUS_SUCCESS_ONE_RESULT != plugin->store_wire_transfer_out (plugin->cls, wire_out_date, &wire_out_wtid, @@ -1034,6 +1031,7 @@ test_wire_out (const struct TALER_EXCHANGEDB_Deposit *deposit) struct TALER_Amount coin_fee2; struct GNUNET_TIME_Timestamp execution_time2; struct TALER_EXCHANGEDB_KycStatus kyc; + enum TALER_AmlDecisionState aml = TALER_AML_FROZEN; FAILIF (GNUNET_DB_STATUS_SUCCESS_ONE_RESULT != plugin->lookup_transfer_by_deposit (plugin->cls, @@ -1046,7 +1044,9 @@ test_wire_out (const struct TALER_EXCHANGEDB_Deposit *deposit) &execution_time2, &coin_contribution2, &coin_fee2, - &kyc)); + &kyc, + &aml)); + FAILIF (TALER_AML_NORMAL != aml); GNUNET_assert (0 == GNUNET_memcmp (&wtid2, &wire_out_wtid)); GNUNET_assert (GNUNET_TIME_timestamp_cmp (execution_time2, @@ -1093,9 +1093,9 @@ recoup_cb (void *cls, const struct TALER_CoinPublicInfo *coin, const struct TALER_DenominationPublicKey *denom_pub, const struct TALER_CoinSpendSignatureP *coin_sig, - const union TALER_DenominationBlindingKeyP *coin_blind) + const union GNUNET_CRYPTO_BlindingSecretP *coin_blind) { - const union TALER_DenominationBlindingKeyP *cb = cls; + const union GNUNET_CRYPTO_BlindingSecretP *cb = cls; (void) rowid; (void) timestamp; @@ -1114,48 +1114,32 @@ drop: /** - * Function called on deposits that are past their due date - * and have not yet seen a wire transfer. + * Function called on batch deposits that may require a + * wire transfer. * * @param cls closure a `struct TALER_EXCHANGEDB_Deposit *` - * @param rowid deposit table row of the coin's deposit - * @param coin_pub public key of the coin - * @param amount value of the deposit, including fee - * @param payto_uri where should the funds be wired - * @param deadline what was the requested wire transfer deadline - * @param done did the exchange claim that it made a transfer? + * @param batch_deposit_serial_id where in the table are we + * @param total_amount value of all missing deposits, including fees + * @param wire_target_h_payto hash of the recipient account's payto URI + * @param deadline what was the earliest requested wire transfer deadline */ static void -wire_missing_cb (void *cls, - uint64_t rowid, - const struct TALER_CoinSpendPublicKeyP *coin_pub, - const struct TALER_Amount *amount, - const char *payto_uri, - struct GNUNET_TIME_Timestamp deadline, - bool done) +wire_missing_cb ( + void *cls, + uint64_t batch_deposit_serial_id, + const struct TALER_Amount *total_amount, + const struct TALER_PaytoHashP *wire_target_h_payto, + struct GNUNET_TIME_Timestamp deadline) { - const struct TALER_EXCHANGEDB_Deposit *deposit = cls; + const struct TALER_EXCHANGEDB_CoinDepositInformation *deposit = cls; - (void) payto_uri; + (void) batch_deposit_serial_id; (void) deadline; - (void) rowid; - if (done) - { - GNUNET_break (0); - result = 66; - } - if (0 != TALER_amount_cmp (amount, - &deposit->amount_with_fee)) - { - GNUNET_break (0); - result = 66; - } - if (0 != GNUNET_memcmp (coin_pub, - &deposit->coin.coin_pub)) - { - GNUNET_break (0); - result = 66; - } + (void) wire_target_h_payto; + if (0 == + TALER_amount_cmp (total_amount, + &deposit->amount_with_fee)) + result = 8; } @@ -1194,7 +1178,7 @@ run (void *cls) struct GNUNET_CONFIGURATION_Handle *cfg = cls; struct TALER_CoinSpendSignatureP coin_sig; struct GNUNET_TIME_Timestamp deadline; - union TALER_DenominationBlindingKeyP coin_blind; + union GNUNET_CRYPTO_BlindingSecretP coin_blind; struct TALER_ReservePublicKeyP reserve_pub; struct TALER_ReservePublicKeyP reserve_pub2; struct TALER_ReservePublicKeyP reserve_pub3; @@ -1206,8 +1190,10 @@ run (void *cls) struct TALER_EXCHANGEDB_ReserveHistory *rh_head; struct TALER_EXCHANGEDB_BankTransfer *bt; struct TALER_EXCHANGEDB_CollectableBlindcoin *withdraw; - struct TALER_EXCHANGEDB_Deposit deposit; - struct TALER_EXCHANGEDB_Deposit deposit2; + struct TALER_EXCHANGEDB_CoinDepositInformation deposit; + struct TALER_EXCHANGEDB_BatchDeposit bd; + struct TALER_CoinSpendPublicKeyP cpub2; + struct TALER_MerchantPublicKeyP mpub2; struct TALER_EXCHANGEDB_Refund refund; struct TALER_EXCHANGEDB_TransactionList *tl; struct TALER_EXCHANGEDB_TransactionList *tlp; @@ -1227,17 +1213,19 @@ run (void *cls) uint64_t reserve_out_serial_id; uint64_t melt_serial_id; struct TALER_PlanchetMasterSecretP ps; - union TALER_DenominationBlindingKeyP bks; - struct TALER_ExchangeWithdrawValues alg_values = { - /* RSA is simpler, and for the DB there is no real difference between - CS and RSA, just one should be used, so we use RSA */ - .cipher = TALER_DENOMINATION_RSA - }; + union GNUNET_CRYPTO_BlindingSecretP bks; + const struct TALER_ExchangeWithdrawValues *alg_values + = TALER_denom_ewv_rsa_singleton (); memset (&deposit, 0, sizeof (deposit)); - deposit.receiver_wire_account = (char *) rcvr; + memset (&bd, + 0, + sizeof (bd)); + bd.receiver_wire_account = (char *) rcvr; + bd.cdis = &deposit; + bd.num_cdis = 1; memset (&salt, 45, sizeof (salt)); @@ -1254,13 +1242,9 @@ run (void *cls) } (void) plugin->drop_tables (plugin->cls); if (GNUNET_OK != - plugin->create_tables (plugin->cls)) - { - result = 77; - goto cleanup; - } - if (GNUNET_OK != - plugin->setup_partitions (plugin->cls, num_partitions)) + plugin->create_tables (plugin->cls, + true, + num_partitions)) { result = 77; goto cleanup; @@ -1278,7 +1262,7 @@ run (void *cls) NULL)); /* simple extension check */ FAILIF (GNUNET_OK != - test_extension_config ()); + test_extension_manifest ()); RND_BLK (&reserve_pub); GNUNET_assert (GNUNET_OK == @@ -1290,7 +1274,6 @@ run (void *cls) GNUNET_assert (GNUNET_OK == TALER_string_to_amount (CURRENCY ":0.000010", &fees.deposit)); - deposit.deposit_fee = fees.deposit; GNUNET_assert (GNUNET_OK == TALER_string_to_amount (CURRENCY ":0.000010", &fees.refresh)); @@ -1301,15 +1284,28 @@ run (void *cls) TALER_string_to_amount (CURRENCY ":1.000010", &amount_with_fee)); result = 4; + FAILIF (GNUNET_DB_STATUS_SUCCESS_NO_RESULTS != + plugin->commit (plugin->cls)); now = GNUNET_TIME_timestamp_get (); - FAILIF (GNUNET_DB_STATUS_SUCCESS_ONE_RESULT != - plugin->reserves_in_insert (plugin->cls, - &reserve_pub, - &value, - now, - sndr, - "exchange-account-1", - 4)); + { + struct TALER_EXCHANGEDB_ReserveInInfo reserve = { + .reserve_pub = &reserve_pub, + .balance = &value, + .execution_time = now, + .sender_account_details = sndr, + .exchange_account_name = "exchange-account-1", + .wire_reference = 4 + }; + enum GNUNET_DB_QueryStatus qsr; + + FAILIF (GNUNET_DB_STATUS_SUCCESS_ONE_RESULT != + plugin->reserves_in_insert (plugin->cls, + &reserve, + 1, + &qsr)); + FAILIF (GNUNET_DB_STATUS_SUCCESS_ONE_RESULT != + qsr); + } FAILIF (GNUNET_OK != check_reserve (&reserve_pub, value.value, @@ -1317,14 +1313,28 @@ run (void *cls) value.currency)); now = GNUNET_TIME_timestamp_get (); RND_BLK (&reserve_pub2); - FAILIF (GNUNET_DB_STATUS_SUCCESS_ONE_RESULT != - plugin->reserves_in_insert (plugin->cls, - &reserve_pub2, - &value, - now, - sndr, - "exchange-account-1", - 5)); + { + struct TALER_EXCHANGEDB_ReserveInInfo reserve = { + .reserve_pub = &reserve_pub2, + .balance = &value, + .execution_time = now, + .sender_account_details = sndr, + .exchange_account_name = "exchange-account-1", + .wire_reference = 5 + }; + enum GNUNET_DB_QueryStatus qsr; + + FAILIF (GNUNET_DB_STATUS_SUCCESS_ONE_RESULT != + plugin->reserves_in_insert (plugin->cls, + &reserve, + 1, + &qsr)); + FAILIF (GNUNET_DB_STATUS_SUCCESS_ONE_RESULT != + qsr); + } + FAILIF (GNUNET_OK != + plugin->start (plugin->cls, + "test-2")); FAILIF (GNUNET_OK != check_reserve (&reserve_pub, value.value, @@ -1347,7 +1357,7 @@ run (void *cls) RND_BLK (&cbc.reserve_sig); RND_BLK (&ps); TALER_planchet_blinding_secret_create (&ps, - &alg_values, + alg_values, &bks); { struct TALER_PlanchetDetail pd; @@ -1363,19 +1373,20 @@ run (void *cls) RND_BLK (&age_hash); for (size_t i = 0; i < sizeof(p_ah) / sizeof(p_ah[0]); i++) { + RND_BLK (&coin_pub); GNUNET_assert (GNUNET_OK == TALER_denom_blind (&dkp->pub, &bks, + NULL, p_ah[i], &coin_pub, - &alg_values, + alg_values, &c_hash, &pd.blinded_planchet)); - GNUNET_assert (GNUNET_OK == - TALER_coin_ev_hash (&pd.blinded_planchet, - &cbc.denom_pub_hash, - &cbc.h_coin_envelope)); + TALER_coin_ev_hash (&pd.blinded_planchet, + &cbc.denom_pub_hash, + &cbc.h_coin_envelope); if (i != 0) TALER_blinded_denom_sig_free (&cbc.sig); GNUNET_assert ( @@ -1397,26 +1408,43 @@ run (void *cls) { bool found; - bool nonce_ok; + bool nonce_reuse; bool balance_ok; - struct TALER_EXCHANGEDB_KycStatus kyc; + bool age_ok; + bool conflict; + bool denom_unknown; + uint16_t maximum_age; uint64_t ruuid; + struct TALER_Amount reserve_balance; FAILIF (GNUNET_DB_STATUS_SUCCESS_ONE_RESULT != - plugin->do_withdraw (plugin->cls, - NULL, - &cbc, - now, - &found, - &balance_ok, - &nonce_ok, - &kyc, - &ruuid)); + plugin->do_batch_withdraw (plugin->cls, + now, + &reserve_pub, + &value, + true, + &found, + &balance_ok, + &reserve_balance, + &age_ok, + &maximum_age, + &ruuid)); + FAILIF (GNUNET_DB_STATUS_SUCCESS_ONE_RESULT != + plugin->do_batch_withdraw_insert (plugin->cls, + NULL, + &cbc, + now, + ruuid, + &denom_unknown, + &conflict, + &nonce_reuse)); GNUNET_assert (found); - GNUNET_assert (nonce_ok); + GNUNET_assert (! nonce_reuse); + GNUNET_assert (! denom_unknown); GNUNET_assert (balance_ok); - GNUNET_assert (! kyc.ok); } + + FAILIF (GNUNET_OK != check_reserve (&reserve_pub, 0, @@ -1453,7 +1481,7 @@ run (void *cls) &cbc2.sig, &bks, &c_hash, - &alg_values, + alg_values, &dkp->pub)); FAILIF (GNUNET_OK != TALER_denom_pub_verify (&dkp->pub, @@ -1472,7 +1500,7 @@ run (void *cls) &cbc.sig, &bks, &c_hash, - &alg_values, + alg_values, &dkp->pub)); deadline = GNUNET_TIME_timestamp_get (); { @@ -1492,23 +1520,22 @@ run (void *cls) struct GNUNET_TIME_Timestamp deposit_timestamp = GNUNET_TIME_timestamp_get (); bool balance_ok; + uint32_t bad_balance_idx; bool in_conflict; struct TALER_PaytoHashP h_payto; RND_BLK (&h_payto); - deposit.refund_deadline + bd.refund_deadline = GNUNET_TIME_relative_to_timestamp (GNUNET_TIME_UNIT_MONTHS); - deposit.wire_deadline + bd.wire_deadline = GNUNET_TIME_relative_to_timestamp (GNUNET_TIME_UNIT_MONTHS); deposit.amount_with_fee = value; FAILIF (GNUNET_DB_STATUS_SUCCESS_ONE_RESULT != plugin->do_deposit (plugin->cls, - &deposit, - known_coin_id, - &h_payto, - false, + &bd, &deposit_timestamp, &balance_ok, + &bad_balance_idx, &in_conflict)); FAILIF (! balance_ok); FAILIF (in_conflict); @@ -1521,9 +1548,9 @@ run (void *cls) bool conflict; refund.coin = deposit.coin; - refund.details.merchant_pub = deposit.merchant_pub; + refund.details.merchant_pub = bd.merchant_pub; RND_BLK (&refund.details.merchant_sig); - refund.details.h_contract_terms = deposit.h_contract_terms; + refund.details.h_contract_terms = bd.h_contract_terms; refund.details.rtransaction_id = 1; refund.details.refund_amount = value; refund.details.refund_fee = fees.refund; @@ -1626,7 +1653,8 @@ run (void *cls) { struct TALER_EXCHANGEDB_RefreshRevealedCoin *ccoin; struct GNUNET_TIME_Timestamp now; - struct TALER_BlindedRsaPlanchet *rp; + struct GNUNET_CRYPTO_BlindedMessage *rp; + struct GNUNET_CRYPTO_RsaBlindedMessage *rsa; struct TALER_BlindedPlanchet *bp; now = GNUNET_TIME_timestamp_get (); @@ -1638,18 +1666,22 @@ run (void *cls) new_denom_pubs[cnt] = new_dkp[cnt]->pub; ccoin = &revealed_coins[cnt]; bp = &ccoin->blinded_planchet; - bp->cipher = TALER_DENOMINATION_RSA; - rp = &bp->details.rsa_blinded_planchet; - rp->blinded_msg_size = 1 + (size_t) GNUNET_CRYPTO_random_u64 ( + rp = GNUNET_new (struct GNUNET_CRYPTO_BlindedMessage); + bp->blinded_message = rp; + rp->cipher = GNUNET_CRYPTO_BSA_RSA; + rp->rc = 1; + rsa = &rp->details.rsa_blinded_message; + rsa->blinded_msg_size = 1 + (size_t) GNUNET_CRYPTO_random_u64 ( GNUNET_CRYPTO_QUALITY_WEAK, (RSA_KEY_SIZE / 8) - 1); - rp->blinded_msg = GNUNET_malloc (rp->blinded_msg_size); + rsa->blinded_msg = GNUNET_malloc (rsa->blinded_msg_size); GNUNET_CRYPTO_random_block (GNUNET_CRYPTO_QUALITY_WEAK, - rp->blinded_msg, - rp->blinded_msg_size); + rsa->blinded_msg, + rsa->blinded_msg_size); TALER_denom_pub_hash (&new_dkp[cnt]->pub, &ccoin->h_denom_pub); - ccoin->exchange_vals = alg_values; + TALER_denom_ewv_copy (&ccoin->exchange_vals, + alg_values); TALER_coin_ev_hash (bp, &ccoin->h_denom_pub, &ccoin->coin_envelope_hash); @@ -1707,11 +1739,20 @@ run (void *cls) /* Just to test fetching a coin with melt history */ struct TALER_EXCHANGEDB_TransactionList *tl; enum GNUNET_DB_QueryStatus qs; + uint64_t etag; + struct TALER_Amount balance; + struct TALER_DenominationHashP h_denom_pub; qs = plugin->get_coin_transactions (plugin->cls, &refresh.coin.coin_pub, + 0, + 0, + &etag, + &balance, + &h_denom_pub, &tl); - FAILIF (GNUNET_DB_STATUS_SUCCESS_ONE_RESULT != qs); + FAILIF (0 >= qs); + FAILIF (NULL == tl); plugin->free_coin_transaction_list (plugin->cls, tl); } @@ -1721,7 +1762,7 @@ run (void *cls) { struct GNUNET_TIME_Timestamp recoup_timestamp = GNUNET_TIME_timestamp_get (); - union TALER_DenominationBlindingKeyP coin_bks; + union GNUNET_CRYPTO_BlindingSecretP coin_bks; uint64_t new_known_coin_id; struct TALER_CoinPublicInfo new_coin; struct TALER_DenominationHashP dph; @@ -1758,7 +1799,6 @@ run (void *cls) struct TALER_EXCHANGEDB_Reserve pre_reserve; struct TALER_EXCHANGEDB_Reserve post_reserve; struct TALER_Amount delta; - struct TALER_EXCHANGEDB_KycStatus kyc; bool recoup_ok; bool internal_failure; struct GNUNET_TIME_Timestamp recoup_timestamp @@ -1767,8 +1807,7 @@ run (void *cls) pre_reserve.pub = reserve_pub; FAILIF (GNUNET_DB_STATUS_SUCCESS_ONE_RESULT != plugin->reserves_get (plugin->cls, - &pre_reserve, - &kyc)); + &pre_reserve)); FAILIF (! TALER_amount_is_zero (&pre_reserve.balance)); FAILIF (GNUNET_DB_STATUS_SUCCESS_ONE_RESULT != plugin->do_recoup (plugin->cls, @@ -1786,8 +1825,7 @@ run (void *cls) post_reserve.pub = reserve_pub; FAILIF (GNUNET_DB_STATUS_SUCCESS_ONE_RESULT != plugin->reserves_get (plugin->cls, - &post_reserve, - &kyc)); + &post_reserve)); FAILIF (0 >= TALER_amount_subtract (&delta, &post_reserve.balance, @@ -1818,7 +1856,8 @@ run (void *cls) sndr, &wire_out_wtid, &amount_with_fee, - &fee_closing)); + &fee_closing, + 0)); FAILIF (GNUNET_OK != check_reserve (&reserve_pub2, 0, @@ -1832,20 +1871,27 @@ run (void *cls) sndr, &wire_out_wtid, &value, - &fee_closing)); + &fee_closing, + 0)); FAILIF (GNUNET_OK != check_reserve (&reserve_pub, 0, 0, value.currency)); result = 7; + FAILIF (GNUNET_DB_STATUS_SUCCESS_NO_RESULTS != + plugin->commit (plugin->cls)); /* check reserve history */ { struct TALER_Amount balance; + uint64_t etag_out; qs = plugin->get_reserve_history (plugin->cls, &reserve_pub, + 0, + 0, + &etag_out, &balance, &rh); } @@ -1921,8 +1967,19 @@ run (void *cls) /* FIXME: not yet tested */ break; } + case TALER_EXCHANGEDB_RO_OPEN_REQUEST: + { + /* FIXME: not yet tested */ + break; + } + case TALER_EXCHANGEDB_RO_CLOSE_REQUEST: + { + /* FIXME: not yet tested */ + break; + } } } + GNUNET_assert (4 == cnt); FAILIF (4 != cnt); auditor_row_cnt = 0; @@ -1946,9 +2003,20 @@ run (void *cls) &audit_refund_cb, NULL)); FAILIF (1 != auditor_row_cnt); - qs = plugin->get_coin_transactions (plugin->cls, - &refund.coin.coin_pub, - &tl); + { + uint64_t etag = 0; + struct TALER_Amount balance; + struct TALER_DenominationHashP h_denom_pub; + + qs = plugin->get_coin_transactions (plugin->cls, + &refund.coin.coin_pub, + 0, + 0, + &etag, + &balance, + &h_denom_pub, + &tl); + } FAILIF (GNUNET_DB_STATUS_SUCCESS_ONE_RESULT != qs); GNUNET_assert (NULL != tl); matched = 0; @@ -1968,26 +2036,24 @@ run (void *cls) &deposit.csig)); FAILIF (0 != GNUNET_memcmp (&have->merchant_pub, - &deposit.merchant_pub)); + &bd.merchant_pub)); FAILIF (0 != GNUNET_memcmp (&have->h_contract_terms, - &deposit.h_contract_terms)); + &bd.h_contract_terms)); FAILIF (0 != GNUNET_memcmp (&have->wire_salt, - &deposit.wire_salt)); + &bd.wire_salt)); FAILIF (GNUNET_TIME_timestamp_cmp (have->timestamp, !=, - deposit.timestamp)); + bd.wallet_timestamp)); FAILIF (GNUNET_TIME_timestamp_cmp (have->refund_deadline, !=, - deposit.refund_deadline)); + bd.refund_deadline)); FAILIF (GNUNET_TIME_timestamp_cmp (have->wire_deadline, !=, - deposit.wire_deadline)); + bd.wire_deadline)); FAILIF (0 != TALER_amount_cmp (&have->amount_with_fee, &deposit.amount_with_fee)); - FAILIF (0 != TALER_amount_cmp (&have->deposit_fee, - &deposit.deposit_fee)); matched |= 1; break; } @@ -2058,7 +2124,6 @@ run (void *cls) memset (&deposit, 0, sizeof (deposit)); - deposit.deposit_fee = fees.deposit; RND_BLK (&deposit.coin.coin_pub); TALER_denom_pub_hash (&dkp->pub, &deposit.coin.denom_pub_hash); @@ -2067,24 +2132,25 @@ run (void *cls) &cbc.sig, &bks, &c_hash, - &alg_values, + alg_values, &dkp->pub)); RND_BLK (&deposit.csig); - RND_BLK (&deposit.merchant_pub); - RND_BLK (&deposit.h_contract_terms); - RND_BLK (&deposit.wire_salt); - deposit.receiver_wire_account = + RND_BLK (&bd.merchant_pub); + RND_BLK (&bd.h_contract_terms); + RND_BLK (&bd.wire_salt); + bd.receiver_wire_account = "payto://iban/DE67830654080004822650?receiver-name=Test"; TALER_merchant_wire_signature_hash ( "payto://iban/DE67830654080004822650?receiver-name=Test", - &deposit.wire_salt, + &bd.wire_salt, &h_wire_wt); deposit.amount_with_fee = value; - deposit.deposit_fee = fees.deposit; - - deposit.refund_deadline = deadline; - deposit.wire_deadline = deadline; + bd.refund_deadline = deadline; + bd.wire_deadline = deadline; result = 8; + FAILIF (GNUNET_OK != + plugin->start (plugin->cls, + "test-3")); { uint64_t known_coin_id; struct TALER_DenominationHashP dph; @@ -2102,22 +2168,30 @@ run (void *cls) struct GNUNET_TIME_Timestamp r; struct TALER_Amount deposit_fee; struct TALER_MerchantWireHashP h_wire; + bool balance_ok; + uint32_t bad_idx; + bool ctr_conflict; now = GNUNET_TIME_timestamp_get (); + TALER_payto_hash (bd.receiver_wire_account, + &bd.wire_target_h_payto); FAILIF (GNUNET_DB_STATUS_SUCCESS_ONE_RESULT != - plugin->insert_deposit (plugin->cls, - now, - &deposit)); - TALER_merchant_wire_signature_hash (deposit.receiver_wire_account, - &deposit.wire_salt, + plugin->do_deposit (plugin->cls, + &bd, + &now, + &balance_ok, + &bad_idx, + &ctr_conflict)); + TALER_merchant_wire_signature_hash (bd.receiver_wire_account, + &bd.wire_salt, &h_wire); FAILIF (1 != plugin->have_deposit2 (plugin->cls, - &deposit.h_contract_terms, + &bd.h_contract_terms, &h_wire, &deposit.coin.coin_pub, - &deposit.merchant_pub, - deposit.refund_deadline, + &bd.merchant_pub, + bd.refund_deadline, &deposit_fee, &r)); FAILIF (GNUNET_TIME_timestamp_cmp (now, @@ -2125,29 +2199,20 @@ run (void *cls) r)); } { - struct GNUNET_TIME_Timestamp start_range; - struct GNUNET_TIME_Timestamp end_range; - - start_range = GNUNET_TIME_absolute_to_timestamp ( - GNUNET_TIME_absolute_subtract (deadline.abs_time, - GNUNET_TIME_UNIT_SECONDS)); - end_range = GNUNET_TIME_absolute_to_timestamp ( - GNUNET_TIME_absolute_add (deadline.abs_time, - GNUNET_TIME_UNIT_SECONDS)); - FAILIF (GNUNET_DB_STATUS_SUCCESS_ONE_RESULT != - plugin->select_deposits_missing_wire (plugin->cls, - start_range, - end_range, - &wire_missing_cb, - &deposit)); + result = 66; + FAILIF (0 >= + plugin->select_batch_deposits_missing_wire (plugin->cls, + 0, + &wire_missing_cb, + &deposit)); FAILIF (8 != result); } auditor_row_cnt = 0; FAILIF (0 >= - plugin->select_deposits_above_serial_id (plugin->cls, - 0, - &audit_deposit_cb, - NULL)); + plugin->select_coin_deposits_above_serial_id (plugin->cls, + 0, + &audit_deposit_cb, + NULL)); FAILIF (0 == auditor_row_cnt); result = 8; sleep (2); /* give deposit time to be ready */ @@ -2159,13 +2224,12 @@ run (void *cls) plugin->get_ready_deposit (plugin->cls, 0, INT32_MAX, - true, &merchant_pub2, &payto_uri2)); FAILIF (0 != GNUNET_memcmp (&merchant_pub2, - &deposit.merchant_pub)); + &bd.merchant_pub)); FAILIF (0 != strcmp (payto_uri2, - deposit.receiver_wire_account)); + bd.receiver_wire_account)); TALER_payto_hash (payto_uri2, &wire_target_h_payto); GNUNET_free (payto_uri2); @@ -2181,7 +2245,7 @@ run (void *cls) FAILIF (GNUNET_DB_STATUS_SUCCESS_ONE_RESULT != plugin->aggregate (plugin->cls, &wire_target_h_payto, - &deposit.merchant_pub, + &bd.merchant_pub, &wtid, &total)); } @@ -2205,6 +2269,7 @@ run (void *cls) FAILIF (GNUNET_DB_STATUS_SUCCESS_NO_RESULTS != plugin->select_aggregation_transient (plugin->cls, &wire_target_h_payto, + &bd.merchant_pub, "x-bank", &wtid2, &total2)); @@ -2212,11 +2277,14 @@ run (void *cls) plugin->create_aggregation_transient (plugin->cls, &wire_target_h_payto, "x-bank", + &bd.merchant_pub, &wtid, + 0, &total)); FAILIF (GNUNET_DB_STATUS_SUCCESS_ONE_RESULT != plugin->select_aggregation_transient (plugin->cls, &wire_target_h_payto, + &bd.merchant_pub, "x-bank", &wtid2, &total2)); @@ -2233,10 +2301,12 @@ run (void *cls) plugin->update_aggregation_transient (plugin->cls, &wire_target_h_payto, &wtid, + 0, &total)); FAILIF (GNUNET_DB_STATUS_SUCCESS_ONE_RESULT != plugin->select_aggregation_transient (plugin->cls, &wire_target_h_payto, + &bd.merchant_pub, "x-bank", &wtid2, &total2)); @@ -2253,6 +2323,7 @@ run (void *cls) FAILIF (GNUNET_DB_STATUS_SUCCESS_NO_RESULTS != plugin->select_aggregation_transient (plugin->cls, &wire_target_h_payto, + &bd.merchant_pub, "x-bank", &wtid2, &total2)); @@ -2261,37 +2332,35 @@ run (void *cls) plugin->commit (plugin->cls)); result = 10; - deposit2 = deposit; FAILIF (GNUNET_OK != plugin->start (plugin->cls, "test-2")); - RND_BLK (&deposit2.merchant_pub); /* should fail if merchant is different */ + RND_BLK (&mpub2); /* should fail if merchant is different */ { struct TALER_MerchantWireHashP h_wire; struct GNUNET_TIME_Timestamp r; struct TALER_Amount deposit_fee; - TALER_merchant_wire_signature_hash (deposit2.receiver_wire_account, - &deposit2.wire_salt, + TALER_merchant_wire_signature_hash (bd.receiver_wire_account, + &bd.wire_salt, &h_wire); FAILIF (GNUNET_DB_STATUS_SUCCESS_NO_RESULTS != plugin->have_deposit2 (plugin->cls, - &deposit2.h_contract_terms, + &bd.h_contract_terms, &h_wire, - &deposit2.coin.coin_pub, - &deposit2.merchant_pub, - deposit2.refund_deadline, + &deposit.coin.coin_pub, + &mpub2, + bd.refund_deadline, &deposit_fee, &r)); - deposit2.merchant_pub = deposit.merchant_pub; - RND_BLK (&deposit2.coin.coin_pub); /* should fail if coin is different */ + RND_BLK (&cpub2); /* should fail if coin is different */ FAILIF (GNUNET_DB_STATUS_SUCCESS_NO_RESULTS != plugin->have_deposit2 (plugin->cls, - &deposit2.h_contract_terms, + &bd.h_contract_terms, &h_wire, - &deposit2.coin.coin_pub, - &deposit2.merchant_pub, - deposit2.refund_deadline, + &cpub2, + &bd.merchant_pub, + bd.refund_deadline, &deposit_fee, &r)); } @@ -2300,6 +2369,9 @@ run (void *cls) /* test revocation */ + FAILIF (GNUNET_OK != + plugin->start (plugin->cls, + "test-3b")); RND_BLK (&master_sig); FAILIF (GNUNET_DB_STATUS_SUCCESS_ONE_RESULT != plugin->insert_denomination_revocation (plugin->cls, @@ -2338,7 +2410,7 @@ run (void *cls) FAILIF (GNUNET_OK != test_wire_prepare ()); FAILIF (GNUNET_OK != - test_wire_out (&deposit)); + test_wire_out (&bd)); FAILIF (GNUNET_OK != test_gc ()); FAILIF (GNUNET_OK != @@ -2402,8 +2474,9 @@ main (int argc, return -1; } GNUNET_log_setup (argv[0], - "WARNING", + "INFO", NULL); + TALER_OS_init (); plugin_name++; (void) GNUNET_asprintf (&testname, "test-exchange-db-%s", |