-indentation, code cleanup
[oweals/gnunet.git] / src / gns / gnunet-service-gns_resolver.c
index 110263eeefb9b3be47972da345fba6d8efeb0484..6ff2d8791102b602f01eed0457b35847b35404ea 100644 (file)
  * TODO:
  * - GNS: handle special SRV names --- no delegation, direct lookup;
  *        can likely be done in 'resolver_lookup_get_next_label'. (#3003)
- * - revocation checks (use CORE-level broadcasts!), (#3004)
+ * - revocation checks (use REVOCATION service!), (#3004)
  * - DNAME support (#3005)
  */
 #include "platform.h"
 #include "gnunet_util_lib.h"
 #include "gnunet_dnsstub_lib.h"
 #include "gnunet_dht_service.h"
+#include "gnunet_gnsrecord_lib.h"
+#include "gnunet_namecache_service.h"
 #include "gnunet_namestore_service.h"
 #include "gnunet_dns_service.h"
 #include "gnunet_resolver_service.h"
@@ -93,10 +95,10 @@ struct AuthorityChain
   struct GNS_ResolverHandle *rh;
 
   /**
-   * label/name corresponding to the authority 
+   * label/name corresponding to the authority
    */
   char *label;
-  
+
   /**
    * #GNUNET_YES if the authority was a GNS authority,
    * #GNUNET_NO if the authority was a DNS authority.
@@ -110,9 +112,9 @@ struct AuthorityChain
   {
 
     /**
-     * The zone of the GNS authority 
+     * The zone of the GNS authority
      */
-    struct GNUNET_CRYPTO_EccPublicSignKey gns_authority;
+    struct GNUNET_CRYPTO_EcdsaPublicKey gns_authority;
 
     struct
     {
@@ -133,7 +135,7 @@ struct AuthorityChain
     } dns_authority;
 
   } authority_info;
-  
+
 };
 
 
@@ -180,10 +182,10 @@ struct DnsResult
 /**
  * Closure for #vpn_allocation_cb.
  */
-struct VpnContext 
+struct VpnContext
 {
 
-  /** 
+  /**
    * Which resolution process are we processing.
    */
   struct GNS_ResolverHandle *rh;
@@ -194,17 +196,17 @@ struct VpnContext
   struct GNUNET_VPN_RedirectionRequest *vpn_request;
 
   /**
-   * Number of records serialized in 'rd_data'.
+   * Number of records serialized in @e rd_data.
    */
   unsigned int rd_count;
-  
+
   /**
    * Serialized records.
    */
   char *rd_data;
-  
+
   /**
-   * Number of bytes in 'rd_data'.
+   * Number of bytes in @e rd_data.
    */
   size_t rd_data_size;
 };
@@ -212,38 +214,38 @@ struct VpnContext
 
 /**
  * Handle to a currenty pending resolution.  On result (positive or
- * negative) the #GNS_ResultProcessor is called.  
+ * negative) the #GNS_ResultProcessor is called.
  */
 struct GNS_ResolverHandle
 {
 
   /**
-   * DLL 
+   * DLL
    */
   struct GNS_ResolverHandle *next;
 
   /**
-   * DLL 
+   * DLL
    */
   struct GNS_ResolverHandle *prev;
 
   /**
-   * The top-level GNS authoritative zone to query 
+   * The top-level GNS authoritative zone to query
    */
-  struct GNUNET_CRYPTO_EccPublicSignKey authority_zone;
+  struct GNUNET_CRYPTO_EcdsaPublicKey authority_zone;
 
   /**
-   * called when resolution phase finishes 
+   * called when resolution phase finishes
    */
   GNS_ResultProcessor proc;
-  
+
   /**
-   * closure passed to proc 
+   * closure passed to proc
    */
   void* proc_cls;
 
   /**
-   * Handle for DHT lookups. should be NULL if no lookups are in progress 
+   * Handle for DHT lookups. should be NULL if no lookups are in progress
    */
   struct GNUNET_DHT_GetHandle *get_handle;
 
@@ -263,9 +265,9 @@ struct GNS_ResolverHandle
   struct GNUNET_RESOLVER_RequestHandle *std_resolve;
 
   /**
-   * Pending Namestore lookup task
+   * Pending Namecache lookup task
    */
-  struct GNUNET_NAMESTORE_QueueEntry *namestore_qe;
+  struct GNUNET_NAMECACHE_QueueEntry *namecache_qe;
 
   /**
    * Heap node associated with this lookup.  Used to limit number of
@@ -274,19 +276,19 @@ struct GNS_ResolverHandle
   struct GNUNET_CONTAINER_HeapNode *dht_heap_node;
 
   /**
-   * DLL to store the authority chain 
+   * DLL to store the authority chain
    */
   struct AuthorityChain *ac_head;
 
   /**
-   * DLL to store the authority chain 
+   * DLL to store the authority chain
    */
   struct AuthorityChain *ac_tail;
 
   /**
    * Private key of the shorten zone, NULL to not shorten.
    */
-  struct GNUNET_CRYPTO_EccPrivateKey *shorten_key;
+  struct GNUNET_CRYPTO_EcdsaPrivateKey *shorten_key;
 
   /**
    * ID of a task associated with the resolution process.
@@ -294,7 +296,7 @@ struct GNS_ResolverHandle
   GNUNET_SCHEDULER_TaskIdentifier task_id;
 
   /**
-   * The name to resolve 
+   * The name to resolve
    */
   char *name;
 
@@ -314,7 +316,7 @@ struct GNS_ResolverHandle
   size_t name_resolution_pos;
 
   /**
-   * Use only cache 
+   * Use only cache
    */
   int only_cached;
 
@@ -325,7 +327,7 @@ struct GNS_ResolverHandle
 
   /**
    * We increment the loop limiter for each step in a recursive
-   * resolution.  If it passes our threshold (i.e. due to 
+   * resolution.  If it passes our threshold (i.e. due to
    * self-recursion in the resolution, i.e CNAME fun), we stop.
    */
   unsigned int loop_limiter;
@@ -352,7 +354,7 @@ struct CacheOps
   /**
    * Pending Namestore caching task.
    */
-  struct GNUNET_NAMESTORE_QueueEntry *namestore_qe_cache;
+  struct GNUNET_NAMECACHE_QueueEntry *namecache_qe_cache;
 
 };
 
@@ -362,6 +364,11 @@ struct CacheOps
  */
 static struct GNUNET_NAMESTORE_Handle *namestore_handle;
 
+/**
+ * Our handle to the namecache service
+ */
+static struct GNUNET_NAMECACHE_Handle *namecache_handle;
+
 /**
  * Our handle to the vpn service
  */
@@ -413,7 +420,7 @@ static struct CacheOps *co_tail;
  */
 static const struct GNUNET_CONFIGURATION_Handle *cfg;
 
-
+#if 0
 /**
  * Check if name is in srv format (_x._y.xxx)
  *
@@ -442,6 +449,7 @@ is_srv (const char *name)
   GNUNET_free (ndup);
   return ret;
 }
+#endif
 
 
 /**
@@ -470,7 +478,7 @@ is_canonical (const char *name)
   if ('_' != name[0])
     return GNUNET_NO;
   pos = &name[1];
-  while (NULL != (dot = strchr (pos, '.')))    
+  while (NULL != (dot = strchr (pos, '.')))
     if ('_' != dot[1])
       return GNUNET_NO;
     else
@@ -481,7 +489,7 @@ is_canonical (const char *name)
 /* ************************** Resolution **************************** */
 
 /**
- * Exands a name ending in .+ with the zone of origin.
+ * Expands a name ending in .+ with the zone of origin.
  *
  * @param rh resolution context
  * @param name name to modify (to be free'd or returned)
@@ -502,7 +510,7 @@ translate_dot_plus (struct GNS_ResolverHandle *rh,
                   "%.*s.%s",
                   (int) (s_len - 2),
                   name,
-                  GNUNET_NAMESTORE_pkey_to_zkey (&rh->ac_tail->authority_info.gns_authority));
+                  GNUNET_GNSRECORD_pkey_to_zkey (&rh->ac_tail->authority_info.gns_authority));
   GNUNET_free (name);
   return ret;
 }
@@ -530,8 +538,8 @@ fail_resolution (void *cls,
 /* Don't have this on W32, here's a naive implementation
  * Was somehow removed on OS X ...  */
 void *
-memrchr (const void *s, 
-        int c, 
+memrchr (const void *s,
+        int c,
         size_t n)
 {
   const unsigned char *ucs = s;
@@ -567,7 +575,7 @@ resolver_lookup_get_next_label (struct GNS_ResolverHandle *rh)
     /* done, this was the last one */
     len = rh->name_resolution_pos;
     rp = rh->name;
-    rh->name_resolution_pos = 0; 
+    rh->name_resolution_pos = 0;
   }
   else
   {
@@ -575,8 +583,8 @@ resolver_lookup_get_next_label (struct GNS_ResolverHandle *rh)
     len = rh->name_resolution_pos - (dot - rh->name) - 1;
     rp = dot + 1;
     rh->name_resolution_pos = dot - rh->name;
-  }  
-  return GNUNET_strndup (rp, len);  
+  }
+  return GNUNET_strndup (rp, len);
 }
 
 
@@ -596,7 +604,7 @@ transmit_lookup_dns_result (struct GNS_ResolverHandle *rh)
   for (pos = rh->dns_result_head; NULL != pos; pos = pos->next)
     n++;
   {
-    struct GNUNET_NAMESTORE_RecordData rd[n];
+    struct GNUNET_GNSRECORD_Data rd[n];
 
     i = 0;
     for (pos = rh->dns_result_head; NULL != pos; pos = pos->next)
@@ -606,18 +614,18 @@ transmit_lookup_dns_result (struct GNS_ResolverHandle *rh)
       rd[i].record_type = pos->record_type;
       if (0 == pos->expiration_time)
       {
-       rd[i].flags = GNUNET_NAMESTORE_RF_RELATIVE_EXPIRATION;
+       rd[i].flags = GNUNET_GNSRECORD_RF_RELATIVE_EXPIRATION;
        rd[i].expiration_time = 0;
       }
       else
       {
-       rd[i].flags = GNUNET_NAMESTORE_RF_NONE;
+       rd[i].flags = GNUNET_GNSRECORD_RF_NONE;
        rd[i].expiration_time = pos->expiration_time;
       }
       i++;
     }
     GNUNET_assert (i == n);
-    GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, 
+    GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
                "Transmitting standard DNS result with %u records\n",
                n);
     rh->proc (rh->proc_cls,
@@ -662,7 +670,7 @@ add_dns_result (struct GNS_ResolverHandle *rh,
  * We had to do a DNS lookup.  Convert the result (if any) and return
  * it.
  *
- * @param cls closure with the 'struct GNS_ResolverHandle'
+ * @param cls closure with the `struct GNS_ResolverHandle`
  * @param addr one of the addresses of the host, NULL for the last address
  * @param addrlen length of the address
  */
@@ -754,7 +762,7 @@ dns_result_parser (void *cls,
   rh->dns_request = NULL;
   GNUNET_SCHEDULER_cancel (rh->task_id);
   rh->task_id = GNUNET_SCHEDULER_NO_TASK;
-  p = GNUNET_DNSPARSER_parse ((const char *) dns, 
+  p = GNUNET_DNSPARSER_parse ((const char *) dns,
                              dns_len);
   if (NULL == p)
   {
@@ -776,14 +784,14 @@ dns_result_parser (void *cls,
       rh->name = GNUNET_strdup (p->answers[0].data.hostname);
       start_resolver_lookup (rh);
       GNUNET_DNSPARSER_free_packet (p);
-      return;     
+      return;
     }
   /* FIXME: add DNAME support */
 
   /* convert from (parsed) DNS to (binary) GNS format! */
   rd_count = p->num_answers + p->num_authority_records + p->num_additional_records;
   {
-    struct GNUNET_NAMESTORE_RecordData rd[rd_count];
+    struct GNUNET_GNSRECORD_Data rd[rd_count];
     unsigned int skip;
     char buf[UINT16_MAX];
     size_t buf_off;
@@ -798,7 +806,7 @@ dns_result_parser (void *cls,
        rec = &p->answers[i];
       else if (i < p->num_answers + p->num_authority_records)
        rec = &p->authority_records[i - p->num_answers];
-      else 
+      else
        rec = &p->authority_records[i - p->num_answers - p->num_authority_records];
       /* As we copied the full DNS name to 'rh->ac_tail->label', this
         should be the correct check to see if this record is actually
@@ -852,7 +860,7 @@ dns_result_parser (void *cls,
          continue;
        }
        rd[i - skip].data_size = buf_off - buf_start;
-       rd[i - skip].data = &buf[buf_start];    
+       rd[i - skip].data = &buf[buf_start];
        break;
       case GNUNET_DNSPARSER_TYPE_SOA:
        buf_start = buf_off;
@@ -867,7 +875,7 @@ dns_result_parser (void *cls,
          continue;
        }
        rd[i - skip].data_size = buf_off - buf_start;
-       rd[i - skip].data = &buf[buf_start];    
+       rd[i - skip].data = &buf[buf_start];
        break;
       case GNUNET_DNSPARSER_TYPE_MX:
        buf_start = buf_off;
@@ -882,7 +890,7 @@ dns_result_parser (void *cls,
          continue;
        }
        rd[i - skip].data_size = buf_off - buf_start;
-       rd[i - skip].data = &buf[buf_start];    
+       rd[i - skip].data = &buf[buf_start];
        break;
       case GNUNET_DNSPARSER_TYPE_SRV:
        buf_start = buf_off;
@@ -897,7 +905,7 @@ dns_result_parser (void *cls,
          continue;
        }
        rd[i - skip].data_size = buf_off - buf_start;
-       rd[i - skip].data = &buf[buf_start];    
+       rd[i - skip].data = &buf[buf_start];
        break;
       default:
        GNUNET_log (GNUNET_ERROR_TYPE_INFO,
@@ -909,7 +917,7 @@ dns_result_parser (void *cls,
     }
     rh->proc (rh->proc_cls, rd_count - skip, rd);
     GNS_resolver_lookup_cancel (rh);
-  }  
+  }
   GNUNET_DNSPARSER_free_packet (p);
 }
 
@@ -963,7 +971,7 @@ recursive_dns_resolution (struct GNS_ResolverHandle *rh)
                                               UINT16_MAX);
   p->flags.opcode = GNUNET_TUN_DNS_OPCODE_QUERY;
   p->flags.recursion_desired = 1;
-  if (GNUNET_OK != 
+  if (GNUNET_OK !=
       GNUNET_DNSPARSER_pack (p, 1024, &dns_request, &dns_request_length))
   {
     GNUNET_break (0);
@@ -993,7 +1001,7 @@ recursive_dns_resolution (struct GNS_ResolverHandle *rh)
  * Merge it into our chain.
  *
  * @param rh resolution we are performing
- * @param cname value of the cname record we got for the current 
+ * @param cname value of the cname record we got for the current
  *        authority chain tail
  */
 static void
@@ -1030,13 +1038,13 @@ handle_gns_cname_result (struct GNS_ResolverHandle *rh,
     ac = GNUNET_new (struct AuthorityChain);
     ac->rh = rh;
     ac->gns_authority = GNUNET_YES;
-    ac->authority_info.gns_authority = rh->ac_tail->authority_info.gns_authority;    
+    ac->authority_info.gns_authority = rh->ac_tail->authority_info.gns_authority;
     ac->label = resolver_lookup_get_next_label (rh);
     /* tigger shortening */
-    if (NULL != rh->shorten_key)      
+    if (NULL != rh->shorten_key)
       GNS_shorten_start (rh->ac_tail->label,
                         &ac->authority_info.gns_authority,
-                        rh->shorten_key);      
+                        rh->shorten_key);
     /* add AC to tail */
     GNUNET_CONTAINER_DLL_insert_tail (rh->ac_head,
                                      rh->ac_tail,
@@ -1062,7 +1070,7 @@ handle_gns_cname_result (struct GNS_ResolverHandle *rh,
 static void
 handle_gns_resolution_result (void *cls,
                              unsigned int rd_count,
-                             const struct GNUNET_NAMESTORE_RecordData *rd);
+                             const struct GNUNET_GNSRECORD_Data *rd);
 
 
 /**
@@ -1076,7 +1084,7 @@ handle_gns_resolution_result (void *cls,
  *                will match 'result_af' from the request
  * @param address IP address (struct in_addr or struct in_addr6, depending on 'af')
  *                that the VPN allocated for the redirection;
- *                traffic to this IP will now be redirected to the 
+ *                traffic to this IP will now be redirected to the
  *                specified target peer; NULL on error
  */
 static void
@@ -1086,23 +1094,23 @@ vpn_allocation_cb (void *cls,
 {
   struct VpnContext *vpn_ctx = cls;
   struct GNS_ResolverHandle *rh = vpn_ctx->rh;
-  struct GNUNET_NAMESTORE_RecordData rd[vpn_ctx->rd_count];
+  struct GNUNET_GNSRECORD_Data rd[vpn_ctx->rd_count];
   unsigned int i;
 
   vpn_ctx->vpn_request = NULL;
   rh->vpn_ctx = NULL;
   GNUNET_assert (GNUNET_OK ==
-                GNUNET_NAMESTORE_records_deserialize (vpn_ctx->rd_data_size,
+                GNUNET_GNSRECORD_records_deserialize (vpn_ctx->rd_data_size,
                                                       vpn_ctx->rd_data,
                                                       vpn_ctx->rd_count,
                                                       rd));
   for (i=0;i<vpn_ctx->rd_count;i++)
   {
-    if (GNUNET_NAMESTORE_TYPE_VPN == rd[i].record_type)
+    if (GNUNET_GNSRECORD_TYPE_VPN == rd[i].record_type)
     {
       switch (af)
       {
-      case AF_INET: 
+      case AF_INET:
        rd[i].record_type = GNUNET_DNSPARSER_TYPE_A;
        rd[i].data_size = sizeof (struct in_addr);
        rd[i].expiration_time = GNUNET_TIME_relative_to_absolute (VPN_TIMEOUT).abs_value_us;
@@ -1118,12 +1126,12 @@ vpn_allocation_cb (void *cls,
        break;
       default:
        GNUNET_assert (0);
-      }     
+      }
       break;
     }
   }
   GNUNET_assert (i < vpn_ctx->rd_count);
-  handle_gns_resolution_result (rh, 
+  handle_gns_resolution_result (rh,
                                vpn_ctx->rd_count,
                                rd);
   GNUNET_free (vpn_ctx->rd_data);
@@ -1141,7 +1149,7 @@ vpn_allocation_cb (void *cls,
 static void
 handle_gns_resolution_result (void *cls,
                              unsigned int rd_count,
-                             const struct GNUNET_NAMESTORE_RecordData *rd)
+                             const struct GNUNET_GNSRECORD_Data *rd)
 {
   struct GNS_ResolverHandle *rh = cls;
   struct AuthorityChain *ac;
@@ -1161,14 +1169,14 @@ handle_gns_resolution_result (void *cls,
   size_t scratch_off;
   size_t scratch_start;
   size_t off;
-  struct GNUNET_NAMESTORE_RecordData rd_new[rd_count];
+  struct GNUNET_GNSRECORD_Data rd_new[rd_count];
   unsigned int rd_off;
 
   GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
              "Resolution succeeded for `%s' in zone %s, got %u records\n",
              rh->ac_tail->label,
-             GNUNET_NAMESTORE_z2s (&rh->ac_tail->authority_info.gns_authority),
-             rd_count);  
+             GNUNET_GNSRECORD_z2s (&rh->ac_tail->authority_info.gns_authority),
+             rd_count);
   if (0 == rh->name_resolution_pos)
   {
     /* top-level match, are we done yet? */
@@ -1186,12 +1194,12 @@ handle_gns_resolution_result (void *cls,
        GNUNET_break_op (0);
        rh->proc (rh->proc_cls, 0, NULL);
        GNS_resolver_lookup_cancel (rh);
-       return;                 
+       return;
       }
-      handle_gns_cname_result (rh, 
+      handle_gns_cname_result (rh,
                               cname);
       GNUNET_free (cname);
-      return;     
+      return;
     }
     /* If A/AAAA was requested, but we got a VPN
        record, we convert it to A/AAAA using GNUnet VPN */
@@ -1202,7 +1210,7 @@ handle_gns_resolution_result (void *cls,
       {
        switch (rd[i].record_type)
        {
-       case GNUNET_NAMESTORE_TYPE_VPN:
+       case GNUNET_GNSRECORD_TYPE_VPN:
          {
            af = (GNUNET_DNSPARSER_TYPE_A == rh->record_type) ? AF_INET : AF_INET6;
            if (sizeof (struct GNUNET_TUN_GnsVpnRecord) <
@@ -1211,7 +1219,7 @@ handle_gns_resolution_result (void *cls,
              GNUNET_break_op (0);
              rh->proc (rh->proc_cls, 0, NULL);
              GNS_resolver_lookup_cancel (rh);
-             return;         
+             return;
            }
            vpn = (const struct GNUNET_TUN_GnsVpnRecord *) rd[i].data;
            vname = (const char *) &vpn[1];
@@ -1228,10 +1236,10 @@ handle_gns_resolution_result (void *cls,
            vpn_ctx = GNUNET_new (struct VpnContext);
            rh->vpn_ctx = vpn_ctx;
            vpn_ctx->rh = rh;
-           vpn_ctx->rd_data_size = GNUNET_NAMESTORE_records_get_size (rd_count,
+           vpn_ctx->rd_data_size = GNUNET_GNSRECORD_records_get_size (rd_count,
                                                                       rd);
            vpn_ctx->rd_data = GNUNET_malloc (vpn_ctx->rd_data_size);
-           (void) GNUNET_NAMESTORE_records_serialize (rd_count,
+           (void) GNUNET_GNSRECORD_records_serialize (rd_count,
                                                       rd,
                                                       vpn_ctx->rd_data_size,
                                                       vpn_ctx->rd_data);
@@ -1245,7 +1253,7 @@ handle_gns_resolution_result (void *cls,
                                                                rh);
            return;
          }
-       case GNUNET_NAMESTORE_TYPE_GNS2DNS:
+       case GNUNET_GNSRECORD_TYPE_GNS2DNS:
          {
            /* delegation to DNS */
            goto do_recurse;
@@ -1300,7 +1308,7 @@ handle_gns_resolution_result (void *cls,
              rd_off++;
            }
          }
-         GNUNET_free_non_null (cname);   
+         GNUNET_free_non_null (cname);
        }
        break;
       case GNUNET_DNSPARSER_TYPE_SOA:
@@ -1337,7 +1345,7 @@ handle_gns_resolution_result (void *cls,
            }
          }
          if (NULL != soa)
-           GNUNET_DNSPARSER_free_soa (soa);      
+           GNUNET_DNSPARSER_free_soa (soa);
        }
        break;
       case GNUNET_DNSPARSER_TYPE_MX:
@@ -1373,15 +1381,15 @@ handle_gns_resolution_result (void *cls,
            }
          }
          if (NULL != mx)
-           GNUNET_DNSPARSER_free_mx (mx);        
-       }       
+           GNUNET_DNSPARSER_free_mx (mx);
+       }
        break;
       case GNUNET_DNSPARSER_TYPE_SRV:
        {
          struct GNUNET_DNSPARSER_SrvRecord *srv;
 
          off = 0;
-         /* FIXME: passing rh->name here is is not necessarily what we want 
+         /* FIXME: passing rh->name here is is not necessarily what we want
             (SRV support not finished) */
          srv = GNUNET_DNSPARSER_parse_srv (rh->name,
                                            rd[i].data,
@@ -1413,37 +1421,57 @@ handle_gns_resolution_result (void *cls,
            }
          }
          if (NULL != srv)
-           GNUNET_DNSPARSER_free_srv (srv);      
+           GNUNET_DNSPARSER_free_srv (srv);
        }
        break;
-      case GNUNET_NAMESTORE_TYPE_PKEY:
-       /* tigger shortening */
-       if (NULL != rh->shorten_key)
-       {
-         struct GNUNET_CRYPTO_EccPublicSignKey pub;
-         
-         if (rd[i].data_size != sizeof (struct GNUNET_CRYPTO_EccPublicSignKey))
+      case GNUNET_GNSRECORD_TYPE_PKEY:
+        {
+         struct GNUNET_CRYPTO_EcdsaPublicKey pub;
+
+         if (rd[i].data_size != sizeof (struct GNUNET_CRYPTO_EcdsaPublicKey))
          {
            GNUNET_break_op (0);
            break;
          }
          memcpy (&pub, rd[i].data, rd[i].data_size);
-         GNS_shorten_start (rh->ac_tail->label,
-                            &pub,
-                            rh->shorten_key);
-       }
-       rd_off++;
+
+          /* tigger shortening */
+          if (NULL != rh->shorten_key)
+          {
+            GNS_shorten_start (rh->ac_tail->label,
+                               &pub,
+                               rh->shorten_key);
+          }
+          rd_off++;
+          if (GNUNET_GNSRECORD_TYPE_PKEY != rh->record_type)
+          {
+            /* try to resolve "+" */
+            struct AuthorityChain *ac;
+
+            ac = GNUNET_new (struct AuthorityChain);
+            ac->rh = rh;
+            ac->gns_authority = GNUNET_YES;
+            ac->authority_info.gns_authority = pub;
+            ac->label = GNUNET_strdup (GNUNET_GNS_MASTERZONE_STR);
+            GNUNET_CONTAINER_DLL_insert_tail (rh->ac_head,
+                                              rh->ac_tail,
+                                              ac);
+            rh->task_id = GNUNET_SCHEDULER_add_now (&recursive_resolution,
+                                                    rh);
+            return;
+          }
+        }
        break;
       default:
        rd_off++;
        break;
       }
     }
-    
+
     /* yes, we are done, return result */
     rh->proc (rh->proc_cls, rd_off, rd_new);
     GNS_resolver_lookup_cancel (rh);
-    return;         
+    return;
   }
  do_recurse:
   /* need to recurse, check if we can */
@@ -1451,15 +1479,15 @@ handle_gns_resolution_result (void *cls,
   {
     switch (rd[i].record_type)
     {
-    case GNUNET_NAMESTORE_TYPE_PKEY:
+    case GNUNET_GNSRECORD_TYPE_PKEY:
       /* delegation to another zone */
-      if (sizeof (struct GNUNET_CRYPTO_EccPublicSignKey) !=
+      if (sizeof (struct GNUNET_CRYPTO_EcdsaPublicKey) !=
          rd[i].data_size)
       {
        GNUNET_break_op (0);
        rh->proc (rh->proc_cls, 0, NULL);
        GNS_resolver_lookup_cancel (rh);
-       return;     
+       return;
       }
       /* expand authority chain */
       ac = GNUNET_new (struct AuthorityChain);
@@ -1467,13 +1495,13 @@ handle_gns_resolution_result (void *cls,
       ac->gns_authority = GNUNET_YES;
       memcpy (&ac->authority_info.gns_authority,
              rd[i].data,
-             sizeof (struct GNUNET_CRYPTO_EccPublicSignKey));
+             sizeof (struct GNUNET_CRYPTO_EcdsaPublicKey));
       ac->label = resolver_lookup_get_next_label (rh);
       /* tigger shortening */
-      if (NULL != rh->shorten_key)      
+      if (NULL != rh->shorten_key)
        GNS_shorten_start (rh->ac_tail->label,
                           &ac->authority_info.gns_authority,
-                          rh->shorten_key);      
+                          rh->shorten_key);
       /* add AC to tail */
       GNUNET_CONTAINER_DLL_insert_tail (rh->ac_head,
                                        rh->ac_tail,
@@ -1482,7 +1510,7 @@ handle_gns_resolution_result (void *cls,
       rh->task_id = GNUNET_SCHEDULER_add_now (&recursive_resolution,
                                              rh);
       return;
-    case GNUNET_NAMESTORE_TYPE_GNS2DNS:
+    case GNUNET_GNSRECORD_TYPE_GNS2DNS:
       {
        char *ns;
        /* resolution continues within DNS */
@@ -1491,7 +1519,7 @@ handle_gns_resolution_result (void *cls,
          GNUNET_break_op (0);
          rh->proc (rh->proc_cls, 0, NULL);
          GNS_resolver_lookup_cancel (rh);
-         return;     
+         return;
        }
        /* find associated A/AAAA record */
        sa = NULL;
@@ -1506,7 +1534,7 @@ handle_gns_resolution_result (void *cls,
                GNUNET_break_op (0);
                rh->proc (rh->proc_cls, 0, NULL);
                GNS_resolver_lookup_cancel (rh);
-               return;     
+               return;
              }
              /* FIXME: might want to check if we support IPv4 here,
                 and otherwise skip this one and hope we find another */
@@ -1528,7 +1556,7 @@ handle_gns_resolution_result (void *cls,
                GNUNET_break_op (0);
                rh->proc (rh->proc_cls, 0, NULL);
                GNS_resolver_lookup_cancel (rh);
-               return;     
+               return;
              }
              /* FIXME: might want to check if we support IPv6 here,
                 and otherwise skip this one and hope we find another */
@@ -1570,6 +1598,8 @@ handle_gns_resolution_result (void *cls,
          GNUNET_break_op (0); /* record not well-formed */
          rh->proc (rh->proc_cls, 0, NULL);
          GNS_resolver_lookup_cancel (rh);
+         GNUNET_free_non_null (ns);
+         GNUNET_free (ac);
          return;
        }
        strcpy (ac->authority_info.dns_authority.name,
@@ -1607,7 +1637,7 @@ handle_gns_resolution_result (void *cls,
     case GNUNET_DNSPARSER_TYPE_CNAME:
       {
        char *cname;
-       
+
        off = 0;
        cname = GNUNET_DNSPARSER_parse_name (rd[i].data,
                                             rd[i].data_size,
@@ -1618,9 +1648,10 @@ handle_gns_resolution_result (void *cls,
          GNUNET_break_op (0); /* record not well-formed */
          rh->proc (rh->proc_cls, 0, NULL);
          GNS_resolver_lookup_cancel (rh);
+         GNUNET_free_non_null (cname);
          return;
        }
-       handle_gns_cname_result (rh, 
+       handle_gns_cname_result (rh,
                                 cname);
        GNUNET_free (cname);
        return;
@@ -1647,13 +1678,13 @@ handle_gns_resolution_result (void *cls,
  * @param emsg error message
  */
 static void
-namestore_cache_continuation (void *cls,
+namecache_cache_continuation (void *cls,
                              int32_t success,
                              const char *emsg)
 {
   struct CacheOps *co = cls;
 
-  co->namestore_qe_cache = NULL;
+  co->namecache_qe_cache = NULL;
   if (NULL != emsg)
     GNUNET_log (GNUNET_ERROR_TYPE_WARNING,
                _("Failed to cache GNS resolution: %s\n"),
@@ -1688,44 +1719,44 @@ handle_dht_response (void *cls,
                     const struct GNUNET_HashCode *key,
                     const struct GNUNET_PeerIdentity *get_path,
                     unsigned int get_path_length,
-                    const struct GNUNET_PeerIdentity *put_path, 
+                    const struct GNUNET_PeerIdentity *put_path,
                     unsigned int put_path_length,
                     enum GNUNET_BLOCK_Type type,
                     size_t size, const void *data)
 {
   struct GNS_ResolverHandle *rh = cls;
   struct AuthorityChain *ac = rh->ac_tail;
-  const struct GNUNET_NAMESTORE_Block *block;
+  const struct GNUNET_GNSRECORD_Block *block;
   struct CacheOps *co;
-  
+
   GNUNET_DHT_get_stop (rh->get_handle);
   rh->get_handle = NULL;
   GNUNET_CONTAINER_heap_remove_node (rh->dht_heap_node);
-  rh->dht_heap_node = NULL;  
+  rh->dht_heap_node = NULL;
   GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
              "Handling response from the DHT\n");
-  if (size < sizeof (struct GNUNET_NAMESTORE_Block))
+  if (size < sizeof (struct GNUNET_GNSRECORD_Block))
   {
     /* how did this pass DHT block validation!? */
     GNUNET_break (0);
     rh->proc (rh->proc_cls, 0, NULL);
     GNS_resolver_lookup_cancel (rh);
-    return;   
+    return;
   }
-  block = data; 
+  block = data;
   if (size !=
-      ntohl (block->purpose.size) + 
-      sizeof (struct GNUNET_CRYPTO_EccPublicSignKey) +
-      sizeof (struct GNUNET_CRYPTO_EccSignature))
+      ntohl (block->purpose.size) +
+      sizeof (struct GNUNET_CRYPTO_EcdsaPublicKey) +
+      sizeof (struct GNUNET_CRYPTO_EcdsaSignature))
   {
     /* how did this pass DHT block validation!? */
     GNUNET_break (0);
     rh->proc (rh->proc_cls, 0, NULL);
     GNS_resolver_lookup_cancel (rh);
-    return;   
+    return;
   }
   if (GNUNET_OK !=
-      GNUNET_NAMESTORE_block_decrypt (block,
+      GNUNET_GNSRECORD_block_decrypt (block,
                                      &ac->authority_info.gns_authority,
                                      ac->label,
                                      &handle_gns_resolution_result,
@@ -1740,9 +1771,9 @@ handle_dht_response (void *cls,
   GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
              "Caching response from the DHT in namestore\n");
   co = GNUNET_new (struct CacheOps);
-  co->namestore_qe_cache = GNUNET_NAMESTORE_block_cache (namestore_handle,
+  co->namecache_qe_cache = GNUNET_NAMECACHE_block_cache (namecache_handle,
                                                         block,
-                                                        &namestore_cache_continuation,
+                                                        &namecache_cache_continuation,
                                                         co);
   GNUNET_CONTAINER_DLL_insert (co_head,
                               co_tail,
@@ -1756,22 +1787,22 @@ handle_dht_response (void *cls,
  * @param cls closure with the `struct GNS_ResolverHandle`
  * @param block block that was stored in the namestore
  */
-static void 
+static void
 handle_namestore_block_response (void *cls,
-                                const struct GNUNET_NAMESTORE_Block *block)
+                                const struct GNUNET_GNSRECORD_Block *block)
 {
   struct GNS_ResolverHandle *rh = cls;
   struct GNS_ResolverHandle *rx;
   struct AuthorityChain *ac = rh->ac_tail;
   const char *label = ac->label;
-  const struct GNUNET_CRYPTO_EccPublicSignKey *auth = &ac->authority_info.gns_authority;
+  const struct GNUNET_CRYPTO_EcdsaPublicKey *auth = &ac->authority_info.gns_authority;
   struct GNUNET_HashCode query;
 
-  GNUNET_NAMESTORE_query_from_public_key (auth,
+  GNUNET_GNSRECORD_query_from_public_key (auth,
                                          label,
                                          &query);
-  GNUNET_assert (NULL != rh->namestore_qe);
-  rh->namestore_qe = NULL;
+  GNUNET_assert (NULL != rh->namecache_qe);
+  rh->namecache_qe = NULL;
   if ( (GNUNET_NO == rh->only_cached) &&
        ( (NULL == block) ||
         (0 == GNUNET_TIME_absolute_get_remaining (GNUNET_TIME_absolute_ntoh (block->expiration_time)).rel_value_us) ) )
@@ -1780,7 +1811,7 @@ handle_namestore_block_response (void *cls,
     GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
                "Starting DHT lookup for `%s' in zone %s\n",
                ac->label,
-               GNUNET_NAMESTORE_z2s (&ac->authority_info.gns_authority));
+               GNUNET_GNSRECORD_z2s (&ac->authority_info.gns_authority));
     GNUNET_assert (NULL == rh->get_handle);
     rh->get_handle = GNUNET_DHT_get_start (dht_handle,
                                           GNUNET_BLOCK_TYPE_GNS_NAMERECORD,
@@ -1809,7 +1840,7 @@ handle_namestore_block_response (void *cls,
     GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
                "Resolution failed for `%s' in zone %s (DHT lookup not permitted by configuration)\n",
                ac->label,
-               GNUNET_NAMESTORE_z2s (&ac->authority_info.gns_authority));
+               GNUNET_GNSRECORD_z2s (&ac->authority_info.gns_authority));
     rh->proc (rh->proc_cls, 0, NULL);
     GNS_resolver_lookup_cancel (rh);
     return;
@@ -1817,7 +1848,7 @@ handle_namestore_block_response (void *cls,
   GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
              "Decrypting block from the namestore\n");
   if (GNUNET_OK !=
-      GNUNET_NAMESTORE_block_decrypt (block,
+      GNUNET_GNSRECORD_block_decrypt (block,
                                      auth,
                                      label,
                                      &handle_gns_resolution_result,
@@ -1845,15 +1876,15 @@ recursive_gns_resolution_namestore (struct GNS_ResolverHandle *rh)
   GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
              "Starting GNS resolution for `%s' in zone %s\n",
              ac->label,
-             GNUNET_NAMESTORE_z2s (&ac->authority_info.gns_authority));
-  GNUNET_NAMESTORE_query_from_public_key (&ac->authority_info.gns_authority,
+             GNUNET_GNSRECORD_z2s (&ac->authority_info.gns_authority));
+  GNUNET_GNSRECORD_query_from_public_key (&ac->authority_info.gns_authority,
                                          ac->label,
                                          &query);
-  rh->namestore_qe = GNUNET_NAMESTORE_lookup_block (namestore_handle,
+  rh->namecache_qe = GNUNET_NAMECACHE_lookup_block (namecache_handle,
                                                    &query,
                                                    &handle_namestore_block_response,
                                                    rh);
-  GNUNET_assert (NULL != rh->namestore_qe);
+  GNUNET_assert (NULL != rh->namecache_qe);
 }
 
 
@@ -1879,10 +1910,10 @@ recursive_resolution (void *cls,
     GNS_resolver_lookup_cancel (rh);
     return;
   }
-  if (GNUNET_YES == rh->ac_tail->gns_authority) 
-    recursive_gns_resolution_namestore (rh);  
-  else  
-    recursive_dns_resolution (rh);  
+  if (GNUNET_YES == rh->ac_tail->gns_authority)
+    recursive_gns_resolution_namestore (rh);
+  else
+    recursive_dns_resolution (rh);
 }
 
 
@@ -1919,11 +1950,11 @@ start_resolver_lookup (struct GNS_ResolverHandle *rh)
     default:
       af = AF_UNSPEC;
       break;
-    }  
-    GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, 
+    }
+    GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
                "Doing standard DNS lookup for `%s'\n",
                rh->name);
-    rh->std_resolve = GNUNET_RESOLVER_ip_get (rh->name, 
+    rh->std_resolve = GNUNET_RESOLVER_ip_get (rh->name,
                                              af,
                                              DNS_LOOKUP_TIMEOUT,
                                              &handle_dns_result,
@@ -1943,7 +1974,7 @@ start_resolver_lookup (struct GNS_ResolverHandle *rh)
     if ( (NULL == x) ||
         (NULL == y) ||
         (GNUNET_OK !=
-         GNUNET_CRYPTO_ecc_public_sign_key_from_string (pkey,
+         GNUNET_CRYPTO_ecdsa_public_key_from_string (pkey,
                                                    strlen (pkey),
                                                    &rh->authority_zone)) )
     {
@@ -1991,10 +2022,10 @@ start_resolver_lookup (struct GNS_ResolverHandle *rh)
  * @return handle to cancel operation
  */
 struct GNS_ResolverHandle *
-GNS_resolver_lookup (const struct GNUNET_CRYPTO_EccPublicSignKey *zone,
+GNS_resolver_lookup (const struct GNUNET_CRYPTO_EcdsaPublicKey *zone,
                     uint32_t record_type,
                     const char *name,
-                    const struct GNUNET_CRYPTO_EccPrivateKey *shorten_key,
+                    const struct GNUNET_CRYPTO_EcdsaPrivateKey *shorten_key,
                     int only_cached,
                     GNS_ResultProcessor proc, void *proc_cls)
 {
@@ -2002,7 +2033,7 @@ GNS_resolver_lookup (const struct GNUNET_CRYPTO_EccPublicSignKey *zone,
 
   GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
              (NULL == shorten_key)
-             ? "Starting lookup for `%s' with shortening disabled\n" 
+             ? "Starting lookup for `%s' with shortening disabled\n"
              : "Starting lookup for `%s' with shortening enabled\n",
              name);
   rh = GNUNET_new (struct GNS_ResolverHandle);
@@ -2018,7 +2049,7 @@ GNS_resolver_lookup (const struct GNUNET_CRYPTO_EccPublicSignKey *zone,
   rh->name_resolution_pos = strlen (name);
   if (NULL != shorten_key)
   {
-    rh->shorten_key = GNUNET_new (struct GNUNET_CRYPTO_EccPrivateKey);
+    rh->shorten_key = GNUNET_new (struct GNUNET_CRYPTO_EcdsaPrivateKey);
     *rh->shorten_key = *shorten_key;
   }
   start_resolver_lookup (rh);
@@ -2075,10 +2106,10 @@ GNS_resolver_lookup_cancel (struct GNS_ResolverHandle *rh)
     GNUNET_DNSSTUB_resolve_cancel (rh->dns_request);
     rh->dns_request = NULL;
   }
-  if (NULL != rh->namestore_qe)
+  if (NULL != rh->namecache_qe)
   {
-    GNUNET_NAMESTORE_cancel (rh->namestore_qe);
-    rh->namestore_qe = NULL;
+    GNUNET_NAMECACHE_cancel (rh->namecache_qe);
+    rh->namecache_qe = NULL;
   }
   if (NULL != rh->std_resolve)
   {
@@ -2107,12 +2138,14 @@ GNS_resolver_lookup_cancel (struct GNS_ResolverHandle *rh)
  * Initialize the resolver
  *
  * @param nh the namestore handle
+ * @param nc the namecache handle
  * @param dht the dht handle
  * @param c configuration handle
  * @param max_bg_queries maximum number of parallel background queries in dht
  */
 void
 GNS_resolver_init (struct GNUNET_NAMESTORE_Handle *nh,
+                   struct GNUNET_NAMECACHE_Handle *nc,
                   struct GNUNET_DHT_Handle *dht,
                   const struct GNUNET_CONFIGURATION_Handle *c,
                   unsigned long long max_bg_queries)
@@ -2120,6 +2153,7 @@ GNS_resolver_init (struct GNUNET_NAMESTORE_Handle *nh,
   char *dns_ip;
 
   cfg = c;
+  namecache_handle = nc;
   namestore_handle = nh;
   dht_handle = dht;
   dht_lookup_heap =
@@ -2153,14 +2187,14 @@ GNS_resolver_done ()
   while (NULL != (rh = rlh_head))
   {
     rh->proc (rh->proc_cls, 0, NULL);
-    GNS_resolver_lookup_cancel (rh);    
+    GNS_resolver_lookup_cancel (rh);
   }
   while (NULL != (co = co_head))
   {
     GNUNET_CONTAINER_DLL_remove (co_head,
                                 co_tail,
                                 co);
-    GNUNET_NAMESTORE_cancel (co->namestore_qe_cache);
+    GNUNET_NAMECACHE_cancel (co->namecache_qe_cache);
     GNUNET_free (co);
   }
   GNUNET_CONTAINER_heap_destroy (dht_lookup_heap);
@@ -2170,6 +2204,7 @@ GNS_resolver_done ()
   GNUNET_VPN_disconnect (vpn_handle);
   vpn_handle = NULL;
   dht_handle = NULL;
+  namecache_handle = NULL;
   namestore_handle = NULL;
 }