aboutsummaryrefslogtreecommitdiff
path: root/src/reclaim-attribute/reclaim_attribute.c
diff options
context:
space:
mode:
authorSchanzenbach, Martin <mschanzenbach@posteo.de>2020-02-04 18:42:04 +0100
committerSchanzenbach, Martin <mschanzenbach@posteo.de>2020-02-09 20:38:10 +0100
commit55f6d26b7424d660c99bc89f3677b20294e87a27 (patch)
treea8080fdcf0d9688c154417e50c58055e364f8b6b /src/reclaim-attribute/reclaim_attribute.c
parent5b6bb2ce4d60635b2af950d72b45f12686fd5218 (diff)
downloadgnunet-55f6d26b7424d660c99bc89f3677b20294e87a27.tar.gz
gnunet-55f6d26b7424d660c99bc89f3677b20294e87a27.zip
Refactoring reclaim attestations
Diffstat (limited to 'src/reclaim-attribute/reclaim_attribute.c')
-rw-r--r--src/reclaim-attribute/reclaim_attribute.c720
1 files changed, 101 insertions, 619 deletions
diff --git a/src/reclaim-attribute/reclaim_attribute.c b/src/reclaim-attribute/reclaim_attribute.c
index 07d8200c6..936f9cb75 100644
--- a/src/reclaim-attribute/reclaim_attribute.c
+++ b/src/reclaim-attribute/reclaim_attribute.c
@@ -25,7 +25,7 @@
25 */ 25 */
26#include "platform.h" 26#include "platform.h"
27#include "gnunet_util_lib.h" 27#include "gnunet_util_lib.h"
28#include "gnunet_reclaim_attribute_plugin.h" 28#include "gnunet_reclaim_plugin.h"
29#include "reclaim_attribute.h" 29#include "reclaim_attribute.h"
30 30
31 31
@@ -42,7 +42,7 @@ struct Plugin
42 /** 42 /**
43 * Plugin API 43 * Plugin API
44 */ 44 */
45 struct GNUNET_RECLAIM_ATTRIBUTE_PluginFunctions *api; 45 struct GNUNET_RECLAIM_AttributePluginFunctions *api;
46}; 46};
47 47
48 48
@@ -74,7 +74,7 @@ static int initialized;
74static void 74static void
75add_plugin (void *cls, const char *library_name, void *lib_ret) 75add_plugin (void *cls, const char *library_name, void *lib_ret)
76{ 76{
77 struct GNUNET_RECLAIM_ATTRIBUTE_PluginFunctions *api = lib_ret; 77 struct GNUNET_RECLAIM_AttributePluginFunctions *api = lib_ret;
78 struct Plugin *plugin; 78 struct Plugin *plugin;
79 79
80 GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, 80 GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
@@ -110,7 +110,7 @@ init ()
110 * @return corresponding number, UINT32_MAX on error 110 * @return corresponding number, UINT32_MAX on error
111 */ 111 */
112uint32_t 112uint32_t
113GNUNET_RECLAIM_ATTRIBUTE_typename_to_number (const char *typename) 113GNUNET_RECLAIM_attribute_typename_to_number (const char *typename)
114{ 114{
115 unsigned int i; 115 unsigned int i;
116 struct Plugin *plugin; 116 struct Plugin *plugin;
@@ -135,7 +135,7 @@ GNUNET_RECLAIM_ATTRIBUTE_typename_to_number (const char *typename)
135 * @return corresponding typestring, NULL on error 135 * @return corresponding typestring, NULL on error
136 */ 136 */
137const char * 137const char *
138GNUNET_RECLAIM_ATTRIBUTE_number_to_typename (uint32_t type) 138GNUNET_RECLAIM_attribute_number_to_typename (uint32_t type)
139{ 139{
140 unsigned int i; 140 unsigned int i;
141 struct Plugin *plugin; 141 struct Plugin *plugin;
@@ -164,7 +164,7 @@ GNUNET_RECLAIM_ATTRIBUTE_number_to_typename (uint32_t type)
164 * @return #GNUNET_OK on success 164 * @return #GNUNET_OK on success
165 */ 165 */
166int 166int
167GNUNET_RECLAIM_ATTRIBUTE_string_to_value (uint32_t type, 167GNUNET_RECLAIM_attribute_string_to_value (uint32_t type,
168 const char *s, 168 const char *s,
169 void **data, 169 void **data,
170 size_t *data_size) 170 size_t *data_size)
@@ -196,7 +196,7 @@ GNUNET_RECLAIM_ATTRIBUTE_string_to_value (uint32_t type,
196 * @return NULL on error, otherwise human-readable representation of the claim 196 * @return NULL on error, otherwise human-readable representation of the claim
197 */ 197 */
198char * 198char *
199GNUNET_RECLAIM_ATTRIBUTE_value_to_string (uint32_t type, 199GNUNET_RECLAIM_attribute_value_to_string (uint32_t type,
200 const void *data, 200 const void *data,
201 size_t data_size) 201 size_t data_size)
202{ 202{
@@ -217,140 +217,34 @@ GNUNET_RECLAIM_ATTRIBUTE_value_to_string (uint32_t type,
217 return NULL; 217 return NULL;
218} 218}
219 219
220/**
221 * Convert an attestation type name to the corresponding number
222 *
223 * @param typename name to convert
224 * @return corresponding number, UINT32_MAX on error
225 */
226uint32_t
227GNUNET_RECLAIM_ATTESTATION_typename_to_number (const char *typename)
228{
229 unsigned int i;
230 struct Plugin *plugin;
231 uint32_t ret;
232 init ();
233 for (i = 0; i < num_plugins; i++)
234 {
235 plugin = attr_plugins[i];
236 if (UINT32_MAX !=
237 (ret = plugin->api->typename_to_number_attest (plugin->api->cls,
238 typename)))
239 return ret;
240 }
241 return UINT32_MAX;
242}
243
244/**
245 * Convert an attestation type number to the corresponding attestation type string
246 *
247 * @param type number of a type
248 * @return corresponding typestring, NULL on error
249 */
250const char *
251GNUNET_RECLAIM_ATTESTATION_number_to_typename (uint32_t type)
252{
253 unsigned int i;
254 struct Plugin *plugin;
255 const char *ret;
256
257 init ();
258 for (i = 0; i < num_plugins; i++)
259 {
260 plugin = attr_plugins[i];
261 if (NULL !=
262 (ret = plugin->api->number_to_typename_attest (plugin->api->cls, type)))
263 return ret;
264 }
265 return NULL;
266}
267/**
268 * Convert human-readable version of a 'claim' of an attestation to the binary
269 * representation
270 *
271 * @param type type of the claim
272 * @param s human-readable string
273 * @param data set to value in binary encoding (will be allocated)
274 * @param data_size set to number of bytes in @a data
275 * @return #GNUNET_OK on success
276 */
277int
278GNUNET_RECLAIM_ATTESTATION_string_to_value (uint32_t type,
279 const char *s,
280 void **data,
281 size_t *data_size)
282{
283 unsigned int i;
284 struct Plugin *plugin;
285
286 init ();
287 for (i = 0; i < num_plugins; i++)
288 {
289 plugin = attr_plugins[i];
290 if (GNUNET_OK == plugin->api->string_to_value_attest (plugin->api->cls,
291 type,
292 s,
293 data,
294 data_size))
295 return GNUNET_OK;
296 }
297 return GNUNET_SYSERR;
298}
299
300
301/**
302 * Convert the 'claim' of an attestation to a string
303 *
304 * @param type the type of attestation
305 * @param data claim in binary encoding
306 * @param data_size number of bytes in @a data
307 * @return NULL on error, otherwise human-readable representation of the claim
308 */
309char *
310GNUNET_RECLAIM_ATTESTATION_value_to_string (uint32_t type,
311 const void *data,
312 size_t data_size)
313{
314 unsigned int i;
315 struct Plugin *plugin;
316 char *ret;
317
318 init ();
319 for (i = 0; i < num_plugins; i++)
320 {
321 plugin = attr_plugins[i];
322 if (NULL != (ret = plugin->api->value_to_string_attest (plugin->api->cls,
323 type,
324 data,
325 data_size)))
326 return ret;
327 }
328 return NULL;
329}
330 220
331/** 221/**
332 * Create a new attribute. 222 * Create a new attribute.
333 * 223 *
334 * @param attr_name the attribute name 224 * @param attr_name the attribute name
225 * @param attestation attestation ID of the attribute (maybe NULL)
335 * @param type the attribute type 226 * @param type the attribute type
336 * @param data the attribute value 227 * @param data the attribute value
337 * @param data_size the attribute value size 228 * @param data_size the attribute value size
338 * @return the new attribute 229 * @return the new attribute
339 */ 230 */
340struct GNUNET_RECLAIM_ATTRIBUTE_Claim * 231struct GNUNET_RECLAIM_Attribute *
341GNUNET_RECLAIM_ATTRIBUTE_claim_new (const char *attr_name, 232GNUNET_RECLAIM_attribute_new (const char *attr_name,
342 uint32_t type, 233 const struct GNUNET_RECLAIM_Identifier *attestation,
343 const void *data, 234 uint32_t type,
344 size_t data_size) 235 const void *data,
236 size_t data_size)
345{ 237{
346 struct GNUNET_RECLAIM_ATTRIBUTE_Claim *attr; 238 struct GNUNET_RECLAIM_Attribute *attr;
347 char *write_ptr; 239 char *write_ptr;
348 char *attr_name_tmp = GNUNET_strdup (attr_name); 240 char *attr_name_tmp = GNUNET_strdup (attr_name);
349 241
350 GNUNET_STRINGS_utf8_tolower (attr_name, attr_name_tmp); 242 GNUNET_STRINGS_utf8_tolower (attr_name, attr_name_tmp);
351 243
352 attr = GNUNET_malloc (sizeof(struct GNUNET_RECLAIM_ATTRIBUTE_Claim) 244 attr = GNUNET_malloc (sizeof(struct GNUNET_RECLAIM_Attribute)
353 + strlen (attr_name_tmp) + 1 + data_size); 245 + strlen (attr_name_tmp) + 1 + data_size);
246 if (NULL != attestation)
247 attr->attestation = *attestation;
354 attr->type = type; 248 attr->type = type;
355 attr->data_size = data_size; 249 attr->data_size = data_size;
356 attr->flag = 0; 250 attr->flag = 0;
@@ -364,76 +258,6 @@ GNUNET_RECLAIM_ATTRIBUTE_claim_new (const char *attr_name,
364 return attr; 258 return attr;
365} 259}
366 260
367/**
368 * Create a new attestation.
369 *
370 * @param attr_name the attestation name
371 * @param type the attestation type
372 * @param data the attestation value
373 * @param data_size the attestation value size
374 * @return the new attestation
375 */
376struct GNUNET_RECLAIM_ATTESTATION_Claim *
377GNUNET_RECLAIM_ATTESTATION_claim_new (const char *attr_name,
378 uint32_t type,
379 const void *data,
380 size_t data_size)
381{
382 struct GNUNET_RECLAIM_ATTESTATION_Claim *attr;
383 char *write_ptr;
384 char *attr_name_tmp = GNUNET_strdup (attr_name);
385
386 GNUNET_STRINGS_utf8_tolower (attr_name, attr_name_tmp);
387
388 attr = GNUNET_malloc (sizeof(struct GNUNET_RECLAIM_ATTESTATION_Claim)
389 + strlen (attr_name_tmp) + 1 + data_size);
390 attr->type = type;
391 attr->data_size = data_size;
392 attr->flag = 0;
393 write_ptr = (char *) &attr[1];
394 GNUNET_memcpy (write_ptr, attr_name_tmp, strlen (attr_name_tmp) + 1);
395 attr->name = write_ptr;
396 write_ptr += strlen (attr->name) + 1;
397 GNUNET_memcpy (write_ptr, data, data_size);
398 attr->data = write_ptr;
399 GNUNET_free (attr_name_tmp);
400 return attr;
401}
402
403/**
404 * Create a new attestation reference.
405 *
406 * @param attr_name the referenced claim name
407 * @param ref_value the claim name in the attestation
408 * @return the new reference
409 */
410struct GNUNET_RECLAIM_ATTESTATION_REFERENCE *
411GNUNET_RECLAIM_ATTESTATION_reference_new (const char *attr_name,
412 const char *ref_value)
413{
414 struct GNUNET_RECLAIM_ATTESTATION_REFERENCE *attr;
415 char *write_ptr;
416 char *attr_name_tmp = GNUNET_strdup (attr_name);
417 char *ref_value_tmp = GNUNET_strdup (ref_value);
418
419 GNUNET_STRINGS_utf8_tolower (attr_name, attr_name_tmp);
420 GNUNET_STRINGS_utf8_tolower (ref_value, ref_value_tmp);
421
422 attr = GNUNET_malloc (sizeof(struct GNUNET_RECLAIM_ATTESTATION_REFERENCE)
423 + strlen (attr_name_tmp) + strlen (ref_value_tmp) + 2);
424
425 write_ptr = (char *) &attr[1];
426 GNUNET_memcpy (write_ptr, attr_name_tmp, strlen (attr_name_tmp) + 1);
427 attr->name = write_ptr;
428
429 write_ptr += strlen (attr_name) + 1;
430 GNUNET_memcpy (write_ptr, ref_value_tmp, strlen (ref_value_tmp) + 1);
431 attr->reference_value = write_ptr;
432
433 GNUNET_free (attr_name_tmp);
434 GNUNET_free (ref_value_tmp);
435 return attr;
436}
437 261
438/** 262/**
439 * Add a new attribute to a claim list 263 * Add a new attribute to a claim list
@@ -444,21 +268,23 @@ GNUNET_RECLAIM_ATTESTATION_reference_new (const char *attr_name,
444 * @param data_size claim payload size 268 * @param data_size claim payload size
445 */ 269 */
446void 270void
447GNUNET_RECLAIM_ATTRIBUTE_list_add ( 271GNUNET_RECLAIM_attribute_list_add (
448 struct GNUNET_RECLAIM_ATTRIBUTE_ClaimList *claim_list, 272 struct GNUNET_RECLAIM_AttributeList *al,
449 const char *attr_name, 273 const char *attr_name,
274 const struct GNUNET_RECLAIM_Identifier *attestation,
450 uint32_t type, 275 uint32_t type,
451 const void *data, 276 const void *data,
452 size_t data_size) 277 size_t data_size)
453{ 278{
454 struct GNUNET_RECLAIM_ATTRIBUTE_ClaimListEntry *le; 279 struct GNUNET_RECLAIM_AttributeListEntry *ale;
455 280
456 le = GNUNET_new (struct GNUNET_RECLAIM_ATTRIBUTE_ClaimListEntry); 281 ale = GNUNET_new (struct GNUNET_RECLAIM_AttributeListEntry);
457 le->claim = 282 ale->attribute =
458 GNUNET_RECLAIM_ATTRIBUTE_claim_new (attr_name, type, data, data_size); 283 GNUNET_RECLAIM_attribute_new (attr_name, attestation,
459 GNUNET_CONTAINER_DLL_insert (claim_list->list_head, 284 type, data, data_size);
460 claim_list->list_tail, 285 GNUNET_CONTAINER_DLL_insert (al->list_head,
461 le); 286 al->list_tail,
287 ale);
462} 288}
463 289
464 290
@@ -469,36 +295,17 @@ GNUNET_RECLAIM_ATTRIBUTE_list_add (
469 * @return the required buffer size 295 * @return the required buffer size
470 */ 296 */
471size_t 297size_t
472GNUNET_RECLAIM_ATTRIBUTE_list_serialize_get_size ( 298GNUNET_RECLAIM_attribute_list_serialize_get_size (
473 const struct GNUNET_RECLAIM_ATTRIBUTE_ClaimList *attrs) 299 const struct GNUNET_RECLAIM_AttributeList *al)
474{ 300{
475 struct GNUNET_RECLAIM_ATTRIBUTE_ClaimListEntry *le; 301 struct GNUNET_RECLAIM_AttributeListEntry *ale;
476 size_t len = 0; 302 size_t len = 0;
477 303
478 for (le = attrs->list_head; NULL != le; le = le->next) 304 for (ale = al->list_head; NULL != ale; ale = ale->next)
479 { 305 {
480 if (NULL != le->claim) 306 GNUNET_assert (NULL != ale->attribute);
481 { 307 len += GNUNET_RECLAIM_attribute_serialize_get_size (ale->attribute);
482 len += sizeof(struct GNUNET_RECLAIM_ATTRIBUTE_ClaimListEntryType); 308 len += sizeof(struct GNUNET_RECLAIM_AttributeListEntry);
483 len += GNUNET_RECLAIM_ATTRIBUTE_serialize_get_size (le->claim);
484 }
485 else if (NULL != le->attest )
486 {
487 len += sizeof(struct GNUNET_RECLAIM_ATTRIBUTE_ClaimListEntryType);
488 len += GNUNET_RECLAIM_ATTESTATION_serialize_get_size (le->attest);
489 }
490 else if (NULL != le->reference)
491 {
492 len += sizeof(struct GNUNET_RECLAIM_ATTRIBUTE_ClaimListEntryType);
493 len += GNUNET_RECLAIM_ATTESTATION_REF_serialize_get_size (le->reference);
494 }
495 else
496 {
497 GNUNET_log (GNUNET_ERROR_TYPE_ERROR,
498 "Unserialized Claim List Entry Type for size not known.\n");
499 break;
500 }
501 len += sizeof(struct GNUNET_RECLAIM_ATTRIBUTE_ClaimListEntry);
502 } 309 }
503 return len; 310 return len;
504} 311}
@@ -512,58 +319,22 @@ GNUNET_RECLAIM_ATTRIBUTE_list_serialize_get_size (
512 * @return length of serialized data 319 * @return length of serialized data
513 */ 320 */
514size_t 321size_t
515GNUNET_RECLAIM_ATTRIBUTE_list_serialize ( 322GNUNET_RECLAIM_attribute_list_serialize (
516 const struct GNUNET_RECLAIM_ATTRIBUTE_ClaimList *attrs, 323 const struct GNUNET_RECLAIM_AttributeList *al,
517 char *result) 324 char *result)
518{ 325{
519 struct GNUNET_RECLAIM_ATTRIBUTE_ClaimListEntry *le; 326 struct GNUNET_RECLAIM_AttributeListEntry *ale;
520 size_t len; 327 size_t len;
521 size_t total_len; 328 size_t total_len;
522 char *write_ptr; 329 char *write_ptr;
523 write_ptr = result; 330 write_ptr = result;
524 total_len = 0; 331 total_len = 0;
525 for (le = attrs->list_head; NULL != le; le = le->next) 332 for (ale = al->list_head; NULL != ale; ale = ale->next)
526 { 333 {
527 struct GNUNET_RECLAIM_ATTRIBUTE_ClaimListEntryType *list_type; 334 GNUNET_assert (NULL != ale->attribute);
528 if (NULL != le->claim) 335 len = GNUNET_RECLAIM_attribute_serialize (ale->attribute, write_ptr);
529 { 336 total_len += len;
530 list_type = (struct 337 write_ptr += len;
531 GNUNET_RECLAIM_ATTRIBUTE_ClaimListEntryType *) write_ptr;
532 list_type->type = htons (1);
533 total_len += sizeof(struct GNUNET_RECLAIM_ATTRIBUTE_ClaimListEntryType);
534 write_ptr += sizeof(struct GNUNET_RECLAIM_ATTRIBUTE_ClaimListEntryType);
535 len = GNUNET_RECLAIM_ATTRIBUTE_serialize (le->claim, write_ptr);
536 total_len += len;
537 write_ptr += len;
538 }
539 else if (NULL != le->attest )
540 {
541 list_type = (struct
542 GNUNET_RECLAIM_ATTRIBUTE_ClaimListEntryType *) write_ptr;
543 list_type->type = htons (2);
544 total_len += sizeof(struct GNUNET_RECLAIM_ATTRIBUTE_ClaimListEntryType);
545 write_ptr += sizeof(struct GNUNET_RECLAIM_ATTRIBUTE_ClaimListEntryType);
546 len = GNUNET_RECLAIM_ATTESTATION_serialize (le->attest, write_ptr);
547 total_len += len;
548 write_ptr += len;
549 }
550 else if (NULL != le->reference)
551 {
552 list_type = (struct
553 GNUNET_RECLAIM_ATTRIBUTE_ClaimListEntryType *) write_ptr;
554 list_type->type = htons (3);
555 total_len += sizeof(struct GNUNET_RECLAIM_ATTRIBUTE_ClaimListEntryType);
556 write_ptr += sizeof(struct GNUNET_RECLAIM_ATTRIBUTE_ClaimListEntryType);
557 len = GNUNET_RECLAIM_ATTESTATION_REF_serialize (le->reference, write_ptr);
558 total_len += len;
559 write_ptr += len;
560 }
561 else
562 {
563 GNUNET_log (GNUNET_ERROR_TYPE_ERROR,
564 "Unserialized Claim List Entry Type not known.\n");
565 continue;
566 }
567 } 338 }
568 return total_len; 339 return total_len;
569} 340}
@@ -576,85 +347,30 @@ GNUNET_RECLAIM_ATTRIBUTE_list_serialize (
576 * @param data_size the length of the serialized data 347 * @param data_size the length of the serialized data
577 * @return a GNUNET_IDENTITY_PROVIDER_AttributeList, must be free'd by caller 348 * @return a GNUNET_IDENTITY_PROVIDER_AttributeList, must be free'd by caller
578 */ 349 */
579struct GNUNET_RECLAIM_ATTRIBUTE_ClaimList * 350struct GNUNET_RECLAIM_AttributeList *
580GNUNET_RECLAIM_ATTRIBUTE_list_deserialize (const char *data, size_t data_size) 351GNUNET_RECLAIM_attribute_list_deserialize (const char *data, size_t data_size)
581{ 352{
582 struct GNUNET_RECLAIM_ATTRIBUTE_ClaimList *attrs; 353 struct GNUNET_RECLAIM_AttributeList *al;
583 struct GNUNET_RECLAIM_ATTRIBUTE_ClaimListEntry *le; 354 struct GNUNET_RECLAIM_AttributeListEntry *ale;
584 size_t attr_len; 355 size_t attr_len;
585 const char *read_ptr; 356 const char *read_ptr;
586 357
587 if ((data_size < sizeof(struct Attribute) + sizeof(struct 358 al = GNUNET_new (struct GNUNET_RECLAIM_AttributeList);
588 GNUNET_RECLAIM_ATTRIBUTE_ClaimListEntry)) 359 if (data_size < sizeof(struct Attribute) + sizeof(struct
589 && (data_size < sizeof(struct 360 GNUNET_RECLAIM_AttributeListEntry))
590 Attestation) 361 return al;
591 + sizeof(struct GNUNET_RECLAIM_ATTRIBUTE_ClaimListEntry)) &&
592 (data_size < sizeof(struct Attestation_Reference) + sizeof(struct
593 GNUNET_RECLAIM_ATTRIBUTE_ClaimListEntry)) )
594 return NULL;
595
596 attrs = GNUNET_new (struct GNUNET_RECLAIM_ATTRIBUTE_ClaimList);
597 read_ptr = data; 362 read_ptr = data;
598 while (((data + data_size) - read_ptr) >= sizeof(struct Attribute)) 363 while (((data + data_size) - read_ptr) >= sizeof(struct Attribute))
599 { 364 {
600 struct GNUNET_RECLAIM_ATTRIBUTE_ClaimListEntryType *list_type; 365 ale = GNUNET_new (struct GNUNET_RECLAIM_AttributeListEntry);
601 list_type = (struct GNUNET_RECLAIM_ATTRIBUTE_ClaimListEntryType *) read_ptr; 366 ale->attribute =
602 if (1 == ntohs (list_type->type)) 367 GNUNET_RECLAIM_attribute_deserialize (read_ptr,
603 { 368 data_size - (read_ptr - data));
604 le = GNUNET_new (struct GNUNET_RECLAIM_ATTRIBUTE_ClaimListEntry); 369 GNUNET_CONTAINER_DLL_insert (al->list_head, al->list_tail, ale);
605 read_ptr += sizeof(struct GNUNET_RECLAIM_ATTRIBUTE_ClaimListEntryType); 370 attr_len = GNUNET_RECLAIM_attribute_serialize_get_size (ale->attribute);
606 if (((data + data_size) - read_ptr) < sizeof(struct Attribute)) 371 read_ptr += attr_len;
607 break;
608 le->attest = NULL;
609 le->reference = NULL;
610 le->claim =
611 GNUNET_RECLAIM_ATTRIBUTE_deserialize (read_ptr,
612 data_size - (read_ptr - data));
613 GNUNET_CONTAINER_DLL_insert (attrs->list_head, attrs->list_tail, le);
614 attr_len = GNUNET_RECLAIM_ATTRIBUTE_serialize_get_size (le->claim);
615 read_ptr += attr_len;
616 }
617 else if (2 == ntohs (list_type->type))
618 {
619 le = GNUNET_new (struct GNUNET_RECLAIM_ATTRIBUTE_ClaimListEntry);
620 read_ptr += sizeof(struct GNUNET_RECLAIM_ATTRIBUTE_ClaimListEntryType);
621 if (((data + data_size) - read_ptr) < sizeof(struct Attestation))
622 break;
623 le->claim = NULL;
624 le->reference = NULL;
625 le->attest =
626 GNUNET_RECLAIM_ATTESTATION_deserialize (read_ptr,
627 data_size - (read_ptr - data));
628 GNUNET_CONTAINER_DLL_insert (attrs->list_head, attrs->list_tail, le);
629 attr_len = GNUNET_RECLAIM_ATTESTATION_serialize_get_size (le->attest);
630 read_ptr += attr_len;
631 }
632 else if (3 == ntohs (list_type->type))
633 {
634 le = GNUNET_new (struct GNUNET_RECLAIM_ATTRIBUTE_ClaimListEntry);
635 read_ptr += sizeof(struct GNUNET_RECLAIM_ATTRIBUTE_ClaimListEntryType);
636 if (((data + data_size) - read_ptr) < sizeof(struct
637 Attestation_Reference))
638 break;
639 le->claim = NULL;
640 le->attest = NULL;
641 le->reference =
642 GNUNET_RECLAIM_ATTESTATION_REF_deserialize (read_ptr,
643 data_size - (read_ptr
644 - data));
645 GNUNET_CONTAINER_DLL_insert (attrs->list_head, attrs->list_tail, le);
646 attr_len = GNUNET_RECLAIM_ATTESTATION_REF_serialize_get_size (
647 le->reference);
648 read_ptr += attr_len;
649 }
650 else
651 {
652 GNUNET_log (GNUNET_ERROR_TYPE_ERROR,
653 "Serialized Claim List Entry Type not known.\n");
654 break;
655 }
656 } 372 }
657 return attrs; 373 return al;
658} 374}
659 375
660 376
@@ -663,57 +379,33 @@ GNUNET_RECLAIM_ATTRIBUTE_list_deserialize (const char *data, size_t data_size)
663 * @param attrs claim list to copy 379 * @param attrs claim list to copy
664 * @return copied claim list 380 * @return copied claim list
665 */ 381 */
666struct GNUNET_RECLAIM_ATTRIBUTE_ClaimList * 382struct GNUNET_RECLAIM_AttributeList *
667GNUNET_RECLAIM_ATTRIBUTE_list_dup ( 383GNUNET_RECLAIM_attribute_list_dup (
668 const struct GNUNET_RECLAIM_ATTRIBUTE_ClaimList *attrs) 384 const struct GNUNET_RECLAIM_AttributeList *al)
669{ 385{
670 struct GNUNET_RECLAIM_ATTRIBUTE_ClaimListEntry *le; 386 struct GNUNET_RECLAIM_AttributeListEntry *ale;
671 struct GNUNET_RECLAIM_ATTRIBUTE_ClaimListEntry *result_le; 387 struct GNUNET_RECLAIM_AttributeListEntry *result_ale;
672 struct GNUNET_RECLAIM_ATTRIBUTE_ClaimList *result; 388 struct GNUNET_RECLAIM_AttributeList *result;
673 389
674 result = GNUNET_new (struct GNUNET_RECLAIM_ATTRIBUTE_ClaimList); 390 result = GNUNET_new (struct GNUNET_RECLAIM_AttributeList);
675 if (NULL == attrs->list_head) 391 for (ale = al->list_head; NULL != ale; ale = ale->next)
676 { 392 {
677 GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,"Duplicating empty List\n"); 393 result_ale = GNUNET_new (struct GNUNET_RECLAIM_AttributeListEntry);
678 } 394 GNUNET_assert (NULL != ale->attribute);
679 for (le = attrs->list_head; NULL != le; le = le->next)
680 {
681 result_le = GNUNET_new (struct GNUNET_RECLAIM_ATTRIBUTE_ClaimListEntry);
682 result_le->claim = NULL;
683 result_le->attest = NULL;
684 result_le->reference = NULL;
685 if (NULL != le->claim)
686 {
687 result_le->claim =
688 GNUNET_RECLAIM_ATTRIBUTE_claim_new (le->claim->name,
689 le->claim->type,
690 le->claim->data,
691 le->claim->data_size);
692
693 result_le->claim->id = le->claim->id;
694 result_le->claim->flag = le->claim->flag;
695 }
696 if ( NULL != le->attest)
697 {
698 result_le->attest = GNUNET_RECLAIM_ATTESTATION_claim_new (
699 le->attest->name,
700 le->attest->type,
701 le->attest->data,
702 le->attest->
703 data_size);
704 result_le->attest->id = le->attest->id;
705 }
706 if (NULL !=le->reference)
707 { 395 {
708 result_le->reference = GNUNET_RECLAIM_ATTESTATION_reference_new ( 396 result_ale->attribute =
709 le->reference->name, 397 GNUNET_RECLAIM_attribute_new (ale->attribute->name,
710 le->reference->reference_value); 398 &ale->attribute->attestation,
711 result_le->reference->id = le->reference->id; 399 ale->attribute->type,
712 result_le->reference->id_attest = le->reference->id_attest; 400 ale->attribute->data,
401 ale->attribute->data_size);
402
403 result_ale->attribute->id = ale->attribute->id;
404 result_ale->attribute->flag = ale->attribute->flag;
713 } 405 }
714 GNUNET_CONTAINER_DLL_insert (result->list_head, 406 GNUNET_CONTAINER_DLL_insert (result->list_head,
715 result->list_tail, 407 result->list_tail,
716 result_le); 408 result_ale);
717 } 409 }
718 return result; 410 return result;
719} 411}
@@ -725,45 +417,24 @@ GNUNET_RECLAIM_ATTRIBUTE_list_dup (
725 * @param attrs list to destroy 417 * @param attrs list to destroy
726 */ 418 */
727void 419void
728GNUNET_RECLAIM_ATTRIBUTE_list_destroy ( 420GNUNET_RECLAIM_attribute_list_destroy (
729 struct GNUNET_RECLAIM_ATTRIBUTE_ClaimList *attrs) 421 struct GNUNET_RECLAIM_AttributeList *al)
730{ 422{
731 struct GNUNET_RECLAIM_ATTRIBUTE_ClaimListEntry *le; 423 struct GNUNET_RECLAIM_AttributeListEntry *ale;
732 struct GNUNET_RECLAIM_ATTRIBUTE_ClaimListEntry *tmp_le; 424 struct GNUNET_RECLAIM_AttributeListEntry *tmp_ale;
733 425
734 for (le = attrs->list_head; NULL != le; le = le->next) 426 for (ale = al->list_head; NULL != ale; ale = ale->next)
735 { 427 {
736 if (NULL != le->claim) 428 if (NULL != ale->attribute)
737 GNUNET_free (le->claim); 429 GNUNET_free (ale->attribute);
738 if (NULL != le->attest) 430 tmp_ale = ale;
739 GNUNET_free (le->attest); 431 ale = ale->next;
740 if (NULL != le->reference) 432 GNUNET_free (tmp_ale);
741 GNUNET_free (le->reference);
742 tmp_le = le;
743 le = le->next;
744 GNUNET_free (tmp_le);
745 } 433 }
746 GNUNET_free (attrs); 434 GNUNET_free (al);
747} 435}
748 436
749/** 437
750 * Count attestations in claim list
751 *
752 * @param attrs list
753 */
754int
755GNUNET_RECLAIM_ATTRIBUTE_list_count_attest (
756 const struct GNUNET_RECLAIM_ATTRIBUTE_ClaimList *attrs)
757{
758 struct GNUNET_RECLAIM_ATTRIBUTE_ClaimListEntry *le;
759 int i = 0;
760 for (le = attrs->list_head; NULL != le; le = le->next)
761 {
762 if (NULL != le->attest)
763 i++;
764 }
765 return i;
766}
767/** 438/**
768 * Get required size for serialization buffer 439 * Get required size for serialization buffer
769 * 440 *
@@ -771,8 +442,8 @@ GNUNET_RECLAIM_ATTRIBUTE_list_count_attest (
771 * @return the required buffer size 442 * @return the required buffer size
772 */ 443 */
773size_t 444size_t
774GNUNET_RECLAIM_ATTRIBUTE_serialize_get_size ( 445GNUNET_RECLAIM_attribute_serialize_get_size (
775 const struct GNUNET_RECLAIM_ATTRIBUTE_Claim *attr) 446 const struct GNUNET_RECLAIM_Attribute *attr)
776{ 447{
777 return sizeof(struct Attribute) + strlen (attr->name) + attr->data_size; 448 return sizeof(struct Attribute) + strlen (attr->name) + attr->data_size;
778} 449}
@@ -786,8 +457,8 @@ GNUNET_RECLAIM_ATTRIBUTE_serialize_get_size (
786 * @return length of serialized data 457 * @return length of serialized data
787 */ 458 */
788size_t 459size_t
789GNUNET_RECLAIM_ATTRIBUTE_serialize ( 460GNUNET_RECLAIM_attribute_serialize (
790 const struct GNUNET_RECLAIM_ATTRIBUTE_Claim *attr, 461 const struct GNUNET_RECLAIM_Attribute *attr,
791 char *result) 462 char *result)
792{ 463{
793 size_t data_len_ser; 464 size_t data_len_ser;
@@ -823,10 +494,10 @@ GNUNET_RECLAIM_ATTRIBUTE_serialize (
823 * 494 *
824 * @return a GNUNET_IDENTITY_PROVIDER_Attribute, must be free'd by caller 495 * @return a GNUNET_IDENTITY_PROVIDER_Attribute, must be free'd by caller
825 */ 496 */
826struct GNUNET_RECLAIM_ATTRIBUTE_Claim * 497struct GNUNET_RECLAIM_Attribute *
827GNUNET_RECLAIM_ATTRIBUTE_deserialize (const char *data, size_t data_size) 498GNUNET_RECLAIM_attribute_deserialize (const char *data, size_t data_size)
828{ 499{
829 struct GNUNET_RECLAIM_ATTRIBUTE_Claim *attr; 500 struct GNUNET_RECLAIM_Attribute *attr;
830 struct Attribute *attr_ser; 501 struct Attribute *attr_ser;
831 size_t data_len; 502 size_t data_len;
832 size_t name_len; 503 size_t name_len;
@@ -844,7 +515,7 @@ GNUNET_RECLAIM_ATTRIBUTE_deserialize (const char *data, size_t data_size)
844 "Buffer too small to deserialize\n"); 515 "Buffer too small to deserialize\n");
845 return NULL; 516 return NULL;
846 } 517 }
847 attr = GNUNET_malloc (sizeof(struct GNUNET_RECLAIM_ATTRIBUTE_Claim) 518 attr = GNUNET_malloc (sizeof(struct GNUNET_RECLAIM_Attribute)
848 + data_len + name_len + 1); 519 + data_len + name_len + 1);
849 attr->type = ntohs (attr_ser->attribute_type); 520 attr->type = ntohs (attr_ser->attribute_type);
850 attr->flag = ntohl (attr_ser->attribute_flag); 521 attr->flag = ntohl (attr_ser->attribute_flag);
@@ -863,193 +534,4 @@ GNUNET_RECLAIM_ATTRIBUTE_deserialize (const char *data, size_t data_size)
863} 534}
864 535
865 536
866/**
867 * Get required size for serialization buffer
868 *
869 * @param attr the attestation to serialize
870 * @return the required buffer size
871 */
872size_t
873GNUNET_RECLAIM_ATTESTATION_serialize_get_size (
874 const struct GNUNET_RECLAIM_ATTESTATION_Claim *attr)
875{
876 return sizeof(struct Attestation) + strlen (attr->name) + attr->data_size;
877}
878
879/**
880 * Serialize an attestation
881 *
882 * @param attr the attestation to serialize
883 * @param result the serialized attestation
884 * @return length of serialized data
885 */
886size_t
887GNUNET_RECLAIM_ATTESTATION_serialize (
888 const struct GNUNET_RECLAIM_ATTESTATION_Claim *attr,
889 char *result)
890{
891 size_t data_len_ser;
892 size_t name_len;
893 struct Attestation *attr_ser;
894 char *write_ptr;
895
896 attr_ser = (struct Attestation *) result;
897 attr_ser->attestation_type = htons (attr->type);
898 attr_ser->attestation_flag = htonl (attr->flag);
899 attr_ser->attestation_id = attr->id;
900 name_len = strlen (attr->name);
901 attr_ser->name_len = htons (name_len);
902 write_ptr = (char *) &attr_ser[1];
903 GNUNET_memcpy (write_ptr, attr->name, name_len);
904 write_ptr += name_len;
905 // TODO plugin-ize
906 // data_len_ser = plugin->serialize_attribute_value (attr,
907 // &attr_ser[1]);
908 data_len_ser = attr->data_size;
909 GNUNET_memcpy (write_ptr, attr->data, attr->data_size);
910 attr_ser->data_size = htons (data_len_ser);
911
912 return sizeof(struct Attestation) + strlen (attr->name) + attr->data_size;
913}
914
915/**
916 * Deserialize an attestation
917 *
918 * @param data the serialized attestation
919 * @param data_size the length of the serialized data
920 *
921 * @return a GNUNET_IDENTITY_PROVIDER_Attribute, must be free'd by caller
922 */
923struct GNUNET_RECLAIM_ATTESTATION_Claim *
924GNUNET_RECLAIM_ATTESTATION_deserialize (const char *data, size_t data_size)
925{
926 struct GNUNET_RECLAIM_ATTESTATION_Claim *attr;
927 struct Attestation *attr_ser;
928 size_t data_len;
929 size_t name_len;
930 char *write_ptr;
931
932 if (data_size < sizeof(struct Attestation))
933 return NULL;
934
935 attr_ser = (struct Attestation *) data;
936 data_len = ntohs (attr_ser->data_size);
937 name_len = ntohs (attr_ser->name_len);
938 if (data_size < sizeof(struct Attestation) + data_len + name_len)
939 {
940 GNUNET_log (GNUNET_ERROR_TYPE_ERROR,
941 "Buffer too small to deserialize\n");
942 return NULL;
943 }
944 attr = GNUNET_malloc (sizeof(struct GNUNET_RECLAIM_ATTESTATION_Claim)
945 + data_len + name_len + 1);
946 attr->type = ntohs (attr_ser->attestation_type);
947 attr->flag = ntohl (attr_ser->attestation_flag);
948 attr->id = attr_ser->attestation_id;
949 attr->data_size = data_len;
950
951 write_ptr = (char *) &attr[1];
952 GNUNET_memcpy (write_ptr, &attr_ser[1], name_len);
953 write_ptr[name_len] = '\0';
954 attr->name = write_ptr;
955
956 write_ptr += name_len + 1;
957 GNUNET_memcpy (write_ptr, (char *) &attr_ser[1] + name_len, attr->data_size);
958 attr->data = write_ptr;
959 return attr;
960}
961
962/**
963 * Get required size for serialization buffer
964 *
965 * @param attr the reference to serialize
966 * @return the required buffer size
967 */
968size_t
969GNUNET_RECLAIM_ATTESTATION_REF_serialize_get_size (
970 const struct GNUNET_RECLAIM_ATTESTATION_REFERENCE *attr)
971{
972 return sizeof(struct Attestation_Reference) + strlen (attr->name) + strlen (
973 attr->reference_value);
974}
975
976
977/**
978 * Serialize a reference
979 *
980 * @param attr the reference to serialize
981 * @param result the serialized reference
982 * @return length of serialized data
983 */
984size_t
985GNUNET_RECLAIM_ATTESTATION_REF_serialize (
986 const struct GNUNET_RECLAIM_ATTESTATION_REFERENCE *attr,
987 char *result)
988{
989 size_t name_len;
990 size_t refval_len;
991 struct Attestation_Reference *attr_ser;
992 char *write_ptr;
993 attr_ser = (struct Attestation_Reference *) result;
994 attr_ser->reference_id = attr->id;
995 attr_ser->attestation_id = attr->id_attest;
996 name_len = strlen (attr->name);
997 refval_len = strlen (attr->reference_value);
998 attr_ser->name_len = htons (name_len);
999 attr_ser->ref_value_len = htons (refval_len);
1000 write_ptr = (char *) &attr_ser[1];
1001 GNUNET_memcpy (write_ptr, attr->name, name_len);
1002 write_ptr += name_len;
1003 GNUNET_memcpy (write_ptr, attr->reference_value, refval_len);
1004
1005 return sizeof(struct Attestation_Reference) + strlen (attr->name) + strlen (
1006 attr->reference_value);
1007}
1008
1009
1010/**
1011 * Deserialize a reference
1012 *
1013 * @param data the serialized reference
1014 * @param data_size the length of the serialized data
1015 *
1016 * @return a GNUNET_IDENTITY_PROVIDER_Attribute, must be free'd by caller
1017 */
1018struct GNUNET_RECLAIM_ATTESTATION_REFERENCE *
1019GNUNET_RECLAIM_ATTESTATION_REF_deserialize (const char *data, size_t data_size)
1020{
1021 struct GNUNET_RECLAIM_ATTESTATION_REFERENCE *attr;
1022 struct Attestation_Reference *attr_ser;
1023 size_t name_len;
1024 size_t refval_len;
1025 char *write_ptr;
1026
1027 if (data_size < sizeof(struct Attestation_Reference))
1028 return NULL;
1029 attr_ser = (struct Attestation_Reference *) data;
1030 name_len = ntohs (attr_ser->name_len);
1031 refval_len = ntohs (attr_ser->ref_value_len);
1032 if (data_size < sizeof(struct Attestation_Reference) + refval_len + name_len)
1033 {
1034 GNUNET_log (GNUNET_ERROR_TYPE_ERROR,
1035 "Buffer too small to deserialize\n");
1036 return NULL;
1037 }
1038 attr = GNUNET_malloc (sizeof(struct GNUNET_RECLAIM_ATTESTATION_REFERENCE)
1039 + refval_len + name_len + 2);
1040
1041 attr->id = attr_ser->reference_id;
1042 attr->id_attest = attr_ser->attestation_id;
1043
1044 write_ptr = (char *) &attr[1];
1045 GNUNET_memcpy (write_ptr, &attr_ser[1], name_len);
1046 write_ptr[name_len] = '\0';
1047 attr->name = write_ptr;
1048
1049 write_ptr += name_len + 1;
1050 GNUNET_memcpy (write_ptr, (char *) &attr_ser[1] + name_len, refval_len);
1051 write_ptr[refval_len] = '\0';
1052 attr->reference_value = write_ptr;
1053 return attr;
1054}
1055/* end of reclaim_attribute.c */ 537/* end of reclaim_attribute.c */