Add abstractions: TALER_exchange_deposit_{sign,verify}

This change also removes ‘struct TALER_DepositTrackPS’
from the public API.

* src/include/taler_signatures.h (struct TALER_DepositTrackPS): Delete.

* src/util/exchange_signatures.c (struct TALER_DepositTrackPS): New.
  (TALER_exchange_deposit_sign): New func.
  (TALER_exchange_deposit_verify): New func.

* src/include/taler_crypto_lib.h
  (TALER_exchange_deposit_sign): New func decl.
  (TALER_exchange_deposit_verify): New func decl.

* src/exchange/taler-exchange-httpd_deposits_get.c
  (TEH_handler_deposits_get): Rework to use ‘TALER_exchange_deposit_verify’.

* src/lib/exchange_api_deposits_get.c
  (TALER_EXCHANGE_deposits_get): Rework to use ‘taler_exchange_deposit_sign’.
This commit is contained in:
Thien-Thi Nguyen 2022-04-21 06:16:33 -04:00
parent e40a16aa8e
commit a72337a5f3
No known key found for this signature in database
GPG Key ID: 670322244C807502
5 changed files with 142 additions and 63 deletions

View File

@ -328,20 +328,12 @@ TEH_handler_deposits_get (struct TEH_RequestContext *rc,
return MHD_YES; /* parse error */ return MHD_YES; /* parse error */
TEH_METRICS_num_verifications[TEH_MT_SIGNATURE_EDDSA]++; TEH_METRICS_num_verifications[TEH_MT_SIGNATURE_EDDSA]++;
{ {
struct TALER_DepositTrackPS tps = {
.purpose.size = htonl (sizeof (tps)),
.purpose.purpose = htonl (TALER_SIGNATURE_MERCHANT_TRACK_TRANSACTION),
.merchant = ctx.merchant,
.coin_pub = ctx.coin_pub,
.h_contract_terms = ctx.h_contract_terms,
.h_wire = ctx.h_wire
};
if (GNUNET_OK != if (GNUNET_OK !=
GNUNET_CRYPTO_eddsa_verify (TALER_SIGNATURE_MERCHANT_TRACK_TRANSACTION, TALER_exchange_deposit_verify (&ctx.merchant,
&tps, &ctx.coin_pub,
&merchant_sig.eddsa_sig, &ctx.h_contract_terms,
&tps.merchant.eddsa_pub)) &ctx.h_wire,
&merchant_sig))
{ {
GNUNET_break_op (0); GNUNET_break_op (0);
return TALER_MHD_reply_with_error (rc->connection, return TALER_MHD_reply_with_error (rc->connection,

View File

@ -3370,6 +3370,46 @@ TALER_merchant_refund_verify (
const struct TALER_MerchantSignatureP *merchant_sig); const struct TALER_MerchantSignatureP *merchant_sig);
/* ********************* exchange deposit signing ************************* */
/**
* Sign a deposit.
*
* @param h_contract_terms hash of contract terms
* @param h_wire hash of the merchant account details
* @param coin_pub coin to be deposited
* @param merchant_pub merchant public key
* @param merchant_priv private key to sign with
* @param[out] merchant_sig where to write the signature
*/
void
TALER_exchange_deposit_sign (
const struct TALER_PrivateContractHashP *h_contract_terms,
const struct TALER_MerchantWireHashP *h_wire,
const struct TALER_CoinSpendPublicKeyP *coin_pub,
const struct TALER_MerchantPublicKeyP *merchant_pub,
const struct TALER_MerchantPrivateKeyP *merchant_priv,
struct TALER_MerchantSignatureP *merchant_sig);
/**
* Verify a deposit.
*
* @param merchant merchant public key
* @param public key of the deposited coin
* @param h_contract_terms hash of contract terms
* @param h_wire hash of the merchant account details
* @param merchant_sig signature of the merchant
* @return #GNUNET_OK if the signature is valid
*/
enum GNUNET_GenericReturnValue
TALER_exchange_deposit_verify (
const struct TALER_MerchantPublicKeyP *merchant,
const struct TALER_CoinSpendPublicKeyP *coin_pub,
const struct TALER_PrivateContractHashP *h_contract_terms,
const struct TALER_MerchantWireHashP *h_wire,
const struct TALER_MerchantSignatureP *merchant_sig);
/* ********************* exchange online signing ************************** */ /* ********************* exchange online signing ************************** */

View File

@ -386,42 +386,6 @@
GNUNET_NETWORK_STRUCT_BEGIN GNUNET_NETWORK_STRUCT_BEGIN
/**
* @brief Format used to generate the signature on a request to obtain
* the wire transfer identifier associated with a deposit.
*/
struct TALER_DepositTrackPS
{
/**
* Purpose must be #TALER_SIGNATURE_MERCHANT_TRACK_TRANSACTION.
*/
struct GNUNET_CRYPTO_EccSignaturePurpose purpose;
/**
* Hash over the proposal data of the contract for which this deposit is made.
*/
struct TALER_PrivateContractHashP h_contract_terms GNUNET_PACKED;
/**
* Hash over the wiring information of the merchant.
*/
struct TALER_MerchantWireHashP h_wire GNUNET_PACKED;
/**
* The Merchant's public key. The deposit inquiry request is to be
* signed by the corresponding private key (using EdDSA).
*/
struct TALER_MerchantPublicKeyP merchant;
/**
* The coin's public key. This is the value that must have been
* signed (blindly) by the Exchange.
*/
struct TALER_CoinSpendPublicKeyP coin_pub;
};
GNUNET_NETWORK_STRUCT_END GNUNET_NETWORK_STRUCT_END
#endif #endif

View File

@ -301,7 +301,7 @@ TALER_EXCHANGE_deposits_get (
TALER_EXCHANGE_DepositGetCallback cb, TALER_EXCHANGE_DepositGetCallback cb,
void *cb_cls) void *cb_cls)
{ {
struct TALER_DepositTrackPS dtp; struct TALER_MerchantPublicKeyP merchant;
struct TALER_MerchantSignatureP merchant_sig; struct TALER_MerchantSignatureP merchant_sig;
struct TALER_EXCHANGE_DepositGetHandle *dwh; struct TALER_EXCHANGE_DepositGetHandle *dwh;
struct GNUNET_CURL_Context *ctx; struct GNUNET_CURL_Context *ctx;
@ -318,18 +318,14 @@ TALER_EXCHANGE_deposits_get (
GNUNET_break (0); GNUNET_break (0);
return NULL; return NULL;
} }
// FIXME: move to helper!
dtp.purpose.purpose = htonl (TALER_SIGNATURE_MERCHANT_TRACK_TRANSACTION);
dtp.purpose.size = htonl (sizeof (dtp));
dtp.h_contract_terms = *h_contract_terms;
dtp.h_wire = *h_wire;
GNUNET_CRYPTO_eddsa_key_get_public (&merchant_priv->eddsa_priv, GNUNET_CRYPTO_eddsa_key_get_public (&merchant_priv->eddsa_priv,
&dtp.merchant.eddsa_pub); &merchant.eddsa_pub);
TALER_exchange_deposit_sign (h_contract_terms,
dtp.coin_pub = *coin_pub; h_wire,
GNUNET_CRYPTO_eddsa_sign (&merchant_priv->eddsa_priv, coin_pub,
&dtp, &merchant,
&merchant_sig.eddsa_sig); merchant_priv,
&merchant_sig);
{ {
char cpub_str[sizeof (struct TALER_CoinSpendPublicKeyP) * 2]; char cpub_str[sizeof (struct TALER_CoinSpendPublicKeyP) * 2];
char mpub_str[sizeof (struct TALER_MerchantPublicKeyP) * 2]; char mpub_str[sizeof (struct TALER_MerchantPublicKeyP) * 2];
@ -343,8 +339,8 @@ TALER_EXCHANGE_deposits_get (
whash_str, whash_str,
sizeof (whash_str)); sizeof (whash_str));
*end = '\0'; *end = '\0';
end = GNUNET_STRINGS_data_to_string (&dtp.merchant, end = GNUNET_STRINGS_data_to_string (&merchant,
sizeof (dtp.merchant), sizeof (merchant),
mpub_str, mpub_str,
sizeof (mpub_str)); sizeof (mpub_str));
*end = '\0'; *end = '\0';

View File

@ -23,6 +23,93 @@
#include "taler_signatures.h" #include "taler_signatures.h"
GNUNET_NETWORK_STRUCT_BEGIN
/**
* @brief Format used to generate the signature on a request to obtain
* the wire transfer identifier associated with a deposit.
*/
struct TALER_DepositTrackPS
{
/**
* Purpose must be #TALER_SIGNATURE_MERCHANT_TRACK_TRANSACTION.
*/
struct GNUNET_CRYPTO_EccSignaturePurpose purpose;
/**
* Hash over the proposal data of the contract for which this deposit is made.
*/
struct TALER_PrivateContractHashP h_contract_terms GNUNET_PACKED;
/**
* Hash over the wiring information of the merchant.
*/
struct TALER_MerchantWireHashP h_wire GNUNET_PACKED;
/**
* The Merchant's public key. The deposit inquiry request is to be
* signed by the corresponding private key (using EdDSA).
*/
struct TALER_MerchantPublicKeyP merchant;
/**
* The coin's public key. This is the value that must have been
* signed (blindly) by the Exchange.
*/
struct TALER_CoinSpendPublicKeyP coin_pub;
};
GNUNET_NETWORK_STRUCT_END
void
TALER_exchange_deposit_sign (
const struct TALER_PrivateContractHashP *h_contract_terms,
const struct TALER_MerchantWireHashP *h_wire,
const struct TALER_CoinSpendPublicKeyP *coin_pub,
const struct TALER_MerchantPublicKeyP *merchant_pub,
const struct TALER_MerchantPrivateKeyP *merchant_priv,
struct TALER_MerchantSignatureP *merchant_sig)
{
struct TALER_DepositTrackPS dtp = {
.purpose.purpose = htonl (TALER_SIGNATURE_MERCHANT_TRACK_TRANSACTION),
.purpose.size = htonl (sizeof (dtp)),
.h_contract_terms = *h_contract_terms,
.h_wire = *h_wire,
.merchant = *merchant_pub,
.coin_pub = *coin_pub
};
GNUNET_CRYPTO_eddsa_sign (&merchant_priv->eddsa_priv,
&dtp,
&merchant_sig->eddsa_sig);
}
enum GNUNET_GenericReturnValue
TALER_exchange_deposit_verify (
const struct TALER_MerchantPublicKeyP *merchant,
const struct TALER_CoinSpendPublicKeyP *coin_pub,
const struct TALER_PrivateContractHashP *h_contract_terms,
const struct TALER_MerchantWireHashP *h_wire,
const struct TALER_MerchantSignatureP *merchant_sig)
{
struct TALER_DepositTrackPS tps = {
.purpose.size = htonl (sizeof (tps)),
.purpose.purpose = htonl (TALER_SIGNATURE_MERCHANT_TRACK_TRANSACTION),
.merchant = *merchant,
.coin_pub = *coin_pub,
.h_contract_terms = *h_contract_terms,
.h_wire = *h_wire
};
return
GNUNET_CRYPTO_eddsa_verify (TALER_SIGNATURE_MERCHANT_TRACK_TRANSACTION,
&tps,
&merchant_sig->eddsa_sig,
&tps.merchant.eddsa_pub);
}
GNUNET_NETWORK_STRUCT_BEGIN GNUNET_NETWORK_STRUCT_BEGIN
/** /**