From 8776f16b0667be8ac8c05f743f7f2252363038bb Mon Sep 17 00:00:00 2001 From: Christian Grothoff Date: Wed, 20 Apr 2022 20:05:25 +0200 Subject: -refactor deposits_get logic to help ttn with signature logic refactoring --- src/exchange/taler-exchange-httpd_deposits_get.c | 117 +++++++++++++---------- 1 file changed, 67 insertions(+), 50 deletions(-) (limited to 'src/exchange/taler-exchange-httpd_deposits_get.c') diff --git a/src/exchange/taler-exchange-httpd_deposits_get.c b/src/exchange/taler-exchange-httpd_deposits_get.c index 72657d16e..50969b3a4 100644 --- a/src/exchange/taler-exchange-httpd_deposits_get.c +++ b/src/exchange/taler-exchange-httpd_deposits_get.c @@ -98,9 +98,26 @@ struct DepositWtidContext { /** - * Deposit details. + * Hash over the proposal data of the contract for which this deposit is made. */ - const struct TALER_DepositTrackPS *tps; + struct TALER_PrivateContractHashP h_contract_terms GNUNET_PACKED; + + /** + * Hash over the wiring information of the merchant. + */ + struct TALER_MerchantWireHashP h_wire GNUNET_PACKED; + + /** + * The Merchant's public key. The deposit inquiry request is to be + * signed by the corresponding private key (using EdDSA). + */ + struct TALER_MerchantPublicKeyP merchant; + + /** + * The coin's public key. This is the value that must have been + * signed (blindly) by the Exchange. + */ + struct TALER_CoinSpendPublicKeyP coin_pub; /** * Public key of the merchant. @@ -174,11 +191,10 @@ deposits_get_transaction (void *cls, struct TALER_Amount fee; qs = TEH_plugin->lookup_transfer_by_deposit (TEH_plugin->cls, - &ctx->tps->h_contract_terms, - &ctx->tps->h_wire, - &ctx->tps->coin_pub, + &ctx->h_contract_terms, + &ctx->h_wire, + &ctx->coin_pub, ctx->merchant_pub, - &pending, &ctx->wtid, &ctx->execution_time, @@ -224,21 +240,15 @@ deposits_get_transaction (void *cls, * Lookup and return the wire transfer identifier. * * @param connection the MHD connection to handle - * @param tps signed request to execute - * @param merchant_pub public key from the merchant + * @param ctx context of the signed request to execute * @return MHD result code */ static MHD_RESULT handle_track_transaction_request ( struct MHD_Connection *connection, - const struct TALER_DepositTrackPS *tps, - const struct TALER_MerchantPublicKeyP *merchant_pub) + struct DepositWtidContext *ctx) { MHD_RESULT mhd_ret; - struct DepositWtidContext ctx = { - .tps = tps, - .merchant_pub = merchant_pub - }; if (GNUNET_OK != TEH_DB_run_transaction (connection, @@ -246,30 +256,30 @@ handle_track_transaction_request ( TEH_MT_REQUEST_OTHER, &mhd_ret, &deposits_get_transaction, - &ctx)) + ctx)) return mhd_ret; - if (GNUNET_SYSERR == ctx.pending) + if (GNUNET_SYSERR == ctx->pending) return TALER_MHD_reply_with_error (connection, MHD_HTTP_INTERNAL_SERVER_ERROR, TALER_EC_GENERIC_DB_INVARIANT_FAILURE, "wire fees exceed aggregate in database"); - if (GNUNET_YES == ctx.pending) + if (GNUNET_YES == ctx->pending) return TALER_MHD_REPLY_JSON_PACK ( connection, MHD_HTTP_ACCEPTED, GNUNET_JSON_pack_uint64 ("payment_target_uuid", - ctx.kyc.payment_target_uuid), + ctx->kyc.payment_target_uuid), GNUNET_JSON_pack_bool ("kyc_ok", - ctx.kyc.ok), + ctx->kyc.ok), GNUNET_JSON_pack_timestamp ("execution_time", - ctx.execution_time)); + ctx->execution_time)); return reply_deposit_details (connection, - &tps->h_contract_terms, - &tps->h_wire, - &tps->coin_pub, - &ctx.coin_delta, - &ctx.wtid, - ctx.execution_time); + &ctx->h_contract_terms, + &ctx->h_wire, + &ctx->coin_pub, + &ctx->coin_delta, + &ctx->wtid, + ctx->execution_time); } @@ -279,16 +289,13 @@ TEH_handler_deposits_get (struct TEH_RequestContext *rc, { enum GNUNET_GenericReturnValue res; struct TALER_MerchantSignatureP merchant_sig; - struct TALER_DepositTrackPS tps = { - .purpose.size = htonl (sizeof (tps)), - .purpose.purpose = htonl (TALER_SIGNATURE_MERCHANT_TRACK_TRANSACTION) - }; + struct DepositWtidContext ctx; if (GNUNET_OK != GNUNET_STRINGS_string_to_data (args[0], strlen (args[0]), - &tps.h_wire, - sizeof (tps.h_wire))) + &ctx.h_wire, + sizeof (ctx.h_wire))) { GNUNET_break_op (0); return TALER_MHD_reply_with_error (rc->connection, @@ -299,8 +306,8 @@ TEH_handler_deposits_get (struct TEH_RequestContext *rc, if (GNUNET_OK != GNUNET_STRINGS_string_to_data (args[1], strlen (args[1]), - &tps.merchant, - sizeof (tps.merchant))) + &ctx.merchant, + sizeof (ctx.merchant))) { GNUNET_break_op (0); return TALER_MHD_reply_with_error (rc->connection, @@ -311,8 +318,8 @@ TEH_handler_deposits_get (struct TEH_RequestContext *rc, if (GNUNET_OK != GNUNET_STRINGS_string_to_data (args[2], strlen (args[2]), - &tps.h_contract_terms, - sizeof (tps.h_contract_terms))) + &ctx.h_contract_terms, + sizeof (ctx.h_contract_terms))) { GNUNET_break_op (0); return TALER_MHD_reply_with_error (rc->connection, @@ -323,8 +330,8 @@ TEH_handler_deposits_get (struct TEH_RequestContext *rc, if (GNUNET_OK != GNUNET_STRINGS_string_to_data (args[3], strlen (args[3]), - &tps.coin_pub, - sizeof (tps.coin_pub))) + &ctx.coin_pub, + sizeof (ctx.coin_pub))) { GNUNET_break_op (0); return TALER_MHD_reply_with_error (rc->connection, @@ -341,22 +348,32 @@ TEH_handler_deposits_get (struct TEH_RequestContext *rc, if (GNUNET_NO == res) return MHD_YES; /* parse error */ TEH_METRICS_num_verifications[TEH_MT_SIGNATURE_EDDSA]++; - if (GNUNET_OK != - GNUNET_CRYPTO_eddsa_verify (TALER_SIGNATURE_MERCHANT_TRACK_TRANSACTION, - &tps, - &merchant_sig.eddsa_sig, - &tps.merchant.eddsa_pub)) { - GNUNET_break_op (0); - return TALER_MHD_reply_with_error (rc->connection, - MHD_HTTP_FORBIDDEN, - TALER_EC_EXCHANGE_DEPOSITS_GET_MERCHANT_SIGNATURE_INVALID, - NULL); + struct TALER_DepositTrackPS tps = { + .purpose.size = htonl (sizeof (tps)), + .purpose.purpose = htonl (TALER_SIGNATURE_MERCHANT_TRACK_TRANSACTION), + .merchant = ctx.merchant, + .coin_pub = ctx.coin_pub, + .h_contract_terms = ctx.h_contract_terms, + .h_wire = ctx.h_wire + }; + + if (GNUNET_OK != + GNUNET_CRYPTO_eddsa_verify (TALER_SIGNATURE_MERCHANT_TRACK_TRANSACTION, + &tps, + &merchant_sig.eddsa_sig, + &tps.merchant.eddsa_pub)) + { + GNUNET_break_op (0); + return TALER_MHD_reply_with_error (rc->connection, + MHD_HTTP_FORBIDDEN, + TALER_EC_EXCHANGE_DEPOSITS_GET_MERCHANT_SIGNATURE_INVALID, + NULL); + } } return handle_track_transaction_request (rc->connection, - &tps, - &tps.merchant); + &ctx); } -- cgit v1.2.3