-fix
[oweals/gnunet.git] / src / gns / plugin_block_gns.c
index 19495f2439d5cc1a79eaa00c8e436aa0b1a496db..637467a5cfe8af8de982a80a4d5e01cf9e1714f2 100644 (file)
  */
 static enum GNUNET_BLOCK_EvaluationResult
 block_plugin_gns_evaluate (void *cls, enum GNUNET_BLOCK_Type type,
-                          const GNUNET_HashCode * query,
+                          const struct GNUNET_HashCode * query,
                           struct GNUNET_CONTAINER_BloomFilter **bf,
                           int32_t bf_mutator, const void *xquery,
                           size_t xquery_size, const void *reply_block,
                           size_t reply_block_size)
 {
   char* name;
-  GNUNET_HashCode pkey_hash;
-  GNUNET_HashCode query_key;
-  GNUNET_HashCode name_hash;
-  GNUNET_HashCode mhash;
-  GNUNET_HashCode chash;
+  struct GNUNET_HashCode pkey_hash_double;
+  struct GNUNET_HashCode query_key;
+  struct GNUNET_HashCode name_hash_double;
+  struct GNUNET_HashCode mhash;
+  struct GNUNET_HashCode chash;
+  struct GNUNET_CRYPTO_ShortHashCode pkey_hash;
+  struct GNUNET_CRYPTO_ShortHashCode name_hash;
   struct GNSNameRecordBlock *nrb;
   uint32_t rd_count;
   char* rd_data = NULL;
@@ -75,7 +77,7 @@ block_plugin_gns_evaluate (void *cls, enum GNUNET_BLOCK_Type type,
   uint32_t record_xquery;
   unsigned int record_match;
   
-  GNUNET_log(GNUNET_ERROR_TYPE_DEBUG, "RB SIZE %d\n", reply_block_size);
+  //GNUNET_log(GNUNET_ERROR_TYPE_DEBUG, "RB SIZE %d\n", reply_block_size);
 
   if (type != GNUNET_BLOCK_TYPE_GNS_NAMERECORD)
     return GNUNET_BLOCK_EVALUATION_TYPE_NOT_SUPPORTED;
@@ -86,35 +88,43 @@ block_plugin_gns_evaluate (void *cls, enum GNUNET_BLOCK_Type type,
      *  FIXME we could check for the record types here
      **/
     if (xquery_size < sizeof(uint32_t))
+    {
+      GNUNET_break_op (0);
       return GNUNET_BLOCK_EVALUATION_REQUEST_INVALID;
-    else
-      return GNUNET_BLOCK_EVALUATION_REQUEST_VALID;
+    }
+    return GNUNET_BLOCK_EVALUATION_REQUEST_VALID;
   }
   
   /* this is a reply */
 
   nrb = (struct GNSNameRecordBlock *)reply_block;
   name = (char*)&nrb[1];
-  GNUNET_CRYPTO_hash(&nrb->public_key,
+  GNUNET_CRYPTO_short_hash(&nrb->public_key,
                      sizeof(nrb->public_key),
                      &pkey_hash);
 
-  GNUNET_CRYPTO_hash(name, strlen(name), &name_hash);
+  GNUNET_CRYPTO_short_hash(name, strlen(name), &name_hash);
+  
+  GNUNET_CRYPTO_short_hash_double(&name_hash, &name_hash_double);
+  GNUNET_CRYPTO_short_hash_double(&pkey_hash, &pkey_hash_double);
 
-  GNUNET_CRYPTO_hash_xor(&pkey_hash, &name_hash, &query_key);
+  GNUNET_CRYPTO_hash_xor(&pkey_hash_double, &name_hash_double, &query_key);
   
   struct GNUNET_CRYPTO_HashAsciiEncoded xor_exp;
   struct GNUNET_CRYPTO_HashAsciiEncoded xor_got;
   GNUNET_CRYPTO_hash_to_enc (&query_key, &xor_exp);
   GNUNET_CRYPTO_hash_to_enc (query, &xor_got);
 
-  GNUNET_log(GNUNET_ERROR_TYPE_DEBUG,
-             "BLOCK_TEST for %s got %s expected %s\n",
-             name, (char*) &xor_got, (char*) &xor_exp);
+  //GNUNET_log(GNUNET_ERROR_TYPE_DEBUG,
+  //           "BLOCK_TEST for %s got %s expected %s\n",
+  //           name, (char*) &xor_got, (char*) &xor_exp);
 
   /* Check query key against public key */
   if (0 != GNUNET_CRYPTO_hash_cmp(query, &query_key))
+  {
+    GNUNET_break_op (0);
     return GNUNET_BLOCK_EVALUATION_RESULT_INVALID;
+  }
   
   record_match = 0;
   rd_count = ntohl(nrb->rd_count);
@@ -125,7 +135,8 @@ block_plugin_gns_evaluate (void *cls, enum GNUNET_BLOCK_Type type,
   {
     struct GNUNET_NAMESTORE_RecordData rd[rd_count];
     unsigned int i;
-    struct GNUNET_TIME_Absolute exp = GNUNET_TIME_absolute_get_forever();
+    uint64_t exp = UINT64_MAX;
+    struct GNUNET_TIME_Absolute et = GNUNET_TIME_UNIT_FOREVER_ABS;
     
     if (GNUNET_SYSERR == GNUNET_NAMESTORE_records_deserialize (rd_len,
                                                                rd_data,
@@ -143,32 +154,33 @@ block_plugin_gns_evaluate (void *cls, enum GNUNET_BLOCK_Type type,
       record_xquery = ntohl(*((uint32_t*)xquery));
     
     for (i=0; i<rd_count; i++)
-    {
-      
-      exp = GNUNET_TIME_absolute_min (exp, rd[i].expiration);
-      
+    {     
+      GNUNET_break (0 == (rd[i].flags & GNUNET_NAMESTORE_RF_RELATIVE_EXPIRATION));
+      exp = GNUNET_MIN (exp, rd[i].expiration_time);
       GNUNET_log(GNUNET_ERROR_TYPE_DEBUG,
-                 "Got record of size %d\n", rd[i].data_size);
-
+                "Got record of size %d expiration %u\n",
+     rd[i].data_size, rd[i].expiration_time);
       if ((record_xquery != 0)
           && (rd[i].record_type == record_xquery))
       {
         record_match++;
       }
     }
+    et.abs_value = exp;
     
     GNUNET_log(GNUNET_ERROR_TYPE_DEBUG,
-               "Verifying signature of %d records for name %s\n",
-               rd_count, name);
+        "Verifying signature of %d records for name %s with expiration of %u\n",
+               rd_count, name, et.abs_value);
 
     if (GNUNET_OK != GNUNET_NAMESTORE_verify_signature (&nrb->public_key,
-                                                        exp,
+                                                        et,
                                                         name,
                                                         rd_count,
                                                         rd,
                                                         &nrb->signature))
     {
-      GNUNET_log(GNUNET_ERROR_TYPE_DEBUG, "Signature invalid for name %s\n");
+      GNUNET_log(GNUNET_ERROR_TYPE_DEBUG, "Signature invalid for %s\n", name);
+      GNUNET_break_op (0);
       return GNUNET_BLOCK_EVALUATION_RESULT_INVALID;
     }
   }
@@ -179,7 +191,6 @@ block_plugin_gns_evaluate (void *cls, enum GNUNET_BLOCK_Type type,
     GNUNET_BLOCK_mingle_hash(&chash, bf_mutator, &mhash);
     if (NULL != *bf)
     {
-      GNUNET_log(GNUNET_ERROR_TYPE_DEBUG, "Check BF\n");
       if (GNUNET_YES == GNUNET_CONTAINER_bloomfilter_test(*bf, &mhash))
         return GNUNET_BLOCK_EVALUATION_OK_DUPLICATE;
     }
@@ -207,20 +218,26 @@ block_plugin_gns_evaluate (void *cls, enum GNUNET_BLOCK_Type type,
 static int
 block_plugin_gns_get_key (void *cls, enum GNUNET_BLOCK_Type type,
                          const void *block, size_t block_size,
-                         GNUNET_HashCode * key)
+                         struct GNUNET_HashCode * key)
 {
   if (type != GNUNET_BLOCK_TYPE_GNS_NAMERECORD)
     return GNUNET_SYSERR;
-  GNUNET_HashCode name_hash;
-  GNUNET_HashCode pkey_hash;
+  struct GNUNET_CRYPTO_ShortHashCode name_hash;
+  struct GNUNET_CRYPTO_ShortHashCode pkey_hash;
+  struct GNUNET_HashCode name_hash_double;
+  struct GNUNET_HashCode pkey_hash_double;
+
   struct GNSNameRecordBlock *nrb = (struct GNSNameRecordBlock *)block;
 
-  GNUNET_CRYPTO_hash(&nrb[1], strlen((char*)&nrb[1]), &name_hash);
-  GNUNET_CRYPTO_hash(&nrb->public_key,
+  GNUNET_CRYPTO_short_hash(&nrb[1], strlen((char*)&nrb[1]), &name_hash);
+  GNUNET_CRYPTO_short_hash(&nrb->public_key,
                      sizeof(struct GNUNET_CRYPTO_RsaPublicKeyBinaryEncoded),
                      &pkey_hash);
+  
+  GNUNET_CRYPTO_short_hash_double(&name_hash, &name_hash_double);
+  GNUNET_CRYPTO_short_hash_double(&pkey_hash, &pkey_hash_double);
 
-  GNUNET_CRYPTO_hash_xor(&name_hash, &pkey_hash, key);
+  GNUNET_CRYPTO_hash_xor(&name_hash_double, &pkey_hash_double, key);
   
   return GNUNET_OK;
 }