aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorChristian Grothoff <christian@grothoff.org>2014-06-07 00:24:59 +0000
committerChristian Grothoff <christian@grothoff.org>2014-06-07 00:24:59 +0000
commit222e534eed64a24d843e0ee676579ea9b6264bbc (patch)
tree697ecd3137dbb87428be857fad1134787fc951bc
parent0925fad2014e4910d44bb4d9d9681da4e6962e49 (diff)
more tlsa fixes
-rw-r--r--src/dns/dnsparser.c37
-rw-r--r--src/gnsrecord/plugin_gnsrecord_dns.c39
-rw-r--r--src/include/gnunet_dnsparser_lib.h27
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