LCOV - code coverage report
Current view: top level - util - denom.c (source / functions) Hit Total Coverage
Test: GNU Taler exchange coverage report Lines: 194 382 50.8 %
Date: 2022-08-25 06:15:09 Functions: 16 24 66.7 %
Legend: Lines: hit not hit

          Line data    Source code
       1             : /*
       2             :   This file is part of TALER
       3             :   Copyright (C) 2021, 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 denom.c
      18             :  * @brief denomination utility functions
      19             :  * @author Christian Grothoff
      20             :  */
      21             : #include "platform.h"
      22             : #include "taler_util.h"
      23             : 
      24             : 
      25             : enum GNUNET_GenericReturnValue
      26           8 : TALER_denom_priv_create (struct TALER_DenominationPrivateKey *denom_priv,
      27             :                          struct TALER_DenominationPublicKey *denom_pub,
      28             :                          enum TALER_DenominationCipher cipher,
      29             :                          ...)
      30             : {
      31           8 :   memset (denom_priv,
      32             :           0,
      33             :           sizeof (*denom_priv));
      34           8 :   memset (denom_pub,
      35             :           0,
      36             :           sizeof (*denom_pub));
      37             : 
      38           8 :   switch (cipher)
      39             :   {
      40           2 :   case TALER_DENOMINATION_INVALID:
      41           2 :     GNUNET_break (0);
      42           2 :     return GNUNET_SYSERR;
      43           2 :   case TALER_DENOMINATION_RSA:
      44             :     {
      45             :       va_list ap;
      46             :       unsigned int bits;
      47             : 
      48           2 :       va_start (ap, cipher);
      49           2 :       bits = va_arg (ap, unsigned int);
      50           2 :       va_end (ap);
      51           2 :       if (bits < 512)
      52             :       {
      53           0 :         GNUNET_break (0);
      54           0 :         return GNUNET_SYSERR;
      55             :       }
      56             :       denom_priv->details.rsa_private_key
      57           2 :         = GNUNET_CRYPTO_rsa_private_key_create (bits);
      58             :     }
      59           2 :     if (NULL == denom_priv->details.rsa_private_key)
      60             :     {
      61           0 :       GNUNET_break (0);
      62           0 :       return GNUNET_SYSERR;
      63             :     }
      64             :     denom_pub->details.rsa_public_key
      65           4 :       = GNUNET_CRYPTO_rsa_private_key_get_public (
      66           2 :           denom_priv->details.rsa_private_key);
      67           2 :     denom_priv->cipher = TALER_DENOMINATION_RSA;
      68           2 :     denom_pub->cipher = TALER_DENOMINATION_RSA;
      69           2 :     return GNUNET_OK;
      70           2 :   case TALER_DENOMINATION_CS:
      71           2 :     GNUNET_CRYPTO_cs_private_key_generate (&denom_priv->details.cs_private_key);
      72           2 :     GNUNET_CRYPTO_cs_private_key_get_public (
      73           2 :       &denom_priv->details.cs_private_key,
      74             :       &denom_pub->details.cs_public_key);
      75           2 :     denom_priv->cipher = TALER_DENOMINATION_CS;
      76           2 :     denom_pub->cipher = TALER_DENOMINATION_CS;
      77           2 :     return GNUNET_OK;
      78           2 :   default:
      79           2 :     GNUNET_break (0);
      80             :   }
      81           2 :   return GNUNET_SYSERR;
      82             : }
      83             : 
      84             : 
      85             : enum GNUNET_GenericReturnValue
      86           4 : TALER_denom_sign_blinded (struct TALER_BlindedDenominationSignature *denom_sig,
      87             :                           const struct TALER_DenominationPrivateKey *denom_priv,
      88             :                           bool for_melt,
      89             :                           const struct TALER_BlindedPlanchet *blinded_planchet)
      90             : {
      91           4 :   memset (denom_sig,
      92             :           0,
      93             :           sizeof (*denom_sig));
      94           4 :   if (blinded_planchet->cipher != denom_priv->cipher)
      95             :   {
      96           0 :     GNUNET_break (0);
      97           0 :     return GNUNET_SYSERR;
      98             :   }
      99           4 :   switch (denom_priv->cipher)
     100             :   {
     101           0 :   case TALER_DENOMINATION_INVALID:
     102           0 :     GNUNET_break (0);
     103           0 :     return GNUNET_SYSERR;
     104           2 :   case TALER_DENOMINATION_RSA:
     105             :     denom_sig->details.blinded_rsa_signature
     106           4 :       = GNUNET_CRYPTO_rsa_sign_blinded (
     107           2 :           denom_priv->details.rsa_private_key,
     108           2 :           blinded_planchet->details.rsa_blinded_planchet.blinded_msg,
     109             :           blinded_planchet->details.rsa_blinded_planchet.blinded_msg_size);
     110           2 :     if (NULL == denom_sig->details.blinded_rsa_signature)
     111             :     {
     112           0 :       GNUNET_break (0);
     113           0 :       return GNUNET_SYSERR;
     114             :     }
     115           2 :     denom_sig->cipher = TALER_DENOMINATION_RSA;
     116           2 :     return GNUNET_OK;
     117           2 :   case TALER_DENOMINATION_CS:
     118             :     {
     119             :       struct GNUNET_CRYPTO_CsRSecret r[2];
     120             : 
     121           2 :       GNUNET_CRYPTO_cs_r_derive (
     122             :         &blinded_planchet->details.cs_blinded_planchet.nonce.nonce,
     123             :         for_melt ? "rm" : "rw",
     124             :         &denom_priv->details.cs_private_key,
     125             :         r);
     126           2 :       denom_sig->details.blinded_cs_answer.b =
     127           2 :         GNUNET_CRYPTO_cs_sign_derive (&denom_priv->details.cs_private_key,
     128             :                                       r,
     129             :                                       blinded_planchet->details.
     130           2 :                                       cs_blinded_planchet.c,
     131             :                                       &blinded_planchet->details.
     132             :                                       cs_blinded_planchet.nonce.nonce,
     133             :                                       &denom_sig->details.blinded_cs_answer.
     134             :                                       s_scalar);
     135           2 :       denom_sig->cipher = TALER_DENOMINATION_CS;
     136             :     }
     137           2 :     return GNUNET_OK;
     138           0 :   default:
     139           0 :     GNUNET_break (0);
     140             :   }
     141           0 :   return GNUNET_SYSERR;
     142             : }
     143             : 
     144             : 
     145             : enum GNUNET_GenericReturnValue
     146           6 : TALER_denom_sig_unblind (
     147             :   struct TALER_DenominationSignature *denom_sig,
     148             :   const struct TALER_BlindedDenominationSignature *bdenom_sig,
     149             :   const union TALER_DenominationBlindingKeyP *bks,
     150             :   const struct TALER_CoinPubHashP *c_hash,
     151             :   const struct TALER_ExchangeWithdrawValues *alg_values,
     152             :   const struct TALER_DenominationPublicKey *denom_pub)
     153             : {
     154           6 :   if (bdenom_sig->cipher != denom_pub->cipher)
     155             :   {
     156           0 :     GNUNET_break (0);
     157           0 :     return GNUNET_SYSERR;
     158             :   }
     159           6 :   switch (denom_pub->cipher)
     160             :   {
     161           0 :   case TALER_DENOMINATION_INVALID:
     162           0 :     GNUNET_break (0);
     163           0 :     return GNUNET_SYSERR;
     164           3 :   case TALER_DENOMINATION_RSA:
     165             :     denom_sig->details.rsa_signature
     166           6 :       = GNUNET_CRYPTO_rsa_unblind (
     167           3 :           bdenom_sig->details.blinded_rsa_signature,
     168             :           &bks->rsa_bks,
     169             :           denom_pub->details.rsa_public_key);
     170           3 :     if (NULL == denom_sig->details.rsa_signature)
     171             :     {
     172           0 :       GNUNET_break (0);
     173           0 :       return GNUNET_SYSERR;
     174             :     }
     175           3 :     denom_sig->cipher = TALER_DENOMINATION_RSA;
     176           3 :     return GNUNET_OK;
     177           3 :   case TALER_DENOMINATION_CS:
     178             :     {
     179             :       struct GNUNET_CRYPTO_CsBlindingSecret bs[2];
     180             :       struct GNUNET_CRYPTO_CsC c[2];
     181             :       struct TALER_DenominationCSPublicRPairP r_pub_blind;
     182             : 
     183           3 :       GNUNET_CRYPTO_cs_blinding_secrets_derive (&bks->nonce,
     184             :                                                 bs);
     185           3 :       GNUNET_CRYPTO_cs_calc_blinded_c (
     186             :         bs,
     187           3 :         alg_values->details.cs_values.r_pub,
     188             :         &denom_pub->details.cs_public_key,
     189           3 :         &c_hash->hash,
     190             :         sizeof(struct GNUNET_HashCode),
     191             :         c,
     192             :         r_pub_blind.r_pub);
     193             :       denom_sig->details.cs_signature.r_point
     194           3 :         = r_pub_blind.r_pub[bdenom_sig->details.blinded_cs_answer.b];
     195           3 :       GNUNET_CRYPTO_cs_unblind (&bdenom_sig->details.blinded_cs_answer.s_scalar,
     196           3 :                                 &bs[bdenom_sig->details.blinded_cs_answer.b],
     197             :                                 &denom_sig->details.cs_signature.s_scalar);
     198           3 :       denom_sig->cipher = TALER_DENOMINATION_CS;
     199           3 :       return GNUNET_OK;
     200             :     }
     201           0 :   default:
     202           0 :     GNUNET_break (0);
     203             :   }
     204           0 :   return GNUNET_SYSERR;
     205             : }
     206             : 
     207             : 
     208             : void
     209           9 : TALER_rsa_pub_hash (const struct GNUNET_CRYPTO_RsaPublicKey *rsa,
     210             :                     struct TALER_RsaPubHashP *h_rsa)
     211             : {
     212           9 :   GNUNET_CRYPTO_rsa_public_key_hash (rsa,
     213             :                                      &h_rsa->hash);
     214             : 
     215           9 : }
     216             : 
     217             : 
     218             : void
     219          90 : TALER_cs_pub_hash (const struct GNUNET_CRYPTO_CsPublicKey *cs,
     220             :                    struct TALER_CsPubHashP *h_cs)
     221             : {
     222          90 :   GNUNET_CRYPTO_hash (cs,
     223             :                       sizeof(*cs),
     224             :                       &h_cs->hash);
     225          90 : }
     226             : 
     227             : 
     228             : void
     229          31 : TALER_denom_pub_hash (const struct TALER_DenominationPublicKey *denom_pub,
     230             :                       struct TALER_DenominationHashP *denom_hash)
     231             : {
     232          31 :   uint32_t opt[2] = {
     233          31 :     htonl (denom_pub->age_mask.bits),
     234          31 :     htonl ((uint32_t) denom_pub->cipher)
     235             :   };
     236             :   struct GNUNET_HashContext *hc;
     237             : 
     238          31 :   hc = GNUNET_CRYPTO_hash_context_start ();
     239          31 :   GNUNET_CRYPTO_hash_context_read (hc,
     240             :                                    opt,
     241             :                                    sizeof (opt));
     242          31 :   switch (denom_pub->cipher)
     243             :   {
     244          17 :   case TALER_DENOMINATION_RSA:
     245             :     {
     246             :       void *buf;
     247             :       size_t blen;
     248             : 
     249          17 :       blen = GNUNET_CRYPTO_rsa_public_key_encode (
     250          17 :         denom_pub->details.rsa_public_key,
     251             :         &buf);
     252          17 :       GNUNET_CRYPTO_hash_context_read (hc,
     253             :                                        buf,
     254             :                                        blen);
     255          17 :       GNUNET_free (buf);
     256             :     }
     257          17 :     break;
     258          14 :   case TALER_DENOMINATION_CS:
     259          14 :     GNUNET_CRYPTO_hash_context_read (hc,
     260          14 :                                      &denom_pub->details.cs_public_key,
     261             :                                      sizeof(denom_pub->details.cs_public_key));
     262          14 :     break;
     263           0 :   default:
     264           0 :     GNUNET_assert (0);
     265             :   }
     266          31 :   GNUNET_CRYPTO_hash_context_finish (hc,
     267             :                                      &denom_hash->hash);
     268          31 : }
     269             : 
     270             : 
     271             : void
     272           0 : TALER_denom_priv_to_pub (const struct TALER_DenominationPrivateKey *denom_priv,
     273             :                          const struct TALER_AgeMask age_mask,
     274             :                          struct TALER_DenominationPublicKey *denom_pub)
     275             : {
     276           0 :   switch (denom_priv->cipher)
     277             :   {
     278           0 :   case TALER_DENOMINATION_RSA:
     279           0 :     denom_pub->cipher = TALER_DENOMINATION_RSA;
     280           0 :     denom_pub->age_mask = age_mask;
     281             :     denom_pub->details.rsa_public_key
     282           0 :       = GNUNET_CRYPTO_rsa_private_key_get_public (
     283           0 :           denom_priv->details.rsa_private_key);
     284           0 :     return;
     285           0 :   case TALER_DENOMINATION_CS:
     286           0 :     denom_pub->cipher = TALER_DENOMINATION_CS;
     287           0 :     denom_pub->age_mask = age_mask;
     288           0 :     GNUNET_CRYPTO_cs_private_key_get_public (
     289             :       &denom_priv->details.cs_private_key,
     290             :       &denom_pub->details.cs_public_key);
     291           0 :     return;
     292           0 :   default:
     293           0 :     GNUNET_assert (0);
     294             :   }
     295             : }
     296             : 
     297             : 
     298             : enum GNUNET_GenericReturnValue
     299          31 : TALER_denom_blind (
     300             :   const struct TALER_DenominationPublicKey *dk,
     301             :   const union TALER_DenominationBlindingKeyP *coin_bks,
     302             :   const struct TALER_AgeCommitmentHash *ach,
     303             :   const struct TALER_CoinSpendPublicKeyP *coin_pub,
     304             :   const struct TALER_ExchangeWithdrawValues *alg_values,
     305             :   struct TALER_CoinPubHashP *c_hash,
     306             :   struct TALER_BlindedPlanchet *blinded_planchet)
     307             : {
     308          31 :   TALER_coin_pub_hash (coin_pub,
     309             :                        ach,
     310             :                        c_hash);
     311          31 :   switch (dk->cipher)
     312             :   {
     313          17 :   case TALER_DENOMINATION_RSA:
     314          17 :     blinded_planchet->cipher = dk->cipher;
     315          17 :     if (GNUNET_YES !=
     316          17 :         GNUNET_CRYPTO_rsa_blind (
     317          17 :           &c_hash->hash,
     318             :           &coin_bks->rsa_bks,
     319             :           dk->details.rsa_public_key,
     320             :           &blinded_planchet->details.rsa_blinded_planchet.blinded_msg,
     321             :           &blinded_planchet->details.rsa_blinded_planchet.blinded_msg_size))
     322             :     {
     323           0 :       GNUNET_break (0);
     324           0 :       return GNUNET_SYSERR;
     325             :     }
     326          17 :     return GNUNET_OK;
     327          14 :   case TALER_DENOMINATION_CS:
     328             :     {
     329             :       struct TALER_DenominationCSPublicRPairP blinded_r_pub;
     330             :       struct GNUNET_CRYPTO_CsBlindingSecret bs[2];
     331             : 
     332          14 :       blinded_planchet->cipher = TALER_DENOMINATION_CS;
     333          14 :       GNUNET_CRYPTO_cs_blinding_secrets_derive (&coin_bks->nonce,
     334             :                                                 bs);
     335          14 :       GNUNET_CRYPTO_cs_calc_blinded_c (
     336             :         bs,
     337          14 :         alg_values->details.cs_values.r_pub,
     338             :         &dk->details.cs_public_key,
     339             :         c_hash,
     340             :         sizeof(*c_hash),
     341          14 :         blinded_planchet->details.cs_blinded_planchet.c,
     342             :         blinded_r_pub.r_pub);
     343          14 :       return GNUNET_OK;
     344             :     }
     345           0 :   default:
     346           0 :     GNUNET_break (0);
     347           0 :     return GNUNET_SYSERR;
     348             :   }
     349             : }
     350             : 
     351             : 
     352             : enum GNUNET_GenericReturnValue
     353           6 : TALER_denom_pub_verify (const struct TALER_DenominationPublicKey *denom_pub,
     354             :                         const struct TALER_DenominationSignature *denom_sig,
     355             :                         const struct TALER_CoinPubHashP *c_hash)
     356             : {
     357           6 :   if (denom_pub->cipher != denom_sig->cipher)
     358             :   {
     359           0 :     GNUNET_break (0);
     360           0 :     return GNUNET_SYSERR;
     361             :   }
     362           6 :   switch (denom_pub->cipher)
     363             :   {
     364           0 :   case TALER_DENOMINATION_INVALID:
     365           0 :     GNUNET_break (0);
     366           0 :     return GNUNET_NO;
     367           3 :   case TALER_DENOMINATION_RSA:
     368           3 :     if (GNUNET_OK !=
     369           3 :         GNUNET_CRYPTO_rsa_verify (&c_hash->hash,
     370           3 :                                   denom_sig->details.rsa_signature,
     371           3 :                                   denom_pub->details.rsa_public_key))
     372             :     {
     373           0 :       GNUNET_log (GNUNET_ERROR_TYPE_WARNING,
     374             :                   "Coin signature is invalid\n");
     375           0 :       return GNUNET_NO;
     376             :     }
     377           3 :     return GNUNET_YES;
     378           3 :   case TALER_DENOMINATION_CS:
     379           3 :     if (GNUNET_OK !=
     380           3 :         GNUNET_CRYPTO_cs_verify (&denom_sig->details.cs_signature,
     381             :                                  &denom_pub->details.cs_public_key,
     382           3 :                                  &c_hash->hash,
     383             :                                  sizeof(struct GNUNET_HashCode)))
     384             :     {
     385           0 :       GNUNET_log (GNUNET_ERROR_TYPE_WARNING,
     386             :                   "Coin signature is invalid\n");
     387           0 :       return GNUNET_NO;
     388             :     }
     389           3 :     return GNUNET_YES;
     390           0 :   default:
     391           0 :     GNUNET_assert (0);
     392             :   }
     393             : }
     394             : 
     395             : 
     396             : void
     397         328 : TALER_denom_pub_free (struct TALER_DenominationPublicKey *denom_pub)
     398             : {
     399         328 :   switch (denom_pub->cipher)
     400             :   {
     401           0 :   case TALER_DENOMINATION_INVALID:
     402           0 :     return;
     403         164 :   case TALER_DENOMINATION_RSA:
     404         164 :     if (NULL != denom_pub->details.rsa_public_key)
     405             :     {
     406         164 :       GNUNET_CRYPTO_rsa_public_key_free (denom_pub->details.rsa_public_key);
     407         164 :       denom_pub->details.rsa_public_key = NULL;
     408             :     }
     409         164 :     denom_pub->cipher = TALER_DENOMINATION_INVALID;
     410         164 :     return;
     411         164 :   case TALER_DENOMINATION_CS:
     412         164 :     return;
     413           0 :   default:
     414           0 :     GNUNET_assert (0);
     415             :   }
     416             : }
     417             : 
     418             : 
     419             : void
     420           4 : TALER_denom_priv_free (struct TALER_DenominationPrivateKey *denom_priv)
     421             : {
     422           4 :   switch (denom_priv->cipher)
     423             :   {
     424           0 :   case TALER_DENOMINATION_INVALID:
     425           0 :     return;
     426           2 :   case TALER_DENOMINATION_RSA:
     427           2 :     if (NULL != denom_priv->details.rsa_private_key)
     428             :     {
     429           2 :       GNUNET_CRYPTO_rsa_private_key_free (denom_priv->details.rsa_private_key);
     430           2 :       denom_priv->details.rsa_private_key = NULL;
     431             :     }
     432           2 :     denom_priv->cipher = TALER_DENOMINATION_INVALID;
     433           2 :     return;
     434           2 :   case TALER_DENOMINATION_CS:
     435           2 :     return;
     436           0 :   default:
     437           0 :     GNUNET_assert (0);
     438             :   }
     439             : }
     440             : 
     441             : 
     442             : void
     443           5 : TALER_denom_sig_free (struct TALER_DenominationSignature *denom_sig)
     444             : {
     445           5 :   switch (denom_sig->cipher)
     446             :   {
     447           0 :   case TALER_DENOMINATION_INVALID:
     448           0 :     return;
     449           3 :   case TALER_DENOMINATION_RSA:
     450           3 :     if (NULL != denom_sig->details.rsa_signature)
     451             :     {
     452           3 :       GNUNET_CRYPTO_rsa_signature_free (denom_sig->details.rsa_signature);
     453           3 :       denom_sig->details.rsa_signature = NULL;
     454             :     }
     455           3 :     denom_sig->cipher = TALER_DENOMINATION_INVALID;
     456           3 :     return;
     457           2 :   case TALER_DENOMINATION_CS:
     458           2 :     return;
     459           0 :   default:
     460           0 :     GNUNET_assert (0);
     461             :   }
     462             : }
     463             : 
     464             : 
     465             : void
     466        1805 : TALER_blinded_denom_sig_free (
     467             :   struct TALER_BlindedDenominationSignature *denom_sig)
     468             : {
     469        1805 :   switch (denom_sig->cipher)
     470             :   {
     471           0 :   case TALER_DENOMINATION_INVALID:
     472           0 :     return;
     473         903 :   case TALER_DENOMINATION_RSA:
     474         903 :     if (NULL != denom_sig->details.blinded_rsa_signature)
     475             :     {
     476         903 :       GNUNET_CRYPTO_rsa_signature_free (
     477             :         denom_sig->details.blinded_rsa_signature);
     478         903 :       denom_sig->details.blinded_rsa_signature = NULL;
     479             :     }
     480         903 :     denom_sig->cipher = TALER_DENOMINATION_INVALID;
     481         903 :     return;
     482         902 :   case TALER_DENOMINATION_CS:
     483         902 :     return;
     484           0 :   default:
     485           0 :     GNUNET_assert (0);
     486             :   }
     487             : }
     488             : 
     489             : 
     490             : void
     491         162 : TALER_denom_pub_deep_copy (struct TALER_DenominationPublicKey *denom_dst,
     492             :                            const struct TALER_DenominationPublicKey *denom_src)
     493             : {
     494         162 :   *denom_dst = *denom_src; /* shallow copy */
     495         162 :   switch (denom_src->cipher)
     496             :   {
     497          81 :   case TALER_DENOMINATION_RSA:
     498             :     denom_dst->details.rsa_public_key
     499         162 :       = GNUNET_CRYPTO_rsa_public_key_dup (
     500          81 :           denom_src->details.rsa_public_key);
     501          81 :     return;
     502          81 :   case TALER_DENOMINATION_CS:
     503          81 :     return;
     504           0 :   default:
     505           0 :     GNUNET_assert (0);
     506             :   }
     507             : }
     508             : 
     509             : 
     510             : void
     511           0 : TALER_denom_sig_deep_copy (struct TALER_DenominationSignature *denom_dst,
     512             :                            const struct TALER_DenominationSignature *denom_src)
     513             : {
     514           0 :   *denom_dst = *denom_src; /* shallow copy */
     515           0 :   switch (denom_src->cipher)
     516             :   {
     517           0 :   case TALER_DENOMINATION_INVALID:
     518           0 :     return;
     519           0 :   case TALER_DENOMINATION_RSA:
     520             :     denom_dst->details.rsa_signature
     521           0 :       = GNUNET_CRYPTO_rsa_signature_dup (
     522           0 :           denom_src->details.rsa_signature);
     523           0 :     return;
     524           0 :   case TALER_DENOMINATION_CS:
     525           0 :     return;
     526           0 :   default:
     527           0 :     GNUNET_assert (0);
     528             :   }
     529             : }
     530             : 
     531             : 
     532             : void
     533           0 : TALER_blinded_denom_sig_deep_copy (
     534             :   struct TALER_BlindedDenominationSignature *denom_dst,
     535             :   const struct TALER_BlindedDenominationSignature *denom_src)
     536             : {
     537           0 :   *denom_dst = *denom_src; /* shallow copy */
     538           0 :   switch (denom_src->cipher)
     539             :   {
     540           0 :   case TALER_DENOMINATION_INVALID:
     541           0 :     return;
     542           0 :   case TALER_DENOMINATION_RSA:
     543             :     denom_dst->details.blinded_rsa_signature
     544           0 :       = GNUNET_CRYPTO_rsa_signature_dup (
     545           0 :           denom_src->details.blinded_rsa_signature);
     546           0 :     return;
     547           0 :   case TALER_DENOMINATION_CS:
     548           0 :     return;
     549           0 :   default:
     550           0 :     GNUNET_assert (0);
     551             :   }
     552             : }
     553             : 
     554             : 
     555             : int
     556           0 : TALER_denom_pub_cmp (const struct TALER_DenominationPublicKey *denom1,
     557             :                      const struct TALER_DenominationPublicKey *denom2)
     558             : {
     559           0 :   if (denom1->cipher != denom2->cipher)
     560           0 :     return (denom1->cipher > denom2->cipher) ? 1 : -1;
     561           0 :   if (denom1->age_mask.bits != denom2->age_mask.bits)
     562           0 :     return (denom1->age_mask.bits > denom2->age_mask.bits) ? 1 : -1;
     563           0 :   switch (denom1->cipher)
     564             :   {
     565           0 :   case TALER_DENOMINATION_INVALID:
     566           0 :     return 0;
     567           0 :   case TALER_DENOMINATION_RSA:
     568           0 :     return GNUNET_CRYPTO_rsa_public_key_cmp (denom1->details.rsa_public_key,
     569           0 :                                              denom2->details.rsa_public_key);
     570           0 :   case TALER_DENOMINATION_CS:
     571           0 :     return GNUNET_memcmp (&denom1->details.cs_public_key,
     572             :                           &denom2->details.cs_public_key);
     573           0 :   default:
     574           0 :     GNUNET_assert (0);
     575             :   }
     576             :   return -2;
     577             : }
     578             : 
     579             : 
     580             : int
     581           0 : TALER_denom_sig_cmp (const struct TALER_DenominationSignature *sig1,
     582             :                      const struct TALER_DenominationSignature *sig2)
     583             : {
     584           0 :   if (sig1->cipher != sig2->cipher)
     585           0 :     return (sig1->cipher > sig2->cipher) ? 1 : -1;
     586           0 :   switch (sig1->cipher)
     587             :   {
     588           0 :   case TALER_DENOMINATION_INVALID:
     589           0 :     return 0;
     590           0 :   case TALER_DENOMINATION_RSA:
     591           0 :     return GNUNET_CRYPTO_rsa_signature_cmp (sig1->details.rsa_signature,
     592           0 :                                             sig2->details.rsa_signature);
     593           0 :   case TALER_DENOMINATION_CS:
     594           0 :     return GNUNET_memcmp (&sig1->details.cs_signature,
     595             :                           &sig2->details.cs_signature);
     596           0 :   default:
     597           0 :     GNUNET_assert (0);
     598             :   }
     599             :   return -2;
     600             : }
     601             : 
     602             : 
     603             : int
     604           0 : TALER_blinded_planchet_cmp (
     605             :   const struct TALER_BlindedPlanchet *bp1,
     606             :   const struct TALER_BlindedPlanchet *bp2)
     607             : {
     608           0 :   if (bp1->cipher != bp2->cipher)
     609           0 :     return (bp1->cipher > bp2->cipher) ? 1 : -1;
     610           0 :   switch (bp1->cipher)
     611             :   {
     612           0 :   case TALER_DENOMINATION_INVALID:
     613           0 :     return 0;
     614           0 :   case TALER_DENOMINATION_RSA:
     615           0 :     if (bp1->details.rsa_blinded_planchet.blinded_msg_size !=
     616           0 :         bp2->details.rsa_blinded_planchet.blinded_msg_size)
     617           0 :       return (bp1->details.rsa_blinded_planchet.blinded_msg_size >
     618           0 :               bp2->details.rsa_blinded_planchet.blinded_msg_size) ? 1 : -1;
     619           0 :     return memcmp (bp1->details.rsa_blinded_planchet.blinded_msg,
     620           0 :                    bp2->details.rsa_blinded_planchet.blinded_msg,
     621             :                    bp1->details.rsa_blinded_planchet.blinded_msg_size);
     622           0 :   case TALER_DENOMINATION_CS:
     623           0 :     return GNUNET_memcmp (&bp1->details.cs_blinded_planchet,
     624             :                           &bp2->details.cs_blinded_planchet);
     625           0 :   default:
     626           0 :     GNUNET_assert (0);
     627             :   }
     628             :   return -2;
     629             : }
     630             : 
     631             : 
     632             : int
     633           0 : TALER_blinded_denom_sig_cmp (
     634             :   const struct TALER_BlindedDenominationSignature *sig1,
     635             :   const struct TALER_BlindedDenominationSignature *sig2)
     636             : {
     637           0 :   if (sig1->cipher != sig2->cipher)
     638           0 :     return (sig1->cipher > sig2->cipher) ? 1 : -1;
     639           0 :   switch (sig1->cipher)
     640             :   {
     641           0 :   case TALER_DENOMINATION_INVALID:
     642           0 :     return 0;
     643           0 :   case TALER_DENOMINATION_RSA:
     644           0 :     return GNUNET_CRYPTO_rsa_signature_cmp (sig1->details.blinded_rsa_signature,
     645           0 :                                             sig2->details.blinded_rsa_signature);
     646           0 :   case TALER_DENOMINATION_CS:
     647           0 :     return GNUNET_memcmp (&sig1->details.blinded_cs_answer,
     648             :                           &sig2->details.blinded_cs_answer);
     649           0 :   default:
     650           0 :     GNUNET_assert (0);
     651             :   }
     652             :   return -2;
     653             : }
     654             : 
     655             : 
     656             : void
     657           0 : TALER_blinded_planchet_hash_ (const struct TALER_BlindedPlanchet *bp,
     658             :                               struct GNUNET_HashContext *hash_context)
     659             : {
     660           0 :   uint32_t cipher = htonl (bp->cipher);
     661             : 
     662           0 :   GNUNET_CRYPTO_hash_context_read (hash_context,
     663             :                                    &cipher,
     664             :                                    sizeof (cipher));
     665           0 :   switch (bp->cipher)
     666             :   {
     667           0 :   case TALER_DENOMINATION_INVALID:
     668           0 :     break;
     669           0 :   case TALER_DENOMINATION_RSA:
     670           0 :     GNUNET_CRYPTO_hash_context_read (
     671             :       hash_context,
     672           0 :       bp->details.rsa_blinded_planchet.blinded_msg,
     673             :       bp->details.rsa_blinded_planchet.blinded_msg_size);
     674           0 :     break;
     675           0 :   case TALER_DENOMINATION_CS:
     676           0 :     GNUNET_CRYPTO_hash_context_read (
     677             :       hash_context,
     678           0 :       &bp->details.cs_blinded_planchet,
     679             :       sizeof (bp->details.cs_blinded_planchet));
     680           0 :     break;
     681           0 :   default:
     682           0 :     GNUNET_assert (0);
     683             :     break;
     684             :   }
     685           0 : }
     686             : 
     687             : 
     688             : void
     689          27 : TALER_planchet_blinding_secret_create (
     690             :   const struct TALER_PlanchetMasterSecretP *ps,
     691             :   const struct TALER_ExchangeWithdrawValues *alg_values,
     692             :   union TALER_DenominationBlindingKeyP *bks)
     693             : {
     694          27 :   switch (alg_values->cipher)
     695             :   {
     696           0 :   case TALER_DENOMINATION_INVALID:
     697           0 :     GNUNET_break (0);
     698           0 :     return;
     699          14 :   case TALER_DENOMINATION_RSA:
     700          14 :     GNUNET_assert (GNUNET_YES ==
     701             :                    GNUNET_CRYPTO_kdf (&bks->rsa_bks,
     702             :                                       sizeof (bks->rsa_bks),
     703             :                                       "bks",
     704             :                                       strlen ("bks"),
     705             :                                       ps,
     706             :                                       sizeof(*ps),
     707             :                                       NULL,
     708             :                                       0));
     709          14 :     return;
     710          13 :   case TALER_DENOMINATION_CS:
     711          13 :     GNUNET_assert (GNUNET_YES ==
     712             :                    GNUNET_CRYPTO_kdf (&bks->nonce,
     713             :                                       sizeof (bks->nonce),
     714             :                                       "bseed",
     715             :                                       strlen ("bseed"),
     716             :                                       ps,
     717             :                                       sizeof(*ps),
     718             :                                       &alg_values->details.cs_values,
     719             :                                       sizeof(alg_values->details.cs_values),
     720             :                                       NULL,
     721             :                                       0));
     722          13 :     return;
     723           0 :   default:
     724           0 :     GNUNET_break (0);
     725             :   }
     726             : }
     727             : 
     728             : 
     729             : void
     730          27 : TALER_planchet_setup_coin_priv (
     731             :   const struct TALER_PlanchetMasterSecretP *ps,
     732             :   const struct TALER_ExchangeWithdrawValues *alg_values,
     733             :   struct TALER_CoinSpendPrivateKeyP *coin_priv)
     734             : {
     735          27 :   switch (alg_values->cipher)
     736             :   {
     737          14 :   case TALER_DENOMINATION_RSA:
     738          14 :     GNUNET_assert (GNUNET_YES ==
     739             :                    GNUNET_CRYPTO_kdf (coin_priv,
     740             :                                       sizeof (*coin_priv),
     741             :                                       "coin",
     742             :                                       strlen ("coin"),
     743             :                                       ps,
     744             :                                       sizeof(*ps),
     745             :                                       NULL,
     746             :                                       0));
     747          14 :     break;
     748          13 :   case TALER_DENOMINATION_CS:
     749          13 :     GNUNET_assert (GNUNET_YES ==
     750             :                    GNUNET_CRYPTO_kdf (coin_priv,
     751             :                                       sizeof (*coin_priv),
     752             :                                       "coin",
     753             :                                       strlen ("coin"),
     754             :                                       ps,
     755             :                                       sizeof(*ps),
     756             :                                       &alg_values->details.cs_values,
     757             :                                       sizeof(alg_values->details.cs_values),
     758             :                                       NULL,
     759             :                                       0));
     760          13 :     break;
     761           0 :   default:
     762           0 :     GNUNET_break (0);
     763           0 :     return;
     764             :   }
     765             : }
     766             : 
     767             : 
     768             : void
     769          19 : TALER_blinded_planchet_free (struct TALER_BlindedPlanchet *blinded_planchet)
     770             : {
     771          19 :   switch (blinded_planchet->cipher)
     772             :   {
     773           0 :   case TALER_DENOMINATION_INVALID:
     774           0 :     GNUNET_break (0);
     775           0 :     return;
     776          17 :   case TALER_DENOMINATION_RSA:
     777          17 :     GNUNET_free (blinded_planchet->details.rsa_blinded_planchet.blinded_msg);
     778          17 :     return;
     779           2 :   case TALER_DENOMINATION_CS:
     780           2 :     memset (blinded_planchet,
     781             :             0,
     782             :             sizeof (*blinded_planchet));
     783             :     /* nothing to do for CS */
     784           2 :     return;
     785             :   }
     786           0 :   GNUNET_assert (0);
     787             : }
     788             : 
     789             : 
     790             : /* end of denom.c */

Generated by: LCOV version 1.14