diff options
Diffstat (limited to 'src/lib')
| -rw-r--r-- | src/lib/exchange_api_withdraw.c | 88 | ||||
| -rw-r--r-- | src/lib/exchange_api_withdraw2.c | 74 | 
2 files changed, 119 insertions, 43 deletions
| diff --git a/src/lib/exchange_api_withdraw.c b/src/lib/exchange_api_withdraw.c index 91838d4c..2c57797f 100644 --- a/src/lib/exchange_api_withdraw.c +++ b/src/lib/exchange_api_withdraw.c @@ -59,11 +59,21 @@ struct TALER_EXCHANGE_WithdrawHandle    void *cb_cls;    /** +   * Reserve private key. +   */ +  const struct TALER_ReservePrivateKeyP *reserve_priv; + +  /**     * Secrets of the planchet.     */    struct TALER_PlanchetSecretsP ps;    /** +   * Details of the planchet. +   */ +  struct TALER_PlanchetDetail pd; + +  /**     * Denomination key we are withdrawing.     */    struct TALER_EXCHANGE_DenomPublicKey pk; @@ -162,24 +172,44 @@ withdraw_cs_stage_two_callback (void *cls,                                  const struct TALER_EXCHANGE_CsRResponse *csrr)  {    struct TALER_EXCHANGE_WithdrawHandle *wh = cls; -  // TODO: this should only be set for non-OK cases -  struct TALER_EXCHANGE_WithdrawResponse wr = { -    .hr = csrr->hr -  }; -  // switch (csrr->hr.http_status) -  // { -  // case MHD_HTTP_OK: -  //   // TODO: implement rest of withdraw -  //   break; -  // default: -  //   break; -  // } +  wh->csrh = NULL; -  // TODO: this should only be called for non-OK cases -  wh->cb (wh->cb_cls, -          &wr); -  TALER_EXCHANGE_withdraw_cancel (wh); +  GNUNET_assert (TALER_DENOMINATION_CS == wh->pk.key.cipher); + +  switch (csrr->hr.http_status) +  { +  case MHD_HTTP_OK: +    wh->ps.cs_r_pub = csrr->details.success.r_pubs; +    TALER_blinding_secret_create (&wh->ps.blinding_key, +                                  wh->pk.key.cipher, +                                  &wh->ps.coin_priv, +                                  &wh->ps.cs_r_pub); +    if (GNUNET_OK != +        TALER_planchet_prepare (&wh->pk.key, +                                &wh->ps, +                                &wh->c_hash, +                                &wh->pd)) +    { +      GNUNET_break (0); +      GNUNET_free (wh); +    } +    wh->wh2 = TALER_EXCHANGE_withdraw2 (wh->exchange, +                                        &wh->pd, +                                        wh->reserve_priv, +                                        &handle_reserve_withdraw_finished, +                                        wh); +    break; +  default: +    // the CSR request went wrong -> serve response to the callback +    struct TALER_EXCHANGE_WithdrawResponse wr = { +      .hr = csrr->hr +    }; +    wh->cb (wh->cb_cls, +            &wr); +    TALER_EXCHANGE_withdraw_cancel (wh); +    break; +  }  } @@ -210,16 +240,19 @@ TALER_EXCHANGE_withdraw (    TALER_EXCHANGE_WithdrawCallback res_cb,    void *res_cb_cls)  { -  struct TALER_PlanchetDetail pd;    struct TALER_EXCHANGE_WithdrawHandle *wh;    wh = GNUNET_new (struct TALER_EXCHANGE_WithdrawHandle);    wh->exchange = exchange;    wh->cb = res_cb;    wh->cb_cls = res_cb_cls; -  wh->pk = *pk; +  wh->reserve_priv = reserve_priv;    wh->ps = *ps; +  wh->pk = *pk;    wh->csrh = NULL; + +  TALER_denom_pub_deep_copy (&wh->pk.key, +                             &pk->key);    switch (pk->key.cipher)    {    case TALER_DENOMINATION_RSA: @@ -227,27 +260,28 @@ TALER_EXCHANGE_withdraw (          TALER_planchet_prepare (&pk->key,                                  ps,                                  &wh->c_hash, -                                &pd)) +                                &wh->pd))      {        GNUNET_break (0);        GNUNET_free (wh);        return NULL;      } -    TALER_denom_pub_deep_copy (&wh->pk.key, -                               &pk->key);      wh->wh2 = TALER_EXCHANGE_withdraw2 (exchange, -                                        &pd, -                                        reserve_priv, +                                        &wh->pd, +                                        wh->reserve_priv,                                          &handle_reserve_withdraw_finished,                                          wh); -    GNUNET_free (pd.blinded_planchet.details.rsa_blinded_planchet.blinded_msg); +    GNUNET_free ( +      wh->pd.blinded_planchet.details.rsa_blinded_planchet.blinded_msg);      return wh;    case TALER_DENOMINATION_CS: -    struct TALER_WithdrawNonce nonce; -    TALER_cs_withdraw_nonce_derive (&ps->coin_priv, &nonce); +    TALER_cs_withdraw_nonce_derive (&ps->coin_priv, +                                    &wh->pd.blinded_planchet.details. +                                    cs_blinded_planchet.nonce);      wh->csrh = TALER_EXCHANGE_csr (exchange,                                     pk, -                                   &nonce, +                                   &wh->pd.blinded_planchet.details. +                                   cs_blinded_planchet.nonce,                                     &withdraw_cs_stage_two_callback,                                     wh);      return wh; diff --git a/src/lib/exchange_api_withdraw2.c b/src/lib/exchange_api_withdraw2.c index c8eb3182..cb767e43 100644 --- a/src/lib/exchange_api_withdraw2.c +++ b/src/lib/exchange_api_withdraw2.c @@ -437,11 +437,26 @@ TALER_EXCHANGE_withdraw2 (      TALER_amount_hton (&req.amount_with_fee,                         &wh->requested_amount); -    TALER_coin_ev_hash ( -      pd->blinded_planchet.details.rsa_blinded_planchet.blinded_msg, -      pd->blinded_planchet.details.rsa_blinded_planchet. -      blinded_msg_size, -      &req.h_coin_envelope); +    switch (dk->key.cipher) +    { +    case TALER_DENOMINATION_RSA: +      TALER_coin_ev_hash ( +        pd->blinded_planchet.details.rsa_blinded_planchet.blinded_msg, +        pd->blinded_planchet.details.rsa_blinded_planchet. +        blinded_msg_size, +        &req.h_coin_envelope); +      break; +    case TALER_DENOMINATION_CS: +      TALER_coin_ev_hash ( +        &pd->blinded_planchet.details.cs_blinded_planchet, +        sizeof (pd->blinded_planchet.details.cs_blinded_planchet), +        &req.h_coin_envelope); +      break; +    default: +      GNUNET_break (0); +      GNUNET_free (wh); +      return NULL; +    }      GNUNET_CRYPTO_eddsa_sign (&reserve_priv->eddsa_priv,                                &req,                                &reserve_sig.eddsa_signature); @@ -449,17 +464,44 @@ TALER_EXCHANGE_withdraw2 (    {      json_t *withdraw_obj; - -    withdraw_obj = GNUNET_JSON_PACK ( -      GNUNET_JSON_pack_data_auto ("denom_pub_hash", -                                  &pd->denom_pub_hash), -      GNUNET_JSON_pack_data_varsize ("coin_ev", -                                     pd->blinded_planchet.details. -                                     rsa_blinded_planchet.blinded_msg, -                                     pd->blinded_planchet.details. -                                     rsa_blinded_planchet.blinded_msg_size), -      GNUNET_JSON_pack_data_auto ("reserve_sig", -                                  &reserve_sig)); +    switch (dk->key.cipher) +    { +    case TALER_DENOMINATION_RSA: +      withdraw_obj = GNUNET_JSON_PACK ( +        GNUNET_JSON_pack_data_auto ("denom_pub_hash", +                                    &pd->denom_pub_hash), +        GNUNET_JSON_pack_data_varsize ("coin_ev", +                                       pd->blinded_planchet.details. +                                       rsa_blinded_planchet.blinded_msg, +                                       pd->blinded_planchet.details. +                                       rsa_blinded_planchet.blinded_msg_size), +        GNUNET_JSON_pack_data_auto ("reserve_sig", +                                    &reserve_sig)); +      break; +    case TALER_DENOMINATION_CS: +      json_t *coin_ev_object = GNUNET_JSON_PACK ( +        GNUNET_JSON_pack_data_auto ("nonce", +                                    &pd->blinded_planchet.details. +                                    cs_blinded_planchet.nonce), +        GNUNET_JSON_pack_data_auto ("c0", +                                    &pd->blinded_planchet.details. +                                    cs_blinded_planchet.c[0]), +        GNUNET_JSON_pack_data_auto ("c1", +                                    &pd->blinded_planchet.details. +                                    cs_blinded_planchet.c[1])); +      withdraw_obj = GNUNET_JSON_PACK ( +        GNUNET_JSON_pack_data_auto ("denom_pub_hash", +                                    &pd->denom_pub_hash), +        GNUNET_JSON_pack_object_steal ("coin_ev", +                                       coin_ev_object), +        GNUNET_JSON_pack_data_auto ("reserve_sig", +                                    &reserve_sig)); +      break; +    default: +      GNUNET_break (0); +      GNUNET_free (wh); +      return NULL; +    }      GNUNET_log (GNUNET_ERROR_TYPE_INFO,                  "Attempting to withdraw from reserve %s\n",                  TALER_B2S (&wh->reserve_pub)); | 
