From 74ce114b832daf49cf51185c38949240de2e89cd Mon Sep 17 00:00:00 2001 From: Lucien Heuzeveldt Date: Tue, 11 Jan 2022 21:16:47 +0100 Subject: [PATCH] change TEH_keys_denomination_sign message parameter --- src/exchange/taler-exchange-httpd_keys.c | 22 ++++----- src/exchange/taler-exchange-httpd_keys.h | 39 +++++++++++++++- .../taler-exchange-httpd_refreshes_reveal.c | 10 ++++ src/exchange/taler-exchange-httpd_withdraw.c | 46 ++++++++++--------- 4 files changed, 81 insertions(+), 36 deletions(-) diff --git a/src/exchange/taler-exchange-httpd_keys.c b/src/exchange/taler-exchange-httpd_keys.c index 66c0f69e2..42f351b75 100644 --- a/src/exchange/taler-exchange-httpd_keys.c +++ b/src/exchange/taler-exchange-httpd_keys.c @@ -2410,8 +2410,7 @@ TEH_keys_denomination_by_hash2 ( struct TALER_BlindedDenominationSignature TEH_keys_denomination_sign (const struct TALER_DenominationHash *h_denom_pub, - const void *msg, - size_t msg_size, + const struct TEH_SignDetails *msg, enum TALER_ErrorCode *ec) { struct TEH_KeyStateHandle *ksh; @@ -2434,26 +2433,23 @@ TEH_keys_denomination_sign (const struct TALER_DenominationHash *h_denom_pub, *ec = TALER_EC_EXCHANGE_GENERIC_DENOMINATION_KEY_UNKNOWN; return none; } + if (msg->cipher != hd->denom_pub.cipher) + { + *ec = TALER_EC_GENERIC_INTERNAL_INVARIANT_FAILURE; + return none; + } switch (hd->denom_pub.cipher) { case TALER_DENOMINATION_RSA: return TALER_CRYPTO_helper_rsa_sign (ksh->helpers->rsadh, &hd->h_details.h_rsa, - msg, - msg_size, + msg->details.rsa_message.msg, + msg->details.rsa_message.msg_size, ec); case TALER_DENOMINATION_CS: - if (sizeof (struct TALER_BlindedCsPlanchet) != msg_size) - { - *ec = TALER_EC_GENERIC_INTERNAL_INVARIANT_FAILURE; - return none; - } - struct TALER_BlindedCsPlanchet *blinded_cs_planchet = ((struct - TALER_BlindedCsPlanchet - *) msg); return TALER_CRYPTO_helper_cs_sign (ksh->helpers->csdh, &hd->h_details.h_cs, - blinded_cs_planchet, + &msg->details.cs_message, ec); default: *ec = TALER_EC_GENERIC_INTERNAL_INVARIANT_FAILURE; diff --git a/src/exchange/taler-exchange-httpd_keys.h b/src/exchange/taler-exchange-httpd_keys.h index 0134a28d0..7e75c80a9 100644 --- a/src/exchange/taler-exchange-httpd_keys.h +++ b/src/exchange/taler-exchange-httpd_keys.h @@ -82,6 +82,42 @@ struct TEH_DenominationKey }; +struct TEH_SignDetails_RSA +{ + /** + * message to sign + */ + const void *msg; + + /** + * number of bytes in msg + */ + size_t msg_size; +}; + + +struct TEH_SignDetails +{ + /** + * Cipher type of the message + */ + enum TALER_DenominationCipher cipher; + + union + { + /** + * If we use #TALER_DENOMINATION_RSA in @a cipher. + */ + struct TEH_SignDetails_RSA rsa_message; + + /** + * If we use #TALER_DENOMINATION_CS in @a cipher. + */ + struct TALER_BlindedCsPlanchet cs_message; + } details; +}; + + /** * Snapshot of the (coin and signing) keys (including private keys) of * the exchange. There can be multiple instances of this struct, as it is @@ -179,8 +215,7 @@ TEH_keys_denomination_by_hash2 (struct TEH_KeyStateHandle *ksh, */ struct TALER_BlindedDenominationSignature TEH_keys_denomination_sign (const struct TALER_DenominationHash *h_denom_pub, - const void *msg, - size_t msg_size, + const struct TEH_SignDetails *msg, enum TALER_ErrorCode *ec); diff --git a/src/exchange/taler-exchange-httpd_refreshes_reveal.c b/src/exchange/taler-exchange-httpd_refreshes_reveal.c index 9d806bea5..5a46aa22e 100644 --- a/src/exchange/taler-exchange-httpd_refreshes_reveal.c +++ b/src/exchange/taler-exchange-httpd_refreshes_reveal.c @@ -507,6 +507,7 @@ resolve_refreshes_reveal_denominations (struct MHD_Connection *connection, for (unsigned int i = 0; inum_fresh_coins; i++) { enum TALER_ErrorCode ec = TALER_EC_NONE; + //FIXME: rrcs[i].coin_sig = TEH_keys_denomination_sign ( @@ -514,6 +515,15 @@ resolve_refreshes_reveal_denominations (struct MHD_Connection *connection, rcds[i].coin_ev, rcds[i].coin_ev_size, &ec); + struct TEH_SignDetails sign_details; + + // FIXME: implement cipher handling + sign_details.cipher = TALER_DENOMINATION_RSA; + sign_details.details.rsa_message.msg = rctx->rcds[i].coin_ev; + sign_details.details.rsa_message.msg_size = rctx->rcds[i].coin_ev_size; + rctx->ev_sigs[i] = TEH_keys_denomination_sign (&dk_h[i], + &sign_details, + &ec); if (TALER_EC_NONE != ec) { GNUNET_break (0); diff --git a/src/exchange/taler-exchange-httpd_withdraw.c b/src/exchange/taler-exchange-httpd_withdraw.c index ed54fe278..9925fa8e6 100644 --- a/src/exchange/taler-exchange-httpd_withdraw.c +++ b/src/exchange/taler-exchange-httpd_withdraw.c @@ -600,31 +600,35 @@ TEH_handler_withdraw (struct TEH_RequestContext *rc, /* Sign before transaction! */ ec = TALER_EC_NONE; - switch (wc.blinded_planchet.cipher) { - case TALER_DENOMINATION_RSA: + struct TEH_SignDetails sign_details; + sign_details.cipher = wc.blinded_planchet.cipher; + switch (wc.blinded_planchet.cipher) + { + case TALER_DENOMINATION_RSA: + sign_details.details.rsa_message.msg = + wc.blinded_planchet.details.rsa_blinded_planchet.blinded_msg; + sign_details.details.rsa_message.msg_size = + wc.blinded_planchet.details.rsa_blinded_planchet.blinded_msg_size; + break; + case TALER_DENOMINATION_CS: + sign_details.details.cs_message = + wc.blinded_planchet.details.cs_blinded_planchet; + break; + default: + GNUNET_break (0); + GNUNET_JSON_parse_free (spec); + if (NULL != coin_ev_spec) + GNUNET_JSON_parse_free (coin_ev_spec); + return TALER_MHD_reply_with_error (rc->connection, + MHD_HTTP_FORBIDDEN, + TALER_EC_GENERIC_INTERNAL_INVARIANT_FAILURE, + NULL); + } wc.collectable.sig = TEH_keys_denomination_sign ( &wc.collectable.denom_pub_hash, - wc.blinded_planchet.details.rsa_blinded_planchet.blinded_msg, - wc.blinded_planchet.details.rsa_blinded_planchet.blinded_msg_size, + &sign_details, &ec); - break; - case TALER_DENOMINATION_CS: - wc.collectable.sig = TEH_keys_denomination_sign ( - &wc.collectable.denom_pub_hash, - &wc.blinded_planchet.details.cs_blinded_planchet, - sizeof (wc.blinded_planchet.details.cs_blinded_planchet), - &ec); - break; - default: - GNUNET_break (0); - GNUNET_JSON_parse_free (spec); - if (NULL != coin_ev_spec) - GNUNET_JSON_parse_free (coin_ev_spec); - return TALER_MHD_reply_with_error (rc->connection, - MHD_HTTP_FORBIDDEN, - TALER_EC_GENERIC_INTERNAL_INVARIANT_FAILURE, - NULL); } if (TALER_EC_NONE != ec) {