From baf9b5d76c4b40d6bd2869525656ad298ead7726 Mon Sep 17 00:00:00 2001 From: "Schanzenbach, Martin" Date: Thu, 29 Dec 2016 15:48:43 +0100 Subject: -add tokens for credentials --- src/credential/credential_serialization.c | 4 ++-- src/credential/gnunet-service-credential.c | 30 ++++++++++++++++++++++++++++-- 2 files changed, 30 insertions(+), 4 deletions(-) (limited to 'src/credential') diff --git a/src/credential/credential_serialization.c b/src/credential/credential_serialization.c index 76bf491c9..1fc72c203 100644 --- a/src/credential/credential_serialization.c +++ b/src/credential/credential_serialization.c @@ -192,7 +192,7 @@ GNUNET_CREDENTIAL_credentials_serialize (unsigned int c_count, c_rec.signature = cd[i].signature; c_rec.purpose.purpose = htonl (GNUNET_SIGNATURE_PURPOSE_CREDENTIAL); c_rec.purpose.size = htonl ((sizeof (struct CredentialEntry) + cd[i].issuer_attribute_len) - sizeof (struct GNUNET_CRYPTO_EcdsaSignature)); - c_rec.expiration = htonl ((uint32_t) cd[i].expiration.abs_value_us); + c_rec.expiration = GNUNET_htonll (cd[i].expiration.abs_value_us); if (off + sizeof (c_rec) > dest_size) return -1; GNUNET_memcpy (&dest[off], @@ -241,7 +241,7 @@ GNUNET_CREDENTIAL_credentials_deserialize (size_t len, cd[i].issuer_key = c_rec.issuer_key; cd[i].subject_key = c_rec.subject_key; cd[i].signature = c_rec.signature; - cd[i].expiration.abs_value_us = ntohl((uint32_t) c_rec.expiration); + cd[i].expiration.abs_value_us = GNUNET_ntohll(c_rec.expiration); off += sizeof (c_rec); if (off + cd[i].issuer_attribute_len > len) return GNUNET_SYSERR; diff --git a/src/credential/gnunet-service-credential.c b/src/credential/gnunet-service-credential.c index ec89da323..75ed6d5da 100644 --- a/src/credential/gnunet-service-credential.c +++ b/src/credential/gnunet-service-credential.c @@ -92,7 +92,11 @@ struct CredentialRecordEntry * DLL */ struct CredentialRecordEntry *prev; - + + /** + * Number of references in delegation chains + */ + uint32_t refcount; /** * Payload @@ -485,6 +489,7 @@ send_lookup_response (struct VerifyRequestHandle *vrh) struct GNUNET_CREDENTIAL_Delegation dd[vrh->delegation_chain_size]; struct GNUNET_CREDENTIAL_Credential cred[vrh->cred_chain_size]; struct CredentialRecordEntry *cd; + struct CredentialRecordEntry *tmp; size_t size; int i; @@ -507,6 +512,26 @@ send_lookup_response (struct VerifyRequestHandle *vrh) dce = dce->next; } + /** + * Remove all credentials not needed + */ + for (cd = vrh->cred_chain_head; NULL != cd;) + { + if (cd->refcount > 0) + { + cd = cd->next; + continue; + } + tmp = cd; + cd = cd->next; + GNUNET_CONTAINER_DLL_remove (vrh->cred_chain_head, + vrh->cred_chain_tail, + tmp); + GNUNET_free (tmp->credential); + GNUNET_free (tmp); + vrh->cred_chain_size--; + } + /** * Get serialized record data * Append at the end of rmsg @@ -681,7 +706,7 @@ backward_resolution (void* cls, GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, "Found issuer\n"); - + cred_pointer->refcount++; //Backtrack for (tmp_set = ds_entry; NULL != tmp_set->parent_queue_entry; @@ -796,6 +821,7 @@ delegation_chain_resolution_start (void* cls) continue; if (0 != strcmp (cr_entry->credential->issuer_attribute, vrh->issuer_attribute)) continue; + cr_entry->refcount++; //Found match prematurely send_lookup_response (vrh); return; -- cgit v1.2.3