LCOV - code coverage report
Current view: top level - util - crypto.c (source / functions) Coverage Total Hit
Test: coverage.info Lines: 78.8 % 231 182
Test Date: 2026-04-03 22:53:11 Functions: 83.8 % 37 31

            Line data    Source code
       1              : /*
       2              :   This file is part of TALER
       3              :   Copyright (C) 2014-2022 Taler Systems SA
       4              : 
       5              :   TALER is free software; you can redistribute it and/or modify it under the
       6              :   terms of the GNU General Public License as published by the Free Software
       7              :   Foundation; either version 3, or (at your option) any later version.
       8              : 
       9              :   TALER is distributed in the hope that it will be useful, but WITHOUT ANY
      10              :   WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR
      11              :   A PARTICULAR PURPOSE.  See the GNU General Public License for more details.
      12              : 
      13              :   You should have received a copy of the GNU General Public License along with
      14              :   TALER; see the file COPYING.  If not, see <http://www.gnu.org/licenses/>
      15              : */
      16              : /**
      17              :  * @file util/crypto.c
      18              :  * @brief Cryptographic utility functions
      19              :  * @author Sree Harsha Totakura <sreeharsha@totakura.in>
      20              :  * @author Florian Dold
      21              :  * @author Benedikt Mueller
      22              :  * @author Christian Grothoff
      23              :  * @author Özgür Kesim
      24              :  */
      25              : #include "taler/platform.h"
      26              : #include "taler/taler_util.h"
      27              : #include <gcrypt.h>
      28              : 
      29              : /**
      30              :  * Function called by libgcrypt on serious errors.
      31              :  * Prints an error message and aborts the process.
      32              :  *
      33              :  * @param cls NULL
      34              :  * @param wtf unknown
      35              :  * @param msg error message
      36              :  */
      37              : static void
      38            0 : fatal_error_handler (void *cls,
      39              :                      int wtf,
      40              :                      const char *msg)
      41              : {
      42              :   (void) cls;
      43              :   (void) wtf;
      44            0 :   fprintf (stderr,
      45              :            "Fatal error in libgcrypt: %s\n",
      46              :            msg);
      47            0 :   abort ();
      48              : }
      49              : 
      50              : 
      51              : /**
      52              :  * Initialize libgcrypt.
      53              :  */
      54              : void __attribute__ ((constructor))
      55          560 : TALER_gcrypt_init ()
      56              : {
      57          560 :   gcry_set_fatalerror_handler (&fatal_error_handler,
      58              :                                NULL);
      59          560 :   if (! gcry_check_version (NEED_LIBGCRYPT_VERSION))
      60              :   {
      61            0 :     fprintf (stderr,
      62              :              "libgcrypt version mismatch\n");
      63            0 :     abort ();
      64              :   }
      65              :   /* Disable secure memory (we should never run on a system that
      66              :      even uses swap space for memory). */
      67          560 :   gcry_control (GCRYCTL_DISABLE_SECMEM, 0);
      68          560 :   gcry_control (GCRYCTL_INITIALIZATION_FINISHED, 0);
      69          560 : }
      70              : 
      71              : 
      72              : enum GNUNET_GenericReturnValue
      73          250 : TALER_test_coin_valid (const struct TALER_CoinPublicInfo *coin_public_info,
      74              :                        const struct TALER_DenominationPublicKey *denom_pub)
      75              : {
      76              :   struct TALER_CoinPubHashP c_hash;
      77              : #if ENABLE_SANITY_CHECKS
      78              :   struct TALER_DenominationHashP d_hash;
      79              : 
      80          250 :   TALER_denom_pub_hash (denom_pub,
      81              :                         &d_hash);
      82          250 :   GNUNET_assert (0 ==
      83              :                  GNUNET_memcmp (&d_hash,
      84              :                                 &coin_public_info->denom_pub_hash));
      85              : #endif
      86              : 
      87          250 :   TALER_coin_pub_hash (&coin_public_info->coin_pub,
      88          250 :                        coin_public_info->no_age_commitment
      89              :                        ? NULL
      90              :                        : &coin_public_info->h_age_commitment,
      91              :                        &c_hash);
      92              : 
      93          250 :   if (GNUNET_OK !=
      94          250 :       TALER_denom_pub_verify (denom_pub,
      95              :                               &coin_public_info->denom_sig,
      96              :                               &c_hash))
      97              :   {
      98            0 :     GNUNET_log (GNUNET_ERROR_TYPE_WARNING,
      99              :                 "coin signature is invalid\n");
     100            0 :     return GNUNET_NO;
     101              :   }
     102          250 :   return GNUNET_YES;
     103              : }
     104              : 
     105              : 
     106              : void
     107            1 : TALER_link_derive_transfer_secret (
     108              :   const struct TALER_CoinSpendPrivateKeyP *coin_priv,
     109              :   const struct TALER_TransferPrivateKeyP *trans_priv,
     110              :   struct TALER_TransferSecretP *ts)
     111              : {
     112              :   struct TALER_CoinSpendPublicKeyP coin_pub;
     113              : 
     114            1 :   GNUNET_CRYPTO_eddsa_key_get_public (&coin_priv->eddsa_priv,
     115              :                                       &coin_pub.eddsa_pub);
     116            1 :   GNUNET_assert (GNUNET_OK ==
     117              :                  GNUNET_CRYPTO_ecdh_eddsa (&trans_priv->ecdhe_priv,
     118              :                                            &coin_pub.eddsa_pub,
     119              :                                            &ts->key));
     120            1 : }
     121              : 
     122              : 
     123              : void
     124          641 : TALER_link_reveal_transfer_secret (
     125              :   const struct TALER_TransferPrivateKeyP *trans_priv,
     126              :   const struct TALER_CoinSpendPublicKeyP *coin_pub,
     127              :   struct TALER_TransferSecretP *transfer_secret)
     128              : {
     129          641 :   GNUNET_assert (GNUNET_OK ==
     130              :                  GNUNET_CRYPTO_ecdh_eddsa (&trans_priv->ecdhe_priv,
     131              :                                            &coin_pub->eddsa_pub,
     132              :                                            &transfer_secret->key));
     133          641 : }
     134              : 
     135              : 
     136              : void
     137            1 : TALER_link_recover_transfer_secret (
     138              :   const struct TALER_TransferPublicKeyP *trans_pub,
     139              :   const struct TALER_CoinSpendPrivateKeyP *coin_priv,
     140              :   struct TALER_TransferSecretP *transfer_secret)
     141              : {
     142            1 :   GNUNET_assert (GNUNET_OK ==
     143              :                  GNUNET_CRYPTO_eddsa_ecdh (&coin_priv->eddsa_priv,
     144              :                                            &trans_pub->ecdhe_pub,
     145              :                                            &transfer_secret->key));
     146            1 : }
     147              : 
     148              : 
     149              : void
     150           93 : TALER_withdraw_expand_secrets (
     151              :   size_t num_coins,
     152              :   const struct TALER_WithdrawMasterSeedP *seed,
     153              :   struct TALER_PlanchetMasterSecretP secrets[static num_coins])
     154           93 : {
     155              :   _Static_assert (sizeof(seed->seed_data) == sizeof(secrets->key_data));
     156           93 :   GNUNET_assert (0 < num_coins);
     157              : 
     158           93 :   if (1 == num_coins)
     159              :   {
     160           79 :     GNUNET_memcpy (&secrets[0].key_data,
     161              :                    &seed->seed_data,
     162              :                    sizeof(secrets[0].key_data));
     163              :   }
     164              :   else
     165              :   {
     166           14 :     uint32_t be_salt = htonl (num_coins);
     167              : 
     168           14 :     GNUNET_assert (GNUNET_OK ==
     169              :                    GNUNET_CRYPTO_hkdf_gnunet (
     170              :                      secrets,
     171              :                      sizeof (*secrets) * num_coins,
     172              :                      &be_salt,
     173              :                      sizeof (be_salt),
     174              :                      seed,
     175              :                      sizeof (*seed),
     176              :                      GNUNET_CRYPTO_kdf_arg_string ("taler-withdraw-secrets")));
     177              :   }
     178           93 : }
     179              : 
     180              : 
     181              : void
     182            5 : TALER_withdraw_expand_kappa_seed (
     183              :   const struct TALER_WithdrawMasterSeedP *seed,
     184              :   struct TALER_KappaWithdrawMasterSeedP *seeds)
     185              : {
     186            5 :   uint32_t be_salt = htonl (TALER_CNC_KAPPA);
     187              : 
     188            5 :   GNUNET_assert (GNUNET_OK ==
     189              :                  GNUNET_CRYPTO_hkdf_gnunet (
     190              :                    seeds,
     191              :                    sizeof (*seeds),
     192              :                    &be_salt,
     193              :                    sizeof (be_salt),
     194              :                    seed,
     195              :                    sizeof (*seed),
     196              :                    GNUNET_CRYPTO_kdf_arg_string ("taler-kappa-seeds")));
     197            5 : }
     198              : 
     199              : 
     200              : void
     201          171 : TALER_planchet_master_setup_random (
     202              :   struct TALER_PlanchetMasterSecretP *ps)
     203              : {
     204          171 :   GNUNET_CRYPTO_random_block (GNUNET_CRYPTO_QUALITY_STRONG,
     205              :                               ps,
     206              :                               sizeof (*ps));
     207          171 : }
     208              : 
     209              : 
     210              : void
     211           68 : TALER_withdraw_master_seed_setup_random (
     212              :   struct TALER_WithdrawMasterSeedP *seed)
     213              : {
     214           68 :   GNUNET_CRYPTO_random_block (GNUNET_CRYPTO_QUALITY_STRONG,
     215              :                               seed,
     216              :                               sizeof (*seed));
     217           68 : }
     218              : 
     219              : 
     220              : void
     221           22 : TALER_refresh_master_setup_random (
     222              :   struct TALER_PublicRefreshMasterSeedP *rms)
     223              : {
     224           22 :   GNUNET_CRYPTO_random_block (GNUNET_CRYPTO_QUALITY_STRONG,
     225              :                               rms,
     226              :                               sizeof (*rms));
     227           22 : }
     228              : 
     229              : 
     230              : void
     231          642 : TALER_transfer_secret_to_planchet_secret (
     232              :   const struct TALER_TransferSecretP *secret_seed,
     233              :   uint32_t coin_num_salt,
     234              :   struct TALER_PlanchetMasterSecretP *ps)
     235              : {
     236          642 :   uint32_t be_salt = htonl (coin_num_salt);
     237              : 
     238          642 :   GNUNET_assert (GNUNET_OK ==
     239              :                  GNUNET_CRYPTO_hkdf_gnunet (
     240              :                    ps,
     241              :                    sizeof (*ps),
     242              :                    &be_salt,
     243              :                    sizeof (be_salt),
     244              :                    secret_seed,
     245              :                    sizeof (*secret_seed),
     246              :                    GNUNET_CRYPTO_kdf_arg_string ("taler-coin-derivation")));
     247          642 : }
     248              : 
     249              : 
     250              : void
     251          776 : TALER_cs_withdraw_nonce_derive (
     252              :   const struct TALER_PlanchetMasterSecretP *ps,
     253              :   struct GNUNET_CRYPTO_CsSessionNonce *nonce)
     254              : {
     255          776 :   GNUNET_assert (GNUNET_YES ==
     256              :                  GNUNET_CRYPTO_hkdf_gnunet (
     257              :                    nonce,
     258              :                    sizeof (*nonce),
     259              :                    "n",
     260              :                    strlen ("n"),
     261              :                    ps,
     262              :                    sizeof(*ps)));
     263          776 : }
     264              : 
     265              : 
     266              : void
     267           73 : TALER_cs_withdraw_seed_to_blinding_seed (
     268              :   const struct TALER_WithdrawMasterSeedP *seed,
     269              :   struct TALER_BlindingMasterSeedP *blinding_seed)
     270              : {
     271           73 :   GNUNET_assert (GNUNET_YES ==
     272              :                  GNUNET_CRYPTO_hkdf_gnunet (
     273              :                    blinding_seed,
     274              :                    sizeof (*blinding_seed),
     275              :                    "withdraw-blinding",
     276              :                    strlen ("withdraw-blinding"),
     277              :                    seed,
     278              :                    sizeof(*seed)));
     279           73 : }
     280              : 
     281              : 
     282              : void
     283           15 : TALER_cs_refresh_seed_to_blinding_seed (
     284              :   const struct TALER_PublicRefreshMasterSeedP *seed,
     285              :   const struct TALER_CoinSpendPrivateKeyP *coin_priv,
     286              :   struct TALER_BlindingMasterSeedP *blinding_seed)
     287              : {
     288           15 :   GNUNET_assert (GNUNET_YES ==
     289              :                  GNUNET_CRYPTO_hkdf_gnunet (
     290              :                    blinding_seed,
     291              :                    sizeof (*blinding_seed),
     292              :                    "refresh-blinding",
     293              :                    strlen ("refresh-blinding"),
     294              :                    coin_priv,
     295              :                    sizeof (*coin_priv),
     296              :                    GNUNET_CRYPTO_kdf_arg_auto (seed)));
     297           15 : }
     298              : 
     299              : 
     300              : void
     301          352 : TALER_cs_nonce_derive_indexed (
     302              :   const struct TALER_BlindingMasterSeedP *seed,
     303              :   bool for_melt,
     304              :   uint32_t index,
     305              :   struct GNUNET_CRYPTO_CsSessionNonce *nonce)
     306              : {
     307          352 :   uint32_t be_salt = htonl (index);
     308          352 :   const char *operation = for_melt ? "refresh-n" : "withdraw-n";
     309              : 
     310          352 :   GNUNET_assert (GNUNET_YES ==
     311              :                  GNUNET_CRYPTO_hkdf_gnunet (
     312              :                    nonce,
     313              :                    sizeof (*nonce),
     314              :                    &be_salt,
     315              :                    sizeof (be_salt),
     316              :                    operation,
     317              :                    strlen (operation),
     318              :                    GNUNET_CRYPTO_kdf_arg_auto (seed)));
     319          352 : }
     320              : 
     321              : 
     322              : void
     323           99 : TALER_cs_derive_nonces_from_seed (
     324              :   const struct TALER_BlindingMasterSeedP *seed,
     325              :   bool for_melt,
     326              :   size_t num,
     327              :   const uint32_t indices[static num],
     328              :   struct GNUNET_CRYPTO_CsSessionNonce nonces[static num])
     329           99 : {
     330           99 :   GNUNET_assert (TALER_MAX_COINS > num);
     331              : 
     332          294 :   for (size_t i = 0; i < num; i++)
     333          195 :     TALER_cs_nonce_derive_indexed (
     334              :       seed,
     335              :       for_melt,
     336          195 :       indices[i],
     337          195 :       &nonces[i]);
     338           99 : }
     339              : 
     340              : 
     341              : void
     342           45 : TALER_cs_derive_only_cs_blind_nonces_from_seed (
     343              :   const struct TALER_BlindingMasterSeedP *seed,
     344              :   bool for_melt,
     345              :   size_t num,
     346              :   const uint32_t indices[static num],
     347              :   union GNUNET_CRYPTO_BlindSessionNonce nonces[static num])
     348           45 : {
     349           45 :   GNUNET_assert (TALER_MAX_COINS > num);
     350              : 
     351          114 :   for (size_t i = 0; i < num; i++)
     352           69 :     TALER_cs_nonce_derive_indexed (
     353              :       seed,
     354              :       for_melt,
     355           69 :       indices[i],
     356           69 :       &nonces[i].cs_nonce);
     357           45 : }
     358              : 
     359              : 
     360              : void
     361           22 : TALER_cs_derive_blind_nonces_from_seed (
     362              :   const struct TALER_BlindingMasterSeedP *seed,
     363              :   bool for_melt,
     364              :   size_t num,
     365              :   const bool is_cs[static num],
     366              :   union GNUNET_CRYPTO_BlindSessionNonce nonces[static num])
     367           22 : {
     368          110 :   for (size_t i = 0; i < num; i++)
     369              :   {
     370           88 :     if (is_cs[i])
     371           88 :       TALER_cs_nonce_derive_indexed (
     372              :         seed,
     373              :         for_melt,
     374              :         i,
     375           88 :         &nonces[i].cs_nonce);
     376              :   }
     377           22 : }
     378              : 
     379              : 
     380              : void
     381          388 : TALER_rsa_pub_hash (const struct GNUNET_CRYPTO_RsaPublicKey *rsa,
     382              :                     struct TALER_RsaPubHashP *h_rsa)
     383              : {
     384          388 :   GNUNET_CRYPTO_rsa_public_key_hash (rsa,
     385              :                                      &h_rsa->hash);
     386              : 
     387          388 : }
     388              : 
     389              : 
     390              : void
     391          318 : TALER_cs_pub_hash (const struct GNUNET_CRYPTO_CsPublicKey *cs,
     392              :                    struct TALER_CsPubHashP *h_cs)
     393              : {
     394          318 :   GNUNET_CRYPTO_hash (cs,
     395              :                       sizeof(*cs),
     396              :                       &h_cs->hash);
     397          318 : }
     398              : 
     399              : 
     400              : enum GNUNET_GenericReturnValue
     401         1359 : TALER_planchet_prepare (
     402              :   const struct TALER_DenominationPublicKey *dk,
     403              :   const struct TALER_ExchangeBlindingValues *blinding_values,
     404              :   const union GNUNET_CRYPTO_BlindingSecretP *bks,
     405              :   const union GNUNET_CRYPTO_BlindSessionNonce *nonce,
     406              :   const struct TALER_CoinSpendPrivateKeyP *coin_priv,
     407              :   const struct TALER_AgeCommitmentHashP *ach,
     408              :   struct TALER_CoinPubHashP *c_hash,
     409              :   struct TALER_PlanchetDetail *pd)
     410              : {
     411              :   struct TALER_CoinSpendPublicKeyP coin_pub;
     412              : 
     413         1359 :   GNUNET_assert (blinding_values->blinding_inputs->cipher ==
     414              :                  dk->bsign_pub_key->cipher);
     415         1359 :   GNUNET_CRYPTO_eddsa_key_get_public (&coin_priv->eddsa_priv,
     416              :                                       &coin_pub.eddsa_pub);
     417         1359 :   if (GNUNET_OK !=
     418         1359 :       TALER_denom_blind (dk,
     419              :                          bks,
     420              :                          nonce,
     421              :                          ach,
     422              :                          &coin_pub,
     423              :                          blinding_values,
     424              :                          c_hash,
     425              :                          &pd->blinded_planchet))
     426              :   {
     427            0 :     GNUNET_break (0);
     428            0 :     return GNUNET_SYSERR;
     429              :   }
     430         1359 :   TALER_denom_pub_hash (dk,
     431              :                         &pd->denom_pub_hash);
     432         1359 :   return GNUNET_OK;
     433              : }
     434              : 
     435              : 
     436              : void
     437          114 : TALER_planchet_detail_free (struct TALER_PlanchetDetail *pd)
     438              : {
     439          114 :   TALER_blinded_planchet_free (&pd->blinded_planchet);
     440          114 : }
     441              : 
     442              : 
     443              : enum GNUNET_GenericReturnValue
     444          190 : TALER_planchet_to_coin (
     445              :   const struct TALER_DenominationPublicKey *dk,
     446              :   const struct TALER_BlindedDenominationSignature *blind_sig,
     447              :   const union GNUNET_CRYPTO_BlindingSecretP *bks,
     448              :   const struct TALER_CoinSpendPrivateKeyP *coin_priv,
     449              :   const struct TALER_AgeCommitmentHashP *ach,
     450              :   const struct TALER_CoinPubHashP *c_hash,
     451              :   const struct TALER_ExchangeBlindingValues *alg_values,
     452              :   struct TALER_FreshCoin *coin)
     453              : {
     454          190 :   if (dk->bsign_pub_key->cipher !=
     455          190 :       blind_sig->blinded_sig->cipher)
     456              :   {
     457            0 :     GNUNET_break_op (0);
     458            0 :     return GNUNET_SYSERR;
     459              :   }
     460          190 :   if (dk->bsign_pub_key->cipher !=
     461          190 :       alg_values->blinding_inputs->cipher)
     462              :   {
     463            0 :     GNUNET_break_op (0);
     464            0 :     return GNUNET_SYSERR;
     465              :   }
     466          190 :   if (GNUNET_OK !=
     467          190 :       TALER_denom_sig_unblind (&coin->sig,
     468              :                                blind_sig,
     469              :                                bks,
     470              :                                c_hash,
     471              :                                alg_values,
     472              :                                dk))
     473              :   {
     474            0 :     GNUNET_break_op (0);
     475            0 :     return GNUNET_SYSERR;
     476              :   }
     477          190 :   if (GNUNET_OK !=
     478          190 :       TALER_denom_pub_verify (dk,
     479          190 :                               &coin->sig,
     480              :                               c_hash))
     481              :   {
     482            0 :     GNUNET_break_op (0);
     483            0 :     TALER_denom_sig_free (&coin->sig);
     484            0 :     return GNUNET_SYSERR;
     485              :   }
     486              : 
     487          190 :   coin->coin_priv = *coin_priv;
     488          190 :   coin->h_age_commitment = ach;
     489          190 :   return GNUNET_OK;
     490              : }
     491              : 
     492              : 
     493              : void
     494           88 : TALER_refresh_get_commitment (
     495              :   struct TALER_RefreshCommitmentP *rc,
     496              :   const struct TALER_PublicRefreshMasterSeedP *refresh_seed,
     497              :   const struct TALER_BlindingMasterSeedP *blinding_seed,
     498              :   const struct TALER_KappaTransferPublicKeys *k_tpbs,
     499              :   const struct TALER_KappaHashBlindedPlanchetsP *k_bps_h,
     500              :   const struct TALER_CoinSpendPublicKeyP *coin_pub,
     501              :   const struct TALER_Amount *amount_with_fee)
     502              : {
     503              :   struct GNUNET_HashContext *hash_context;
     504              : 
     505           88 :   hash_context = GNUNET_CRYPTO_hash_context_start ();
     506              : 
     507              :   /* First, the refresh master seed (from which the nonces, then signatures
     508              :      and finally private keys of the fresh coins are derived from) */
     509           88 :   GNUNET_assert (NULL != refresh_seed);
     510           88 :   GNUNET_CRYPTO_hash_context_read (hash_context,
     511              :                                    refresh_seed,
     512              :                                    sizeof (*refresh_seed));
     513              : 
     514              :   /* Then, in case of CS denominations, the blinding_seed from which all
     515              :      nonces are derived from, and therefore public R-values */
     516              :   {
     517           88 :     struct TALER_BlindingMasterSeedP blanko = {0};
     518           88 :     const struct TALER_BlindingMasterSeedP *pbms = &blanko;
     519              : 
     520           88 :     if (NULL != blinding_seed)
     521           59 :       pbms = blinding_seed;
     522           88 :     GNUNET_CRYPTO_hash_context_read (hash_context,
     523              :                                      pbms,
     524              :                                      sizeof(*pbms));
     525              :   }
     526              : 
     527              :   /* Next, add public key of coin and amount being refreshed */
     528              :   {
     529              :     struct TALER_AmountNBO melt_amountn;
     530              : 
     531           88 :     GNUNET_CRYPTO_hash_context_read (hash_context,
     532              :                                      coin_pub,
     533              :                                      sizeof (struct TALER_CoinSpendPublicKeyP));
     534           88 :     TALER_amount_hton (&melt_amountn,
     535              :                        amount_with_fee);
     536           88 :     GNUNET_CRYPTO_hash_context_read (hash_context,
     537              :                                      &melt_amountn,
     538              :                                      sizeof (struct TALER_AmountNBO));
     539              :   }
     540              : 
     541              :   /* Finally, add all the hashes of the blinded coins
     542              :    * (containing information about denominations), depths first */
     543          352 :   for (unsigned int k = 0; k<TALER_CNC_KAPPA; k++)
     544          264 :     GNUNET_CRYPTO_hash_context_read (hash_context,
     545          264 :                                      &k_bps_h->tuple[k],
     546              :                                      sizeof(k_bps_h->tuple[k]));
     547              : 
     548              :   /* Conclude */
     549           88 :   GNUNET_CRYPTO_hash_context_finish (hash_context,
     550              :                                      &rc->session_hash);
     551           88 : }
     552              : 
     553              : 
     554              : void
     555           44 : TALER_refresh_expand_seed_to_kappa_batch_seeds (
     556              :   const struct TALER_PublicRefreshMasterSeedP *refresh_master_seed,
     557              :   const struct TALER_CoinSpendPrivateKeyP *coin_priv,
     558              :   struct TALER_KappaPrivateRefreshBatchSeedsP *kappa_batch_seeds)
     559              : {
     560           44 :   GNUNET_assert (GNUNET_OK ==
     561              :                  GNUNET_CRYPTO_hkdf_gnunet (
     562              :                    kappa_batch_seeds,
     563              :                    sizeof (*kappa_batch_seeds),
     564              :                    "refresh-batch-seeds",
     565              :                    strlen ("refresh-batch-seeds"),
     566              :                    refresh_master_seed,
     567              :                    sizeof (*refresh_master_seed),
     568              :                    GNUNET_CRYPTO_kdf_arg_auto (coin_priv)));
     569           44 : }
     570              : 
     571              : 
     572              : void
     573          160 : TALER_refresh_expand_batch_seed_to_transfer_private_keys (
     574              :   const struct TALER_PrivateRefreshBatchSeedP *batch_seed,
     575              :   size_t num_transfer_pks,
     576              :   struct TALER_TransferPrivateKeyP transfer_pks[num_transfer_pks])
     577          160 : {
     578          160 :   GNUNET_assert (GNUNET_OK ==
     579              :                  GNUNET_CRYPTO_hkdf_gnunet (
     580              :                    transfer_pks,
     581              :                    sizeof (*transfer_pks) * num_transfer_pks,
     582              :                    "refresh-transfer-private-keys",
     583              :                    strlen ("refresh-transfer-private-keys"),
     584              :                    batch_seed,
     585              :                    sizeof (*batch_seed)));
     586          160 : }
     587              : 
     588              : 
     589              : void
     590            0 : TALER_refresh_expand_batch_seed_to_transfer_secrets (
     591              :   const struct TALER_PrivateRefreshBatchSeedP *batch_seed,
     592              :   const struct TALER_CoinSpendPublicKeyP *coin_pub,
     593              :   size_t num_transfer_secrets,
     594              :   struct TALER_TransferSecretP transfer_secrets[num_transfer_secrets])
     595            0 : {
     596            0 :   struct TALER_TransferPrivateKeyP transfer_pks[num_transfer_secrets];
     597              : 
     598            0 :   TALER_refresh_expand_batch_seed_to_transfer_private_keys (
     599              :     batch_seed,
     600              :     num_transfer_secrets,
     601              :     transfer_pks);
     602              : 
     603            0 :   for (size_t i = 0; i < num_transfer_secrets; i++)
     604              :   {
     605            0 :     TALER_link_reveal_transfer_secret (
     606            0 :       &transfer_pks[i],
     607              :       coin_pub,
     608            0 :       &transfer_secrets[i]);
     609              :   }
     610            0 : }
     611              : 
     612              : 
     613              : void
     614            0 : TALER_refresh_expand_batch_seed_to_planchet_master_secrets (
     615              :   const struct TALER_PrivateRefreshBatchSeedP *batch_seed,
     616              :   const struct TALER_CoinSpendPublicKeyP *coin_pub,
     617              :   size_t num_planchet_secrets,
     618              :   struct TALER_PlanchetMasterSecretP planchet_secrets[num_planchet_secrets])
     619            0 : {
     620            0 :   struct TALER_TransferPrivateKeyP transfer_pks[num_planchet_secrets];
     621            0 :   struct TALER_TransferSecretP transfer_secrets[num_planchet_secrets];
     622              : 
     623            0 :   TALER_refresh_expand_batch_seed_to_transfer_private_keys (
     624              :     batch_seed,
     625              :     num_planchet_secrets,
     626              :     transfer_pks);
     627              : 
     628            0 :   for (size_t i = 0; i < num_planchet_secrets; i++)
     629              :   {
     630            0 :     TALER_link_reveal_transfer_secret (
     631            0 :       &transfer_pks[i],
     632              :       coin_pub,
     633              :       &transfer_secrets[i]);
     634              : 
     635            0 :     TALER_transfer_secret_to_planchet_secret (
     636            0 :       &transfer_secrets[i],
     637              :       i,
     638            0 :       &planchet_secrets[i]);
     639              :   }
     640            0 : }
     641              : 
     642              : 
     643              : void
     644          160 : TALER_refresh_expand_batch_seed_to_transfer_data (
     645              :   const struct TALER_PrivateRefreshBatchSeedP *batch_seed,
     646              :   const struct TALER_CoinSpendPublicKeyP *coin_pub,
     647              :   size_t num,
     648              :   struct TALER_PlanchetMasterSecretP planchet_secrets[num],
     649              :   struct TALER_TransferPublicKeyP transfer_pubs[num])
     650          160 : {
     651          160 :   struct TALER_TransferPrivateKeyP transfer_pks[num];
     652          160 :   struct TALER_TransferSecretP transfer_secrets[num];
     653              : 
     654          160 :   TALER_refresh_expand_batch_seed_to_transfer_private_keys (
     655              :     batch_seed,
     656              :     num,
     657              :     transfer_pks);
     658              : 
     659          800 :   for (size_t i = 0; i < num; i++)
     660              :   {
     661          640 :     TALER_link_reveal_transfer_secret (
     662          640 :       &transfer_pks[i],
     663              :       coin_pub,
     664              :       &transfer_secrets[i]);
     665              : 
     666          640 :     TALER_transfer_secret_to_planchet_secret (
     667          640 :       &transfer_secrets[i],
     668              :       i,
     669          640 :       &planchet_secrets[i]);
     670              : 
     671          640 :     GNUNET_CRYPTO_ecdhe_key_get_public (
     672          640 :       &transfer_pks[i].ecdhe_priv,
     673          640 :       &transfer_pubs[i].ecdhe_pub);
     674              :   }
     675          160 : }
     676              : 
     677              : 
     678              : void
     679            0 : TALER_refresh_expand_kappa_nonces_v27 (
     680              :   const struct TALER_PublicRefreshMasterSeedP *refresh_seed,
     681              :   struct TALER_KappaPublicRefreshNoncesP *kappa_nonces)
     682              : {
     683            0 :   GNUNET_assert (GNUNET_OK ==
     684              :                  GNUNET_CRYPTO_hkdf_gnunet (
     685              :                    kappa_nonces,
     686              :                    sizeof (*kappa_nonces),
     687              :                    "refresh-kappa-nonces",
     688              :                    strlen ("refresh-kappa-nonces"),
     689              :                    refresh_seed,
     690              :                    sizeof (*refresh_seed)));
     691            0 : }
     692              : 
     693              : 
     694              : void
     695            0 : TALER_refresh_signature_to_secrets_v27 (
     696              :   const struct TALER_PrivateRefreshNonceSignatureP *sig,
     697              :   size_t num_secrets,
     698              :   struct TALER_PlanchetMasterSecretP secrets[static num_secrets])
     699            0 : {
     700            0 :   GNUNET_assert (GNUNET_YES ==
     701              :                  GNUNET_CRYPTO_hkdf_gnunet (
     702              :                    secrets,
     703              :                    sizeof (*secrets) * num_secrets,
     704              :                    "refresh-planchet-secret",
     705              :                    strlen ("refresh-planchet-secret"),
     706              :                    sig,
     707              :                    sizeof(*sig)));
     708            0 : }
     709              : 
     710              : 
     711              : void
     712         1689 : TALER_coin_pub_hash (const struct TALER_CoinSpendPublicKeyP *coin_pub,
     713              :                      const struct TALER_AgeCommitmentHashP *ach,
     714              :                      struct TALER_CoinPubHashP *coin_h)
     715              : {
     716         1689 :   if (TALER_AgeCommitmentHashP_isNullOrZero (ach))
     717              :   {
     718              :     /* No age commitment was set */
     719          747 :     GNUNET_CRYPTO_hash (&coin_pub->eddsa_pub,
     720              :                         sizeof (struct GNUNET_CRYPTO_EcdsaPublicKey),
     721              :                         &coin_h->hash);
     722              :   }
     723              :   else
     724              :   {
     725              :     /* Coin comes with age commitment.  Take the hash of the age commitment
     726              :      * into account */
     727              :     struct GNUNET_HashContext *hash_context;
     728              : 
     729          942 :     hash_context = GNUNET_CRYPTO_hash_context_start ();
     730              : 
     731          942 :     GNUNET_CRYPTO_hash_context_read (
     732              :       hash_context,
     733          942 :       &coin_pub->eddsa_pub,
     734              :       sizeof(struct GNUNET_CRYPTO_EcdsaPublicKey));
     735              : 
     736          942 :     GNUNET_CRYPTO_hash_context_read (
     737              :       hash_context,
     738              :       ach,
     739              :       sizeof(struct TALER_AgeCommitmentHashP));
     740              : 
     741          942 :     GNUNET_CRYPTO_hash_context_finish (
     742              :       hash_context,
     743              :       &coin_h->hash);
     744              :   }
     745         1689 : }
     746              : 
     747              : 
     748              : void
     749         1671 : TALER_coin_ev_hash (const struct TALER_BlindedPlanchet *blinded_planchet,
     750              :                     const struct TALER_DenominationHashP *denom_hash,
     751              :                     struct TALER_BlindedCoinHashP *bch)
     752              : {
     753              :   struct GNUNET_HashContext *hash_context;
     754              : 
     755         1671 :   hash_context = GNUNET_CRYPTO_hash_context_start ();
     756         1671 :   GNUNET_CRYPTO_hash_context_read (hash_context,
     757              :                                    denom_hash,
     758              :                                    sizeof(*denom_hash));
     759         1671 :   TALER_blinded_planchet_hash_ (blinded_planchet,
     760              :                                 hash_context);
     761         1671 :   GNUNET_CRYPTO_hash_context_finish (hash_context,
     762              :                                      &bch->hash);
     763         1671 : }
     764              : 
     765              : 
     766              : GNUNET_NETWORK_STRUCT_BEGIN
     767              : /**
     768              :  * Structure we hash to compute the group key for
     769              :  * a denomination group.
     770              :  */
     771              : struct DenominationGroupP
     772              : {
     773              :   /**
     774              :    * Value of coins in this denomination group.
     775              :    */
     776              :   struct TALER_AmountNBO value;
     777              : 
     778              :   /**
     779              :    * Fee structure for all coins in the group.
     780              :    */
     781              :   struct TALER_DenomFeeSetNBOP fees;
     782              : 
     783              :   /**
     784              :    * Age mask for the denomiation, in NBO.
     785              :    */
     786              :   uint32_t age_mask GNUNET_PACKED;
     787              : 
     788              :   /**
     789              :    * Cipher used for the denomination, in NBO.
     790              :    */
     791              :   uint32_t cipher GNUNET_PACKED;
     792              : };
     793              : GNUNET_NETWORK_STRUCT_END
     794              : 
     795              : 
     796              : void
     797          506 : TALER_denomination_group_get_key (
     798              :   const struct TALER_DenominationGroup *dg,
     799              :   struct GNUNET_HashCode *key)
     800              : {
     801          506 :   struct DenominationGroupP dgp = {
     802          506 :     .age_mask = htonl (dg->age_mask.bits),
     803          506 :     .cipher = htonl (dg->cipher)
     804              :   };
     805              : 
     806          506 :   TALER_amount_hton (&dgp.value,
     807              :                      &dg->value);
     808          506 :   TALER_denom_fee_set_hton (&dgp.fees,
     809              :                             &dg->fees);
     810          506 :   GNUNET_CRYPTO_hash (&dgp,
     811              :                       sizeof (dgp),
     812              :                       key);
     813          506 : }
     814              : 
     815              : 
     816              : void
     817           21 : TALER_kyc_measure_authorization_hash (
     818              :   const struct TALER_AccountAccessTokenP *access_token,
     819              :   uint64_t row,
     820              :   uint32_t offset,
     821              :   struct TALER_KycMeasureAuthorizationHashP *mah)
     822              : {
     823           21 :   uint64_t be64 = GNUNET_htonll (row);
     824           21 :   uint32_t be32 = htonl ((uint32_t) offset);
     825              : 
     826           21 :   GNUNET_assert (
     827              :     GNUNET_YES ==
     828              :     GNUNET_CRYPTO_hkdf_gnunet (
     829              :       mah,
     830              :       sizeof (*mah),
     831              :       &be64,
     832              :       sizeof (be64),
     833              :       access_token,
     834              :       sizeof (*access_token),
     835              :       GNUNET_CRYPTO_kdf_arg_auto (&be32)));
     836           21 : }
     837              : 
     838              : 
     839              : void
     840            0 : TALER_merchant_instance_auth_hash_with_salt (
     841              :   struct TALER_MerchantAuthenticationHashP *auth_hash,
     842              :   struct TALER_MerchantAuthenticationSaltP *salt,
     843              :   const char *passphrase)
     844              : {
     845            0 :   GNUNET_assert (GNUNET_YES ==
     846              :                  GNUNET_CRYPTO_hkdf_gnunet (
     847              :                    auth_hash,
     848              :                    sizeof (*auth_hash),
     849              :                    salt,
     850              :                    sizeof (*salt),
     851              :                    passphrase,
     852              :                    strlen (passphrase),
     853              :                    GNUNET_CRYPTO_kdf_arg_string ("merchant-instance-auth")));
     854            0 : }
     855              : 
     856              : 
     857              : /* end of crypto.c */
        

Generated by: LCOV version 2.0-1