diff options
| author | Christian Grothoff <christian@grothoff.org> | 2015-01-28 20:23:19 +0100 | 
|---|---|---|
| committer | Christian Grothoff <christian@grothoff.org> | 2015-01-28 20:23:19 +0100 | 
| commit | 62d3d352502f5b1d109b18456a87c704a70fcca5 (patch) | |
| tree | 020ccf88cf701c29faa59a3f22650946e5d0eb2b /src/util | |
| parent | 2debf6c3f0462a4743484c0cde7c951940e5cd2a (diff) | |
move coin validity test to libtalerutil
Diffstat (limited to 'src/util')
| -rw-r--r-- | src/util/crypto.c | 31 | 
1 files changed, 31 insertions, 0 deletions
diff --git a/src/util/crypto.c b/src/util/crypto.c index 4e60d138..8ce3ade2 100644 --- a/src/util/crypto.c +++ b/src/util/crypto.c @@ -267,4 +267,35 @@ TALER_refresh_encrypt (const struct TALER_RefreshLinkDecrypted *input,  } +/** + * 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) +{ +  struct GNUNET_HashCode c_hash; + +  /* FIXME: we had envisioned a more complex scheme... */ +  GNUNET_CRYPTO_hash (&coin_public_info->coin_pub, +                      sizeof (struct GNUNET_CRYPTO_EcdsaPublicKey), +                      &c_hash); +  if (GNUNET_OK != +      GNUNET_CRYPTO_rsa_verify (&c_hash, +                                coin_public_info->denom_sig, +                                coin_public_info->denom_pub)) +  { +    GNUNET_log (GNUNET_ERROR_TYPE_WARNING, +                "coin signature is invalid\n"); +    return GNUNET_NO; +  } +  return GNUNET_YES; +} + +  /* end of crypto.c */  | 
