diff options
Diffstat (limited to 'src')
| -rw-r--r-- | src/include/Makefile.am | 7 | ||||
| -rw-r--r-- | src/include/taler_amount_lib.h | 173 | ||||
| -rw-r--r-- | src/include/taler_crypto_lib.h | 208 | ||||
| -rw-r--r-- | src/include/taler_util.h | 341 | ||||
| -rw-r--r-- | src/mint/Makefile.am | 2 | ||||
| -rw-r--r-- | src/mint/mint_db.c | 3 | ||||
| -rw-r--r-- | src/pq/Makefile.am | 2 | ||||
| -rw-r--r-- | src/pq/db_pq.c | 2 | ||||
| -rw-r--r-- | src/pq/db_pq.h (renamed from src/include/taler_db_lib.h) | 0 | ||||
| -rw-r--r-- | src/util/amount.c | 5 | ||||
| -rw-r--r-- | src/util/crypto.c | 3 | ||||
| -rw-r--r-- | src/util/json.c | 4 | 
12 files changed, 401 insertions, 349 deletions
| diff --git a/src/include/Makefile.am b/src/include/Makefile.am index 70dee218..40382dcc 100644 --- a/src/include/Makefile.am +++ b/src/include/Makefile.am @@ -2,8 +2,9 @@ talerincludedir = $(includedir)/taler  talerinclude_HEADERS = \    platform.h \ -  taler_db_lib.h \ +  taler_amount_lib.h \ +  taler_crypto_lib.h \    taler_json_lib.h \ +  taler_util.h \    taler_mint_service.h \ -  taler_signatures.h \ -  taler_util.h +  taler_signatures.h diff --git a/src/include/taler_amount_lib.h b/src/include/taler_amount_lib.h new file mode 100644 index 00000000..50b34ff1 --- /dev/null +++ b/src/include/taler_amount_lib.h @@ -0,0 +1,173 @@ +/* +  This file is part of TALER +  (C) 2014, 2015 Christian Grothoff (and other contributing authors) + +  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, 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> + */ +#ifndef TALER_AMOUNT_LIB_H +#define TALER_AMOUNT_LIB_H + + +/** + * Number of characters (plus 1 for 0-termination) we use to + * represent currency names (i.e. EUR, USD, etc.).  We use + * 8 for alignment (!). + */ +#define TALER_CURRENCY_LEN 8 + + +GNUNET_NETWORK_STRUCT_BEGIN + + +/** + * Amount, encoded for network transmission. + */ +struct TALER_AmountNBO +{ +  /** +   * Value in the main currency, in NBO. +   */ +  uint32_t value; + +  /** +   * Additinal fractional value, in NBO. +   */ +  uint32_t fraction; + +  /** +   * Type of the currency being represented. +   */ +  char currency[TALER_CURRENCY_LEN]; +}; + +GNUNET_NETWORK_STRUCT_END + + +/** + * Representation of monetary value in a given currency. + */ +struct TALER_Amount +{ +  /** +   * Value (numerator of fraction) +   */ +  uint32_t value; + +  /** +   * Fraction (denominator of fraction) +   */ +  uint32_t fraction; + +  /** +   * Currency string, left adjusted and padded with zeros. +   */ +  char currency[TALER_CURRENCY_LEN]; +}; + + +/** + * Parse denomination description, in the format "T : V : F". + * + * @param str denomination description + * @param denom denomination to write the result to + * @return #GNUNET_OK if the string is a valid denomination specification, + *         #GNUNET_SYSERR if it is invalid. + */ +int +TALER_string_to_amount (const char *str, +                        struct TALER_Amount *denom); + + +/** + * Convert amount from host to network representation. + * + * @param d amount in host representation + * @return amount in network representation + */ +struct TALER_AmountNBO +TALER_amount_hton (struct TALER_Amount d); + + +/** + * Convert amount from network to host representation. + * + * @param d amount in network representation + * @return amount in host representation + */ +struct TALER_Amount +TALER_amount_ntoh (struct TALER_AmountNBO dn); + + +/** + * Compare the value/fraction of two amounts.  Does not compare the currency, + * i.e. comparing amounts with the same value and fraction but different + * currency would return 0. + * + * @param a1 first amount + * @param a2 second amount + * @return result of the comparison + */ +int +TALER_amount_cmp (struct TALER_Amount a1, +                  struct TALER_Amount a2); + + +/** + * Perform saturating subtraction of amounts. + * + * @param a1 amount to subtract from + * @param a2 amount to subtract + * @return (a1-a2) or 0 if a2>=a1 + */ +struct TALER_Amount +TALER_amount_subtract (struct TALER_Amount a1, +                       struct TALER_Amount a2); + + +/** + * Perform saturating addition of amounts + * + * @param a1 first amount to add + * @param a2 second amount to add + * @return sum of a1 and a2 + */ +struct TALER_Amount +TALER_amount_add (struct TALER_Amount a1, +                  struct TALER_Amount a2); + + +/** + * Normalize the given amount. + * + * @param amout amount to normalize + * @return normalized amount + */ +struct TALER_Amount +TALER_amount_normalize (struct TALER_Amount amount); + + +/** + * Convert amount to string. + * + * @param amount amount to convert to string + * @return freshly allocated string representation + */ +char * +TALER_amount_to_string (struct TALER_Amount amount); + + +#endif diff --git a/src/include/taler_crypto_lib.h b/src/include/taler_crypto_lib.h new file mode 100644 index 00000000..597c85cd --- /dev/null +++ b/src/include/taler_crypto_lib.h @@ -0,0 +1,208 @@ +/* +  This file is part of TALER +  (C) 2014, 2015 Christian Grothoff (and other contributing authors) + +  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, If not, see <http://www.gnu.org/licenses/> +*/ +/** + * @file include/taler_crypto_lib.h + * @brief taler-specific crypto functions + * @author Sree Harsha Totakura <sreeharsha@totakura.in> + */ +#ifndef TALER_CRYPTO_LIB_H +#define TALER_CRYPTO_LIB_H + +#include <gnunet/gnunet_util_lib.h> +#include <gcrypt.h> + + +/* ****************** Coin crypto primitives ************* */ + +/** + * Public information about a coin (including the public key + * of the coin, the denomination key and the signature with + * the denomination key). + */ +struct TALER_CoinPublicInfo +{ +  /** +   * The coin's public key. +   */ +  struct GNUNET_CRYPTO_EcdsaPublicKey coin_pub; + +  /** +   * Public key representing the denomination of the coin +   * that is being deposited. +   */ +  struct GNUNET_CRYPTO_rsa_PublicKey *denom_pub; + +  /** +   * (Unblinded) signature over @e coin_pub with @e denom_pub, +   * which demonstrates that the coin is valid. +   */ +  struct GNUNET_CRYPTO_rsa_Signature *denom_sig; +}; + + +/** + * Check if a coin is valid; that is, whether the denomination key exists, + * is not expired, and the signature is correct. + * + * @param coin_public_info the coin public info to check for validity + * @return #GNUNET_YES if the coin is valid, + *         #GNUNET_NO if it is invalid + *         #GNUNET_SYSERROR if an internal error occured + */ +int +TALER_test_coin_valid (const struct TALER_CoinPublicInfo *coin_public_info); + + +/* ****************** Refresh crypto primitives ************* */ + +/** + * Secret used to decrypt the key to decrypt link secrets. + */ +struct TALER_TransferSecret +{ +  /** +   * Secret used to encrypt/decrypt the `struct TALER_LinkSecret`. +   * Must be (currently) a hash as this is what +   * #GNUNET_CRYPTO_ecc_ecdh() returns to us. +   */ +  struct GNUNET_HashCode key; +}; + + +/** + * Secret used to decrypt refresh links. + */ +struct TALER_LinkSecret +{ +  /** +   * Secret used to decrypt the refresh link data. +   */ +  char key[sizeof (struct GNUNET_HashCode)]; +}; + + +/** + * Encrypted secret used to decrypt refresh links. + */ +struct TALER_EncryptedLinkSecret +{ +  /** +   * Encrypted secret, must be the given size! +   */ +  char enc[sizeof (struct TALER_LinkSecret)]; +}; + + +/** + * Representation of an encrypted refresh link. + */ +struct TALER_RefreshLinkEncrypted +{ + +  /** +   * Encrypted blinding key with @e blinding_key_enc_size bytes, +   * must be allocated at the end of this struct. +   */ +  const char *blinding_key_enc; + +  /** +   * Number of bytes in @e blinding_key_enc. +   */ +  size_t blinding_key_enc_size; + +  /** +   * Encrypted private key of the coin. +   */ +  char coin_priv_enc[sizeof (struct GNUNET_CRYPTO_EcdsaPrivateKey)]; + +}; + + +/** + * Representation of an refresh link in cleartext. + */ +struct TALER_RefreshLinkDecrypted +{ + +  /** +   * Private key of the coin. +   */ +  struct GNUNET_CRYPTO_EcdsaPrivateKey coin_priv; + +  /** +   * Blinding key with @e blinding_key_enc_size bytes. +   */ +  struct GNUNET_CRYPTO_rsa_BlindingKey *blinding_key; + +}; + + +/** + * Use the @a trans_sec (from ECDHE) to decrypt the @a secret_enc + * to obtain the @a secret to decrypt the linkage data. + * + * @param secret_enc encrypted secret + * @param trans_sec transfer secret + * @param secret shared secret for refresh link decryption + * @return #GNUNET_OK on success + */ +int +TALER_transfer_decrypt (const struct TALER_EncryptedLinkSecret *secret_enc, +                        const struct TALER_TransferSecret *trans_sec, +                        struct TALER_LinkSecret *secret); + + +/** + * Use the @a trans_sec (from ECDHE) to encrypt the @a secret + * to obtain the @a secret_enc. + * + * @param secret shared secret for refresh link decryption + * @param trans_sec transfer secret + * @param secret_enc[out] encrypted secret + * @return #GNUNET_OK on success + */ +int +TALER_transfer_encrypt (const struct TALER_LinkSecret *secret, +                        const struct TALER_TransferSecret *trans_sec, +                        struct TALER_EncryptedLinkSecret *secret_enc); + + +/** + * Decrypt refresh link information. + * + * @param input encrypted refresh link data + * @param secret shared secret to use for decryption + * @return NULL on error + */ +struct TALER_RefreshLinkDecrypted * +TALER_refresh_decrypt (const struct TALER_RefreshLinkEncrypted *input, +                       const struct TALER_LinkSecret *secret); + + +/** + * Encrypt refresh link information. + * + * @param input plaintext refresh link data + * @param secret shared secret to use for encryption + * @return NULL on error (should never happen) + */ +struct TALER_RefreshLinkEncrypted * +TALER_refresh_encrypt (const struct TALER_RefreshLinkDecrypted *input, +                       const struct TALER_LinkSecret *secret); + + + +#endif diff --git a/src/include/taler_util.h b/src/include/taler_util.h index 00f13928..f2f31972 100644 --- a/src/include/taler_util.h +++ b/src/include/taler_util.h @@ -18,11 +18,15 @@   * @brief Interface for common utility functions   * @author Sree Harsha Totakura <sreeharsha@totakura.in>   */ -#ifndef TALER_UTIL_H_ -#define TALER_UTIL_H_ +#ifndef TALER_UTIL_H +#define TALER_UTIL_H  #include <gnunet/gnunet_util_lib.h> -#include <gcrypt.h> +#include "taler_amount_lib.h" +#include "taler_crypto_lib.h" +#include "taler_json_lib.h" + +  /* Define logging functions */  #define LOG_DEBUG(...)                                  \ @@ -50,7 +54,6 @@    } while(0) -  /**   * Log an error message at log-level 'level' that indicates   * a failure of the command 'cmd' with the message given @@ -63,7 +66,6 @@    do {int rc; rc = cmd; if (!rc) break; LOG_ERROR("A Gcrypt call failed at %s:%d with error: %s\n", __FILE__, __LINE__, gcry_strerror(rc)); abort(); } while (0) -  /**   * Initialize Gcrypt library.   */ @@ -83,333 +85,4 @@ TALER_config_load (const char *base_dir); -/* *********************** Amount management ****************** */ - - -/** - * Number of characters (plus 1 for 0-termination) we use to - * represent currency names (i.e. EUR, USD, etc.).  We use - * 8 for alignment (!). - */ -#define TALER_CURRENCY_LEN 8 - - -GNUNET_NETWORK_STRUCT_BEGIN - -/** - * Amount, encoded for network transmission. - */ -struct TALER_AmountNBO -{ -  /** -   * Value in the main currency, in NBO. -   */ -  uint32_t value; - -  /** -   * Additinal fractional value, in NBO. -   */ -  uint32_t fraction; - -  /** -   * Type of the currency being represented. -   */ -  char currency[TALER_CURRENCY_LEN]; -}; - -GNUNET_NETWORK_STRUCT_END - - -/** - * Representation of monetary value in a given currency. - */ -struct TALER_Amount -{ -  /** -   * Value (numerator of fraction) -   */ -  uint32_t value; - -  /** -   * Fraction (denominator of fraction) -   */ -  uint32_t fraction; - -  /** -   * Currency string, left adjusted and padded with zeros. -   */ -  char currency[TALER_CURRENCY_LEN]; -}; - - -/** - * Parse denomination description, in the format "T : V : F". - * - * @param str denomination description - * @param denom denomination to write the result to - * @return #GNUNET_OK if the string is a valid denomination specification, - *         #GNUNET_SYSERR if it is invalid. - */ -int -TALER_string_to_amount (const char *str, -                        struct TALER_Amount *denom); - - -/** - * Convert amount from host to network representation. - * - * @param d amount in host representation - * @return amount in network representation - */ -struct TALER_AmountNBO -TALER_amount_hton (struct TALER_Amount d); - - -/** - * Convert amount from network to host representation. - * - * @param d amount in network representation - * @return amount in host representation - */ -struct TALER_Amount -TALER_amount_ntoh (struct TALER_AmountNBO dn); - - -/** - * Compare the value/fraction of two amounts.  Does not compare the currency, - * i.e. comparing amounts with the same value and fraction but different - * currency would return 0. - * - * @param a1 first amount - * @param a2 second amount - * @return result of the comparison - */ -int -TALER_amount_cmp (struct TALER_Amount a1, -                  struct TALER_Amount a2); - - -/** - * Perform saturating subtraction of amounts. - * - * @param a1 amount to subtract from - * @param a2 amount to subtract - * @return (a1-a2) or 0 if a2>=a1 - */ -struct TALER_Amount -TALER_amount_subtract (struct TALER_Amount a1, -                       struct TALER_Amount a2); - - -/** - * Perform saturating addition of amounts - * - * @param a1 first amount to add - * @param a2 second amount to add - * @return sum of a1 and a2 - */ -struct TALER_Amount -TALER_amount_add (struct TALER_Amount a1, -                  struct TALER_Amount a2); - - -/** - * Normalize the given amount. - * - * @param amout amount to normalize - * @return normalized amount - */ -struct TALER_Amount -TALER_amount_normalize (struct TALER_Amount amount); - - -/** - * Convert amount to string. - * - * @param amount amount to convert to string - * @return freshly allocated string representation - */ -char * -TALER_amount_to_string (struct TALER_Amount amount); - - -/* ****************** Coin crypto primitives ************* */ - -/** - * Public information about a coin (including the public key - * of the coin, the denomination key and the signature with - * the denomination key). - */ -struct TALER_CoinPublicInfo -{ -  /** -   * The coin's public key. -   */ -  struct GNUNET_CRYPTO_EcdsaPublicKey coin_pub; - -  /** -   * Public key representing the denomination of the coin -   * that is being deposited. -   */ -  struct GNUNET_CRYPTO_rsa_PublicKey *denom_pub; - -  /** -   * (Unblinded) signature over @e coin_pub with @e denom_pub, -   * which demonstrates that the coin is valid. -   */ -  struct GNUNET_CRYPTO_rsa_Signature *denom_sig; -}; - - -/** - * Check if a coin is valid; that is, whether the denomination key exists, - * is not expired, and the signature is correct. - * - * @param coin_public_info the coin public info to check for validity - * @return #GNUNET_YES if the coin is valid, - *         #GNUNET_NO if it is invalid - *         #GNUNET_SYSERROR if an internal error occured - */ -int -TALER_test_coin_valid (const struct TALER_CoinPublicInfo *coin_public_info); - - -/* ****************** Refresh crypto primitives ************* */ - -/** - * Secret used to decrypt the key to decrypt link secrets. - */ -struct TALER_TransferSecret -{ -  /** -   * Secret used to encrypt/decrypt the `struct TALER_LinkSecret`. -   * Must be (currently) a hash as this is what -   * #GNUNET_CRYPTO_ecc_ecdh() returns to us. -   */ -  struct GNUNET_HashCode key; -}; - - -/** - * Secret used to decrypt refresh links. - */ -struct TALER_LinkSecret -{ -  /** -   * Secret used to decrypt the refresh link data. -   */ -  char key[sizeof (struct GNUNET_HashCode)]; -}; - - -/** - * Encrypted secret used to decrypt refresh links. - */ -struct TALER_EncryptedLinkSecret -{ -  /** -   * Encrypted secret, must be the given size! -   */ -  char enc[sizeof (struct TALER_LinkSecret)]; -}; - - -/** - * Representation of an encrypted refresh link. - */ -struct TALER_RefreshLinkEncrypted -{ - -  /** -   * Encrypted blinding key with @e blinding_key_enc_size bytes, -   * must be allocated at the end of this struct. -   */ -  const char *blinding_key_enc; - -  /** -   * Number of bytes in @e blinding_key_enc. -   */ -  size_t blinding_key_enc_size; - -  /** -   * Encrypted private key of the coin. -   */ -  char coin_priv_enc[sizeof (struct GNUNET_CRYPTO_EcdsaPrivateKey)]; - -}; - - -/** - * Representation of an refresh link in cleartext. - */ -struct TALER_RefreshLinkDecrypted -{ - -  /** -   * Private key of the coin. -   */ -  struct GNUNET_CRYPTO_EcdsaPrivateKey coin_priv; - -  /** -   * Blinding key with @e blinding_key_enc_size bytes. -   */ -  struct GNUNET_CRYPTO_rsa_BlindingKey *blinding_key; - -}; - - -/** - * Use the @a trans_sec (from ECDHE) to decrypt the @a secret_enc - * to obtain the @a secret to decrypt the linkage data. - * - * @param secret_enc encrypted secret - * @param trans_sec transfer secret - * @param secret shared secret for refresh link decryption - * @return #GNUNET_OK on success - */ -int -TALER_transfer_decrypt (const struct TALER_EncryptedLinkSecret *secret_enc, -                        const struct TALER_TransferSecret *trans_sec, -                        struct TALER_LinkSecret *secret); - - -/** - * Use the @a trans_sec (from ECDHE) to encrypt the @a secret - * to obtain the @a secret_enc. - * - * @param secret shared secret for refresh link decryption - * @param trans_sec transfer secret - * @param secret_enc[out] encrypted secret - * @return #GNUNET_OK on success - */ -int -TALER_transfer_encrypt (const struct TALER_LinkSecret *secret, -                        const struct TALER_TransferSecret *trans_sec, -                        struct TALER_EncryptedLinkSecret *secret_enc); - - -/** - * Decrypt refresh link information. - * - * @param input encrypted refresh link data - * @param secret shared secret to use for decryption - * @return NULL on error - */ -struct TALER_RefreshLinkDecrypted * -TALER_refresh_decrypt (const struct TALER_RefreshLinkEncrypted *input, -                       const struct TALER_LinkSecret *secret); - - -/** - * Encrypt refresh link information. - * - * @param input plaintext refresh link data - * @param secret shared secret to use for encryption - * @return NULL on error (should never happen) - */ -struct TALER_RefreshLinkEncrypted * -TALER_refresh_encrypt (const struct TALER_RefreshLinkDecrypted *input, -                       const struct TALER_LinkSecret *secret); - -  #endif diff --git a/src/mint/Makefile.am b/src/mint/Makefile.am index d1a68e59..9bb554a4 100644 --- a/src/mint/Makefile.am +++ b/src/mint/Makefile.am @@ -1,4 +1,4 @@ -AM_CPPFLAGS = -I$(top_srcdir)/src/include $(POSTGRESQL_CPPFLAGS) +AM_CPPFLAGS = -I$(top_srcdir)/src/include -I$(top_srcdir)/src/pq/ $(POSTGRESQL_CPPFLAGS)  lib_LTLIBRARIES = \    libtalermint_common.la diff --git a/src/mint/mint_db.c b/src/mint/mint_db.c index 35f803e1..0f233a5a 100644 --- a/src/mint/mint_db.c +++ b/src/mint/mint_db.c @@ -13,14 +13,13 @@    You should have received a copy of the GNU General Public License along with    TALER; see the file COPYING.  If not, If not, see <http://www.gnu.org/licenses/>  */ -  /**   * @file mint_db.c   * @brief Database access for the mint   * @author Florian Dold   */  #include "platform.h" -#include "taler_db_lib.h" +#include "db_pq.h"  #include "taler_signatures.h"  #include "taler-mint-httpd_responses.h"  #include "mint_db.h" diff --git a/src/pq/Makefile.am b/src/pq/Makefile.am index cd7a5c93..532d2909 100644 --- a/src/pq/Makefile.am +++ b/src/pq/Makefile.am @@ -4,7 +4,7 @@ lib_LTLIBRARIES = \    libtalerpq.la  libtalerpq_la_SOURCES = \ -  db_pq.c +  db_pq.c db_pq.h  libtalerpq_la_LIBADD = \    -lgnunetutil \ diff --git a/src/pq/db_pq.c b/src/pq/db_pq.c index 2864f347..06982757 100644 --- a/src/pq/db_pq.c +++ b/src/pq/db_pq.c @@ -22,7 +22,7 @@   */  #include "platform.h"  #include <gnunet/gnunet_util_lib.h> -#include "taler_db_lib.h" +#include "db_pq.h"  /** diff --git a/src/include/taler_db_lib.h b/src/pq/db_pq.h index 6e2b2b2c..6e2b2b2c 100644 --- a/src/include/taler_db_lib.h +++ b/src/pq/db_pq.h diff --git a/src/util/amount.c b/src/util/amount.c index 8bd899bf..bb5bf0d5 100644 --- a/src/util/amount.c +++ b/src/util/amount.c @@ -13,9 +13,8 @@    You should have received a copy of the GNU General Public License along with    TALER; see the file COPYING.  If not, If not, see <http://www.gnu.org/licenses/>  */ -  /** - * @file amount.c + * @file util/amount.c   * @brief Common utility functions to deal with units of currency   * @author Sree Harsha Totakura <sreeharsha@totakura.in>   * @author Florian Dold @@ -23,8 +22,6 @@   */  #include "platform.h"  #include "taler_util.h" -#include <gnunet/gnunet_common.h> -#include <gnunet/gnunet_util_lib.h>  #include <gcrypt.h>  #define AMOUNT_FRAC_BASE 1000000 diff --git a/src/util/crypto.c b/src/util/crypto.c index 8ce3ade2..12f45208 100644 --- a/src/util/crypto.c +++ b/src/util/crypto.c @@ -14,11 +14,12 @@    TALER; see the file COPYING.  If not, If not, see <http://www.gnu.org/licenses/>  */  /** - * @file crypto.c + * @file util/crypto.c   * @brief Cryptographic utility functions   * @author Sree Harsha Totakura <sreeharsha@totakura.in>   * @author Florian Dold   * @author Benedikt Mueller + * @author Christian Grothoff   */  #include "platform.h"  #include "taler_util.h" diff --git a/src/util/json.c b/src/util/json.c index 252def39..f686d84a 100644 --- a/src/util/json.c +++ b/src/util/json.c @@ -13,13 +13,11 @@    You should have received a copy of the GNU General Public License along with    TALER; see the file COPYING.  If not, If not, see <http://www.gnu.org/licenses/>  */ -  /**   * @file util/json.c   * @brief helper functions for JSON processing using libjansson   * @author Sree Harsha Totakura <sreeharsha@totakura.in>   */ -  #include "platform.h"  #include <gnunet/gnunet_util_lib.h>  #include "taler_util.h" @@ -49,6 +47,7 @@      if (cond) { WARN_JSON(error); goto EXITIF_exit; }                   \    } while (0) +  /**   * Convert a TALER amount to a JSON   * object. @@ -60,6 +59,7 @@ json_t *  TALER_JSON_from_amount (struct TALER_Amount amount)  {    json_t *j; +    j = json_pack ("{s: s, s:I, s:I}",                   "currency", amount.currency,                   "value", (json_int_t) amount.value, | 
