/* 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 . 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 /** * An attribute. */ struct GNUNET_RECLAIM_ATTRIBUTE_Claim { /** * ID */ uint64_t id; /** * 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_Claim { /** * ID */ uint64_t id; /** * Type/Format of Claim */ uint32_t type; /** * Version */ uint32_t version; /** * 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 reference to an Attestatiom. */ struct GNUNET_RECLAIM_ATTESTATION_REFERENCE { /** * ID */ uint64_t id; /** * Referenced ID of Attestation */ uint64_t id_attest; /** * The name of the attribute/attestation reference value. Note "name" must never be individually * free'd */ const char *name; /** * The name of the attribute/attestation reference value. Note "name" must never be individually * free'd */ const char *reference_value; }; /** * A list of GNUNET_RECLAIM_ATTRIBUTE_Claim structures. */ struct GNUNET_RECLAIM_ATTRIBUTE_ClaimList { /** * List head */ struct GNUNET_RECLAIM_ATTRIBUTE_ClaimListEntry *list_head; /** * List tail */ struct GNUNET_RECLAIM_ATTRIBUTE_ClaimListEntry *list_tail; }; struct GNUNET_RECLAIM_ATTRIBUTE_ClaimListEntry { /** * DLL */ struct GNUNET_RECLAIM_ATTRIBUTE_ClaimListEntry *prev; /** * DLL */ struct GNUNET_RECLAIM_ATTRIBUTE_ClaimListEntry *next; /** * The attribute claim */ struct GNUNET_RECLAIM_ATTRIBUTE_Claim *claim; }; /** * Create a new attribute claim. * * @param attr_name the attribute name * @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_Claim * GNUNET_RECLAIM_ATTRIBUTE_claim_new (const char *attr_name, 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_ATTRIBUTE_ClaimList *attrs); /** * Destroy claim list * * @param attrs list to destroy */ void GNUNET_RECLAIM_ATTRIBUTE_list_destroy ( struct GNUNET_RECLAIM_ATTRIBUTE_ClaimList *attrs); /** * 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_ATTRIBUTE_ClaimList *attrs, const char *attr_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_ATTRIBUTE_list_serialize ( const struct GNUNET_RECLAIM_ATTRIBUTE_ClaimList *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_ATTRIBUTE_ClaimList * 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_Claim *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_Claim *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_Claim * 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_ATTRIBUTE_ClaimList * GNUNET_RECLAIM_ATTRIBUTE_list_dup ( const struct GNUNET_RECLAIM_ATTRIBUTE_ClaimList *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 * FIXME: * 1. The naming convention is violated here. * It should GNUNET_RECLAIM_ATTRIBUTE_. * It might make sense to refactor attestations into a separate folder. * 2. The struct should be called GNUNET_RECLAIM_ATTESTATION_Data or * GNUNET_RECLAIM_ATTRIBUTE_Attestation depending on location in source. * * @param attr the attestation to serialize * @return the required buffer size */ size_t GNUNET_RECLAIM_ATTESTATION_serialize_get_size ( const struct GNUNET_RECLAIM_ATTESTATION_Claim *attr); /** * 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_Claim *attr, 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_Claim * GNUNET_RECLAIM_ATTESTATION_deserialize (const char *data, size_t data_size); /** * 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_Claim * GNUNET_RECLAIM_ATTESTATION_claim_new (const char *attr_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); /** * Create a new attestation reference. * * @param attr_name the referenced claim name * @param ref_value the claim name in the attestation * @return the new reference */ struct GNUNET_RECLAIM_ATTESTATION_REFERENCE * GNUNET_RECLAIM_ATTESTATION_reference_new (const char *attr_name, const char *ref_value); /** * Get required size for serialization buffer * * @param attr the reference to serialize * @return the required buffer size */ size_t GNUNET_RECLAIM_ATTESTATION_REF_serialize_get_size ( const struct GNUNET_RECLAIM_ATTESTATION_REFERENCE *attr); /** * Serialize a reference * * @param attr the reference to serialize * @param result the serialized reference * @return length of serialized data */ size_t GNUNET_RECLAIM_ATTESTATION_REF_serialize ( const struct GNUNET_RECLAIM_ATTESTATION_REFERENCE *attr, char *result); /** * Deserialize a reference * * @param data the serialized reference * @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_REFERENCE * GNUNET_RECLAIM_ATTESTATION_REF_deserialize (const char *data, size_t data_size); #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 */