include h_extensions in deposit confirmation
This commit is contained in:
parent
57acad487d
commit
9d6e104066
@ -183,33 +183,25 @@ verify_and_execute_deposit_confirmation (
|
|||||||
}
|
}
|
||||||
|
|
||||||
/* check deposit confirmation signature */
|
/* check deposit confirmation signature */
|
||||||
|
if (GNUNET_OK !=
|
||||||
|
TALER_exchange_deposit_confirm_verify (&dc->h_contract_terms,
|
||||||
|
&dc->h_wire,
|
||||||
|
NULL /* h_extensions! */,
|
||||||
|
dc->exchange_timestamp,
|
||||||
|
dc->wire_deadline,
|
||||||
|
dc->refund_deadline,
|
||||||
|
&dc->amount_without_fee,
|
||||||
|
&dc->coin_pub,
|
||||||
|
&dc->merchant,
|
||||||
|
&dc->exchange_pub,
|
||||||
|
&dc->exchange_sig))
|
||||||
{
|
{
|
||||||
struct TALER_DepositConfirmationPS dcs = {
|
TALER_LOG_WARNING (
|
||||||
.purpose.purpose = htonl (TALER_SIGNATURE_EXCHANGE_CONFIRM_DEPOSIT),
|
"Invalid signature on /deposit-confirmation request\n");
|
||||||
.purpose.size = htonl (sizeof (struct TALER_DepositConfirmationPS)),
|
return TALER_MHD_reply_with_error (connection,
|
||||||
.h_contract_terms = dc->h_contract_terms,
|
MHD_HTTP_FORBIDDEN,
|
||||||
.h_wire = dc->h_wire,
|
TALER_EC_AUDITOR_DEPOSIT_CONFIRMATION_SIGNATURE_INVALID,
|
||||||
.exchange_timestamp = GNUNET_TIME_absolute_hton (dc->exchange_timestamp),
|
"exchange signature invalid");
|
||||||
.refund_deadline = GNUNET_TIME_absolute_hton (dc->refund_deadline),
|
|
||||||
.coin_pub = dc->coin_pub,
|
|
||||||
.merchant = dc->merchant
|
|
||||||
};
|
|
||||||
|
|
||||||
TALER_amount_hton (&dcs.amount_without_fee,
|
|
||||||
&dc->amount_without_fee);
|
|
||||||
if (GNUNET_OK !=
|
|
||||||
GNUNET_CRYPTO_eddsa_verify (TALER_SIGNATURE_EXCHANGE_CONFIRM_DEPOSIT,
|
|
||||||
&dcs,
|
|
||||||
&dc->exchange_sig.eddsa_signature,
|
|
||||||
&dc->exchange_pub.eddsa_pub))
|
|
||||||
{
|
|
||||||
TALER_LOG_WARNING (
|
|
||||||
"Invalid signature on /deposit-confirmation request\n");
|
|
||||||
return TALER_MHD_reply_with_error (connection,
|
|
||||||
MHD_HTTP_FORBIDDEN,
|
|
||||||
TALER_EC_AUDITOR_DEPOSIT_CONFIRMATION_SIGNATURE_INVALID,
|
|
||||||
"exchange signature invalid");
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/* execute transaction */
|
/* execute transaction */
|
||||||
@ -263,6 +255,8 @@ TAH_DEPOSIT_CONFIRMATION_handler (struct TAH_RequestHandler *rh,
|
|||||||
&dc.exchange_timestamp),
|
&dc.exchange_timestamp),
|
||||||
TALER_JSON_spec_absolute_time ("refund_deadline",
|
TALER_JSON_spec_absolute_time ("refund_deadline",
|
||||||
&dc.refund_deadline),
|
&dc.refund_deadline),
|
||||||
|
TALER_JSON_spec_absolute_time ("wire_deadline",
|
||||||
|
&dc.wire_deadline),
|
||||||
TALER_JSON_spec_amount ("amount_without_fee",
|
TALER_JSON_spec_amount ("amount_without_fee",
|
||||||
TAH_currency,
|
TAH_currency,
|
||||||
&dc.amount_without_fee),
|
&dc.amount_without_fee),
|
||||||
|
@ -231,6 +231,7 @@ CREATE TABLE IF NOT EXISTS deposit_confirmations
|
|||||||
,h_wire BYTEA CHECK (LENGTH(h_wire)=64)
|
,h_wire BYTEA CHECK (LENGTH(h_wire)=64)
|
||||||
,exchange_timestamp INT8 NOT NULL
|
,exchange_timestamp INT8 NOT NULL
|
||||||
,refund_deadline INT8 NOT NULL
|
,refund_deadline INT8 NOT NULL
|
||||||
|
,wire_deadline INT8 NOT NULL
|
||||||
,amount_without_fee_val INT8 NOT NULL
|
,amount_without_fee_val INT8 NOT NULL
|
||||||
,amount_without_fee_frac INT4 NOT NULL
|
,amount_without_fee_frac INT4 NOT NULL
|
||||||
,coin_pub BYTEA CHECK (LENGTH(coin_pub)=32)
|
,coin_pub BYTEA CHECK (LENGTH(coin_pub)=32)
|
||||||
|
@ -1032,6 +1032,7 @@ postgres_insert_deposit_confirmation (
|
|||||||
GNUNET_PQ_query_param_auto_from_type (&dc->h_wire),
|
GNUNET_PQ_query_param_auto_from_type (&dc->h_wire),
|
||||||
TALER_PQ_query_param_absolute_time (&dc->exchange_timestamp),
|
TALER_PQ_query_param_absolute_time (&dc->exchange_timestamp),
|
||||||
TALER_PQ_query_param_absolute_time (&dc->refund_deadline),
|
TALER_PQ_query_param_absolute_time (&dc->refund_deadline),
|
||||||
|
TALER_PQ_query_param_absolute_time (&dc->wire_deadline),
|
||||||
TALER_PQ_query_param_amount (&dc->amount_without_fee),
|
TALER_PQ_query_param_amount (&dc->amount_without_fee),
|
||||||
GNUNET_PQ_query_param_auto_from_type (&dc->coin_pub),
|
GNUNET_PQ_query_param_auto_from_type (&dc->coin_pub),
|
||||||
GNUNET_PQ_query_param_auto_from_type (&dc->merchant),
|
GNUNET_PQ_query_param_auto_from_type (&dc->merchant),
|
||||||
@ -1114,6 +1115,8 @@ deposit_confirmation_cb (void *cls,
|
|||||||
&dc.exchange_timestamp),
|
&dc.exchange_timestamp),
|
||||||
GNUNET_PQ_result_spec_absolute_time ("refund_deadline",
|
GNUNET_PQ_result_spec_absolute_time ("refund_deadline",
|
||||||
&dc.refund_deadline),
|
&dc.refund_deadline),
|
||||||
|
GNUNET_PQ_result_spec_absolute_time ("wire_deadline",
|
||||||
|
&dc.wire_deadline),
|
||||||
TALER_PQ_RESULT_SPEC_AMOUNT ("amount_without_fee",
|
TALER_PQ_RESULT_SPEC_AMOUNT ("amount_without_fee",
|
||||||
&dc.amount_without_fee),
|
&dc.amount_without_fee),
|
||||||
GNUNET_PQ_result_spec_auto_from_type ("coin_pub",
|
GNUNET_PQ_result_spec_auto_from_type ("coin_pub",
|
||||||
|
@ -58,9 +58,11 @@ static MHD_RESULT
|
|||||||
reply_deposit_success (struct MHD_Connection *connection,
|
reply_deposit_success (struct MHD_Connection *connection,
|
||||||
const struct TALER_CoinSpendPublicKeyP *coin_pub,
|
const struct TALER_CoinSpendPublicKeyP *coin_pub,
|
||||||
const struct TALER_MerchantWireHash *h_wire,
|
const struct TALER_MerchantWireHash *h_wire,
|
||||||
|
const struct TALER_ExtensionContractHash *h_extensions,
|
||||||
const struct TALER_PrivateContractHash *h_contract_terms,
|
const struct TALER_PrivateContractHash *h_contract_terms,
|
||||||
struct GNUNET_TIME_Absolute exchange_timestamp,
|
struct GNUNET_TIME_Absolute exchange_timestamp,
|
||||||
struct GNUNET_TIME_Absolute refund_deadline,
|
struct GNUNET_TIME_Absolute refund_deadline,
|
||||||
|
struct GNUNET_TIME_Absolute wire_deadline,
|
||||||
const struct TALER_MerchantPublicKeyP *merchant,
|
const struct TALER_MerchantPublicKeyP *merchant,
|
||||||
const struct TALER_Amount *amount_without_fee)
|
const struct TALER_Amount *amount_without_fee)
|
||||||
{
|
{
|
||||||
@ -73,11 +75,14 @@ reply_deposit_success (struct MHD_Connection *connection,
|
|||||||
.h_wire = *h_wire,
|
.h_wire = *h_wire,
|
||||||
.exchange_timestamp = GNUNET_TIME_absolute_hton (exchange_timestamp),
|
.exchange_timestamp = GNUNET_TIME_absolute_hton (exchange_timestamp),
|
||||||
.refund_deadline = GNUNET_TIME_absolute_hton (refund_deadline),
|
.refund_deadline = GNUNET_TIME_absolute_hton (refund_deadline),
|
||||||
|
.wire_deadline = GNUNET_TIME_absolute_hton (wire_deadline),
|
||||||
.coin_pub = *coin_pub,
|
.coin_pub = *coin_pub,
|
||||||
.merchant = *merchant
|
.merchant_pub = *merchant
|
||||||
};
|
};
|
||||||
enum TALER_ErrorCode ec;
|
enum TALER_ErrorCode ec;
|
||||||
|
|
||||||
|
if (NULL != h_extensions)
|
||||||
|
dc.h_extensions = *h_extensions;
|
||||||
TALER_amount_hton (&dc.amount_without_fee,
|
TALER_amount_hton (&dc.amount_without_fee,
|
||||||
amount_without_fee);
|
amount_without_fee);
|
||||||
if (TALER_EC_NONE !=
|
if (TALER_EC_NONE !=
|
||||||
@ -184,9 +189,11 @@ deposit_precheck (void *cls,
|
|||||||
*mhd_ret = reply_deposit_success (connection,
|
*mhd_ret = reply_deposit_success (connection,
|
||||||
&deposit->coin.coin_pub,
|
&deposit->coin.coin_pub,
|
||||||
&dc->h_wire,
|
&dc->h_wire,
|
||||||
|
NULL /* h_extensions! */,
|
||||||
&deposit->h_contract_terms,
|
&deposit->h_contract_terms,
|
||||||
dc->exchange_timestamp,
|
dc->exchange_timestamp,
|
||||||
deposit->refund_deadline,
|
deposit->refund_deadline,
|
||||||
|
deposit->wire_deadline,
|
||||||
&deposit->merchant_pub,
|
&deposit->merchant_pub,
|
||||||
&amount_without_fee);
|
&amount_without_fee);
|
||||||
/* Treat as 'hard' DB error as we want to rollback and
|
/* Treat as 'hard' DB error as we want to rollback and
|
||||||
@ -559,9 +566,11 @@ TEH_handler_deposit (struct MHD_Connection *connection,
|
|||||||
res = reply_deposit_success (connection,
|
res = reply_deposit_success (connection,
|
||||||
&deposit.coin.coin_pub,
|
&deposit.coin.coin_pub,
|
||||||
&dc.h_wire,
|
&dc.h_wire,
|
||||||
|
NULL /* h_extensions! */,
|
||||||
&deposit.h_contract_terms,
|
&deposit.h_contract_terms,
|
||||||
dc.exchange_timestamp,
|
dc.exchange_timestamp,
|
||||||
deposit.refund_deadline,
|
deposit.refund_deadline,
|
||||||
|
deposit.wire_deadline,
|
||||||
&deposit.merchant_pub,
|
&deposit.merchant_pub,
|
||||||
&amount_without_fee);
|
&amount_without_fee);
|
||||||
GNUNET_JSON_parse_free (spec);
|
GNUNET_JSON_parse_free (spec);
|
||||||
|
@ -235,6 +235,7 @@ typedef void
|
|||||||
* @param h_wire hash of merchant wire details
|
* @param h_wire hash of merchant wire details
|
||||||
* @param h_contract_terms hash of the contact of the merchant with the customer (further details are never disclosed to the auditor)
|
* @param h_contract_terms hash of the contact of the merchant with the customer (further details are never disclosed to the auditor)
|
||||||
* @param exchange_timestamp timestamp when the contract was finalized, must not be too far in the future
|
* @param exchange_timestamp timestamp when the contract was finalized, must not be too far in the future
|
||||||
|
* @param wire_deadline date until which the exchange should wire the funds
|
||||||
* @param refund_deadline date until which the merchant can issue a refund to the customer via the auditor (can be zero if refunds are not allowed); must not be after the @a wire_deadline
|
* @param refund_deadline date until which the merchant can issue a refund to the customer via the auditor (can be zero if refunds are not allowed); must not be after the @a wire_deadline
|
||||||
* @param amount_without_fee the amount confirmed to be wired by the exchange to the merchant
|
* @param amount_without_fee the amount confirmed to be wired by the exchange to the merchant
|
||||||
* @param coin_pub coin’s public key
|
* @param coin_pub coin’s public key
|
||||||
@ -257,6 +258,7 @@ TALER_AUDITOR_deposit_confirmation (
|
|||||||
const struct TALER_MerchantWireHash *h_wire,
|
const struct TALER_MerchantWireHash *h_wire,
|
||||||
const struct TALER_PrivateContractHash *h_contract_terms,
|
const struct TALER_PrivateContractHash *h_contract_terms,
|
||||||
struct GNUNET_TIME_Absolute timestamp,
|
struct GNUNET_TIME_Absolute timestamp,
|
||||||
|
struct GNUNET_TIME_Absolute wire_deadline,
|
||||||
struct GNUNET_TIME_Absolute refund_deadline,
|
struct GNUNET_TIME_Absolute refund_deadline,
|
||||||
const struct TALER_Amount *amount_without_fee,
|
const struct TALER_Amount *amount_without_fee,
|
||||||
const struct TALER_CoinSpendPublicKeyP *coin_pub,
|
const struct TALER_CoinSpendPublicKeyP *coin_pub,
|
||||||
|
@ -295,6 +295,11 @@ struct TALER_AUDITORDB_DepositConfirmation
|
|||||||
*/
|
*/
|
||||||
struct GNUNET_TIME_Absolute refund_deadline;
|
struct GNUNET_TIME_Absolute refund_deadline;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* How much time does the @e exchange have to wire the funds?
|
||||||
|
*/
|
||||||
|
struct GNUNET_TIME_Absolute wire_deadline;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Amount to be deposited, excluding fee. Calculated from the
|
* Amount to be deposited, excluding fee. Calculated from the
|
||||||
* amount with fee and the fee from the deposit request.
|
* amount with fee and the fee from the deposit request.
|
||||||
|
@ -1547,6 +1547,40 @@ TALER_CRYPTO_helper_esign_disconnect (
|
|||||||
struct TALER_CRYPTO_ExchangeSignHelper *esh);
|
struct TALER_CRYPTO_ExchangeSignHelper *esh);
|
||||||
|
|
||||||
|
|
||||||
|
/* ********************* exchange signing ************************** */
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Verify a deposit confirmation.
|
||||||
|
*
|
||||||
|
* @param h_contract_terms hash of the contact of the merchant with the customer (further details are never disclosed to the exchange)
|
||||||
|
* @param h_wire hash of the merchant’s account details
|
||||||
|
* @param h_extensions hash over the extensions, can be NULL
|
||||||
|
* @param exchange_timestamp timestamp when the contract was finalized, must not be too far off
|
||||||
|
* @param wire_deadline date until which the exchange should wire the funds
|
||||||
|
* @param refund_deadline date until which the merchant can issue a refund to the customer via the exchange (can be zero if refunds are not allowed); must not be after the @a wire_deadline
|
||||||
|
* @param amount_without_fee the amount to be deposited after fees
|
||||||
|
* @param coin_pub public key of the deposited coin
|
||||||
|
* @param merchant_pub the public key of the merchant (used to identify the merchant for refund requests)
|
||||||
|
* @param exchange_pub exchange's online signing public key
|
||||||
|
* @param exchange_sig the signature made with purpose #TALER_SIGNATURE_EXCHANGE_CONFIRM_DEPOSIT
|
||||||
|
* @return #GNUNET_OK if the signature is valid
|
||||||
|
*/
|
||||||
|
enum GNUNET_GenericReturnValue
|
||||||
|
TALER_exchange_deposit_confirm_verify (
|
||||||
|
const struct TALER_PrivateContractHash *h_contract_terms,
|
||||||
|
const struct TALER_MerchantWireHash *h_wire,
|
||||||
|
const struct TALER_ExtensionContractHash *h_extensions,
|
||||||
|
struct GNUNET_TIME_Absolute exchange_timestamp,
|
||||||
|
struct GNUNET_TIME_Absolute wire_deadline,
|
||||||
|
struct GNUNET_TIME_Absolute refund_deadline,
|
||||||
|
const struct TALER_Amount *amount_without_fee,
|
||||||
|
const struct TALER_CoinSpendPublicKeyP *coin_pub,
|
||||||
|
const struct TALER_MerchantPublicKeyP *merchant_pub,
|
||||||
|
const struct TALER_ExchangePublicKeyP *exchange_pub,
|
||||||
|
const struct TALER_ExchangeSignatureP *exchange_sig);
|
||||||
|
|
||||||
|
|
||||||
/* ********************* wallet signing ************************** */
|
/* ********************* wallet signing ************************** */
|
||||||
|
|
||||||
|
|
||||||
|
@ -555,12 +555,24 @@ struct TALER_DepositConfirmationPS
|
|||||||
*/
|
*/
|
||||||
struct TALER_MerchantWireHash h_wire GNUNET_PACKED;
|
struct TALER_MerchantWireHash h_wire GNUNET_PACKED;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Hash over the extension options of the deposit, 0 if there
|
||||||
|
* were not extension options.
|
||||||
|
*/
|
||||||
|
struct TALER_ExtensionContractHash h_extensions GNUNET_PACKED;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Time when this confirmation was generated / when the exchange received
|
* Time when this confirmation was generated / when the exchange received
|
||||||
* the deposit request.
|
* the deposit request.
|
||||||
*/
|
*/
|
||||||
struct GNUNET_TIME_AbsoluteNBO exchange_timestamp;
|
struct GNUNET_TIME_AbsoluteNBO exchange_timestamp;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* By when does the exchange expect to pay the merchant
|
||||||
|
* (as per the merchant's request).
|
||||||
|
*/
|
||||||
|
struct GNUNET_TIME_AbsoluteNBO wire_deadline;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* How much time does the @e merchant have to issue a refund
|
* How much time does the @e merchant have to issue a refund
|
||||||
* request? Zero if refunds are not allowed. After this time, the
|
* request? Zero if refunds are not allowed. After this time, the
|
||||||
@ -577,9 +589,7 @@ struct TALER_DepositConfirmationPS
|
|||||||
struct TALER_AmountNBO amount_without_fee;
|
struct TALER_AmountNBO amount_without_fee;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* The coin's public key. This is the value that must have been
|
* The public key of the coin that was deposited.
|
||||||
* signed (blindly) by the Exchange. The deposit request is to be
|
|
||||||
* signed by the corresponding private key (using EdDSA).
|
|
||||||
*/
|
*/
|
||||||
struct TALER_CoinSpendPublicKeyP coin_pub;
|
struct TALER_CoinSpendPublicKeyP coin_pub;
|
||||||
|
|
||||||
@ -587,7 +597,7 @@ struct TALER_DepositConfirmationPS
|
|||||||
* The Merchant's public key. Allows the merchant to later refund
|
* The Merchant's public key. Allows the merchant to later refund
|
||||||
* the transaction or to inquire about the wire transfer identifier.
|
* the transaction or to inquire about the wire transfer identifier.
|
||||||
*/
|
*/
|
||||||
struct TALER_MerchantPublicKeyP merchant;
|
struct TALER_MerchantPublicKeyP merchant_pub;
|
||||||
|
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@ -2379,6 +2379,8 @@ TALER_TESTING_get_trait (const struct TALER_TESTING_Trait *traits,
|
|||||||
op (coin_priv, const struct TALER_CoinSpendPrivateKeyP) \
|
op (coin_priv, const struct TALER_CoinSpendPrivateKeyP) \
|
||||||
op (coin_pub, const struct TALER_CoinSpendPublicKeyP) \
|
op (coin_pub, const struct TALER_CoinSpendPublicKeyP) \
|
||||||
op (absolute_time, const struct GNUNET_TIME_Absolute) \
|
op (absolute_time, const struct GNUNET_TIME_Absolute) \
|
||||||
|
op (wire_deadline, const struct GNUNET_TIME_Absolute) \
|
||||||
|
op (refund_deadline, const struct GNUNET_TIME_Absolute) \
|
||||||
op (exchange_pub, const struct TALER_ExchangePublicKeyP) \
|
op (exchange_pub, const struct TALER_ExchangePublicKeyP) \
|
||||||
op (exchange_sig, const struct TALER_ExchangeSignatureP) \
|
op (exchange_sig, const struct TALER_ExchangeSignatureP) \
|
||||||
op (blinding_key, const union TALER_DenominationBlindingKeyP)
|
op (blinding_key, const union TALER_DenominationBlindingKeyP)
|
||||||
|
@ -168,10 +168,11 @@ handle_deposit_confirmation_finished (void *cls,
|
|||||||
* @param master_sig master signature affirming validity of @a exchange_pub
|
* @param master_sig master signature affirming validity of @a exchange_pub
|
||||||
* @return #GNUNET_OK if signatures are OK, #GNUNET_SYSERR if not
|
* @return #GNUNET_OK if signatures are OK, #GNUNET_SYSERR if not
|
||||||
*/
|
*/
|
||||||
static int
|
static enum GNUNET_GenericReturnValue
|
||||||
verify_signatures (const struct TALER_MerchantWireHash *h_wire,
|
verify_signatures (const struct TALER_MerchantWireHash *h_wire,
|
||||||
const struct TALER_PrivateContractHash *h_contract_terms,
|
const struct TALER_PrivateContractHash *h_contract_terms,
|
||||||
struct GNUNET_TIME_Absolute exchange_timestamp,
|
struct GNUNET_TIME_Absolute exchange_timestamp,
|
||||||
|
struct GNUNET_TIME_Absolute wire_deadline,
|
||||||
struct GNUNET_TIME_Absolute refund_deadline,
|
struct GNUNET_TIME_Absolute refund_deadline,
|
||||||
const struct TALER_Amount *amount_without_fee,
|
const struct TALER_Amount *amount_without_fee,
|
||||||
const struct TALER_CoinSpendPublicKeyP *coin_pub,
|
const struct TALER_CoinSpendPublicKeyP *coin_pub,
|
||||||
@ -184,36 +185,29 @@ verify_signatures (const struct TALER_MerchantWireHash *h_wire,
|
|||||||
struct GNUNET_TIME_Absolute ep_end,
|
struct GNUNET_TIME_Absolute ep_end,
|
||||||
const struct TALER_MasterSignatureP *master_sig)
|
const struct TALER_MasterSignatureP *master_sig)
|
||||||
{
|
{
|
||||||
|
if (GNUNET_OK !=
|
||||||
|
TALER_exchange_deposit_confirm_verify (h_contract_terms,
|
||||||
|
h_wire,
|
||||||
|
NULL /* h_extensions! */,
|
||||||
|
exchange_timestamp,
|
||||||
|
wire_deadline,
|
||||||
|
refund_deadline,
|
||||||
|
amount_without_fee,
|
||||||
|
coin_pub,
|
||||||
|
merchant_pub,
|
||||||
|
exchange_pub,
|
||||||
|
exchange_sig))
|
||||||
{
|
{
|
||||||
struct TALER_DepositConfirmationPS dc = {
|
GNUNET_break_op (0);
|
||||||
.purpose.purpose = htonl (TALER_SIGNATURE_EXCHANGE_CONFIRM_DEPOSIT),
|
TALER_LOG_WARNING (
|
||||||
.purpose.size = htonl (sizeof (dc)),
|
"Invalid signature on /deposit-confirmation request!\n");
|
||||||
.h_contract_terms = *h_contract_terms,
|
|
||||||
.h_wire = *h_wire,
|
|
||||||
.exchange_timestamp = GNUNET_TIME_absolute_hton (exchange_timestamp),
|
|
||||||
.refund_deadline = GNUNET_TIME_absolute_hton (refund_deadline),
|
|
||||||
.coin_pub = *coin_pub,
|
|
||||||
.merchant = *merchant_pub
|
|
||||||
};
|
|
||||||
|
|
||||||
TALER_amount_hton (&dc.amount_without_fee,
|
|
||||||
amount_without_fee);
|
|
||||||
if (GNUNET_OK !=
|
|
||||||
GNUNET_CRYPTO_eddsa_verify (TALER_SIGNATURE_EXCHANGE_CONFIRM_DEPOSIT,
|
|
||||||
&dc,
|
|
||||||
&exchange_sig->eddsa_signature,
|
|
||||||
&exchange_pub->eddsa_pub))
|
|
||||||
{
|
{
|
||||||
GNUNET_break_op (0);
|
TALER_LOG_DEBUG ("... amount_without_fee was %s\n",
|
||||||
TALER_LOG_WARNING (
|
TALER_amount2s (amount_without_fee));
|
||||||
"Invalid signature on /deposit-confirmation request!\n");
|
|
||||||
{
|
|
||||||
TALER_LOG_DEBUG ("... amount_without_fee was %s\n",
|
|
||||||
TALER_amount2s (amount_without_fee));
|
|
||||||
}
|
|
||||||
return GNUNET_SYSERR;
|
|
||||||
}
|
}
|
||||||
|
return GNUNET_SYSERR;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (GNUNET_OK !=
|
if (GNUNET_OK !=
|
||||||
TALER_exchange_offline_signkey_validity_verify (
|
TALER_exchange_offline_signkey_validity_verify (
|
||||||
exchange_pub,
|
exchange_pub,
|
||||||
@ -237,45 +231,13 @@ verify_signatures (const struct TALER_MerchantWireHash *h_wire,
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Submit a deposit-confirmation permission to the auditor and get the
|
|
||||||
* auditor's response. Note that while we return the response
|
|
||||||
* verbatim to the caller for further processing, we do already verify
|
|
||||||
* that the response is well-formed. If the auditor's reply is not
|
|
||||||
* well-formed, we return an HTTP status code of zero to @a cb.
|
|
||||||
*
|
|
||||||
* We also verify that the @a exchange_sig is valid for this deposit-confirmation
|
|
||||||
* request, and that the @a master_sig is a valid signature for @a
|
|
||||||
* exchange_pub. Also, the @a auditor must be ready to operate (i.e. have
|
|
||||||
* finished processing the /version reply). If either check fails, we do
|
|
||||||
* NOT initiate the transaction with the auditor and instead return NULL.
|
|
||||||
*
|
|
||||||
* @param auditor the auditor handle; the auditor must be ready to operate
|
|
||||||
* @param h_wire hash of merchant wire details
|
|
||||||
* @param h_contract_terms hash of the contact of the merchant with the customer (further details are never disclosed to the auditor)
|
|
||||||
* @param exchange_timestamp timestamp when deposit was received by the exchange
|
|
||||||
* @param refund_deadline date until which the merchant can issue a refund to the customer via the auditor (can be zero if refunds are not allowed); must not be after the @a wire_deadline
|
|
||||||
* @param amount_without_fee the amount confirmed to be wired by the exchange to the merchant
|
|
||||||
* @param coin_pub coin’s public key
|
|
||||||
* @param merchant_pub the public key of the merchant (used to identify the merchant for refund requests)
|
|
||||||
* @param exchange_sig the signature made with purpose #TALER_SIGNATURE_EXCHANGE_CONFIRM_DEPOSIT
|
|
||||||
* @param exchange_pub the public key of the exchange that matches @a exchange_sig
|
|
||||||
* @param master_pub master public key of the exchange
|
|
||||||
* @param ep_start when does @a exchange_pub validity start
|
|
||||||
* @param ep_expire when does @a exchange_pub usage end
|
|
||||||
* @param ep_end when does @a exchange_pub legal validity end
|
|
||||||
* @param master_sig master signature affirming validity of @a exchange_pub
|
|
||||||
* @param cb the callback to call when a reply for this request is available
|
|
||||||
* @param cb_cls closure for the above callback
|
|
||||||
* @return a handle for this request; NULL if the inputs are invalid (i.e.
|
|
||||||
* signatures fail to verify). In this case, the callback is not called.
|
|
||||||
*/
|
|
||||||
struct TALER_AUDITOR_DepositConfirmationHandle *
|
struct TALER_AUDITOR_DepositConfirmationHandle *
|
||||||
TALER_AUDITOR_deposit_confirmation (
|
TALER_AUDITOR_deposit_confirmation (
|
||||||
struct TALER_AUDITOR_Handle *auditor,
|
struct TALER_AUDITOR_Handle *auditor,
|
||||||
const struct TALER_MerchantWireHash *h_wire,
|
const struct TALER_MerchantWireHash *h_wire,
|
||||||
const struct TALER_PrivateContractHash *h_contract_terms,
|
const struct TALER_PrivateContractHash *h_contract_terms,
|
||||||
struct GNUNET_TIME_Absolute exchange_timestamp,
|
struct GNUNET_TIME_Absolute exchange_timestamp,
|
||||||
|
struct GNUNET_TIME_Absolute wire_deadline,
|
||||||
struct GNUNET_TIME_Absolute refund_deadline,
|
struct GNUNET_TIME_Absolute refund_deadline,
|
||||||
const struct TALER_Amount *amount_without_fee,
|
const struct TALER_Amount *amount_without_fee,
|
||||||
const struct TALER_CoinSpendPublicKeyP *coin_pub,
|
const struct TALER_CoinSpendPublicKeyP *coin_pub,
|
||||||
@ -306,6 +268,7 @@ TALER_AUDITOR_deposit_confirmation (
|
|||||||
verify_signatures (h_wire,
|
verify_signatures (h_wire,
|
||||||
h_contract_terms,
|
h_contract_terms,
|
||||||
exchange_timestamp,
|
exchange_timestamp,
|
||||||
|
wire_deadline,
|
||||||
refund_deadline,
|
refund_deadline,
|
||||||
amount_without_fee,
|
amount_without_fee,
|
||||||
coin_pub,
|
coin_pub,
|
||||||
@ -332,6 +295,8 @@ TALER_AUDITOR_deposit_confirmation (
|
|||||||
exchange_timestamp),
|
exchange_timestamp),
|
||||||
GNUNET_JSON_pack_time_abs ("refund_deadline",
|
GNUNET_JSON_pack_time_abs ("refund_deadline",
|
||||||
refund_deadline),
|
refund_deadline),
|
||||||
|
GNUNET_JSON_pack_time_abs ("wire_deadline",
|
||||||
|
wire_deadline),
|
||||||
TALER_JSON_pack_amount ("amount_without_fee",
|
TALER_JSON_pack_amount ("amount_without_fee",
|
||||||
amount_without_fee),
|
amount_without_fee),
|
||||||
GNUNET_JSON_pack_data_auto ("coin_pub",
|
GNUNET_JSON_pack_data_auto ("coin_pub",
|
||||||
@ -397,12 +362,6 @@ TALER_AUDITOR_deposit_confirmation (
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Cancel a deposit-confirmation permission request. This function cannot be used
|
|
||||||
* on a request handle if a response is already served for it.
|
|
||||||
*
|
|
||||||
* @param deposit_confirmation the deposit-confirmation permission request handle
|
|
||||||
*/
|
|
||||||
void
|
void
|
||||||
TALER_AUDITOR_deposit_confirmation_cancel (
|
TALER_AUDITOR_deposit_confirmation_cancel (
|
||||||
struct TALER_AUDITOR_DepositConfirmationHandle *deposit_confirmation)
|
struct TALER_AUDITOR_DepositConfirmationHandle *deposit_confirmation)
|
||||||
|
@ -81,9 +81,58 @@ struct TALER_EXCHANGE_DepositHandle
|
|||||||
void *cb_cls;
|
void *cb_cls;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Information the exchange should sign in response.
|
* Hash over the contract for which this deposit is made.
|
||||||
*/
|
*/
|
||||||
struct TALER_DepositConfirmationPS depconf;
|
struct TALER_PrivateContractHash h_contract_terms GNUNET_PACKED;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Hash over the wiring information of the merchant.
|
||||||
|
*/
|
||||||
|
struct TALER_MerchantWireHash h_wire GNUNET_PACKED;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Hash over the extension options of the deposit, 0 if there
|
||||||
|
* were not extension options.
|
||||||
|
*/
|
||||||
|
struct TALER_ExtensionContractHash h_extensions GNUNET_PACKED;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Time when this confirmation was generated / when the exchange received
|
||||||
|
* the deposit request.
|
||||||
|
*/
|
||||||
|
struct GNUNET_TIME_Absolute exchange_timestamp;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* By when does the exchange expect to pay the merchant
|
||||||
|
* (as per the merchant's request).
|
||||||
|
*/
|
||||||
|
struct GNUNET_TIME_Absolute wire_deadline;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* How much time does the @e merchant have to issue a refund
|
||||||
|
* request? Zero if refunds are not allowed. After this time, the
|
||||||
|
* coin cannot be refunded. Note that the wire transfer will not be
|
||||||
|
* performed by the exchange until the refund deadline. This value
|
||||||
|
* is taken from the original deposit request.
|
||||||
|
*/
|
||||||
|
struct GNUNET_TIME_Absolute refund_deadline;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Amount to be deposited, excluding fee. Calculated from the
|
||||||
|
* amount with fee and the fee from the deposit request.
|
||||||
|
*/
|
||||||
|
struct TALER_Amount amount_without_fee;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* The public key of the coin that was deposited.
|
||||||
|
*/
|
||||||
|
struct TALER_CoinSpendPublicKeyP coin_pub;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* The Merchant's public key. Allows the merchant to later refund
|
||||||
|
* the transaction or to inquire about the wire transfer identifier.
|
||||||
|
*/
|
||||||
|
struct TALER_MerchantPublicKeyP merchant_pub;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Exchange signature, set for #auditor_cb.
|
* Exchange signature, set for #auditor_cb.
|
||||||
@ -132,7 +181,6 @@ auditor_cb (void *cls,
|
|||||||
struct TALER_EXCHANGE_DepositHandle *dh = cls;
|
struct TALER_EXCHANGE_DepositHandle *dh = cls;
|
||||||
const struct TALER_EXCHANGE_Keys *key_state;
|
const struct TALER_EXCHANGE_Keys *key_state;
|
||||||
const struct TALER_EXCHANGE_SigningPublicKey *spk;
|
const struct TALER_EXCHANGE_SigningPublicKey *spk;
|
||||||
struct TALER_Amount amount_without_fee;
|
|
||||||
struct TEAH_AuditorInteractionEntry *aie;
|
struct TEAH_AuditorInteractionEntry *aie;
|
||||||
|
|
||||||
if (0 != GNUNET_CRYPTO_random_u32 (GNUNET_CRYPTO_QUALITY_WEAK,
|
if (0 != GNUNET_CRYPTO_random_u32 (GNUNET_CRYPTO_QUALITY_WEAK,
|
||||||
@ -153,18 +201,17 @@ auditor_cb (void *cls,
|
|||||||
GNUNET_break_op (0);
|
GNUNET_break_op (0);
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
TALER_amount_ntoh (&amount_without_fee,
|
|
||||||
&dh->depconf.amount_without_fee);
|
|
||||||
aie = GNUNET_new (struct TEAH_AuditorInteractionEntry);
|
aie = GNUNET_new (struct TEAH_AuditorInteractionEntry);
|
||||||
aie->dch = TALER_AUDITOR_deposit_confirmation (
|
aie->dch = TALER_AUDITOR_deposit_confirmation (
|
||||||
ah,
|
ah,
|
||||||
&dh->depconf.h_wire,
|
&dh->h_wire,
|
||||||
&dh->depconf.h_contract_terms,
|
&dh->h_contract_terms,
|
||||||
GNUNET_TIME_absolute_ntoh (dh->depconf.exchange_timestamp),
|
dh->exchange_timestamp,
|
||||||
GNUNET_TIME_absolute_ntoh (dh->depconf.refund_deadline),
|
dh->wire_deadline,
|
||||||
&amount_without_fee,
|
dh->refund_deadline,
|
||||||
&dh->depconf.coin_pub,
|
&dh->amount_without_fee,
|
||||||
&dh->depconf.merchant,
|
&dh->coin_pub,
|
||||||
|
&dh->merchant_pub,
|
||||||
&dh->exchange_pub,
|
&dh->exchange_pub,
|
||||||
&dh->exchange_sig,
|
&dh->exchange_sig,
|
||||||
&key_state->master_pub,
|
&key_state->master_pub,
|
||||||
@ -204,7 +251,7 @@ verify_deposit_signature_conflict (
|
|||||||
if (GNUNET_OK !=
|
if (GNUNET_OK !=
|
||||||
TALER_EXCHANGE_verify_coin_history (&dh->dki,
|
TALER_EXCHANGE_verify_coin_history (&dh->dki,
|
||||||
dh->dki.value.currency,
|
dh->dki.value.currency,
|
||||||
&dh->depconf.coin_pub,
|
&dh->coin_pub,
|
||||||
history,
|
history,
|
||||||
&h_denom_pub,
|
&h_denom_pub,
|
||||||
&total))
|
&total))
|
||||||
@ -286,8 +333,8 @@ handle_deposit_finished (void *cls,
|
|||||||
GNUNET_JSON_spec_mark_optional (
|
GNUNET_JSON_spec_mark_optional (
|
||||||
GNUNET_JSON_spec_string ("transaction_base_url",
|
GNUNET_JSON_spec_string ("transaction_base_url",
|
||||||
&dr.details.success.transaction_base_url)),
|
&dr.details.success.transaction_base_url)),
|
||||||
TALER_JSON_spec_absolute_time_nbo ("exchange_timestamp",
|
TALER_JSON_spec_absolute_time ("exchange_timestamp",
|
||||||
&dh->depconf.exchange_timestamp),
|
&dh->exchange_timestamp),
|
||||||
GNUNET_JSON_spec_end ()
|
GNUNET_JSON_spec_end ()
|
||||||
};
|
};
|
||||||
|
|
||||||
@ -313,10 +360,17 @@ handle_deposit_finished (void *cls,
|
|||||||
}
|
}
|
||||||
|
|
||||||
if (GNUNET_OK !=
|
if (GNUNET_OK !=
|
||||||
GNUNET_CRYPTO_eddsa_verify (TALER_SIGNATURE_EXCHANGE_CONFIRM_DEPOSIT,
|
TALER_exchange_deposit_confirm_verify (&dh->h_contract_terms,
|
||||||
&dh->depconf,
|
&dh->h_wire,
|
||||||
&dh->exchange_sig.eddsa_signature,
|
&dh->h_extensions,
|
||||||
&dh->exchange_pub.eddsa_pub))
|
dh->exchange_timestamp,
|
||||||
|
dh->wire_deadline,
|
||||||
|
dh->refund_deadline,
|
||||||
|
&dh->amount_without_fee,
|
||||||
|
&dh->coin_pub,
|
||||||
|
&dh->merchant_pub,
|
||||||
|
&dh->exchange_pub,
|
||||||
|
&dh->exchange_sig))
|
||||||
{
|
{
|
||||||
GNUNET_break_op (0);
|
GNUNET_break_op (0);
|
||||||
dr.hr.http_status = 0;
|
dr.hr.http_status = 0;
|
||||||
@ -331,8 +385,7 @@ handle_deposit_finished (void *cls,
|
|||||||
}
|
}
|
||||||
dr.details.success.exchange_sig = &dh->exchange_sig;
|
dr.details.success.exchange_sig = &dh->exchange_sig;
|
||||||
dr.details.success.exchange_pub = &dh->exchange_pub;
|
dr.details.success.exchange_pub = &dh->exchange_pub;
|
||||||
dr.details.success.deposit_timestamp
|
dr.details.success.deposit_timestamp = dh->exchange_timestamp;
|
||||||
= GNUNET_TIME_absolute_ntoh (dh->depconf.exchange_timestamp);
|
|
||||||
break;
|
break;
|
||||||
case MHD_HTTP_BAD_REQUEST:
|
case MHD_HTTP_BAD_REQUEST:
|
||||||
/* This should never happen, either us or the exchange is buggy
|
/* This should never happen, either us or the exchange is buggy
|
||||||
@ -621,18 +674,14 @@ TALER_EXCHANGE_deposit (
|
|||||||
json_decref (deposit_obj);
|
json_decref (deposit_obj);
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
dh->depconf.purpose.size
|
dh->h_contract_terms = *h_contract_terms;
|
||||||
= htonl (sizeof (struct TALER_DepositConfirmationPS));
|
dh->h_wire = h_wire;
|
||||||
dh->depconf.purpose.purpose
|
/* dh->h_extensions = ... */
|
||||||
= htonl (TALER_SIGNATURE_EXCHANGE_CONFIRM_DEPOSIT);
|
dh->refund_deadline = refund_deadline;
|
||||||
dh->depconf.h_contract_terms = *h_contract_terms;
|
dh->wire_deadline = wire_deadline;
|
||||||
dh->depconf.h_wire = h_wire;
|
dh->amount_without_fee = amount_without_fee;
|
||||||
/* dh->depconf.exchange_timestamp; -- initialized later from exchange reply! */
|
dh->coin_pub = *coin_pub;
|
||||||
dh->depconf.refund_deadline = GNUNET_TIME_absolute_hton (refund_deadline);
|
dh->merchant_pub = *merchant_pub;
|
||||||
TALER_amount_hton (&dh->depconf.amount_without_fee,
|
|
||||||
&amount_without_fee);
|
|
||||||
dh->depconf.coin_pub = *coin_pub;
|
|
||||||
dh->depconf.merchant = *merchant_pub;
|
|
||||||
dh->amount_with_fee = *amount;
|
dh->amount_with_fee = *amount;
|
||||||
dh->dki = *dki;
|
dh->dki = *dki;
|
||||||
memset (&dh->dki.key,
|
memset (&dh->dki.key,
|
||||||
|
@ -205,6 +205,7 @@ deposit_confirmation_run (void *cls,
|
|||||||
struct TALER_PrivateContractHash h_contract_terms;
|
struct TALER_PrivateContractHash h_contract_terms;
|
||||||
const struct GNUNET_TIME_Absolute *exchange_timestamp = NULL;
|
const struct GNUNET_TIME_Absolute *exchange_timestamp = NULL;
|
||||||
struct GNUNET_TIME_Absolute timestamp;
|
struct GNUNET_TIME_Absolute timestamp;
|
||||||
|
const struct GNUNET_TIME_Absolute *wire_deadline;
|
||||||
struct GNUNET_TIME_Absolute refund_deadline;
|
struct GNUNET_TIME_Absolute refund_deadline;
|
||||||
struct TALER_Amount amount_without_fee;
|
struct TALER_Amount amount_without_fee;
|
||||||
struct TALER_CoinSpendPublicKeyP coin_pub;
|
struct TALER_CoinSpendPublicKeyP coin_pub;
|
||||||
@ -243,6 +244,10 @@ deposit_confirmation_run (void *cls,
|
|||||||
TALER_TESTING_get_trait_absolute_time (deposit_cmd,
|
TALER_TESTING_get_trait_absolute_time (deposit_cmd,
|
||||||
dcs->coin_index,
|
dcs->coin_index,
|
||||||
&exchange_timestamp));
|
&exchange_timestamp));
|
||||||
|
GNUNET_assert (GNUNET_OK ==
|
||||||
|
TALER_TESTING_get_trait_wire_deadline (deposit_cmd,
|
||||||
|
dcs->coin_index,
|
||||||
|
&wire_deadline));
|
||||||
GNUNET_assert (NULL != exchange_timestamp);
|
GNUNET_assert (NULL != exchange_timestamp);
|
||||||
keys = TALER_EXCHANGE_get_keys (dcs->is->exchange);
|
keys = TALER_EXCHANGE_get_keys (dcs->is->exchange);
|
||||||
GNUNET_assert (NULL != keys);
|
GNUNET_assert (NULL != keys);
|
||||||
@ -297,7 +302,8 @@ deposit_confirmation_run (void *cls,
|
|||||||
/* refund deadline is optional, defaults to zero */
|
/* refund deadline is optional, defaults to zero */
|
||||||
{
|
{
|
||||||
struct GNUNET_JSON_Specification spec[] = {
|
struct GNUNET_JSON_Specification spec[] = {
|
||||||
TALER_JSON_spec_absolute_time ("refund_deadline", &refund_deadline),
|
TALER_JSON_spec_absolute_time ("refund_deadline",
|
||||||
|
&refund_deadline),
|
||||||
GNUNET_JSON_spec_end ()
|
GNUNET_JSON_spec_end ()
|
||||||
};
|
};
|
||||||
|
|
||||||
@ -313,6 +319,7 @@ deposit_confirmation_run (void *cls,
|
|||||||
&h_wire,
|
&h_wire,
|
||||||
&h_contract_terms,
|
&h_contract_terms,
|
||||||
*exchange_timestamp,
|
*exchange_timestamp,
|
||||||
|
*wire_deadline,
|
||||||
refund_deadline,
|
refund_deadline,
|
||||||
&amount_without_fee,
|
&amount_without_fee,
|
||||||
&coin_pub,
|
&coin_pub,
|
||||||
|
@ -84,6 +84,11 @@ struct DepositState
|
|||||||
*/
|
*/
|
||||||
struct GNUNET_TIME_Absolute refund_deadline;
|
struct GNUNET_TIME_Absolute refund_deadline;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Wire deadline.
|
||||||
|
*/
|
||||||
|
struct GNUNET_TIME_Absolute wire_deadline;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Set (by the interpreter) to a fresh private key. This
|
* Set (by the interpreter) to a fresh private key. This
|
||||||
* key will be used to sign the deposit request.
|
* key will be used to sign the deposit request.
|
||||||
@ -285,7 +290,6 @@ deposit_run (void *cls,
|
|||||||
const struct TALER_EXCHANGE_DenomPublicKey *denom_pub;
|
const struct TALER_EXCHANGE_DenomPublicKey *denom_pub;
|
||||||
const struct TALER_DenominationSignature *denom_pub_sig;
|
const struct TALER_DenominationSignature *denom_pub_sig;
|
||||||
struct TALER_CoinSpendSignatureP coin_sig;
|
struct TALER_CoinSpendSignatureP coin_sig;
|
||||||
struct GNUNET_TIME_Absolute wire_deadline;
|
|
||||||
struct TALER_MerchantPublicKeyP merchant_pub;
|
struct TALER_MerchantPublicKeyP merchant_pub;
|
||||||
struct TALER_PrivateContractHash h_contract_terms;
|
struct TALER_PrivateContractHash h_contract_terms;
|
||||||
enum TALER_ErrorCode ec;
|
enum TALER_ErrorCode ec;
|
||||||
@ -402,18 +406,23 @@ deposit_run (void *cls,
|
|||||||
{
|
{
|
||||||
struct GNUNET_TIME_Relative refund_deadline;
|
struct GNUNET_TIME_Relative refund_deadline;
|
||||||
|
|
||||||
refund_deadline = GNUNET_TIME_absolute_get_remaining (ds->refund_deadline);
|
refund_deadline
|
||||||
wire_deadline = GNUNET_TIME_relative_to_absolute
|
= GNUNET_TIME_absolute_get_remaining (ds->refund_deadline);
|
||||||
(GNUNET_TIME_relative_multiply (refund_deadline, 2));
|
ds->wire_deadline
|
||||||
|
= GNUNET_TIME_relative_to_absolute (
|
||||||
|
GNUNET_TIME_relative_multiply (refund_deadline,
|
||||||
|
2));
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
ds->refund_deadline = ds->wallet_timestamp;
|
ds->refund_deadline = ds->wallet_timestamp;
|
||||||
wire_deadline = GNUNET_TIME_relative_to_absolute (GNUNET_TIME_UNIT_ZERO);
|
ds->wire_deadline
|
||||||
|
= GNUNET_TIME_relative_to_absolute (
|
||||||
|
GNUNET_TIME_UNIT_ZERO);
|
||||||
}
|
}
|
||||||
GNUNET_CRYPTO_eddsa_key_get_public (&ds->merchant_priv.eddsa_priv,
|
GNUNET_CRYPTO_eddsa_key_get_public (&ds->merchant_priv.eddsa_priv,
|
||||||
&merchant_pub.eddsa_pub);
|
&merchant_pub.eddsa_pub);
|
||||||
(void) GNUNET_TIME_round_abs (&wire_deadline);
|
(void) GNUNET_TIME_round_abs (&ds->wire_deadline);
|
||||||
{
|
{
|
||||||
struct TALER_MerchantWireHash h_wire;
|
struct TALER_MerchantWireHash h_wire;
|
||||||
|
|
||||||
@ -434,7 +443,7 @@ deposit_run (void *cls,
|
|||||||
}
|
}
|
||||||
ds->dh = TALER_EXCHANGE_deposit (is->exchange,
|
ds->dh = TALER_EXCHANGE_deposit (is->exchange,
|
||||||
&ds->amount,
|
&ds->amount,
|
||||||
wire_deadline,
|
ds->wire_deadline,
|
||||||
payto_uri,
|
payto_uri,
|
||||||
&wire_salt,
|
&wire_salt,
|
||||||
&h_contract_terms,
|
&h_contract_terms,
|
||||||
@ -555,6 +564,10 @@ deposit_traits (void *cls,
|
|||||||
TALER_TESTING_make_trait_deposit_fee_amount (&ds->deposit_fee),
|
TALER_TESTING_make_trait_deposit_fee_amount (&ds->deposit_fee),
|
||||||
TALER_TESTING_make_trait_absolute_time (0,
|
TALER_TESTING_make_trait_absolute_time (0,
|
||||||
&ds->exchange_timestamp),
|
&ds->exchange_timestamp),
|
||||||
|
TALER_TESTING_make_trait_wire_deadline (0,
|
||||||
|
&ds->wire_deadline),
|
||||||
|
TALER_TESTING_make_trait_refund_deadline (0,
|
||||||
|
&ds->refund_deadline),
|
||||||
TALER_TESTING_trait_end ()
|
TALER_TESTING_trait_end ()
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@ -70,6 +70,7 @@ libtalerutil_la_SOURCES = \
|
|||||||
crypto_helper_esign.c \
|
crypto_helper_esign.c \
|
||||||
crypto_wire.c \
|
crypto_wire.c \
|
||||||
denom.c \
|
denom.c \
|
||||||
|
exchange_signatures.c \
|
||||||
getopt.c \
|
getopt.c \
|
||||||
lang.c \
|
lang.c \
|
||||||
iban.c \
|
iban.c \
|
||||||
|
@ -1,6 +1,6 @@
|
|||||||
/*
|
/*
|
||||||
This file is part of TALER
|
This file is part of TALER
|
||||||
Copyright (C) 2020, 2021 Taler Systems SA
|
Copyright (C) 2021 Taler Systems SA
|
||||||
|
|
||||||
TALER is free software; you can redistribute it and/or modify it under the
|
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
|
terms of the GNU General Public License as published by the Free Software
|
||||||
@ -14,8 +14,8 @@
|
|||||||
TALER; see the file COPYING. If not, see <http://www.gnu.org/licenses/>
|
TALER; see the file COPYING. If not, see <http://www.gnu.org/licenses/>
|
||||||
*/
|
*/
|
||||||
/**
|
/**
|
||||||
* @file secmod_signatures.c
|
* @file wallet_signatures.c
|
||||||
* @brief Utility functions for Taler security module signatures
|
* @brief Utility functions for Taler wallet signatures
|
||||||
* @author Christian Grothoff
|
* @author Christian Grothoff
|
||||||
*/
|
*/
|
||||||
#include "platform.h"
|
#include "platform.h"
|
||||||
|
Loading…
Reference in New Issue
Block a user