gnunet-svn
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[GNUnet-SVN] [taler-exchange] branch master updated: implement checking


From: gnunet
Subject: [GNUnet-SVN] [taler-exchange] branch master updated: implement checking of denomination revocation status in auditor
Date: Sat, 08 Apr 2017 22:52:34 +0200

This is an automated email from the git hooks/post-receive script.

grothoff pushed a commit to branch master
in repository exchange.

The following commit(s) were added to refs/heads/master by this push:
     new 11b8710  implement checking of denomination revocation status in 
auditor
11b8710 is described below

commit 11b8710a5caac9c81cb0eb6094b363fa46a74809
Author: Christian Grothoff <address@hidden>
AuthorDate: Sat Apr 8 22:52:32 2017 +0200

    implement checking of denomination revocation status in auditor
---
 src/auditor/taler-auditor.c                  | 41 +++++++++++++++++-
 src/exchange-tools/taler-exchange-keycheck.c |  4 +-
 src/exchange-tools/taler-exchange-keyup.c    |  6 +--
 src/exchange/taler-exchange-httpd_keystate.c | 64 ++++++++++++++++++++++------
 src/exchangedb/exchangedb_denomkeys.c        |  7 ++-
 src/exchangedb/test_exchangedb_denomkeys.c   |  4 +-
 src/include/taler_exchangedb_lib.h           |  4 +-
 src/include/taler_exchangedb_plugin.h        |  2 +
 8 files changed, 106 insertions(+), 26 deletions(-)

diff --git a/src/auditor/taler-auditor.c b/src/auditor/taler-auditor.c
index 5576bd6..c4fb025 100644
--- a/src/auditor/taler-auditor.c
+++ b/src/auditor/taler-auditor.c
@@ -831,6 +831,8 @@ handle_payback_by_reserve (void *cls,
   struct ReserveSummary *rs;
   struct GNUNET_TIME_Absolute expiry;
   struct TALER_PaybackRequestPS pr;
+  struct TALER_MasterSignatureP msig;
+  int ret;
 
   /* should be monotonically increasing */
   GNUNET_assert (rowid >= pp.last_reserve_payback_serial_id);
@@ -859,7 +861,44 @@ handle_payback_by_reserve (void *cls,
                               rowid,
                               "coin payback signature invalid");
   }
-  /* TODO: check that the coin was eligible for payback! #3887!*/
+
+  /* check that the coin was eligible for payback!*/
+  ret = edb->get_denomination_revocation (edb->cls,
+                                          esession,
+                                          &pr.h_denom_pub,
+                                          &msig);
+  if (GNUNET_SYSERR == ret)
+  {
+    GNUNET_break (0);
+    return GNUNET_SYSERR;
+  }
+  if (GNUNET_NO == ret)
+  {
+    report_row_inconsistency ("payback",
+                              rowid,
+                              "denomination key not in revocation set");
+  }
+  else
+  {
+    /* verify msig */
+    struct TALER_MasterDenominationKeyRevocation kr;
+
+    kr.purpose.purpose = htonl 
(TALER_SIGNATURE_MASTER_DENOMINATION_KEY_REVOKED);
+    kr.purpose.size = htonl (sizeof (kr));
+    kr.h_denom_pub = pr.h_denom_pub;
+    if (GNUNET_OK !=
+        GNUNET_CRYPTO_eddsa_verify 
(TALER_SIGNATURE_MASTER_DENOMINATION_KEY_REVOKED,
+                                    &kr.purpose,
+                                    &msig.eddsa_signature,
+                                    &master_pub.eddsa_pub))
+    {
+      report_row_inconsistency ("denomination_revocations",
+                                0, /* FIXME: modify DB API to return rowid! 
(#4984) */
+                                "master signature invalid");
+    }
+    /* TODO: cache result so we don't do this every time! (#4983) */
+  }
+
 
   GNUNET_CRYPTO_hash (reserve_pub,
                       sizeof (*reserve_pub),
diff --git a/src/exchange-tools/taler-exchange-keycheck.c 
b/src/exchange-tools/taler-exchange-keycheck.c
index 3286cff..8018e35 100644
--- a/src/exchange-tools/taler-exchange-keycheck.c
+++ b/src/exchange-tools/taler-exchange-keycheck.c
@@ -122,7 +122,7 @@ exchange_signkeys_check ()
  * @param cls closure (NULL)
  * @param dki the denomination key
  * @param alias coin alias
- * @param was_revoked #GNUNET_YES if the @a dki was revoked and wallets should 
trigger /payback
+ * @param revocation_master_sig non-NULL if @a dki was revoked
  * @return #GNUNET_OK to continue to iterate,
  *  #GNUNET_NO to stop iteration with no error,
  *  #GNUNET_SYSERR to abort iteration with error!
@@ -131,7 +131,7 @@ static int
 denomkeys_iter (void *cls,
                 const char *alias,
                 const struct TALER_EXCHANGEDB_DenominationKeyIssueInformation 
*dki,
-                int was_revoked)
+                const struct TALER_MasterSignatureP *revocation_master_sig)
 {
   struct GNUNET_HashCode hc;
 
diff --git a/src/exchange-tools/taler-exchange-keyup.c 
b/src/exchange-tools/taler-exchange-keyup.c
index abf8793..f5e5961 100644
--- a/src/exchange-tools/taler-exchange-keyup.c
+++ b/src/exchange-tools/taler-exchange-keyup.c
@@ -1054,7 +1054,7 @@ struct RevokeClosure
  * @param cls a `struct RevokeClosure` with information about what to revoke
  * @param dki the denomination key
  * @param alias coin alias
- * @param was_revoked #GNUNET_YES if the @a dki was revoked and wallets should 
trigger /payback
+ * @param revocation_master_sig non-NULL if @a dki was revoked
  * @return #GNUNET_OK to continue to iterate,
  *  #GNUNET_NO to stop iteration with no error,
  *  #GNUNET_SYSERR to abort iteration with error!
@@ -1063,11 +1063,11 @@ static int
 exchange_keys_revoke_by_dki (void *cls,
                              const char *alias,
                              const struct 
TALER_EXCHANGEDB_DenominationKeyIssueInformation *dki,
-                             int was_revoked)
+                             const struct TALER_MasterSignatureP 
*revocation_master_sig)
 {
   struct RevokeClosure *rc = cls;
 
-  if (GNUNET_YES == was_revoked)
+  if (NULL != revocation_master_sig)
     return GNUNET_OK; /* refuse to do it twice */
   if (0 != memcmp (rc->hc,
                    &dki->issue.properties.denom_hash,
diff --git a/src/exchange/taler-exchange-httpd_keystate.c 
b/src/exchange/taler-exchange-httpd_keystate.c
index a2025c9..2b70195 100644
--- a/src/exchange/taler-exchange-httpd_keystate.c
+++ b/src/exchange/taler-exchange-httpd_keystate.c
@@ -261,7 +261,7 @@ store_in_map (struct GNUNET_CONTAINER_MultiHashMap *map,
  * @param cls closure
  * @param dki the denomination key issue
  * @param alias coin alias
- * @param was_revoked #GNUNET_YES if @a dki has been revoked
+ * @param revocation_master_sig non-NULL if @a dki was revoked
  * @return #GNUNET_OK to continue to iterate,
  *  #GNUNET_NO to stop iteration with no error,
  *  #GNUNET_SYSERR to abort iteration with error!
@@ -270,7 +270,7 @@ static int
 reload_keys_denom_iter (void *cls,
                         const char *alias,
                         const struct 
TALER_EXCHANGEDB_DenominationKeyIssueInformation *dki,
-                        int was_revoked)
+                        const struct TALER_MasterSignatureP 
*revocation_master_sig)
 {
   struct TEH_KS_StateHandle *ctx = cls;
   struct GNUNET_TIME_Absolute now;
@@ -292,12 +292,61 @@ reload_keys_denom_iter (void *cls,
                 alias);
     return GNUNET_OK;
   }
-  if (GNUNET_YES == was_revoked)
+  if (0 != memcmp (&dki->issue.properties.master,
+                   &TEH_master_public_key,
+                   sizeof (struct TALER_MasterPublicKeyP)))
+  {
+    GNUNET_log (GNUNET_ERROR_TYPE_ERROR,
+                "Master key in denomination key file `%s' does not match! 
Skipping it.\n",
+                alias);
+    return GNUNET_OK;
+  }
+
+  session = TEH_plugin->get_session (TEH_plugin->cls);
+  if (NULL == session)
+    return GNUNET_SYSERR;
+
+  if (NULL != revocation_master_sig)
   {
     res = store_in_map (ctx->revoked_map,
                         dki);
     if (GNUNET_NO == res)
       return GNUNET_OK;
+    /* Try to insert DKI into DB until we succeed; note that if the DB
+       failure is persistent, this code may loop forever (as there is no
+       sane alternative, we cannot continue without the DKI being in the
+       DB). */
+    res = GNUNET_SYSERR;
+    while (GNUNET_OK != res)
+    {
+      res = TEH_plugin->start (TEH_plugin->cls,
+                               session);
+      if (GNUNET_OK != res)
+      {
+        /* Transaction start failed!? Very bad error, log and retry */
+        GNUNET_break (0);
+        continue;
+      }
+      res = TEH_plugin->insert_denomination_revocation (TEH_plugin->cls,
+                                                        session,
+                                                        
&dki->issue.properties.denom_hash,
+                                                        revocation_master_sig);
+      if (GNUNET_SYSERR == res)
+      {
+        GNUNET_break (0);
+        TEH_plugin->rollback (TEH_plugin->cls,
+                              session);
+        continue;
+      }
+      if (GNUNET_NO == res)
+      {
+        TEH_plugin->rollback (TEH_plugin->cls,
+                              session);
+        break; /* already in is also OK! */
+      }
+      res = TEH_plugin->commit (TEH_plugin->cls,
+                                session);
+    }
     GNUNET_assert (0 ==
                    json_array_append_new (ctx->payback_array,
                                           GNUNET_JSON_from_data_auto 
(&dki->issue.properties.denom_hash)));
@@ -319,15 +368,6 @@ reload_keys_denom_iter (void *cls,
                                    &denom_key_hash,
                                    sizeof (struct GNUNET_HashCode));
 
-  if (0 != memcmp (&dki->issue.properties.master,
-                   &TEH_master_public_key,
-                   sizeof (struct TALER_MasterPublicKeyP)))
-  {
-    GNUNET_log (GNUNET_ERROR_TYPE_ERROR,
-                "Master key in denomination key file `%s' does not match! 
Skipping it.\n",
-                alias);
-    return GNUNET_OK;
-  }
 
 
   session = TEH_plugin->get_session (TEH_plugin->cls);
diff --git a/src/exchangedb/exchangedb_denomkeys.c 
b/src/exchangedb/exchangedb_denomkeys.c
index bfc3ab8..0179602 100644
--- a/src/exchangedb/exchangedb_denomkeys.c
+++ b/src/exchangedb/exchangedb_denomkeys.c
@@ -257,7 +257,7 @@ denomkeys_iterate_keydir_iter (void *cls,
   char *rev;
   struct TALER_MasterSignatureP msig;
   struct TALER_MasterDenominationKeyRevocation rm;
-  int revoked;
+  const struct TALER_MasterSignatureP *revoked;
 
   if ( (strlen(filename) > strlen (".rev")) &&
        (0 == strcmp (&filename[strlen(filename) - strlen (".rev")],
@@ -278,7 +278,7 @@ denomkeys_iterate_keydir_iter (void *cls,
   GNUNET_asprintf (&rev,
                    "%s.rev",
                    filename);
-  revoked = GNUNET_NO;
+  revoked = NULL;
   if (GNUNET_YES == GNUNET_DISK_file_test (rev))
   {
     /* Check if revocation is valid... */
@@ -311,10 +311,9 @@ denomkeys_iterate_keydir_iter (void *cls,
         GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
                     "Denomination key `%s' was revoked!\n",
                    filename);
-        revoked = GNUNET_YES;
+        revoked = &msig;
       }
     }
-
   }
   GNUNET_free (rev);
   ret = dic->it (dic->it_cls,
diff --git a/src/exchangedb/test_exchangedb_denomkeys.c 
b/src/exchangedb/test_exchangedb_denomkeys.c
index e7803c2..fb72811 100644
--- a/src/exchangedb/test_exchangedb_denomkeys.c
+++ b/src/exchangedb/test_exchangedb_denomkeys.c
@@ -38,7 +38,7 @@
  * @param cls closure with expected DKI
  * @param dki the denomination key
  * @param alias coin alias
- * @param was_revoked #GNUNET_YES if revoked
+ * @param revocation_master_sig non-NULL if @a dki was revoked
  * @return #GNUNET_OK to continue to iterate,
  *  #GNUNET_NO to stop iteration with no error,
  *  #GNUNET_SYSERR to abort iteration with error!
@@ -47,7 +47,7 @@ static int
 dki_iter (void *cls,
           const char *alias,
           const struct TALER_EXCHANGEDB_DenominationKeyIssueInformation *dki,
-          int was_revoked)
+          const struct TALER_MasterSignatureP *revocation_master_sig)
 {
   const struct TALER_EXCHANGEDB_DenominationKeyIssueInformation *exp = cls;
 
diff --git a/src/include/taler_exchangedb_lib.h 
b/src/include/taler_exchangedb_lib.h
index d70270e..70ae363 100644
--- a/src/include/taler_exchangedb_lib.h
+++ b/src/include/taler_exchangedb_lib.h
@@ -162,7 +162,7 @@ TALER_EXCHANGEDB_signing_key_write (const char 
*exchange_base_dir,
  * @param cls closure
  * @param alias coin alias
  * @param dki the denomination key
- * @param was_revoked #GNUNET_YES if the @a dki was revoked and wallets should 
trigger /payback
+ * @param revocation_master_sig non-NULL if @a dki was revoked
  * @return #GNUNET_OK to continue to iterate,
  *  #GNUNET_NO to stop iteration with no error,
  *  #GNUNET_SYSERR to abort iteration with error!
@@ -171,7 +171,7 @@ typedef int
 (*TALER_EXCHANGEDB_DenominationKeyIterator)(void *cls,
                                             const char *alias,
                                             const struct 
TALER_EXCHANGEDB_DenominationKeyIssueInformation *dki,
-                                            int was_revoked);
+                                            const struct 
TALER_MasterSignatureP *revocation_master_sig);
 
 
 /**
diff --git a/src/include/taler_exchangedb_plugin.h 
b/src/include/taler_exchangedb_plugin.h
index 40499b2..a529537 100644
--- a/src/include/taler_exchangedb_plugin.h
+++ b/src/include/taler_exchangedb_plugin.h
@@ -2030,6 +2030,8 @@ struct TALER_EXCHANGEDB_Plugin
                                     struct TALER_EXCHANGEDB_Session *session,
                                     const struct GNUNET_HashCode 
*denom_pub_hash,
                                     const struct TALER_MasterSignatureP 
*master_sig);
+
+
   /**
    * Obtain information about a denomination key's revocation from
    * the database.

-- 
To stop receiving notification emails like this one, please contact
address@hidden



reply via email to

[Prev in Thread] Current Thread [Next in Thread]