X-Git-Url: https://git.librecmc.org/?a=blobdiff_plain;f=src%2Fcredential%2Fplugin_gnsrecord_credential.c;h=342790b7ae959711ab272e7753b1201b55aea85f;hb=f46c107278b96264b2e5302b4ebb050f73abf869;hp=1358afdb13f8e980ff5740ee0834a4976b3a0012;hpb=73a127e962c5ecbfc002b1b0c9ea9cf441591c6d;p=oweals%2Fgnunet.git diff --git a/src/credential/plugin_gnsrecord_credential.c b/src/credential/plugin_gnsrecord_credential.c index 1358afdb1..342790b7a 100644 --- a/src/credential/plugin_gnsrecord_credential.c +++ b/src/credential/plugin_gnsrecord_credential.c @@ -21,7 +21,7 @@ /** * @file credential/plugin_gnsrecord_credential.c * @brief gnsrecord plugin to provide the API for CREDENTIAL records - * @author Adnan Husain + * @author Martin Schanzenbach */ #include "platform.h" @@ -31,7 +31,7 @@ #include "gnunet_gnsrecord_plugin.h" #include "gnunet_signatures.h" #include "credential_serialization.h" - +#include "credential_misc.h" /** * Convert the 'value' of a record to a string. @@ -55,18 +55,18 @@ credential_value_to_string (void *cls, { case GNUNET_GNSRECORD_TYPE_ATTRIBUTE: { - struct GNUNET_CREDENTIAL_DelegationRecordData sets; + struct GNUNET_CREDENTIAL_DelegationRecord sets; char *attr_str; char *subject_pkey; char *tmp_str; int i; - if (data_size < sizeof (struct GNUNET_CREDENTIAL_DelegationRecordData)) + if (data_size < sizeof (struct GNUNET_CREDENTIAL_DelegationRecord)) return NULL; /* malformed */ memcpy (&sets, data, sizeof (sets)); cdata = data; - struct GNUNET_CREDENTIAL_DelegationSetRecord set[ntohl(sets.set_count)]; + struct GNUNET_CREDENTIAL_DelegationSet set[ntohl(sets.set_count)]; if (GNUNET_OK != GNUNET_CREDENTIAL_delegation_set_deserialize (GNUNET_ntohll (sets.data_size), &cdata[sizeof (sets)], ntohl (sets.set_count), @@ -76,7 +76,7 @@ credential_value_to_string (void *cls, for (i=0;i %s | %s | %s", - issuer_pkey, - &cdata[sizeof (cred)], - subject_pkey, - signature, - expiration); - GNUNET_free (subject_pkey); - GNUNET_free (issuer_pkey); - GNUNET_free (signature); + cred = GNUNET_CREDENTIAL_credential_deserialize (data, + data_size); + cred_str = GNUNET_CREDENTIAL_credential_to_string (cred); + GNUNET_free (cred); return cred_str; } + case GNUNET_GNSRECORD_TYPE_POLICY: + { + return GNUNET_strndup (data,data_size); + } default: return NULL; } @@ -180,7 +159,7 @@ credential_string_to_value (void *cls, { case GNUNET_GNSRECORD_TYPE_ATTRIBUTE: { - struct GNUNET_CREDENTIAL_DelegationRecordData *sets; + struct GNUNET_CREDENTIAL_DelegationRecord *sets; char attr_str[253 + 1]; char subject_pkey[52 + 1]; char *token; @@ -194,7 +173,7 @@ credential_string_to_value (void *cls, token = strtok (tmp_str, ","); entries = 0; tmp_data_size = 0; - *data_size = sizeof (struct GNUNET_CREDENTIAL_DelegationRecordData); + *data_size = sizeof (struct GNUNET_CREDENTIAL_DelegationRecord); while (NULL != token) { matches = SSCANF (token, @@ -210,9 +189,9 @@ credential_string_to_value (void *cls, return GNUNET_SYSERR; } if (1 == matches) { - tmp_data_size += sizeof (struct GNUNET_CREDENTIAL_DelegationSetRecord); + tmp_data_size += sizeof (struct GNUNET_CREDENTIAL_DelegationRecordSet); } else if (2 == matches) { - tmp_data_size += sizeof (struct GNUNET_CREDENTIAL_DelegationSetRecord) + strlen (attr_str) + 1; + tmp_data_size += sizeof (struct GNUNET_CREDENTIAL_DelegationRecordSet) + strlen (attr_str) + 1; } entries++; token = strtok (NULL, ","); @@ -220,8 +199,7 @@ credential_string_to_value (void *cls, GNUNET_free (tmp_str); tmp_str = GNUNET_strdup (s); token = strtok (tmp_str, ","); - struct GNUNET_CREDENTIAL_DelegationSetRecord *set; - set = GNUNET_malloc (entries * sizeof (struct GNUNET_CREDENTIAL_DelegationSetRecord)); + struct GNUNET_CREDENTIAL_DelegationSet set[entries]; for (i=0;iset_count = htonl (entries); sets->data_size = GNUNET_htonll (tmp_data_size); @@ -255,58 +239,17 @@ credential_string_to_value (void *cls, } case GNUNET_GNSRECORD_TYPE_CREDENTIAL: { - struct GNUNET_CREDENTIAL_CredentialRecordData *cred; - - size_t enclen = (sizeof (struct GNUNET_CRYPTO_EcdsaPublicKey)) * 8; - if (enclen % 5 > 0) - enclen += 5 - enclen % 5; - enclen /= 5; /* 260/5 = 52 */ - char subject_pkey[enclen + 1]; - char issuer_pkey[enclen + 1]; - char name[253 + 1]; - char signature[128]; //TODO max payload size - char expiration[256]; - - struct GNUNET_CRYPTO_EcdsaSignature *sig; - struct GNUNET_TIME_Absolute etime_abs; - - if (5 != SSCANF (s, - "%52s.%253s -> %52s | %s | %255[0-9a-zA-Z: ]", - issuer_pkey, - name, - subject_pkey, - signature, - expiration)) - { - GNUNET_log (GNUNET_ERROR_TYPE_ERROR, - _("Unable to parse CRED record string `%s'\n"), - s); - return GNUNET_SYSERR; - } - *data_size = sizeof (struct GNUNET_CREDENTIAL_CredentialRecordData) + strlen (name) + 1; - *data = cred = GNUNET_malloc (*data_size); - GNUNET_CRYPTO_ecdsa_public_key_from_string (subject_pkey, - strlen (subject_pkey), - &cred->subject_key); - GNUNET_CRYPTO_ecdsa_public_key_from_string (issuer_pkey, - strlen (issuer_pkey), - &cred->issuer_key); - GNUNET_STRINGS_fancy_time_to_absolute (expiration, - &etime_abs); - GNUNET_STRINGS_base64_decode (signature, - strlen (signature), - (char**)&sig); - cred->signature = *sig; - cred->expiration = GNUNET_htonll (etime_abs.abs_value_us); - cred->purpose.purpose = htonl (GNUNET_SIGNATURE_PURPOSE_CREDENTIAL); - cred->purpose.size = htonl (strlen (name) + 1 + sizeof (struct GNUNET_CRYPTO_EccSignaturePurpose) + - sizeof (struct GNUNET_CRYPTO_EcdsaPublicKey) + sizeof (uint64_t)); - GNUNET_free (sig); - GNUNET_memcpy (&cred[1], - name, - strlen (name)); - + struct GNUNET_CREDENTIAL_Credential *cred; + cred = GNUNET_CREDENTIAL_credential_from_string (s); + *data_size = GNUNET_CREDENTIAL_credential_serialize (cred, + (char**)data); + return GNUNET_OK; + } + case GNUNET_GNSRECORD_TYPE_POLICY: + { + *data_size = strlen (s); + *data = GNUNET_strdup (s); return GNUNET_OK; } default: @@ -325,6 +268,7 @@ static struct { } name_map[] = { { "CRED", GNUNET_GNSRECORD_TYPE_CREDENTIAL }, { "ATTR", GNUNET_GNSRECORD_TYPE_ATTRIBUTE }, + { "POLICY", GNUNET_GNSRECORD_TYPE_POLICY }, { NULL, UINT32_MAX } };