aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
m---------contrib/gana0
-rw-r--r--src/include/taler_auditor_service.h6
-rw-r--r--src/include/taler_crypto_lib.h24
-rw-r--r--src/lib/auditor_api_deposit_confirmation.c8
-rw-r--r--src/lib/exchange_api_auditor_add_denomination.c2
-rw-r--r--src/lib/exchange_api_common.c4
-rw-r--r--src/lib/exchange_api_deposit.c44
-rw-r--r--src/lib/exchange_api_handle.c85
-rw-r--r--src/util/denom.c54
9 files changed, 148 insertions, 79 deletions
diff --git a/contrib/gana b/contrib/gana
-Subproject 8c7d9be40ba627348da3e01b91b4f1d3cc78631
+Subproject 0272caa8ff8ee7553d035d29fb19d01866df43e
diff --git a/src/include/taler_auditor_service.h b/src/include/taler_auditor_service.h
index d84ecd5eb..9e2e46d28 100644
--- a/src/include/taler_auditor_service.h
+++ b/src/include/taler_auditor_service.h
@@ -1,6 +1,6 @@
/*
This file is part of TALER
- Copyright (C) 2014-2020 Taler Systems SA
+ Copyright (C) 2014-2021 Taler Systems SA
TALER is free software; you can redistribute it and/or modify it under the
terms of the GNU Affero General Public License as published by the Free Software
@@ -254,8 +254,8 @@ typedef void
struct TALER_AUDITOR_DepositConfirmationHandle *
TALER_AUDITOR_deposit_confirmation (
struct TALER_AUDITOR_Handle *auditor,
- const struct GNUNET_HashCode *h_wire,
- const struct GNUNET_HashCode *h_contract_terms,
+ const struct TALER_MerchantWireHash *h_wire,
+ const struct TALER_PrivateContractHash *h_contract_terms,
struct GNUNET_TIME_Absolute timestamp,
struct GNUNET_TIME_Absolute refund_deadline,
const struct TALER_Amount *amount_without_fee,
diff --git a/src/include/taler_crypto_lib.h b/src/include/taler_crypto_lib.h
index 561f2bd0a..3507ebe5e 100644
--- a/src/include/taler_crypto_lib.h
+++ b/src/include/taler_crypto_lib.h
@@ -662,6 +662,30 @@ TALER_denom_pub_hash (const struct TALER_DenominationPublicKey *denom_pub,
/**
+ * Make a (deep) copy of the given @a denom_src to
+ * @a denom_dst.
+ *
+ * @param[out] denom_dst target to copy to
+ * @param denom_str public key to copy
+ */
+void
+TALER_denom_pub_deep_copy (struct TALER_DenominationPublicKey *denom_dst,
+ const struct TALER_DenominationPublicKey *denom_src);
+
+
+/**
+ * Compare two denomination public keys.
+ *
+ * @param denom1 first key
+ * @param denom2 second key
+ * @return 0 if the keys are equal, otherwise -1 or 1
+ */
+int
+TALER_denom_pub_cmp (const struct TALER_DenominationPublicKey *denom1,
+ const struct TALER_DenominationPublicKey *denom2);
+
+
+/**
* Obtain denomination public key from a denomination private key.
*
* @param denom_priv private key to convert
diff --git a/src/lib/auditor_api_deposit_confirmation.c b/src/lib/auditor_api_deposit_confirmation.c
index 9c13c3f0f..89f67f92e 100644
--- a/src/lib/auditor_api_deposit_confirmation.c
+++ b/src/lib/auditor_api_deposit_confirmation.c
@@ -169,8 +169,8 @@ handle_deposit_confirmation_finished (void *cls,
* @return #GNUNET_OK if signatures are OK, #GNUNET_SYSERR if not
*/
static int
-verify_signatures (const struct GNUNET_HashCode *h_wire,
- const struct GNUNET_HashCode *h_contract_terms,
+verify_signatures (const struct TALER_MerchantWireHash *h_wire,
+ const struct TALER_PrivateContractHash *h_contract_terms,
struct GNUNET_TIME_Absolute exchange_timestamp,
struct GNUNET_TIME_Absolute refund_deadline,
const struct TALER_Amount *amount_without_fee,
@@ -273,8 +273,8 @@ verify_signatures (const struct GNUNET_HashCode *h_wire,
struct TALER_AUDITOR_DepositConfirmationHandle *
TALER_AUDITOR_deposit_confirmation (
struct TALER_AUDITOR_Handle *auditor,
- const struct GNUNET_HashCode *h_wire,
- const struct GNUNET_HashCode *h_contract_terms,
+ const struct TALER_MerchantWireHash *h_wire,
+ const struct TALER_PrivateContractHash *h_contract_terms,
struct GNUNET_TIME_Absolute exchange_timestamp,
struct GNUNET_TIME_Absolute refund_deadline,
const struct TALER_Amount *amount_without_fee,
diff --git a/src/lib/exchange_api_auditor_add_denomination.c b/src/lib/exchange_api_auditor_add_denomination.c
index 8952cd2fc..fbe46e51f 100644
--- a/src/lib/exchange_api_auditor_add_denomination.c
+++ b/src/lib/exchange_api_auditor_add_denomination.c
@@ -141,7 +141,7 @@ struct TALER_EXCHANGE_AuditorAddDenominationHandle *
TALER_EXCHANGE_add_auditor_denomination (
struct GNUNET_CURL_Context *ctx,
const char *url,
- const struct GNUNET_HashCode *h_denom_pub,
+ const struct TALER_DenominationHash *h_denom_pub,
const struct TALER_AuditorPublicKeyP *auditor_pub,
const struct TALER_AuditorSignatureP *auditor_sig,
TALER_EXCHANGE_AuditorAddDenominationCallback cb,
diff --git a/src/lib/exchange_api_common.c b/src/lib/exchange_api_common.c
index 9c4a95ad0..143ceddae 100644
--- a/src/lib/exchange_api_common.c
+++ b/src/lib/exchange_api_common.c
@@ -1,6 +1,6 @@
/*
This file is part of TALER
- Copyright (C) 2015-2020 Taler Systems SA
+ Copyright (C) 2015-2021 Taler Systems SA
TALER is free software; you can redistribute it and/or modify it under the
terms of the GNU General Public License as published by the Free Software
@@ -451,7 +451,7 @@ TALER_EXCHANGE_verify_coin_history (
const char *currency,
const struct TALER_CoinSpendPublicKeyP *coin_pub,
json_t *history,
- struct GNUNET_HashCode *h_denom_pub,
+ struct TALER_DenominationHash *h_denom_pub,
struct TALER_Amount *total)
{
size_t len;
diff --git a/src/lib/exchange_api_deposit.c b/src/lib/exchange_api_deposit.c
index d153a2733..461a282cf 100644
--- a/src/lib/exchange_api_deposit.c
+++ b/src/lib/exchange_api_deposit.c
@@ -194,7 +194,7 @@ verify_deposit_signature_conflict (
json_t *history;
struct TALER_Amount total;
enum TALER_ErrorCode ec;
- struct GNUNET_HashCode h_denom_pub;
+ struct TALER_DenominationHash h_denom_pub;
memset (&h_denom_pub,
0,
@@ -537,22 +537,22 @@ TALER_EXCHANGE_deposit_permission_sign (
struct TALER_EXCHANGE_DepositHandle *
-TALER_EXCHANGE_deposit (struct TALER_EXCHANGE_Handle *exchange,
- const struct TALER_Amount *amount,
- struct GNUNET_TIME_Absolute wire_deadline,
- json_t *wire_details,
- const struct
- TALER_PrivateContractHash *h_contract_terms,
- const struct TALER_CoinSpendPublicKeyP *coin_pub,
- const struct TALER_DenominationSignature *denom_sig,
- const struct TALER_DenominationPublicKey *denom_pub,
- struct GNUNET_TIME_Absolute timestamp,
- const struct TALER_MerchantPublicKeyP *merchant_pub,
- struct GNUNET_TIME_Absolute refund_deadline,
- const struct TALER_CoinSpendSignatureP *coin_sig,
- TALER_EXCHANGE_DepositResultCallback cb,
- void *cb_cls,
- enum TALER_ErrorCode *ec)
+TALER_EXCHANGE_deposit (
+ struct TALER_EXCHANGE_Handle *exchange,
+ const struct TALER_Amount *amount,
+ struct GNUNET_TIME_Absolute wire_deadline,
+ json_t *wire_details,
+ const struct TALER_PrivateContractHash *h_contract_terms,
+ const struct TALER_CoinSpendPublicKeyP *coin_pub,
+ const struct TALER_DenominationSignature *denom_sig,
+ const struct TALER_DenominationPublicKey *denom_pub,
+ struct GNUNET_TIME_Absolute timestamp,
+ const struct TALER_MerchantPublicKeyP *merchant_pub,
+ struct GNUNET_TIME_Absolute refund_deadline,
+ const struct TALER_CoinSpendSignatureP *coin_sig,
+ TALER_EXCHANGE_DepositResultCallback cb,
+ void *cb_cls,
+ enum TALER_ErrorCode *ec)
{
const struct TALER_EXCHANGE_Keys *key_state;
const struct TALER_EXCHANGE_DenomPublicKey *dki;
@@ -617,8 +617,8 @@ TALER_EXCHANGE_deposit (struct TALER_EXCHANGE_Handle *exchange,
GNUNET_break_op (0);
return NULL;
}
- GNUNET_CRYPTO_rsa_public_key_hash (denom_pub->rsa_public_key,
- &denom_pub_hash);
+ TALER_denom_pub_hash (denom_pub,
+ &denom_pub_hash);
if (GNUNET_OK !=
verify_signatures (dki,
amount,
@@ -691,8 +691,10 @@ TALER_EXCHANGE_deposit (struct TALER_EXCHANGE_Handle *exchange,
dh->depconf.merchant = *merchant_pub;
dh->amount_with_fee = *amount;
dh->dki = *dki;
- dh->dki.key.rsa_public_key = NULL; /* lifetime not warranted, so better
- not copy the pointer */
+ memset (&dh->dki.key,
+ 0,
+ sizeof (dh->dki.key)); /* lifetime not warranted, so better
+ not copy the contents! */
eh = TALER_EXCHANGE_curl_easy_get_ (dh->url);
if ( (NULL == eh) ||
diff --git a/src/lib/exchange_api_handle.c b/src/lib/exchange_api_handle.c
index 0b19c795d..2fd0937f4 100644
--- a/src/lib/exchange_api_handle.c
+++ b/src/lib/exchange_api_handle.c
@@ -345,8 +345,8 @@ parse_json_denomkey (struct TALER_EXCHANGE_DenomPublicKey *denom_key,
&denom_key->fee_refresh),
TALER_JSON_spec_amount_any ("fee_refund",
&denom_key->fee_refund),
- GNUNET_JSON_spec_rsa_public_key ("denom_pub",
- &denom_key->key.rsa_public_key),
+ TALER_JSON_spec_denomination_public_key ("denom_pub",
+ &denom_key->key),
GNUNET_JSON_spec_end ()
};
@@ -359,8 +359,8 @@ parse_json_denomkey (struct TALER_EXCHANGE_DenomPublicKey *denom_key,
return GNUNET_SYSERR;
}
- GNUNET_CRYPTO_rsa_public_key_hash (denom_key->key.rsa_public_key,
- &denom_key->h_key);
+ TALER_denom_pub_hash (&denom_key->key,
+ &denom_key->h_key);
if (NULL != hash_context)
GNUNET_CRYPTO_hash_context_read (hash_context,
&denom_key->h_key,
@@ -480,7 +480,7 @@ parse_json_auditor (struct TALER_EXCHANGE_AuditorInformation *auditor,
{
GNUNET_log (GNUNET_ERROR_TYPE_INFO,
"Auditor signed denomination %s, which we do not know. Ignoring signature.\n",
- GNUNET_h2s (&denom_h));
+ GNUNET_h2s (&denom_h.hash));
continue;
}
if (check_sigs)
@@ -626,36 +626,28 @@ update_auditors (struct TALER_EXCHANGE_Handle *exchange)
* the same object), 1 otherwise.
*/
static unsigned int
-denoms_cmp (struct TALER_EXCHANGE_DenomPublicKey *denom1,
- struct TALER_EXCHANGE_DenomPublicKey *denom2)
+denoms_cmp (const struct TALER_EXCHANGE_DenomPublicKey *denom1,
+ const struct TALER_EXCHANGE_DenomPublicKey *denom2)
{
- struct GNUNET_CRYPTO_RsaPublicKey *tmp1;
- struct GNUNET_CRYPTO_RsaPublicKey *tmp2;
- int r1;
- int r2;
- int ret;
-
- /* First check if pub is the same. */
- if (0 != GNUNET_CRYPTO_rsa_public_key_cmp
- (denom1->key.rsa_public_key,
- denom2->key.rsa_public_key))
- return 1;
+ struct TALER_EXCHANGE_DenomPublicKey tmp1;
+ struct TALER_EXCHANGE_DenomPublicKey tmp2;
- tmp1 = denom1->key.rsa_public_key;
- tmp2 = denom2->key.rsa_public_key;
- r1 = denom1->revoked;
- r2 = denom2->revoked;
-
- denom1->key.rsa_public_key = NULL;
- denom2->key.rsa_public_key = NULL;
- /* Then proceed with the rest of the object. */
- ret = GNUNET_memcmp (denom1,
- denom2);
- denom1->revoked = r1;
- denom2->revoked = r2;
- denom1->key.rsa_public_key = tmp1;
- denom2->key.rsa_public_key = tmp2;
- return ret;
+ if (0 !=
+ TALER_denom_pub_cmp (&denom1->key,
+ &denom2->key))
+ return 1;
+ tmp1 = *denom1;
+ tmp2 = *denom2;
+ tmp1.revoked = false;
+ tmp2.revoked = false;
+ memset (&tmp1.key,
+ 0,
+ sizeof (tmp1.key));
+ memset (&tmp2.key,
+ 0,
+ sizeof (tmp2.key));
+ return GNUNET_memcmp (&tmp1,
+ &tmp2);
}
@@ -844,7 +836,7 @@ decode_keys_json (const json_t *resp_obj,
{
/* 0:0:0 did not support /keys cherry picking */
TALER_LOG_DEBUG ("Skipping denomination key: already know it\n");
- GNUNET_CRYPTO_rsa_public_key_free (dk.key.rsa_public_key);
+ TALER_denom_pub_free (&dk.key);
continue;
}
if (key_data->denom_keys_size == key_data->num_denom_keys)
@@ -951,7 +943,7 @@ decode_keys_json (const json_t *resp_obj,
EXITIF (JSON_ARRAY != json_typeof (recoup_array));
json_array_foreach (recoup_array, index, recoup_info) {
- struct GNUNET_HashCode h_denom_pub;
+ struct TALER_DenominationHash h_denom_pub;
struct GNUNET_JSON_Specification spec[] = {
GNUNET_JSON_spec_fixed_auto ("h_denom_pub",
&h_denom_pub),
@@ -1019,8 +1011,7 @@ free_key_data (struct TALER_EXCHANGE_Keys *key_data)
key_data->num_sign_keys,
0);
for (unsigned int i = 0; i<key_data->num_denom_keys; i++)
- GNUNET_CRYPTO_rsa_public_key_free (
- key_data->denom_keys[i].key.rsa_public_key);
+ TALER_denom_pub_free (&key_data->denom_keys[i].key);
GNUNET_array_grow (key_data->denom_keys,
key_data->denom_keys_size,
@@ -1167,9 +1158,8 @@ keys_completed_cb (void *cls,
TALER_EXCHANGE_DenomPublicKey));
for (unsigned int i = 0; i<kd_old.num_denom_keys; i++)
- kd.denom_keys[i].key.rsa_public_key
- = GNUNET_CRYPTO_rsa_public_key_dup (
- kd_old.denom_keys[i].key.rsa_public_key);
+ TALER_denom_pub_deep_copy (&kd.denom_keys[i].key,
+ &kd_old.denom_keys[i].key);
kd.num_auditors = kd_old.num_auditors;
kd.auditors = GNUNET_new_array (kd.num_auditors,
@@ -1216,7 +1206,7 @@ keys_completed_cb (void *cls,
kd.auditors = NULL;
kd.num_auditors = 0;
for (unsigned int i = 0; i<kd_old.num_denom_keys; i++)
- GNUNET_CRYPTO_rsa_public_key_free (kd.denom_keys[i].key.rsa_public_key);
+ TALER_denom_pub_free (&kd.denom_keys[i].key);
GNUNET_array_grow (kd.denom_keys,
kd.denom_keys_size,
0);
@@ -2060,9 +2050,9 @@ TALER_EXCHANGE_get_denomination_key (
const struct TALER_DenominationPublicKey *pk)
{
for (unsigned int i = 0; i<keys->num_denom_keys; i++)
- if (0 == GNUNET_CRYPTO_rsa_public_key_cmp (pk->rsa_public_key,
- keys->denom_keys[i].key.
- rsa_public_key))
+ if (0 ==
+ TALER_denom_pub_cmp (pk,
+ &keys->denom_keys[i].key))
return &keys->denom_keys[i];
return NULL;
}
@@ -2082,9 +2072,8 @@ TALER_EXCHANGE_copy_denomination_key (
copy = GNUNET_new (struct TALER_EXCHANGE_DenomPublicKey);
*copy = *key;
- copy->key.rsa_public_key = GNUNET_CRYPTO_rsa_public_key_dup (
- key->key.rsa_public_key);
-
+ TALER_denom_pub_deep_copy (&copy->key,
+ &key->key);
return copy;
}
@@ -2099,7 +2088,7 @@ void
TALER_EXCHANGE_destroy_denomination_key (
struct TALER_EXCHANGE_DenomPublicKey *key)
{
- GNUNET_CRYPTO_rsa_public_key_free (key->key.rsa_public_key);;
+ TALER_denom_pub_free (&key->key);
GNUNET_free (key);
}
diff --git a/src/util/denom.c b/src/util/denom.c
index 694f5ff88..5ea4aca29 100644
--- a/src/util/denom.c
+++ b/src/util/denom.c
@@ -169,4 +169,58 @@ TALER_denom_sig_free (struct TALER_DenominationSignature *denom_sig)
}
+/**
+ * Make a (deep) copy of the given @a denom_src to
+ * @a denom_dst.
+ *
+ * @param[out] denom_dst target to copy to
+ * @param denom_str public key to copy
+ */
+void
+TALER_denom_pub_deep_copy (struct TALER_DenominationPublicKey *denom_dst,
+ const struct TALER_DenominationPublicKey *denom_src)
+{
+ *denom_dst = *denom_src; /* shallow copy */
+ switch (denom_src->cipher)
+ {
+ case TALER_DENOMINATION_RSA:
+ denom_dst->details.rsa_public_key
+ = GNUNET_CRYPTO_rsa_public_key_dup (
+ denom_src->details.rsa_public_key);
+ return;
+ // TODO: add case for Clause-Schnorr
+ default:
+ GNUNET_assert (0);
+ }
+}
+
+
+/**
+ * Compare two denomination public keys.
+ *
+ * @param denom1 first key
+ * @param denom2 second key
+ * @return 0 if the keys are equal, otherwise -1 or 1
+ */
+int
+TALER_denom_pub_cmp (const struct TALER_DenominationPublicKey *denom1,
+ const struct TALER_DenominationPublicKey *denom2)
+{
+ if (denom1->cipher != denom2->cipher)
+ return (denom1->cipher > denom2->cipher) ? 1 : -1;
+ if (denom1->age_mask != denom2->age_mask)
+ return (denom1->age_mask > denom2->age_mask) ? 1 : -1;
+ switch (denom1->cipher)
+ {
+ case TALER_DENOMINATION_RSA:
+ return GNUNET_CRYPTO_rsa_public_key_cmp (denom1->details.rsa_public_key,
+ denom2->details.rsa_public_key);
+ // TODO: add case for Clause-Schnorr
+ default:
+ GNUNET_assert (0);
+ }
+ return -2;
+}
+
+
/* end of denom.c */