add internal sig verification, pack hashes, fix testcase

This commit is contained in:
Christian Grothoff 2015-08-17 03:56:49 +02:00
parent 0edac10665
commit c4a68b896f
4 changed files with 46 additions and 11 deletions

View File

@ -215,12 +215,12 @@ struct TALER_WithdrawRequestPS
/** /**
* Hash of the denomination public key for the coin that is withdrawn. * Hash of the denomination public key for the coin that is withdrawn.
*/ */
struct GNUNET_HashCode h_denomination_pub; struct GNUNET_HashCode h_denomination_pub GNUNET_PACKED;
/** /**
* Hash of the (blinded) message to be signed by the Mint. * Hash of the (blinded) message to be signed by the Mint.
*/ */
struct GNUNET_HashCode h_coin_envelope; struct GNUNET_HashCode h_coin_envelope GNUNET_PACKED;
}; };
@ -239,12 +239,12 @@ struct TALER_DepositRequestPS
/** /**
* Hash over the contract for which this deposit is made. * Hash over the contract for which this deposit is made.
*/ */
struct GNUNET_HashCode h_contract; struct GNUNET_HashCode h_contract GNUNET_PACKED;
/** /**
* Hash over the wiring information of the merchant. * Hash over the wiring information of the merchant.
*/ */
struct GNUNET_HashCode h_wire; struct GNUNET_HashCode h_wire GNUNET_PACKED;
/** /**
* Time when this request was generated. Used, for example, to * Time when this request was generated. Used, for example, to
@ -330,12 +330,12 @@ struct TALER_DepositConfirmationPS
/** /**
* Hash over the contract for which this deposit is made. * Hash over the contract for which this deposit is made.
*/ */
struct GNUNET_HashCode h_contract; struct GNUNET_HashCode h_contract GNUNET_PACKED;
/** /**
* Hash over the wiring information of the merchant. * Hash over the wiring information of the merchant.
*/ */
struct GNUNET_HashCode h_wire; struct GNUNET_HashCode h_wire GNUNET_PACKED;
/** /**
* Merchant-generated transaction ID to detect duplicate * Merchant-generated transaction ID to detect duplicate
@ -395,7 +395,7 @@ struct TALER_RefreshMeltCoinAffirmationPS
/** /**
* Which melting session should the coin become a part of. * Which melting session should the coin become a part of.
*/ */
struct GNUNET_HashCode session_hash; struct GNUNET_HashCode session_hash GNUNET_PACKED;
/** /**
* How much of the value of the coin should be melted? This amount * How much of the value of the coin should be melted? This amount

View File

@ -245,6 +245,9 @@ parse_json (json_t *root,
&sig.eddsa_signature, &sig.eddsa_signature,
spec[i].details.eddsa_signature.pub_key)) spec[i].details.eddsa_signature.pub_key))
{ {
GNUNET_log (GNUNET_ERROR_TYPE_ERROR,
"Failed to verify signature of purpose %u\n",
ntohl (purpose->purpose));
GNUNET_break_op (0); GNUNET_break_op (0);
MAJ_parse_free (sig_spec); MAJ_parse_free (sig_spec);
return i; return i;

View File

@ -1973,31 +1973,33 @@ run (void *cls,
.expected_response_code = MHD_HTTP_OK, .expected_response_code = MHD_HTTP_OK,
.details.refresh_link.reveal_ref = "refresh-reveal-1" }, .details.refresh_link.reveal_ref = "refresh-reveal-1" },
#if TEST_REFRESH
/* Test successfully spending coins from the refresh operation: /* Test successfully spending coins from the refresh operation:
first EUR:1 */ first EUR:1 */
{ .oc = OC_DEPOSIT, { .oc = OC_DEPOSIT,
.label = "refresh-deposit-refreshed-1", .label = "refresh-deposit-refreshed-1a",
.expected_response_code = MHD_HTTP_OK, .expected_response_code = MHD_HTTP_OK,
.details.deposit.amount = "EUR:1", .details.deposit.amount = "EUR:1",
.details.deposit.coin_ref = "refresh-reveal-1a", .details.deposit.coin_ref = "refresh-reveal-1",
.details.deposit.coin_idx = 0, .details.deposit.coin_idx = 0,
.details.deposit.wire_details = "{ \"type\":\"TEST\", \"bank\":\"dest bank\", \"account\":42 }", .details.deposit.wire_details = "{ \"type\":\"TEST\", \"bank\":\"dest bank\", \"account\":42 }",
.details.deposit.contract = "{ \"items\"={ \"name\":\"ice cream\", \"value\":3 } }", .details.deposit.contract = "{ \"items\"={ \"name\":\"ice cream\", \"value\":3 } }",
.details.deposit.transaction_id = 2 }, .details.deposit.transaction_id = 2 },
/* Test successfully spending coins from the refresh operation: /* Test successfully spending coins from the refresh operation:
finally EUR:0.1 */ finally EUR:0.1 */
{ .oc = OC_DEPOSIT, { .oc = OC_DEPOSIT,
.label = "refresh-deposit-refreshed-1b", .label = "refresh-deposit-refreshed-1b",
.expected_response_code = MHD_HTTP_OK, .expected_response_code = MHD_HTTP_OK,
.details.deposit.amount = "EUR:0.1", .details.deposit.amount = "EUR:0.1",
.details.deposit.coin_ref = "refresh-reveal-1b", .details.deposit.coin_ref = "refresh-reveal-1",
.details.deposit.coin_idx = 4, .details.deposit.coin_idx = 4,
.details.deposit.wire_details = "{ \"type\":\"TEST\", \"bank\":\"dest bank\", \"account\":42 }", .details.deposit.wire_details = "{ \"type\":\"TEST\", \"bank\":\"dest bank\", \"account\":42 }",
.details.deposit.contract = "{ \"items\"={ \"name\":\"ice cream\", \"value\":3 } }", .details.deposit.contract = "{ \"items\"={ \"name\":\"ice cream\", \"value\":3 } }",
.details.deposit.transaction_id = 2 }, .details.deposit.transaction_id = 2 },
#if TEST_REFRESH
/* Test running a failing melt operation (same operation again must fail) */ /* Test running a failing melt operation (same operation again must fail) */
{ .oc = OC_REFRESH_MELT, { .oc = OC_REFRESH_MELT,
.label = "refresh-melt-failing", .label = "refresh-melt-failing",

View File

@ -416,6 +416,19 @@ compile_transaction_history (const struct TALER_MINTDB_TransactionList *tl)
&deposit->deposit_fee); &deposit->deposit_fee);
dr.merchant = deposit->merchant_pub; dr.merchant = deposit->merchant_pub;
dr.coin_pub = deposit->coin.coin_pub; dr.coin_pub = deposit->coin.coin_pub;
/* internal sanity check before we hand out a bogus sig... */
if (GNUNET_OK !=
GNUNET_CRYPTO_eddsa_verify (ntohl (dr.purpose.purpose),
&dr.purpose,
&deposit->csig.eddsa_signature,
&deposit->coin.coin_pub.eddsa_pub))
{
GNUNET_break (0);
json_decref (history);
return NULL;
}
transaction = TALER_json_from_eddsa_sig (&dr.purpose, transaction = TALER_json_from_eddsa_sig (&dr.purpose,
&deposit->csig.eddsa_signature); &deposit->csig.eddsa_signature);
break; break;
@ -435,6 +448,19 @@ compile_transaction_history (const struct TALER_MINTDB_TransactionList *tl)
TALER_amount_hton (&ms.melt_fee, TALER_amount_hton (&ms.melt_fee,
&melt->melt_fee); &melt->melt_fee);
ms.coin_pub = melt->coin.coin_pub; ms.coin_pub = melt->coin.coin_pub;
/* internal sanity check before we hand out a bogus sig... */
if (GNUNET_OK !=
GNUNET_CRYPTO_eddsa_verify (ntohl (ms.purpose.purpose),
&ms.purpose,
&melt->coin_sig.eddsa_signature,
&melt->coin.coin_pub.eddsa_pub))
{
GNUNET_break (0);
json_decref (history);
return NULL;
}
transaction = TALER_json_from_eddsa_sig (&ms.purpose, transaction = TALER_json_from_eddsa_sig (&ms.purpose,
&melt->coin_sig.eddsa_signature); &melt->coin_sig.eddsa_signature);
} }
@ -476,6 +502,8 @@ TMH_RESPONSE_reply_deposit_insufficient_funds (struct MHD_Connection *connection
json_t *history; json_t *history;
history = compile_transaction_history (tl); history = compile_transaction_history (tl);
if (NULL == history)
return TMH_RESPONSE_reply_internal_db_error (connection);
return TMH_RESPONSE_reply_json_pack (connection, return TMH_RESPONSE_reply_json_pack (connection,
MHD_HTTP_FORBIDDEN, MHD_HTTP_FORBIDDEN,
"{s:s, s:o}", "{s:s, s:o}",
@ -710,6 +738,8 @@ TMH_RESPONSE_reply_refresh_melt_insufficient_funds (struct MHD_Connection *conne
json_t *history; json_t *history;
history = compile_transaction_history (tl); history = compile_transaction_history (tl);
if (NULL == history)
return TMH_RESPONSE_reply_internal_db_error (connection);
return TMH_RESPONSE_reply_json_pack (connection, return TMH_RESPONSE_reply_json_pack (connection,
MHD_HTTP_FORBIDDEN, MHD_HTTP_FORBIDDEN,
"{s:s, s:o, s:o, s:o, s:o, s:o}", "{s:s, s:o, s:o, s:o, s:o, s:o}",