[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[GNUnet-SVN] [taler-exchange] 04/05: add option for optimistic signing o
From: |
gnunet |
Subject: |
[GNUnet-SVN] [taler-exchange] 04/05: add option for optimistic signing on withdraw (pre DB transaction) |
Date: |
Thu, 09 Aug 2018 22:30:51 +0200 |
This is an automated email from the git hooks/post-receive script.
grothoff pushed a commit to branch master
in repository exchange.
commit 53e98c10cf5dcb06ad57cf30857f82c5e9434aa0
Author: Christian Grothoff <address@hidden>
AuthorDate: Thu Aug 9 22:30:35 2018 +0200
add option for optimistic signing on withdraw (pre DB transaction)
---
.../taler-exchange-httpd_reserve_withdraw.c | 68 ++++++++++++++++++++++
1 file changed, 68 insertions(+)
diff --git a/src/exchange/taler-exchange-httpd_reserve_withdraw.c
b/src/exchange/taler-exchange-httpd_reserve_withdraw.c
index 837d603..2b127ce 100644
--- a/src/exchange/taler-exchange-httpd_reserve_withdraw.c
+++ b/src/exchange/taler-exchange-httpd_reserve_withdraw.c
@@ -30,6 +30,14 @@
/**
+ * Perform RSA signature before checking with the database?
+ * Reduces time spent in transaction, but may cause us to
+ * waste CPU time if DB check fails.
+ */
+#define OPTIMISTIC_SIGN 1
+
+
+/**
* Send reserve status information to client with the
* message that we have insufficient funds for the
* requested /reserve/withdraw operation.
@@ -172,6 +180,12 @@ withdraw_transaction (void *cls,
enum GNUNET_DB_QueryStatus qs;
struct TALER_DenominationSignature denom_sig;
+#if OPTIMISTIC_SIGN
+ /* store away optimistic signature to protect
+ it from being overwritten by get_withdraw_info */
+ denom_sig = wc->collectable.sig;
+ wc->collectable.sig.rsa_signature = NULL;
+#endif
qs = TEH_plugin->get_withdraw_info (TEH_plugin->cls,
session,
&wc->wsrd.h_coin_envelope,
@@ -182,12 +196,20 @@ withdraw_transaction (void *cls,
if (GNUNET_DB_STATUS_HARD_ERROR == qs)
*mhd_ret = TEH_RESPONSE_reply_internal_db_error (connection,
TALER_EC_WITHDRAW_DB_FETCH_ERROR);
+#if OPTIMISTIC_SIGN
+ GNUNET_CRYPTO_rsa_signature_free (denom_sig.rsa_signature);
+#endif
return qs;
}
/* Don't sign again if we have already signed the coin */
if (1 == qs)
+ {
+#if OPTIMISTIC_SIGN
+ GNUNET_CRYPTO_rsa_signature_free (denom_sig.rsa_signature);
+#endif
return GNUNET_DB_STATUS_SUCCESS_ONE_RESULT;
+ }
GNUNET_assert (0 == qs);
/* Check if balance is sufficient */
@@ -200,6 +222,9 @@ withdraw_transaction (void *cls,
if (GNUNET_DB_STATUS_HARD_ERROR == qs)
*mhd_ret = TEH_RESPONSE_reply_internal_db_error (connection,
TALER_EC_WITHDRAW_DB_FETCH_ERROR);
+#if OPTIMISTIC_SIGN
+ GNUNET_CRYPTO_rsa_signature_free (denom_sig.rsa_signature);
+#endif
return qs;
}
if (NULL == rh)
@@ -207,6 +232,9 @@ withdraw_transaction (void *cls,
*mhd_ret = TEH_RESPONSE_reply_arg_unknown (connection,
TALER_EC_WITHDRAW_RESERVE_UNKNOWN,
"reserve_pub");
+#if OPTIMISTIC_SIGN
+ GNUNET_CRYPTO_rsa_signature_free (denom_sig.rsa_signature);
+#endif
return GNUNET_DB_STATUS_HARD_ERROR;
}
@@ -229,6 +257,9 @@ withdraw_transaction (void *cls,
{
*mhd_ret = TEH_RESPONSE_reply_internal_db_error (connection,
TALER_EC_WITHDRAW_AMOUNT_DEPOSITS_OVERFLOW);
+#if OPTIMISTIC_SIGN
+ GNUNET_CRYPTO_rsa_signature_free (denom_sig.rsa_signature);
+#endif
return GNUNET_DB_STATUS_HARD_ERROR;
}
res |= 1;
@@ -245,6 +276,9 @@ withdraw_transaction (void *cls,
{
*mhd_ret = TEH_RESPONSE_reply_internal_db_error (connection,
TALER_EC_WITHDRAW_AMOUNT_WITHDRAWALS_OVERFLOW);
+#if OPTIMISTIC_SIGN
+ GNUNET_CRYPTO_rsa_signature_free (denom_sig.rsa_signature);
+#endif
return GNUNET_DB_STATUS_HARD_ERROR;
}
res |= 2;
@@ -261,6 +295,9 @@ withdraw_transaction (void *cls,
{
*mhd_ret = TEH_RESPONSE_reply_internal_db_error (connection,
TALER_EC_WITHDRAW_AMOUNT_DEPOSITS_OVERFLOW);
+#if OPTIMISTIC_SIGN
+ GNUNET_CRYPTO_rsa_signature_free (denom_sig.rsa_signature);
+#endif
return GNUNET_DB_STATUS_HARD_ERROR;
}
res |= 1;
@@ -277,6 +314,9 @@ withdraw_transaction (void *cls,
{
*mhd_ret = TEH_RESPONSE_reply_internal_db_error (connection,
TALER_EC_WITHDRAW_AMOUNT_WITHDRAWALS_OVERFLOW);
+#if OPTIMISTIC_SIGN
+ GNUNET_CRYPTO_rsa_signature_free (denom_sig.rsa_signature);
+#endif
return GNUNET_DB_STATUS_HARD_ERROR;
}
@@ -290,6 +330,9 @@ withdraw_transaction (void *cls,
GNUNET_break (0);
*mhd_ret = TEH_RESPONSE_reply_internal_db_error (connection,
TALER_EC_WITHDRAW_RESERVE_WITHOUT_WIRE_TRANSFER);
+#if OPTIMISTIC_SIGN
+ GNUNET_CRYPTO_rsa_signature_free (denom_sig.rsa_signature);
+#endif
return GNUNET_DB_STATUS_HARD_ERROR;
}
if (0 == (res & 2))
@@ -308,6 +351,9 @@ withdraw_transaction (void *cls,
GNUNET_break (0); /* database inconsistent */
*mhd_ret = TEH_RESPONSE_reply_internal_db_error (connection,
TALER_EC_WITHDRAW_RESERVE_HISTORY_IMPOSSIBLE);
+#if OPTIMISTIC_SIGN
+ GNUNET_CRYPTO_rsa_signature_free (denom_sig.rsa_signature);
+#endif
return GNUNET_DB_STATUS_HARD_ERROR;
}
@@ -319,12 +365,16 @@ withdraw_transaction (void *cls,
rh);
TEH_plugin->free_reserve_history (TEH_plugin->cls,
rh);
+#if OPTIMISTIC_SIGN
+ GNUNET_CRYPTO_rsa_signature_free (denom_sig.rsa_signature);
+#endif
return GNUNET_DB_STATUS_HARD_ERROR;
}
TEH_plugin->free_reserve_history (TEH_plugin->cls,
rh);
/* Balance is good, sign the coin! */
+#if !OPTIMISTIC_SIGN
denom_sig.rsa_signature
= GNUNET_CRYPTO_rsa_sign_blinded (wc->dki->denom_priv.rsa_private_key,
wc->blinded_msg,
@@ -337,6 +387,7 @@ withdraw_transaction (void *cls,
"Internal error");
return GNUNET_DB_STATUS_HARD_ERROR;
}
+#endif
TALER_amount_ntoh (&fee_withdraw,
&wc->dki->issue.properties.fee_withdraw);
wc->collectable.sig = denom_sig;
@@ -482,6 +533,23 @@ TEH_RESERVE_handler_reserve_withdraw (struct
TEH_RequestHandler *rh,
"reserve_sig");
}
+#if OPTIMISTIC_SIGN
+ /* Sign before transaction! */
+ wc.collectable.sig.rsa_signature
+ = GNUNET_CRYPTO_rsa_sign_blinded (wc.dki->denom_priv.rsa_private_key,
+ wc.blinded_msg,
+ wc.blinded_msg_len);
+ if (NULL == wc.collectable.sig.rsa_signature)
+ {
+ GNUNET_break (0);
+ GNUNET_JSON_parse_free (spec);
+ TEH_KS_release (wc.key_state);
+ return TEH_RESPONSE_reply_internal_error (connection,
+
TALER_EC_WITHDRAW_SIGNATURE_FAILED,
+ "Internal error");
+ }
+#endif
+
if (GNUNET_OK !=
TEH_DB_run_transaction (connection,
"run reserve withdraw",
--
To stop receiving notification emails like this one, please contact
address@hidden
- [GNUnet-SVN] [taler-exchange] branch master updated (9384234 -> 04055de), gnunet, 2018/08/09
- [GNUnet-SVN] [taler-exchange] 02/05: try with row locking to avoid rollbacks (in theory, to be verified), gnunet, 2018/08/09
- [GNUnet-SVN] [taler-exchange] 04/05: add option for optimistic signing on withdraw (pre DB transaction),
gnunet <=
- [GNUnet-SVN] [taler-exchange] 03/05: fix spacing, gnunet, 2018/08/09
- [GNUnet-SVN] [taler-exchange] 01/05: eliminate redundant hash call, gnunet, 2018/08/09
- [GNUnet-SVN] [taler-exchange] 05/05: spaceing, gnunet, 2018/08/09