changing time measurement from milliseconds to microseconds
[oweals/gnunet.git] / src / gns / gnunet-service-gns.c
index 5ce08908036bf673297ffebd97b430594f2eb849..1bff3e51d17eac99065d512c5b9158999969f9f1 100644 (file)
@@ -168,7 +168,7 @@ struct ClientLookupHandle
   /**
    * optional zone private key used for shorten
    */
-  struct GNUNET_CRYPTO_RsaPrivateKey *shorten_key;
+  struct GNUNET_CRYPTO_EccPrivateKey *shorten_key;
 
   /**
    * the name to look up
@@ -205,7 +205,7 @@ static struct GNUNET_DHT_Handle *dht_handle;
 /**
  * Our zone's private key
  */
-static struct GNUNET_CRYPTO_RsaPrivateKey *zone_key;
+static struct GNUNET_CRYPTO_EccPrivateKey *zone_key;
 
 /**
  * Our handle to the namestore service
@@ -306,7 +306,7 @@ shutdown_task (void *cls, const struct GNUNET_SCHEDULER_TaskContext *tc)
   struct ClientShortenHandle *csh_tmp;
 
   GNUNET_log(GNUNET_ERROR_TYPE_DEBUG,
-             "Shutting down!");
+             "Shutting down!\n");
   while (NULL != (csh_tmp = csh_head))
   {
     GNUNET_CONTAINER_DLL_remove (csh_head, csh_tail, csh_tmp);
@@ -382,12 +382,12 @@ publish_zone_dht_start (void *cls,
  */
 static void
 put_gns_record (void *cls,
-                const struct GNUNET_CRYPTO_RsaPublicKeyBinaryEncoded *key,
+                const struct GNUNET_CRYPTO_EccPublicKey *key,
                 struct GNUNET_TIME_Absolute expiration,
                 const char *name,
                 unsigned int rd_count,
                 const struct GNUNET_NAMESTORE_RecordData *rd,
-                const struct GNUNET_CRYPTO_RsaSignature *signature)
+                const struct GNUNET_CRYPTO_EccSignature *signature)
 {  
   struct GNSNameRecordBlock *nrb;
   struct GNUNET_CRYPTO_ShortHashCode zhash;
@@ -427,7 +427,7 @@ put_gns_record (void *cls,
                GNUNET_STRINGS_relative_time_to_string (put_interval, GNUNET_YES));
     GNUNET_STATISTICS_set (statistics,
                            "Current zone iteration interval (in ms)",
-                           put_interval.rel_value,
+                           put_interval.rel_value_us / 1000LL,
                            GNUNET_NO);
     GNUNET_STATISTICS_update (statistics,
                               "Number of zone iterations", 1, GNUNET_NO);
@@ -462,6 +462,17 @@ put_gns_record (void *cls,
     return;
   }
   
+  /* TODO 2) AB: New publishing
+   *
+   * - Use new signature S_d
+   * - Obtain new derived public key V = H(H(i,Q) * Q)
+   * - Obtain HKDF(i,Q)
+   * - Compute encrypte record block E with HKDF(i,Q) (rd, rd_count)
+   * - Create block B = |V,E,S_d|
+   * - Compute new DHT key H(V) in TODO 3)
+   *
+   * -> Put (H(V), B)
+   */
   GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
              "Putting records for `%s' into the DHT\n", name); 
   rd_payload_length = GNUNET_NAMESTORE_records_get_size (rd_count, rd); 
@@ -475,7 +486,7 @@ put_gns_record (void *cls,
   nrb_data += namelen;
   rd_payload_length += sizeof(struct GNSNameRecordBlock) + namelen;
   GNUNET_CRYPTO_short_hash (key,
-                           sizeof (struct GNUNET_CRYPTO_RsaPublicKeyBinaryEncoded),
+                           sizeof (struct GNUNET_CRYPTO_EccPublicKey),
                            &zhash);
   if (-1 == GNUNET_NAMESTORE_records_serialize (rd_count,
                                                 rd,
@@ -491,7 +502,7 @@ put_gns_record (void *cls,
                                                    NULL);
     return;
   }
-
+  /* TODO AB: Here records are put in the DHT: modify dht_key to H(key) = H(H(name,zone) * zone) */
   GNUNET_GNS_get_key_for_record (name, &zhash, &dht_key);
   GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
              "putting %u records from zone %s for `%s' under key: %s with size %u and timeout %s\n",
@@ -534,7 +545,7 @@ put_gns_record (void *cls,
 
   GNUNET_STATISTICS_set (statistics,
                         "Current zone iteration interval (ms)",
-                        next_put_interval.rel_value,
+                        next_put_interval.rel_value_us / 1000LL,
                         GNUNET_NO); 
   zone_publish_task = GNUNET_SCHEDULER_add_delayed (next_put_interval,
                                                    &publish_zone_dht_next,
@@ -626,12 +637,12 @@ send_shorten_response (void* cls, const char* name)
  */
 static void
 process_shorten_in_private_zone_lookup (void *cls,
-                                       const struct GNUNET_CRYPTO_RsaPublicKeyBinaryEncoded *key,
+                                       const struct GNUNET_CRYPTO_EccPublicKey *key,
                                        struct GNUNET_TIME_Absolute expiration,
                                        const char *name,
                                        unsigned int rd_count,
                                        const struct GNUNET_NAMESTORE_RecordData *rd,
-                                       const struct GNUNET_CRYPTO_RsaSignature *signature)
+                                       const struct GNUNET_CRYPTO_EccSignature *signature)
 {
   struct ClientShortenHandle *csh = cls;
   struct GNUNET_CRYPTO_ShortHashCode *szone = &csh->shorten_zone;
@@ -682,12 +693,12 @@ process_shorten_in_private_zone_lookup (void *cls,
  */
 static void
 process_shorten_in_root_zone_lookup (void *cls,
-                                    const struct GNUNET_CRYPTO_RsaPublicKeyBinaryEncoded *key,
+                                    const struct GNUNET_CRYPTO_EccPublicKey *key,
                                     struct GNUNET_TIME_Absolute expiration,
                                     const char *name,
                                     unsigned int rd_count,
                                     const struct GNUNET_NAMESTORE_RecordData *rd,
-                                    const struct GNUNET_CRYPTO_RsaSignature *signature)
+                                    const struct GNUNET_CRYPTO_EccSignature *signature)
 {
   struct ClientShortenHandle *csh = cls;
   struct GNUNET_CRYPTO_ShortHashCode *szone = &csh->shorten_zone;
@@ -738,12 +749,12 @@ process_shorten_in_root_zone_lookup (void *cls,
  */
 static void
 process_private_in_root_zone_lookup (void *cls,
-                                    const struct GNUNET_CRYPTO_RsaPublicKeyBinaryEncoded *key,
+                                    const struct GNUNET_CRYPTO_EccPublicKey *key,
                                     struct GNUNET_TIME_Absolute expiration,
                                     const char *name,
                                     unsigned int rd_count,
                                     const struct GNUNET_NAMESTORE_RecordData *rd,
-                                    const struct GNUNET_CRYPTO_RsaSignature *signature)
+                                    const struct GNUNET_CRYPTO_EccSignature *signature)
 {
   struct ClientShortenHandle *csh = cls;
 
@@ -1036,7 +1047,7 @@ send_lookup_response (void* cls,
   GNUNET_free(clh->name);
   
   if (NULL != clh->shorten_key)
-    GNUNET_CRYPTO_rsa_key_free (clh->shorten_key);
+    GNUNET_CRYPTO_ecc_key_free (clh->shorten_key);
   GNUNET_free (clh);
   GNUNET_STATISTICS_update (statistics,
                             "Completed lookups", 1, GNUNET_NO);
@@ -1064,9 +1075,7 @@ handle_lookup (void *cls,
   char* nameptr = name;
   const char *utf_in;
   int only_cached;
-  struct GNUNET_CRYPTO_RsaPrivateKey *key;
-  struct GNUNET_CRYPTO_RsaPrivateKeyBinaryEncoded *pkey;
-  char* tmp_pkey;
+  const struct GNUNET_CRYPTO_EccPrivateKey *key;
   uint16_t msg_size;
   const struct GNUNET_GNS_ClientLookupMessage *sh_msg;
   
@@ -1083,23 +1092,20 @@ handle_lookup (void *cls,
   GNUNET_SERVER_notification_context_add (nc, client);
   if (GNUNET_YES == ntohl (sh_msg->have_key))
   {
-    pkey = (struct GNUNET_CRYPTO_RsaPrivateKeyBinaryEncoded *) &sh_msg[1];
-    tmp_pkey = (char*) &sh_msg[1];
-    key = GNUNET_CRYPTO_rsa_decode_key (tmp_pkey, ntohs (pkey->len));
-    GNUNET_STRINGS_utf8_tolower (&tmp_pkey[ntohs (pkey->len)], &nameptr);
+    key = &sh_msg->shorten_key;
   }
   else
   {
     key = NULL;
-    utf_in = (const char *) &sh_msg[1];
-    if ('\0' != utf_in[msg_size - sizeof (struct GNUNET_GNS_ClientLookupMessage) - 1])
-    {
-      GNUNET_break (0);
-      GNUNET_SERVER_receive_done (client, GNUNET_SYSERR);
-      return;
-    }  
-    GNUNET_STRINGS_utf8_tolower (utf_in, &nameptr);
   }
+  utf_in = (const char *) &sh_msg[1];
+  if ('\0' != utf_in[msg_size - sizeof (struct GNUNET_GNS_ClientLookupMessage) - 1])
+  {
+    GNUNET_break (0);
+    GNUNET_SERVER_receive_done (client, GNUNET_SYSERR);
+    return;
+  }  
+  GNUNET_STRINGS_utf8_tolower (utf_in, &nameptr);
   
   namelen = strlen (name) + 1;
   clh = GNUNET_malloc (sizeof (struct ClientLookupHandle));
@@ -1109,8 +1115,11 @@ handle_lookup (void *cls,
   strcpy (clh->name, name);
   clh->request_id = sh_msg->id;
   clh->type = ntohl (sh_msg->type);
-  clh->shorten_key = key;
-
+  if (NULL != key)
+  {
+    clh->shorten_key = GNUNET_new (struct GNUNET_CRYPTO_EccPrivateKey);
+    *clh->shorten_key = *key;
+  }
   only_cached = ntohl (sh_msg->only_cached);
   
   if (strlen (name) > GNUNET_DNSPARSER_MAX_NAME_LENGTH) {
@@ -1141,7 +1150,7 @@ handle_lookup (void *cls,
     return;
   }
   
-  if (1 == ntohl (sh_msg->use_default_zone))
+  if (GNUNET_NO == ntohl (sh_msg->have_zone))
     clh->zone = zone_hash;  /* Default zone */
   else
     clh->zone = sh_msg->zone;
@@ -1184,7 +1193,7 @@ run (void *cls, struct GNUNET_SERVER_Handle *server,
     {&handle_get_authority, NULL, GNUNET_MESSAGE_TYPE_GNS_GET_AUTH, 0}
   };
   char* keyfile;
-  struct GNUNET_CRYPTO_RsaPublicKeyBinaryEncoded pkey;
+  struct GNUNET_CRYPTO_EccPublicKey pkey;
   unsigned long long max_parallel_bg_queries = 0;
   int ignore_pending = GNUNET_NO;
 
@@ -1203,11 +1212,11 @@ run (void *cls, struct GNUNET_SERVER_Handle *server,
   GNUNET_log(GNUNET_ERROR_TYPE_DEBUG,
              "Using keyfile %s for root zone.\n", keyfile);
 
-  zone_key = GNUNET_CRYPTO_rsa_key_create_from_file (keyfile);
-  GNUNET_CRYPTO_rsa_key_get_public (zone_key, &pkey);
-  GNUNET_CRYPTO_short_hash(&pkey,
-                     sizeof(struct GNUNET_CRYPTO_RsaPublicKeyBinaryEncoded),
-                     &zone_hash);
+  zone_key = GNUNET_CRYPTO_ecc_key_create_from_file (keyfile);
+  GNUNET_CRYPTO_ecc_key_get_public (zone_key, &pkey);
+  GNUNET_CRYPTO_short_hash (&pkey,
+                           sizeof(struct GNUNET_CRYPTO_EccPublicKey),
+                           &zone_hash);
   GNUNET_free(keyfile);
   namestore_handle = GNUNET_NAMESTORE_connect (c);
   if (NULL == namestore_handle)