diff options
| author | Christian Grothoff <christian@grothoff.org> | 2020-06-27 18:49:12 +0200 | 
|---|---|---|
| committer | Christian Grothoff <christian@grothoff.org> | 2020-07-05 16:50:15 +0200 | 
| commit | b0311807ff8c7702a87b99da1e21a963eb280633 (patch) | |
| tree | bddcdd2f049f4190ac5dfe523ac6a91fa344bdf0 /src | |
| parent | c88af6df724a47919fd8b0fc1d25f1273120c4e6 (diff) | |
fix FIXME by exposing deposit permission signing in API instead of doing it inside of the testing logic
Diffstat (limited to 'src')
| -rw-r--r-- | src/include/taler_exchange_service.h | 26 | ||||
| -rw-r--r-- | src/lib/exchange_api_deposit.c | 53 | ||||
| -rw-r--r-- | src/testing/testing_api_cmd_deposit.c | 39 | 
3 files changed, 92 insertions, 26 deletions
| diff --git a/src/include/taler_exchange_service.h b/src/include/taler_exchange_service.h index e61a07c9..02ab182f 100644 --- a/src/include/taler_exchange_service.h +++ b/src/include/taler_exchange_service.h @@ -745,6 +745,32 @@ TALER_EXCHANGE_wire_cancel (struct TALER_EXCHANGE_WireHandle *wh);  /** + * Sign a deposit permission.  Function for wallets. + * + * @param amount the amount to be deposited + * @param deposit_fee the deposit fee we expect to pay + * @param h_wire hash of the merchant’s account details + * @param h_contract_terms hash of the contact of the merchant with the customer (further details are never disclosed to the exchange) + * @param coin_priv coin’s private key + * @param wallet_timestamp timestamp when the contract was finalized, must not be too far in the future + * @param merchant_pub the public key of the merchant (used to identify the merchant for refund requests) + * @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[out] coin_sig set to the signature made with purpose #TALER_SIGNATURE_WALLET_COIN_DEPOSIT + */ +void +TALER_EXCHANGE_deposit_permission_sign ( +  const struct TALER_Amount *amount, +  const struct TALER_Amount *deposit_fee, +  const struct GNUNET_HashCode *h_wire, +  const struct GNUNET_HashCode *h_contract_terms, +  const struct TALER_CoinSpendPrivateKeyP *coin_priv, +  struct GNUNET_TIME_Absolute wallet_timestamp, +  const struct TALER_MerchantPublicKeyP *merchant_pub, +  struct GNUNET_TIME_Absolute refund_deadline, +  struct TALER_CoinSpendSignatureP *coin_sig); + + +/**   * @brief A Deposit Handle   */  struct TALER_EXCHANGE_DepositHandle; diff --git a/src/lib/exchange_api_deposit.c b/src/lib/exchange_api_deposit.c index 27605365..351fa7a1 100644 --- a/src/lib/exchange_api_deposit.c +++ b/src/lib/exchange_api_deposit.c @@ -491,6 +491,59 @@ verify_signatures (const struct TALER_EXCHANGE_DenomPublicKey *dki,  /** + * Sign a deposit permission.  Function for wallets. + * + * @param amount the amount to be deposited + * @param deposit_fee the deposit fee we expect to pay + * @param h_wire hash of the merchant’s account details + * @param h_contract_terms hash of the contact of the merchant with the customer (further details are never disclosed to the exchange) + * @param coin_priv coin’s private key + * @param wallet_timestamp timestamp when the contract was finalized, must not be too far in the future + * @param merchant_pub the public key of the merchant (used to identify the merchant for refund requests) + * @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[out] coin_sig set to the signature made with purpose #TALER_SIGNATURE_WALLET_COIN_DEPOSIT + */ +void +TALER_EXCHANGE_deposit_permission_sign ( +  const struct TALER_Amount *amount, +  const struct TALER_Amount *deposit_fee, +  const struct GNUNET_HashCode *h_wire, +  const struct GNUNET_HashCode *h_contract_terms, +  const struct TALER_CoinSpendPrivateKeyP *coin_priv, +  struct GNUNET_TIME_Absolute wallet_timestamp, +  const struct TALER_MerchantPublicKeyP *merchant_pub, +  struct GNUNET_TIME_Absolute refund_deadline, +  struct TALER_CoinSpendSignatureP *coin_sig) +{ +  struct TALER_DepositRequestPS dr = { +    .purpose.size = htonl +                      (sizeof (dr)), +    .purpose.purpose = htonl +                         (TALER_SIGNATURE_WALLET_COIN_DEPOSIT), +    .h_contract_terms = *h_contract_terms, +    .h_wire = *h_wire, +    .wallet_timestamp = GNUNET_TIME_absolute_hton (wallet_timestamp), +    .refund_deadline = GNUNET_TIME_absolute_hton (refund_deadline), +    .merchant = *merchant_pub +  }; + +  GNUNET_assert (GNUNET_OK == +                 GNUNET_TIME_round_abs (&wallet_timestamp)); +  GNUNET_assert (GNUNET_OK == +                 GNUNET_TIME_round_abs (&refund_deadline)); +  GNUNET_CRYPTO_eddsa_key_get_public (&coin_priv->eddsa_priv, +                                      &dr.coin_pub.eddsa_pub); +  TALER_amount_hton (&dr.amount_with_fee, +                     amount); +  TALER_amount_hton (&dr.deposit_fee, +                     deposit_fee); +  GNUNET_CRYPTO_eddsa_sign (&coin_priv->eddsa_priv, +                            &dr, +                            &coin_sig->eddsa_signature); +} + + +/**   * Submit a deposit permission to the exchange and get the exchange's response.   * Note that while we return the response verbatim to the caller for   * further processing, we do already verify that the response is diff --git a/src/testing/testing_api_cmd_deposit.c b/src/testing/testing_api_cmd_deposit.c index f302a218..e7a4c298 100644 --- a/src/testing/testing_api_cmd_deposit.c +++ b/src/testing/testing_api_cmd_deposit.c @@ -394,39 +394,26 @@ deposit_run (void *cls,    else    {      ds->refund_deadline = ds->wallet_timestamp; -    wire_deadline = GNUNET_TIME_relative_to_absolute -                      (GNUNET_TIME_UNIT_ZERO); +    wire_deadline = GNUNET_TIME_relative_to_absolute (GNUNET_TIME_UNIT_ZERO);    }    GNUNET_CRYPTO_eddsa_key_get_public (&ds->merchant_priv.eddsa_priv,                                        &merchant_pub.eddsa_pub); -    (void) GNUNET_TIME_round_abs (&wire_deadline); - -  // FIXME: This should be part of TALER_EXCHANGE_deposit()!    { -    struct TALER_DepositRequestPS dr; - -    memset (&dr, 0, sizeof (dr)); -    dr.purpose.size = htonl -                        (sizeof (struct TALER_DepositRequestPS)); -    dr.purpose.purpose = htonl -                           (TALER_SIGNATURE_WALLET_COIN_DEPOSIT); -    dr.h_contract_terms = h_contract_terms; +    struct GNUNET_HashCode h_wire; +      GNUNET_assert (GNUNET_OK ==                     TALER_JSON_merchant_wire_signature_hash (ds->wire_details, -                                                            &dr.h_wire)); -    dr.wallet_timestamp = GNUNET_TIME_absolute_hton (ds->wallet_timestamp); -    dr.refund_deadline = GNUNET_TIME_absolute_hton -                           (ds->refund_deadline); -    TALER_amount_hton (&dr.amount_with_fee, -                       &ds->amount); -    TALER_amount_hton (&dr.deposit_fee, -                       &denom_pub->fee_deposit); -    dr.merchant = merchant_pub; -    dr.coin_pub = coin_pub; -    GNUNET_CRYPTO_eddsa_sign (&coin_priv->eddsa_priv, -                              &dr, -                              &coin_sig.eddsa_signature); +                                                            &h_wire)); +    TALER_EXCHANGE_deposit_permission_sign (&ds->amount, +                                            &denom_pub->fee_deposit, +                                            &h_wire, +                                            &h_contract_terms, +                                            coin_priv, +                                            ds->wallet_timestamp, +                                            &merchant_pub, +                                            ds->refund_deadline, +                                            &coin_sig);    }    ds->dh = TALER_EXCHANGE_deposit (is->exchange,                                     &ds->amount, | 
