consolidate reclaim attribute lib
authorSchanzenbach, Martin <mschanzenbach@posteo.de>
Fri, 7 Feb 2020 14:51:56 +0000 (15:51 +0100)
committerSchanzenbach, Martin <mschanzenbach@posteo.de>
Sun, 9 Feb 2020 19:38:11 +0000 (20:38 +0100)
30 files changed:
configure.ac
po/POTFILES.in
src/Makefile.am
src/include/Makefile.am
src/include/gnunet_reclaim_attribute_lib.h [deleted file]
src/include/gnunet_reclaim_lib.h [new file with mode: 0644]
src/include/gnunet_reclaim_plugin.h
src/include/gnunet_reclaim_service.h
src/reclaim-attribute/Makefile.am [deleted file]
src/reclaim-attribute/plugin_reclaim_attestation_jwt.c [deleted file]
src/reclaim-attribute/plugin_reclaim_attribute_basic.c [deleted file]
src/reclaim-attribute/reclaim_attestation.c [deleted file]
src/reclaim-attribute/reclaim_attestation.h [deleted file]
src/reclaim-attribute/reclaim_attribute.c [deleted file]
src/reclaim-attribute/reclaim_attribute.h [deleted file]
src/reclaim/Makefile.am
src/reclaim/gnunet-service-reclaim.c
src/reclaim/gnunet-service-reclaim_tickets.h
src/reclaim/json_reclaim.c
src/reclaim/json_reclaim.h
src/reclaim/oidc_helper.c
src/reclaim/plugin_reclaim_attestation_jwt.c [new file with mode: 0644]
src/reclaim/plugin_reclaim_attribute_basic.c [new file with mode: 0644]
src/reclaim/plugin_rest_openid_connect.c
src/reclaim/plugin_rest_reclaim.c
src/reclaim/reclaim_api.c
src/reclaim/reclaim_attestation.c [new file with mode: 0644]
src/reclaim/reclaim_attestation.h [new file with mode: 0644]
src/reclaim/reclaim_attribute.c [new file with mode: 0644]
src/reclaim/reclaim_attribute.h [new file with mode: 0644]

index 23ca78dbb021f897668f793ab7a7d5b664c4a18d..c57a56f9ffe8203c93c1d51f969010123bf9a42d 100644 (file)
@@ -1933,7 +1933,6 @@ src/zonemaster/Makefile
 src/zonemaster/zonemaster.conf
 src/rest/Makefile
 src/abe/Makefile
-src/reclaim-attribute/Makefile
 src/reclaim/Makefile
 pkgconfig/Makefile
 pkgconfig/gnunetarm.pc
index f3376d01ba13c876d7fbf8c68592426bcb672c27..aaeed979cda4c4cb222f9c291484b14769ffc6b3 100644 (file)
@@ -264,19 +264,19 @@ src/pq/pq_prepare.c
 src/pq/pq_query_helper.c
 src/pq/pq_result_helper.c
 src/pt/gnunet-daemon-pt.c
-src/reclaim-attribute/plugin_reclaim_attestation_jwt.c
-src/reclaim-attribute/plugin_reclaim_attribute_basic.c
-src/reclaim-attribute/reclaim_attestation.c
-src/reclaim-attribute/reclaim_attribute.c
 src/reclaim/gnunet-reclaim.c
 src/reclaim/gnunet-service-reclaim.c
 src/reclaim/gnunet-service-reclaim_tickets.c
 src/reclaim/json_reclaim.c
 src/reclaim/oidc_helper.c
 src/reclaim/plugin_gnsrecord_reclaim.c
+src/reclaim/plugin_reclaim_attestation_jwt.c
+src/reclaim/plugin_reclaim_attribute_basic.c
 src/reclaim/plugin_rest_openid_connect.c
 src/reclaim/plugin_rest_reclaim.c
 src/reclaim/reclaim_api.c
+src/reclaim/reclaim_attestation.c
+src/reclaim/reclaim_attribute.c
 src/regex/gnunet-daemon-regexprofiler.c
 src/regex/gnunet-regex-profiler.c
 src/regex/gnunet-regex-simulation-profiler.c
index 7b73a4bb8f686ed8250bdc2d77c28127758d5235..e1d73ab01999b56707e3872f53e32a5dcd209807 100644 (file)
@@ -60,7 +60,6 @@ if HAVE_MHD
 if HAVE_JSON
  REST_DIR = rest
  RECLAIM_DIR = \
-  reclaim-attribute \
   reclaim
 endif
 endif
index 69a493f1eca341d48c363e5822f100c0bf5a0aeb..5c57b5be2b86c6aae8ab495b8bc2efb5f7bd95c8 100644 (file)
@@ -56,7 +56,7 @@ gnunetinclude_HEADERS = \
   gnunet_helper_lib.h \
   gnunet_identity_service.h \
   gnunet_abe_lib.h \
-  gnunet_reclaim_attribute_lib.h \
+  gnunet_reclaim_lib.h \
   gnunet_reclaim_plugin.h \
   gnunet_reclaim_service.h \
   gnunet_json_lib.h \
diff --git a/src/include/gnunet_reclaim_attribute_lib.h b/src/include/gnunet_reclaim_attribute_lib.h
deleted file mode 100644 (file)
index 6d35039..0000000
+++ /dev/null
@@ -1,612 +0,0 @@
-/*
-     This file is part of GNUnet.
-     Copyright (C) 2017 GNUnet e.V.
-
-     GNUnet is free software: you can redistribute it and/or modify it
-     under the terms of the GNU Affero General Public License as published
-     by the Free Software Foundation, either version 3 of the License,
-     or (at your option) any later version.
-
-     GNUnet is distributed in the hope that it will be useful, but
-     WITHOUT ANY WARRANTY; without even the implied warranty of
-     MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
-     Affero General Public License for more details.
-
-     You should have received a copy of the GNU Affero General Public License
-     along with this program.  If not, see <http://www.gnu.org/licenses/>.
-
-     SPDX-License-Identifier: AGPL3.0-or-later
- */
-
-/**
- * @author Martin Schanzenbach
- *
- * @file
- * Identity attribute definitions
- *
- * @defgroup reclaim-attribute reclaim attributes
- * @{
- */
-#ifndef GNUNET_RECLAIM_ATTRIBUTE_LIB_H
-#define GNUNET_RECLAIM_ATTRIBUTE_LIB_H
-
-#ifdef __cplusplus
-extern "C" {
-#if 0 /* keep Emacsens' auto-indent happy */
-}
-#endif
-#endif
-
-#include "gnunet_util_lib.h"
-
-
-/**
- * No value attribute.
- */
-#define GNUNET_RECLAIM_ATTRIBUTE_TYPE_NONE 0
-
-/**
- * String attribute.
- */
-#define GNUNET_RECLAIM_ATTRIBUTE_TYPE_STRING 1
-
-/**
-* No value attestation.
-*/
-#define GNUNET_RECLAIM_ATTESTATION_TYPE_NONE 10
-
-/**
-* A JSON Web Token attestation.
-*/
-#define GNUNET_RECLAIM_ATTESTATION_TYPE_JWT 11
-
-/**
- * We want an ID to be a 256-bit symmetric key
- */
-#define GNUNET_RECLAIM_ID_LENGTH (256 / 8)
-
-/**
- * A reclaim identifier
- * FIXME maybe put this in a different namespace
- */
-struct GNUNET_RECLAIM_Identifier
-{
-  char id[GNUNET_RECLAIM_ID_LENGTH];
-};
-
-static const struct GNUNET_RECLAIM_Identifier GNUNET_RECLAIM_ID_ZERO;
-
-#define GNUNET_RECLAIM_id_is_equal(a,b) ((0 == \
-                                          memcmp (a, \
-                                                  b, \
-                                                  sizeof (GNUNET_RECLAIM_ID_ZERO))) \
-  ? \
-                                         GNUNET_YES : GNUNET_NO)
-
-
-#define GNUNET_RECLAIM_id_is_zero(a) GNUNET_RECLAIM_id_is_equal (a, \
-                                                                 & \
-                                                                 GNUNET_RECLAIM_ID_ZERO)
-
-#define GNUNET_RECLAIM_id_generate(id) \
-  (GNUNET_CRYPTO_random_block (GNUNET_CRYPTO_QUALITY_STRONG, \
-                               id, \
-                               sizeof (GNUNET_RECLAIM_ID_ZERO)))
-
-/**
- * An attribute.
- */
-struct GNUNET_RECLAIM_Attribute
-{
-  /**
-   * ID
-   */
-  struct GNUNET_RECLAIM_Identifier id;
-
-  /**
-   * Referenced ID of Attestation (may be 0 if self-attested)
-   */
-  struct GNUNET_RECLAIM_Identifier attestation;
-
-  /**
-   * Type of Claim
-   */
-  uint32_t type;
-
-  /**
-   * Flags
-   */
-  uint32_t flag;
-
-  /**
-   * The name of the attribute. Note "name" must never be individually
-   * free'd
-   */
-  const char *name;
-
-  /**
-   * Number of bytes in @e data.
-   */
-  size_t data_size;
-
-  /**
-   * Binary value stored as attribute value.  Note: "data" must never
-   * be individually 'malloc'ed, but instead always points into some
-   * existing data area.
-   */
-  const void *data;
-};
-
-/**
- * An attestation.
- */
-struct GNUNET_RECLAIM_Attestation
-{
-  /**
-   * ID
-   */
-  struct GNUNET_RECLAIM_Identifier id;
-
-  /**
-   * Type/Format of Claim
-   */
-  uint32_t type;
-
-  /**
-   * Flag
-   */
-  uint32_t flag;
-
-  /**
-   * The name of the attribute. Note "name" must never be individually
-   * free'd
-   */
-  const char *name;
-
-  /**
-   * Number of bytes in @e data.
-   */
-  size_t data_size;
-
-  /**
-   * Binary value stored as attribute value.  Note: "data" must never
-   * be individually 'malloc'ed, but instead always points into some
-   * existing data area.
-   */
-  const void *data;
-};
-
-
-/**
- * A list of GNUNET_RECLAIM_Attribute structures.
- */
-struct GNUNET_RECLAIM_AttributeList
-{
-  /**
-   * List head
-   */
-  struct GNUNET_RECLAIM_AttributeListEntry *list_head;
-
-  /**
-   * List tail
-   */
-  struct GNUNET_RECLAIM_AttributeListEntry *list_tail;
-};
-
-
-struct GNUNET_RECLAIM_AttributeListEntry
-{
-  /**
-   * DLL
-   */
-  struct GNUNET_RECLAIM_AttributeListEntry *prev;
-
-  /**
-   * DLL
-   */
-  struct GNUNET_RECLAIM_AttributeListEntry *next;
-
-  /**
-   * The attribute claim
-   */
-  struct GNUNET_RECLAIM_Attribute *attribute;
-
-};
-
-/**
- * A list of GNUNET_RECLAIM_Attestation structures.
- */
-struct GNUNET_RECLAIM_AttestationList
-{
-  /**
-   * List head
-   */
-  struct GNUNET_RECLAIM_AttestationListEntry *list_head;
-
-  /**
-   * List tail
-   */
-  struct GNUNET_RECLAIM_AttestationListEntry *list_tail;
-};
-
-
-struct GNUNET_RECLAIM_AttestationListEntry
-{
-  /**
-   * DLL
-   */
-  struct GNUNET_RECLAIM_AttestationListEntry *prev;
-
-  /**
-   * DLL
-   */
-  struct GNUNET_RECLAIM_AttestationListEntry *next;
-
-  /**
-   * The attestation
-   */
-  struct GNUNET_RECLAIM_Attestation *attestation;
-
-};
-
-
-/**
- * Create a new attribute claim.
- *
- * @param attr_name the attribute name
- * @param attestation ID of the attestation (may be NULL)
- * @param type the attribute type
- * @param data the attribute value. Must be the mapped name if attestation not NULL
- * @param data_size the attribute value size
- * @return the new attribute
- */
-struct GNUNET_RECLAIM_Attribute *
-GNUNET_RECLAIM_attribute_new (const char *attr_name,
-                              const struct GNUNET_RECLAIM_Identifier *attestation,
-                              uint32_t type,
-                              const void *data,
-                              size_t data_size);
-
-
-/**
- * Get required size for serialization buffer
- *
- * @param attrs the attribute list to serialize
- * @return the required buffer size
- */
-size_t
-GNUNET_RECLAIM_attribute_list_serialize_get_size (
-  const struct GNUNET_RECLAIM_AttributeList *attrs);
-
-
-/**
- * Destroy claim list
- *
- * @param attrs list to destroy
- */
-void
-GNUNET_RECLAIM_attribute_list_destroy (
-  struct GNUNET_RECLAIM_AttributeList *attrs);
-
-
-/**
- * Add a new attribute to a claim list
- *
- * @param attrs the attribute list to add to
- * @param attr_name the name of the new attribute claim
- * @param attestation attestation ID (may be NULL)
- * @param type the type of the claim
- * @param data claim payload
- * @param data_size claim payload size
- */
-void
-GNUNET_RECLAIM_attribute_list_add (
-  struct GNUNET_RECLAIM_AttributeList *attrs,
-  const char *attr_name,
-  const struct GNUNET_RECLAIM_Identifier *attestation,
-  uint32_t type,
-  const void *data,
-  size_t data_size);
-
-
-/**
- * Serialize an attribute list
- *
- * @param attrs the attribute list to serialize
- * @param result the serialized attribute
- * @return length of serialized data
- */
-size_t
-GNUNET_RECLAIM_attribute_list_serialize (
-  const struct GNUNET_RECLAIM_AttributeList *attrs,
-  char *result);
-
-
-/**
- * Deserialize an attribute list
- *
- * @param data the serialized attribute list
- * @param data_size the length of the serialized data
- * @return a GNUNET_IDENTITY_PROVIDER_AttributeList, must be free'd by caller
- */
-struct GNUNET_RECLAIM_AttributeList *
-GNUNET_RECLAIM_attribute_list_deserialize (const char *data, size_t data_size);
-
-/**
- * Get required size for serialization buffer
- *
- * @param attr the attribute to serialize
- * @return the required buffer size
- */
-size_t
-GNUNET_RECLAIM_attribute_serialize_get_size (
-  const struct GNUNET_RECLAIM_Attribute *attr);
-
-
-/**
- * Serialize an attribute
- *
- * @param attr the attribute to serialize
- * @param result the serialized attribute
- * @return length of serialized data
- */
-size_t
-GNUNET_RECLAIM_attribute_serialize (const struct GNUNET_RECLAIM_Attribute *attr,
-                                    char *result);
-
-
-/**
- * Deserialize an attribute
- *
- * @param data the serialized attribute
- * @param data_size the length of the serialized data
- *
- * @return a GNUNET_IDENTITY_PROVIDER_Attribute, must be free'd by caller
- */
-struct GNUNET_RECLAIM_Attribute *
-GNUNET_RECLAIM_attribute_deserialize (const char *data, size_t data_size);
-
-
-/**
- * Make a (deep) copy of a claim list
- * @param attrs claim list to copy
- * @return copied claim list
- */
-struct GNUNET_RECLAIM_AttributeList *
-GNUNET_RECLAIM_attribute_list_dup (
-  const struct GNUNET_RECLAIM_AttributeList *attrs);
-
-
-/**
- * Convert a type name to the corresponding number
- *
- * @param typename name to convert
- * @return corresponding number, UINT32_MAX on error
- */
-uint32_t
-GNUNET_RECLAIM_attribute_typename_to_number (const char *typename);
-
-/**
- * Convert human-readable version of a 'claim' of an attribute to the binary
- * representation
- *
- * @param type type of the claim
- * @param s human-readable string
- * @param data set to value in binary encoding (will be allocated)
- * @param data_size set to number of bytes in @a data
- * @return #GNUNET_OK on success
- */
-int
-GNUNET_RECLAIM_attribute_string_to_value (uint32_t type,
-                                          const char *s,
-                                          void **data,
-                                          size_t *data_size);
-
-
-/**
- * Convert the 'claim' of an attribute to a string
- *
- * @param type the type of attribute
- * @param data claim in binary encoding
- * @param data_size number of bytes in @a data
- * @return NULL on error, otherwise human-readable representation of the claim
- */
-char *
-GNUNET_RECLAIM_attribute_value_to_string (uint32_t type,
-                                          const void *data,
-                                          size_t data_size);
-
-/**
- * Convert a type number to the corresponding type string
- *
- * @param type number of a type
- * @return corresponding typestring, NULL on error
- */
-const char *
-GNUNET_RECLAIM_attribute_number_to_typename (uint32_t type);
-
-
-/**
- * Get required size for serialization buffer
- *
- * @param attrs the attribute list to serialize
- * @return the required buffer size
- */
-size_t
-GNUNET_RECLAIM_attestation_list_serialize_get_size (
-  const struct GNUNET_RECLAIM_AttestationList *attestations);
-
-
-/**
- * Destroy claim list
- *
- * @param attrs list to destroy
- */
-void
-GNUNET_RECLAIM_attestation_list_destroy (
-  struct GNUNET_RECLAIM_AttestationList *attestations);
-
-
-/**
- * Add a new attribute to a claim list
- *
- * @param attr_name the name of the new attribute claim
- * @param type the type of the claim
- * @param data claim payload
- * @param data_size claim payload size
- */
-void
-GNUNET_RECLAIM_attestation_list_add (
-  struct GNUNET_RECLAIM_AttestationList *attrs,
-  const char *att_name,
-  uint32_t type,
-  const void *data,
-  size_t data_size);
-
-
-/**
- * Serialize an attribute list
- *
- * @param attrs the attribute list to serialize
- * @param result the serialized attribute
- * @return length of serialized data
- */
-size_t
-GNUNET_RECLAIM_attestation_list_serialize (
-  const struct GNUNET_RECLAIM_AttestationList *attrs,
-  char *result);
-
-
-/**
- * Deserialize an attribute list
- *
- * @param data the serialized attribute list
- * @param data_size the length of the serialized data
- * @return a GNUNET_IDENTITY_PROVIDER_AttributeList, must be free'd by caller
- */
-struct GNUNET_RECLAIM_AttestationList *
-GNUNET_RECLAIM_attestation_list_deserialize (const char *data,
-                                             size_t data_size);
-
-
-
-/**
-   * @param attestation the attestation to serialize
-   * @return the required buffer size
-   */
-size_t
-GNUNET_RECLAIM_attestation_serialize_get_size (
-  const struct GNUNET_RECLAIM_Attestation *attestation);
-
-
-/**
- * Serialize an attestation
- *
- * @param attestation the attestation to serialize
- * @param result the serialized attestation
- * @return length of serialized data
- */
-size_t
-GNUNET_RECLAIM_attestation_serialize (
-  const struct GNUNET_RECLAIM_Attestation *attestation,
-  char *result);
-
-
-/**
- * Deserialize an attestation
- *
- * @param data the serialized attestation
- * @param data_size the length of the serialized data
- *
- * @return a GNUNET_IDENTITY_PROVIDER_Attribute, must be free'd by caller
- */
-struct GNUNET_RECLAIM_Attestation *
-GNUNET_RECLAIM_attestation_deserialize (const char *data, size_t data_size);
-
-
-/**
- * Create a new attestation.
- *
- * @param name the attestation name
- * @param type the attestation type
- * @param data the attestation value
- * @param data_size the attestation value size
- * @return the new attestation
- */
-struct GNUNET_RECLAIM_Attestation *
-GNUNET_RECLAIM_attestation_new (const char *name,
-                                uint32_t type,
-                                const void *data,
-                                size_t data_size);
-
-/**
- * Convert the 'claim' of an attestation to a string
- *
- * @param type the type of attestation
- * @param data claim in binary encoding
- * @param data_size number of bytes in @a data
- * @return NULL on error, otherwise human-readable representation of the claim
- */
-char *
-GNUNET_RECLAIM_attestation_value_to_string (uint32_t type,
-                                            const void *data,
-                                            size_t data_size);
-
-/**
- * Convert human-readable version of a 'claim' of an attestation to the binary
- * representation
- *
- * @param type type of the claim
- * @param s human-readable string
- * @param data set to value in binary encoding (will be allocated)
- * @param data_size set to number of bytes in @a data
- * @return #GNUNET_OK on success
- */
-int
-GNUNET_RECLAIM_attestation_string_to_value (uint32_t type,
-                                            const char *s,
-                                            void **data,
-                                            size_t *data_size);
-
-/**
- * Convert an attestation type number to the corresponding attestation type string
- *
- * @param type number of a type
- * @return corresponding typestring, NULL on error
- */
-const char *
-GNUNET_RECLAIM_attestation_number_to_typename (uint32_t type);
-
-/**
- * Convert an attestation type name to the corresponding number
- *
- * @param typename name to convert
- * @return corresponding number, UINT32_MAX on error
- */
-uint32_t
-GNUNET_RECLAIM_attestation_typename_to_number (const char *typename);
-
-/**
- * Convert an attestation type name to the corresponding number
- *
- * @param typename name to convert
- * @return corresponding number, UINT32_MAX on error
- */
-struct GNUNET_RECLAIM_AttributeList*
-GNUNET_RECLAIM_attestation_get_attributes (const struct GNUNET_RECLAIM_Attestation *attest);
-
-
-#if 0 /* keep Emacsens' auto-indent happy */
-{
-#endif
-#ifdef __cplusplus
-}
-#endif
-
-
-/* ifndef GNUNET_RECLAIM_ATTRIBUTE_LIB_H */
-#endif
-
-/** @} */ /* end of group reclaim-attribute */
-
-/* end of gnunet_reclaim_attribute_lib.h */
diff --git a/src/include/gnunet_reclaim_lib.h b/src/include/gnunet_reclaim_lib.h
new file mode 100644 (file)
index 0000000..6d35039
--- /dev/null
@@ -0,0 +1,612 @@
+/*
+     This file is part of GNUnet.
+     Copyright (C) 2017 GNUnet e.V.
+
+     GNUnet is free software: you can redistribute it and/or modify it
+     under the terms of the GNU Affero General Public License as published
+     by the Free Software Foundation, either version 3 of the License,
+     or (at your option) any later version.
+
+     GNUnet is distributed in the hope that it will be useful, but
+     WITHOUT ANY WARRANTY; without even the implied warranty of
+     MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+     Affero General Public License for more details.
+
+     You should have received a copy of the GNU Affero General Public License
+     along with this program.  If not, see <http://www.gnu.org/licenses/>.
+
+     SPDX-License-Identifier: AGPL3.0-or-later
+ */
+
+/**
+ * @author Martin Schanzenbach
+ *
+ * @file
+ * Identity attribute definitions
+ *
+ * @defgroup reclaim-attribute reclaim attributes
+ * @{
+ */
+#ifndef GNUNET_RECLAIM_ATTRIBUTE_LIB_H
+#define GNUNET_RECLAIM_ATTRIBUTE_LIB_H
+
+#ifdef __cplusplus
+extern "C" {
+#if 0 /* keep Emacsens' auto-indent happy */
+}
+#endif
+#endif
+
+#include "gnunet_util_lib.h"
+
+
+/**
+ * No value attribute.
+ */
+#define GNUNET_RECLAIM_ATTRIBUTE_TYPE_NONE 0
+
+/**
+ * String attribute.
+ */
+#define GNUNET_RECLAIM_ATTRIBUTE_TYPE_STRING 1
+
+/**
+* No value attestation.
+*/
+#define GNUNET_RECLAIM_ATTESTATION_TYPE_NONE 10
+
+/**
+* A JSON Web Token attestation.
+*/
+#define GNUNET_RECLAIM_ATTESTATION_TYPE_JWT 11
+
+/**
+ * We want an ID to be a 256-bit symmetric key
+ */
+#define GNUNET_RECLAIM_ID_LENGTH (256 / 8)
+
+/**
+ * A reclaim identifier
+ * FIXME maybe put this in a different namespace
+ */
+struct GNUNET_RECLAIM_Identifier
+{
+  char id[GNUNET_RECLAIM_ID_LENGTH];
+};
+
+static const struct GNUNET_RECLAIM_Identifier GNUNET_RECLAIM_ID_ZERO;
+
+#define GNUNET_RECLAIM_id_is_equal(a,b) ((0 == \
+                                          memcmp (a, \
+                                                  b, \
+                                                  sizeof (GNUNET_RECLAIM_ID_ZERO))) \
+  ? \
+                                         GNUNET_YES : GNUNET_NO)
+
+
+#define GNUNET_RECLAIM_id_is_zero(a) GNUNET_RECLAIM_id_is_equal (a, \
+                                                                 & \
+                                                                 GNUNET_RECLAIM_ID_ZERO)
+
+#define GNUNET_RECLAIM_id_generate(id) \
+  (GNUNET_CRYPTO_random_block (GNUNET_CRYPTO_QUALITY_STRONG, \
+                               id, \
+                               sizeof (GNUNET_RECLAIM_ID_ZERO)))
+
+/**
+ * An attribute.
+ */
+struct GNUNET_RECLAIM_Attribute
+{
+  /**
+   * ID
+   */
+  struct GNUNET_RECLAIM_Identifier id;
+
+  /**
+   * Referenced ID of Attestation (may be 0 if self-attested)
+   */
+  struct GNUNET_RECLAIM_Identifier attestation;
+
+  /**
+   * Type of Claim
+   */
+  uint32_t type;
+
+  /**
+   * Flags
+   */
+  uint32_t flag;
+
+  /**
+   * The name of the attribute. Note "name" must never be individually
+   * free'd
+   */
+  const char *name;
+
+  /**
+   * Number of bytes in @e data.
+   */
+  size_t data_size;
+
+  /**
+   * Binary value stored as attribute value.  Note: "data" must never
+   * be individually 'malloc'ed, but instead always points into some
+   * existing data area.
+   */
+  const void *data;
+};
+
+/**
+ * An attestation.
+ */
+struct GNUNET_RECLAIM_Attestation
+{
+  /**
+   * ID
+   */
+  struct GNUNET_RECLAIM_Identifier id;
+
+  /**
+   * Type/Format of Claim
+   */
+  uint32_t type;
+
+  /**
+   * Flag
+   */
+  uint32_t flag;
+
+  /**
+   * The name of the attribute. Note "name" must never be individually
+   * free'd
+   */
+  const char *name;
+
+  /**
+   * Number of bytes in @e data.
+   */
+  size_t data_size;
+
+  /**
+   * Binary value stored as attribute value.  Note: "data" must never
+   * be individually 'malloc'ed, but instead always points into some
+   * existing data area.
+   */
+  const void *data;
+};
+
+
+/**
+ * A list of GNUNET_RECLAIM_Attribute structures.
+ */
+struct GNUNET_RECLAIM_AttributeList
+{
+  /**
+   * List head
+   */
+  struct GNUNET_RECLAIM_AttributeListEntry *list_head;
+
+  /**
+   * List tail
+   */
+  struct GNUNET_RECLAIM_AttributeListEntry *list_tail;
+};
+
+
+struct GNUNET_RECLAIM_AttributeListEntry
+{
+  /**
+   * DLL
+   */
+  struct GNUNET_RECLAIM_AttributeListEntry *prev;
+
+  /**
+   * DLL
+   */
+  struct GNUNET_RECLAIM_AttributeListEntry *next;
+
+  /**
+   * The attribute claim
+   */
+  struct GNUNET_RECLAIM_Attribute *attribute;
+
+};
+
+/**
+ * A list of GNUNET_RECLAIM_Attestation structures.
+ */
+struct GNUNET_RECLAIM_AttestationList
+{
+  /**
+   * List head
+   */
+  struct GNUNET_RECLAIM_AttestationListEntry *list_head;
+
+  /**
+   * List tail
+   */
+  struct GNUNET_RECLAIM_AttestationListEntry *list_tail;
+};
+
+
+struct GNUNET_RECLAIM_AttestationListEntry
+{
+  /**
+   * DLL
+   */
+  struct GNUNET_RECLAIM_AttestationListEntry *prev;
+
+  /**
+   * DLL
+   */
+  struct GNUNET_RECLAIM_AttestationListEntry *next;
+
+  /**
+   * The attestation
+   */
+  struct GNUNET_RECLAIM_Attestation *attestation;
+
+};
+
+
+/**
+ * Create a new attribute claim.
+ *
+ * @param attr_name the attribute name
+ * @param attestation ID of the attestation (may be NULL)
+ * @param type the attribute type
+ * @param data the attribute value. Must be the mapped name if attestation not NULL
+ * @param data_size the attribute value size
+ * @return the new attribute
+ */
+struct GNUNET_RECLAIM_Attribute *
+GNUNET_RECLAIM_attribute_new (const char *attr_name,
+                              const struct GNUNET_RECLAIM_Identifier *attestation,
+                              uint32_t type,
+                              const void *data,
+                              size_t data_size);
+
+
+/**
+ * Get required size for serialization buffer
+ *
+ * @param attrs the attribute list to serialize
+ * @return the required buffer size
+ */
+size_t
+GNUNET_RECLAIM_attribute_list_serialize_get_size (
+  const struct GNUNET_RECLAIM_AttributeList *attrs);
+
+
+/**
+ * Destroy claim list
+ *
+ * @param attrs list to destroy
+ */
+void
+GNUNET_RECLAIM_attribute_list_destroy (
+  struct GNUNET_RECLAIM_AttributeList *attrs);
+
+
+/**
+ * Add a new attribute to a claim list
+ *
+ * @param attrs the attribute list to add to
+ * @param attr_name the name of the new attribute claim
+ * @param attestation attestation ID (may be NULL)
+ * @param type the type of the claim
+ * @param data claim payload
+ * @param data_size claim payload size
+ */
+void
+GNUNET_RECLAIM_attribute_list_add (
+  struct GNUNET_RECLAIM_AttributeList *attrs,
+  const char *attr_name,
+  const struct GNUNET_RECLAIM_Identifier *attestation,
+  uint32_t type,
+  const void *data,
+  size_t data_size);
+
+
+/**
+ * Serialize an attribute list
+ *
+ * @param attrs the attribute list to serialize
+ * @param result the serialized attribute
+ * @return length of serialized data
+ */
+size_t
+GNUNET_RECLAIM_attribute_list_serialize (
+  const struct GNUNET_RECLAIM_AttributeList *attrs,
+  char *result);
+
+
+/**
+ * Deserialize an attribute list
+ *
+ * @param data the serialized attribute list
+ * @param data_size the length of the serialized data
+ * @return a GNUNET_IDENTITY_PROVIDER_AttributeList, must be free'd by caller
+ */
+struct GNUNET_RECLAIM_AttributeList *
+GNUNET_RECLAIM_attribute_list_deserialize (const char *data, size_t data_size);
+
+/**
+ * Get required size for serialization buffer
+ *
+ * @param attr the attribute to serialize
+ * @return the required buffer size
+ */
+size_t
+GNUNET_RECLAIM_attribute_serialize_get_size (
+  const struct GNUNET_RECLAIM_Attribute *attr);
+
+
+/**
+ * Serialize an attribute
+ *
+ * @param attr the attribute to serialize
+ * @param result the serialized attribute
+ * @return length of serialized data
+ */
+size_t
+GNUNET_RECLAIM_attribute_serialize (const struct GNUNET_RECLAIM_Attribute *attr,
+                                    char *result);
+
+
+/**
+ * Deserialize an attribute
+ *
+ * @param data the serialized attribute
+ * @param data_size the length of the serialized data
+ *
+ * @return a GNUNET_IDENTITY_PROVIDER_Attribute, must be free'd by caller
+ */
+struct GNUNET_RECLAIM_Attribute *
+GNUNET_RECLAIM_attribute_deserialize (const char *data, size_t data_size);
+
+
+/**
+ * Make a (deep) copy of a claim list
+ * @param attrs claim list to copy
+ * @return copied claim list
+ */
+struct GNUNET_RECLAIM_AttributeList *
+GNUNET_RECLAIM_attribute_list_dup (
+  const struct GNUNET_RECLAIM_AttributeList *attrs);
+
+
+/**
+ * Convert a type name to the corresponding number
+ *
+ * @param typename name to convert
+ * @return corresponding number, UINT32_MAX on error
+ */
+uint32_t
+GNUNET_RECLAIM_attribute_typename_to_number (const char *typename);
+
+/**
+ * Convert human-readable version of a 'claim' of an attribute to the binary
+ * representation
+ *
+ * @param type type of the claim
+ * @param s human-readable string
+ * @param data set to value in binary encoding (will be allocated)
+ * @param data_size set to number of bytes in @a data
+ * @return #GNUNET_OK on success
+ */
+int
+GNUNET_RECLAIM_attribute_string_to_value (uint32_t type,
+                                          const char *s,
+                                          void **data,
+                                          size_t *data_size);
+
+
+/**
+ * Convert the 'claim' of an attribute to a string
+ *
+ * @param type the type of attribute
+ * @param data claim in binary encoding
+ * @param data_size number of bytes in @a data
+ * @return NULL on error, otherwise human-readable representation of the claim
+ */
+char *
+GNUNET_RECLAIM_attribute_value_to_string (uint32_t type,
+                                          const void *data,
+                                          size_t data_size);
+
+/**
+ * Convert a type number to the corresponding type string
+ *
+ * @param type number of a type
+ * @return corresponding typestring, NULL on error
+ */
+const char *
+GNUNET_RECLAIM_attribute_number_to_typename (uint32_t type);
+
+
+/**
+ * Get required size for serialization buffer
+ *
+ * @param attrs the attribute list to serialize
+ * @return the required buffer size
+ */
+size_t
+GNUNET_RECLAIM_attestation_list_serialize_get_size (
+  const struct GNUNET_RECLAIM_AttestationList *attestations);
+
+
+/**
+ * Destroy claim list
+ *
+ * @param attrs list to destroy
+ */
+void
+GNUNET_RECLAIM_attestation_list_destroy (
+  struct GNUNET_RECLAIM_AttestationList *attestations);
+
+
+/**
+ * Add a new attribute to a claim list
+ *
+ * @param attr_name the name of the new attribute claim
+ * @param type the type of the claim
+ * @param data claim payload
+ * @param data_size claim payload size
+ */
+void
+GNUNET_RECLAIM_attestation_list_add (
+  struct GNUNET_RECLAIM_AttestationList *attrs,
+  const char *att_name,
+  uint32_t type,
+  const void *data,
+  size_t data_size);
+
+
+/**
+ * Serialize an attribute list
+ *
+ * @param attrs the attribute list to serialize
+ * @param result the serialized attribute
+ * @return length of serialized data
+ */
+size_t
+GNUNET_RECLAIM_attestation_list_serialize (
+  const struct GNUNET_RECLAIM_AttestationList *attrs,
+  char *result);
+
+
+/**
+ * Deserialize an attribute list
+ *
+ * @param data the serialized attribute list
+ * @param data_size the length of the serialized data
+ * @return a GNUNET_IDENTITY_PROVIDER_AttributeList, must be free'd by caller
+ */
+struct GNUNET_RECLAIM_AttestationList *
+GNUNET_RECLAIM_attestation_list_deserialize (const char *data,
+                                             size_t data_size);
+
+
+
+/**
+   * @param attestation the attestation to serialize
+   * @return the required buffer size
+   */
+size_t
+GNUNET_RECLAIM_attestation_serialize_get_size (
+  const struct GNUNET_RECLAIM_Attestation *attestation);
+
+
+/**
+ * Serialize an attestation
+ *
+ * @param attestation the attestation to serialize
+ * @param result the serialized attestation
+ * @return length of serialized data
+ */
+size_t
+GNUNET_RECLAIM_attestation_serialize (
+  const struct GNUNET_RECLAIM_Attestation *attestation,
+  char *result);
+
+
+/**
+ * Deserialize an attestation
+ *
+ * @param data the serialized attestation
+ * @param data_size the length of the serialized data
+ *
+ * @return a GNUNET_IDENTITY_PROVIDER_Attribute, must be free'd by caller
+ */
+struct GNUNET_RECLAIM_Attestation *
+GNUNET_RECLAIM_attestation_deserialize (const char *data, size_t data_size);
+
+
+/**
+ * Create a new attestation.
+ *
+ * @param name the attestation name
+ * @param type the attestation type
+ * @param data the attestation value
+ * @param data_size the attestation value size
+ * @return the new attestation
+ */
+struct GNUNET_RECLAIM_Attestation *
+GNUNET_RECLAIM_attestation_new (const char *name,
+                                uint32_t type,
+                                const void *data,
+                                size_t data_size);
+
+/**
+ * Convert the 'claim' of an attestation to a string
+ *
+ * @param type the type of attestation
+ * @param data claim in binary encoding
+ * @param data_size number of bytes in @a data
+ * @return NULL on error, otherwise human-readable representation of the claim
+ */
+char *
+GNUNET_RECLAIM_attestation_value_to_string (uint32_t type,
+                                            const void *data,
+                                            size_t data_size);
+
+/**
+ * Convert human-readable version of a 'claim' of an attestation to the binary
+ * representation
+ *
+ * @param type type of the claim
+ * @param s human-readable string
+ * @param data set to value in binary encoding (will be allocated)
+ * @param data_size set to number of bytes in @a data
+ * @return #GNUNET_OK on success
+ */
+int
+GNUNET_RECLAIM_attestation_string_to_value (uint32_t type,
+                                            const char *s,
+                                            void **data,
+                                            size_t *data_size);
+
+/**
+ * Convert an attestation type number to the corresponding attestation type string
+ *
+ * @param type number of a type
+ * @return corresponding typestring, NULL on error
+ */
+const char *
+GNUNET_RECLAIM_attestation_number_to_typename (uint32_t type);
+
+/**
+ * Convert an attestation type name to the corresponding number
+ *
+ * @param typename name to convert
+ * @return corresponding number, UINT32_MAX on error
+ */
+uint32_t
+GNUNET_RECLAIM_attestation_typename_to_number (const char *typename);
+
+/**
+ * Convert an attestation type name to the corresponding number
+ *
+ * @param typename name to convert
+ * @return corresponding number, UINT32_MAX on error
+ */
+struct GNUNET_RECLAIM_AttributeList*
+GNUNET_RECLAIM_attestation_get_attributes (const struct GNUNET_RECLAIM_Attestation *attest);
+
+
+#if 0 /* keep Emacsens' auto-indent happy */
+{
+#endif
+#ifdef __cplusplus
+}
+#endif
+
+
+/* ifndef GNUNET_RECLAIM_ATTRIBUTE_LIB_H */
+#endif
+
+/** @} */ /* end of group reclaim-attribute */
+
+/* end of gnunet_reclaim_attribute_lib.h */
index ed62adf6cefd945bf929d38988319d9d13cfafc7..d42ac95022cfad7c974599961e90e61b74010a72 100644 (file)
@@ -31,7 +31,7 @@
 #define GNUNET_RECLAIM_AttributePLUGIN_H
 
 #include "gnunet_util_lib.h"
-#include "gnunet_reclaim_attribute_lib.h"
+#include "gnunet_reclaim_lib.h"
 
 #ifdef __cplusplus
 extern "C" {
index ef9899ddecffcd2247c2a34b6b6080c5e91a60a8..c63ed0100652055e861140ecd4ce83e9c94106e5 100644 (file)
@@ -38,7 +38,7 @@ extern "C" {
 #endif
 #endif
 
-#include "gnunet_reclaim_attribute_lib.h"
+#include "gnunet_reclaim_lib.h"
 #include "gnunet_util_lib.h"
 
 /**
diff --git a/src/reclaim-attribute/Makefile.am b/src/reclaim-attribute/Makefile.am
deleted file mode 100644 (file)
index 9617672..0000000
+++ /dev/null
@@ -1,52 +0,0 @@
-# This Makefile.am is in the public domain
-AM_CPPFLAGS = -I$(top_srcdir)/src/include
-
-plugindir = $(libdir)/gnunet
-
-pkgcfgdir= $(pkgdatadir)/config.d/
-
-libexecdir= $(pkglibdir)/libexec/
-
-if USE_COVERAGE
-  AM_CFLAGS = --coverage -O0
-  XLIBS = -lgcov
-endif
-
-lib_LTLIBRARIES = \
-  libgnunetreclaimattribute.la
-
-libgnunetreclaimattribute_la_SOURCES = \
-  reclaim_attribute.h \
-  reclaim_attribute.c \
-  reclaim_attestation.c
-libgnunetreclaimattribute_la_LIBADD = \
-  $(top_builddir)/src/util/libgnunetutil.la \
-  $(GN_LIBINTL)
-libgnunetreclaimattribute_la_LDFLAGS = \
-  $(GN_LIB_LDFLAGS)  \
-  -version-info 0:0:0
-
-
-plugin_LTLIBRARIES = \
-  libgnunet_plugin_reclaim_attribute_basic.la \
-  libgnunet_plugin_reclaim_attestation_jwt.la
-
-
-libgnunet_plugin_reclaim_attribute_basic_la_SOURCES = \
-  plugin_reclaim_attribute_basic.c
-libgnunet_plugin_reclaim_attribute_basic_la_LIBADD = \
-  $(top_builddir)/src/util/libgnunetutil.la \
-  $(LTLIBINTL)
-libgnunet_plugin_reclaim_attribute_basic_la_LDFLAGS = \
- $(GN_PLUGIN_LDFLAGS)
-
-libgnunet_plugin_reclaim_attestation_jwt_la_SOURCES = \
-  plugin_reclaim_attestation_jwt.c
-libgnunet_plugin_reclaim_attestation_jwt_la_LIBADD = \
-  $(top_builddir)/src/util/libgnunetutil.la \
-  libgnunetreclaimattribute.la \
-  -ljansson\
-  $(LTLIBINTL)
-libgnunet_plugin_reclaim_attestation_jwt_la_LDFLAGS = \
- $(GN_PLUGIN_LDFLAGS)
-
diff --git a/src/reclaim-attribute/plugin_reclaim_attestation_jwt.c b/src/reclaim-attribute/plugin_reclaim_attestation_jwt.c
deleted file mode 100644 (file)
index 8a67b18..0000000
+++ /dev/null
@@ -1,233 +0,0 @@
-/*
-     This file is part of GNUnet
-     Copyright (C) 2013, 2014, 2016 GNUnet e.V.
-
-     GNUnet is free software: you can redistribute it and/or modify it
-     under the terms of the GNU Affero General Public License as published
-     by the Free Software Foundation, either version 3 of the License,
-     or (at your option) any later version.
-
-     GNUnet is distributed in the hope that it will be useful, but
-     WITHOUT ANY WARRANTY; without even the implied warranty of
-     MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
-     Affero General Public License for more details.
-
-     You should have received a copy of the GNU Affero General Public License
-     along with this program.  If not, see <http://www.gnu.org/licenses/>.
-
-     SPDX-License-Identifier: AGPL3.0-or-later
- */
-
-/**
- * @file reclaim-attribute/plugin_reclaim_attestation_gnuid.c
- * @brief reclaim-attribute-plugin-gnuid attribute plugin to provide the API for
- *                                       fundamental
- *                                       attribute types.
- *
- * @author Martin Schanzenbach
- */
-#include "platform.h"
-#include "gnunet_util_lib.h"
-#include "gnunet_reclaim_plugin.h"
-#include <inttypes.h>
-#include <jansson.h>
-
-/**
-   * Convert the 'value' of an attestation to a string.
-   *
-   * @param cls closure, unused
-   * @param type type of the attestation
-   * @param data value in binary encoding
-   * @param data_size number of bytes in @a data
-   * @return NULL on error, otherwise human-readable representation of the value
-   */
-static char *
-jwt_value_to_string (void *cls,
-                     uint32_t type,
-                     const void *data,
-                     size_t data_size)
-{
-  switch (type)
-  {
-  case GNUNET_RECLAIM_ATTESTATION_TYPE_JWT:
-    return GNUNET_strndup (data, data_size);
-
-  default:
-    return NULL;
-  }
-}
-
-
-/**
- * Convert human-readable version of a 'value' of an attestation to the binary
- * representation.
- *
- * @param cls closure, unused
- * @param type type of the attestation
- * @param s human-readable string
- * @param data set to value in binary encoding (will be allocated)
- * @param data_size set to number of bytes in @a data
- * @return #GNUNET_OK on success
- */
-static int
-jwt_string_to_value (void *cls,
-                     uint32_t type,
-                     const char *s,
-                     void **data,
-                     size_t *data_size)
-{
-  if (NULL == s)
-    return GNUNET_SYSERR;
-  switch (type)
-  {
-  case GNUNET_RECLAIM_ATTESTATION_TYPE_JWT:
-    *data = GNUNET_strdup (s);
-    *data_size = strlen (s);
-    return GNUNET_OK;
-
-  default:
-    return GNUNET_SYSERR;
-  }
-}
-
-
-/**
- * Mapping of attestation type numbers to human-readable
- * attestation type names.
- */
-static struct
-{
-  const char *name;
-  uint32_t number;
-} jwt_attest_name_map[] = { { "JWT", GNUNET_RECLAIM_ATTESTATION_TYPE_JWT },
-                            { NULL, UINT32_MAX } };
-
-/**
-   * Convert a type name to the corresponding number.
-   *
-   * @param cls closure, unused
-   * @param jwt_typename name to convert
-   * @return corresponding number, UINT32_MAX on error
-   */
-static uint32_t
-jwt_typename_to_number (void *cls, const char *jwt_typename)
-{
-  unsigned int i;
-
-  i = 0;
-  while ((NULL != jwt_attest_name_map[i].name) &&
-         (0 != strcasecmp (jwt_typename, jwt_attest_name_map[i].name)))
-    i++;
-  return jwt_attest_name_map[i].number;
-}
-
-
-/**
- * Convert a type number (i.e. 1) to the corresponding type string
- *
- * @param cls closure, unused
- * @param type number of a type to convert
- * @return corresponding typestring, NULL on error
- */
-static const char *
-jwt_number_to_typename (void *cls, uint32_t type)
-{
-  unsigned int i;
-
-  i = 0;
-  while ((NULL != jwt_attest_name_map[i].name) && (type !=
-                                                   jwt_attest_name_map[i].
-                                                   number))
-    i++;
-  return jwt_attest_name_map[i].name;
-}
-
-/**
- * Parse a JWT and return the respective claim value as Attribute
- *
- * @param attest the jwt attestation
- * @param claim the name of the claim in the JWT
- *
- * @return a GNUNET_RECLAIM_Attribute, containing the new value
- */
-struct GNUNET_RECLAIM_AttributeList *
-jwt_parse_attributes (void *cls,
-                      const struct GNUNET_RECLAIM_Attestation *attest)
-{
-  char *jwt_string;
-  struct GNUNET_RECLAIM_AttributeList *attrs;
-  char delim[] = ".";
-  char *val_str = NULL;
-  GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, "Parsing JWT attributes.\n");
-  char *decoded_jwt;
-  json_t *json_val;
-  json_error_t *json_err = NULL;
-
-  if (GNUNET_RECLAIM_ATTESTATION_TYPE_JWT != attest->type)
-    return NULL;
-  attrs = GNUNET_new (struct GNUNET_RECLAIM_AttributeList);
-
-  jwt_string = GNUNET_strdup (attest->data);
-  const char *jwt_body = strtok (jwt_string, delim);
-  jwt_body = strtok (NULL, delim);
-  GNUNET_STRINGS_base64_decode (jwt_body, strlen (jwt_body),
-                                (void **) &decoded_jwt);
-  json_val = json_loads (decoded_jwt, JSON_DECODE_ANY, json_err);
-  const char *key;
-  json_t *value;
-  json_object_foreach (json_val, key, value) {
-    val_str = json_dumps (value, JSON_ENCODE_ANY);
-    GNUNET_RECLAIM_attribute_list_add (attrs,
-                                       key,
-                                       NULL,
-                                       GNUNET_RECLAIM_ATTRIBUTE_TYPE_STRING,//FIXME
-                                       val_str,
-                                       strlen (val_str));
-    GNUNET_free (val_str);
-  }
-  GNUNET_free (jwt_string);
-  //FIXME needed??
-  return attrs;
-}
-
-
-
-
-/**
- * Entry point for the plugin.
- *
- * @param cls NULL
- * @return the exported block API
- */
-void *
-libgnunet_plugin_reclaim_attestation_jwt_init (void *cls)
-{
-  struct GNUNET_RECLAIM_AttestationPluginFunctions *api;
-
-  api = GNUNET_new (struct GNUNET_RECLAIM_AttestationPluginFunctions);
-  api->value_to_string = &jwt_value_to_string;
-  api->string_to_value = &jwt_string_to_value;
-  api->typename_to_number = &jwt_typename_to_number;
-  api->number_to_typename = &jwt_number_to_typename;
-  api->get_attributes = &jwt_parse_attributes;
-  return api;
-}
-
-
-/**
- * Exit point from the plugin.
- *
- * @param cls the return value from #libgnunet_plugin_block_test_init()
- * @return NULL
- */
-void *
-libgnunet_plugin_reclaim_attestation_jwt_done (void *cls)
-{
-  struct GNUNET_RECLAIM_AttestationPluginFunctions *api = cls;
-
-  GNUNET_free (api);
-  return NULL;
-}
-
-
-/* end of plugin_reclaim_attestation_type_gnuid.c */
diff --git a/src/reclaim-attribute/plugin_reclaim_attribute_basic.c b/src/reclaim-attribute/plugin_reclaim_attribute_basic.c
deleted file mode 100644 (file)
index 47fdd5f..0000000
+++ /dev/null
@@ -1,180 +0,0 @@
-/*
-     This file is part of GNUnet
-     Copyright (C) 2013, 2014, 2016 GNUnet e.V.
-
-     GNUnet is free software: you can redistribute it and/or modify it
-     under the terms of the GNU Affero General Public License as published
-     by the Free Software Foundation, either version 3 of the License,
-     or (at your option) any later version.
-
-     GNUnet is distributed in the hope that it will be useful, but
-     WITHOUT ANY WARRANTY; without even the implied warranty of
-     MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
-     Affero General Public License for more details.
-
-     You should have received a copy of the GNU Affero General Public License
-     along with this program.  If not, see <http://www.gnu.org/licenses/>.
-
-     SPDX-License-Identifier: AGPL3.0-or-later
- */
-
-/**
- * @file reclaim-attribute/plugin_reclaim_attribute_gnuid.c
- * @brief reclaim-attribute-plugin-gnuid attribute plugin to provide the API for
- *                                       fundamental
- *                                       attribute types.
- *
- * @author Martin Schanzenbach
- */
-#include "platform.h"
-#include "gnunet_util_lib.h"
-#include "gnunet_reclaim_plugin.h"
-#include <inttypes.h>
-
-
-/**
- * Convert the 'value' of an attribute to a string.
- *
- * @param cls closure, unused
- * @param type type of the attribute
- * @param data value in binary encoding
- * @param data_size number of bytes in @a data
- * @return NULL on error, otherwise human-readable representation of the value
- */
-static char *
-basic_value_to_string (void *cls,
-                       uint32_t type,
-                       const void *data,
-                       size_t data_size)
-{
-  switch (type)
-  {
-  case GNUNET_RECLAIM_ATTRIBUTE_TYPE_STRING:
-    return GNUNET_strndup (data, data_size);
-
-  default:
-    return NULL;
-  }
-}
-
-
-/**
- * Convert human-readable version of a 'value' of an attribute to the binary
- * representation.
- *
- * @param cls closure, unused
- * @param type type of the attribute
- * @param s human-readable string
- * @param data set to value in binary encoding (will be allocated)
- * @param data_size set to number of bytes in @a data
- * @return #GNUNET_OK on success
- */
-static int
-basic_string_to_value (void *cls,
-                       uint32_t type,
-                       const char *s,
-                       void **data,
-                       size_t *data_size)
-{
-  if (NULL == s)
-    return GNUNET_SYSERR;
-  switch (type)
-  {
-  case GNUNET_RECLAIM_ATTRIBUTE_TYPE_STRING:
-    *data = GNUNET_strdup (s);
-    *data_size = strlen (s);
-    return GNUNET_OK;
-
-  default:
-    return GNUNET_SYSERR;
-  }
-}
-
-/**
- * Mapping of attribute type numbers to human-readable
- * attribute type names.
- */
-static struct
-{
-  const char *name;
-  uint32_t number;
-} basic_name_map[] = { { "STRING", GNUNET_RECLAIM_ATTRIBUTE_TYPE_STRING },
-                       { NULL, UINT32_MAX } };
-
-
-/**
- * Convert a type name to the corresponding number.
- *
- * @param cls closure, unused
- * @param basic_typename name to convert
- * @return corresponding number, UINT32_MAX on error
- */
-static uint32_t
-basic_typename_to_number (void *cls, const char *basic_typename)
-{
-  unsigned int i;
-
-  i = 0;
-  while ((NULL != basic_name_map[i].name) &&
-         (0 != strcasecmp (basic_typename, basic_name_map[i].name)))
-    i++;
-  return basic_name_map[i].number;
-}
-
-
-/**
- * Convert a type number (i.e. 1) to the corresponding type string
- *
- * @param cls closure, unused
- * @param type number of a type to convert
- * @return corresponding typestring, NULL on error
- */
-static const char *
-basic_number_to_typename (void *cls, uint32_t type)
-{
-  unsigned int i;
-
-  i = 0;
-  while ((NULL != basic_name_map[i].name) && (type != basic_name_map[i].number))
-    i++;
-  return basic_name_map[i].name;
-}
-
-
-/**
- * Entry point for the plugin.
- *
- * @param cls NULL
- * @return the exported block API
- */
-void *
-libgnunet_plugin_reclaim_attribute_basic_init (void *cls)
-{
-  struct GNUNET_RECLAIM_AttributePluginFunctions *api;
-
-  api = GNUNET_new (struct GNUNET_RECLAIM_AttributePluginFunctions);
-  api->value_to_string = &basic_value_to_string;
-  api->string_to_value = &basic_string_to_value;
-  api->typename_to_number = &basic_typename_to_number;
-  api->number_to_typename = &basic_number_to_typename;
-  return api;
-}
-
-
-/**
- * Exit point from the plugin.
- *
- * @param cls the return value from #libgnunet_plugin_block_test_init()
- * @return NULL
- */
-void *
-libgnunet_plugin_reclaim_attribute_basic_done (void *cls)
-{
-  struct GNUNET_RECLAIM_AttributePluginFunctions *api = cls;
-
-  GNUNET_free (api);
-  return NULL;
-}
-
-
-/* end of plugin_reclaim_attribute_type_gnuid.c */
diff --git a/src/reclaim-attribute/reclaim_attestation.c b/src/reclaim-attribute/reclaim_attestation.c
deleted file mode 100644 (file)
index 961c6ed..0000000
+++ /dev/null
@@ -1,520 +0,0 @@
-/*
-   This file is part of GNUnet
-   Copyright (C) 2010-2015 GNUnet e.V.
-
-   GNUnet is free software: you can redistribute it and/or modify it
-   under the terms of the GNU Affero General Public License as published
-   by the Free Software Foundation, either version 3 of the License,
-   or (at your option) any later version.
-
-   GNUnet is distributed in the hope that it will be useful, but
-   WITHOUT ANY WARRANTY; without even the implied warranty of
-   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
-   Affero General Public License for more details.
-
-   You should have received a copy of the GNU Affero General Public License
-   along with this program.  If not, see <http://www.gnu.org/licenses/>.
-
-   SPDX-License-Identifier: AGPL3.0-or-later
- */
-
-/**
- * @file reclaim-attribute/reclaim_attestation.c
- * @brief helper library to manage identity attribute attestations
- * @author Martin Schanzenbach
- */
-#include "platform.h"
-#include "gnunet_util_lib.h"
-#include "gnunet_reclaim_plugin.h"
-#include "reclaim_attestation.h"
-
-
-/**
- * Handle for a plugin
- */
-struct Plugin
-{
-  /**
-   * Name of the plugin
-   */
-  char *library_name;
-
-  /**
-   * Plugin API
-   */
-  struct GNUNET_RECLAIM_AttestationPluginFunctions *api;
-};
-
-
-/**
- * Plugins
- */
-static struct Plugin **attest_plugins;
-
-
-/**
- * Number of plugins
- */
-static unsigned int num_plugins;
-
-
-/**
- * Init canary
- */
-static int initialized;
-
-
-/**
- * Add a plugin
- *
- * @param cls closure
- * @param library_name name of the API library
- * @param lib_ret the plugin API pointer
- */
-static void
-add_plugin (void *cls, const char *library_name, void *lib_ret)
-{
-  struct GNUNET_RECLAIM_AttestationPluginFunctions *api = lib_ret;
-  struct Plugin *plugin;
-
-  GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
-              "Loading attestation plugin `%s'\n",
-              library_name);
-  plugin = GNUNET_new (struct Plugin);
-  plugin->api = api;
-  plugin->library_name = GNUNET_strdup (library_name);
-  GNUNET_array_append (attest_plugins, num_plugins, plugin);
-}
-
-
-/**
- * Load plugins
- */
-static void
-init ()
-{
-  if (GNUNET_YES == initialized)
-    return;
-  initialized = GNUNET_YES;
-  GNUNET_PLUGIN_load_all ("libgnunet_plugin_reclaim_attestation_",
-                          NULL,
-                          &add_plugin,
-                          NULL);
-}
-
-
-/**
- * Convert an attestation type name to the corresponding number
- *
- * @param typename name to convert
- * @return corresponding number, UINT32_MAX on error
- */
-uint32_t
-GNUNET_RECLAIM_attestation_typename_to_number (const char *typename)
-{
-  unsigned int i;
-  struct Plugin *plugin;
-  uint32_t ret;
-  init ();
-  for (i = 0; i < num_plugins; i++)
-  {
-    plugin = attest_plugins[i];
-    if (UINT32_MAX !=
-        (ret = plugin->api->typename_to_number (plugin->api->cls,
-                                                typename)))
-      return ret;
-  }
-  return UINT32_MAX;
-}
-
-
-/**
- * Convert an attestation type number to the corresponding attestation type string
- *
- * @param type number of a type
- * @return corresponding typestring, NULL on error
- */
-const char *
-GNUNET_RECLAIM_attestation_number_to_typename (uint32_t type)
-{
-  unsigned int i;
-  struct Plugin *plugin;
-  const char *ret;
-
-  init ();
-  for (i = 0; i < num_plugins; i++)
-  {
-    plugin = attest_plugins[i];
-    if (NULL !=
-        (ret = plugin->api->number_to_typename (plugin->api->cls, type)))
-      return ret;
-  }
-  return NULL;
-}
-
-
-/**
- * Convert human-readable version of a 'claim' of an attestation to the binary
- * representation
- *
- * @param type type of the claim
- * @param s human-readable string
- * @param data set to value in binary encoding (will be allocated)
- * @param data_size set to number of bytes in @a data
- * @return #GNUNET_OK on success
- */
-int
-GNUNET_RECLAIM_attestation_string_to_value (uint32_t type,
-                                            const char *s,
-                                            void **data,
-                                            size_t *data_size)
-{
-  unsigned int i;
-  struct Plugin *plugin;
-
-  init ();
-  for (i = 0; i < num_plugins; i++)
-  {
-    plugin = attest_plugins[i];
-    if (GNUNET_OK == plugin->api->string_to_value (plugin->api->cls,
-                                                   type,
-                                                   s,
-                                                   data,
-                                                   data_size))
-      return GNUNET_OK;
-  }
-  return GNUNET_SYSERR;
-}
-
-
-/**
- * Convert the 'claim' of an attestation to a string
- *
- * @param type the type of attestation
- * @param data claim in binary encoding
- * @param data_size number of bytes in @a data
- * @return NULL on error, otherwise human-readable representation of the claim
- */
-char *
-GNUNET_RECLAIM_attestation_value_to_string (uint32_t type,
-                                            const void *data,
-                                            size_t data_size)
-{
-  unsigned int i;
-  struct Plugin *plugin;
-  char *ret;
-
-  init ();
-  for (i = 0; i < num_plugins; i++)
-  {
-    plugin = attest_plugins[i];
-    if (NULL != (ret = plugin->api->value_to_string (plugin->api->cls,
-                                                     type,
-                                                     data,
-                                                     data_size)))
-      return ret;
-  }
-  return NULL;
-}
-
-
-/**
-   * Create a new attestation.
-   *
-   * @param attr_name the attestation name
-   * @param type the attestation type
-   * @param data the attestation value
-   * @param data_size the attestation value size
-   * @return the new attestation
-   */
-struct GNUNET_RECLAIM_Attestation *
-GNUNET_RECLAIM_attestation_new (const char *attr_name,
-                                uint32_t type,
-                                const void *data,
-                                size_t data_size)
-{
-  struct GNUNET_RECLAIM_Attestation *attr;
-  char *write_ptr;
-  char *attr_name_tmp = GNUNET_strdup (attr_name);
-
-  GNUNET_STRINGS_utf8_tolower (attr_name, attr_name_tmp);
-
-  attr = GNUNET_malloc (sizeof(struct GNUNET_RECLAIM_Attestation)
-                        + strlen (attr_name_tmp) + 1 + data_size);
-  attr->type = type;
-  attr->data_size = data_size;
-  attr->flag = 0;
-  write_ptr = (char *) &attr[1];
-  GNUNET_memcpy (write_ptr, attr_name_tmp, strlen (attr_name_tmp) + 1);
-  attr->name = write_ptr;
-  write_ptr += strlen (attr->name) + 1;
-  GNUNET_memcpy (write_ptr, data, data_size);
-  attr->data = write_ptr;
-  GNUNET_free (attr_name_tmp);
-  return attr;
-}
-
-
-/**
- * Get required size for serialization buffer
- *
- * @param attrs the attribute list to serialize
- * @return the required buffer size
- */
-size_t
-GNUNET_RECLAIM_attestation_list_serialize_get_size (
-  const struct GNUNET_RECLAIM_AttestationList *attestations)
-{
-  struct GNUNET_RECLAIM_AttestationListEntry *le;
-  size_t len = 0;
-
-  for (le = attestations->list_head; NULL != le; le = le->next)
-  {
-    GNUNET_assert (NULL != le->attestation);
-    len += GNUNET_RECLAIM_attestation_serialize_get_size (le->attestation);
-    len += sizeof(struct GNUNET_RECLAIM_AttestationListEntry);
-  }
-  return len;
-}
-
-
-/**
- * Serialize an attribute list
- *
- * @param attrs the attribute list to serialize
- * @param result the serialized attribute
- * @return length of serialized data
- */
-size_t
-GNUNET_RECLAIM_attestation_list_serialize (
-  const struct GNUNET_RECLAIM_AttestationList *attestations,
-  char *result)
-{
-  struct GNUNET_RECLAIM_AttestationListEntry *le;
-  size_t len;
-  size_t total_len;
-  char *write_ptr;
-  write_ptr = result;
-  total_len = 0;
-  for (le = attestations->list_head; NULL != le; le = le->next)
-  {
-    GNUNET_assert (NULL != le->attestation);
-    len = GNUNET_RECLAIM_attestation_serialize (le->attestation, write_ptr);
-    total_len += len;
-    write_ptr += len;
-  }
-  return total_len;
-}
-
-
-/**
- * Deserialize an attestation list
- *
- * @param data the serialized attribute list
- * @param data_size the length of the serialized data
- * @return a GNUNET_IDENTITY_PROVIDER_AttributeList, must be free'd by caller
- */
-struct GNUNET_RECLAIM_AttestationList *
-GNUNET_RECLAIM_attestation_list_deserialize (const char *data, size_t data_size)
-{
-  struct GNUNET_RECLAIM_AttestationList *al;
-  struct GNUNET_RECLAIM_AttestationListEntry *ale;
-  size_t att_len;
-  const char *read_ptr;
-
-  al = GNUNET_new (struct GNUNET_RECLAIM_AttestationList);
-
-  if ((data_size < sizeof(struct
-                          Attestation)
-       + sizeof(struct GNUNET_RECLAIM_AttestationListEntry)))
-    return al;
-
-  read_ptr = data;
-  while (((data + data_size) - read_ptr) >= sizeof(struct Attestation))
-  {
-    ale = GNUNET_new (struct GNUNET_RECLAIM_AttestationListEntry);
-    ale->attestation =
-      GNUNET_RECLAIM_attestation_deserialize (read_ptr,
-                                              data_size - (read_ptr - data));
-    GNUNET_CONTAINER_DLL_insert (al->list_head, al->list_tail, ale);
-    att_len = GNUNET_RECLAIM_attestation_serialize_get_size (ale->attestation);
-    read_ptr += att_len;
-  }
-  return al;
-}
-
-
-/**
- * Make a (deep) copy of the attestation list
- * @param attrs claim list to copy
- * @return copied claim list
- */
-struct GNUNET_RECLAIM_AttestationList *
-GNUNET_RECLAIM_attestation_list_dup (
-  const struct GNUNET_RECLAIM_AttestationList *al)
-{
-  struct GNUNET_RECLAIM_AttestationListEntry *ale;
-  struct GNUNET_RECLAIM_AttestationListEntry *result_ale;
-  struct GNUNET_RECLAIM_AttestationList *result;
-
-  result = GNUNET_new (struct GNUNET_RECLAIM_AttestationList);
-  for (ale = al->list_head; NULL != ale; ale = ale->next)
-  {
-    result_ale = GNUNET_new (struct GNUNET_RECLAIM_AttestationListEntry);
-    GNUNET_assert (NULL != ale->attestation);
-    result_ale->attestation =
-      GNUNET_RECLAIM_attestation_new (ale->attestation->name,
-                                      ale->attestation->type,
-                                      ale->attestation->data,
-                                      ale->attestation->data_size);
-    result_ale->attestation->id = ale->attestation->id;
-    GNUNET_CONTAINER_DLL_insert (result->list_head,
-                                 result->list_tail,
-                                 result_ale);
-  }
-  return result;
-}
-
-
-/**
- * Destroy attestation list
- *
- * @param attrs list to destroy
- */
-void
-GNUNET_RECLAIM_attestation_list_destroy (
-  struct GNUNET_RECLAIM_AttestationList *al)
-{
-  struct GNUNET_RECLAIM_AttestationListEntry *ale;
-  struct GNUNET_RECLAIM_AttestationListEntry *tmp_ale;
-
-  for (ale = al->list_head; NULL != ale;)
-  {
-    if (NULL != ale->attestation)
-      GNUNET_free (ale->attestation);
-    tmp_ale = ale;
-    ale = ale->next;
-    GNUNET_free (tmp_ale);
-  }
-  GNUNET_free (al);
-}
-
-
-/**
- * Get required size for serialization buffer
- *
- * @param attr the attestation to serialize
- * @return the required buffer size
- */
-size_t
-GNUNET_RECLAIM_attestation_serialize_get_size (
-  const struct GNUNET_RECLAIM_Attestation *attestation)
-{
-  return sizeof(struct Attestation) + strlen (attestation->name)
-         + attestation->data_size;
-}
-
-
-/**
- * Serialize an attestation
- *
- * @param attr the attestation to serialize
- * @param result the serialized attestation
- * @return length of serialized data
- */
-size_t
-GNUNET_RECLAIM_attestation_serialize (
-  const struct GNUNET_RECLAIM_Attestation *attestation,
-  char *result)
-{
-  size_t data_len_ser;
-  size_t name_len;
-  struct Attestation *atts;
-  char *write_ptr;
-
-  atts = (struct Attestation *) result;
-  atts->attestation_type = htons (attestation->type);
-  atts->attestation_flag = htonl (attestation->flag);
-  atts->attestation_id = attestation->id;
-  name_len = strlen (attestation->name);
-  atts->name_len = htons (name_len);
-  write_ptr = (char *) &atts[1];
-  GNUNET_memcpy (write_ptr, attestation->name, name_len);
-  write_ptr += name_len;
-  // TODO plugin-ize
-  // data_len_ser = plugin->serialize_attribute_value (attr,
-  //                                                  &attr_ser[1]);
-  data_len_ser = attestation->data_size;
-  GNUNET_memcpy (write_ptr, attestation->data, attestation->data_size);
-  atts->data_size = htons (data_len_ser);
-
-  return sizeof(struct Attestation) + strlen (attestation->name)
-         + attestation->data_size;
-}
-
-
-/**
- * Deserialize an attestation
- *
- * @param data the serialized attestation
- * @param data_size the length of the serialized data
- *
- * @return a GNUNET_IDENTITY_PROVIDER_Attribute, must be free'd by caller
- */
-struct GNUNET_RECLAIM_Attestation *
-GNUNET_RECLAIM_attestation_deserialize (const char *data, size_t data_size)
-{
-  struct GNUNET_RECLAIM_Attestation *attestation;
-  struct Attestation *atts;
-  size_t data_len;
-  size_t name_len;
-  char *write_ptr;
-
-  if (data_size < sizeof(struct Attestation))
-    return NULL;
-
-  atts = (struct Attestation *) data;
-  data_len = ntohs (atts->data_size);
-  name_len = ntohs (atts->name_len);
-  if (data_size < sizeof(struct Attestation) + data_len + name_len)
-  {
-    GNUNET_log (GNUNET_ERROR_TYPE_ERROR,
-                "Buffer too small to deserialize\n");
-    return NULL;
-  }
-  attestation = GNUNET_malloc (sizeof(struct GNUNET_RECLAIM_Attestation)
-                               + data_len + name_len + 1);
-  attestation->type = ntohs (atts->attestation_type);
-  attestation->flag = ntohl (atts->attestation_flag);
-  attestation->id = atts->attestation_id;
-  attestation->data_size = data_len;
-
-  write_ptr = (char *) &attestation[1];
-  GNUNET_memcpy (write_ptr, &atts[1], name_len);
-  write_ptr[name_len] = '\0';
-  attestation->name = write_ptr;
-
-  write_ptr += name_len + 1;
-  GNUNET_memcpy (write_ptr, (char *) &atts[1] + name_len,
-                 attestation->data_size);
-  attestation->data = write_ptr;
-  return attestation;
-}
-
-struct GNUNET_RECLAIM_AttributeList*
-GNUNET_RECLAIM_attestation_get_attributes (const struct GNUNET_RECLAIM_Attestation *attest)
-{
-  unsigned int i;
-  struct Plugin *plugin;
-  struct GNUNET_RECLAIM_AttributeList *ret;
-  init ();
-  for (i = 0; i < num_plugins; i++)
-  {
-    plugin = attest_plugins[i];
-    if (NULL !=
-       (ret = plugin->api->get_attributes (plugin->api->cls,
-                                              attest)))
-      return ret;
-  }
-  return NULL;
-}
diff --git a/src/reclaim-attribute/reclaim_attestation.h b/src/reclaim-attribute/reclaim_attestation.h
deleted file mode 100644 (file)
index 5747d88..0000000
+++ /dev/null
@@ -1,64 +0,0 @@
-/*
-   This file is part of GNUnet.
-   Copyright (C) 2012-2015 GNUnet e.V.
-
-   GNUnet is free software: you can redistribute it and/or modify it
-   under the terms of the GNU Affero General Public License as published
-   by the Free Software Foundation, either version 3 of the License,
-   or (at your option) any later version.
-
-   GNUnet is distributed in the hope that it will be useful, but
-   WITHOUT ANY WARRANTY; without even the implied warranty of
-   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
-   Affero General Public License for more details.
-
-   You should have received a copy of the GNU Affero General Public License
-   along with this program.  If not, see <http://www.gnu.org/licenses/>.
-
-   SPDX-License-Identifier: AGPL3.0-or-later
- */
-/**
- * @author Martin Schanzenbach
- * @file reclaim-attribute/reclaim_attestation.h
- * @brief GNUnet reclaim identity attribute attestations
- *
- */
-#ifndef RECLAIM_ATTESTATION_H
-#define RECLAIM_ATTESTATION_H
-
-#include "gnunet_reclaim_service.h"
-
-/**
- * Serialized attestation claim
- */
-struct Attestation
-{
-  /**
-   * Attestation type
-   */
-  uint32_t attestation_type;
-
-  /**
-   * Attestation flag
-   */
-  uint32_t attestation_flag;
-
-  /**
-   * Attestation ID
-   */
-  struct GNUNET_RECLAIM_Identifier attestation_id;
-
-  /**
-   * Name length
-   */
-  uint32_t name_len;
-
-  /**
-   * Data size
-   */
-  uint32_t data_size;
-
-  // followed by data_size Attestation value data
-};
-
-#endif
diff --git a/src/reclaim-attribute/reclaim_attribute.c b/src/reclaim-attribute/reclaim_attribute.c
deleted file mode 100644 (file)
index 12f124c..0000000
+++ /dev/null
@@ -1,539 +0,0 @@
-/*
-   This file is part of GNUnet
-   Copyright (C) 2010-2015 GNUnet e.V.
-
-   GNUnet is free software: you can redistribute it and/or modify it
-   under the terms of the GNU Affero General Public License as published
-   by the Free Software Foundation, either version 3 of the License,
-   or (at your option) any later version.
-
-   GNUnet is distributed in the hope that it will be useful, but
-   WITHOUT ANY WARRANTY; without even the implied warranty of
-   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
-   Affero General Public License for more details.
-
-   You should have received a copy of the GNU Affero General Public License
-   along with this program.  If not, see <http://www.gnu.org/licenses/>.
-
-   SPDX-License-Identifier: AGPL3.0-or-later
- */
-
-/**
- * @file reclaim-attribute/reclaim_attribute.c
- * @brief helper library to manage identity attributes
- * @author Martin Schanzenbach
- */
-#include "platform.h"
-#include "gnunet_util_lib.h"
-#include "gnunet_reclaim_plugin.h"
-#include "reclaim_attribute.h"
-
-
-/**
- * Handle for a plugin
- */
-struct Plugin
-{
-  /**
-   * Name of the plugin
-   */
-  char *library_name;
-
-  /**
-   * Plugin API
-   */
-  struct GNUNET_RECLAIM_AttributePluginFunctions *api;
-};
-
-
-/**
- * Plugins
- */
-static struct Plugin **attr_plugins;
-
-
-/**
- * Number of plugins
- */
-static unsigned int num_plugins;
-
-
-/**
- * Init canary
- */
-static int initialized;
-
-
-/**
- * Add a plugin
- *
- * @param cls closure
- * @param library_name name of the API library
- * @param lib_ret the plugin API pointer
- */
-static void
-add_plugin (void *cls, const char *library_name, void *lib_ret)
-{
-  struct GNUNET_RECLAIM_AttributePluginFunctions *api = lib_ret;
-  struct Plugin *plugin;
-
-  GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
-              "Loading attribute plugin `%s'\n",
-              library_name);
-  plugin = GNUNET_new (struct Plugin);
-  plugin->api = api;
-  plugin->library_name = GNUNET_strdup (library_name);
-  GNUNET_array_append (attr_plugins, num_plugins, plugin);
-}
-
-
-/**
- * Load plugins
- */
-static void
-init ()
-{
-  if (GNUNET_YES == initialized)
-    return;
-  initialized = GNUNET_YES;
-  GNUNET_PLUGIN_load_all ("libgnunet_plugin_reclaim_attribute_",
-                          NULL,
-                          &add_plugin,
-                          NULL);
-}
-
-
-/**
- * Convert a type name to the corresponding number
- *
- * @param typename name to convert
- * @return corresponding number, UINT32_MAX on error
- */
-uint32_t
-GNUNET_RECLAIM_attribute_typename_to_number (const char *typename)
-{
-  unsigned int i;
-  struct Plugin *plugin;
-  uint32_t ret;
-
-  init ();
-  for (i = 0; i < num_plugins; i++)
-  {
-    plugin = attr_plugins[i];
-    if (UINT32_MAX !=
-        (ret = plugin->api->typename_to_number (plugin->api->cls, typename)))
-      return ret;
-  }
-  return UINT32_MAX;
-}
-
-
-/**
- * Convert a type number to the corresponding type string
- *
- * @param type number of a type
- * @return corresponding typestring, NULL on error
- */
-const char *
-GNUNET_RECLAIM_attribute_number_to_typename (uint32_t type)
-{
-  unsigned int i;
-  struct Plugin *plugin;
-  const char *ret;
-
-  init ();
-  for (i = 0; i < num_plugins; i++)
-  {
-    plugin = attr_plugins[i];
-    if (NULL !=
-        (ret = plugin->api->number_to_typename (plugin->api->cls, type)))
-      return ret;
-  }
-  return NULL;
-}
-
-
-/**
- * Convert human-readable version of a 'claim' of an attribute to the binary
- * representation
- *
- * @param type type of the claim
- * @param s human-readable string
- * @param data set to value in binary encoding (will be allocated)
- * @param data_size set to number of bytes in @a data
- * @return #GNUNET_OK on success
- */
-int
-GNUNET_RECLAIM_attribute_string_to_value (uint32_t type,
-                                          const char *s,
-                                          void **data,
-                                          size_t *data_size)
-{
-  unsigned int i;
-  struct Plugin *plugin;
-
-  init ();
-  for (i = 0; i < num_plugins; i++)
-  {
-    plugin = attr_plugins[i];
-    if (GNUNET_OK == plugin->api->string_to_value (plugin->api->cls,
-                                                   type,
-                                                   s,
-                                                   data,
-                                                   data_size))
-      return GNUNET_OK;
-  }
-  return GNUNET_SYSERR;
-}
-
-
-/**
- * Convert the 'claim' of an attribute to a string
- *
- * @param type the type of attribute
- * @param data claim in binary encoding
- * @param data_size number of bytes in @a data
- * @return NULL on error, otherwise human-readable representation of the claim
- */
-char *
-GNUNET_RECLAIM_attribute_value_to_string (uint32_t type,
-                                          const void *data,
-                                          size_t data_size)
-{
-  unsigned int i;
-  struct Plugin *plugin;
-  char *ret;
-
-  init ();
-  for (i = 0; i < num_plugins; i++)
-  {
-    plugin = attr_plugins[i];
-    if (NULL != (ret = plugin->api->value_to_string (plugin->api->cls,
-                                                     type,
-                                                     data,
-                                                     data_size)))
-      return ret;
-  }
-  return NULL;
-}
-
-
-/**
- * Create a new attribute.
- *
- * @param attr_name the attribute name
- * @param attestation attestation ID of the attribute (maybe NULL)
- * @param type the attribute type
- * @param data the attribute value
- * @param data_size the attribute value size
- * @return the new attribute
- */
-struct GNUNET_RECLAIM_Attribute *
-GNUNET_RECLAIM_attribute_new (const char *attr_name,
-                              const struct GNUNET_RECLAIM_Identifier *attestation,
-                              uint32_t type,
-                              const void *data,
-                              size_t data_size)
-{
-  struct GNUNET_RECLAIM_Attribute *attr;
-  char *write_ptr;
-  char *attr_name_tmp = GNUNET_strdup (attr_name);
-
-  GNUNET_STRINGS_utf8_tolower (attr_name, attr_name_tmp);
-
-  attr = GNUNET_malloc (sizeof(struct GNUNET_RECLAIM_Attribute)
-                        + strlen (attr_name_tmp) + 1 + data_size);
-  if (NULL != attestation)
-    attr->attestation = *attestation;
-  attr->type = type;
-  attr->data_size = data_size;
-  attr->flag = 0;
-  write_ptr = (char *) &attr[1];
-  GNUNET_memcpy (write_ptr, attr_name_tmp, strlen (attr_name_tmp) + 1);
-  attr->name = write_ptr;
-  write_ptr += strlen (attr->name) + 1;
-  GNUNET_memcpy (write_ptr, data, data_size);
-  attr->data = write_ptr;
-  GNUNET_free (attr_name_tmp);
-  return attr;
-}
-
-
-/**
- * Add a new attribute to a claim list
- *
- * @param attr_name the name of the new attribute claim
- * @param type the type of the claim
- * @param data claim payload
- * @param data_size claim payload size
- */
-void
-GNUNET_RECLAIM_attribute_list_add (
-  struct GNUNET_RECLAIM_AttributeList *al,
-  const char *attr_name,
-  const struct GNUNET_RECLAIM_Identifier *attestation,
-  uint32_t type,
-  const void *data,
-  size_t data_size)
-{
-  struct GNUNET_RECLAIM_AttributeListEntry *ale;
-
-  ale = GNUNET_new (struct GNUNET_RECLAIM_AttributeListEntry);
-  ale->attribute =
-    GNUNET_RECLAIM_attribute_new (attr_name, attestation,
-                                  type, data, data_size);
-  GNUNET_CONTAINER_DLL_insert (al->list_head,
-                               al->list_tail,
-                               ale);
-}
-
-
-/**
- * Get required size for serialization buffer
- *
- * @param attrs the attribute list to serialize
- * @return the required buffer size
- */
-size_t
-GNUNET_RECLAIM_attribute_list_serialize_get_size (
-  const struct GNUNET_RECLAIM_AttributeList *al)
-{
-  struct GNUNET_RECLAIM_AttributeListEntry *ale;
-  size_t len = 0;
-
-  for (ale = al->list_head; NULL != ale; ale = ale->next)
-  {
-    GNUNET_assert (NULL != ale->attribute);
-    len += GNUNET_RECLAIM_attribute_serialize_get_size (ale->attribute);
-    len += sizeof(struct GNUNET_RECLAIM_AttributeListEntry);
-  }
-  return len;
-}
-
-
-/**
- * Serialize an attribute list
- *
- * @param attrs the attribute list to serialize
- * @param result the serialized attribute
- * @return length of serialized data
- */
-size_t
-GNUNET_RECLAIM_attribute_list_serialize (
-  const struct GNUNET_RECLAIM_AttributeList *al,
-  char *result)
-{
-  struct GNUNET_RECLAIM_AttributeListEntry *ale;
-  size_t len;
-  size_t total_len;
-  char *write_ptr;
-  write_ptr = result;
-  total_len = 0;
-  for (ale = al->list_head; NULL != ale; ale = ale->next)
-  {
-    GNUNET_assert (NULL != ale->attribute);
-    len = GNUNET_RECLAIM_attribute_serialize (ale->attribute, write_ptr);
-    total_len += len;
-    write_ptr += len;
-  }
-  return total_len;
-}
-
-
-/**
- * Deserialize an attribute list
- *
- * @param data the serialized attribute list
- * @param data_size the length of the serialized data
- * @return a GNUNET_IDENTITY_PROVIDER_AttributeList, must be free'd by caller
- */
-struct GNUNET_RECLAIM_AttributeList *
-GNUNET_RECLAIM_attribute_list_deserialize (const char *data, size_t data_size)
-{
-  struct GNUNET_RECLAIM_AttributeList *al;
-  struct GNUNET_RECLAIM_AttributeListEntry *ale;
-  size_t attr_len;
-  const char *read_ptr;
-
-  al = GNUNET_new (struct GNUNET_RECLAIM_AttributeList);
-  if (data_size < sizeof(struct Attribute) + sizeof(struct
-                                                    GNUNET_RECLAIM_AttributeListEntry))
-    return al;
-  read_ptr = data;
-  while (((data + data_size) - read_ptr) >= sizeof(struct Attribute))
-  {
-    ale = GNUNET_new (struct GNUNET_RECLAIM_AttributeListEntry);
-    ale->attribute =
-      GNUNET_RECLAIM_attribute_deserialize (read_ptr,
-                                            data_size - (read_ptr - data));
-    GNUNET_CONTAINER_DLL_insert (al->list_head, al->list_tail, ale);
-    attr_len = GNUNET_RECLAIM_attribute_serialize_get_size (ale->attribute);
-    read_ptr += attr_len;
-  }
-  return al;
-}
-
-
-/**
- * Make a (deep) copy of a claim list
- * @param attrs claim list to copy
- * @return copied claim list
- */
-struct GNUNET_RECLAIM_AttributeList *
-GNUNET_RECLAIM_attribute_list_dup (
-  const struct GNUNET_RECLAIM_AttributeList *al)
-{
-  struct GNUNET_RECLAIM_AttributeListEntry *ale;
-  struct GNUNET_RECLAIM_AttributeListEntry *result_ale;
-  struct GNUNET_RECLAIM_AttributeList *result;
-
-  result = GNUNET_new (struct GNUNET_RECLAIM_AttributeList);
-  for (ale = al->list_head; NULL != ale; ale = ale->next)
-  {
-    result_ale = GNUNET_new (struct GNUNET_RECLAIM_AttributeListEntry);
-    GNUNET_assert (NULL != ale->attribute);
-    {
-      result_ale->attribute =
-        GNUNET_RECLAIM_attribute_new (ale->attribute->name,
-                                      &ale->attribute->attestation,
-                                      ale->attribute->type,
-                                      ale->attribute->data,
-                                      ale->attribute->data_size);
-
-      result_ale->attribute->id = ale->attribute->id;
-      result_ale->attribute->flag = ale->attribute->flag;
-    }
-    GNUNET_CONTAINER_DLL_insert (result->list_head,
-                                 result->list_tail,
-                                 result_ale);
-  }
-  return result;
-}
-
-
-/**
- * Destroy claim list
- *
- * @param attrs list to destroy
- */
-void
-GNUNET_RECLAIM_attribute_list_destroy (
-  struct GNUNET_RECLAIM_AttributeList *al)
-{
-  struct GNUNET_RECLAIM_AttributeListEntry *ale;
-  struct GNUNET_RECLAIM_AttributeListEntry *tmp_ale;
-
-  for (ale = al->list_head; NULL != ale;)
-  {
-    if (NULL != ale->attribute)
-      GNUNET_free (ale->attribute);
-    tmp_ale = ale;
-    ale = ale->next;
-    GNUNET_free (tmp_ale);
-  }
-  GNUNET_free (al);
-}
-
-
-/**
- * Get required size for serialization buffer
- *
- * @param attr the attribute to serialize
- * @return the required buffer size
- */
-size_t
-GNUNET_RECLAIM_attribute_serialize_get_size (
-  const struct GNUNET_RECLAIM_Attribute *attr)
-{
-  return sizeof(struct Attribute) + strlen (attr->name) + attr->data_size;
-}
-
-
-/**
- * Serialize an attribute
- *
- * @param attr the attribute to serialize
- * @param result the serialized attribute
- * @return length of serialized data
- */
-size_t
-GNUNET_RECLAIM_attribute_serialize (
-  const struct GNUNET_RECLAIM_Attribute *attr,
-  char *result)
-{
-  size_t data_len_ser;
-  size_t name_len;
-  struct Attribute *attr_ser;
-  char *write_ptr;
-
-  attr_ser = (struct Attribute *) result;
-  attr_ser->attribute_type = htons (attr->type);
-  attr_ser->attribute_flag = htonl (attr->flag);
-  attr_ser->attribute_id = attr->id;
-  attr_ser->attestation_id = attr->attestation;
-  name_len = strlen (attr->name);
-  attr_ser->name_len = htons (name_len);
-  write_ptr = (char *) &attr_ser[1];
-  GNUNET_memcpy (write_ptr, attr->name, name_len);
-  write_ptr += name_len;
-  // TODO plugin-ize
-  // data_len_ser = plugin->serialize_attribute_value (attr,
-  //                                                  &attr_ser[1]);
-  data_len_ser = attr->data_size;
-  GNUNET_memcpy (write_ptr, attr->data, attr->data_size);
-  attr_ser->data_size = htons (data_len_ser);
-
-  return sizeof(struct Attribute) + strlen (attr->name) + attr->data_size;
-}
-
-
-/**
- * Deserialize an attribute
- *
- * @param data the serialized attribute
- * @param data_size the length of the serialized data
- *
- * @return a GNUNET_IDENTITY_PROVIDER_Attribute, must be free'd by caller
- */
-struct GNUNET_RECLAIM_Attribute *
-GNUNET_RECLAIM_attribute_deserialize (const char *data, size_t data_size)
-{
-  struct GNUNET_RECLAIM_Attribute *attr;
-  struct Attribute *attr_ser;
-  size_t data_len;
-  size_t name_len;
-  char *write_ptr;
-
-  if (data_size < sizeof(struct Attribute))
-    return NULL;
-
-  attr_ser = (struct Attribute *) data;
-  data_len = ntohs (attr_ser->data_size);
-  name_len = ntohs (attr_ser->name_len);
-  if (data_size < sizeof(struct Attribute) + data_len + name_len)
-  {
-    GNUNET_log (GNUNET_ERROR_TYPE_ERROR,
-                "Buffer too small to deserialize\n");
-    return NULL;
-  }
-  attr = GNUNET_malloc (sizeof(struct GNUNET_RECLAIM_Attribute)
-                        + data_len + name_len + 1);
-  attr->type = ntohs (attr_ser->attribute_type);
-  attr->flag = ntohl (attr_ser->attribute_flag);
-  attr->id = attr_ser->attribute_id;
-  attr->attestation = attr_ser->attestation_id;
-  attr->data_size = data_len;
-
-  write_ptr = (char *) &attr[1];
-  GNUNET_memcpy (write_ptr, &attr_ser[1], name_len);
-  write_ptr[name_len] = '\0';
-  attr->name = write_ptr;
-
-  write_ptr += name_len + 1;
-  GNUNET_memcpy (write_ptr, (char *) &attr_ser[1] + name_len, attr->data_size);
-  attr->data = write_ptr;
-  return attr;
-}
-
-
-/* end of reclaim_attribute.c */
diff --git a/src/reclaim-attribute/reclaim_attribute.h b/src/reclaim-attribute/reclaim_attribute.h
deleted file mode 100644 (file)
index e54b210..0000000
+++ /dev/null
@@ -1,102 +0,0 @@
-/*
-   This file is part of GNUnet.
-   Copyright (C) 2012-2015 GNUnet e.V.
-
-   GNUnet is free software: you can redistribute it and/or modify it
-   under the terms of the GNU Affero General Public License as published
-   by the Free Software Foundation, either version 3 of the License,
-   or (at your option) any later version.
-
-   GNUnet is distributed in the hope that it will be useful, but
-   WITHOUT ANY WARRANTY; without even the implied warranty of
-   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
-   Affero General Public License for more details.
-
-   You should have received a copy of the GNU Affero General Public License
-   along with this program.  If not, see <http://www.gnu.org/licenses/>.
-
-   SPDX-License-Identifier: AGPL3.0-or-later
- */
-/**
- * @author Martin Schanzenbach
- * @file reclaim-attribute/reclaim_attribute.h
- * @brief GNUnet reclaim identity attributes
- *
- */
-#ifndef RECLAIM_ATTRIBUTE_H
-#define RECLAIM_ATTRIBUTE_H
-
-#include "gnunet_reclaim_service.h"
-
-/**
- * Serialized claim
- */
-struct Attribute
-{
-  /**
-   * Attribute type
-   */
-  uint32_t attribute_type;
-
-  /**
-   * Attribute flag
-   */
-  uint32_t attribute_flag;
-
-  /**
-   * Attribute ID
-   */
-  struct GNUNET_RECLAIM_Identifier attribute_id;
-
-  /**
-   * Attestation ID
-   */
-  struct GNUNET_RECLAIM_Identifier attestation_id;
-
-  /**
-   * Name length
-   */
-  uint32_t name_len;
-
-  /**
-   * Data size
-   */
-  uint32_t data_size;
-
-  // followed by data_size Attribute value data
-};
-
-/**
- * Serialized attestation claim
- */
-struct Attestation
-{
-  /**
-   * Attestation type
-   */
-  uint32_t attestation_type;
-
-  /**
-   * Attestation flag
-   */
-  uint32_t attestation_flag;
-
-  /**
-   * Attestation ID
-   */
-  struct GNUNET_RECLAIM_Identifier attestation_id;
-
-  /**
-   * Name length
-   */
-  uint32_t name_len;
-
-  /**
-   * Data size
-   */
-  uint32_t data_size;
-
-  // followed by data_size Attestation value data
-};
-
-#endif
index 51b9b9c5b27c1d8ec0b27cd1dddff72f7a563376..9242d6d79caae1307f3da7d07a4501b817e22dfe 100644 (file)
@@ -34,6 +34,8 @@ lib_LTLIBRARIES = \
   libgnunetreclaim.la
 plugin_LTLIBRARIES = \
   libgnunet_plugin_gnsrecord_reclaim.la \
+  libgnunet_plugin_reclaim_attribute_basic.la \
+  libgnunet_plugin_reclaim_attestation_jwt.la \
   $(REST_PLUGIN)
 
 bin_PROGRAMS = \
@@ -51,7 +53,6 @@ libgnunet_plugin_rest_reclaim_la_LIBADD = \
   libgnunetreclaim.la \
   $(top_builddir)/src/json/libgnunetjson.la \
   $(top_builddir)/src/rest/libgnunetrest.la \
-  $(top_builddir)/src/reclaim-attribute/libgnunetreclaimattribute.la \
   $(top_builddir)/src/namestore/libgnunetnamestore.la \
   $(top_builddir)/src/util/libgnunetutil.la $(XLIBS) \
   $(LTLIBINTL) -ljansson $(MHD_LIBS)
@@ -68,7 +69,6 @@ libgnunet_plugin_rest_openid_connect_la_LIBADD = \
   $(top_builddir)/src/identity/libgnunetidentity.la \
   libgnunetreclaim.la \
   $(top_builddir)/src/rest/libgnunetrest.la \
-  $(top_builddir)/src/reclaim-attribute/libgnunetreclaimattribute.la \
   $(top_builddir)/src/namestore/libgnunetnamestore.la \
   $(top_builddir)/src/gns/libgnunetgns.la \
   $(top_builddir)/src/gnsrecord/libgnunetgnsrecord.la \
@@ -98,22 +98,43 @@ gnunet_service_reclaim_LDADD = \
  $(top_builddir)/src/util/libgnunetutil.la \
  $(top_builddir)/src/namestore/libgnunetnamestore.la \
  $(top_builddir)/src/statistics/libgnunetstatistics.la \
- $(top_builddir)/src/reclaim-attribute/libgnunetreclaimattribute.la \
  libgnunetreclaim.la \
  $(top_builddir)/src/gns/libgnunetgns.la \
  $(GN_LIBINTL)
 
 libgnunetreclaim_la_SOURCES = \
  reclaim_api.c \
- reclaim.h
+ reclaim.h \
+ reclaim_attribute.c \
+ reclaim_attribute.h \
+ reclaim_attestation.c \
+ reclaim_attestation.h
 libgnunetreclaim_la_LIBADD = \
   $(top_builddir)/src/util/libgnunetutil.la \
-  $(top_builddir)/src/reclaim-attribute/libgnunetreclaimattribute.la \
   $(GN_LIBINTL) $(XLIB)
 libgnunetreclaim_la_LDFLAGS = \
   $(GN_LIB_LDFLAGS)   \
   -version-info 0:0:0
 
+
+libgnunet_plugin_reclaim_attribute_basic_la_SOURCES = \
+  plugin_reclaim_attribute_basic.c
+libgnunet_plugin_reclaim_attribute_basic_la_LIBADD = \
+  $(top_builddir)/src/util/libgnunetutil.la \
+  $(LTLIBINTL)
+libgnunet_plugin_reclaim_attribute_basic_la_LDFLAGS = \
+ $(GN_PLUGIN_LDFLAGS)
+
+libgnunet_plugin_reclaim_attestation_jwt_la_SOURCES = \
+  plugin_reclaim_attestation_jwt.c
+libgnunet_plugin_reclaim_attestation_jwt_la_LIBADD = \
+  $(top_builddir)/src/util/libgnunetutil.la \
+  libgnunetreclaim.la \
+  -ljansson\
+  $(LTLIBINTL)
+libgnunet_plugin_reclaim_attestation_jwt_la_LDFLAGS = \
+ $(GN_PLUGIN_LDFLAGS)
+
 gnunet_reclaim_SOURCES = \
  gnunet-reclaim.c
 gnunet_reclaim_LDADD = \
@@ -121,7 +142,6 @@ gnunet_reclaim_LDADD = \
   $(top_builddir)/src/namestore/libgnunetnamestore.la \
   libgnunetreclaim.la \
   $(top_builddir)/src/identity/libgnunetidentity.la \
-  $(top_builddir)/src/reclaim-attribute/libgnunetreclaimattribute.la \
   $(GN_LIBINTL)
 
 check_SCRIPTS = \
index 4521e5c811b9f09c813a78b550545adac10e6f2c..ddfe055566a1be1f82d514f055fda0538f9916fc 100644 (file)
@@ -29,7 +29,7 @@
 #include "gnunet_constants.h"
 #include "gnunet_gnsrecord_lib.h"
 #include "gnunet_protocols.h"
-#include "gnunet_reclaim_attribute_lib.h"
+#include "gnunet_reclaim_lib.h"
 #include "gnunet_reclaim_service.h"
 #include "gnunet_signatures.h"
 #include "reclaim.h"
index d6bc4a70aed878ea86e286ab811ebeba038e5b79..1c7214d4216fbeebcf26ed7ae925646adc88144b 100644 (file)
@@ -36,7 +36,7 @@
 #include "gnunet_gns_service.h"
 #include "gnunet_gnsrecord_lib.h"
 #include "gnunet_protocols.h"
-#include "gnunet_reclaim_attribute_lib.h"
+#include "gnunet_reclaim_lib.h"
 #include "gnunet_reclaim_service.h"
 #include "gnunet_signatures.h"
 #include "gnunet_statistics_service.h"
index 4c08430e77e4731973dd4f291335d779eeff4565..353303187edae228bc2fdb581b6f8fb14ccc6e7d 100644 (file)
@@ -28,7 +28,7 @@
 #include "gnunet_util_lib.h"
 
 #include "gnunet_json_lib.h"
-#include "gnunet_reclaim_attribute_lib.h"
+#include "gnunet_reclaim_lib.h"
 #include "gnunet_reclaim_service.h"
 
 
index 5aaf81b936343f09adfadeb372b56395f8cfedda..61ddb4378c3976176353caf2c7435322b0725273 100644 (file)
@@ -27,7 +27,7 @@
 #include "gnunet_util_lib.h"
 #include "gnunet_json_lib.h"
 #include "gnunet_reclaim_service.h"
-#include "gnunet_reclaim_attribute_lib.h"
+#include "gnunet_reclaim_lib.h"
 
 /**
  * JSON Specification for Reclaim claims.
index 92b4b69ccd5ffa3861b6e187d819ce9ef13d01df..469b8a7966e257646bfc8ed0f973454e628b438e 100644 (file)
@@ -27,7 +27,7 @@
 #include <inttypes.h>
 #include <jansson.h>
 #include "gnunet_util_lib.h"
-#include "gnunet_reclaim_attribute_lib.h"
+#include "gnunet_reclaim_lib.h"
 #include "gnunet_reclaim_service.h"
 #include "gnunet_signatures.h"
 #include "oidc_helper.h"
diff --git a/src/reclaim/plugin_reclaim_attestation_jwt.c b/src/reclaim/plugin_reclaim_attestation_jwt.c
new file mode 100644 (file)
index 0000000..8a67b18
--- /dev/null
@@ -0,0 +1,233 @@
+/*
+     This file is part of GNUnet
+     Copyright (C) 2013, 2014, 2016 GNUnet e.V.
+
+     GNUnet is free software: you can redistribute it and/or modify it
+     under the terms of the GNU Affero General Public License as published
+     by the Free Software Foundation, either version 3 of the License,
+     or (at your option) any later version.
+
+     GNUnet is distributed in the hope that it will be useful, but
+     WITHOUT ANY WARRANTY; without even the implied warranty of
+     MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+     Affero General Public License for more details.
+
+     You should have received a copy of the GNU Affero General Public License
+     along with this program.  If not, see <http://www.gnu.org/licenses/>.
+
+     SPDX-License-Identifier: AGPL3.0-or-later
+ */
+
+/**
+ * @file reclaim-attribute/plugin_reclaim_attestation_gnuid.c
+ * @brief reclaim-attribute-plugin-gnuid attribute plugin to provide the API for
+ *                                       fundamental
+ *                                       attribute types.
+ *
+ * @author Martin Schanzenbach
+ */
+#include "platform.h"
+#include "gnunet_util_lib.h"
+#include "gnunet_reclaim_plugin.h"
+#include <inttypes.h>
+#include <jansson.h>
+
+/**
+   * Convert the 'value' of an attestation to a string.
+   *
+   * @param cls closure, unused
+   * @param type type of the attestation
+   * @param data value in binary encoding
+   * @param data_size number of bytes in @a data
+   * @return NULL on error, otherwise human-readable representation of the value
+   */
+static char *
+jwt_value_to_string (void *cls,
+                     uint32_t type,
+                     const void *data,
+                     size_t data_size)
+{
+  switch (type)
+  {
+  case GNUNET_RECLAIM_ATTESTATION_TYPE_JWT:
+    return GNUNET_strndup (data, data_size);
+
+  default:
+    return NULL;
+  }
+}
+
+
+/**
+ * Convert human-readable version of a 'value' of an attestation to the binary
+ * representation.
+ *
+ * @param cls closure, unused
+ * @param type type of the attestation
+ * @param s human-readable string
+ * @param data set to value in binary encoding (will be allocated)
+ * @param data_size set to number of bytes in @a data
+ * @return #GNUNET_OK on success
+ */
+static int
+jwt_string_to_value (void *cls,
+                     uint32_t type,
+                     const char *s,
+                     void **data,
+                     size_t *data_size)
+{
+  if (NULL == s)
+    return GNUNET_SYSERR;
+  switch (type)
+  {
+  case GNUNET_RECLAIM_ATTESTATION_TYPE_JWT:
+    *data = GNUNET_strdup (s);
+    *data_size = strlen (s);
+    return GNUNET_OK;
+
+  default:
+    return GNUNET_SYSERR;
+  }
+}
+
+
+/**
+ * Mapping of attestation type numbers to human-readable
+ * attestation type names.
+ */
+static struct
+{
+  const char *name;
+  uint32_t number;
+} jwt_attest_name_map[] = { { "JWT", GNUNET_RECLAIM_ATTESTATION_TYPE_JWT },
+                            { NULL, UINT32_MAX } };
+
+/**
+   * Convert a type name to the corresponding number.
+   *
+   * @param cls closure, unused
+   * @param jwt_typename name to convert
+   * @return corresponding number, UINT32_MAX on error
+   */
+static uint32_t
+jwt_typename_to_number (void *cls, const char *jwt_typename)
+{
+  unsigned int i;
+
+  i = 0;
+  while ((NULL != jwt_attest_name_map[i].name) &&
+         (0 != strcasecmp (jwt_typename, jwt_attest_name_map[i].name)))
+    i++;
+  return jwt_attest_name_map[i].number;
+}
+
+
+/**
+ * Convert a type number (i.e. 1) to the corresponding type string
+ *
+ * @param cls closure, unused
+ * @param type number of a type to convert
+ * @return corresponding typestring, NULL on error
+ */
+static const char *
+jwt_number_to_typename (void *cls, uint32_t type)
+{
+  unsigned int i;
+
+  i = 0;
+  while ((NULL != jwt_attest_name_map[i].name) && (type !=
+                                                   jwt_attest_name_map[i].
+                                                   number))
+    i++;
+  return jwt_attest_name_map[i].name;
+}
+
+/**
+ * Parse a JWT and return the respective claim value as Attribute
+ *
+ * @param attest the jwt attestation
+ * @param claim the name of the claim in the JWT
+ *
+ * @return a GNUNET_RECLAIM_Attribute, containing the new value
+ */
+struct GNUNET_RECLAIM_AttributeList *
+jwt_parse_attributes (void *cls,
+                      const struct GNUNET_RECLAIM_Attestation *attest)
+{
+  char *jwt_string;
+  struct GNUNET_RECLAIM_AttributeList *attrs;
+  char delim[] = ".";
+  char *val_str = NULL;
+  GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, "Parsing JWT attributes.\n");
+  char *decoded_jwt;
+  json_t *json_val;
+  json_error_t *json_err = NULL;
+
+  if (GNUNET_RECLAIM_ATTESTATION_TYPE_JWT != attest->type)
+    return NULL;
+  attrs = GNUNET_new (struct GNUNET_RECLAIM_AttributeList);
+
+  jwt_string = GNUNET_strdup (attest->data);
+  const char *jwt_body = strtok (jwt_string, delim);
+  jwt_body = strtok (NULL, delim);
+  GNUNET_STRINGS_base64_decode (jwt_body, strlen (jwt_body),
+                                (void **) &decoded_jwt);
+  json_val = json_loads (decoded_jwt, JSON_DECODE_ANY, json_err);
+  const char *key;
+  json_t *value;
+  json_object_foreach (json_val, key, value) {
+    val_str = json_dumps (value, JSON_ENCODE_ANY);
+    GNUNET_RECLAIM_attribute_list_add (attrs,
+                                       key,
+                                       NULL,
+                                       GNUNET_RECLAIM_ATTRIBUTE_TYPE_STRING,//FIXME
+                                       val_str,
+                                       strlen (val_str));
+    GNUNET_free (val_str);
+  }
+  GNUNET_free (jwt_string);
+  //FIXME needed??
+  return attrs;
+}
+
+
+
+
+/**
+ * Entry point for the plugin.
+ *
+ * @param cls NULL
+ * @return the exported block API
+ */
+void *
+libgnunet_plugin_reclaim_attestation_jwt_init (void *cls)
+{
+  struct GNUNET_RECLAIM_AttestationPluginFunctions *api;
+
+  api = GNUNET_new (struct GNUNET_RECLAIM_AttestationPluginFunctions);
+  api->value_to_string = &jwt_value_to_string;
+  api->string_to_value = &jwt_string_to_value;
+  api->typename_to_number = &jwt_typename_to_number;
+  api->number_to_typename = &jwt_number_to_typename;
+  api->get_attributes = &jwt_parse_attributes;
+  return api;
+}
+
+
+/**
+ * Exit point from the plugin.
+ *
+ * @param cls the return value from #libgnunet_plugin_block_test_init()
+ * @return NULL
+ */
+void *
+libgnunet_plugin_reclaim_attestation_jwt_done (void *cls)
+{
+  struct GNUNET_RECLAIM_AttestationPluginFunctions *api = cls;
+
+  GNUNET_free (api);
+  return NULL;
+}
+
+
+/* end of plugin_reclaim_attestation_type_gnuid.c */
diff --git a/src/reclaim/plugin_reclaim_attribute_basic.c b/src/reclaim/plugin_reclaim_attribute_basic.c
new file mode 100644 (file)
index 0000000..47fdd5f
--- /dev/null
@@ -0,0 +1,180 @@
+/*
+     This file is part of GNUnet
+     Copyright (C) 2013, 2014, 2016 GNUnet e.V.
+
+     GNUnet is free software: you can redistribute it and/or modify it
+     under the terms of the GNU Affero General Public License as published
+     by the Free Software Foundation, either version 3 of the License,
+     or (at your option) any later version.
+
+     GNUnet is distributed in the hope that it will be useful, but
+     WITHOUT ANY WARRANTY; without even the implied warranty of
+     MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+     Affero General Public License for more details.
+
+     You should have received a copy of the GNU Affero General Public License
+     along with this program.  If not, see <http://www.gnu.org/licenses/>.
+
+     SPDX-License-Identifier: AGPL3.0-or-later
+ */
+
+/**
+ * @file reclaim-attribute/plugin_reclaim_attribute_gnuid.c
+ * @brief reclaim-attribute-plugin-gnuid attribute plugin to provide the API for
+ *                                       fundamental
+ *                                       attribute types.
+ *
+ * @author Martin Schanzenbach
+ */
+#include "platform.h"
+#include "gnunet_util_lib.h"
+#include "gnunet_reclaim_plugin.h"
+#include <inttypes.h>
+
+
+/**
+ * Convert the 'value' of an attribute to a string.
+ *
+ * @param cls closure, unused
+ * @param type type of the attribute
+ * @param data value in binary encoding
+ * @param data_size number of bytes in @a data
+ * @return NULL on error, otherwise human-readable representation of the value
+ */
+static char *
+basic_value_to_string (void *cls,
+                       uint32_t type,
+                       const void *data,
+                       size_t data_size)
+{
+  switch (type)
+  {
+  case GNUNET_RECLAIM_ATTRIBUTE_TYPE_STRING:
+    return GNUNET_strndup (data, data_size);
+
+  default:
+    return NULL;
+  }
+}
+
+
+/**
+ * Convert human-readable version of a 'value' of an attribute to the binary
+ * representation.
+ *
+ * @param cls closure, unused
+ * @param type type of the attribute
+ * @param s human-readable string
+ * @param data set to value in binary encoding (will be allocated)
+ * @param data_size set to number of bytes in @a data
+ * @return #GNUNET_OK on success
+ */
+static int
+basic_string_to_value (void *cls,
+                       uint32_t type,
+                       const char *s,
+                       void **data,
+                       size_t *data_size)
+{
+  if (NULL == s)
+    return GNUNET_SYSERR;
+  switch (type)
+  {
+  case GNUNET_RECLAIM_ATTRIBUTE_TYPE_STRING:
+    *data = GNUNET_strdup (s);
+    *data_size = strlen (s);
+    return GNUNET_OK;
+
+  default:
+    return GNUNET_SYSERR;
+  }
+}
+
+/**
+ * Mapping of attribute type numbers to human-readable
+ * attribute type names.
+ */
+static struct
+{
+  const char *name;
+  uint32_t number;
+} basic_name_map[] = { { "STRING", GNUNET_RECLAIM_ATTRIBUTE_TYPE_STRING },
+                       { NULL, UINT32_MAX } };
+
+
+/**
+ * Convert a type name to the corresponding number.
+ *
+ * @param cls closure, unused
+ * @param basic_typename name to convert
+ * @return corresponding number, UINT32_MAX on error
+ */
+static uint32_t
+basic_typename_to_number (void *cls, const char *basic_typename)
+{
+  unsigned int i;
+
+  i = 0;
+  while ((NULL != basic_name_map[i].name) &&
+         (0 != strcasecmp (basic_typename, basic_name_map[i].name)))
+    i++;
+  return basic_name_map[i].number;
+}
+
+
+/**
+ * Convert a type number (i.e. 1) to the corresponding type string
+ *
+ * @param cls closure, unused
+ * @param type number of a type to convert
+ * @return corresponding typestring, NULL on error
+ */
+static const char *
+basic_number_to_typename (void *cls, uint32_t type)
+{
+  unsigned int i;
+
+  i = 0;
+  while ((NULL != basic_name_map[i].name) && (type != basic_name_map[i].number))
+    i++;
+  return basic_name_map[i].name;
+}
+
+
+/**
+ * Entry point for the plugin.
+ *
+ * @param cls NULL
+ * @return the exported block API
+ */
+void *
+libgnunet_plugin_reclaim_attribute_basic_init (void *cls)
+{
+  struct GNUNET_RECLAIM_AttributePluginFunctions *api;
+
+  api = GNUNET_new (struct GNUNET_RECLAIM_AttributePluginFunctions);
+  api->value_to_string = &basic_value_to_string;
+  api->string_to_value = &basic_string_to_value;
+  api->typename_to_number = &basic_typename_to_number;
+  api->number_to_typename = &basic_number_to_typename;
+  return api;
+}
+
+
+/**
+ * Exit point from the plugin.
+ *
+ * @param cls the return value from #libgnunet_plugin_block_test_init()
+ * @return NULL
+ */
+void *
+libgnunet_plugin_reclaim_attribute_basic_done (void *cls)
+{
+  struct GNUNET_RECLAIM_AttributePluginFunctions *api = cls;
+
+  GNUNET_free (api);
+  return NULL;
+}
+
+
+/* end of plugin_reclaim_attribute_type_gnuid.c */
index b296f6d15789826d97997fbb8955b4030c217cd4..3e138f259d18e5d15cdc49616a973287f2abd1fe 100644 (file)
@@ -32,7 +32,7 @@
 #include "gnunet_gnsrecord_lib.h"
 #include "gnunet_identity_service.h"
 #include "gnunet_namestore_service.h"
-#include "gnunet_reclaim_attribute_lib.h"
+#include "gnunet_reclaim_lib.h"
 #include "gnunet_reclaim_service.h"
 #include "gnunet_rest_lib.h"
 #include "gnunet_rest_plugin.h"
index 417e594feb473ee83422decfaf23bc75f8089fee..8b3aee8baf0f669b2b2fe414e74960173764445c 100644 (file)
@@ -31,7 +31,7 @@
 #include "gnunet_gns_service.h"
 #include "gnunet_gnsrecord_lib.h"
 #include "gnunet_identity_service.h"
-#include "gnunet_reclaim_attribute_lib.h"
+#include "gnunet_reclaim_lib.h"
 #include "gnunet_reclaim_service.h"
 #include "gnunet_rest_lib.h"
 #include "gnunet_rest_plugin.h"
index 54288866d85a6a1c8177c4889d5d87ee84b33b56..8558b19dfc839a9207d48b86e54ce6c6859622e1 100644 (file)
@@ -28,7 +28,7 @@
 #include "gnunet_constants.h"
 #include "gnunet_mq_lib.h"
 #include "gnunet_protocols.h"
-#include "gnunet_reclaim_attribute_lib.h"
+#include "gnunet_reclaim_lib.h"
 #include "gnunet_reclaim_service.h"
 #include "reclaim.h"
 
diff --git a/src/reclaim/reclaim_attestation.c b/src/reclaim/reclaim_attestation.c
new file mode 100644 (file)
index 0000000..961c6ed
--- /dev/null
@@ -0,0 +1,520 @@
+/*
+   This file is part of GNUnet
+   Copyright (C) 2010-2015 GNUnet e.V.
+
+   GNUnet is free software: you can redistribute it and/or modify it
+   under the terms of the GNU Affero General Public License as published
+   by the Free Software Foundation, either version 3 of the License,
+   or (at your option) any later version.
+
+   GNUnet is distributed in the hope that it will be useful, but
+   WITHOUT ANY WARRANTY; without even the implied warranty of
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+   Affero General Public License for more details.
+
+   You should have received a copy of the GNU Affero General Public License
+   along with this program.  If not, see <http://www.gnu.org/licenses/>.
+
+   SPDX-License-Identifier: AGPL3.0-or-later
+ */
+
+/**
+ * @file reclaim-attribute/reclaim_attestation.c
+ * @brief helper library to manage identity attribute attestations
+ * @author Martin Schanzenbach
+ */
+#include "platform.h"
+#include "gnunet_util_lib.h"
+#include "gnunet_reclaim_plugin.h"
+#include "reclaim_attestation.h"
+
+
+/**
+ * Handle for a plugin
+ */
+struct Plugin
+{
+  /**
+   * Name of the plugin
+   */
+  char *library_name;
+
+  /**
+   * Plugin API
+   */
+  struct GNUNET_RECLAIM_AttestationPluginFunctions *api;
+};
+
+
+/**
+ * Plugins
+ */
+static struct Plugin **attest_plugins;
+
+
+/**
+ * Number of plugins
+ */
+static unsigned int num_plugins;
+
+
+/**
+ * Init canary
+ */
+static int initialized;
+
+
+/**
+ * Add a plugin
+ *
+ * @param cls closure
+ * @param library_name name of the API library
+ * @param lib_ret the plugin API pointer
+ */
+static void
+add_plugin (void *cls, const char *library_name, void *lib_ret)
+{
+  struct GNUNET_RECLAIM_AttestationPluginFunctions *api = lib_ret;
+  struct Plugin *plugin;
+
+  GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
+              "Loading attestation plugin `%s'\n",
+              library_name);
+  plugin = GNUNET_new (struct Plugin);
+  plugin->api = api;
+  plugin->library_name = GNUNET_strdup (library_name);
+  GNUNET_array_append (attest_plugins, num_plugins, plugin);
+}
+
+
+/**
+ * Load plugins
+ */
+static void
+init ()
+{
+  if (GNUNET_YES == initialized)
+    return;
+  initialized = GNUNET_YES;
+  GNUNET_PLUGIN_load_all ("libgnunet_plugin_reclaim_attestation_",
+                          NULL,
+                          &add_plugin,
+                          NULL);
+}
+
+
+/**
+ * Convert an attestation type name to the corresponding number
+ *
+ * @param typename name to convert
+ * @return corresponding number, UINT32_MAX on error
+ */
+uint32_t
+GNUNET_RECLAIM_attestation_typename_to_number (const char *typename)
+{
+  unsigned int i;
+  struct Plugin *plugin;
+  uint32_t ret;
+  init ();
+  for (i = 0; i < num_plugins; i++)
+  {
+    plugin = attest_plugins[i];
+    if (UINT32_MAX !=
+        (ret = plugin->api->typename_to_number (plugin->api->cls,
+                                                typename)))
+      return ret;
+  }
+  return UINT32_MAX;
+}
+
+
+/**
+ * Convert an attestation type number to the corresponding attestation type string
+ *
+ * @param type number of a type
+ * @return corresponding typestring, NULL on error
+ */
+const char *
+GNUNET_RECLAIM_attestation_number_to_typename (uint32_t type)
+{
+  unsigned int i;
+  struct Plugin *plugin;
+  const char *ret;
+
+  init ();
+  for (i = 0; i < num_plugins; i++)
+  {
+    plugin = attest_plugins[i];
+    if (NULL !=
+        (ret = plugin->api->number_to_typename (plugin->api->cls, type)))
+      return ret;
+  }
+  return NULL;
+}
+
+
+/**
+ * Convert human-readable version of a 'claim' of an attestation to the binary
+ * representation
+ *
+ * @param type type of the claim
+ * @param s human-readable string
+ * @param data set to value in binary encoding (will be allocated)
+ * @param data_size set to number of bytes in @a data
+ * @return #GNUNET_OK on success
+ */
+int
+GNUNET_RECLAIM_attestation_string_to_value (uint32_t type,
+                                            const char *s,
+                                            void **data,
+                                            size_t *data_size)
+{
+  unsigned int i;
+  struct Plugin *plugin;
+
+  init ();
+  for (i = 0; i < num_plugins; i++)
+  {
+    plugin = attest_plugins[i];
+    if (GNUNET_OK == plugin->api->string_to_value (plugin->api->cls,
+                                                   type,
+                                                   s,
+                                                   data,
+                                                   data_size))
+      return GNUNET_OK;
+  }
+  return GNUNET_SYSERR;
+}
+
+
+/**
+ * Convert the 'claim' of an attestation to a string
+ *
+ * @param type the type of attestation
+ * @param data claim in binary encoding
+ * @param data_size number of bytes in @a data
+ * @return NULL on error, otherwise human-readable representation of the claim
+ */
+char *
+GNUNET_RECLAIM_attestation_value_to_string (uint32_t type,
+                                            const void *data,
+                                            size_t data_size)
+{
+  unsigned int i;
+  struct Plugin *plugin;
+  char *ret;
+
+  init ();
+  for (i = 0; i < num_plugins; i++)
+  {
+    plugin = attest_plugins[i];
+    if (NULL != (ret = plugin->api->value_to_string (plugin->api->cls,
+                                                     type,
+                                                     data,
+                                                     data_size)))
+      return ret;
+  }
+  return NULL;
+}
+
+
+/**
+   * Create a new attestation.
+   *
+   * @param attr_name the attestation name
+   * @param type the attestation type
+   * @param data the attestation value
+   * @param data_size the attestation value size
+   * @return the new attestation
+   */
+struct GNUNET_RECLAIM_Attestation *
+GNUNET_RECLAIM_attestation_new (const char *attr_name,
+                                uint32_t type,
+                                const void *data,
+                                size_t data_size)
+{
+  struct GNUNET_RECLAIM_Attestation *attr;
+  char *write_ptr;
+  char *attr_name_tmp = GNUNET_strdup (attr_name);
+
+  GNUNET_STRINGS_utf8_tolower (attr_name, attr_name_tmp);
+
+  attr = GNUNET_malloc (sizeof(struct GNUNET_RECLAIM_Attestation)
+                        + strlen (attr_name_tmp) + 1 + data_size);
+  attr->type = type;
+  attr->data_size = data_size;
+  attr->flag = 0;
+  write_ptr = (char *) &attr[1];
+  GNUNET_memcpy (write_ptr, attr_name_tmp, strlen (attr_name_tmp) + 1);
+  attr->name = write_ptr;
+  write_ptr += strlen (attr->name) + 1;
+  GNUNET_memcpy (write_ptr, data, data_size);
+  attr->data = write_ptr;
+  GNUNET_free (attr_name_tmp);
+  return attr;
+}
+
+
+/**
+ * Get required size for serialization buffer
+ *
+ * @param attrs the attribute list to serialize
+ * @return the required buffer size
+ */
+size_t
+GNUNET_RECLAIM_attestation_list_serialize_get_size (
+  const struct GNUNET_RECLAIM_AttestationList *attestations)
+{
+  struct GNUNET_RECLAIM_AttestationListEntry *le;
+  size_t len = 0;
+
+  for (le = attestations->list_head; NULL != le; le = le->next)
+  {
+    GNUNET_assert (NULL != le->attestation);
+    len += GNUNET_RECLAIM_attestation_serialize_get_size (le->attestation);
+    len += sizeof(struct GNUNET_RECLAIM_AttestationListEntry);
+  }
+  return len;
+}
+
+
+/**
+ * Serialize an attribute list
+ *
+ * @param attrs the attribute list to serialize
+ * @param result the serialized attribute
+ * @return length of serialized data
+ */
+size_t
+GNUNET_RECLAIM_attestation_list_serialize (
+  const struct GNUNET_RECLAIM_AttestationList *attestations,
+  char *result)
+{
+  struct GNUNET_RECLAIM_AttestationListEntry *le;
+  size_t len;
+  size_t total_len;
+  char *write_ptr;
+  write_ptr = result;
+  total_len = 0;
+  for (le = attestations->list_head; NULL != le; le = le->next)
+  {
+    GNUNET_assert (NULL != le->attestation);
+    len = GNUNET_RECLAIM_attestation_serialize (le->attestation, write_ptr);
+    total_len += len;
+    write_ptr += len;
+  }
+  return total_len;
+}
+
+
+/**
+ * Deserialize an attestation list
+ *
+ * @param data the serialized attribute list
+ * @param data_size the length of the serialized data
+ * @return a GNUNET_IDENTITY_PROVIDER_AttributeList, must be free'd by caller
+ */
+struct GNUNET_RECLAIM_AttestationList *
+GNUNET_RECLAIM_attestation_list_deserialize (const char *data, size_t data_size)
+{
+  struct GNUNET_RECLAIM_AttestationList *al;
+  struct GNUNET_RECLAIM_AttestationListEntry *ale;
+  size_t att_len;
+  const char *read_ptr;
+
+  al = GNUNET_new (struct GNUNET_RECLAIM_AttestationList);
+
+  if ((data_size < sizeof(struct
+                          Attestation)
+       + sizeof(struct GNUNET_RECLAIM_AttestationListEntry)))
+    return al;
+
+  read_ptr = data;
+  while (((data + data_size) - read_ptr) >= sizeof(struct Attestation))
+  {
+    ale = GNUNET_new (struct GNUNET_RECLAIM_AttestationListEntry);
+    ale->attestation =
+      GNUNET_RECLAIM_attestation_deserialize (read_ptr,
+                                              data_size - (read_ptr - data));
+    GNUNET_CONTAINER_DLL_insert (al->list_head, al->list_tail, ale);
+    att_len = GNUNET_RECLAIM_attestation_serialize_get_size (ale->attestation);
+    read_ptr += att_len;
+  }
+  return al;
+}
+
+
+/**
+ * Make a (deep) copy of the attestation list
+ * @param attrs claim list to copy
+ * @return copied claim list
+ */
+struct GNUNET_RECLAIM_AttestationList *
+GNUNET_RECLAIM_attestation_list_dup (
+  const struct GNUNET_RECLAIM_AttestationList *al)
+{
+  struct GNUNET_RECLAIM_AttestationListEntry *ale;
+  struct GNUNET_RECLAIM_AttestationListEntry *result_ale;
+  struct GNUNET_RECLAIM_AttestationList *result;
+
+  result = GNUNET_new (struct GNUNET_RECLAIM_AttestationList);
+  for (ale = al->list_head; NULL != ale; ale = ale->next)
+  {
+    result_ale = GNUNET_new (struct GNUNET_RECLAIM_AttestationListEntry);
+    GNUNET_assert (NULL != ale->attestation);
+    result_ale->attestation =
+      GNUNET_RECLAIM_attestation_new (ale->attestation->name,
+                                      ale->attestation->type,
+                                      ale->attestation->data,
+                                      ale->attestation->data_size);
+    result_ale->attestation->id = ale->attestation->id;
+    GNUNET_CONTAINER_DLL_insert (result->list_head,
+                                 result->list_tail,
+                                 result_ale);
+  }
+  return result;
+}
+
+
+/**
+ * Destroy attestation list
+ *
+ * @param attrs list to destroy
+ */
+void
+GNUNET_RECLAIM_attestation_list_destroy (
+  struct GNUNET_RECLAIM_AttestationList *al)
+{
+  struct GNUNET_RECLAIM_AttestationListEntry *ale;
+  struct GNUNET_RECLAIM_AttestationListEntry *tmp_ale;
+
+  for (ale = al->list_head; NULL != ale;)
+  {
+    if (NULL != ale->attestation)
+      GNUNET_free (ale->attestation);
+    tmp_ale = ale;
+    ale = ale->next;
+    GNUNET_free (tmp_ale);
+  }
+  GNUNET_free (al);
+}
+
+
+/**
+ * Get required size for serialization buffer
+ *
+ * @param attr the attestation to serialize
+ * @return the required buffer size
+ */
+size_t
+GNUNET_RECLAIM_attestation_serialize_get_size (
+  const struct GNUNET_RECLAIM_Attestation *attestation)
+{
+  return sizeof(struct Attestation) + strlen (attestation->name)
+         + attestation->data_size;
+}
+
+
+/**
+ * Serialize an attestation
+ *
+ * @param attr the attestation to serialize
+ * @param result the serialized attestation
+ * @return length of serialized data
+ */
+size_t
+GNUNET_RECLAIM_attestation_serialize (
+  const struct GNUNET_RECLAIM_Attestation *attestation,
+  char *result)
+{
+  size_t data_len_ser;
+  size_t name_len;
+  struct Attestation *atts;
+  char *write_ptr;
+
+  atts = (struct Attestation *) result;
+  atts->attestation_type = htons (attestation->type);
+  atts->attestation_flag = htonl (attestation->flag);
+  atts->attestation_id = attestation->id;
+  name_len = strlen (attestation->name);
+  atts->name_len = htons (name_len);
+  write_ptr = (char *) &atts[1];
+  GNUNET_memcpy (write_ptr, attestation->name, name_len);
+  write_ptr += name_len;
+  // TODO plugin-ize
+  // data_len_ser = plugin->serialize_attribute_value (attr,
+  //                                                  &attr_ser[1]);
+  data_len_ser = attestation->data_size;
+  GNUNET_memcpy (write_ptr, attestation->data, attestation->data_size);
+  atts->data_size = htons (data_len_ser);
+
+  return sizeof(struct Attestation) + strlen (attestation->name)
+         + attestation->data_size;
+}
+
+
+/**
+ * Deserialize an attestation
+ *
+ * @param data the serialized attestation
+ * @param data_size the length of the serialized data
+ *
+ * @return a GNUNET_IDENTITY_PROVIDER_Attribute, must be free'd by caller
+ */
+struct GNUNET_RECLAIM_Attestation *
+GNUNET_RECLAIM_attestation_deserialize (const char *data, size_t data_size)
+{
+  struct GNUNET_RECLAIM_Attestation *attestation;
+  struct Attestation *atts;
+  size_t data_len;
+  size_t name_len;
+  char *write_ptr;
+
+  if (data_size < sizeof(struct Attestation))
+    return NULL;
+
+  atts = (struct Attestation *) data;
+  data_len = ntohs (atts->data_size);
+  name_len = ntohs (atts->name_len);
+  if (data_size < sizeof(struct Attestation) + data_len + name_len)
+  {
+    GNUNET_log (GNUNET_ERROR_TYPE_ERROR,
+                "Buffer too small to deserialize\n");
+    return NULL;
+  }
+  attestation = GNUNET_malloc (sizeof(struct GNUNET_RECLAIM_Attestation)
+                               + data_len + name_len + 1);
+  attestation->type = ntohs (atts->attestation_type);
+  attestation->flag = ntohl (atts->attestation_flag);
+  attestation->id = atts->attestation_id;
+  attestation->data_size = data_len;
+
+  write_ptr = (char *) &attestation[1];
+  GNUNET_memcpy (write_ptr, &atts[1], name_len);
+  write_ptr[name_len] = '\0';
+  attestation->name = write_ptr;
+
+  write_ptr += name_len + 1;
+  GNUNET_memcpy (write_ptr, (char *) &atts[1] + name_len,
+                 attestation->data_size);
+  attestation->data = write_ptr;
+  return attestation;
+}
+
+struct GNUNET_RECLAIM_AttributeList*
+GNUNET_RECLAIM_attestation_get_attributes (const struct GNUNET_RECLAIM_Attestation *attest)
+{
+  unsigned int i;
+  struct Plugin *plugin;
+  struct GNUNET_RECLAIM_AttributeList *ret;
+  init ();
+  for (i = 0; i < num_plugins; i++)
+  {
+    plugin = attest_plugins[i];
+    if (NULL !=
+       (ret = plugin->api->get_attributes (plugin->api->cls,
+                                              attest)))
+      return ret;
+  }
+  return NULL;
+}
diff --git a/src/reclaim/reclaim_attestation.h b/src/reclaim/reclaim_attestation.h
new file mode 100644 (file)
index 0000000..5747d88
--- /dev/null
@@ -0,0 +1,64 @@
+/*
+   This file is part of GNUnet.
+   Copyright (C) 2012-2015 GNUnet e.V.
+
+   GNUnet is free software: you can redistribute it and/or modify it
+   under the terms of the GNU Affero General Public License as published
+   by the Free Software Foundation, either version 3 of the License,
+   or (at your option) any later version.
+
+   GNUnet is distributed in the hope that it will be useful, but
+   WITHOUT ANY WARRANTY; without even the implied warranty of
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+   Affero General Public License for more details.
+
+   You should have received a copy of the GNU Affero General Public License
+   along with this program.  If not, see <http://www.gnu.org/licenses/>.
+
+   SPDX-License-Identifier: AGPL3.0-or-later
+ */
+/**
+ * @author Martin Schanzenbach
+ * @file reclaim-attribute/reclaim_attestation.h
+ * @brief GNUnet reclaim identity attribute attestations
+ *
+ */
+#ifndef RECLAIM_ATTESTATION_H
+#define RECLAIM_ATTESTATION_H
+
+#include "gnunet_reclaim_service.h"
+
+/**
+ * Serialized attestation claim
+ */
+struct Attestation
+{
+  /**
+   * Attestation type
+   */
+  uint32_t attestation_type;
+
+  /**
+   * Attestation flag
+   */
+  uint32_t attestation_flag;
+
+  /**
+   * Attestation ID
+   */
+  struct GNUNET_RECLAIM_Identifier attestation_id;
+
+  /**
+   * Name length
+   */
+  uint32_t name_len;
+
+  /**
+   * Data size
+   */
+  uint32_t data_size;
+
+  // followed by data_size Attestation value data
+};
+
+#endif
diff --git a/src/reclaim/reclaim_attribute.c b/src/reclaim/reclaim_attribute.c
new file mode 100644 (file)
index 0000000..12f124c
--- /dev/null
@@ -0,0 +1,539 @@
+/*
+   This file is part of GNUnet
+   Copyright (C) 2010-2015 GNUnet e.V.
+
+   GNUnet is free software: you can redistribute it and/or modify it
+   under the terms of the GNU Affero General Public License as published
+   by the Free Software Foundation, either version 3 of the License,
+   or (at your option) any later version.
+
+   GNUnet is distributed in the hope that it will be useful, but
+   WITHOUT ANY WARRANTY; without even the implied warranty of
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+   Affero General Public License for more details.
+
+   You should have received a copy of the GNU Affero General Public License
+   along with this program.  If not, see <http://www.gnu.org/licenses/>.
+
+   SPDX-License-Identifier: AGPL3.0-or-later
+ */
+
+/**
+ * @file reclaim-attribute/reclaim_attribute.c
+ * @brief helper library to manage identity attributes
+ * @author Martin Schanzenbach
+ */
+#include "platform.h"
+#include "gnunet_util_lib.h"
+#include "gnunet_reclaim_plugin.h"
+#include "reclaim_attribute.h"
+
+
+/**
+ * Handle for a plugin
+ */
+struct Plugin
+{
+  /**
+   * Name of the plugin
+   */
+  char *library_name;
+
+  /**
+   * Plugin API
+   */
+  struct GNUNET_RECLAIM_AttributePluginFunctions *api;
+};
+
+
+/**
+ * Plugins
+ */
+static struct Plugin **attr_plugins;
+
+
+/**
+ * Number of plugins
+ */
+static unsigned int num_plugins;
+
+
+/**
+ * Init canary
+ */
+static int initialized;
+
+
+/**
+ * Add a plugin
+ *
+ * @param cls closure
+ * @param library_name name of the API library
+ * @param lib_ret the plugin API pointer
+ */
+static void
+add_plugin (void *cls, const char *library_name, void *lib_ret)
+{
+  struct GNUNET_RECLAIM_AttributePluginFunctions *api = lib_ret;
+  struct Plugin *plugin;
+
+  GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
+              "Loading attribute plugin `%s'\n",
+              library_name);
+  plugin = GNUNET_new (struct Plugin);
+  plugin->api = api;
+  plugin->library_name = GNUNET_strdup (library_name);
+  GNUNET_array_append (attr_plugins, num_plugins, plugin);
+}
+
+
+/**
+ * Load plugins
+ */
+static void
+init ()
+{
+  if (GNUNET_YES == initialized)
+    return;
+  initialized = GNUNET_YES;
+  GNUNET_PLUGIN_load_all ("libgnunet_plugin_reclaim_attribute_",
+                          NULL,
+                          &add_plugin,
+                          NULL);
+}
+
+
+/**
+ * Convert a type name to the corresponding number
+ *
+ * @param typename name to convert
+ * @return corresponding number, UINT32_MAX on error
+ */
+uint32_t
+GNUNET_RECLAIM_attribute_typename_to_number (const char *typename)
+{
+  unsigned int i;
+  struct Plugin *plugin;
+  uint32_t ret;
+
+  init ();
+  for (i = 0; i < num_plugins; i++)
+  {
+    plugin = attr_plugins[i];
+    if (UINT32_MAX !=
+        (ret = plugin->api->typename_to_number (plugin->api->cls, typename)))
+      return ret;
+  }
+  return UINT32_MAX;
+}
+
+
+/**
+ * Convert a type number to the corresponding type string
+ *
+ * @param type number of a type
+ * @return corresponding typestring, NULL on error
+ */
+const char *
+GNUNET_RECLAIM_attribute_number_to_typename (uint32_t type)
+{
+  unsigned int i;
+  struct Plugin *plugin;
+  const char *ret;
+
+  init ();
+  for (i = 0; i < num_plugins; i++)
+  {
+    plugin = attr_plugins[i];
+    if (NULL !=
+        (ret = plugin->api->number_to_typename (plugin->api->cls, type)))
+      return ret;
+  }
+  return NULL;
+}
+
+
+/**
+ * Convert human-readable version of a 'claim' of an attribute to the binary
+ * representation
+ *
+ * @param type type of the claim
+ * @param s human-readable string
+ * @param data set to value in binary encoding (will be allocated)
+ * @param data_size set to number of bytes in @a data
+ * @return #GNUNET_OK on success
+ */
+int
+GNUNET_RECLAIM_attribute_string_to_value (uint32_t type,
+                                          const char *s,
+                                          void **data,
+                                          size_t *data_size)
+{
+  unsigned int i;
+  struct Plugin *plugin;
+
+  init ();
+  for (i = 0; i < num_plugins; i++)
+  {
+    plugin = attr_plugins[i];
+    if (GNUNET_OK == plugin->api->string_to_value (plugin->api->cls,
+                                                   type,
+                                                   s,
+                                                   data,
+                                                   data_size))
+      return GNUNET_OK;
+  }
+  return GNUNET_SYSERR;
+}
+
+
+/**
+ * Convert the 'claim' of an attribute to a string
+ *
+ * @param type the type of attribute
+ * @param data claim in binary encoding
+ * @param data_size number of bytes in @a data
+ * @return NULL on error, otherwise human-readable representation of the claim
+ */
+char *
+GNUNET_RECLAIM_attribute_value_to_string (uint32_t type,
+                                          const void *data,
+                                          size_t data_size)
+{
+  unsigned int i;
+  struct Plugin *plugin;
+  char *ret;
+
+  init ();
+  for (i = 0; i < num_plugins; i++)
+  {
+    plugin = attr_plugins[i];
+    if (NULL != (ret = plugin->api->value_to_string (plugin->api->cls,
+                                                     type,
+                                                     data,
+                                                     data_size)))
+      return ret;
+  }
+  return NULL;
+}
+
+
+/**
+ * Create a new attribute.
+ *
+ * @param attr_name the attribute name
+ * @param attestation attestation ID of the attribute (maybe NULL)
+ * @param type the attribute type
+ * @param data the attribute value
+ * @param data_size the attribute value size
+ * @return the new attribute
+ */
+struct GNUNET_RECLAIM_Attribute *
+GNUNET_RECLAIM_attribute_new (const char *attr_name,
+                              const struct GNUNET_RECLAIM_Identifier *attestation,
+                              uint32_t type,
+                              const void *data,
+                              size_t data_size)
+{
+  struct GNUNET_RECLAIM_Attribute *attr;
+  char *write_ptr;
+  char *attr_name_tmp = GNUNET_strdup (attr_name);
+
+  GNUNET_STRINGS_utf8_tolower (attr_name, attr_name_tmp);
+
+  attr = GNUNET_malloc (sizeof(struct GNUNET_RECLAIM_Attribute)
+                        + strlen (attr_name_tmp) + 1 + data_size);
+  if (NULL != attestation)
+    attr->attestation = *attestation;
+  attr->type = type;
+  attr->data_size = data_size;
+  attr->flag = 0;
+  write_ptr = (char *) &attr[1];
+  GNUNET_memcpy (write_ptr, attr_name_tmp, strlen (attr_name_tmp) + 1);
+  attr->name = write_ptr;
+  write_ptr += strlen (attr->name) + 1;
+  GNUNET_memcpy (write_ptr, data, data_size);
+  attr->data = write_ptr;
+  GNUNET_free (attr_name_tmp);
+  return attr;
+}
+
+
+/**
+ * Add a new attribute to a claim list
+ *
+ * @param attr_name the name of the new attribute claim
+ * @param type the type of the claim
+ * @param data claim payload
+ * @param data_size claim payload size
+ */
+void
+GNUNET_RECLAIM_attribute_list_add (
+  struct GNUNET_RECLAIM_AttributeList *al,
+  const char *attr_name,
+  const struct GNUNET_RECLAIM_Identifier *attestation,
+  uint32_t type,
+  const void *data,
+  size_t data_size)
+{
+  struct GNUNET_RECLAIM_AttributeListEntry *ale;
+
+  ale = GNUNET_new (struct GNUNET_RECLAIM_AttributeListEntry);
+  ale->attribute =
+    GNUNET_RECLAIM_attribute_new (attr_name, attestation,
+                                  type, data, data_size);
+  GNUNET_CONTAINER_DLL_insert (al->list_head,
+                               al->list_tail,
+                               ale);
+}
+
+
+/**
+ * Get required size for serialization buffer
+ *
+ * @param attrs the attribute list to serialize
+ * @return the required buffer size
+ */
+size_t
+GNUNET_RECLAIM_attribute_list_serialize_get_size (
+  const struct GNUNET_RECLAIM_AttributeList *al)
+{
+  struct GNUNET_RECLAIM_AttributeListEntry *ale;
+  size_t len = 0;
+
+  for (ale = al->list_head; NULL != ale; ale = ale->next)
+  {
+    GNUNET_assert (NULL != ale->attribute);
+    len += GNUNET_RECLAIM_attribute_serialize_get_size (ale->attribute);
+    len += sizeof(struct GNUNET_RECLAIM_AttributeListEntry);
+  }
+  return len;
+}
+
+
+/**
+ * Serialize an attribute list
+ *
+ * @param attrs the attribute list to serialize
+ * @param result the serialized attribute
+ * @return length of serialized data
+ */
+size_t
+GNUNET_RECLAIM_attribute_list_serialize (
+  const struct GNUNET_RECLAIM_AttributeList *al,
+  char *result)
+{
+  struct GNUNET_RECLAIM_AttributeListEntry *ale;
+  size_t len;
+  size_t total_len;
+  char *write_ptr;
+  write_ptr = result;
+  total_len = 0;
+  for (ale = al->list_head; NULL != ale; ale = ale->next)
+  {
+    GNUNET_assert (NULL != ale->attribute);
+    len = GNUNET_RECLAIM_attribute_serialize (ale->attribute, write_ptr);
+    total_len += len;
+    write_ptr += len;
+  }
+  return total_len;
+}
+
+
+/**
+ * Deserialize an attribute list
+ *
+ * @param data the serialized attribute list
+ * @param data_size the length of the serialized data
+ * @return a GNUNET_IDENTITY_PROVIDER_AttributeList, must be free'd by caller
+ */
+struct GNUNET_RECLAIM_AttributeList *
+GNUNET_RECLAIM_attribute_list_deserialize (const char *data, size_t data_size)
+{
+  struct GNUNET_RECLAIM_AttributeList *al;
+  struct GNUNET_RECLAIM_AttributeListEntry *ale;
+  size_t attr_len;
+  const char *read_ptr;
+
+  al = GNUNET_new (struct GNUNET_RECLAIM_AttributeList);
+  if (data_size < sizeof(struct Attribute) + sizeof(struct
+                                                    GNUNET_RECLAIM_AttributeListEntry))
+    return al;
+  read_ptr = data;
+  while (((data + data_size) - read_ptr) >= sizeof(struct Attribute))
+  {
+    ale = GNUNET_new (struct GNUNET_RECLAIM_AttributeListEntry);
+    ale->attribute =
+      GNUNET_RECLAIM_attribute_deserialize (read_ptr,
+                                            data_size - (read_ptr - data));
+    GNUNET_CONTAINER_DLL_insert (al->list_head, al->list_tail, ale);
+    attr_len = GNUNET_RECLAIM_attribute_serialize_get_size (ale->attribute);
+    read_ptr += attr_len;
+  }
+  return al;
+}
+
+
+/**
+ * Make a (deep) copy of a claim list
+ * @param attrs claim list to copy
+ * @return copied claim list
+ */
+struct GNUNET_RECLAIM_AttributeList *
+GNUNET_RECLAIM_attribute_list_dup (
+  const struct GNUNET_RECLAIM_AttributeList *al)
+{
+  struct GNUNET_RECLAIM_AttributeListEntry *ale;
+  struct GNUNET_RECLAIM_AttributeListEntry *result_ale;
+  struct GNUNET_RECLAIM_AttributeList *result;
+
+  result = GNUNET_new (struct GNUNET_RECLAIM_AttributeList);
+  for (ale = al->list_head; NULL != ale; ale = ale->next)
+  {
+    result_ale = GNUNET_new (struct GNUNET_RECLAIM_AttributeListEntry);
+    GNUNET_assert (NULL != ale->attribute);
+    {
+      result_ale->attribute =
+        GNUNET_RECLAIM_attribute_new (ale->attribute->name,
+                                      &ale->attribute->attestation,
+                                      ale->attribute->type,
+                                      ale->attribute->data,
+                                      ale->attribute->data_size);
+
+      result_ale->attribute->id = ale->attribute->id;
+      result_ale->attribute->flag = ale->attribute->flag;
+    }
+    GNUNET_CONTAINER_DLL_insert (result->list_head,
+                                 result->list_tail,
+                                 result_ale);
+  }
+  return result;
+}
+
+
+/**
+ * Destroy claim list
+ *
+ * @param attrs list to destroy
+ */
+void
+GNUNET_RECLAIM_attribute_list_destroy (
+  struct GNUNET_RECLAIM_AttributeList *al)
+{
+  struct GNUNET_RECLAIM_AttributeListEntry *ale;
+  struct GNUNET_RECLAIM_AttributeListEntry *tmp_ale;
+
+  for (ale = al->list_head; NULL != ale;)
+  {
+    if (NULL != ale->attribute)
+      GNUNET_free (ale->attribute);
+    tmp_ale = ale;
+    ale = ale->next;
+    GNUNET_free (tmp_ale);
+  }
+  GNUNET_free (al);
+}
+
+
+/**
+ * Get required size for serialization buffer
+ *
+ * @param attr the attribute to serialize
+ * @return the required buffer size
+ */
+size_t
+GNUNET_RECLAIM_attribute_serialize_get_size (
+  const struct GNUNET_RECLAIM_Attribute *attr)
+{
+  return sizeof(struct Attribute) + strlen (attr->name) + attr->data_size;
+}
+
+
+/**
+ * Serialize an attribute
+ *
+ * @param attr the attribute to serialize
+ * @param result the serialized attribute
+ * @return length of serialized data
+ */
+size_t
+GNUNET_RECLAIM_attribute_serialize (
+  const struct GNUNET_RECLAIM_Attribute *attr,
+  char *result)
+{
+  size_t data_len_ser;
+  size_t name_len;
+  struct Attribute *attr_ser;
+  char *write_ptr;
+
+  attr_ser = (struct Attribute *) result;
+  attr_ser->attribute_type = htons (attr->type);
+  attr_ser->attribute_flag = htonl (attr->flag);
+  attr_ser->attribute_id = attr->id;
+  attr_ser->attestation_id = attr->attestation;
+  name_len = strlen (attr->name);
+  attr_ser->name_len = htons (name_len);
+  write_ptr = (char *) &attr_ser[1];
+  GNUNET_memcpy (write_ptr, attr->name, name_len);
+  write_ptr += name_len;
+  // TODO plugin-ize
+  // data_len_ser = plugin->serialize_attribute_value (attr,
+  //                                                  &attr_ser[1]);
+  data_len_ser = attr->data_size;
+  GNUNET_memcpy (write_ptr, attr->data, attr->data_size);
+  attr_ser->data_size = htons (data_len_ser);
+
+  return sizeof(struct Attribute) + strlen (attr->name) + attr->data_size;
+}
+
+
+/**
+ * Deserialize an attribute
+ *
+ * @param data the serialized attribute
+ * @param data_size the length of the serialized data
+ *
+ * @return a GNUNET_IDENTITY_PROVIDER_Attribute, must be free'd by caller
+ */
+struct GNUNET_RECLAIM_Attribute *
+GNUNET_RECLAIM_attribute_deserialize (const char *data, size_t data_size)
+{
+  struct GNUNET_RECLAIM_Attribute *attr;
+  struct Attribute *attr_ser;
+  size_t data_len;
+  size_t name_len;
+  char *write_ptr;
+
+  if (data_size < sizeof(struct Attribute))
+    return NULL;
+
+  attr_ser = (struct Attribute *) data;
+  data_len = ntohs (attr_ser->data_size);
+  name_len = ntohs (attr_ser->name_len);
+  if (data_size < sizeof(struct Attribute) + data_len + name_len)
+  {
+    GNUNET_log (GNUNET_ERROR_TYPE_ERROR,
+                "Buffer too small to deserialize\n");
+    return NULL;
+  }
+  attr = GNUNET_malloc (sizeof(struct GNUNET_RECLAIM_Attribute)
+                        + data_len + name_len + 1);
+  attr->type = ntohs (attr_ser->attribute_type);
+  attr->flag = ntohl (attr_ser->attribute_flag);
+  attr->id = attr_ser->attribute_id;
+  attr->attestation = attr_ser->attestation_id;
+  attr->data_size = data_len;
+
+  write_ptr = (char *) &attr[1];
+  GNUNET_memcpy (write_ptr, &attr_ser[1], name_len);
+  write_ptr[name_len] = '\0';
+  attr->name = write_ptr;
+
+  write_ptr += name_len + 1;
+  GNUNET_memcpy (write_ptr, (char *) &attr_ser[1] + name_len, attr->data_size);
+  attr->data = write_ptr;
+  return attr;
+}
+
+
+/* end of reclaim_attribute.c */
diff --git a/src/reclaim/reclaim_attribute.h b/src/reclaim/reclaim_attribute.h
new file mode 100644 (file)
index 0000000..e54b210
--- /dev/null
@@ -0,0 +1,102 @@
+/*
+   This file is part of GNUnet.
+   Copyright (C) 2012-2015 GNUnet e.V.
+
+   GNUnet is free software: you can redistribute it and/or modify it
+   under the terms of the GNU Affero General Public License as published
+   by the Free Software Foundation, either version 3 of the License,
+   or (at your option) any later version.
+
+   GNUnet is distributed in the hope that it will be useful, but
+   WITHOUT ANY WARRANTY; without even the implied warranty of
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+   Affero General Public License for more details.
+
+   You should have received a copy of the GNU Affero General Public License
+   along with this program.  If not, see <http://www.gnu.org/licenses/>.
+
+   SPDX-License-Identifier: AGPL3.0-or-later
+ */
+/**
+ * @author Martin Schanzenbach
+ * @file reclaim-attribute/reclaim_attribute.h
+ * @brief GNUnet reclaim identity attributes
+ *
+ */
+#ifndef RECLAIM_ATTRIBUTE_H
+#define RECLAIM_ATTRIBUTE_H
+
+#include "gnunet_reclaim_service.h"
+
+/**
+ * Serialized claim
+ */
+struct Attribute
+{
+  /**
+   * Attribute type
+   */
+  uint32_t attribute_type;
+
+  /**
+   * Attribute flag
+   */
+  uint32_t attribute_flag;
+
+  /**
+   * Attribute ID
+   */
+  struct GNUNET_RECLAIM_Identifier attribute_id;
+
+  /**
+   * Attestation ID
+   */
+  struct GNUNET_RECLAIM_Identifier attestation_id;
+
+  /**
+   * Name length
+   */
+  uint32_t name_len;
+
+  /**
+   * Data size
+   */
+  uint32_t data_size;
+
+  // followed by data_size Attribute value data
+};
+
+/**
+ * Serialized attestation claim
+ */
+struct Attestation
+{
+  /**
+   * Attestation type
+   */
+  uint32_t attestation_type;
+
+  /**
+   * Attestation flag
+   */
+  uint32_t attestation_flag;
+
+  /**
+   * Attestation ID
+   */
+  struct GNUNET_RECLAIM_Identifier attestation_id;
+
+  /**
+   * Name length
+   */
+  uint32_t name_len;
+
+  /**
+   * Data size
+   */
+  uint32_t data_size;
+
+  // followed by data_size Attestation value data
+};
+
+#endif