aboutsummaryrefslogtreecommitdiff
path: root/src/util
diff options
context:
space:
mode:
authorChristian Grothoff <christian@grothoff.org>2015-01-28 20:23:19 +0100
committerChristian Grothoff <christian@grothoff.org>2015-01-28 20:23:19 +0100
commit62d3d352502f5b1d109b18456a87c704a70fcca5 (patch)
tree020ccf88cf701c29faa59a3f22650946e5d0eb2b /src/util
parent2debf6c3f0462a4743484c0cde7c951940e5cd2a (diff)
move coin validity test to libtalerutil
Diffstat (limited to 'src/util')
-rw-r--r--src/util/crypto.c31
1 files changed, 31 insertions, 0 deletions
diff --git a/src/util/crypto.c b/src/util/crypto.c
index 4e60d138a..8ce3ade2c 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 */