X-Git-Url: https://git.librecmc.org/?a=blobdiff_plain;f=src%2Fcredential%2Fplugin_gnsrecord_credential.c;h=281113a3461dd280d07ac3c71b26027cf4f9a325;hb=490a5b6451470aef6a5a963e4ccef3b2ca5cd326;hp=67fd32e4967c9f20e0f3a6acddbdef64f9de0c98;hpb=fcb5ecaede036d2bb89e5123345fd391520c344a;p=oweals%2Fgnunet.git diff --git a/src/credential/plugin_gnsrecord_credential.c b/src/credential/plugin_gnsrecord_credential.c index 67fd32e49..281113a34 100644 --- a/src/credential/plugin_gnsrecord_credential.c +++ b/src/credential/plugin_gnsrecord_credential.c @@ -29,6 +29,7 @@ #include "gnunet_gnsrecord_lib.h" #include "gnunet_credential_service.h" #include "gnunet_gnsrecord_plugin.h" +#include "gnunet_signatures.h" /** @@ -64,19 +65,29 @@ credential_value_to_string (void *cls, sizeof (attr)); cdata = data; subject_pkey = GNUNET_CRYPTO_ecdsa_public_key_to_string (&attr.subject_key); - GNUNET_asprintf (&attr_str, - "%s.%s", - subject_pkey, - &cdata[sizeof (attr)]); + if (data_size == sizeof (struct GNUNET_CREDENTIAL_AttributeRecordData)) + { + return subject_pkey; + } else { + GNUNET_asprintf (&attr_str, + "%s %s", + subject_pkey, + &cdata[sizeof (attr)]); + } GNUNET_free (subject_pkey); return attr_str; } case GNUNET_GNSRECORD_TYPE_CREDENTIAL: { struct GNUNET_CREDENTIAL_CredentialRecordData cred; + struct GNUNET_TIME_Absolute etime_abs; char *cred_str; char *subject_pkey; char *issuer_pkey; + char *signature; + const char *expiration; + + if (data_size < sizeof (struct GNUNET_CREDENTIAL_CredentialRecordData)) return NULL; /* malformed */ memcpy (&cred, @@ -85,15 +96,21 @@ credential_value_to_string (void *cls, cdata = data; subject_pkey = GNUNET_CRYPTO_ecdsa_public_key_to_string (&cred.subject_key); issuer_pkey = GNUNET_CRYPTO_ecdsa_public_key_to_string (&cred.issuer_key); - + etime_abs.abs_value_us = GNUNET_ntohll(cred.expiration); + expiration = GNUNET_STRINGS_absolute_time_to_string (etime_abs); + GNUNET_STRINGS_base64_encode ((char*)&cred.signature, + sizeof (struct GNUNET_CRYPTO_EcdsaSignature), + &signature); GNUNET_asprintf (&cred_str, - "%s %s %s", - subject_pkey, + "%s.%s -> %s | %s | %s", issuer_pkey, - &cdata[sizeof (cred)]); + &cdata[sizeof (cred)], + subject_pkey, + signature, + expiration); GNUNET_free (subject_pkey); GNUNET_free (issuer_pkey); - + GNUNET_free (signature); return cred_str; } default: @@ -124,6 +141,41 @@ credential_string_to_value (void *cls, return GNUNET_SYSERR; switch (type) { + case GNUNET_GNSRECORD_TYPE_ATTRIBUTE: + { + struct GNUNET_CREDENTIAL_AttributeRecordData *attr; + char attr_str[253 + 1]; + char subject_pkey[52 + 1]; + int matches = 0; + matches = SSCANF (s, + "%s %s", + subject_pkey, + attr_str); + if (0 == matches) + { + GNUNET_log (GNUNET_ERROR_TYPE_ERROR, + _("Unable to parse ATTR record string `%s'\n"), + s); + return GNUNET_SYSERR; + + } + if (1 == matches) { + *data_size = sizeof (struct GNUNET_CREDENTIAL_AttributeRecordData); + } else if (2 == matches) { + *data_size = sizeof (struct GNUNET_CREDENTIAL_AttributeRecordData) + strlen (attr_str) + 1; + } + *data = attr = GNUNET_malloc (*data_size); + GNUNET_CRYPTO_ecdsa_public_key_from_string (subject_pkey, + strlen (subject_pkey), + &attr->subject_key); + if (NULL != attr_str) + GNUNET_memcpy (&attr[1], + attr_str, + strlen (attr_str)); + + + return GNUNET_OK; + } case GNUNET_GNSRECORD_TYPE_CREDENTIAL: { struct GNUNET_CREDENTIAL_CredentialRecordData *cred; @@ -135,12 +187,19 @@ credential_string_to_value (void *cls, 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 %52s %253s", - subject_pkey, + "%52s.%253s -> %52s | %s | %255[0-9a-zA-Z: ]", issuer_pkey, - name)) + name, + subject_pkey, + signature, + expiration)) { GNUNET_log (GNUNET_ERROR_TYPE_ERROR, _("Unable to parse CRED record string `%s'\n"), @@ -155,13 +214,22 @@ credential_string_to_value (void *cls, 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)); - *data = GNUNET_strdup (s); - *data_size = strlen (s); return GNUNET_OK; } default: @@ -179,6 +247,7 @@ static struct { uint32_t number; } name_map[] = { { "CRED", GNUNET_GNSRECORD_TYPE_CREDENTIAL }, + { "ATTR", GNUNET_GNSRECORD_TYPE_ATTRIBUTE }, { NULL, UINT32_MAX } };