aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorSchanzenbach, Martin <mschanzenbach@posteo.de>2017-10-06 22:31:12 +0200
committerSchanzenbach, Martin <mschanzenbach@posteo.de>2017-10-06 22:31:12 +0200
commit58d4e0f0447ae4efc6b3f4ba8a3d612c22f7cbb4 (patch)
treebf2e393a42ea0d802abf8b4e066133f122a1d320 /src
parent46b73f8d138ade01499165f62edb683c87c777c4 (diff)
downloadgnunet-58d4e0f0447ae4efc6b3f4ba8a3d612c22f7cbb4.tar.gz
gnunet-58d4e0f0447ae4efc6b3f4ba8a3d612c22f7cbb4.zip
-more revocation
Diffstat (limited to 'src')
-rw-r--r--src/identity-provider/gnunet-service-identity-provider.c177
-rw-r--r--src/identity-provider/plugin_identity_provider_sqlite.c41
-rw-r--r--src/include/gnunet_identity_provider_plugin.h6
3 files changed, 195 insertions, 29 deletions
diff --git a/src/identity-provider/gnunet-service-identity-provider.c b/src/identity-provider/gnunet-service-identity-provider.c
index 95d8b93b2..dd78dd9aa 100644
--- a/src/identity-provider/gnunet-service-identity-provider.c
+++ b/src/identity-provider/gnunet-service-identity-provider.c
@@ -482,6 +482,10 @@ struct TicketRevocationHandle
482 */ 482 */
483 struct GNUNET_CRYPTO_AbeMasterKey *abe_key; 483 struct GNUNET_CRYPTO_AbeMasterKey *abe_key;
484 484
485 /**
486 * Offset
487 */
488 uint32_t offset;
485 489
486 /** 490 /**
487 * request id 491 * request id
@@ -770,7 +774,8 @@ cleanup_ticket_issue_handle (struct TicketIssueHandle *handle)
770static void 774static void
771send_ticket_result (struct IdpClient *client, 775send_ticket_result (struct IdpClient *client,
772 uint32_t r_id, 776 uint32_t r_id,
773 const struct GNUNET_IDENTITY_PROVIDER_Ticket *ticket) 777 const struct GNUNET_IDENTITY_PROVIDER_Ticket *ticket,
778 const struct GNUNET_IDENTITY_PROVIDER_AttributeList *attrs)
774{ 779{
775 struct TicketResultMessage *irm; 780 struct TicketResultMessage *irm;
776 struct GNUNET_MQ_Envelope *env; 781 struct GNUNET_MQ_Envelope *env;
@@ -778,7 +783,8 @@ send_ticket_result (struct IdpClient *client,
778 783
779 /* store ticket in DB */ 784 /* store ticket in DB */
780 if (GNUNET_OK != TKT_database->store_ticket (TKT_database->cls, 785 if (GNUNET_OK != TKT_database->store_ticket (TKT_database->cls,
781 ticket)) 786 ticket,
787 attrs))
782 { 788 {
783 GNUNET_log (GNUNET_ERROR_TYPE_ERROR, 789 GNUNET_log (GNUNET_ERROR_TYPE_ERROR,
784 "Unable to store ticket after issue\n"); 790 "Unable to store ticket after issue\n");
@@ -813,14 +819,16 @@ store_ticket_issue_cont (void *cls,
813 } 819 }
814 send_ticket_result (handle->client, 820 send_ticket_result (handle->client,
815 handle->r_id, 821 handle->r_id,
816 &handle->ticket); 822 &handle->ticket,
823 handle->attrs);
817 cleanup_ticket_issue_handle (handle); 824 cleanup_ticket_issue_handle (handle);
818} 825}
819 826
820 827
821 828
822int 829int
823serialize_abe_keyinfo2 (const struct TicketIssueHandle *handle, 830serialize_abe_keyinfo2 (const struct GNUNET_IDENTITY_PROVIDER_Ticket *ticket,
831 const struct GNUNET_IDENTITY_PROVIDER_AttributeList *attrs,
824 const struct GNUNET_CRYPTO_AbeKey *rp_key, 832 const struct GNUNET_CRYPTO_AbeKey *rp_key,
825 struct GNUNET_CRYPTO_EcdhePrivateKey **ecdh_privkey, 833 struct GNUNET_CRYPTO_EcdhePrivateKey **ecdh_privkey,
826 char **result) 834 char **result)
@@ -842,14 +850,14 @@ serialize_abe_keyinfo2 (const struct TicketIssueHandle *handle,
842 size = GNUNET_CRYPTO_cpabe_serialize_key (rp_key, 850 size = GNUNET_CRYPTO_cpabe_serialize_key (rp_key,
843 (void**)&serialized_key); 851 (void**)&serialized_key);
844 attrs_str_len = 0; 852 attrs_str_len = 0;
845 for (le = handle->attrs->list_head; NULL != le; le = le->next) { 853 for (le = attrs->list_head; NULL != le; le = le->next) {
846 attrs_str_len += strlen (le->attribute->name) + 1; 854 attrs_str_len += strlen (le->attribute->name) + 1;
847 } 855 }
848 buf = GNUNET_malloc (attrs_str_len + size); 856 buf = GNUNET_malloc (attrs_str_len + size);
849 write_ptr = buf; 857 write_ptr = buf;
850 GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, 858 GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
851 "Writing attributes\n"); 859 "Writing attributes\n");
852 for (le = handle->attrs->list_head; NULL != le; le = le->next) { 860 for (le = attrs->list_head; NULL != le; le = le->next) {
853 GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, 861 GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
854 "%s\n", le->attribute->name); 862 "%s\n", le->attribute->name);
855 863
@@ -873,7 +881,7 @@ serialize_abe_keyinfo2 (const struct TicketIssueHandle *handle,
873 enc_keyinfo = GNUNET_malloc (size + attrs_str_len); 881 enc_keyinfo = GNUNET_malloc (size + attrs_str_len);
874 // Derived key K = H(eB) 882 // Derived key K = H(eB)
875 GNUNET_assert (GNUNET_OK == GNUNET_CRYPTO_ecdh_ecdsa (*ecdh_privkey, 883 GNUNET_assert (GNUNET_OK == GNUNET_CRYPTO_ecdh_ecdsa (*ecdh_privkey,
876 &handle->ticket.audience, 884 &ticket->audience,
877 &new_key_hash)); 885 &new_key_hash));
878 create_sym_key_from_ecdh(&new_key_hash, &skey, &iv); 886 create_sym_key_from_ecdh(&new_key_hash, &skey, &iv);
879 enc_size = GNUNET_CRYPTO_symmetric_encrypt (buf, 887 enc_size = GNUNET_CRYPTO_symmetric_encrypt (buf,
@@ -925,7 +933,8 @@ issue_ticket_after_abe_bootstrap (void *cls,
925 attrs); 933 attrs);
926 934
927 //TODO review this wireformat 935 //TODO review this wireformat
928 code_record_len = serialize_abe_keyinfo2 (ih, 936 code_record_len = serialize_abe_keyinfo2 (&ih->ticket,
937 ih->attrs,
929 rp_key, 938 rp_key,
930 &ecdhe_privkey, 939 &ecdhe_privkey,
931 &code_record_data); 940 &code_record_data);
@@ -1008,6 +1017,124 @@ handle_issue_ticket_message (void *cls,
1008 1017
1009} 1018}
1010 1019
1020/**
1021 * Process ticket from database
1022 *
1023 * @param cls struct TicketIterationProcResult
1024 * @param ticket the ticket
1025 * @param attrs the attributes
1026 */
1027static void
1028ticket_reissue_proc (void *cls,
1029 const struct GNUNET_IDENTITY_PROVIDER_Ticket *ticket,
1030 const struct GNUNET_IDENTITY_PROVIDER_AttributeList *attrs);
1031
1032
1033static void
1034reissue_ticket_cont (void *cls,
1035 int32_t success,
1036 const char *emsg)
1037{
1038 struct TicketRevocationHandle *rh = cls;
1039
1040 rh->ns_qe = NULL;
1041 if (GNUNET_SYSERR == success)
1042 {
1043 //TODO cleanup_ticket_revocation_handle (handle);
1044 GNUNET_log (GNUNET_ERROR_TYPE_ERROR, "%s\n",
1045 "Unknown Error\n");
1046 GNUNET_SCHEDULER_add_now (&do_shutdown, NULL);
1047 return;
1048 }
1049 rh->offset++;
1050 GNUNET_assert (GNUNET_SYSERR !=
1051 TKT_database->iterate_tickets (TKT_database->cls,
1052 &rh->ticket.identity,
1053 GNUNET_NO,
1054 rh->offset,
1055 &ticket_reissue_proc,
1056 rh));
1057}
1058
1059
1060
1061/**
1062 * Process ticket from database
1063 *
1064 * @param cls struct TicketIterationProcResult
1065 * @param ticket the ticket
1066 * @param attrs the attributes
1067 */
1068static void
1069ticket_reissue_proc (void *cls,
1070 const struct GNUNET_IDENTITY_PROVIDER_Ticket *ticket,
1071 const struct GNUNET_IDENTITY_PROVIDER_AttributeList *attrs)
1072{
1073 struct TicketRevocationHandle *rh = cls;
1074 struct GNUNET_IDENTITY_PROVIDER_AttributeListEntry *le;
1075 struct GNUNET_CRYPTO_EcdhePrivateKey *ecdhe_privkey;
1076 struct GNUNET_GNSRECORD_Data code_record[1];
1077 struct GNUNET_CRYPTO_AbeKey *rp_key;
1078 char *code_record_data;
1079 char **attr_arr;
1080 char *label;
1081 int attrs_len;
1082 int i;
1083 size_t code_record_len;
1084
1085
1086 if (NULL == ticket)
1087 {
1088 GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
1089 "Iteration done\n");
1090 /* Send reply ? */
1091 GNUNET_break (0);
1092 return;
1093 }
1094 //Create new ABE key for RP
1095 attrs_len = 0;
1096 for (le = attrs->list_head; NULL != le; le = le->next)
1097 attrs_len++;
1098 attr_arr = GNUNET_malloc ((attrs_len + 1)*sizeof (char*));
1099 i = 0;
1100 for (le = attrs->list_head; NULL != le; le = le->next) {
1101 attr_arr[i] = (char*) le->attribute->name;
1102 i++;
1103 }
1104 attr_arr[i] = NULL;
1105 rp_key = GNUNET_CRYPTO_cpabe_create_key (rh->abe_key,
1106 attr_arr);
1107
1108 //TODO review this wireformat
1109 code_record_len = serialize_abe_keyinfo2 (&rh->ticket,
1110 rh->attrs,
1111 rp_key,
1112 &ecdhe_privkey,
1113 &code_record_data);
1114 code_record[0].data = code_record_data;
1115 code_record[0].data_size = code_record_len;
1116 code_record[0].expiration_time = GNUNET_TIME_UNIT_DAYS.rel_value_us;
1117 code_record[0].record_type = GNUNET_GNSRECORD_TYPE_ABE_KEY;
1118 code_record[0].flags = GNUNET_GNSRECORD_RF_RELATIVE_EXPIRATION;
1119
1120 label = GNUNET_STRINGS_data_to_string_alloc (&ticket->rnd,
1121 sizeof (uint64_t));
1122 //Publish record
1123 rh->ns_qe = GNUNET_NAMESTORE_records_store (ns_handle,
1124 &rh->identity,
1125 label,
1126 1,
1127 code_record,
1128 &reissue_ticket_cont,
1129 rh);
1130 GNUNET_free (ecdhe_privkey);
1131 GNUNET_free (label);
1132 GNUNET_free (attr_arr);
1133 GNUNET_free (code_record_data);
1134
1135}
1136
1137
1011static void 1138static void
1012attr_reenc_cont (void *cls, 1139attr_reenc_cont (void *cls,
1013 int32_t success, 1140 int32_t success,
@@ -1017,6 +1144,7 @@ attr_reenc_cont (void *cls,
1017 struct GNUNET_GNSRECORD_Data rd[1]; 1144 struct GNUNET_GNSRECORD_Data rd[1];
1018 size_t buf_size; 1145 size_t buf_size;
1019 char *buf; 1146 char *buf;
1147 int ret;
1020 1148
1021 if (GNUNET_SYSERR == success) 1149 if (GNUNET_SYSERR == success)
1022 { 1150 {
@@ -1032,7 +1160,18 @@ attr_reenc_cont (void *cls,
1032 if (NULL == rh->attrs->list_head) 1160 if (NULL == rh->attrs->list_head)
1033 { 1161 {
1034 /* Done, issue new keys */ 1162 /* Done, issue new keys */
1035 GNUNET_break (0); //TODO 1163 GNUNET_log (GNUNET_ERROR_TYPE_MESSAGE,
1164 "Revocation Phase IV: Reissuing Tickets\n");
1165 if (GNUNET_SYSERR ==
1166 (ret = TKT_database->iterate_tickets (TKT_database->cls,
1167 &rh->ticket.identity,
1168 GNUNET_NO,
1169 rh->offset,
1170 &ticket_reissue_proc,
1171 rh)))
1172 {
1173 GNUNET_break (0);
1174 }
1036 return; 1175 return;
1037 } 1176 }
1038 GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, 1177 GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
@@ -1083,9 +1222,10 @@ reenc_after_abe_bootstrap (void *cls,
1083 if (NULL == rh->attrs->list_head) 1222 if (NULL == rh->attrs->list_head)
1084 { 1223 {
1085 /* No attributes to reencrypt, this is odd... */ 1224 /* No attributes to reencrypt, this is odd... */
1225 GNUNET_break (0);
1086 } else { 1226 } else {
1087 GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, 1227 GNUNET_log (GNUNET_ERROR_TYPE_MESSAGE,
1088 "Re-encrypting attribute\n"); 1228 "Revocation Phase III: Re-encrypting attributes\n");
1089 buf_size = attribute_serialize_get_size (rh->attrs->list_head->attribute); 1229 buf_size = attribute_serialize_get_size (rh->attrs->list_head->attribute);
1090 buf = GNUNET_malloc (buf_size); 1230 buf = GNUNET_malloc (buf_size);
1091 1231
@@ -1131,7 +1271,8 @@ static void
1131revoke_collect_iter_finished (void *cls) 1271revoke_collect_iter_finished (void *cls)
1132{ 1272{
1133 struct TicketRevocationHandle *rh = cls; 1273 struct TicketRevocationHandle *rh = cls;
1134 1274 GNUNET_log (GNUNET_ERROR_TYPE_MESSAGE,
1275 "Revocation Phase II: Invalidating old ABE Master\n");
1135 /* Bootstrap new abe key */ 1276 /* Bootstrap new abe key */
1136 bootstrap_abe (&rh->identity, &reenc_after_abe_bootstrap, rh, GNUNET_YES); 1277 bootstrap_abe (&rh->identity, &reenc_after_abe_bootstrap, rh, GNUNET_YES);
1137} 1278}
@@ -1188,7 +1329,8 @@ collect_after_abe_bootstrap (void *cls,
1188 1329
1189 rh->abe_key = cls; 1330 rh->abe_key = cls;
1190 GNUNET_assert (NULL != abe_key); 1331 GNUNET_assert (NULL != abe_key);
1191 1332 GNUNET_log (GNUNET_ERROR_TYPE_MESSAGE,
1333 "Revocation Phase I: Collecting attributes\n");
1192 /* Reencrypt all attributes with new key */ 1334 /* Reencrypt all attributes with new key */
1193 rh->ns_it = GNUNET_NAMESTORE_zone_iteration_start (ns_handle, 1335 rh->ns_it = GNUNET_NAMESTORE_zone_iteration_start (ns_handle,
1194 &rh->identity, 1336 &rh->identity,
@@ -1334,7 +1476,8 @@ process_parallel_lookup2 (void *cls, uint32_t rd_count,
1334 1476
1335 /* Store ticket in DB */ 1477 /* Store ticket in DB */
1336 if (GNUNET_OK != TKT_database->store_ticket (TKT_database->cls, 1478 if (GNUNET_OK != TKT_database->store_ticket (TKT_database->cls,
1337 &handle->ticket)) 1479 &handle->ticket,
1480 handle->attrs))
1338 { 1481 {
1339 GNUNET_log (GNUNET_ERROR_TYPE_ERROR, 1482 GNUNET_log (GNUNET_ERROR_TYPE_ERROR,
1340 "Unable to store ticket after consume\n"); 1483 "Unable to store ticket after consume\n");
@@ -1914,7 +2057,8 @@ struct TicketIterationProcResult
1914 */ 2057 */
1915static void 2058static void
1916ticket_iterate_proc (void *cls, 2059ticket_iterate_proc (void *cls,
1917 const struct GNUNET_IDENTITY_PROVIDER_Ticket *ticket) 2060 const struct GNUNET_IDENTITY_PROVIDER_Ticket *ticket,
2061 const struct GNUNET_IDENTITY_PROVIDER_AttributeList *attrs)
1918{ 2062{
1919 struct TicketIterationProcResult *proc = cls; 2063 struct TicketIterationProcResult *proc = cls;
1920 2064
@@ -1928,7 +2072,8 @@ ticket_iterate_proc (void *cls,
1928 proc->res_iteration_finished = IT_SUCCESS_MORE_AVAILABLE; 2072 proc->res_iteration_finished = IT_SUCCESS_MORE_AVAILABLE;
1929 send_ticket_result (proc->ti->client, 2073 send_ticket_result (proc->ti->client,
1930 proc->ti->r_id, 2074 proc->ti->r_id,
1931 ticket); 2075 ticket,
2076 attrs);
1932 2077
1933} 2078}
1934 2079
diff --git a/src/identity-provider/plugin_identity_provider_sqlite.c b/src/identity-provider/plugin_identity_provider_sqlite.c
index ff2d3a22e..ac4e3c686 100644
--- a/src/identity-provider/plugin_identity_provider_sqlite.c
+++ b/src/identity-provider/plugin_identity_provider_sqlite.c
@@ -27,6 +27,7 @@
27#include "platform.h" 27#include "platform.h"
28#include "gnunet_identity_provider_service.h" 28#include "gnunet_identity_provider_service.h"
29#include "gnunet_identity_provider_plugin.h" 29#include "gnunet_identity_provider_plugin.h"
30#include "identity_attribute.h"
30#include "gnunet_sq_lib.h" 31#include "gnunet_sq_lib.h"
31#include <sqlite3.h> 32#include <sqlite3.h>
32 33
@@ -252,7 +253,8 @@ database_setup (struct Plugin *plugin)
252 "CREATE TABLE identity001tickets (" 253 "CREATE TABLE identity001tickets ("
253 " identity BLOB NOT NULL DEFAULT ''," 254 " identity BLOB NOT NULL DEFAULT '',"
254 " audience BLOB NOT NULL DEFAULT ''," 255 " audience BLOB NOT NULL DEFAULT '',"
255 " rnd INT8 NOT NULL DEFAULT ''" 256 " rnd INT8 NOT NULL DEFAULT '',"
257 " attributes BLOB NOT NULL DEFAULT ''"
256 ")", 258 ")",
257 NULL, NULL, NULL) != SQLITE_OK)) 259 NULL, NULL, NULL) != SQLITE_OK))
258 { 260 {
@@ -267,8 +269,8 @@ database_setup (struct Plugin *plugin)
267 269
268 if ( (SQLITE_OK != 270 if ( (SQLITE_OK !=
269 sq_prepare (plugin->dbh, 271 sq_prepare (plugin->dbh,
270 "INSERT INTO identity001tickets (identity, audience, rnd)" 272 "INSERT INTO identity001tickets (identity, audience, rnd, attributes)"
271 " VALUES (?, ?, ?)", 273 " VALUES (?, ?, ?, ?)",
272 &plugin->store_ticket)) || 274 &plugin->store_ticket)) ||
273 (SQLITE_OK != 275 (SQLITE_OK !=
274 sq_prepare (plugin->dbh, 276 sq_prepare (plugin->dbh,
@@ -276,13 +278,13 @@ database_setup (struct Plugin *plugin)
276 &plugin->delete_ticket)) || 278 &plugin->delete_ticket)) ||
277 (SQLITE_OK != 279 (SQLITE_OK !=
278 sq_prepare (plugin->dbh, 280 sq_prepare (plugin->dbh,
279 "SELECT identity,audience,rnd" 281 "SELECT identity,audience,rnd,attributes"
280 " FROM identity001tickets WHERE identity=?" 282 " FROM identity001tickets WHERE identity=?"
281 " ORDER BY rnd LIMIT 1 OFFSET ?", 283 " ORDER BY rnd LIMIT 1 OFFSET ?",
282 &plugin->iterate_tickets)) || 284 &plugin->iterate_tickets)) ||
283 (SQLITE_OK != 285 (SQLITE_OK !=
284 sq_prepare (plugin->dbh, 286 sq_prepare (plugin->dbh,
285 "SELECT identity,audience,rnd" 287 "SELECT identity,audience,rnd,attributes"
286 " FROM identity001tickets WHERE audience=?" 288 " FROM identity001tickets WHERE audience=?"
287 " ORDER BY rnd LIMIT 1 OFFSET ?", 289 " ORDER BY rnd LIMIT 1 OFFSET ?",
288 &plugin->iterate_tickets_by_audience)) ) 290 &plugin->iterate_tickets_by_audience)) )
@@ -358,9 +360,12 @@ database_shutdown (struct Plugin *plugin)
358 */ 360 */
359static int 361static int
360identity_provider_sqlite_store_ticket (void *cls, 362identity_provider_sqlite_store_ticket (void *cls,
361 const struct GNUNET_IDENTITY_PROVIDER_Ticket *ticket) 363 const struct GNUNET_IDENTITY_PROVIDER_Ticket *ticket,
364 const struct GNUNET_IDENTITY_PROVIDER_AttributeList *attrs)
362{ 365{
363 struct Plugin *plugin = cls; 366 struct Plugin *plugin = cls;
367 size_t attrs_len;
368 char *attrs_ser;
364 int n; 369 int n;
365 370
366 { 371 {
@@ -384,11 +389,16 @@ identity_provider_sqlite_store_ticket (void *cls,
384 n = sqlite3_step (plugin->delete_ticket); 389 n = sqlite3_step (plugin->delete_ticket);
385 GNUNET_SQ_reset (plugin->dbh, 390 GNUNET_SQ_reset (plugin->dbh,
386 plugin->delete_ticket); 391 plugin->delete_ticket);
387 392
393 attrs_len = attribute_list_serialize_get_size (attrs);
394 attrs_ser = GNUNET_malloc (attrs_len);
395 attribute_list_serialize (attrs,
396 attrs_ser);
388 struct GNUNET_SQ_QueryParam sparams[] = { 397 struct GNUNET_SQ_QueryParam sparams[] = {
389 GNUNET_SQ_query_param_auto_from_type (&ticket->identity), 398 GNUNET_SQ_query_param_auto_from_type (&ticket->identity),
390 GNUNET_SQ_query_param_auto_from_type (&ticket->audience), 399 GNUNET_SQ_query_param_auto_from_type (&ticket->audience),
391 GNUNET_SQ_query_param_uint64 (&ticket->rnd), 400 GNUNET_SQ_query_param_uint64 (&ticket->rnd),
401 GNUNET_SQ_query_param_fixed_size (attrs_ser, attrs_len),
392 GNUNET_SQ_query_param_end 402 GNUNET_SQ_query_param_end
393 }; 403 };
394 404
@@ -406,6 +416,7 @@ identity_provider_sqlite_store_ticket (void *cls,
406 n = sqlite3_step (plugin->store_ticket); 416 n = sqlite3_step (plugin->store_ticket);
407 GNUNET_SQ_reset (plugin->dbh, 417 GNUNET_SQ_reset (plugin->dbh,
408 plugin->store_ticket); 418 plugin->store_ticket);
419 GNUNET_free (attrs_ser);
409 } 420 }
410 switch (n) 421 switch (n)
411 { 422 {
@@ -503,8 +514,11 @@ get_ticket_and_call_iterator (struct Plugin *plugin,
503 void *iter_cls) 514 void *iter_cls)
504{ 515{
505 struct GNUNET_IDENTITY_PROVIDER_Ticket ticket; 516 struct GNUNET_IDENTITY_PROVIDER_Ticket ticket;
517 struct GNUNET_IDENTITY_PROVIDER_AttributeList *attrs;
506 int ret; 518 int ret;
507 int sret; 519 int sret;
520 size_t attrs_len;
521 char *attrs_ser;
508 522
509 ret = GNUNET_NO; 523 ret = GNUNET_NO;
510 if (SQLITE_ROW == (sret = sqlite3_step (stmt))) 524 if (SQLITE_ROW == (sret = sqlite3_step (stmt)))
@@ -513,6 +527,8 @@ get_ticket_and_call_iterator (struct Plugin *plugin,
513 GNUNET_SQ_result_spec_auto_from_type (&ticket.identity), 527 GNUNET_SQ_result_spec_auto_from_type (&ticket.identity),
514 GNUNET_SQ_result_spec_auto_from_type (&ticket.audience), 528 GNUNET_SQ_result_spec_auto_from_type (&ticket.audience),
515 GNUNET_SQ_result_spec_uint64 (&ticket.rnd), 529 GNUNET_SQ_result_spec_uint64 (&ticket.rnd),
530 GNUNET_SQ_result_spec_variable_size ((void**)&attrs_ser,
531 &attrs_len),
516 GNUNET_SQ_result_spec_end 532 GNUNET_SQ_result_spec_end
517 533
518 }; 534 };
@@ -525,10 +541,13 @@ get_ticket_and_call_iterator (struct Plugin *plugin,
525 } 541 }
526 else 542 else
527 { 543 {
528 if (NULL != iter) 544 attrs = attribute_list_deserialize (attrs_ser,
529 iter (iter_cls, 545 attrs_len);
530 &ticket); 546 if (NULL != iter)
531 ret = GNUNET_YES; 547 iter (iter_cls,
548 &ticket,
549 attrs);
550 ret = GNUNET_YES;
532 } 551 }
533 GNUNET_SQ_cleanup_result (rs); 552 GNUNET_SQ_cleanup_result (rs);
534 } 553 }
diff --git a/src/include/gnunet_identity_provider_plugin.h b/src/include/gnunet_identity_provider_plugin.h
index 27d7eb44f..e34ed3f1a 100644
--- a/src/include/gnunet_identity_provider_plugin.h
+++ b/src/include/gnunet_identity_provider_plugin.h
@@ -50,7 +50,8 @@ extern "C"
50 * @param ticket the ticket 50 * @param ticket the ticket
51 */ 51 */
52typedef void (*GNUNET_IDENTITY_PROVIDER_TicketIterator) (void *cls, 52typedef void (*GNUNET_IDENTITY_PROVIDER_TicketIterator) (void *cls,
53 const struct GNUNET_IDENTITY_PROVIDER_Ticket *ticket); 53 const struct GNUNET_IDENTITY_PROVIDER_Ticket *ticket,
54 const struct GNUNET_IDENTITY_PROVIDER_AttributeList *attrs);
54 55
55 56
56/** 57/**
@@ -72,7 +73,8 @@ struct GNUNET_IDENTITY_PROVIDER_PluginFunctions
72 * @return #GNUNET_OK on success, else #GNUNET_SYSERR 73 * @return #GNUNET_OK on success, else #GNUNET_SYSERR
73 */ 74 */
74 int (*store_ticket) (void *cls, 75 int (*store_ticket) (void *cls,
75 const struct GNUNET_IDENTITY_PROVIDER_Ticket *ticket); 76 const struct GNUNET_IDENTITY_PROVIDER_Ticket *ticket,
77 const struct GNUNET_IDENTITY_PROVIDER_AttributeList *attrs);
76 78
77 /** 79 /**
78 * Delete a ticket from the database. 80 * Delete a ticket from the database.