properly check contract hash, instead of just computing it twice

This commit is contained in:
Christian Grothoff 2015-09-28 22:56:20 +02:00
parent 837b7f5f14
commit 383f3eb850

View File

@ -136,6 +136,7 @@ parse_and_handle_deposit_request (struct MHD_Connection *connection,
struct TALER_MINTDB_Deposit deposit; struct TALER_MINTDB_Deposit deposit;
struct TALER_MINTDB_DenominationKeyIssueInformation *dki; struct TALER_MINTDB_DenominationKeyIssueInformation *dki;
struct TMH_KS_StateHandle *ks; struct TMH_KS_StateHandle *ks;
struct GNUNET_HashCode my_h_wire;
struct TMH_PARSE_FieldSpecification spec[] = { struct TMH_PARSE_FieldSpecification spec[] = {
TMH_PARSE_member_denomination_public_key ("denom_pub", &deposit.coin.denom_pub), TMH_PARSE_member_denomination_public_key ("denom_pub", &deposit.coin.denom_pub),
TMH_PARSE_member_denomination_signature ("ub_sig", &deposit.coin.denom_sig), TMH_PARSE_member_denomination_signature ("ub_sig", &deposit.coin.denom_sig),
@ -169,13 +170,22 @@ parse_and_handle_deposit_request (struct MHD_Connection *connection,
} }
if (GNUNET_OK != if (GNUNET_OK !=
TALER_hash_json (wire, TALER_hash_json (wire,
&deposit.h_wire)) &my_h_wire))
{ {
TALER_LOG_WARNING ("Failed to parse JSON wire format specification for /deposit request\n"); TALER_LOG_WARNING ("Failed to parse JSON wire format specification for /deposit request\n");
TMH_PARSE_release_data (spec); TMH_PARSE_release_data (spec);
return TMH_RESPONSE_reply_arg_invalid (connection, return TMH_RESPONSE_reply_arg_invalid (connection,
"wire"); "wire");
} }
if (0 != memcmp (&deposit.h_wire,
&my_h_wire,
sizeof (struct GNUNET_HashCode)))
{
/* Client hashed contract differently than we did, reject */
TMH_PARSE_release_data (spec);
return TMH_RESPONSE_reply_arg_invalid (connection,
"H_wire");
}
ks = TMH_KS_acquire (); ks = TMH_KS_acquire ();
dki = TMH_KS_denomination_key_lookup (ks, dki = TMH_KS_denomination_key_lookup (ks,
&deposit.coin.denom_pub, &deposit.coin.denom_pub,