ldns_status
ldns_rdf2buffer_str_alg(ldns_buffer *output, const ldns_rdf *rdf)
{
- /* don't use algorithm mnemonics in the presentation format
- this kind of got sneaked into the rfc's */
- uint8_t data = ldns_rdf_data(rdf)[0];
- ldns_buffer_printf(output, "%d", data);
- return ldns_buffer_status(output);
+ return ldns_rdf2buffer_str_int8(output, rdf);
}
static void
case LDNS_RDF_TYPE_DNAME:
res = ldns_rdf2buffer_str_dname(buffer, rdf);
break;
- case LDNS_RDF_TYPE_INT8:
+ case LDNS_RDF_TYPE_INT8: /* Don't output mnemonics for these */
+ case LDNS_RDF_TYPE_ALG:
+ case LDNS_RDF_TYPE_CERTIFICATE_USAGE:
+ case LDNS_RDF_TYPE_SELECTOR:
+ case LDNS_RDF_TYPE_MATCHING_TYPE:
res = ldns_rdf2buffer_str_int8(buffer, rdf);
break;
case LDNS_RDF_TYPE_INT16:
case LDNS_RDF_TYPE_CERT_ALG:
res = ldns_rdf2buffer_str_cert_alg(buffer, rdf);
break;
- case LDNS_RDF_TYPE_ALG:
- res = ldns_rdf2buffer_str_alg(buffer, rdf);
- break;
case LDNS_RDF_TYPE_UNKNOWN:
res = ldns_rdf2buffer_str_unknown(buffer, rdf);
break;
*/
LDNS_RDF_TYPE_LONG_STR,
+ /** Since RFC7218 TLSA records can be given with mnemonics,
+ * hence these rdata field types. But as with DNSKEYs, the output
+ * is always numeric.
+ */
+ LDNS_RDF_TYPE_CERTIFICATE_USAGE,
+ LDNS_RDF_TYPE_SELECTOR,
+ LDNS_RDF_TYPE_MATCHING_TYPE,
+
/* Aliases */
LDNS_RDF_TYPE_BITMAP = LDNS_RDF_TYPE_NSEC
};
ldns_status ldns_str2rdf_cert_alg(ldns_rdf **rd, const char *str);
/**
- * convert and algorithm value into wireformat
+ * convert an algorithm value into wireformat
* \param[in] rd the rdf where to put the data
* \param[in] str the string to be converted
* \return ldns_status
*/
ldns_status ldns_str2rdf_alg(ldns_rdf **rd, const char *str);
+/**
+ * convert a tlsa certificate usage value into wireformat
+ * \param[in] rd the rdf where to put the data
+ * \param[in] str the string to be converted
+ * \return ldns_status
+ */
+ldns_status ldns_str2rdf_certificate_usage(ldns_rdf **rd, const char *str);
+
+/**
+ * convert a tlsa selector value into wireformat
+ * \param[in] rd the rdf where to put the data
+ * \param[in] str the string to be converted
+ * \return ldns_status
+ */
+ldns_status ldns_str2rdf_selector(ldns_rdf **rd, const char *str);
+
+/**
+ * convert a tlsa matching type value into wireformat
+ * \param[in] rd the rdf where to put the data
+ * \param[in] str the string to be converted
+ * \return ldns_status
+ */
+ldns_status ldns_str2rdf_matching_type(ldns_rdf **rd, const char *str);
+
/**
* convert a string with a unknown RR into wireformat
* \param[in] rd the rdf where to put the data
case LDNS_RDF_TYPE_LONG_STR:
status = ldns_str2rdf_long_str(&rdf, str);
break;
+ case LDNS_RDF_TYPE_CERTIFICATE_USAGE:
+ status = ldns_str2rdf_certificate_usage(&rdf, str);
+ break;
+ case LDNS_RDF_TYPE_SELECTOR:
+ status = ldns_str2rdf_selector(&rdf, str);
+ break;
+ case LDNS_RDF_TYPE_MATCHING_TYPE:
+ status = ldns_str2rdf_matching_type(&rdf, str);
+ break;
case LDNS_RDF_TYPE_NONE:
default:
/* default default ??? */
LDNS_RDF_TYPE_INT16_DATA
};
static const ldns_rdf_type type_tlsa_wireformat[] = {
- LDNS_RDF_TYPE_INT8,
- LDNS_RDF_TYPE_INT8,
- LDNS_RDF_TYPE_INT8,
+ LDNS_RDF_TYPE_CERTIFICATE_USAGE,
+ LDNS_RDF_TYPE_SELECTOR,
+ LDNS_RDF_TYPE_MATCHING_TYPE,
LDNS_RDF_TYPE_HEX
};
static const ldns_rdf_type type_hip_wireformat[] = {
return st;
}
+static ldns_lookup_table ldns_tlsa_certificate_usages[] = {
+ { LDNS_TLSA_USAGE_PKIX_TA , "PKIX-TA" },
+ { LDNS_TLSA_USAGE_PKIX_EE , "PKIX-EE" },
+ { LDNS_TLSA_USAGE_DANE_TA , "DANE-TA" },
+ { LDNS_TLSA_USAGE_DANE_EE , "DANE-EE" },
+ { LDNS_TLSA_USAGE_PRIVCERT , "PrivCert" }
+};
+
+static ldns_lookup_table ldns_tlsa_selectors[] = {
+ { LDNS_TLSA_SELECTOR_CERT , "Cert" },
+ { LDNS_TLSA_SELECTOR_SPKI , "SPKI" },
+ { LDNS_TLSA_SELECTOR_PRIVSEL , "PrivSel" }
+};
+
+static ldns_lookup_table ldns_tlsa_matching_types[] = {
+ { LDNS_TLSA_MATCHING_TYPE_FULL , "Full" },
+ { LDNS_TLSA_MATCHING_TYPE_SHA2_256 , "SHA2-256" },
+ { LDNS_TLSA_MATCHING_TYPE_SHA2_512 , "SHA2-512" },
+ { LDNS_TLSA_MATCHING_TYPE_PRIVMATCH , "PrivMatch" }
+};
+
+static ldns_status
+ldns_str2rdf_mnemonic4int8(ldns_lookup_table *lt,
+ ldns_rdf **rd, const char *str)
+{
+ if ((lt = ldns_lookup_by_name(lt, str))) {
+ /* it was given as a integer */
+ *rd = ldns_native2rdf_int8(LDNS_RDF_TYPE_INT8, (uint8_t) lt->id);
+ if (!*rd)
+ return LDNS_STATUS_ERR;
+ else
+ return LDNS_STATUS_OK;
+ }
+ return ldns_str2rdf_int8(rd, str);
+}
+
/* An alg field can either be specified as a 8 bits number
* or by its symbolic name. Handle both
*/
ldns_status
ldns_str2rdf_alg(ldns_rdf **rd, const char *str)
{
- ldns_lookup_table *lt;
- ldns_status st;
+ return ldns_str2rdf_mnemonic4int8(ldns_algorithms, rd, str);
+}
- lt = ldns_lookup_by_name(ldns_algorithms, str);
- st = LDNS_STATUS_OK;
+ldns_status
+ldns_str2rdf_certificate_usage(ldns_rdf **rd, const char *str)
+{
+ return ldns_str2rdf_mnemonic4int8(
+ ldns_tlsa_certificate_usages, rd, str);
+}
- if (lt) {
- /* it was given as a integer */
- *rd = ldns_native2rdf_int8(LDNS_RDF_TYPE_INT8, (uint8_t) lt->id);
- if (!*rd) {
- st = LDNS_STATUS_ERR;
- }
- } else {
- /* try as-is (a number) */
- st = ldns_str2rdf_int8(rd, str);
- }
- return st;
+ldns_status
+ldns_str2rdf_selector(ldns_rdf **rd, const char *str)
+{
+ return ldns_str2rdf_mnemonic4int8(ldns_tlsa_selectors, rd, str);
+}
+
+ldns_status
+ldns_str2rdf_matching_type(ldns_rdf **rd, const char *str)
+{
+ return ldns_str2rdf_mnemonic4int8(ldns_tlsa_matching_types, rd, str);
}
ldns_status
break;
case LDNS_RDF_TYPE_CLASS:
case LDNS_RDF_TYPE_ALG:
+ case LDNS_RDF_TYPE_CERTIFICATE_USAGE:
+ case LDNS_RDF_TYPE_SELECTOR:
+ case LDNS_RDF_TYPE_MATCHING_TYPE:
case LDNS_RDF_TYPE_INT8:
cur_rdf_length = LDNS_RDF_SIZE_BYTE;
break;