diff options
author | Christian Grothoff <christian@grothoff.org> | 2014-06-07 00:24:59 +0000 |
---|---|---|
committer | Christian Grothoff <christian@grothoff.org> | 2014-06-07 00:24:59 +0000 |
commit | 222e534eed64a24d843e0ee676579ea9b6264bbc (patch) | |
tree | 697ecd3137dbb87428be857fad1134787fc951bc | |
parent | 0925fad2014e4910d44bb4d9d9681da4e6962e49 (diff) |
more tlsa fixes
-rw-r--r-- | src/dns/dnsparser.c | 37 | ||||
-rw-r--r-- | src/gnsrecord/plugin_gnsrecord_dns.c | 39 | ||||
-rw-r--r-- | src/include/gnunet_dnsparser_lib.h | 27 |
3 files changed, 91 insertions, 12 deletions
diff --git a/src/dns/dnsparser.c b/src/dns/dnsparser.c index 338591644b..97f47333b5 100644 --- a/src/dns/dnsparser.c +++ b/src/dns/dnsparser.c @@ -1,6 +1,6 @@ /* This file is part of GNUnet - (C) 2010-2013 Christian Grothoff (and other contributing authors) + (C) 2010-2014 Christian Grothoff (and other contributing authors) GNUnet is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published @@ -1229,4 +1229,39 @@ GNUNET_DNSPARSER_pack (const struct GNUNET_DNSPARSER_Packet *p, return GNUNET_OK; } + +/** + * Convert a block of binary data to HEX. + * + * @param data binary data to convert + * @param data_size number of bytes in @a data + * @return HEX string (lower case) + */ +char * +GNUNET_DNSPARSER_bin_to_hex (const void *data, + size_t data_size) +{ + GNUNET_break (0); // FIXME: not implemented + return NULL; +} + + +/** + * Convert a HEX string to block of binary data. + * + * @param hex HEX string to convert (may contain mixed case) + * @param data where to write result, must be + * at least `strlen(hex)/2` bytes long + * @return number of bytes written to data + */ +size_t +GNUNET_DNSPARSER_hex_to_bin (const char *hex, + void *data) +{ + GNUNET_break (0); // FIXME: not implemented + return 0; +} + + + /* end of dnsparser.c */ diff --git a/src/gnsrecord/plugin_gnsrecord_dns.c b/src/gnsrecord/plugin_gnsrecord_dns.c index b52dee3745..b55d595d43 100644 --- a/src/gnsrecord/plugin_gnsrecord_dns.c +++ b/src/gnsrecord/plugin_gnsrecord_dns.c @@ -44,7 +44,6 @@ dns_value_to_string (void *cls, const void *data, size_t data_size) { - const char *cdata; char* result; char tmp[INET6_ADDRSTRLEN]; @@ -231,23 +230,26 @@ dns_value_to_string (void *cls, case GNUNET_DNSPARSER_TYPE_TLSA: { const struct GNUNET_TUN_DnsTlsaRecord *tlsa; - char* tlsa_str; + char *tlsa_str; + char *hex; - cdata = data; - if ( (data_size <= sizeof (struct GNUNET_TUN_DnsTlsaRecord)) || - ('\0' != cdata[data_size - 1]) ) + if (data_size < sizeof (struct GNUNET_TUN_DnsTlsaRecord)) return NULL; /* malformed */ tlsa = data; + hex = GNUNET_DNSPARSER_bin_to_hex (&tlsa[1], + data_size - sizeof (struct GNUNET_TUN_DnsTlsaRecord)); if (0 == GNUNET_asprintf (&tlsa_str, "%u %u %u %s", (unsigned int) tlsa->usage, (unsigned int) tlsa->selector, (unsigned int) tlsa->matching_type, - (const char *) &tlsa[1])) + hex)) { + GNUNET_free (hex); GNUNET_free (tlsa_str); return NULL; } + GNUNET_free (hex); return tlsa_str; } default: @@ -603,23 +605,40 @@ dns_string_to_value (void *cls, unsigned int usage; unsigned int selector; unsigned int matching_type; + size_t slen = strlen (s) + 1; + char hex[slen]; - *data_size = sizeof (struct GNUNET_TUN_DnsTlsaRecord) + strlen (s) - 6; - *data = tlsa = GNUNET_malloc (*data_size); if (4 != SSCANF (s, "%u %u %u %s", - (char*)&tlsa[1])) + &usage, + &selector, + &matching_type, + hex)) { GNUNET_log (GNUNET_ERROR_TYPE_ERROR, _("Unable to parse TLSA record string `%s'\n"), s); *data_size = 0; - GNUNET_free (tlsa); return GNUNET_SYSERR; } + + *data_size = sizeof (struct GNUNET_TUN_DnsTlsaRecord) + strlen (hex) / 2; + *data = tlsa = GNUNET_malloc (*data_size); tlsa->usage = (uint8_t) usage; tlsa->selector = (uint8_t) selector; tlsa->matching_type = (uint8_t) matching_type; + if (strlen (hex) / 2 != + GNUNET_DNSPARSER_hex_to_bin (hex, + &tlsa[1])) + { + GNUNET_log (GNUNET_ERROR_TYPE_ERROR, + _("Unable to parse TLSA record string `%s'\n"), + s); + GNUNET_free (*data); + *data = NULL; + *data_size = 0; + return GNUNET_SYSERR; + } return GNUNET_OK; } default: diff --git a/src/include/gnunet_dnsparser_lib.h b/src/include/gnunet_dnsparser_lib.h index fc4b7444ee..2684a794b1 100644 --- a/src/include/gnunet_dnsparser_lib.h +++ b/src/include/gnunet_dnsparser_lib.h @@ -1,6 +1,6 @@ /* This file is part of GNUnet - (C) 2010-2013 Christian Grothoff (and other contributing authors) + (C) 2010-2014 Christian Grothoff (and other contributing authors) GNUnet is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published @@ -859,4 +859,29 @@ void GNUNET_DNSPARSER_free_cert (struct GNUNET_DNSPARSER_CertRecord *cert); +/** + * Convert a block of binary data to HEX. + * + * @param data binary data to convert + * @param data_size number of bytes in @a data + * @return HEX string (lower case) + */ +char * +GNUNET_DNSPARSER_bin_to_hex (const void *data, + size_t data_size); + + +/** + * Convert a HEX string to block of binary data. + * + * @param hex HEX string to convert (may contain mixed case) + * @param data where to write result, must be + * at least `strlen(hex)/2` bytes long + * @return number of bytes written to data + */ +size_t +GNUNET_DNSPARSER_hex_to_bin (const char *hex, + void *data); + + #endif |