[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[taler-donau] 01/02: [header] add amount header
From: |
gnunet |
Subject: |
[taler-donau] 01/02: [header] add amount header |
Date: |
Thu, 12 Oct 2023 12:12:32 +0200 |
This is an automated email from the git hooks/post-receive script.
lukas-matyja pushed a commit to branch master
in repository donau.
commit ec6c7eef965bc4e0e74952a12a818de93ec240af
Author: Matyja Lukas Adam <lukas.matyja@students.bfh.ch>
AuthorDate: Thu Oct 12 12:11:34 2023 +0200
[header] add amount header
---
src/include/.taler_crypto_lib.h.swp | Bin 0 -> 16384 bytes
src/include/taler_amount_lib.h | 456 ++++++++++++++++++++++++++++++++++++
src/include/taler_crypto_lib.h | 359 +---------------------------
src/include/taler_donau_service.h | 8 +-
src/include/taler_util.h | 96 +++++++-
5 files changed, 563 insertions(+), 356 deletions(-)
diff --git a/src/include/.taler_crypto_lib.h.swp
b/src/include/.taler_crypto_lib.h.swp
new file mode 100644
index 0000000..10e40b8
Binary files /dev/null and b/src/include/.taler_crypto_lib.h.swp differ
diff --git a/src/include/taler_amount_lib.h b/src/include/taler_amount_lib.h
new file mode 100644
index 0000000..c9a35a2
--- /dev/null
+++ b/src/include/taler_amount_lib.h
@@ -0,0 +1,456 @@
+/*
+ This file is part of TALER
+ Copyright (C) 2014, 2015, 2020 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
+ Foundation; either version 3, or (at your option) any later version.
+
+ TALER is distributed in the hope that it will be useful, but WITHOUT ANY
+ WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR
+ A PARTICULAR PURPOSE. See the GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License along with
+ TALER; see the file COPYING. If not, see <http://www.gnu.org/licenses/>
+*/
+/**
+ * @file include/taler_amount_lib.h
+ * @brief amount-representation utility functions
+ * @author Sree Harsha Totakura <sreeharsha@totakura.in>
+ */
+#if ! defined (__TALER_UTIL_LIB_H_INSIDE__)
+#error "Only <taler_util.h> can be included directly."
+#endif
+
+#ifndef TALER_AMOUNT_LIB_H
+#define TALER_AMOUNT_LIB_H
+
+#include <stdint.h>
+#include "gnunet/gnunet_common.h"
+
+#ifdef __cplusplus
+extern "C"
+{
+#if 0 /* keep Emacsens' auto-indent happy */
+}
+#endif
+#endif
+
+
+/**
+ * @brief Number of characters (plus 1 for 0-termination) we use to
+ * represent currency names (i.e. EUR, USD, etc.). We use 8+4 for
+ * alignment in the `struct TALER_Amount`. The amount is typically an
+ * ISO 4217 currency code when an alphanumeric 3-digit code is used.
+ * For regional currencies, the first character should be a "*" followed
+ * by a region-specific name (i.e. "*BRETAGNEFR").
+ */
+#define TALER_CURRENCY_LEN 12
+
+/**
+ * Taler currency length as a string.
+ */
+#define TALER_CURRENCY_LEN_STR "12"
+
+/**
+ * @brief The "fraction" value in a `struct TALER_Amount` represents which
+ * fraction of the "main" value?
+ *
+ * Note that we need sub-cent precision here as transaction fees might
+ * be that low, and as we want to support microdonations.
+ *
+ * An actual `struct Amount a` thus represents
+ * "a.value + (a.fraction / #TALER_AMOUNT_FRAC_BASE)" units of "a.currency".
+ */
+#define TALER_AMOUNT_FRAC_BASE 100000000
+
+/**
+ * @brief How many digits behind the comma are required to represent the
+ * fractional value in human readable decimal format? Must match
+ * lg(#TALER_AMOUNT_FRAC_BASE).
+ */
+#define TALER_AMOUNT_FRAC_LEN 8
+
+/**
+ * Maximum legal 'value' for an amount, based on IEEE double (for JavaScript
compatibility).
+ */
+#define TALER_AMOUNT_MAX_VALUE (1LLU << 52)
+
+
+GNUNET_NETWORK_STRUCT_BEGIN
+
+
+/**
+ * @brief Amount, encoded for network transmission.
+ */
+struct TALER_AmountNBO
+{
+ /**
+ * Value in the main currency, in NBO.
+ */
+ uint64_t value GNUNET_PACKED;
+
+ /**
+ * Fraction (integer multiples of #TALER_AMOUNT_FRAC_BASE), in NBO.
+ */
+ uint32_t fraction GNUNET_PACKED;
+
+ /**
+ * Type of the currency being represented.
+ */
+ char currency[TALER_CURRENCY_LEN];
+};
+
+GNUNET_NETWORK_STRUCT_END
+
+
+/**
+ * @brief Representation of monetary value in a given currency.
+ */
+struct TALER_Amount
+{
+ /**
+ * Value (numerator of fraction)
+ */
+ uint64_t value;
+
+ /**
+ * Fraction (integer multiples of #TALER_AMOUNT_FRAC_BASE).
+ */
+ uint32_t fraction;
+
+ /**
+ * Currency string, left adjusted and padded with zeros. All zeros
+ * for "invalid" values.
+ */
+ char currency[TALER_CURRENCY_LEN];
+};
+
+
+/**
+ * Parse monetary amount, in the format "T:V.F".
+ *
+ * @param str amount string
+ * @param[out] amount amount to write the result to
+ * @return #GNUNET_OK if the string is a valid monetary amount specification,
+ * #GNUNET_SYSERR if it is invalid.
+ */
+enum GNUNET_GenericReturnValue
+TALER_string_to_amount (const char *str,
+ struct TALER_Amount *amount);
+
+
+/**
+ * Parse monetary amount, in the format "T:V.F".
+ * The result is stored in network byte order (NBO).
+ *
+ * @param str amount string
+ * @param[out] amount_nbo amount to write the result to
+ * @return #GNUNET_OK if the string is a valid amount specification,
+ * #GNUNET_SYSERR if it is invalid.
+ */
+enum GNUNET_GenericReturnValue
+TALER_string_to_amount_nbo (const char *str,
+ struct TALER_AmountNBO *amount_nbo);
+
+
+/**
+ * Get the value of "zero" in a particular currency.
+ *
+ * @param cur currency description
+ * @param[out] amount amount to write the result to
+ * @return #GNUNET_OK if @a cur is a valid currency specification,
+ * #GNUNET_SYSERR if it is invalid.
+ */
+enum GNUNET_GenericReturnValue
+TALER_amount_set_zero (const char *cur,
+ struct TALER_Amount *amount);
+
+
+/**
+ * Test if the given @a amount is zero.
+ *
+ * @param amount amount to compare to zero
+ * @return true if the amount is zero,
+ * false if it is non-zero or invalid
+ */
+bool
+TALER_amount_is_zero (const struct TALER_Amount *amount);
+
+
+/**
+ * Test if the given amount is valid.
+ *
+ * @param amount amount to check
+ * @return #GNUNET_OK if @a amount is valid
+ */
+enum GNUNET_GenericReturnValue
+TALER_amount_is_valid (const struct TALER_Amount *amount);
+
+
+/**
+ * Test if the given amount is in the given currency
+ *
+ * @param amount amount to check
+ * @param currency currency to check for
+ * @return #GNUNET_OK if @a amount is in @a currency
+ */
+enum GNUNET_GenericReturnValue
+TALER_amount_is_currency (const struct TALER_Amount *amount,
+ const char *currency);
+
+
+/**
+ * Convert amount from host to network representation.
+ *
+ * @param[out] res where to store amount in network representation
+ * @param d amount in host representation
+ */
+void
+TALER_amount_hton (struct TALER_AmountNBO *res,
+ const struct TALER_Amount *d);
+
+
+/**
+ * Convert amount from network to host representation.
+ *
+ * @param[out] res where to store amount in host representation
+ * @param dn amount in network representation
+ */
+void
+TALER_amount_ntoh (struct TALER_Amount *res,
+ const struct TALER_AmountNBO *dn);
+
+
+/**
+ * Compare the value/fraction of two amounts. Does not compare the currency.
+ * Comparing amounts of different currencies will cause the program to abort().
+ * If unsure, check with #TALER_amount_cmp_currency() first to be sure that
+ * the currencies of the two amounts are identical.
+ *
+ * @param a1 first amount
+ * @param a2 second amount
+ * @return result of the comparison
+ * -1 if `a1 < a2`
+ * 1 if `a1 > a2`
+ * 0 if `a1 == a2`.
+ */
+int
+TALER_amount_cmp (const struct TALER_Amount *a1,
+ const struct TALER_Amount *a2);
+
+
+/**
+ * Compare the value/fraction of two amounts. Does not compare the currency.
+ * Comparing amounts of different currencies will cause the program to abort().
+ * If unsure, check with #TALER_amount_cmp_currency() first to be sure that
+ * the currencies of the two amounts are identical. NBO variant.
+ *
+ * @param a1 first amount
+ * @param a2 second amount
+ * @return result of the comparison
+ * -1 if `a1 < a2`
+ * 1 if `a1 > a2`
+ * 0 if `a1 == a2`.
+ */
+int
+TALER_amount_cmp_nbo (const struct TALER_AmountNBO *a1,
+ const struct TALER_AmountNBO *a2);
+
+
+/**
+ * Test if @a a1 and @a a2 are the same currency.
+ *
+ * @param a1 amount to test
+ * @param a2 amount to test
+ * @return #GNUNET_YES if @a a1 and @a a2 are the same currency
+ * #GNUNET_NO if the currencies are different
+ * #GNUNET_SYSERR if either amount is invalid
+ */
+enum GNUNET_GenericReturnValue
+TALER_amount_cmp_currency (const struct TALER_Amount *a1,
+ const struct TALER_Amount *a2);
+
+
+/**
+ * Test if @a a1 and @a a2 are the same currency, NBO variant.
+ *
+ * @param a1 amount to test
+ * @param a2 amount to test
+ * @return #GNUNET_YES if @a a1 and @a a2 are the same currency
+ * #GNUNET_NO if the currencies are different
+ * #GNUNET_SYSERR if either amount is invalid
+ */
+enum GNUNET_GenericReturnValue
+TALER_amount_cmp_currency_nbo (const struct TALER_AmountNBO *a1,
+ const struct TALER_AmountNBO *a2);
+
+
+/**
+ * Possible results from calling #TALER_amount_subtract() and
+ * possibly other arithmetic operations. Negative values
+ * indicate that the operation did not generate a result.
+ */
+enum TALER_AmountArithmeticResult
+{
+
+ /**
+ * Operation succeeded, result is positive.
+ */
+ TALER_AAR_RESULT_POSITIVE = 1,
+
+ /**
+ * Operation succeeded, result is exactly zero.
+ */
+ TALER_AAR_RESULT_ZERO = 0,
+
+ /**
+ * Operation failed, the result would have been negative.
+ */
+ TALER_AAR_INVALID_NEGATIVE_RESULT = -1,
+
+ /**
+ * Operation failed, result outside of the representable range.
+ */
+ TALER_AAR_INVALID_RESULT_OVERFLOW = -2,
+
+ /**
+ * Operation failed, inputs could not be normalized.
+ */
+ TALER_AAR_INVALID_NORMALIZATION_FAILED = -3,
+
+ /**
+ * Operation failed, input currencies were not identical.
+ */
+ TALER_AAR_INVALID_CURRENCIES_INCOMPATIBLE = -4
+
+};
+
+/**
+ * Perform saturating subtraction of amounts.
+ *
+ * @param[out] diff where to store (@a a1 - @a a2), or invalid if @a a2 > @a a1
+ * @param a1 amount to subtract from
+ * @param a2 amount to subtract
+ * @return operation status, negative on failures
+ */
+enum TALER_AmountArithmeticResult
+TALER_amount_subtract (struct TALER_Amount *diff,
+ const struct TALER_Amount *a1,
+ const struct TALER_Amount *a2);
+
+
+/**
+ * Perform addition of amounts.
+ *
+ * @param[out] sum where to store @a a1 + @a a2, set to "invalid" on overflow
+ * @param a1 first amount to add
+ * @param a2 second amount to add
+ * @return operation status, negative on failures
+ */
+enum TALER_AmountArithmeticResult
+TALER_amount_add (struct TALER_Amount *sum,
+ const struct TALER_Amount *a1,
+ const struct TALER_Amount *a2);
+
+
+/**
+ * Divide an amount by a @ divisor. Note that this function
+ * may introduce a rounding error!
+ *
+ * @param[out] result where to store @a dividend / @a divisor
+ * @param dividend amount to divide
+ * @param divisor by what to divide, must be positive
+ */
+void
+TALER_amount_divide (struct TALER_Amount *result,
+ const struct TALER_Amount *dividend,
+ uint32_t divisor);
+
+/**
+ * Divide one amount by another. Note that this function
+ * may introduce a rounding error. It rounds down.
+ *
+ * @param dividend amount to divide
+ * @param divisor by what to divide, must be positive
+ * @return @a dividend / @a divisor, rounded down. -1 on currency mismatch,
+ * INT_MAX for division by zero
+ */
+int
+TALER_amount_divide2 (const struct TALER_Amount *dividend,
+ const struct TALER_Amount *divisor);
+
+
+/**
+ * Multiply an @a amount by a @ factor.
+ *
+ * @param[out] result where to store @a amount * @a factor
+ * @param amount amount to multiply
+ * @param factor factor by which to multiply
+ */
+enum TALER_AmountArithmeticResult
+TALER_amount_multiply (struct TALER_Amount *result,
+ const struct TALER_Amount *amount,
+ uint32_t factor);
+
+
+/**
+ * Normalize the given amount.
+ *
+ * @param[in,out] amount amount to normalize
+ * @return #GNUNET_OK if normalization worked
+ * #GNUNET_NO if value was already normalized
+ * #GNUNET_SYSERR if value was invalid or could not be normalized
+ */
+enum GNUNET_GenericReturnValue
+TALER_amount_normalize (struct TALER_Amount *amount);
+
+
+/**
+ * Convert amount to string.
+ *
+ * @param amount amount to convert to string
+ * @return freshly allocated string representation,
+ * NULL if the @a amount was invalid
+ */
+char *
+TALER_amount_to_string (const struct TALER_Amount *amount);
+
+
+/**
+ * Convert amount to string.
+ *
+ * @param amount amount to convert to string
+ * @return statically allocated buffer with string representation,
+ * NULL if the @a amount was invalid
+ */
+const char *
+TALER_amount2s (const struct TALER_Amount *amount);
+
+
+/**
+ * Round the amount to something that can be transferred on the wire.
+ * The rounding mode is specified via the smallest transferable unit,
+ * which must only have a fractional part *or* only a value (either
+ * of the two must be zero!).
+ *
+ * @param[in,out] amount amount to round down
+ * @param[in] round_unit unit that should be rounded down to, and
+ * either value part or the faction must be zero (but not both)
+ * @return #GNUNET_OK on success, #GNUNET_NO if rounding was unnecessary,
+ * #GNUNET_SYSERR if the amount or currency or @a round_unit was
invalid
+ */
+enum GNUNET_GenericReturnValue
+TALER_amount_round_down (struct TALER_Amount *amount,
+ const struct TALER_Amount *round_unit);
+
+
+#if 0 /* keep Emacsens' auto-indent happy */
+{
+#endif
+#ifdef __cplusplus
+}
+#endif
+
+
+#endif
diff --git a/src/include/taler_crypto_lib.h b/src/include/taler_crypto_lib.h
index bc6ab67..f979fe0 100644
--- a/src/include/taler_crypto_lib.h
+++ b/src/include/taler_crypto_lib.h
@@ -1,6 +1,6 @@
/*
This file is part of TALER
- Copyright (C) 2014-2023 Taler Systems SA
+ Copyright (C) 2023 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
@@ -34,21 +34,9 @@
/**
- * Maximum number of coins we allow per operation.
+ * Maximum number of donation units we allow per operation.
*/
-#define TALER_MAX_FRESH_COINS 256
-
-/**
- * Cut-and-choose size for refreshing. Client looses the gamble (of
- * unaccountable transfers) with probability 1/TALER_CNC_KAPPA. Refresh cost
- * increases linearly with TALER_CNC_KAPPA, and 3 is sufficient up to a
- * income/sales tax of 66% of total transaction value. As there is
- * no good reason to change this security parameter, we declare it
- * fixed and part of the protocol.
- */
-#define TALER_CNC_KAPPA 3
-#define TALER_CNC_KAPPA_MINUS_ONE_STR "2"
-
+#define TALER_MAX_FRESH_DONATION_UNITS 256
/* ****************** Coin crypto primitives ************* */
@@ -148,18 +136,6 @@ struct TALER_ReserveSignatureP
};
-/**
- * (Symmetric) key used to encrypt KYC attribute data in the database.
- */
-struct TALER_AttributeKeyP
-{
- /**
- * Actual key material.
- */
- struct GNUNET_HashCode key;
-};
-
-
/**
* @brief Type of public keys to for charity authorizations.
* Charities can issue refunds using the corresponding
@@ -400,55 +376,6 @@ struct TALER_CoinSpendSignatureP
};
-/**
- * @brief Type of private keys for age commitment in coins.
- */
-struct TALER_AgeCommitmentPrivateKeyP
-{
-#ifdef AGE_RESTRICTION_WITH_ECDSA
- /**
- * Taler uses EcDSA for coins when signing age verification attestation.
- */
- struct GNUNET_CRYPTO_EcdsaPrivateKey priv;
-#else
- /**
- * Taler uses Edx25519 for coins when signing age verification attestation.
- */
- struct GNUNET_CRYPTO_Edx25519PrivateKey priv;
-#endif
-};
-
-
-/**
- * @brief Type of public keys for age commitment in coins.
- */
-struct TALER_AgeCommitmentPublicKeyP
-{
-#ifdef AGE_RESTRICTION_WITH_ECDSA
- /**
- * Taler uses EcDSA for coins when signing age verification attestation.
- */
- struct GNUNET_CRYPTO_EcdsaPublicKey pub;
-#else
- /**
- * Taler uses Edx25519 for coins when signing age verification attestation.
- */
- struct GNUNET_CRYPTO_Edx25519PublicKey pub;
-#endif
-};
-
-
-/*
- * @brief Hash to represent the commitment to n*kappa blinded keys during a
- * age-withdrawal. It is the running SHA512 hash over the hashes of the blinded
- * envelopes of n*kappa coins.
- */
-struct TALER_AgeWithdrawCommitmentHashP
-{
- struct GNUNET_HashCode hash;
-};
-
-
/**
* @brief Type of online public keys used by the wallet to establish a purse
and the associated contract meta data.
*/
@@ -851,103 +778,6 @@ struct TALER_PickupIdentifierP
struct GNUNET_HashCode hash;
};
-
-/**
- * @brief Salted hash over the JSON object representing the manifests of
- * extensions.
- */
-struct TALER_ExtensionManifestsHashP
-{
- /**
- * Actual hash value.
- */
- struct GNUNET_HashCode hash;
-};
-
-
-/**
- * Set of the fees applying to a denomination.
- */
-struct TALER_DenomFeeSetNBOP
-{
-
- /**
- * The fee the donau charges when a coin of this type is withdrawn.
- * (can be zero).
- */
- struct TALER_AmountNBO withdraw;
-
- /**
- * The fee the donau charges when a coin of this type is deposited.
- * (can be zero).
- */
- struct TALER_AmountNBO deposit;
-
- /**
- * The fee the donau charges when a coin of this type is refreshed.
- * (can be zero).
- */
- struct TALER_AmountNBO refresh;
-
- /**
- * The fee the donau charges when a coin of this type is refunded.
- * (can be zero). Note that refund fees are charged to the donor;
- * if a refund is given, the deposit fee is also refunded.
- */
- struct TALER_AmountNBO refund;
-
-};
-
-
-/**
- * Set of the fees applying for a given
- * time-range and wire method.
- */
-struct TALER_WireFeeSetNBOP
-{
-
- /**
- * The fee the donau charges for wiring funds
- * to a charity.
- */
- struct TALER_AmountNBO wire;
-
- /**
- * The fee the donau charges for closing a reserve
- * and wiring the funds back to the origin account.
- */
- struct TALER_AmountNBO closing;
-
-};
-
-
-/**
- * Set of the fees applying globally for a given
- * time-range.
- */
-struct TALER_GlobalFeeSetNBOP
-{
-
- /**
- * The fee the donau charges for returning the history of a reserve or
- * account.
- */
- struct TALER_AmountNBO history;
-
- /**
- * The fee the donau charges for keeping an account or reserve open for a
- * year.
- */
- struct TALER_AmountNBO account;
-
- /**
- * The fee the donau charges if a purse is abandoned and this was not
- * covered by the account limit.
- */
- struct TALER_AmountNBO purse;
-};
-
-
GNUNET_NETWORK_STRUCT_END
@@ -966,179 +796,6 @@ TALER_build_pos_confirmation (const char *pos_key,
const struct TALER_Amount *total,
struct GNUNET_TIME_Timestamp ts);
-
-/**
- * Set of the fees applying to a denomination.
- */
-struct TALER_DenomFeeSet
-{
-
- /**
- * The fee the donau charges when a coin of this type is withdrawn.
- * (can be zero).
- */
- struct TALER_Amount withdraw;
-
- /**
- * The fee the donau charges when a coin of this type is deposited.
- * (can be zero).
- */
- struct TALER_Amount deposit;
-
- /**
- * The fee the donau charges when a coin of this type is refreshed.
- * (can be zero).
- */
- struct TALER_Amount refresh;
-
- /**
- * The fee the donau charges when a coin of this type is refunded.
- * (can be zero). Note that refund fees are charged to the donor;
- * if a refund is given, the deposit fee is also refunded.
- */
- struct TALER_Amount refund;
-
-};
-
-
-/**
- * Set of the fees applying for a given time-range and wire method.
- */
-struct TALER_WireFeeSet
-{
-
- /**
- * The fee the donau charges for wiring funds to a charity.
- */
- struct TALER_Amount wire;
-
- /**
- * The fee the donau charges for closing a reserve
- * and wiring the funds back to the origin account.
- */
- struct TALER_Amount closing;
-
-};
-
-
-/**
- * Set of the fees applying globally for a given
- * time-range.
- */
-struct TALER_GlobalFeeSet
-{
-
- /**
- * The fee the donau charges for returning the
- * history of a reserve or account.
- */
- struct TALER_Amount history;
-
- /**
- * The fee the donau charges for keeping
- * an account or reserve open for a year.
- */
- struct TALER_Amount account;
-
- /**
- * The fee the donau charges if a purse
- * is abandoned and this was not covered by
- * the account limit.
- */
- struct TALER_Amount purse;
-};
-
-
-/**
- * Convert fee set from host to network byte order.
- *
- * @param[out] nbo where to write the result
- * @param fees fee set to convert
- */
-void
-TALER_denom_fee_set_hton (struct TALER_DenomFeeSetNBOP *nbo,
- const struct TALER_DenomFeeSet *fees);
-
-
-/**
- * Convert fee set from network to host network byte order.
- *
- * @param[out] fees where to write the result
- * @param nbo fee set to convert
- */
-void
-TALER_denom_fee_set_ntoh (struct TALER_DenomFeeSet *fees,
- const struct TALER_DenomFeeSetNBOP *nbo);
-
-
-/**
- * Convert global fee set from host to network byte order.
- *
- * @param[out] nbo where to write the result
- * @param fees fee set to convert
- */
-void
-TALER_global_fee_set_hton (struct TALER_GlobalFeeSetNBOP *nbo,
- const struct TALER_GlobalFeeSet *fees);
-
-
-/**
- * Convert global fee set from network to host network byte order.
- *
- * @param[out] fees where to write the result
- * @param nbo fee set to convert
- */
-void
-TALER_global_fee_set_ntoh (struct TALER_GlobalFeeSet *fees,
- const struct TALER_GlobalFeeSetNBOP *nbo);
-
-
-/**
- * Compare global fee sets.
- *
- * @param f1 first set to compare
- * @param f2 second set to compare
- * @return 0 if sets are equal
- */
-int
-TALER_global_fee_set_cmp (const struct TALER_GlobalFeeSet *f1,
- const struct TALER_GlobalFeeSet *f2);
-
-
-/**
- * Convert wire fee set from host to network byte order.
- *
- * @param[out] nbo where to write the result
- * @param fees fee set to convert
- */
-void
-TALER_wire_fee_set_hton (struct TALER_WireFeeSetNBOP *nbo,
- const struct TALER_WireFeeSet *fees);
-
-
-/**
- * Convert wire fee set from network to host network byte order.
- *
- * @param[out] fees where to write the result
- * @param nbo fee set to convert
- */
-void
-TALER_wire_fee_set_ntoh (struct TALER_WireFeeSet *fees,
- const struct TALER_WireFeeSetNBOP *nbo);
-
-
-/**
- * Compare wire fee sets.
- *
- * @param f1 first set to compare
- * @param f2 second set to compare
- * @return 0 if sets are equal
- */
-int
-TALER_wire_fee_set_cmp (const struct TALER_WireFeeSet *f1,
- const struct TALER_WireFeeSet *f2);
-
-
/**
* Hash @a rsa.
*
@@ -1151,7 +808,7 @@ TALER_rsa_pub_hash (const struct
GNUNET_CRYPTO_RsaPublicKey *rsa,
/**
* Hash @a cs.
- *
+ *DENOMINATION
* @param cs key to hash
* @param[out] h_cs where to write the result
*/
@@ -1163,23 +820,23 @@ TALER_cs_pub_hash (const struct
GNUNET_CRYPTO_CsPublicKey *cs,
/**
* Types of public keys used for denominations in Taler.
*/
-enum TALER_DenominationCipher
+enum TALER_DonationUnitCipher
{
/**
* Invalid type of signature.
*/
- TALER_DENOMINATION_INVALID = 0,
+ TALER_DONATION_UNIT_INVALID = 0,
/**
* RSA blind signature.
*/
- TALER_DENOMINATION_RSA = 1,
+ TALER_DONATION_UNIT_RSA = 1,
/**
* Clause Blind Schnorr signature.
*/
- TALER_DENOMINATION_CS = 2
+ TALER_DONATION_UNIT_CS = 2
};
diff --git a/src/include/taler_donau_service.h
b/src/include/taler_donau_service.h
index 9238447..71d3a87 100644
--- a/src/include/taler_donau_service.h
+++ b/src/include/taler_donau_service.h
@@ -73,7 +73,7 @@ struct TALER_DonationUnitPublicKey
/**
* Type of the public key (RSA or CS).
*/
- enum TALER_DenominationCipher cipher;
+ enum TALER_DonationUnitCipher cipher;
/**
* Details, depending on @e cipher.
@@ -81,14 +81,14 @@ struct TALER_DonationUnitPublicKey
union
{
/**
- * If we use #TALER_DENOMINATION_CS in @a cipher.
+ * If we use #TALER_DONATION_UNIT_CS in @a cipher.
*/
struct GNUNET_CRYPTO_CsPublicKey cs_public_key;
/**
- * If we use #TALER_DENOMINATION_RSA in @a cipher.
+ * If we use #TALER_DONATION_UNIT_RSA in @a cipher.
*/
- struct GNUNET_CRYPTO_RsaPublicKey *rsa_public_key;
+ struct GNUNET_CRYPTO_RsaPublicKey rsa_public_key;
} details;
};
diff --git a/src/include/taler_util.h b/src/include/taler_util.h
index c82d449..f2851b3 100644
--- a/src/include/taler_util.h
+++ b/src/include/taler_util.h
@@ -198,6 +198,100 @@ enum GNUNET_GenericReturnValue
TALER_config_get_currency (const struct GNUNET_CONFIGURATION_Handle *cfg,
char **currency);
+/**
+ * Details about how to render a currency.
+ */
+struct TALER_CurrencySpecification
+{
+ /**
+ * Name of the currency.
+ */
+ char currency[TALER_CURRENCY_LEN];
+
+ /**
+ * Human-readable long name of the currency, e.g.
+ * "Japanese Yen".
+ */
+ char *name;
+
+ /**
+ * Character used to separate decimals. String as
+ * multi-byte sequences may be required (UTF-8!).
+ */
+ char *decimal_separator;
+
+ /**
+ * how many digits the user may enter at most after the @e decimal_separator
+ */
+ unsigned int num_fractional_input_digits;
+
+ /**
+ * how many digits we render in normal scale after the @e decimal_separator
+ */
+ unsigned int num_fractional_normal_digits;
+
+ /**
+ * how many digits we render in after the @e decimal_separator even if all
+ * remaining digits are zero.
+ */
+ unsigned int num_fractional_trailing_zero_digits;
+
+ /**
+ * True to put the currency symbol before the number,
+ * false to put the currency symbol after the number.
+ */
+ bool is_currency_name_leading;
+
+ /**
+ * Mapping of powers of 10 to alternative currency names or symbols.
+ * Keys are the decimal powers, values the currency symbol to use.
+ * Map MUST contain an entry for "0" to the default currency symbol.
+ */
+ json_t *map_alt_unit_names;
+
+};
+
+
+/**
+ * Parse information about supported currencies from
+ * our configuration.
+ *
+ * @param cfg configuration to parse
+ * @param[out] num_currencies set to number of enabled currencies, length of
@e cspecs
+ * @param[out] cspecs set to currency specification array
+ * @return #GNUNET_OK on success, #GNUNET_NO if zero
+ * currency specifications were enabled,
+ * #GNUNET_SYSERR if the configuration was malformed
+ */
+enum GNUNET_GenericReturnValue
+TALER_CONFIG_parse_currencies (const struct GNUNET_CONFIGURATION_Handle *cfg,
+ unsigned int *num_currencies,
+ struct TALER_CurrencySpecification **cspecs);
+
+
+/**
+ * Free @a cspecs array.
+ *
+ * @param num_currencies length of @a cspecs array
+ * @param[in] cspecs array to free
+ */
+void
+TALER_CONFIG_free_currencies (
+ unsigned int num_currencies,
+ struct TALER_CurrencySpecification cspecs[static num_currencies]);
+
+
+/**
+ * Convert a currency specification to the
+ * respective JSON object.
+ *
+ * @param cspec currency specification
+ * @return JSON object encoding @a cspec for `/config`.
+ */
+json_t *
+TALER_CONFIG_currency_specs_to_json (
+ const struct TALER_CurrencySpecification *cspec);
+
/**
* Allow user to specify an amount on the command line.
@@ -686,4 +780,4 @@ TALER_JSON_external_conversion_stop (
#undef __TALER_UTIL_LIB_H_INSIDE__
-#endif
+#endifTALER_CURRENCY_LEN
--
To stop receiving notification emails like this one, please contact
gnunet@gnunet.org.