gnunet-svn
[Top][All Lists]
Advanced

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

[gnunet] branch master updated: RECLAIM: Tickets are now simply GNS name


From: gnunet
Subject: [gnunet] branch master updated: RECLAIM: Tickets are now simply GNS names
Date: Mon, 29 Apr 2024 15:27:00 +0200

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

martin-schanzenbach pushed a commit to branch master
in repository gnunet.

The following commit(s) were added to refs/heads/master by this push:
     new 44c3fa30b RECLAIM: Tickets are now simply GNS names
44c3fa30b is described below

commit 44c3fa30b9250ad4875587018bab5362cc254f22
Author: Martin Schanzenbach <schanzen@gnunet.org>
AuthorDate: Mon Apr 29 15:26:46 2024 +0200

    RECLAIM: Tickets are now simply GNS names
---
 src/cli/reclaim/gnunet-reclaim.c                   |  16 +-
 src/include/gnunet_messenger_service.h             |   7 +-
 src/include/gnunet_reclaim_service.h               |  56 ++---
 src/service/messenger/messenger_api.c              |  22 +-
 src/service/messenger/messenger_api_message.c      |  12 +-
 src/service/messenger/messenger_api_message_kind.c |   7 +-
 src/service/messenger/messenger_api_message_kind.h |   2 +-
 src/service/reclaim/gnunet-service-reclaim.c       |  68 ++----
 .../reclaim/gnunet-service-reclaim_tickets.c       | 227 +++++++++++----------
 .../reclaim/gnunet-service-reclaim_tickets.h       |   4 +-
 src/service/reclaim/reclaim.h                      |   6 +
 src/service/reclaim/reclaim_api.c                  | 104 ++--------
 src/service/rest/json_reclaim.c                    |  46 ++---
 src/service/rest/reclaim_plugin.c                  |  37 ++--
 14 files changed, 252 insertions(+), 362 deletions(-)

diff --git a/src/cli/reclaim/gnunet-reclaim.c b/src/cli/reclaim/gnunet-reclaim.c
index 63152d478..38d29ac09 100644
--- a/src/cli/reclaim/gnunet-reclaim.c
+++ b/src/cli/reclaim/gnunet-reclaim.c
@@ -335,18 +335,9 @@ ticket_iter_fin (void *cls)
 
 
 static void
-ticket_iter (void *cls, const struct GNUNET_RECLAIM_Ticket *ticket)
+ticket_iter (void *cls, const struct GNUNET_RECLAIM_Ticket *ticket, const 
char* rp_uri)
 {
-  char *ref;
-  char *tkt;
-
-  ref = GNUNET_STRINGS_data_to_string_alloc (&ticket->rnd, 
sizeof(ticket->rnd));
-  tkt =
-    GNUNET_STRINGS_data_to_string_alloc (ticket,
-                                         sizeof(struct GNUNET_RECLAIM_Ticket));
-  fprintf (stdout, "Ticket: %s | ID: %s | Audience: %s\n", tkt, ref, 
ticket->rp_uri);
-  GNUNET_free (ref);
-  GNUNET_free (tkt);
+  fprintf (stdout, "Ticket: %s | RP URI: %s\n", ticket->gns_name, rp_uri);
   GNUNET_RECLAIM_ticket_iteration_next (ticket_iterator);
 }
 
@@ -843,7 +834,8 @@ main (int argc, char *const argv[])
     GNUNET_GETOPT_option_string ('a',
                                  "add",
                                  "NAME",
-                                 gettext_noop ("Add or update an attribute 
NAME"),
+                                 gettext_noop (
+                                   "Add or update an attribute NAME"),
                                  &attr_name),
     GNUNET_GETOPT_option_string ('d',
                                  "delete",
diff --git a/src/include/gnunet_messenger_service.h 
b/src/include/gnunet_messenger_service.h
index 1bc68b87b..4b3d6e441 100644
--- a/src/include/gnunet_messenger_service.h
+++ b/src/include/gnunet_messenger_service.h
@@ -543,7 +543,7 @@ struct GNUNET_MESSENGER_MessageTicket
   /**
    * The identifier of a RECLAIM ticket.
    */
-  struct GNUNET_RECLAIM_Identifier identifier;
+  struct GNUNET_RECLAIM_Ticket ticket;
 };
 
 /**
@@ -1018,13 +1018,16 @@ GNUNET_MESSENGER_iterate_members (struct 
GNUNET_MESSENGER_Room *room,
  * being used by the messenger. The audience's public key is not allowed to be 
the
  * anonymous public key. The room needs to contain a member using the 
audience's public
  * key.
+ * The <i>rp_uri</i> must contain the audience public key in SOME FORMAT TODO.
  *
  * @param[in,out] room Room handle
  * @param[in] ticket Ticket to send
+ * @param[in] rp_uri The expected audience RP URI
  */
 void
 GNUNET_MESSENGER_send_ticket (struct GNUNET_MESSENGER_Room *room,
-                              const struct GNUNET_RECLAIM_Ticket *ticket);
+                              const struct GNUNET_RECLAIM_Ticket *ticket,
+                              const char* rp_uri);
 
 #if 0 /* keep Emacsens' auto-indent happy */
 {
diff --git a/src/include/gnunet_reclaim_service.h 
b/src/include/gnunet_reclaim_service.h
index 08f3f60a3..15472fb9f 100644
--- a/src/include/gnunet_reclaim_service.h
+++ b/src/include/gnunet_reclaim_service.h
@@ -74,15 +74,23 @@ struct GNUNET_RECLAIM_Operation;
  */
 struct GNUNET_RECLAIM_Ticket
 {
+  /**
+   * The ticket. A GNS name ending in the
+   * zTLD for identity.
+   * Base32(rnd).zTLD(identity)
+   * 0-terminated string.
+   */
+  char gns_name[GNUNET_DNSPARSER_MAX_LABEL_LENGTH * 2 + 2];
+
   /**
    * The ticket issuer (= the user)
    */
-  struct GNUNET_CRYPTO_PublicKey identity;
+  //struct GNUNET_CRYPTO_PublicKey identity;
 
   /**
    * The ticket random identifier
    */
-  struct GNUNET_RECLAIM_Identifier rnd;
+  //struct GNUNET_RECLAIM_Identifier rnd;
 
 
   /**
@@ -90,7 +98,7 @@ struct GNUNET_RECLAIM_Ticket
    * 0-terminated string.
    * Example: 
"urn:gns:000G002B4RF1XPBXDPGZA0PT16BHQCS427YQK4NC84KZMK7TK8C2Z5GMK8"
    */
-  char rp_uri[GNUNET_RECLAIM_TICKET_RP_URI_MAX_LEN];
+  //char rp_uri[GNUNET_RECLAIM_TICKET_RP_URI_MAX_LEN];
 };
 
 
@@ -101,10 +109,12 @@ struct GNUNET_RECLAIM_Ticket
  *
  * @param cls closure
  * @param ticket the ticket
+ * @param rp_uri the RP URI of the ticket
  */
 typedef void (*GNUNET_RECLAIM_TicketCallback) (
   void *cls,
-  const struct GNUNET_RECLAIM_Ticket *ticket);
+  const struct GNUNET_RECLAIM_Ticket *ticket,
+  const char* rp_uri);
 
 /**
  * Method called when a token has been issued.
@@ -502,44 +512,6 @@ GNUNET_RECLAIM_disconnect (struct GNUNET_RECLAIM_Handle 
*h);
 void
 GNUNET_RECLAIM_cancel (struct GNUNET_RECLAIM_Operation *op);
 
-/**
- * Get serialized ticket size
- *
- * @param tkt the ticket
- * @return the buffer length requirement for a serialization
- */
-size_t
-GNUNET_RECLAIM_ticket_serialize_get_size (const struct GNUNET_RECLAIM_Ticket 
*tkt);
-
-/**
- * Deserializes a ticket
- *
- * @param buffer the buffer to read from
- * @param len the length of the buffer
- * @param tkt the ticket to write to (must be allocated)
- * @param kb_read how many bytes were read from buffer
- * @return GNUNET_SYSERR on error
- */
-enum GNUNET_GenericReturnValue
-GNUNET_RECLAIM_read_ticket_from_buffer (const void *buffer,
-                                        size_t len,
-                                        struct GNUNET_RECLAIM_Ticket *tkt,
-                                        size_t *tb_read);
-
-/**
- * Serializes a ticket
- *
- * @param tkt the ticket to serialize
- * @param buffer the buffer to serialize to (must be allocated with sufficient 
size
- * @param len the length of the buffer
- * @return the number of written bytes or < 0 on error
- */
-ssize_t
-GNUNET_RECLAIM_write_ticket_to_buffer (const struct
-                                       GNUNET_RECLAIM_Ticket *tkt,
-                                       void *buffer,
-                                       size_t len);
-
 #if 0 /* keep Emacsens' auto-indent happy */
 {
 #endif
diff --git a/src/service/messenger/messenger_api.c 
b/src/service/messenger/messenger_api.c
index 0778d3a48..80cea2b65 100644
--- a/src/service/messenger/messenger_api.c
+++ b/src/service/messenger/messenger_api.c
@@ -1247,7 +1247,7 @@ check_ticket_audience (void *cls,
   char *key_str;
 
   key = get_non_anonymous_key (get_contact_key (contact));
-  key_str = GNUNET_CRYPTO_public_key_to_string(key);
+  key_str = GNUNET_CRYPTO_public_key_to_string (key);
   GNUNET_snprintf (check_rp, GNUNET_RECLAIM_TICKET_RP_URI_MAX_LEN, "%s%s",
                    GNUNET_RECLAIM_TICKET_RP_URI_URN_PREFIX, key_str);
   GNUNET_free (key_str);
@@ -1262,17 +1262,27 @@ check_ticket_audience (void *cls,
 }
 
 
+// FIXME: Either passt the RP URI here or the key itself. DISCUSS!
 void
 GNUNET_MESSENGER_send_ticket (struct GNUNET_MESSENGER_Room *room,
-                              const struct GNUNET_RECLAIM_Ticket *ticket)
+                              const struct GNUNET_RECLAIM_Ticket *ticket,
+                              const char*rp_uri)
 {
   if ((! room) || (! ticket))
     return;
 
   const struct GNUNET_CRYPTO_PublicKey *pubkey;
-  pubkey = get_handle_pubkey (room->handle);
+  struct GNUNET_CRYPTO_PublicKey iss;
+  char *tmp;
+  char *key;
 
-  if (0 != GNUNET_memcmp (pubkey, &(ticket->identity)))
+  pubkey = get_handle_pubkey (room->handle);
+  tmp = GNUNET_strdup (ticket->gns_name);
+  GNUNET_assert (NULL != strtok (tmp, "."));
+  key = strtok (NULL, ".");
+  GNUNET_assert (NULL != key);
+  GNUNET_assert (GNUNET_OK == GNUNET_CRYPTO_public_key_from_string (key, 
&iss));
+  if (0 != GNUNET_memcmp (pubkey, &iss))
   {
     GNUNET_log (GNUNET_ERROR_TYPE_WARNING,
                 "Sending ticket aborted: Invalid identity!\n");
@@ -1280,7 +1290,7 @@ GNUNET_MESSENGER_send_ticket (struct 
GNUNET_MESSENGER_Room *room,
   }
 
   struct GNUNET_MESSENGER_CheckTicket check;
-  check.check_rp = ticket->rp_uri;
+  check.check_rp = rp_uri;
   check.result = GNUNET_NO;
 
   const int members = iterate_room_members (
@@ -1296,7 +1306,7 @@ GNUNET_MESSENGER_send_ticket (struct 
GNUNET_MESSENGER_Room *room,
   }
 
   struct GNUNET_MESSENGER_Message *message = create_message_ticket (
-    &(ticket->rnd)
+    ticket
     );
 
   if (! message)
diff --git a/src/service/messenger/messenger_api_message.c 
b/src/service/messenger/messenger_api_message.c
index 68b6c7d20..d42e799ab 100644
--- a/src/service/messenger/messenger_api_message.c
+++ b/src/service/messenger/messenger_api_message.c
@@ -296,7 +296,7 @@ get_message_body_kind_size (enum 
GNUNET_MESSENGER_MessageKind kind)
     break;
   case GNUNET_MESSENGER_KIND_TICKET:
     length += member_size (struct GNUNET_MESSENGER_Message,
-                           body.ticket.identifier);
+                           body.ticket.ticket);
     break;
   case GNUNET_MESSENGER_KIND_TRANSCRIPT:
     length += member_size (struct GNUNET_MESSENGER_Message,
@@ -510,7 +510,8 @@ encode_message_body (enum GNUNET_MESSENGER_MessageKind kind,
     if (body->name.name)
       encode_step_ext (buffer, offset, body->name.name, min (length - offset,
                                                              strlen (
-                                                               
body->name.name)));
+                                                               
body->name.name))
+                       );
     break;
   case GNUNET_MESSENGER_KIND_KEY:
     encode_step_key (buffer, offset, &(body->key.key), length);
@@ -538,7 +539,8 @@ encode_message_body (enum GNUNET_MESSENGER_MessageKind kind,
     if (body->text.text)
       encode_step_ext (buffer, offset, body->text.text, min (length - offset,
                                                              strlen (
-                                                               
body->text.text)));
+                                                               
body->text.text))
+                       );
     break;
   case GNUNET_MESSENGER_KIND_FILE:
     encode_step (buffer, offset, &(body->file.key));
@@ -567,7 +569,7 @@ encode_message_body (enum GNUNET_MESSENGER_MessageKind kind,
     encode_step (buffer, offset, &value1);
     break;
   case GNUNET_MESSENGER_KIND_TICKET:
-    encode_step (buffer, offset, &(body->ticket.identifier));
+    encode_step (buffer, offset, &(body->ticket.ticket));
     break;
   case GNUNET_MESSENGER_KIND_TRANSCRIPT:
     encode_step (buffer, offset, &(body->transcript.hash));
@@ -780,7 +782,7 @@ decode_message_body (enum GNUNET_MESSENGER_MessageKind 
*kind,
     body->connection.flags = GNUNET_be32toh (value1);
     break;
   case GNUNET_MESSENGER_KIND_TICKET:
-    decode_step (buffer, offset, &(body->ticket.identifier));
+    decode_step (buffer, offset, &(body->ticket.ticket));
     break;
   case GNUNET_MESSENGER_KIND_TRANSCRIPT:
     decode_step (buffer, offset, &(body->transcript.hash));
diff --git a/src/service/messenger/messenger_api_message_kind.c 
b/src/service/messenger/messenger_api_message_kind.c
index 33338af9d..bcec21cf7 100644
--- a/src/service/messenger/messenger_api_message_kind.c
+++ b/src/service/messenger/messenger_api_message_kind.c
@@ -190,9 +190,9 @@ create_message_delete (const struct GNUNET_HashCode *hash,
 
 
 struct GNUNET_MESSENGER_Message*
-create_message_ticket (const struct GNUNET_RECLAIM_Identifier *identifier)
+create_message_ticket (const struct GNUNET_RECLAIM_Ticket *ticket)
 {
-  if (! identifier)
+  if (! ticket)
     return NULL;
 
   struct GNUNET_MESSENGER_Message *message = create_message (
@@ -201,8 +201,7 @@ create_message_ticket (const struct 
GNUNET_RECLAIM_Identifier *identifier)
   if (! message)
     return NULL;
 
-  GNUNET_memcpy (&(message->body.ticket.identifier), identifier,
-                 sizeof(struct GNUNET_RECLAIM_Identifier));
+  message->body.ticket.ticket =  *ticket;
 
   return message;
 }
diff --git a/src/service/messenger/messenger_api_message_kind.h 
b/src/service/messenger/messenger_api_message_kind.h
index a5bb12947..574cdf939 100644
--- a/src/service/messenger/messenger_api_message_kind.h
+++ b/src/service/messenger/messenger_api_message_kind.h
@@ -134,6 +134,6 @@ create_message_delete (const struct GNUNET_HashCode *hash,
  * @return New message
  */
 struct GNUNET_MESSENGER_Message*
-create_message_ticket (const struct GNUNET_RECLAIM_Identifier *identifier);
+create_message_ticket (const struct GNUNET_RECLAIM_Ticket *ticket);
 
 #endif //GNUNET_MESSENGER_API_MESSAGE_KIND_H
diff --git a/src/service/reclaim/gnunet-service-reclaim.c 
b/src/service/reclaim/gnunet-service-reclaim.c
index a9a427d90..f5762c83d 100644
--- a/src/service/reclaim/gnunet-service-reclaim.c
+++ b/src/service/reclaim/gnunet-service-reclaim.c
@@ -655,7 +655,6 @@ send_ticket_result (const struct IdpClient *client,
   struct GNUNET_MQ_Envelope *env;
   size_t pres_len = 0;
   size_t tkt_len = 0;
-  ssize_t written;
   char *buf;
 
   if (NULL != presentations)
@@ -664,20 +663,20 @@ send_ticket_result (const struct IdpClient *client,
       GNUNET_RECLAIM_presentation_list_serialize_get_size (presentations);
   }
   if (NULL != ticket)
-    tkt_len = GNUNET_RECLAIM_ticket_serialize_get_size (ticket);
+    tkt_len = strlen (ticket->gns_name) + 1;
   env = GNUNET_MQ_msg_extra (irm,
                              pres_len + tkt_len,
                              GNUNET_MESSAGE_TYPE_RECLAIM_TICKET_RESULT);
   buf = (char*) &irm[1];
   if (NULL != ticket)
   {
-    written = GNUNET_RECLAIM_write_ticket_to_buffer (ticket, buf, tkt_len);
-    GNUNET_assert (0 <= written);
-    buf += written;
+    memcpy (buf, ticket, tkt_len);
+    buf += tkt_len;
   }
   // TODO add success member
   irm->id = htonl (r_id);
   irm->tkt_len = htons (tkt_len);
+  irm->rp_uri_len = htons (0);
   irm->presentations_len = htons (pres_len);
   if (NULL != presentations)
   {
@@ -884,9 +883,8 @@ handle_revoke_ticket_message (void *cls, const struct 
RevokeTicketMessage *rm)
   struct TicketRevocationOperation *rop;
   struct IdpClient *idp = cls;
   struct GNUNET_CRYPTO_PrivateKey identity;
-  struct GNUNET_RECLAIM_Ticket ticket;
+  struct GNUNET_RECLAIM_Ticket *ticket;
   size_t key_len;
-  size_t tkt_len;
   size_t read;
   char *buf;
 
@@ -904,23 +902,13 @@ handle_revoke_ticket_message (void *cls, const struct 
RevokeTicketMessage *rm)
     return;
   }
   buf += read;
-  tkt_len = ntohs (rm->tkt_len);
-  if ((GNUNET_SYSERR ==
-       GNUNET_RECLAIM_read_ticket_from_buffer (buf, tkt_len,
-                                               &ticket, &read)) ||
-      (read != tkt_len))
-  {
-    GNUNET_log (GNUNET_ERROR_TYPE_ERROR,
-                "Failed to read ticket\n");
-    GNUNET_SERVICE_client_drop (idp->client);
-    return;
-  }
+  ticket = (struct GNUNET_RECLAIM_Ticket *) buf;
   rop = GNUNET_new (struct TicketRevocationOperation);
   rop->r_id = ntohl (rm->id);
   rop->client = idp;
   GNUNET_CONTAINER_DLL_insert (idp->revoke_op_head, idp->revoke_op_tail, rop);
   rop->rh
-    = RECLAIM_TICKETS_revoke (&ticket, &identity, &revoke_result_cb, rop);
+    = RECLAIM_TICKETS_revoke (ticket, &identity, &revoke_result_cb, rop);
   GNUNET_SERVICE_client_continue (idp->client);
 }
 
@@ -1018,29 +1006,17 @@ handle_consume_ticket_message (void *cls, const struct 
ConsumeTicketMessage *cm)
 {
   struct ConsumeTicketOperation *cop;
   struct IdpClient *idp = cls;
-  struct GNUNET_RECLAIM_Ticket ticket;
-  size_t tkt_len;
-  size_t read;
+  struct GNUNET_RECLAIM_Ticket *ticket;
   char *buf;
 
   GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, "Received CONSUME_TICKET message\n");
-  tkt_len = ntohs (cm->tkt_len);
   buf = (char*) &cm[1];
-  if ((GNUNET_SYSERR ==
-       GNUNET_RECLAIM_read_ticket_from_buffer (buf, tkt_len,
-                                               &ticket, &read)) ||
-      (read != tkt_len))
-  {
-    GNUNET_log (GNUNET_ERROR_TYPE_ERROR,
-                "Failed to read ticket\n");
-    GNUNET_SERVICE_client_drop (idp->client);
-    return;
-  }
+  ticket = (struct GNUNET_RECLAIM_Ticket *) buf;
   cop = GNUNET_new (struct ConsumeTicketOperation);
   cop->r_id = ntohl (cm->id);
   cop->client = idp;
   cop->ch
-    = RECLAIM_TICKETS_consume (&ticket, &consume_result_cb,
+    = RECLAIM_TICKETS_consume (ticket, &consume_result_cb,
                                cop);
   GNUNET_CONTAINER_DLL_insert (idp->consume_op_head, idp->consume_op_tail, 
cop);
   GNUNET_SERVICE_client_continue (idp->client);
@@ -2462,27 +2438,27 @@ handle_credential_iteration_next (void *cls,
  * Ticket iteration
  ******************************************************/
 
-/**
- * Got a ticket. Return to client
- *
- * @param cls our ticket iterator
- * @param ticket the ticket
- */
 static void
-ticket_iter_cb (void *cls, struct GNUNET_RECLAIM_Ticket *ticket)
+ticket_iter_cb (void *cls, struct GNUNET_RECLAIM_Ticket *ticket, const char*
+                rp_uri)
 {
   struct TicketIteration *ti = cls;
   struct GNUNET_MQ_Envelope *env;
   struct TicketResultMessage *trm;
   size_t tkt_len;
+  size_t rp_uri_len;
 
   if (NULL == ticket)
     tkt_len = 0;
   else
-    tkt_len = GNUNET_RECLAIM_ticket_serialize_get_size (ticket);
+    tkt_len = strlen (ticket->gns_name) + 1;
 
+  if (NULL == rp_uri)
+    rp_uri_len = 0;
+  else
+    rp_uri_len = strlen (rp_uri) + 1;
   env = GNUNET_MQ_msg_extra (trm,
-                             tkt_len,
+                             tkt_len + rp_uri_len,
                              GNUNET_MESSAGE_TYPE_RECLAIM_TICKET_RESULT);
   if (NULL == ticket)
   {
@@ -2493,13 +2469,13 @@ ticket_iter_cb (void *cls, struct GNUNET_RECLAIM_Ticket 
*ticket)
   }
   else
   {
-    GNUNET_RECLAIM_write_ticket_to_buffer (ticket,
-                                           &trm[1],
-                                           tkt_len);
+    memcpy (&trm[1], ticket, tkt_len);
   }
+  memcpy ((char*) &trm[1] + tkt_len, rp_uri, rp_uri_len);
   trm->id = htonl (ti->r_id);
   GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, "Sending TICKET_RESULT message\n");
   trm->tkt_len = htons (tkt_len);
+  trm->rp_uri_len = htons (rp_uri_len);
   trm->presentations_len = htons (0);
   GNUNET_MQ_send (ti->client->mq, env);
   if (NULL == ticket)
diff --git a/src/service/reclaim/gnunet-service-reclaim_tickets.c 
b/src/service/reclaim/gnunet-service-reclaim_tickets.c
index 7099fa80f..fcedc07ff 100644
--- a/src/service/reclaim/gnunet-service-reclaim_tickets.c
+++ b/src/service/reclaim/gnunet-service-reclaim_tickets.c
@@ -26,6 +26,7 @@
  */
 #include "gnunet-service-reclaim_tickets.h"
 #include "gnunet_common.h"
+#include "gnunet_reclaim_service.h"
 #include <string.h>
 
 
@@ -82,7 +83,7 @@ struct RECLAIM_TICKETS_ConsumeHandle
   /**
    * LookupRequest
    */
-  struct GNUNET_GNS_LookupRequest *lookup_request;
+  struct GNUNET_GNS_LookupWithTldRequest *lookup_request;
 
   /**
    * Lookup DLL
@@ -123,6 +124,13 @@ struct RECLAIM_TICKETS_ConsumeHandle
    * Callback closure
    */
   void *cb_cls;
+
+  /**
+   * The ticket audience (= relying party) URI.
+   * 0-terminated string.
+   * Example: 
"urn:gns:000G002B4RF1XPBXDPGZA0PT16BHQCS427YQK4NC84KZMK7TK8C2Z5GMK8"
+   */
+  char rp_uri[GNUNET_RECLAIM_TICKET_RP_URI_MAX_LEN];
 };
 
 
@@ -138,7 +146,7 @@ struct ParallelLookup
   struct ParallelLookup *prev;
 
   /* The GNS request */
-  struct GNUNET_GNS_LookupRequest *lookup_request;
+  struct GNUNET_GNS_LookupWithTldRequest *lookup_request;
 
   /* The handle the return to */
   struct RECLAIM_TICKETS_ConsumeHandle *handle;
@@ -197,6 +205,18 @@ struct TicketIssueHandle
    * Callback cls
    */
   void *cb_cls;
+
+  /**
+   * The ticket audience (= relying party) URI.
+   * 0-terminated string.
+   * Example: 
"urn:gns:000G002B4RF1XPBXDPGZA0PT16BHQCS427YQK4NC84KZMK7TK8C2Z5GMK8"
+   */
+  char rp_uri[GNUNET_RECLAIM_TICKET_RP_URI_MAX_LEN];
+
+  /**
+   * The ticket random identifier
+   */
+  struct GNUNET_RECLAIM_Identifier rnd;
 };
 
 
@@ -886,6 +906,26 @@ rvk_attrs_err_cb (void *cls)
 }
 
 
+static enum GNUNET_GenericReturnValue
+get_iss_from_ticket (const struct GNUNET_RECLAIM_Ticket *ticket,
+                     struct GNUNET_CRYPTO_PublicKey *issuer)
+{
+  char *label;
+  char *key;
+  char *tmp;
+  int ret;
+
+  tmp = GNUNET_strdup (ticket->gns_name);
+  label = strtok (tmp, ".");
+  GNUNET_assert (NULL != label);
+  key = strtok (NULL, ".");
+  GNUNET_assert (NULL != key);
+  ret = GNUNET_CRYPTO_public_key_from_string (key, issuer);
+  GNUNET_free (tmp);
+  return ret;
+}
+
+
 /**
  * Revoke a ticket.
  * We start by looking up attribute references in order
@@ -905,17 +945,17 @@ RECLAIM_TICKETS_revoke (const struct 
GNUNET_RECLAIM_Ticket *ticket,
 {
   struct RECLAIM_TICKETS_RevokeHandle *rvk;
   char *label;
+  char *tmp;
 
   rvk = GNUNET_new (struct RECLAIM_TICKETS_RevokeHandle);
   rvk->cb = cb;
   rvk->cb_cls = cb_cls;
   rvk->identity = *identity;
   rvk->ticket = *ticket;
-  GNUNET_CRYPTO_key_get_public (&rvk->identity, &rvk->ticket.identity);
-  /** Get shared attributes **/
-  label = GNUNET_STRINGS_data_to_string_alloc (&ticket->rnd,
-                                               sizeof(ticket->rnd));
+  tmp = GNUNET_strdup (ticket->gns_name);
+  label = strtok (tmp, ".");
   GNUNET_assert (NULL != label);
+  /** Get shared attributes **/
   rvk->ns_qe = GNUNET_NAMESTORE_records_lookup (nsh,
                                                 identity,
                                                 label,
@@ -923,7 +963,7 @@ RECLAIM_TICKETS_revoke (const struct GNUNET_RECLAIM_Ticket 
*ticket,
                                                 rvk,
                                                 &revoke_attrs_cb,
                                                 rvk);
-  GNUNET_free (label);
+  GNUNET_free (tmp);
   return rvk;
 }
 
@@ -956,13 +996,13 @@ cleanup_cth (struct RECLAIM_TICKETS_ConsumeHandle *cth)
   struct ParallelLookup *lu;
 
   if (NULL != cth->lookup_request)
-    GNUNET_GNS_lookup_cancel (cth->lookup_request);
+    GNUNET_GNS_lookup_with_tld_cancel (cth->lookup_request);
   if (NULL != cth->kill_task)
     GNUNET_SCHEDULER_cancel (cth->kill_task);
   while (NULL != (lu = cth->parallel_lookups_head))
   {
     if (NULL != lu->lookup_request)
-      GNUNET_GNS_lookup_cancel (lu->lookup_request);
+      GNUNET_GNS_lookup_with_tld_cancel (lu->lookup_request);
     GNUNET_free (lu->label);
     GNUNET_CONTAINER_DLL_remove (cth->parallel_lookups_head,
                                  cth->parallel_lookups_tail,
@@ -978,26 +1018,22 @@ cleanup_cth (struct RECLAIM_TICKETS_ConsumeHandle *cth)
 }
 
 
-/**
- * We found an attribute record.
- *
- * @param cls handle to the operation
- * @param rd_count size of record set
- * @param rd record set
- */
 static void
 process_parallel_lookup_result (void *cls,
+                                int is_gns,
                                 uint32_t rd_count,
                                 const struct GNUNET_GNSRECORD_Data *rd)
 {
   struct ParallelLookup *parallel_lookup = cls;
   struct RECLAIM_TICKETS_ConsumeHandle *cth = parallel_lookup->handle;
   struct GNUNET_RECLAIM_AttributeListEntry *attr_le;
+  struct GNUNET_CRYPTO_PublicKey iss;
 
   GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
               "Parallel lookup finished (count=%u)\n",
               rd_count);
 
+  GNUNET_assert (GNUNET_YES == is_gns);
   GNUNET_CONTAINER_DLL_remove (cth->parallel_lookups_head,
                                cth->parallel_lookups_tail,
                                parallel_lookup);
@@ -1030,7 +1066,8 @@ process_parallel_lookup_result (void *cls,
   if (NULL != cth->parallel_lookups_head)
     return; // Wait for more
   /* Else we are done */
-  cth->cb (cth->cb_cls, &cth->ticket.identity,
+  get_iss_from_ticket (&cth->ticket, &iss);
+  cth->cb (cth->cb_cls, &iss,
            cth->attrs, cth->presentations, GNUNET_OK, NULL);
   cleanup_cth (cth);
 }
@@ -1051,7 +1088,7 @@ abort_parallel_lookups (void *cls)
   cth->kill_task = NULL;
   for (lu = cth->parallel_lookups_head; NULL != lu;)
   {
-    GNUNET_GNS_lookup_cancel (lu->lookup_request);
+    GNUNET_GNS_lookup_with_tld_cancel (lu->lookup_request);
     GNUNET_free (lu->label);
     tmp = lu->next;
     GNUNET_CONTAINER_DLL_remove (cth->parallel_lookups_head,
@@ -1064,21 +1101,14 @@ abort_parallel_lookups (void *cls)
 }
 
 
-/**
- * GNS result with attribute references.
- * For each result, we start a (parallel) lookup of the actual
- * attribute record under the referenced label.
- *
- * @param cls handle to the operation
- * @param rd_count size of the record set
- * @param rd record set
- */
 static void
 lookup_authz_cb (void *cls,
+                 int is_gns,
                  uint32_t rd_count,
                  const struct GNUNET_GNSRECORD_Data *rd)
 {
   struct RECLAIM_TICKETS_ConsumeHandle *cth = cls;
+  struct GNUNET_CRYPTO_PublicKey iss;
   struct ParallelLookup *parallel_lookup;
   const char *rp_uri = NULL;
   char *lbl;
@@ -1086,6 +1116,7 @@ lookup_authz_cb (void *cls,
 
   cth->lookup_request = NULL;
 
+  GNUNET_assert (GNUNET_YES == is_gns);
   GNUNET_STATISTICS_update (stats,
                             "reclaim_authz_lookup_time_total",
                             GNUNET_TIME_absolute_get_duration (
@@ -1125,13 +1156,12 @@ lookup_authz_cb (void *cls,
       parallel_lookup->label = lbl;
       parallel_lookup->lookup_start_time = GNUNET_TIME_absolute_get ();
       parallel_lookup->lookup_request =
-        GNUNET_GNS_lookup (gns,
-                           lbl,
-                           &cth->ticket.identity,
-                           GNUNET_GNSRECORD_TYPE_ANY,
-                           GNUNET_GNS_LO_DEFAULT,
-                           &process_parallel_lookup_result,
-                           parallel_lookup);
+        GNUNET_GNS_lookup_with_tld (gns,
+                                    cth->ticket.gns_name,
+                                    GNUNET_GNSRECORD_TYPE_ANY,
+                                    GNUNET_GNS_LO_DEFAULT,
+                                    &process_parallel_lookup_result,
+                                    parallel_lookup);
       GNUNET_CONTAINER_DLL_insert (cth->parallel_lookups_head,
                                    cth->parallel_lookups_tail,
                                    parallel_lookup);
@@ -1148,20 +1178,22 @@ lookup_authz_cb (void *cls,
     /**
      * Return error
      */
-    cth->cb (cth->cb_cls, &cth->ticket.identity,
+    get_iss_from_ticket (&cth->ticket, &iss);
+    cth->cb (cth->cb_cls, &iss,
              cth->attrs, NULL, GNUNET_NO, NULL);
     cleanup_cth (cth);
     return;
   }
-  if (0 != strcmp (rp_uri, cth->ticket.rp_uri))
+  if (0 != strcmp (rp_uri, cth->rp_uri))
   {
     GNUNET_log (GNUNET_ERROR_TYPE_WARNING,
                 "RP URI does not match consume request: `%s' != `%s'\n",
-                rp_uri, cth->ticket.rp_uri);
+                rp_uri, cth->rp_uri);
     /**
      * Return error
      */
-    cth->cb (cth->cb_cls, &cth->ticket.identity,
+    get_iss_from_ticket (&cth->ticket, &iss);
+    cth->cb (cth->cb_cls, &iss,
              cth->attrs, NULL, GNUNET_NO, NULL);
     cleanup_cth (cth);
     return;
@@ -1181,7 +1213,8 @@ lookup_authz_cb (void *cls,
   /**
    * No references found, return empty attribute list
    */
-  cth->cb (cth->cb_cls, &cth->ticket.identity,
+  get_iss_from_ticket (&cth->ticket, &iss);
+  cth->cb (cth->cb_cls, &iss,
            cth->attrs, NULL, GNUNET_OK, NULL);
   cleanup_cth (cth);
 }
@@ -1205,6 +1238,7 @@ RECLAIM_TICKETS_consume (const struct 
GNUNET_RECLAIM_Ticket *ticket,
 {
   struct RECLAIM_TICKETS_ConsumeHandle *cth;
   char *label;
+  char *tmp;
 
   cth = GNUNET_new (struct RECLAIM_TICKETS_ConsumeHandle);
 
@@ -1213,24 +1247,21 @@ RECLAIM_TICKETS_consume (const struct 
GNUNET_RECLAIM_Ticket *ticket,
   cth->ticket = *ticket;
   cth->cb = cb;
   cth->cb_cls = cb_cls;
-  label =
-    GNUNET_STRINGS_data_to_string_alloc (&cth->ticket.rnd,
-                                         sizeof(cth->ticket.rnd));
-  char *str = GNUNET_CRYPTO_public_key_to_string (&cth->ticket.identity);
+  tmp = GNUNET_strdup (ticket->gns_name);
+  label = strtok (tmp, ".");
+  GNUNET_assert (NULL != label);
   GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
-              "Looking for AuthZ info under %s in %s\n",
-              label, str);
-  GNUNET_free (str);
+              "Looking for AuthZ info under %s\n",
+              tmp);
   cth->lookup_start_time = GNUNET_TIME_absolute_get ();
   cth->lookup_request =
-    GNUNET_GNS_lookup (gns,
-                       label,
-                       &cth->ticket.identity,
-                       GNUNET_GNSRECORD_TYPE_RECLAIM_ATTRIBUTE_REF,
-                       GNUNET_GNS_LO_DEFAULT,
-                       &lookup_authz_cb,
-                       cth);
-  GNUNET_free (label);
+    GNUNET_GNS_lookup_with_tld (gns,
+                                ticket->gns_name,
+                                GNUNET_GNSRECORD_TYPE_RECLAIM_ATTRIBUTE_REF,
+                                GNUNET_GNS_LO_DEFAULT,
+                                &lookup_authz_cb,
+                                cth);
+  GNUNET_free (tmp);
   return cth;
 }
 
@@ -1321,7 +1352,8 @@ issue_ticket (struct TicketIssueHandle *ih)
   // Worst case we have one presentation per attribute plus the ticket
   // plus the RP URI record
   attrs_record =
-    GNUNET_malloc ((2 * attrs_count + 2) * sizeof(struct 
GNUNET_GNSRECORD_Data));
+    GNUNET_malloc ((2 * attrs_count + 2) * sizeof(struct 
GNUNET_GNSRECORD_Data))
+  ;
   i = 0;
   for (le = ih->attrs->list_head; NULL != le; le = le->next)
   {
@@ -1400,11 +1432,9 @@ issue_ticket (struct TicketIssueHandle *ih)
     }
   }
   attrs_record[i].data_size =
-    GNUNET_RECLAIM_ticket_serialize_get_size (&ih->ticket);
+    strlen (ih->ticket.gns_name) + 1;
   tkt_data = GNUNET_malloc (attrs_record[i].data_size);
-  GNUNET_RECLAIM_write_ticket_to_buffer (&ih->ticket,
-                                         tkt_data,
-                                         attrs_record[i].data_size);
+  memcpy (tkt_data, &ih->ticket, attrs_record[i].data_size);
   // The ticket: Could be removed?
   attrs_record[i].data = tkt_data;
   attrs_record[i].expiration_time = ticket_refresh_interval.rel_value_us;
@@ -1413,8 +1443,8 @@ issue_ticket (struct TicketIssueHandle *ih)
     GNUNET_GNSRECORD_RF_RELATIVE_EXPIRATION | GNUNET_GNSRECORD_RF_PRIVATE;
   i++;
   // The RP URI
-  attrs_record[i].data_size = strlen (ih->ticket.rp_uri);
-  attrs_record[i].data = ih->ticket.rp_uri;
+  attrs_record[i].data_size = strlen (ih->rp_uri);
+  attrs_record[i].data = ih->rp_uri;
   attrs_record[i].expiration_time = ticket_refresh_interval.rel_value_us;
   attrs_record[i].record_type = GNUNET_DNSPARSER_TYPE_URI;
   attrs_record[i].flags =
@@ -1422,8 +1452,8 @@ issue_ticket (struct TicketIssueHandle *ih)
   i++;
 
   label =
-    GNUNET_STRINGS_data_to_string_alloc (&ih->ticket.rnd,
-                                         sizeof(ih->ticket.rnd));
+    GNUNET_STRINGS_data_to_string_alloc (&ih->rnd,
+                                         sizeof(ih->rnd));
   struct GNUNET_CRYPTO_PublicKey pub;
   GNUNET_CRYPTO_key_get_public (&ih->identity,
                                 &pub);
@@ -1431,6 +1461,7 @@ issue_ticket (struct TicketIssueHandle *ih)
   GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
               "Storing AuthZ information under %s in %s\n", label, str);
   GNUNET_free (str);
+  sprintf (ih->ticket.gns_name, "%s.%s", label, str);
   // Publish record
   ih->ns_qe = GNUNET_NAMESTORE_record_set_store (nsh,
                                                  &ih->identity,
@@ -1499,7 +1530,7 @@ filter_tickets_cb (void *cls,
                    const struct GNUNET_GNSRECORD_Data *rd)
 {
   struct TicketIssueHandle *tih = cls;
-  struct GNUNET_RECLAIM_Ticket ticket;
+  struct GNUNET_RECLAIM_Ticket *ticket;
   struct GNUNET_RECLAIM_Presentation *presentation;
   struct GNUNET_RECLAIM_PresentationList *ticket_presentations;
   struct GNUNET_RECLAIM_Credential *cred;
@@ -1508,6 +1539,7 @@ filter_tickets_cb (void *cls,
   unsigned int attr_cnt = 0;
   unsigned int pres_cnt = 0;
   int ticket_found = GNUNET_NO;
+  int rp_uri_matches = GNUNET_NO;
 
   for (le = tih->attrs->list_head; NULL != le; le = le->next)
   {
@@ -1519,7 +1551,6 @@ filter_tickets_cb (void *cls,
   // ticket search
   unsigned int found_attrs_cnt = 0;
   unsigned int found_pres_cnt = 0;
-  size_t read;
   ticket_presentations = GNUNET_new (struct GNUNET_RECLAIM_PresentationList);
 
   for (int i = 0; i < rd_count; i++)
@@ -1527,27 +1558,19 @@ filter_tickets_cb (void *cls,
     // found ticket
     if (GNUNET_GNSRECORD_TYPE_RECLAIM_TICKET == rd[i].record_type)
     {
-      if ((GNUNET_SYSERR ==
-           GNUNET_RECLAIM_read_ticket_from_buffer (rd[i].data,
-                                                   rd[i].data_size,
-                                                   &ticket,
-                                                   &read)) ||
-          (read != rd[i].data_size))
-      {
-        GNUNET_log (GNUNET_ERROR_TYPE_ERROR,
-                    "Failed to deserialize ticket from record\n");
-        continue;
-      }
+      ticket = (struct GNUNET_RECLAIM_Ticket *) rd[i].data;
+      tih->ticket = *ticket;
+      ticket_found = GNUNET_YES;
+    }
+    if (GNUNET_DNSPARSER_TYPE_URI == rd[i].record_type)
+    {
       // cmp audience
-      if (0 == strcmp (tih->ticket.rp_uri,
-                       ticket.rp_uri))
-      {
-        tih->ticket = ticket;
-        ticket_found = GNUNET_YES;
+      if (0 != strncmp (tih->rp_uri,
+                        rd[i].data,
+                        rd[i].data_size))
         continue;
-      }
+      rp_uri_matches = GNUNET_YES;
     }
-
     // cmp requested attributes with ticket attributes
     if (GNUNET_GNSRECORD_TYPE_RECLAIM_ATTRIBUTE_REF == rd[i].record_type)
     {
@@ -1631,7 +1654,8 @@ filter_tickets_cb (void *cls,
    */
   if ((attr_cnt == found_attrs_cnt) &&
       (pres_cnt == found_pres_cnt) &&
-      (GNUNET_YES == ticket_found))
+      (GNUNET_YES == ticket_found) &&
+      (GNUNET_YES == rp_uri_matches))
   {
     GNUNET_NAMESTORE_zone_iteration_stop (tih->ns_it);
     tih->cb (tih->cb_cls, &tih->ticket, ticket_presentations, GNUNET_OK, NULL);
@@ -1657,8 +1681,7 @@ filter_tickets_finished_cb (void *cls)
 {
   struct TicketIssueHandle *tih = cls;
 
-  GNUNET_CRYPTO_key_get_public (&tih->identity, &tih->ticket.identity);
-  GNUNET_RECLAIM_id_generate (&tih->ticket.rnd);
+  GNUNET_RECLAIM_id_generate (&tih->rnd);
   issue_ticket (tih);
 }
 
@@ -1689,7 +1712,7 @@ RECLAIM_TICKETS_issue (const struct 
GNUNET_CRYPTO_PrivateKey *identity,
   tih->attrs = GNUNET_RECLAIM_attribute_list_dup (attrs);
   tih->presentations = GNUNET_new (struct GNUNET_RECLAIM_PresentationList);
   tih->identity = *identity;
-  memcpy (tih->ticket.rp_uri, rp, strlen (rp) + 1);
+  memcpy (tih->rp_uri, rp, strlen (rp) + 1);
 
   // First check whether the ticket has already been issued
   tih->ns_it =
@@ -1741,27 +1764,23 @@ collect_tickets_cb (void *cls,
                     const struct GNUNET_GNSRECORD_Data *rd)
 {
   struct RECLAIM_TICKETS_Iterator *iter = cls;
-  struct GNUNET_RECLAIM_Ticket ticket;
-  size_t read;
+  struct GNUNET_RECLAIM_Ticket *ticket;
+  int ticket_found = GNUNET_NO;
+  const char *rp_uri = NULL;
 
   for (int i = 0; i < rd_count; i++)
   {
+    if (GNUNET_DNSPARSER_TYPE_URI == rd[i].record_type)
+      rp_uri = rd[i].data;
     if (GNUNET_GNSRECORD_TYPE_RECLAIM_TICKET != rd[i].record_type)
       continue;
-    if ((GNUNET_SYSERR ==
-         GNUNET_RECLAIM_read_ticket_from_buffer (rd[i].data,
-                                                 rd[i].data_size,
-                                                 &ticket,
-                                                 &read)) ||
-        (read != rd[i].data_size))
-    {
-      GNUNET_log (GNUNET_ERROR_TYPE_ERROR,
-                  "Failed to deserialize ticket from record\n");
-      continue;
-    }
-    iter->cb (iter->cb_cls, &ticket);
-    return;
+    if ((GNUNET_YES == ticket_found) && (NULL != rp_uri))
+      break;
+    ticket = (struct GNUNET_RECLAIM_Ticket *) rd[i].data;
+    ticket_found = GNUNET_YES;
   }
+  if ((GNUNET_YES == ticket_found) && (NULL != rp_uri))
+    iter->cb (iter->cb_cls, ticket, rp_uri);
   GNUNET_NAMESTORE_zone_iterator_next (iter->ns_it, 1);
 }
 
@@ -1777,7 +1796,7 @@ collect_tickets_finished_cb (void *cls)
   struct RECLAIM_TICKETS_Iterator *iter = cls;
 
   iter->ns_it = NULL;
-  iter->cb (iter->cb_cls, NULL);
+  iter->cb (iter->cb_cls, NULL, NULL);
   cleanup_iter (iter);
 }
 
@@ -1793,7 +1812,7 @@ collect_tickets_error_cb (void *cls)
   struct RECLAIM_TICKETS_Iterator *iter = cls;
 
   iter->ns_it = NULL;
-  iter->cb (iter->cb_cls, NULL);
+  iter->cb (iter->cb_cls, NULL, NULL);
   cleanup_iter (iter);
 }
 
diff --git a/src/service/reclaim/gnunet-service-reclaim_tickets.h 
b/src/service/reclaim/gnunet-service-reclaim_tickets.h
index 93e48628a..6e610493b 100644
--- a/src/service/reclaim/gnunet-service-reclaim_tickets.h
+++ b/src/service/reclaim/gnunet-service-reclaim_tickets.h
@@ -102,10 +102,12 @@ struct TicketRecordsEntry
  *
  * @param cls closure
  * @param ticket the ticket
+ * @param rp_uri the RP URI associated with the ticket
  */
 typedef void (*RECLAIM_TICKETS_TicketIter) (
   void *cls,
-  struct GNUNET_RECLAIM_Ticket *ticket);
+  struct GNUNET_RECLAIM_Ticket *ticket,
+  const char* rp_uri);
 
 
 /**
diff --git a/src/service/reclaim/reclaim.h b/src/service/reclaim/reclaim.h
index eebd39c29..33764c831 100644
--- a/src/service/reclaim/reclaim.h
+++ b/src/service/reclaim/reclaim.h
@@ -505,6 +505,11 @@ struct TicketResultMessage
    */
   uint16_t tkt_len GNUNET_PACKED;
 
+  /**
+   * RP URI length
+   */
+  uint16_t rp_uri_len GNUNET_PACKED;
+
   /**
    * Length of new presentations created
    */
@@ -512,6 +517,7 @@ struct TicketResultMessage
 
   /*
    * Followed by the serialized ticket
+   * Followed by the RP URI
    * Followed by the serialized GNUNET_RECLAIM_PresentationList
    */
 };
diff --git a/src/service/reclaim/reclaim_api.c 
b/src/service/reclaim/reclaim_api.c
index 92e240587..a9d9bdada 100644
--- a/src/service/reclaim/reclaim_api.c
+++ b/src/service/reclaim/reclaim_api.c
@@ -919,11 +919,13 @@ check_ticket_result (void *cls, const struct 
TicketResultMessage *msg)
   size_t msg_len;
   size_t pres_len;
   size_t tkt_len;
+  size_t rp_uri_len;
 
   msg_len = ntohs (msg->header.size);
   pres_len = ntohs (msg->presentations_len);
   tkt_len = ntohs (msg->tkt_len);
-  if (msg_len != sizeof(*msg) + pres_len + tkt_len)
+  rp_uri_len = ntohs (msg->rp_uri_len);
+  if (msg_len != sizeof(*msg) + pres_len + tkt_len + rp_uri_len)
   {
     GNUNET_break (0);
     return GNUNET_SYSERR;
@@ -947,13 +949,16 @@ handle_ticket_result (void *cls, const struct 
TicketResultMessage *msg)
   struct GNUNET_RECLAIM_TicketIterator *it;
   struct GNUNET_RECLAIM_PresentationList *presentation;
   uint32_t r_id = ntohl (msg->id);
-  struct GNUNET_RECLAIM_Ticket ticket;
+  struct GNUNET_RECLAIM_Ticket *ticket = NULL;
   size_t pres_len;
   size_t tkt_len;
-  size_t tb_read;
+  size_t rp_uri_len;
+  size_t tb_read = 0;
   char *buf;
+  char *rp_uri = NULL;
 
   tkt_len = ntohs (msg->tkt_len);
+  rp_uri_len = ntohs (msg->rp_uri_len);
   pres_len = ntohs (msg->presentations_len);
   for (op = handle->op_head; NULL != op; op = op->next)
     if (op->r_id == r_id)
@@ -966,13 +971,12 @@ handle_ticket_result (void *cls, const struct 
TicketResultMessage *msg)
   buf = (char*) &msg[1];
   if (0 < tkt_len)
   {
-    GNUNET_assert (GNUNET_SYSERR !=
-                   GNUNET_RECLAIM_read_ticket_from_buffer (buf,
-                                                           tkt_len,
-                                                           &ticket,
-                                                           &tb_read));
-    buf += tb_read;
+    ticket = (struct GNUNET_RECLAIM_Ticket*) buf;
+    buf += tkt_len;
+    tb_read += tkt_len;
   }
+  if (0 < rp_uri_len)
+    rp_uri = buf;
   if (NULL != op)
   {
     if (0 < pres_len)
@@ -989,7 +993,7 @@ handle_ticket_result (void *cls, const struct 
TicketResultMessage *msg)
     {
       if (NULL != op->ti_cb)
         op->ti_cb (op->cls,
-                   &ticket,
+                   ticket,
                    (0 < pres_len) ? presentation : NULL);
     }
     if (0 < pres_len)
@@ -1010,7 +1014,7 @@ handle_ticket_result (void *cls, const struct 
TicketResultMessage *msg)
     else
     {
       if (NULL != it->tr_cb)
-        it->tr_cb (it->cls, &ticket);
+        it->tr_cb (it->cls, ticket, rp_uri);
     }
     return;
   }
@@ -1555,14 +1559,14 @@ GNUNET_RECLAIM_ticket_consume (
   op->atr_cb = cb;
   op->cls = cb_cls;
   op->r_id = h->r_id_gen++;
-  tkt_len = GNUNET_RECLAIM_ticket_serialize_get_size (ticket);
+  tkt_len = strlen (ticket->gns_name) + 1;
   GNUNET_CONTAINER_DLL_insert_tail (h->op_head, h->op_tail, op);
   op->env = GNUNET_MQ_msg_extra (ctm,
                                  tkt_len,
                                  GNUNET_MESSAGE_TYPE_RECLAIM_CONSUME_TICKET);
   buf = (char*) &ctm[1];
   ctm->tkt_len = htons (tkt_len);
-  GNUNET_RECLAIM_write_ticket_to_buffer (ticket, buf, tkt_len);
+  memcpy (buf, ticket, tkt_len);
   ctm->id = htonl (op->r_id);
   if (NULL != h->mq)
     GNUNET_MQ_send_copy (h->mq, op->env);
@@ -1700,7 +1704,7 @@ GNUNET_RECLAIM_ticket_revoke (
   op->r_id = rid;
   GNUNET_CONTAINER_DLL_insert_tail (h->op_head, h->op_tail, op);
   key_len = GNUNET_CRYPTO_private_key_get_length (identity);
-  tkt_len = GNUNET_RECLAIM_ticket_serialize_get_size (ticket);
+  tkt_len = strlen (ticket->gns_name) + 1;
   op->env = GNUNET_MQ_msg_extra (msg,
                                  key_len + tkt_len,
                                  GNUNET_MESSAGE_TYPE_RECLAIM_REVOKE_TICKET);
@@ -1713,9 +1717,7 @@ GNUNET_RECLAIM_ticket_revoke (
                                                        key_len);
   GNUNET_assert (0 <= written);
   buf += written;
-  GNUNET_RECLAIM_write_ticket_to_buffer (ticket,
-                                         buf,
-                                         tkt_len);
+  memcpy (buf, ticket, tkt_len);
   if (NULL != h->mq)
   {
     GNUNET_MQ_send (h->mq, op->env);
@@ -1725,72 +1727,4 @@ GNUNET_RECLAIM_ticket_revoke (
 }
 
 
-size_t
-GNUNET_RECLAIM_ticket_serialize_get_size (const struct
-                                          GNUNET_RECLAIM_Ticket *tkt)
-{
-  size_t size = sizeof (tkt->rnd);
-  size += GNUNET_CRYPTO_public_key_get_length (&tkt->identity);
-  size += strlen (tkt->rp_uri) + 1;
-  return size;
-}
-
-
-enum GNUNET_GenericReturnValue
-GNUNET_RECLAIM_read_ticket_from_buffer (const void *buffer,
-                                        size_t len,
-                                        struct GNUNET_RECLAIM_Ticket *tkt,
-                                        size_t *tb_read)
-{
-  const char *tmp = buffer;
-  size_t read = 0;
-  size_t left = len;
-  if (GNUNET_SYSERR ==
-      GNUNET_CRYPTO_read_public_key_from_buffer (tmp,
-                                                 left,
-                                                 &tkt->identity,
-                                                 &read))
-    return GNUNET_SYSERR;
-  left -= read;
-  tmp += read;
-  if (left <= sizeof (tkt->rnd))
-    return GNUNET_SYSERR;
-  if (left - sizeof (tkt->rnd) > GNUNET_RECLAIM_TICKET_RP_URI_MAX_LEN)
-    return GNUNET_SYSERR;
-  memcpy (tkt->rp_uri, tmp, left - sizeof (tkt->rnd));
-  tmp += left - sizeof (tkt->rnd);
-  left = sizeof (tkt->rnd);
-  memcpy (&tkt->rnd, tmp, sizeof (tkt->rnd));
-  *tb_read = tmp - (char*) buffer + sizeof (tkt->rnd);
-  return GNUNET_OK;
-}
-
-
-ssize_t
-GNUNET_RECLAIM_write_ticket_to_buffer (const struct
-                                       GNUNET_RECLAIM_Ticket *tkt,
-                                       void *buffer,
-                                       size_t len)
-{
-  char *tmp = buffer;
-  size_t left = len;
-  ssize_t written = 0;
-  written = GNUNET_CRYPTO_write_public_key_to_buffer (&tkt->identity,
-                                                      buffer,
-                                                      left);
-  if (0 > written)
-    return written;
-  left -= written;
-  tmp += written;
-  memcpy (tmp, tkt->rp_uri, strlen (tkt->rp_uri) + 1);
-  written = strlen (tkt->rp_uri) + 1;
-  left -= written;
-  tmp += written;
-  if (left < sizeof (tkt->rnd))
-    return -1;
-  memcpy (tmp, &tkt->rnd, sizeof (tkt->rnd));
-  return tmp - (char*) buffer + sizeof (tkt->rnd);
-}
-
-
 /* end of reclaim_api.c */
diff --git a/src/service/rest/json_reclaim.c b/src/service/rest/json_reclaim.c
index 6cbd44adf..3b43a37e4 100644
--- a/src/service/rest/json_reclaim.c
+++ b/src/service/rest/json_reclaim.c
@@ -170,9 +170,7 @@ static int
 parse_ticket (void *cls, json_t *root, struct GNUNET_JSON_Specification *spec)
 {
   struct GNUNET_RECLAIM_Ticket *ticket;
-  const char *rnd_str;
-  const char *aud_str;
-  const char *id_str;
+  const char *gns_str;
   int unpack_state;
 
   GNUNET_assert (NULL != root);
@@ -185,13 +183,9 @@ parse_ticket (void *cls, json_t *root, struct 
GNUNET_JSON_Specification *spec)
   }
   // interpret single ticket
   unpack_state = json_unpack (root,
-                              "{s:s, s:s, s:s!}",
-                              "rnd",
-                              &rnd_str,
-                              "audience",
-                              &aud_str,
-                              "issuer",
-                              &id_str);
+                              "{s:s}",
+                              "gns_name",
+                              &gns_str);
   if (0 != unpack_state)
   {
     GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
@@ -199,27 +193,7 @@ parse_ticket (void *cls, json_t *root, struct 
GNUNET_JSON_Specification *spec)
     return GNUNET_SYSERR;
   }
   ticket = GNUNET_new (struct GNUNET_RECLAIM_Ticket);
-  if (GNUNET_OK != GNUNET_STRINGS_string_to_data (rnd_str,
-                                                  strlen (rnd_str),
-                                                  &ticket->rnd,
-                                                  sizeof(ticket->rnd)))
-  {
-    GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, "Rnd invalid\n");
-    GNUNET_free (ticket);
-    return GNUNET_SYSERR;
-  }
-  if (GNUNET_OK !=
-      GNUNET_STRINGS_string_to_data (id_str,
-                                     strlen (id_str),
-                                     &ticket->identity,
-                                     sizeof(ticket->identity)))
-  {
-    GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, "Identity invalid\n");
-    GNUNET_free (ticket);
-    return GNUNET_SYSERR;
-  }
-
-  strcpy (ticket->rp_uri, aud_str);
+  strncpy (ticket->gns_name, gns_str, sizeof (ticket->gns_name));
 
   *(struct GNUNET_RECLAIM_Ticket **) spec->ptr = ticket;
   return GNUNET_OK;
@@ -277,7 +251,8 @@ GNUNET_RECLAIM_JSON_spec_ticket (struct 
GNUNET_RECLAIM_Ticket **ticket)
    * @return #GNUNET_OK upon successful parsing; #GNUNET_SYSERR upon error
    */
 static int
-parse_credential (void *cls, json_t *root, struct GNUNET_JSON_Specification 
*spec)
+parse_credential (void *cls, json_t *root, struct GNUNET_JSON_Specification *
+                  spec)
 {
   struct GNUNET_RECLAIM_Credential *cred;
   const char *name_str = NULL;
@@ -316,9 +291,12 @@ parse_credential (void *cls, json_t *root, struct 
GNUNET_JSON_Specification *spe
                 "Error json object has a wrong format!\n");
     return GNUNET_SYSERR;
   }
-  if (json_is_string (val_json)) {
+  if (json_is_string (val_json))
+  {
     val_str = GNUNET_strdup (json_string_value (val_json));
-  } else {
+  }
+  else
+  {
     val_str = json_dumps (val_json, JSON_COMPACT);
   }
   type = GNUNET_RECLAIM_credential_typename_to_number (type_str);
diff --git a/src/service/rest/reclaim_plugin.c 
b/src/service/rest/reclaim_plugin.c
index 921faf8ca..31a795dc8 100644
--- a/src/service/rest/reclaim_plugin.c
+++ b/src/service/rest/reclaim_plugin.c
@@ -434,32 +434,19 @@ collect_finished_cb (void *cls)
  *
  */
 static void
-ticket_collect (void *cls, const struct GNUNET_RECLAIM_Ticket *ticket)
+ticket_collect (void *cls, const struct GNUNET_RECLAIM_Ticket *ticket,
+                const char *rp_uri)
 {
   json_t *json_resource;
   struct RequestHandle *handle = cls;
-  json_t *value;
-  char *tmp;
 
   GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, "Adding ticket\n");
-  tmp = GNUNET_STRINGS_data_to_string_alloc (&ticket->rnd, 
sizeof(ticket->rnd));
   json_resource = json_object ();
-  GNUNET_free (tmp);
   json_array_append (handle->resp_object, json_resource);
 
-  tmp =
-    GNUNET_STRINGS_data_to_string_alloc (&ticket->identity,
-                                         sizeof(struct
-                                                GNUNET_CRYPTO_PublicKey));
-  value = json_string (tmp);
-  json_object_set_new (json_resource, "issuer", value);
-  GNUNET_free (tmp);
-  json_object_set_new (json_resource, "audience", json_string 
(ticket->rp_uri));
-  GNUNET_free (tmp);
-  tmp = GNUNET_STRINGS_data_to_string_alloc (&ticket->rnd, 
sizeof(ticket->rnd));
-  value = json_string (tmp);
-  json_object_set_new (json_resource, "rnd", value);
-  GNUNET_free (tmp);
+  json_object_set_new (json_resource, "gns_name", json_string 
(ticket->gns_name)
+                       );
+  json_object_set_new (json_resource, "rp_uri", json_string (rp_uri));
   GNUNET_RECLAIM_ticket_iteration_next (handle->ticket_it);
 }
 
@@ -932,7 +919,8 @@ parse_jwt (const struct GNUNET_RECLAIM_Credential *cred,
   type_str = "String";
   type = GNUNET_RECLAIM_attribute_typename_to_number (type_str);
   if (GNUNET_SYSERR == GNUNET_RECLAIM_attribute_string_to_value (type,val_str,
-                                                                 (void **) 
&data,
+                                                                 (void **) 
&data
+                                                                 ,
                                                                  &data_size))
   {
     GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
@@ -1128,8 +1116,11 @@ revoke_ticket_cont (struct GNUNET_REST_RequestHandle 
*con_handle,
   struct RequestHandle *handle = cls;
   struct EgoEntry *ego_entry;
   struct GNUNET_RECLAIM_Ticket *ticket = NULL;
+  struct GNUNET_CRYPTO_PublicKey iss;
   struct GNUNET_CRYPTO_PublicKey tmp_pk;
   char term_data[handle->rest_handle->data_size + 1];
+  char *tmp;
+  char *key;
   json_t *data_json;
   json_error_t err;
   struct GNUNET_JSON_Specification tktspec[] =
@@ -1166,15 +1157,21 @@ revoke_ticket_cont (struct GNUNET_REST_RequestHandle 
*con_handle,
     return;
   }
 
+  tmp = GNUNET_strdup (ticket->gns_name);
+  GNUNET_assert (NULL != strtok (tmp, "."));
+  key = strtok (NULL, ".");
+  GNUNET_CRYPTO_public_key_from_string (key, &iss);
+
   for (ego_entry = ego_head; NULL != ego_entry;
        ego_entry = ego_entry->next)
   {
     GNUNET_IDENTITY_ego_get_public_key (ego_entry->ego, &tmp_pk);
-    if (0 == memcmp (&ticket->identity,
+    if (0 == memcmp (&iss,
                      &tmp_pk,
                      sizeof(struct GNUNET_CRYPTO_PublicKey)))
       break;
   }
+  GNUNET_free (tmp);
   if (NULL == ego_entry)
   {
     GNUNET_log (GNUNET_ERROR_TYPE_ERROR, "Identity unknown\n");

-- 
To stop receiving notification emails like this one, please contact
gnunet@gnunet.org.



reply via email to

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