uint32_t cred_found GNUNET_PACKED;
/**
- * The number of credentials in the response
+ * The number of delegations in the response
*/
uint32_t d_count GNUNET_PACKED;
+ /**
+ * The number of credentials in the response
+ */
+ uint32_t c_count GNUNET_PACKED;
+
/* followed by ad_count GNUNET_CREDENTIAL_RecordData structs*/
};
struct GNUNET_CREDENTIAL_Request *vr;
size_t mlen = ntohs (vr_msg->header.size) - sizeof (*vr_msg);
uint32_t d_count = ntohl (vr_msg->d_count);
+ uint32_t c_count = ntohl (vr_msg->c_count);
struct GNUNET_CREDENTIAL_Delegation d_chain[d_count];
- struct GNUNET_CREDENTIAL_Credential cred;
+ struct GNUNET_CREDENTIAL_Credential creds[c_count];
GNUNET_CREDENTIAL_VerifyResultProcessor proc;
void *proc_cls;
(const char*) &vr_msg[1],
d_count,
d_chain,
- &cred));
+ c_count,
+ creds));
if (GNUNET_NO == ntohl (vr_msg->cred_found))
{
proc (proc_cls,
0,
NULL,
+ 0,
NULL); // TODO
} else {
proc (proc_cls,
d_count,
d_chain,
- &cred);
+ c_count,
+ creds);
}
}
*
* @param d_count number of delegation chain entries
* @param dd array of #GNUNET_CREDENTIAL_Delegation
+ * @param c_count number of credential entries
* @param cd a #GNUNET_CREDENTIAL_Credential
* @return the required size to serialize
*/
size_t
GNUNET_CREDENTIAL_delegation_chain_get_size (unsigned int d_count,
const struct GNUNET_CREDENTIAL_Delegation *dd,
+ unsigned int c_count,
const struct GNUNET_CREDENTIAL_Credential *cd)
{
unsigned int i;
size_t ret;
- ret = sizeof (struct ChainEntry) * (d_count + 1);
+ ret = sizeof (struct ChainEntry) * (d_count);
+ ret += sizeof (struct ChainEntry) * (c_count);
for (i=0; i<d_count;i++)
{
dd[i].subject_attribute_len) >= ret);
ret += dd[i].issuer_attribute_len + dd[i].subject_attribute_len;
}
- GNUNET_assert ((ret + cd->issuer_attribute_len) >= ret);
- ret += cd->issuer_attribute_len;
+ for (i=0; i<c_count;i++)
+ {
+ GNUNET_assert ((ret + cd[i].issuer_attribute_len) >= ret);
+ ret += cd[i].issuer_attribute_len;
+ }
return ret;
}
*
* @param d_count number of delegation chain entries
* @param dd array of #GNUNET_CREDENTIAL_Delegation
+ * @param c_count number of credential entries
* @param cd a #GNUNET_CREDENTIAL_Credential
* @param dest_size size of the destination
* @param dest where to store the result
ssize_t
GNUNET_CREDENTIAL_delegation_chain_serialize (unsigned int d_count,
const struct GNUNET_CREDENTIAL_Delegation *dd,
+ unsigned int c_count,
const struct GNUNET_CREDENTIAL_Credential *cd,
size_t dest_size,
char *dest)
dd[i].subject_attribute_len);
off += dd[i].subject_attribute_len;
}
- rec.issuer_attribute_len = htonl ((uint32_t) cd->issuer_attribute_len);
- rec.subject_attribute_len = htonl (0);
- rec.issuer_key = cd->issuer_key;
- if (off + sizeof (rec) > dest_size)
- return -1;
- GNUNET_memcpy (&dest[off],
- &rec,
- sizeof (rec));
- off += sizeof (rec);
- if (off + cd->issuer_attribute_len > dest_size)
- return -1;
- GNUNET_memcpy (&dest[off],
- cd->issuer_attribute,
- cd->issuer_attribute_len);
- off += cd->issuer_attribute_len;
+ for (i=0;i<c_count;i++)
+ {
+ rec.issuer_attribute_len = htonl ((uint32_t) cd[i].issuer_attribute_len);
+ rec.subject_attribute_len = htonl (0);
+ rec.issuer_key = cd[i].issuer_key;
+ rec.subject_key = cd[i].subject_key;
+ if (off + sizeof (rec) > dest_size)
+ return -1;
+ GNUNET_memcpy (&dest[off],
+ &rec,
+ sizeof (rec));
+ off += sizeof (rec);
+ if (off + cd[i].issuer_attribute_len > dest_size)
+ return -1;
+ GNUNET_memcpy (&dest[off],
+ cd[i].issuer_attribute,
+ cd[i].issuer_attribute_len);
+ off += cd[i].issuer_attribute_len;
+ }
return off;
}
* @param src the serialized data
* @param d_count the number of delegation chain entries
* @param dd where to put the delegation chain entries
+ * @param c_count the number of credential entries
* @param cd where to put the credential data
* @return #GNUNET_OK on success, #GNUNET_SYSERR on error
*/
const char *src,
unsigned int d_count,
struct GNUNET_CREDENTIAL_Delegation *dd,
+ unsigned int c_count,
struct GNUNET_CREDENTIAL_Credential *cd)
{
struct ChainEntry rec;
dd[i].subject_attribute = &src[off];
off += dd[i].subject_attribute_len;
}
- if (off + sizeof (rec) > len)
- return GNUNET_SYSERR;
- GNUNET_memcpy (&rec, &src[off], sizeof (rec));
- cd->issuer_attribute_len = ntohl ((uint32_t) rec.issuer_attribute_len);
- cd->issuer_key = rec.issuer_key;
- cd->subject_key = rec.subject_key;
- off += sizeof (rec);
- if (off + cd->issuer_attribute_len > len)
- return GNUNET_SYSERR;
- cd->issuer_attribute = &src[off];
- off += cd->issuer_attribute_len;
+ for (i=0;i<c_count;i++)
+ {
+ if (off + sizeof (rec) > len)
+ return GNUNET_SYSERR;
+ GNUNET_memcpy (&rec, &src[off], sizeof (rec));
+ cd[i].issuer_attribute_len = ntohl ((uint32_t) rec.issuer_attribute_len);
+ cd[i].issuer_key = rec.issuer_key;
+ cd[i].subject_key = rec.subject_key;
+ off += sizeof (rec);
+ if (off + cd[i].issuer_attribute_len > len)
+ return GNUNET_SYSERR;
+ cd[i].issuer_attribute = &src[off];
+ off += cd[i].issuer_attribute_len;
+ }
return GNUNET_OK;
}
*
* @param d_count number of delegation chain entries
* @param dd array of #GNUNET_CREDENTIAL_Delegation
+ * @param c_count number of credential entries
* @param cd a #GNUNET_CREDENTIAL_Credential
* @return the required size to serialize
*/
size_t
GNUNET_CREDENTIAL_delegation_chain_get_size (unsigned int d_count,
const struct GNUNET_CREDENTIAL_Delegation *dd,
+ unsigned int c_count,
const struct GNUNET_CREDENTIAL_Credential *cd);
/**
*
* @param d_count number of delegation chain entries
* @param dd array of #GNUNET_CREDENTIAL_Delegation
+ * @param c_count number of credential entries
* @param cd a #GNUNET_CREDENTIAL_Credential
* @param dest_size size of the destination
* @param dest where to store the result
ssize_t
GNUNET_CREDENTIAL_delegation_chain_serialize (unsigned int d_count,
const struct GNUNET_CREDENTIAL_Delegation *dd,
+ unsigned int c_count,
const struct GNUNET_CREDENTIAL_Credential *cd,
size_t dest_size,
char *dest);
* @param src the serialized data
* @param d_count the number of delegation chain entries
* @param dd where to put the delegation chain entries
+ * @param c_count number of credential entries
* @param cd where to put the credential data
* @return #GNUNET_OK on success, #GNUNET_SYSERR on error
*/
const char *src,
unsigned int d_count,
struct GNUNET_CREDENTIAL_Delegation *dd,
+ unsigned int c_count,
struct GNUNET_CREDENTIAL_Credential *cd);
/* end of credential_serialization.h */
handle_verify_result (void *cls,
unsigned int d_count,
struct GNUNET_CREDENTIAL_Delegation *dc,
+ unsigned int c_count,
struct GNUNET_CREDENTIAL_Credential *cred)
{
int i;
printf ("Failed.\n");
else
{
- iss_key = GNUNET_CRYPTO_ecdsa_public_key_to_string (&cred->issuer_key);
- sub_key = GNUNET_CRYPTO_ecdsa_public_key_to_string (&cred->subject_key);
- printf ("(0) %s.%s <- %s (Subject)\n",
- iss_key, cred->issuer_attribute,
- sub_key);
- GNUNET_free (iss_key);
- GNUNET_free (sub_key);
+ printf("Delegation Chain:\n");
for (i=0;i<d_count;i++)
{
iss_key = GNUNET_CRYPTO_ecdsa_public_key_to_string (&dc[i].issuer_key);
sub_key = GNUNET_CRYPTO_ecdsa_public_key_to_string (&dc[i].subject_key);
if (0 != dc[i].subject_attribute_len)
{
- printf ("(%d) %s.%s <- %s.%s\n", i+1,
+ printf ("(%d) %s.%s <- %s.%s\n", i,
iss_key, dc[i].issuer_attribute,
sub_key, dc[i].subject_attribute);
} else {
- printf ("(%d) %s.%s <- %s\n", i+1,
+ printf ("(%d) %s.%s <- %s\n", i,
iss_key, dc[i].issuer_attribute,
sub_key);
}
GNUNET_free (iss_key);
GNUNET_free (sub_key);
}
+ printf("\nCredentials:\n");
+ for (i=0;i<c_count;i++)
+ {
+ iss_key = GNUNET_CRYPTO_ecdsa_public_key_to_string (&cred[i].issuer_key);
+ sub_key = GNUNET_CRYPTO_ecdsa_public_key_to_string (&cred[i].subject_key);
+ printf ("%s.%s <- %s\n",
+ iss_key, cred[i].issuer_attribute,
+ sub_key);
+ GNUNET_free (iss_key);
+ GNUNET_free (sub_key);
+
+ }
printf ("Successful.\n");
}
_("You must provide issuer and subject attributes\n"));
GNUNET_SCHEDULER_shutdown ();
}
-
+
+ printf ("Trying to find a chain from a credential under %s of %s to the attribute %s issued by %s\n",
+ subject_credential, subject_key, issuer_attr, issuer_key);
verify_request = GNUNET_CREDENTIAL_verify(credential,
&issuer_pkey,
struct GNUNET_CRYPTO_EcdsaPublicKey subject_key;
/**
- * Credential Chain
+ * Credential DLL
*/
struct CredentialRecordEntry *cred_chain_head;
/**
- * Credential Chain
+ * Credential DLL
*/
struct CredentialRecordEntry *cred_chain_tail;
+ /**
+ * Credential DLL size
+ */
+ uint32_t cred_chain_size;
+
/**
* Root Delegation Set
*/
cleanup_handle (struct VerifyRequestHandle *vrh)
{
struct CredentialRecordEntry *cr_entry;
- GNUNET_log (GNUNET_ERROR_TYPE_ERROR,
+ GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
"Cleaning up...\n");
if (NULL != vrh->lookup_request)
{
{
struct VerifyRequestHandle *vrh;
- GNUNET_log (GNUNET_ERROR_TYPE_ERROR,
+ GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
"Shutting down!\n");
while (NULL != (vrh = vrh_head))
struct DelegationChainEntry *dce;
size_t size = vrh->credential_size;
struct GNUNET_CREDENTIAL_Delegation dd[vrh->delegation_chain_size];
- struct GNUNET_CREDENTIAL_Credential cred;
+ struct GNUNET_CREDENTIAL_Credential cred[vrh->cred_chain_size];
+ struct GNUNET_CREDENTIAL_CredentialRecordData *crd;
+ struct CredentialRecordEntry *cd;
int i;
- GNUNET_log (GNUNET_ERROR_TYPE_ERROR,
+ GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
"Sending response\n");
i = 0;
for (dce = vrh->delegation_chain_head;
* Get serialized record data
* Append at the end of rmsg
*/
- cred.issuer_key = vrh->credential->issuer_key;
- cred.subject_key = vrh->credential->subject_key;
- cred.issuer_attribute_len = strlen((char*)&vrh->credential[1])+1;
- cred.issuer_attribute = (char*)&vrh->credential[1];
+ i = 0;
+ for (cd = vrh->cred_chain_head;
+ NULL != cd;
+ cd = cd->next)
+ {
+ crd = cd->data;
+ cred[i].issuer_key = crd->issuer_key;
+ cred[i].subject_key = crd->subject_key;
+ cred[i].issuer_attribute_len = strlen((char*)&crd[1])+1;
+ cred[i].issuer_attribute = (char*)&crd[1];
+ i++;
+ }
size = GNUNET_CREDENTIAL_delegation_chain_get_size (vrh->delegation_chain_size,
dd,
- &cred);
- GNUNET_log (GNUNET_ERROR_TYPE_ERROR,
- "SIZE; %llu count: %d\n",size,vrh->delegation_chain_size);
+ vrh->cred_chain_size,
+ cred);
env = GNUNET_MQ_msg_extra (rmsg,
size,
GNUNET_MESSAGE_TYPE_CREDENTIAL_VERIFY_RESULT);
//Assign id so that client can find associated request
rmsg->id = vrh->request_id;
rmsg->d_count = htonl (vrh->delegation_chain_size);
+ rmsg->c_count = htonl (vrh->cred_chain_size);
if (NULL != vrh->credential)
rmsg->cred_found = htonl (GNUNET_YES);
GNUNET_assert (-1 !=
GNUNET_CREDENTIAL_delegation_chain_serialize (vrh->delegation_chain_size,
dd,
- &cred,
+ vrh->cred_chain_size,
+ cred,
size,
(char*)&rmsg[1]));
current_set->lookup_request = NULL;
vrh = current_set->handle;
vrh->pending_lookups--;
- GNUNET_log (GNUNET_ERROR_TYPE_ERROR,
+ GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
"Got %d attrs\n", rd_count);
// Each OR
sets = rd[i].data;
struct GNUNET_CREDENTIAL_DelegationSetRecord set[ntohl(sets->set_count)];
- GNUNET_log (GNUNET_ERROR_TYPE_ERROR,
+ GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
"Found new attribute delegation with %d sets. Creating new Job...\n",
ntohl (sets->set_count));
set[j].subject_attribute,
current_set->attr_trailer);
}
- GNUNET_log (GNUNET_ERROR_TYPE_ERROR,
+ GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
"Expanded to %s\n", expanded_attr);
ds_entry->unresolved_attribute_delegation = expanded_attr;
} else {
if (0 != set[j].subject_attribute_len)
{
- GNUNET_log (GNUNET_ERROR_TYPE_ERROR,
+ GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
"Not Expanding %s\n", set[j].subject_attribute);
ds_entry->unresolved_attribute_delegation = GNUNET_strdup (set[j].subject_attribute);
}
dq_entry->set_entries_tail,
ds_entry);
- GNUNET_log (GNUNET_ERROR_TYPE_ERROR,
+ GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
"Checking for cred match\n");
/**
* Check if this delegation already matches one of our credentials
&cred_pointer->data->issuer_key,
sizeof(struct GNUNET_CRYPTO_EcdsaPublicKey)))
continue;
- GNUNET_log (GNUNET_ERROR_TYPE_ERROR,
+ GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
"Checking if %s matches %s\n",
ds_entry->unresolved_attribute_delegation, (char*)&cred[1]);
if (0 != strcmp (ds_entry->unresolved_attribute_delegation, (char*)&cred[1]))
continue;
- GNUNET_log (GNUNET_ERROR_TYPE_ERROR,
+ GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
"Found issuer\n");
//Backtrack
if (NULL == tmp_set->parent_queue_entry)
{
- GNUNET_log (GNUNET_ERROR_TYPE_ERROR,
+ GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
"All solutions found\n");
vrh->credential = GNUNET_malloc (cred_pointer->data_size);
memcpy (vrh->credential,
send_lookup_response (vrh);
return;
}
+ GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
+ "Not all solutions found yet.\n");
+ continue;
}
- GNUNET_log (GNUNET_ERROR_TYPE_ERROR,
+ GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
"Building new lookup request from %s\n",
ds_entry->unresolved_attribute_delegation);
//Continue with backward resolution
ds_entry->attr_trailer = GNUNET_strdup (next_attr);
}
- GNUNET_log (GNUNET_ERROR_TYPE_ERROR,
+ GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
"Looking up %s\n", ds_entry->lookup_attribute);
if (NULL != ds_entry->attr_trailer)
- GNUNET_log (GNUNET_ERROR_TYPE_ERROR,
+ GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
"%s still to go...\n", ds_entry->attr_trailer);
vrh->pending_lookups++;
if(0 == vrh->pending_lookups)
{
- GNUNET_log (GNUNET_ERROR_TYPE_ERROR,
+ GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
"We are all out of attributes...\n");
send_lookup_response (vrh);
return;
GNUNET_CONTAINER_DLL_insert_tail (vrh->cred_chain_head,
vrh->cred_chain_tail,
cr_entry);
+ vrh->cred_chain_size++;
if (0 != memcmp (&crd->issuer_key,
&vrh->issuer_key,
vrh->issuer_attribute);
strcpy (issuer_attribute_name + strlen (vrh->issuer_attribute),
".gnu");
- GNUNET_log (GNUNET_ERROR_TYPE_ERROR,
+ GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
"Looking up %s\n", issuer_attribute_name);
ds_entry = GNUNET_new (struct DelegationSetEntry);
ds_entry->issuer_key = GNUNET_new (struct GNUNET_CRYPTO_EcdsaPublicKey);
char *attrptr = attrs;
const char *utf_in;
- GNUNET_log (GNUNET_ERROR_TYPE_ERROR,
+ GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
"Received VERIFY message\n");
utf_in = (const char *) &v_msg[1];
send_lookup_response (vrh);
return;
}
- GNUNET_log (GNUNET_ERROR_TYPE_ERROR,
+ GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
"Looking up %s\n",
subject_attribute);
/**
struct GNUNET_SERVICE_Client *client,
void *app_ctx)
{
- GNUNET_log (GNUNET_ERROR_TYPE_ERROR,
+ GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
"Client %p disconnected\n",
client);
}
struct GNUNET_SERVICE_Client *client,
struct GNUNET_MQ_Handle *mq)
{
- GNUNET_log (GNUNET_ERROR_TYPE_ERROR,
+ GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
"Client %p connected\n",
client);
return client;
memcpy (&sets,
data,
sizeof (sets));
- GNUNET_log (GNUNET_ERROR_TYPE_ERROR,
- "SIZE %llu needed: %llu + %llu\n",
- data_size,
- GNUNET_ntohll (sets.data_size),
- sizeof (sets));
-
cdata = data;
struct GNUNET_CREDENTIAL_DelegationSetRecord set[ntohl(sets.set_count)];
if (GNUNET_OK != GNUNET_CREDENTIAL_delegation_set_deserialize (GNUNET_ntohll (sets.data_size),
strlen (subject_pkey),
&set[i].subject_key);
if (2 == matches) {
- GNUNET_log (GNUNET_ERROR_TYPE_ERROR,
- "Adding %s (data size %llu)\n",
- attr_str,
- tmp_data_size);
- /*GNUNET_memcpy (&set[1],
- attr_str,
- strlen (attr_str)+1);*/
set[i].subject_attribute_len = strlen (attr_str) + 1;
- set[i].subject_attribute = GNUNET_strdup (attr_str);//(const char*)&set[1];
+ set[i].subject_attribute = GNUNET_strdup (attr_str);
}
token = strtok (NULL , ",");
}
#define GNUNET_REST_JSONAPI_CREDENTIAL_TYPEINFO "credential"
-#define GNUNET_REST_JSONAPI_CREDENTIAL_CHAIN "chain"
+#define GNUNET_REST_JSONAPI_DELEGATIONS "delegations"
#define GNUNET_REST_JSONAPI_CREDENTIAL_ISSUER_ATTR "attribute"
handle_verify_response (void *cls,
unsigned int d_count,
struct GNUNET_CREDENTIAL_Delegation *delegation_chain,
+ unsigned int c_count,
struct GNUNET_CREDENTIAL_Credential *cred)
{
struct GNUNET_JSONAPI_Resource *json_resource;
json_t *cred_obj;
json_t *attr_obj;
- json_t *result_array;
+ json_t *cred_array;
+ json_t *attr_array;
char *result;
uint32_t i;
json_resource = GNUNET_JSONAPI_resource_new (GNUNET_REST_JSONAPI_CREDENTIAL_TYPEINFO,
handle->issuer_attr);
cred_obj = credential_to_json (cred);
- result_array = json_array ();
+ attr_array = json_array ();
for (i = 0; i < d_count; i++)
{
attr_obj = attribute_delegation_to_json (&delegation_chain[i]);
- json_array_append (result_array, attr_obj);
+ json_array_append (attr_array, attr_obj);
json_decref (attr_obj);
}
+ cred_array = json_array ();
+ for (i=0;i<c_count;i++)
+ {
+ cred_obj = credential_to_json (&cred[i]);
+ json_array_append (cred_array, cred_obj);
+ json_decref (cred_obj);
+ }
GNUNET_JSONAPI_resource_add_attr (json_resource,
GNUNET_REST_JSONAPI_CREDENTIAL,
- cred_obj);
+ cred_array);
GNUNET_JSONAPI_resource_add_attr (json_resource,
- GNUNET_REST_JSONAPI_CREDENTIAL_CHAIN,
- result_array);
+ GNUNET_REST_JSONAPI_DELEGATIONS,
+ attr_array);
GNUNET_JSONAPI_document_resource_add (json_document, json_resource);
GNUNET_JSONAPI_document_serialize (json_document, &result);
GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
"Result %s\n",
result);
- json_decref (result_array);
+ json_decref (attr_array);
+ json_decref (cred_array);
GNUNET_JSONAPI_document_delete (json_document);
resp = GNUNET_REST_create_response (result);
handle->proc (handle->proc_cls, resp, MHD_HTTP_OK);
which timeout &> /dev/null && DO_TIMEOUT="timeout 30"
-#gnunet-arm -s -c test_credential_lookup.conf
+gnunet-arm -s -c test_credential_lookup.conf
gnunet-identity -C service -c test_credential_lookup.conf
gnunet-identity -C alice -c test_credential_lookup.conf
gnunet-identity -C gnu -c test_credential_lookup.conf
# (1) A service assigns the attribute "user" to all entities that have been assigned "member" by entities that werde assigned "project" from GNU
gnunet-namestore -p -z service -a -n $USER_ATTR -t ATTR -V "$GNU_KEY $GNU_PROJECT_ATTR.$MEMBER_ATTR" -e 5m -c test_credential_lookup.conf
-valgrind gnunet-namestore -D -z service -c test_credential_lookup.conf
-
# (2) GNU recognized GNUnet as a GNU project and delegates the "project" attribute
gnunet-namestore -p -z gnu -a -n $GNU_PROJECT_ATTR -t ATTR -V "$GNUNET_KEY" -e 5m -c test_credential_lookup.conf
};
-/**
- * The attribute delegation record
-*/
-struct GNUNET_CREDENTIAL_AttributeRecordData {
-
- /**
- * Public key of the subject this attribute was delegated to
- */
- struct GNUNET_CRYPTO_EcdsaPublicKey subject_key;
-
- /**
- * Followed by the attribute that was delegated to as string
- * May be empty
- */
-};
-
/**
* The attribute delegation record
*/
* Iterator called on obtained result for an attribute verification.
*
* @param cls closure
- * @param issuer the issuer of the attribute NULL if verification failed
- * @param result the result of the verification
- * @param rd the records in reply
+ * @param d_count the number of delegations processed
+ * @param delegation_chain the delegations processed
+ * @param c_count the number of credentials found
+ * @param credential the credentials
*/
typedef void (*GNUNET_CREDENTIAL_VerifyResultProcessor) (void *cls,
unsigned int d_count,
struct GNUNET_CREDENTIAL_Delegation *delegation_chain,
+ unsigned int c_count,
struct GNUNET_CREDENTIAL_Credential *credential);
/**