diff options
Diffstat (limited to 'src')
| -rw-r--r-- | src/include/taler_crypto_lib.h | 17 | ||||
| -rw-r--r-- | src/include/taler_exchange_service.h | 1 | ||||
| -rw-r--r-- | src/include/taler_testing_lib.h | 46 | ||||
| -rw-r--r-- | src/lib/exchange_api_withdraw.c | 20 | ||||
| -rw-r--r-- | src/testing/test_exchange_api.c | 146 | ||||
| -rw-r--r-- | src/testing/testing_api_cmd_refresh.c | 4 | ||||
| -rw-r--r-- | src/testing/testing_api_cmd_withdraw.c | 84 | ||||
| -rw-r--r-- | src/testing/testing_api_helpers_exchange.c | 34 | ||||
| -rw-r--r-- | src/util/crypto.c | 24 | 
9 files changed, 34 insertions, 342 deletions
diff --git a/src/include/taler_crypto_lib.h b/src/include/taler_crypto_lib.h index d9565dd7..7b38b1f7 100644 --- a/src/include/taler_crypto_lib.h +++ b/src/include/taler_crypto_lib.h @@ -987,6 +987,17 @@ struct TALER_ExchangeWithdrawValues  void  TALER_denom_pub_free (struct TALER_DenominationPublicKey *denom_pub); + +/** + * Create private key for a Taler coin. + * + * @param[out] coin_priv private key to initialize + */ +void +TALER_planchet_setup_coin_priv ( +  struct TALER_CoinSpendPrivateKeyP *coin_priv); + +  /**   * @brief Method to derive withdraw nonce   * @@ -1472,9 +1483,9 @@ TALER_planchet_setup_refresh (const struct TALER_TransferSecretP *secret_seed,   * @oaram alg_values WitdrawValues containing cipher   */  void -TALER_planchet_setup_random (struct TALER_PlanchetSecretsP *ps, -                             const struct -                             TALER_ExchangeWithdrawValues *alg_values); +TALER_planchet_setup_random ( +  struct TALER_PlanchetSecretsP *ps, +  const struct TALER_ExchangeWithdrawValues *alg_values);  /**   * Create a blinding secret @a bs for @a cipher. diff --git a/src/include/taler_exchange_service.h b/src/include/taler_exchange_service.h index 68c97186..beb33738 100644 --- a/src/include/taler_exchange_service.h +++ b/src/include/taler_exchange_service.h @@ -1461,7 +1461,6 @@ TALER_EXCHANGE_withdraw (    const struct TALER_EXCHANGE_DenomPublicKey *pk,    const struct TALER_ReservePrivateKeyP *reserve_priv,    struct TALER_PlanchetSecretsP *ps, -  struct TALER_ExchangeWithdrawValues *alg_values,    TALER_EXCHANGE_WithdrawCallback res_cb,    void *res_cb_cls); diff --git a/src/include/taler_testing_lib.h b/src/include/taler_testing_lib.h index c6bebbee..20e3145f 100644 --- a/src/include/taler_testing_lib.h +++ b/src/include/taler_testing_lib.h @@ -66,13 +66,11 @@ TALER_TESTING_make_wire_details (const char *payto);   *   * @param keys array of keys to search   * @param amount coin value to look for - * @param cipher denomination cipher   * @return NULL if no matching key was found   */  const struct TALER_EXCHANGE_DenomPublicKey *  TALER_TESTING_find_pk (const struct TALER_EXCHANGE_Keys *keys, -                       const struct TALER_Amount *amount, -                       const enum TALER_DenominationCipher cipher); +                       const struct TALER_Amount *amount);  /** @@ -1291,24 +1289,6 @@ TALER_TESTING_cmd_withdraw_amount (const char *label,  /** - * Create a withdraw command using a CS denomination, letting the caller specify - * the desired amount as string. - * - * @param label command label. - * @param reserve_reference command providing us with a reserve to withdraw from - * @param amount how much we withdraw. - * @param expected_response_code which HTTP response code - *        we expect from the exchange. - * @return the withdraw command to be executed by the interpreter. - */ -struct TALER_TESTING_Command -TALER_TESTING_cmd_withdraw_cs_amount (const char *label, -                                      const char *reserve_reference, -                                      const char *amount, -                                      unsigned int expected_response_code); - - -/**   * Create a withdraw command, letting the caller specify   * the desired amount as string and also re-using an existing   * coin private key in the process (violating the specification, @@ -1333,30 +1313,6 @@ TALER_TESTING_cmd_withdraw_amount_reuse_key (  /** - * Create a CS withdraw command, letting the caller specify - * the desired amount as string and also re-using an existing - * coin private key in the process (violating the specification, - * which will result in an error when spending the coin!). - * - * @param label command label. - * @param reserve_reference command providing us with a reserve to withdraw from - * @param amount how much we withdraw. - * @param coin_ref reference to (withdraw/reveal) command of a coin - *        from which we should re-use the private key - * @param expected_response_code which HTTP response code - *        we expect from the exchange. - * @return the withdraw command to be executed by the interpreter. - */ -struct TALER_TESTING_Command -TALER_TESTING_cmd_withdraw_cs_amount_reuse_key ( -  const char *label, -  const char *reserve_reference, -  const char *amount, -  const char *coin_ref, -  unsigned int expected_response_code); - - -/**   * Create withdraw command, letting the caller specify the   * amount by a denomination key.   * diff --git a/src/lib/exchange_api_withdraw.c b/src/lib/exchange_api_withdraw.c index a5a88676..7b851b49 100644 --- a/src/lib/exchange_api_withdraw.c +++ b/src/lib/exchange_api_withdraw.c @@ -220,31 +220,12 @@ withdraw_cs_stage_two_callback (void *cls,  } -/** - * Withdraw a coin from the exchange using a /reserve/withdraw request.  Note - * that to ensure that no money is lost in case of hardware failures, - * the caller must have committed (most of) the arguments to disk - * before calling, and be ready to repeat the request with the same - * arguments in case of failures. - * - * @param exchange the exchange handle; the exchange must be ready to operate - * @param pk kind of coin to create - * @param reserve_priv private key of the reserve to withdraw from - * @param ps secrets of the planchet - *        caller must have committed this value to disk before the call (with @a pk) - * @param res_cb the callback to call when the final result for this request is available - * @param res_cb_cls closure for the above callback - * @return handle for the operation on success, NULL on error, i.e. - *         if the inputs are invalid (i.e. denomination key not with this exchange). - *         In this case, the callback is not called. - */  struct TALER_EXCHANGE_WithdrawHandle *  TALER_EXCHANGE_withdraw (    struct TALER_EXCHANGE_Handle *exchange,    const struct TALER_EXCHANGE_DenomPublicKey *pk,    const struct TALER_ReservePrivateKeyP *reserve_priv,    struct TALER_PlanchetSecretsP *ps, -  struct TALER_ExchangeWithdrawValues *alg_values,    TALER_EXCHANGE_WithdrawCallback res_cb,    void *res_cb_cls)  { @@ -256,7 +237,6 @@ TALER_EXCHANGE_withdraw (    wh->cb_cls = res_cb_cls;    wh->reserve_priv = reserve_priv;    wh->ps = *ps; -  wh->alg_values = *alg_values,    wh->pk = *pk;    wh->csrh = NULL; diff --git a/src/testing/test_exchange_api.c b/src/testing/test_exchange_api.c index bae57fa6..d701e4af 100644 --- a/src/testing/test_exchange_api.c +++ b/src/testing/test_exchange_api.c @@ -890,145 +890,6 @@ run (void *cls,      TALER_TESTING_cmd_end ()    }; -  /** -   * Test CS withdrawal plus spending. -   */ -  struct TALER_TESTING_Command withdraw_cs[] = { -    /** -     * Move money to the exchange's bank account. -     */ -    CMD_TRANSFER_TO_EXCHANGE ("create-reserve-cs-1", -                              "EUR:6.02"), -    TALER_TESTING_cmd_check_bank_admin_transfer ("check-create-reserve-cs-1", -                                                 "EUR:6.02", -                                                 bc.user42_payto, -                                                 bc.exchange_payto, -                                                 "create-reserve-cs-1"), -    /** -     * Make a reserve exist, according to the previous -     * transfer. -     */ -    CMD_EXEC_WIREWATCH ("wirewatch-cs-1"), -    /** -     * Withdraw EUR:5. -     */ -    TALER_TESTING_cmd_withdraw_cs_amount ("withdraw-cs-coin-1", -                                          "create-reserve-cs-1", -                                          "EUR:5", -                                          MHD_HTTP_OK), -    /** -     * Withdraw EUR:1 using the SAME private coin key as for the previous coin -     * (in violation of the specification, to be detected on spending!). -     */ -    TALER_TESTING_cmd_withdraw_cs_amount_reuse_key ("withdraw-cs-coin-1x", -                                                    "create-reserve-cs-1", -                                                    "EUR:1", -                                                    "withdraw-cs-coin-1", -                                                    MHD_HTTP_OK), -    /** -     * Check the reserve is depleted. -     */ -    TALER_TESTING_cmd_status ("status-cs-1", -                              "create-reserve-cs-1", -                              "EUR:0", -                              MHD_HTTP_OK), -    /* -     * Try to overdraw. -     */ -    TALER_TESTING_cmd_withdraw_cs_amount ("withdraw-cs-coin-2", -                                          "create-reserve-cs-1", -                                          "EUR:5", -                                          MHD_HTTP_CONFLICT), -    // TODO: add test for nonce reuse -    TALER_TESTING_cmd_end () -  }; - -  struct TALER_TESTING_Command spend_cs[] = { -    /** -     * Spend the coin. -     */ -    TALER_TESTING_cmd_deposit ("deposit-cs-simple", -                               "withdraw-cs-coin-1", -                               0, -                               bc.user42_payto, -                               "{\"items\":[{\"name\":\"ice cream\",\"value\":1}]}", -                               GNUNET_TIME_UNIT_ZERO, -                               "EUR:5", -                               MHD_HTTP_OK), -    TALER_TESTING_cmd_deposit_replay ("deposit-cs-simple-replay", -                                      "deposit-cs-simple", -                                      MHD_HTTP_OK), -    TALER_TESTING_cmd_deposit ("deposit-cs-reused-coin-key-failure", -                               "withdraw-cs-coin-1x", -                               0, -                               bc.user42_payto, -                               "{\"items\":[{\"name\":\"ice cream\",\"value\":1}]}", -                               GNUNET_TIME_UNIT_ZERO, -                               "EUR:1", -                               MHD_HTTP_CONFLICT), -    /** -     * Try to double spend using different wire details. -     */ -    TALER_TESTING_cmd_deposit ("deposit-cs-double-1", -                               "withdraw-cs-coin-1", -                               0, -                               bc.user43_payto, -                               "{\"items\":[{\"name\":\"ice cream\",\"value\":1}]}", -                               GNUNET_TIME_UNIT_ZERO, -                               "EUR:5", -                               MHD_HTTP_CONFLICT), -    /* Try to double spend using a different transaction id. -     * The test needs the contract terms to differ. This -     * is currently the case because of the "timestamp" field, -     * which is set automatically by #TALER_TESTING_cmd_deposit(). -     * This could theoretically fail if at some point a deposit -     * command executes in less than 1 ms. */// -    TALER_TESTING_cmd_deposit ("deposit-cs-double-1", -                               "withdraw-cs-coin-1", -                               0, -                               bc.user43_payto, -                               "{\"items\":[{\"name\":\"ice cream\",\"value\":1}]}", -                               GNUNET_TIME_UNIT_ZERO, -                               "EUR:5", -                               MHD_HTTP_CONFLICT), -    /** -     * Try to double spend with different proposal. -     */ -    TALER_TESTING_cmd_deposit ("deposit-cs-double-2", -                               "withdraw-cs-coin-1", -                               0, -                               bc.user43_payto, -                               "{\"items\":[{\"name\":\"ice cream\",\"value\":2}]}", -                               GNUNET_TIME_UNIT_ZERO, -                               "EUR:5", -                               MHD_HTTP_CONFLICT), -    TALER_TESTING_cmd_end () -  }; - -  // TODO: CS refresh - -  struct TALER_TESTING_Command track_cs[] = { -    /* Try resolving a deposit's WTID, as we never triggered -     * execution of transactions, the answer should be that -     * the exchange knows about the deposit, but has no WTID yet. -     */// -    TALER_TESTING_cmd_track_transaction ("deposit-cs-wtid-found", -                                         "deposit-cs-simple", -                                         0, -                                         MHD_HTTP_ACCEPTED, -                                         NULL), -    /* Try resolving a deposit's WTID for a failed deposit. -     * As the deposit failed, the answer should be that the -     * exchange does NOT know about the deposit. -     */ -    TALER_TESTING_cmd_track_transaction ("deposit-cs-wtid-failing", -                                         "deposit-cs-double-2", -                                         0, -                                         MHD_HTTP_NOT_FOUND, -                                         NULL), -    TALER_TESTING_cmd_end () -  }; -  #define RESERVE_OPEN_CLOSE_CHUNK 4  #define RESERVE_OPEN_CLOSE_ITERATIONS 3 @@ -1098,13 +959,6 @@ run (void *cls,                                 refund),        TALER_TESTING_cmd_batch ("recoup",                                 recoup), -      TALER_TESTING_cmd_batch ("withdraw-cs", -                               withdraw_cs), -      TALER_TESTING_cmd_batch ("spend-cs", -                               spend_cs), -      // TODO: Clause Schnorr refresh -      TALER_TESTING_cmd_batch ("track-cs", -                               track_cs),        TALER_TESTING_cmd_batch ("reserve-open-close",                                 reserve_open_close),        /* End the suite. */ diff --git a/src/testing/testing_api_cmd_refresh.c b/src/testing/testing_api_cmd_refresh.c index 0b47f508..9f49b354 100644 --- a/src/testing/testing_api_cmd_refresh.c +++ b/src/testing/testing_api_cmd_refresh.c @@ -1049,9 +1049,7 @@ melt_run (void *cls,          return;        }        fresh_pk = TALER_TESTING_find_pk (TALER_EXCHANGE_get_keys (is->exchange), -                                        &fresh_amount, -                                        // FIXME: replace hardcoded value -                                        TALER_DENOMINATION_RSA); +                                        &fresh_amount);        if (NULL == fresh_pk)        {          GNUNET_break (0); diff --git a/src/testing/testing_api_cmd_withdraw.c b/src/testing/testing_api_cmd_withdraw.c index da514ddf..7e2eecce 100644 --- a/src/testing/testing_api_cmd_withdraw.c +++ b/src/testing/testing_api_cmd_withdraw.c @@ -73,11 +73,6 @@ struct WithdrawState    struct TALER_Amount amount;    /** -   * Type of denomination that we should withdraw -   */ -  enum TALER_DenominationCipher cipher; - -  /**     * If @e amount is NULL, this specifies the denomination key to     * use.  Otherwise, this will be set (by the interpreter) to the     * denomination PK matching @e amount. @@ -121,11 +116,6 @@ struct WithdrawState    struct TALER_PlanchetSecretsP ps;    /** -   * Withdraw Values used for planchet creation -   */ -  struct TALER_ExchangeWithdrawValues alg_values; - -  /**     * Reserve history entry that corresponds to this operation.     * Will be of type #TALER_EXCHANGE_RTT_WITHDRAWAL.     */ @@ -396,10 +386,9 @@ withdraw_run (void *cls,    ws->reserve_payto_uri      = TALER_payto_from_reserve (ws->exchange_url,                                  &ws->reserve_pub); -  ws->alg_values.cipher = ws->cipher;    if (NULL == ws->reuse_coin_key_ref)    { -    TALER_planchet_setup_random (&ws->ps, &ws->alg_values); +    TALER_planchet_setup_coin_priv (&ws->ps.coin_priv);    }    else    { @@ -420,14 +409,13 @@ withdraw_run (void *cls,                     TALER_TESTING_get_trait_coin_priv (cref,                                                        index,                                                        &coin_priv)); -    TALER_planchet_setup_random (&ws->ps, &ws->alg_values); +    TALER_planchet_setup_coin_priv (&ws->ps.coin_priv);      ws->ps.coin_priv = *coin_priv;    }    if (NULL == ws->pk)    {      dpk = TALER_TESTING_find_pk (TALER_EXCHANGE_get_keys (is->exchange), -                                 &ws->amount, -                                 ws->cipher); +                                 &ws->amount);      if (NULL == dpk)      {        GNUNET_log (GNUNET_ERROR_TYPE_ERROR, @@ -455,7 +443,6 @@ withdraw_run (void *cls,                                       ws->pk,                                       rp,                                       &ws->ps, -                                     &ws->alg_values,                                       &reserve_withdraw_cb,                                       ws);    if (NULL == ws->wsh) @@ -570,8 +557,6 @@ TALER_TESTING_cmd_withdraw_amount (const char *label,                                     const char *amount,                                     unsigned int expected_response_code)  { -  // TODO: ATM this is hardcoded to RSA denominations -  // (use TALER_TESTING_cmd_withdraw_cs_amount for Clause Schnorr)    struct WithdrawState *ws;    ws = GNUNET_new (struct WithdrawState); @@ -587,43 +572,6 @@ TALER_TESTING_cmd_withdraw_amount (const char *label,      GNUNET_assert (0);    }    ws->expected_response_code = expected_response_code; -  ws->cipher = TALER_DENOMINATION_RSA; -  { -    struct TALER_TESTING_Command cmd = { -      .cls = ws, -      .label = label, -      .run = &withdraw_run, -      .cleanup = &withdraw_cleanup, -      .traits = &withdraw_traits -    }; - -    return cmd; -  } -} - - -struct TALER_TESTING_Command -TALER_TESTING_cmd_withdraw_cs_amount (const char *label, -                                      const char *reserve_reference, -                                      const char *amount, -                                      unsigned int expected_response_code) -{ -  struct WithdrawState *ws; - -  ws = GNUNET_new (struct WithdrawState); -  ws->reserve_reference = reserve_reference; -  if (GNUNET_OK != -      TALER_string_to_amount (amount, -                              &ws->amount)) -  { -    GNUNET_log (GNUNET_ERROR_TYPE_ERROR, -                "Failed to parse amount `%s' at %s\n", -                amount, -                label); -    GNUNET_assert (0); -  } -  ws->expected_response_code = expected_response_code; -  ws->cipher = TALER_DENOMINATION_CS;    {      struct TALER_TESTING_Command cmd = {        .cls = ws, @@ -661,8 +609,6 @@ TALER_TESTING_cmd_withdraw_amount_reuse_key (    const char *coin_ref,    unsigned int expected_response_code)  { -  // TODO: ATM this is hardcoded to RSA denominations -  // (use TALER_TESTING_cmd_withdraw_cs_amount for Clause Schnorr)    struct TALER_TESTING_Command cmd;    cmd = TALER_TESTING_cmd_withdraw_amount (label, @@ -678,29 +624,6 @@ TALER_TESTING_cmd_withdraw_amount_reuse_key (  } -struct TALER_TESTING_Command -TALER_TESTING_cmd_withdraw_cs_amount_reuse_key ( -  const char *label, -  const char *reserve_reference, -  const char *amount, -  const char *coin_ref, -  unsigned int expected_response_code) -{ -  struct TALER_TESTING_Command cmd; - -  cmd = TALER_TESTING_cmd_withdraw_cs_amount (label, -                                              reserve_reference, -                                              amount, -                                              expected_response_code); -  { -    struct WithdrawState *ws = cmd.cls; - -    ws->reuse_coin_key_ref = coin_ref; -  } -  return cmd; -} - -  /**   * Create withdraw command, letting the caller specify the   * amount by a denomination key. @@ -733,7 +656,6 @@ TALER_TESTING_cmd_withdraw_denomination (    ws->reserve_reference = reserve_reference;    ws->pk = TALER_EXCHANGE_copy_denomination_key (dk);    ws->expected_response_code = expected_response_code; -  ws->cipher = dk->key.cipher;    {      struct TALER_TESTING_Command cmd = {        .cls = ws, diff --git a/src/testing/testing_api_helpers_exchange.c b/src/testing/testing_api_helpers_exchange.c index a30db033..9414af66 100644 --- a/src/testing/testing_api_helpers_exchange.c +++ b/src/testing/testing_api_helpers_exchange.c @@ -411,18 +411,9 @@ TALER_TESTING_prepare_exchange (const char *config_filename,  } -/** - * Find denomination key matching the given amount. - * - * @param keys array of keys to search - * @param amount coin value to look for - * @param cipher denomination cipher - * @return NULL if no matching key was found - */  const struct TALER_EXCHANGE_DenomPublicKey *  TALER_TESTING_find_pk (const struct TALER_EXCHANGE_Keys *keys, -                       const struct TALER_Amount *amount, -                       const enum TALER_DenominationCipher cipher) +                       const struct TALER_Amount *amount)  {    struct GNUNET_TIME_Timestamp now;    struct TALER_EXCHANGE_DenomPublicKey *pk; @@ -432,8 +423,6 @@ TALER_TESTING_find_pk (const struct TALER_EXCHANGE_Keys *keys,    for (unsigned int i = 0; i<keys->num_denom_keys; i++)    {      pk = &keys->denom_keys[i]; -    if (cipher != pk->key.cipher) -      continue;      if ( (0 == TALER_amount_cmp (amount,                                   &pk->value)) &&           (GNUNET_TIME_timestamp_cmp (now, @@ -450,8 +439,6 @@ TALER_TESTING_find_pk (const struct TALER_EXCHANGE_Keys *keys,    for (unsigned int i = 0; i<keys->num_denom_keys; i++)    {      pk = &keys->denom_keys[i]; -    if (cipher != pk->key.cipher) -      continue;      if ( (0 == TALER_amount_cmp (amount,                                   &pk->value)) &&           (GNUNET_TIME_timestamp_cmp (now, @@ -473,25 +460,6 @@ TALER_TESTING_find_pk (const struct TALER_EXCHANGE_Keys *keys,        return NULL;      }    } -  // do 3rd pass to check if cipher type is to blame for failure -  for (unsigned int i = 0; i<keys->num_denom_keys; i++) -  { -    pk = &keys->denom_keys[i]; -    if ( (0 == TALER_amount_cmp (amount, -                                 &pk->value)) && -         (cipher != pk->key.cipher) ) -    { -      GNUNET_log -        (GNUNET_ERROR_TYPE_WARNING, -        "Have denomination key for `%s', but with wrong" -        " cipher type %d vs %d\n", -        str, -        cipher, -        pk->key.cipher); -      GNUNET_free (str); -      return NULL; -    } -  }    GNUNET_log (GNUNET_ERROR_TYPE_WARNING,                "No denomination key for amount %s found\n",                str); diff --git a/src/util/crypto.c b/src/util/crypto.c index fee3f31e..18f809e3 100644 --- a/src/util/crypto.c +++ b/src/util/crypto.c @@ -245,19 +245,23 @@ TALER_planchet_blinding_secret_create (struct TALER_PlanchetSecretsP *ps,  } -/** - * @brief setup a random planchet - * In Case of RSA planchet, the bks gets set - * In Case of Clause Schnorr this will be set in future - */  void -TALER_planchet_setup_random (struct TALER_PlanchetSecretsP *ps, -                             const struct -                             TALER_ExchangeWithdrawValues *alg_values) +TALER_planchet_setup_coin_priv ( +  struct TALER_CoinSpendPrivateKeyP *coin_priv)  {    GNUNET_CRYPTO_random_block (GNUNET_CRYPTO_QUALITY_STRONG, -                              &ps->coin_priv, -                              sizeof (struct TALER_CoinSpendPrivateKeyP)); +                              coin_priv, +                              sizeof (*coin_priv)); +  // FIXME-jeff/dold: Clamping? +} + + +void +TALER_planchet_setup_random ( +  struct TALER_PlanchetSecretsP *ps, +  const struct TALER_ExchangeWithdrawValues *alg_values) +{ +  TALER_planchet_setup_coin_priv (&ps->coin_priv);    switch (alg_values->cipher)    {    case TALER_DENOMINATION_INVALID:  | 
