From 56ac8e5c6628c5f89c538149da966eb52a95b8f2 Mon Sep 17 00:00:00 2001 From: Christian Grothoff Date: Tue, 25 Aug 2015 18:41:44 +0000 Subject: [PATCH] support RFC4043 and RFC 4398 mnemonics in conversion --- src/gnsrecord/plugin_gnsrecord_dns.c | 88 ++++++++++++++++++++++++---- 1 file changed, 78 insertions(+), 10 deletions(-) diff --git a/src/gnsrecord/plugin_gnsrecord_dns.c b/src/gnsrecord/plugin_gnsrecord_dns.c index 65ce9b0df..63fdce5f3 100644 --- a/src/gnsrecord/plugin_gnsrecord_dns.c +++ b/src/gnsrecord/plugin_gnsrecord_dns.c @@ -258,6 +258,74 @@ dns_value_to_string (void *cls, } +/** + * Convert RFC 4394 Mnemonics to the corresponding integer values. + * + * @param mnemonic string to look up + * @return the value, 0 if not found + */ +static unsigned int +rfc4394_mnemonic_to_value (const char *mnemonic) +{ + static struct { + const char *mnemonic; + unsigned int val; + } table[] = { + { "PKIX", 1 }, + { "SPKI", 2 }, + { "PGP", 3 }, + { "IPKIX", 4 }, + { "ISPKI", 5 }, + { "IPGP", 6 }, + { "ACPKIX", 7}, + { "IACPKIX", 8}, + { "URI", 253}, + { "OID", 254}, + { NULL, 0 } + }; + unsigned int i; + + for (i=0;NULL != table[i].mnemonic;i++) + if (0 == strcasecmp (mnemonic, + table[i].mnemonic)) + return table[i].val; + return 0; +} + + +/** + * Convert RFC 4034 algorithm types to the corresponding integer values. + * + * @param mnemonic string to look up + * @return the value, 0 if not found + */ +static unsigned int +rfc4034_mnemonic_to_value (const char *mnemonic) +{ + static struct { + const char *mnemonic; + unsigned int val; + } table[] = { + { "RSAMD5", 1 }, + { "DH", 2 }, + { "DSA", 3 }, + { "ECC", 4 }, + { "RSASHA1", 5 }, + { "INDIRECT", 252 }, + { "PRIVATEDNS", 253 }, + { "PRIVATEOID", 254 }, + { NULL, 0 } + }; + unsigned int i; + + for (i=0;NULL != table[i].mnemonic;i++) + if (0 == strcasecmp (mnemonic, + table[i].mnemonic)) + return table[i].val; + return 0; +} + + /** * Convert human-readable version of a 'value' of a record to the binary * representation. @@ -356,12 +424,12 @@ dns_string_to_value (void *cls, sdup = GNUNET_strdup (s); typep = strtok (sdup, " "); - /* TODO: add typep mnemonic conversion according to RFC 4398 */ if ( (NULL == typep) || - (1 != SSCANF (typep, - "%u", - &type)) || - (type > UINT16_MAX) ) + ( (0 == (type = rfc4394_mnemonic_to_value (typep))) && + ( (1 != SSCANF (typep, + "%u", + &type)) || + (type > UINT16_MAX) ) ) ) { GNUNET_free (sdup); return GNUNET_SYSERR; @@ -377,12 +445,12 @@ dns_string_to_value (void *cls, return GNUNET_SYSERR; } algp = strtok (NULL, " "); - /* TODO: add algp mnemonic conversion according to RFC 4398/RFC 4034 */ if ( (NULL == algp) || - (1 != sscanf (algp, - "%u", - &alg)) || - (alg > UINT8_MAX) ) + ( (0 == (type = rfc4034_mnemonic_to_value (typep))) && + ( (1 != sscanf (algp, + "%u", + &alg)) || + (alg > UINT8_MAX) ) ) ) { GNUNET_free (sdup); return GNUNET_SYSERR; -- 2.25.1