implement spend
This commit is contained in:
parent
9c2aefaa51
commit
daa7fdcfb1
@ -356,6 +356,14 @@ TEH_handler_deposit (struct MHD_Connection *connection,
|
||||
TALER_EC_EXCHANGE_GENERIC_DENOMINATION_REVOKED,
|
||||
"DEPOSIT");
|
||||
}
|
||||
if (dk->denom_pub.cipher != deposit.coin.denom_sig.cipher)
|
||||
{
|
||||
/* denomination cipher and denomination signature cipher not the same */
|
||||
GNUNET_JSON_parse_free (spec);
|
||||
return TEH_RESPONSE_reply_unknown_denom_pub_hash (
|
||||
connection,
|
||||
&deposit.coin.denom_pub_hash);
|
||||
}
|
||||
|
||||
deposit.deposit_fee = dk->meta.fee_deposit;
|
||||
/* check coin signature */
|
||||
|
@ -388,7 +388,27 @@ parse_denom_sig (void *cls,
|
||||
}
|
||||
return GNUNET_OK;
|
||||
}
|
||||
// TODO: case TALER_DENOMINATION_CS:
|
||||
case TALER_DENOMINATION_CS:
|
||||
{
|
||||
struct GNUNET_JSON_Specification ispec[] = {
|
||||
GNUNET_JSON_spec_fixed_auto ("cs_signature_r",
|
||||
&denom_sig->details.cs_signature.r_point),
|
||||
GNUNET_JSON_spec_fixed_auto ("cs_signature_s",
|
||||
&denom_sig->details.cs_signature.s_scalar),
|
||||
GNUNET_JSON_spec_end ()
|
||||
};
|
||||
|
||||
if (GNUNET_OK !=
|
||||
GNUNET_JSON_parse (root,
|
||||
ispec,
|
||||
&emsg,
|
||||
&eline))
|
||||
{
|
||||
GNUNET_break_op (0);
|
||||
return GNUNET_SYSERR;
|
||||
}
|
||||
return GNUNET_OK;
|
||||
}
|
||||
default:
|
||||
GNUNET_break_op (0);
|
||||
return GNUNET_SYSERR;
|
||||
|
@ -98,14 +98,21 @@ TALER_JSON_pack_denom_sig (
|
||||
switch (sig->cipher)
|
||||
{
|
||||
case TALER_DENOMINATION_RSA:
|
||||
ps.object
|
||||
= GNUNET_JSON_PACK (
|
||||
GNUNET_JSON_pack_uint64 ("cipher",
|
||||
TALER_DENOMINATION_RSA),
|
||||
GNUNET_JSON_pack_rsa_signature ("rsa_signature",
|
||||
sig->details.rsa_signature));
|
||||
ps.object = GNUNET_JSON_PACK (
|
||||
GNUNET_JSON_pack_uint64 ("cipher",
|
||||
TALER_DENOMINATION_RSA),
|
||||
GNUNET_JSON_pack_rsa_signature ("rsa_signature",
|
||||
sig->details.rsa_signature));
|
||||
break;
|
||||
case TALER_DENOMINATION_CS:
|
||||
ps.object = GNUNET_JSON_PACK (
|
||||
GNUNET_JSON_pack_uint64 ("cipher",
|
||||
TALER_DENOMINATION_CS),
|
||||
GNUNET_JSON_pack_data_auto ("cs_signature_r",
|
||||
&sig->details.cs_signature.r_point),
|
||||
GNUNET_JSON_pack_data_auto ("cs_signature_s",
|
||||
&sig->details.cs_signature.s_scalar));
|
||||
break;
|
||||
// TODO: case TALER_DENOMINATION_CS:
|
||||
default:
|
||||
GNUNET_assert (0);
|
||||
}
|
||||
|
@ -552,7 +552,16 @@ extract_denom_sig (void *cls,
|
||||
return GNUNET_SYSERR;
|
||||
}
|
||||
return GNUNET_OK;
|
||||
// FIXME: add CS case!
|
||||
case TALER_DENOMINATION_CS:
|
||||
if (sizeof (sig->details.cs_signature) != len)
|
||||
{
|
||||
GNUNET_break (0);
|
||||
return GNUNET_SYSERR;
|
||||
}
|
||||
memcpy (&sig->details.cs_signature,
|
||||
res,
|
||||
len);
|
||||
return GNUNET_OK;
|
||||
default:
|
||||
GNUNET_break (0);
|
||||
}
|
||||
|
@ -406,61 +406,6 @@ run (void *cls,
|
||||
TALER_TESTING_cmd_end ()
|
||||
};
|
||||
|
||||
/**
|
||||
* Test CS withdrawal plus spending.
|
||||
*/
|
||||
struct TALER_TESTING_Command withdraw_cs[] = {
|
||||
/**
|
||||
* Move money to the exchange's bank account.
|
||||
*/
|
||||
CMD_TRANSFER_TO_EXCHANGE ("create-reserve-cs-1",
|
||||
"EUR:6.02"),
|
||||
TALER_TESTING_cmd_check_bank_admin_transfer ("check-create-reserve-cs-1",
|
||||
"EUR:6.02",
|
||||
bc.user42_payto,
|
||||
bc.exchange_payto,
|
||||
"create-reserve-cs-1"),
|
||||
/**
|
||||
* Make a reserve exist, according to the previous
|
||||
* transfer.
|
||||
*/
|
||||
CMD_EXEC_WIREWATCH ("wirewatch-cs-1"),
|
||||
/**
|
||||
* Withdraw EUR:5.
|
||||
*/
|
||||
TALER_TESTING_cmd_withdraw_cs_amount ("withdraw-cs-coin-1",
|
||||
"create-reserve-cs-1",
|
||||
"EUR:5",
|
||||
MHD_HTTP_OK),
|
||||
/**
|
||||
* Withdraw EUR:1 using the SAME private coin key as for the previous coin
|
||||
* (in violation of the specification, to be detected on spending!).
|
||||
*/
|
||||
TALER_TESTING_cmd_withdraw_cs_amount_reuse_key ("withdraw-cs-coin-1x",
|
||||
"create-reserve-cs-1",
|
||||
"EUR:1",
|
||||
"withdraw-cs-coin-1",
|
||||
MHD_HTTP_OK),
|
||||
/**
|
||||
* Check the reserve is depleted.
|
||||
*/
|
||||
TALER_TESTING_cmd_status ("status-cs-1",
|
||||
"create-reserve-cs-1",
|
||||
"EUR:0",
|
||||
MHD_HTTP_OK),
|
||||
/*
|
||||
* Try to overdraw.
|
||||
*/
|
||||
TALER_TESTING_cmd_withdraw_cs_amount ("withdraw-cs-coin-2",
|
||||
"create-reserve-cs-1",
|
||||
"EUR:5",
|
||||
MHD_HTTP_CONFLICT),
|
||||
// TODO: add test for nonce reuse
|
||||
TALER_TESTING_cmd_end ()
|
||||
};
|
||||
|
||||
// TODO: CS related tests
|
||||
|
||||
/**
|
||||
* This block checks whether a wire deadline
|
||||
* very far in the future does NOT get aggregated now.
|
||||
@ -946,6 +891,145 @@ run (void *cls,
|
||||
TALER_TESTING_cmd_end ()
|
||||
};
|
||||
|
||||
/**
|
||||
* Test CS withdrawal plus spending.
|
||||
*/
|
||||
struct TALER_TESTING_Command withdraw_cs[] = {
|
||||
/**
|
||||
* Move money to the exchange's bank account.
|
||||
*/
|
||||
CMD_TRANSFER_TO_EXCHANGE ("create-reserve-cs-1",
|
||||
"EUR:6.02"),
|
||||
TALER_TESTING_cmd_check_bank_admin_transfer ("check-create-reserve-cs-1",
|
||||
"EUR:6.02",
|
||||
bc.user42_payto,
|
||||
bc.exchange_payto,
|
||||
"create-reserve-cs-1"),
|
||||
/**
|
||||
* Make a reserve exist, according to the previous
|
||||
* transfer.
|
||||
*/
|
||||
CMD_EXEC_WIREWATCH ("wirewatch-cs-1"),
|
||||
/**
|
||||
* Withdraw EUR:5.
|
||||
*/
|
||||
TALER_TESTING_cmd_withdraw_cs_amount ("withdraw-cs-coin-1",
|
||||
"create-reserve-cs-1",
|
||||
"EUR:5",
|
||||
MHD_HTTP_OK),
|
||||
/**
|
||||
* Withdraw EUR:1 using the SAME private coin key as for the previous coin
|
||||
* (in violation of the specification, to be detected on spending!).
|
||||
*/
|
||||
TALER_TESTING_cmd_withdraw_cs_amount_reuse_key ("withdraw-cs-coin-1x",
|
||||
"create-reserve-cs-1",
|
||||
"EUR:1",
|
||||
"withdraw-cs-coin-1",
|
||||
MHD_HTTP_OK),
|
||||
/**
|
||||
* Check the reserve is depleted.
|
||||
*/
|
||||
TALER_TESTING_cmd_status ("status-cs-1",
|
||||
"create-reserve-cs-1",
|
||||
"EUR:0",
|
||||
MHD_HTTP_OK),
|
||||
/*
|
||||
* Try to overdraw.
|
||||
*/
|
||||
TALER_TESTING_cmd_withdraw_cs_amount ("withdraw-cs-coin-2",
|
||||
"create-reserve-cs-1",
|
||||
"EUR:5",
|
||||
MHD_HTTP_CONFLICT),
|
||||
// TODO: add test for nonce reuse
|
||||
TALER_TESTING_cmd_end ()
|
||||
};
|
||||
|
||||
struct TALER_TESTING_Command spend_cs[] = {
|
||||
/**
|
||||
* Spend the coin.
|
||||
*/
|
||||
TALER_TESTING_cmd_deposit ("deposit-cs-simple",
|
||||
"withdraw-cs-coin-1",
|
||||
0,
|
||||
bc.user42_payto,
|
||||
"{\"items\":[{\"name\":\"ice cream\",\"value\":1}]}",
|
||||
GNUNET_TIME_UNIT_ZERO,
|
||||
"EUR:5",
|
||||
MHD_HTTP_OK),
|
||||
TALER_TESTING_cmd_deposit_replay ("deposit-cs-simple-replay",
|
||||
"deposit-cs-simple",
|
||||
MHD_HTTP_OK),
|
||||
TALER_TESTING_cmd_deposit ("deposit-cs-reused-coin-key-failure",
|
||||
"withdraw-cs-coin-1x",
|
||||
0,
|
||||
bc.user42_payto,
|
||||
"{\"items\":[{\"name\":\"ice cream\",\"value\":1}]}",
|
||||
GNUNET_TIME_UNIT_ZERO,
|
||||
"EUR:1",
|
||||
MHD_HTTP_CONFLICT),
|
||||
/**
|
||||
* Try to double spend using different wire details.
|
||||
*/
|
||||
TALER_TESTING_cmd_deposit ("deposit-cs-double-1",
|
||||
"withdraw-cs-coin-1",
|
||||
0,
|
||||
bc.user43_payto,
|
||||
"{\"items\":[{\"name\":\"ice cream\",\"value\":1}]}",
|
||||
GNUNET_TIME_UNIT_ZERO,
|
||||
"EUR:5",
|
||||
MHD_HTTP_CONFLICT),
|
||||
/* Try to double spend using a different transaction id.
|
||||
* The test needs the contract terms to differ. This
|
||||
* is currently the case because of the "timestamp" field,
|
||||
* which is set automatically by #TALER_TESTING_cmd_deposit().
|
||||
* This could theoretically fail if at some point a deposit
|
||||
* command executes in less than 1 ms. *///
|
||||
TALER_TESTING_cmd_deposit ("deposit-cs-double-1",
|
||||
"withdraw-cs-coin-1",
|
||||
0,
|
||||
bc.user43_payto,
|
||||
"{\"items\":[{\"name\":\"ice cream\",\"value\":1}]}",
|
||||
GNUNET_TIME_UNIT_ZERO,
|
||||
"EUR:5",
|
||||
MHD_HTTP_CONFLICT),
|
||||
/**
|
||||
* Try to double spend with different proposal.
|
||||
*/
|
||||
TALER_TESTING_cmd_deposit ("deposit-cs-double-2",
|
||||
"withdraw-cs-coin-1",
|
||||
0,
|
||||
bc.user43_payto,
|
||||
"{\"items\":[{\"name\":\"ice cream\",\"value\":2}]}",
|
||||
GNUNET_TIME_UNIT_ZERO,
|
||||
"EUR:5",
|
||||
MHD_HTTP_CONFLICT),
|
||||
TALER_TESTING_cmd_end ()
|
||||
};
|
||||
|
||||
// TODO: CS refresh
|
||||
|
||||
struct TALER_TESTING_Command track_cs[] = {
|
||||
/* Try resolving a deposit's WTID, as we never triggered
|
||||
* execution of transactions, the answer should be that
|
||||
* the exchange knows about the deposit, but has no WTID yet.
|
||||
*///
|
||||
TALER_TESTING_cmd_track_transaction ("deposit-cs-wtid-found",
|
||||
"deposit-cs-simple",
|
||||
0,
|
||||
MHD_HTTP_ACCEPTED,
|
||||
NULL),
|
||||
/* Try resolving a deposit's WTID for a failed deposit.
|
||||
* As the deposit failed, the answer should be that the
|
||||
* exchange does NOT know about the deposit.
|
||||
*/
|
||||
TALER_TESTING_cmd_track_transaction ("deposit-cs-wtid-failing",
|
||||
"deposit-cs-double-2",
|
||||
0,
|
||||
MHD_HTTP_NOT_FOUND,
|
||||
NULL),
|
||||
TALER_TESTING_cmd_end ()
|
||||
};
|
||||
|
||||
#define RESERVE_OPEN_CLOSE_CHUNK 4
|
||||
#define RESERVE_OPEN_CLOSE_ITERATIONS 3
|
||||
|
||||
@ -1007,9 +1091,6 @@ run (void *cls,
|
||||
refresh),
|
||||
TALER_TESTING_cmd_batch ("track",
|
||||
track),
|
||||
TALER_TESTING_cmd_batch ("withdraw-cs",
|
||||
withdraw_cs),
|
||||
// TODO: Clause Schnorr related tests
|
||||
TALER_TESTING_cmd_batch ("unaggregation",
|
||||
unaggregation),
|
||||
TALER_TESTING_cmd_batch ("aggregation",
|
||||
@ -1018,6 +1099,13 @@ run (void *cls,
|
||||
refund),
|
||||
TALER_TESTING_cmd_batch ("recoup",
|
||||
recoup),
|
||||
TALER_TESTING_cmd_batch ("withdraw-cs",
|
||||
withdraw_cs),
|
||||
TALER_TESTING_cmd_batch ("spend-cs",
|
||||
spend_cs),
|
||||
// TODO: Clause Schnorr refresh
|
||||
TALER_TESTING_cmd_batch ("track-cs",
|
||||
track_cs),
|
||||
TALER_TESTING_cmd_batch ("reserve-open-close",
|
||||
reserve_open_close),
|
||||
/* End the suite. */
|
||||
|
@ -625,10 +625,8 @@ TALER_denom_pub_cmp (const struct TALER_DenominationPublicKey *denom1,
|
||||
return GNUNET_CRYPTO_rsa_public_key_cmp (denom1->details.rsa_public_key,
|
||||
denom2->details.rsa_public_key);
|
||||
case TALER_DENOMINATION_CS:
|
||||
return 0 == GNUNET_memcmp (&denom1->details.cs_public_key,
|
||||
&denom2->details.cs_public_key)
|
||||
? GNUNET_OK
|
||||
: GNUNET_SYSERR;
|
||||
return GNUNET_memcmp (&denom1->details.cs_public_key,
|
||||
&denom2->details.cs_public_key);
|
||||
default:
|
||||
GNUNET_assert (0);
|
||||
}
|
||||
@ -650,10 +648,8 @@ TALER_denom_sig_cmp (const struct TALER_DenominationSignature *sig1,
|
||||
return GNUNET_CRYPTO_rsa_signature_cmp (sig1->details.rsa_signature,
|
||||
sig2->details.rsa_signature);
|
||||
case TALER_DENOMINATION_CS:
|
||||
return 0 == GNUNET_memcmp (&sig1->details.cs_signature,
|
||||
&sig2->details.cs_signature)
|
||||
? GNUNET_OK
|
||||
: GNUNET_SYSERR;
|
||||
return GNUNET_memcmp (&sig1->details.cs_signature,
|
||||
&sig2->details.cs_signature);
|
||||
default:
|
||||
GNUNET_assert (0);
|
||||
}
|
||||
@ -676,10 +672,8 @@ TALER_blinded_denom_sig_cmp (
|
||||
return GNUNET_CRYPTO_rsa_signature_cmp (sig1->details.blinded_rsa_signature,
|
||||
sig2->details.blinded_rsa_signature);
|
||||
case TALER_DENOMINATION_CS:
|
||||
return 0 == GNUNET_memcmp (&sig1->details.blinded_cs_answer,
|
||||
&sig2->details.blinded_cs_answer)
|
||||
? GNUNET_OK
|
||||
: GNUNET_SYSERR;
|
||||
return GNUNET_memcmp (&sig1->details.blinded_cs_answer,
|
||||
&sig2->details.blinded_cs_answer);
|
||||
default:
|
||||
GNUNET_assert (0);
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user