unbound: util/data/dname.h File Reference

unbound 0.1

Macros | Functions
dname.h File Reference

This file contains functions to deal with domain names (dnames). More...

`#include "util/storage/lruhash.h"`

## Macros
#define | MAX_COMPRESS_PTRS 256
| max number of compression ptrs to follow

## Functions
size_t | query_dname_len (struct sldns_buffer *query)
| Determine length of dname in buffer, no compression ptrs allowed,.
size_t | dname_valid (uint8_t *dname, size_t len)
| Determine if dname in memory is correct.
void | query_dname_tolower (uint8_t *dname)
| lowercase query dname
void | pkt_dname_tolower (struct sldns_buffer *pkt, uint8_t *dname)
| lowercase pkt dname (follows compression pointers)
int | query_dname_compare (uint8_t *d1, uint8_t *d2)
| Compare query dnames (uncompressed storage).
size_t | pkt_dname_len (struct sldns_buffer *pkt)
| Determine correct, compressed, dname present in packet.
int | dname_pkt_compare (struct sldns_buffer *pkt, uint8_t *d1, uint8_t *d2)
| Compare dnames in packet (compressed).
hashvalue_type | dname_query_hash (uint8_t *dname, hashvalue_type h)
| Hash dname, label by label, lowercasing, into hashvalue.
hashvalue_type | dname_pkt_hash (struct sldns_buffer *pkt, uint8_t *dname, hashvalue_type h)
| Hash dname, label by label, lowercasing, into hashvalue.
void | dname_pkt_copy (struct sldns_buffer *pkt, uint8_t *to, uint8_t *dname)
| Copy over a valid dname and decompress it.
int | dname_buffer_write (struct sldns_buffer *pkt, uint8_t *dname)
| Copy over a valid dname to a packet.
int | dname_count_labels (uint8_t *dname)
| Count the number of labels in an uncompressed dname in memory.
int | dname_count_size_labels (uint8_t *dname, size_t *size)
| Count labels and dname length both, for uncompressed dname in memory.
int | dname_lab_cmp (uint8_t *d1, int labs1, uint8_t *d2, int labs2, int *mlabs)
| Compare dnames, sorted not canonical, but by label.
int | dname_lab_startswith (uint8_t *label, char *prefix, char **endptr)
| Check if labels starts with given prefix.
int | dname_has_label (uint8_t *dname, size_t dnamelen, uint8_t *label)
| Check if dname contains label.
int | dname_strict_subdomain (uint8_t *d1, int labs1, uint8_t *d2, int labs2)
| See if domain name d1 is a strict subdomain of d2.
int | dname_strict_subdomain_c (uint8_t *d1, uint8_t *d2)
| Like dname_strict_subdomain but counts labels.
int | dname_subdomain_c (uint8_t *d1, uint8_t *d2)
| Counts labels.
void | dname_print (FILE *out, struct sldns_buffer *pkt, uint8_t *dname)
| Debug helper.
void | dname_str (uint8_t *dname, char *str)
| Debug helper.
int | dname_is_root (uint8_t *dname)
| Returns true if the uncompressed wireformat dname is the root ".".
void | dname_remove_label (uint8_t **dname, size_t *len)
| Snip off first label from a dname, returning the parent zone.
void | dname_remove_labels (uint8_t **dname, size_t *len, int n)
| Snip off first N labels from a dname, returning the parent zone.
int | dname_signame_label_count (uint8_t *dname)
| Count labels for the RRSIG signature label field.
int | dname_is_wild (uint8_t *dname)
| Return true if the label is a wildcard, *.example.com.
int | dname_canon_lab_cmp (uint8_t *d1, int labs1, uint8_t *d2, int labs2, int *mlabs)
| Compare dnames, Canonical in rfc4034 sense, but by label.
int | dname_canonical_compare (uint8_t *d1, uint8_t *d2)
| Canonical dname compare.
uint8_t * | dname_get_shared_topdomain (uint8_t *d1, uint8_t *d2)
| Get the shared topdomain between two names.

## Detailed Description

This file contains functions to deal with domain names (dnames).

Some of the functions deal with domain names as a wireformat buffer, with a length.

## Function Documentation

## ◆ query_dname_len()

size_t query_dname_len | ( | struct sldns_buffer * | query | ) |

Determine length of dname in buffer, no compression ptrs allowed,.

Parameters

  query | the ldns buffer, current position at start of dname. at end, position is at end of the dname.

Returns
  : 0 on parse failure, or length including ending 0 of dname.

References LDNS_MAX_DOMAINLEN, sldns_buffer_read_u8(), sldns_buffer_remaining(), and sldns_buffer_skip().

Referenced by chaos_replystr(), dname_test_qdl(), and query_info_parse().

## ◆ dname_valid()

size_t dname_valid | ( | uint8_t * | dname,
|  | size_t | len )

Determine if dname in memory is correct.

no compression ptrs allowed.

Parameters

  dname | where dname starts in memory.
  len | dname is not allowed to exceed this length (i.e. of allocation).

Returns
  length of dname if dname is ok, 0 on a parse error.

References LDNS_MAX_DOMAINLEN.

Referenced by az_add_additionals_from(), az_insert_rr_decompress(), az_remove_rr_decompress(), canonical_compare(), canonicalize_rdata(), create_synth_cname(), delegpt_rrset_add_ns(), dname_test_valid(), dnskey_verify_rrset_sig(), follow_cname_chain(), get_cname_target(), nsec_get_next(), nsec_has_type(), parse_get_cname_target(), reuse_move_writewait_away(), rpz_dname_to_trigger(), rpz_rr_to_action(), rrset_has_signer(), rrsig_get_signer(), and wipeout().

## ◆ pkt_dname_tolower()

void pkt_dname_tolower | ( | struct sldns_buffer * | pkt,
|  | uint8_t * | dname )

lowercase pkt dname (follows compression pointers)

Parameters

  pkt | the packet, used to follow compression pointers. Position is unchanged.
  dname | start of dname in packet.

References LABEL_IS_PTR, MAX_COMPRESS_PTRS, PTR_OFFSET, sldns_buffer_at(), sldns_buffer_end(), and sldns_buffer_limit().

Referenced by dname_test_pdtl(), and serviced_callbacks().

## ◆ query_dname_compare()

int query_dname_compare | ( | uint8_t * | d1,
|  | uint8_t * | d2 )

Compare query dnames (uncompressed storage).

The Dnames passed do not have to be lowercased, comparison routine does this.

This routine is special, in that the comparison that it does corresponds with the canonical comparison needed when comparing dnames inside rdata for RR types that need canonicalization. That means that the first byte that is smaller (possibly after lowercasing) makes an RR smaller, or the shortest name makes an RR smaller.

This routine does not compute the canonical order needed for NSEC processing.

Dnames have to be valid format.

Parameters

  d1 | dname to compare
  d2 | dname to compare

Returns
  : -1, 0, or +1 depending on comparison results. Sort order is first difference found. not the canonical ordering.

## ◆ pkt_dname_len()

size_t pkt_dname_len | ( | struct sldns_buffer * | pkt | ) |

Determine correct, compressed, dname present in packet.

Checks for parse errors.

Parameters

  pkt | packet to read from (from current start position).

Returns
  : 0 on parse error. At exit the position is right after the (compressed) dname. Compression pointers are followed and checked for loops. The uncompressed wireformat length is returned.

References LABEL_IS_PTR, LDNS_MAX_DOMAINLEN, MAX_COMPRESS_PTRS, PTR_OFFSET, sldns_buffer_limit(), sldns_buffer_position(), sldns_buffer_read_u8(), sldns_buffer_remaining(), sldns_buffer_set_position(), and sldns_buffer_skip().

Referenced by analyze_dname(), auth_zone_parse_notify_serial(), calc_size(), check_packet_ok(), check_xfer_packet(), chunk_rrlist_get_current(), decompress_rr_into_buffer(), dname_test_pkt_dname_len(), get_additional_name(), log_rrlist_position(), nsec_at_apex(), parse_edns_from_query_pkt(), parse_get_cname_target(), parse_query_section(), parse_section(), rdata_copy(), sanitize_nsec_is_overreach(), and skip_pkt_rr().

## ◆ dname_pkt_compare()

int dname_pkt_compare | ( | struct sldns_buffer * | pkt,
|  | uint8_t * | d1,
|  | uint8_t * | d2 )

Compare dnames in packet (compressed).

Dnames must be valid. routine performs lowercasing, so the packet casing is preserved.

Parameters

  pkt | packet, used to resolve compression pointers.
  d1 | dname to compare
  d2 | dname to compare

Returns
  : -1, 0, or +1 depending on comparison results. Sort order is first difference found. not the canonical ordering.

References LABEL_IS_PTR, LDNS_MAX_LABELLEN, log_assert, MAX_COMPRESS_PTRS, PTR_OFFSET, sldns_buffer_at(), and sldns_buffer_limit().

Referenced by check_packet_ok(), check_xfer_packet(), rrset_parse_equals(), scrub_message(), scrub_normalize(), scrub_sanitize(), and smart_compare().

## ◆ dname_query_hash()

hashvalue_type dname_query_hash | ( | uint8_t * | dname,
|  | hashvalue_type | h )

Hash dname, label by label, lowercasing, into hashvalue.

Dname in query format (not compressed).

Parameters

  dname | dname to hash.
  h | initial hash value.

Returns
  : result hash value.

References LDNS_MAX_LABELLEN, and log_assert.

Referenced by hash_infra(), infra_create_ratedata(), infra_find_ratedata(), key_entry_hash(), query_info_hash(), and rrset_key_hash().

## ◆ dname_pkt_hash()

hashvalue_type dname_pkt_hash | ( | struct sldns_buffer * | pkt,
|  | uint8_t * | dname,
|  | hashvalue_type | h )

Hash dname, label by label, lowercasing, into hashvalue.

Dname in pkt format (compressed).

Parameters

  pkt | packet, for resolving compression pointers.
  dname | dname to hash, pointer to the pkt buffer. Must be valid format. No loops, etc.
  h | initial hash value.

Returns
  : result hash value. Result is the same as dname_query_hash, even if compression is used.

References LABEL_IS_PTR, LDNS_MAX_LABELLEN, log_assert, MAX_COMPRESS_PTRS, PTR_OFFSET, sldns_buffer_at(), and sldns_buffer_limit().

Referenced by pkt_hash_rrset(), and pkt_hash_rrset_first().

## ◆ dname_pkt_copy()

void dname_pkt_copy | ( | struct sldns_buffer * | pkt,
|  | uint8_t * | to,
|  | uint8_t * | dname )

Copy over a valid dname and decompress it.

Parameters

  pkt | packet to resolve compression pointers.
  to | buffer of size from pkt_len function to hold result.
  dname | pointer into packet where dname starts.

References LABEL_IS_PTR, LDNS_MAX_DOMAINLEN, LDNS_MAX_LABELLEN, log_assert, log_err(), MAX_COMPRESS_PTRS, PTR_OFFSET, sldns_buffer_at(), and sldns_buffer_limit().

Referenced by decompress_rr_into_buffer(), log_rrlist_position(), msgparse_rrset_remove_rr(), parse_copy_decompress_rrset(), parse_create_qinfo(), pkt_strict_sub(), pkt_sub(), priv_lookup_name(), rdata_copy(), remove_rrset(), shorten_rrset(), sub_of_pkt(), synth_cname(), and synth_cname_rrset().

## ◆ dname_buffer_write()

int dname_buffer_write | ( | struct sldns_buffer * | pkt,
|  | uint8_t * | dname )

Copy over a valid dname to a packet.

Parameters

  pkt | packet to copy to.
  dname | dname to copy.

Returns
  : 0 if not enough space in buffer.

References sldns_buffer_remaining(), sldns_buffer_write(), and sldns_buffer_write_u8().

Referenced by compress_any_dname().

## ◆ dname_count_labels()

int dname_count_labels | ( | uint8_t * | dname | ) |

Count the number of labels in an uncompressed dname in memory.

Parameters

  dname | pointer to uncompressed dname.

Returns
  : count of labels, including root label, "com." has 2 labels.

Referenced by anchors_lookup(), auth_xfer_find(), auth_zone_create(), auth_zone_find(), auth_zone_find_less_equal(), autr_tp_create(), az_domain_create(), az_find_domain(), az_find_name(), az_nsec3_get_nextcloser(), caps_white_apply_cfg(), dname_canonical_compare(), dname_get_shared_topdomain(), dname_strict_subdomain_c(), dname_subdomain_c(), dname_test_count_labels(), dns64_always_synth_for_qname(), dns64_insert_ignore_aaaa(), domain_limit_findcreate(), find_add_tp(), infra_find_ratelimit(), insert_query(), is_caps_whitelisted(), iter_dp_cangodown(), iter_msg_from_zone(), local_zones_answer(), lz_enter_override(), lz_enter_zone_tag(), neg_create_zone(), neg_find_nsec(), neg_find_zone(), neg_insert_data(), next_closer(), nsec_closest_encloser(), packed_rrset_encode(), processFindKey(), processQueryTargets(), rpz_data_delete_rr(), rpz_find_zone(), rpz_rr_to_action(), set_next_probe(), val_find_best_signer(), val_neg_getmsg(), val_nsec_proves_no_wc(), val_rrset_wildcard(), validate_cname_noanswer_response(), validate_nameerror_response(), and wipeout().

## ◆ dname_count_size_labels()

int dname_count_size_labels | ( | uint8_t * | dname,
|  | size_t * | size )

Count labels and dname length both, for uncompressed dname in memory.

Parameters

  dname | pointer to uncompressed dname.
  size | length of dname, including root label.

Returns
  : count of labels, including root label, "com." has 2 labels.

Referenced by anchor_store_new_key(), anchors_add_insecure(), anchors_delete_insecure(), auth_zones_find_zone(), az_find_candidate_ce(), compress_rdata(), delegpt_add_ns(), delegpt_add_ns_mlc(), delegpt_create_mlc(), delegpt_set_name(), delegpt_set_name_mlc(), dname_test_count_size_labels(), forwards_find(), forwards_lookup(), fwd_add_stub_hole(), hints_delete_stub(), hints_find(), hints_lookup_stub(), local_zones_add_RR(), lz_enter_rr_into_zone(), lz_enter_rr_str(), lz_setup_implicit(), nsec3_prove_wildcard(), parse_arg_name(), parse_dname(), priv_lookup_name(), read_names(), rpz_find_zone(), val_find_best_signer(), val_neg_getmsg(), and wipeout().

## ◆ dname_lab_cmp()

int dname_lab_cmp | ( | uint8_t * | d1,
|  | int | labs1,
|  | uint8_t * | d2,
|  | int | labs2,
|  | int * | mlabs )

Compare dnames, sorted not canonical, but by label.

Such that zone contents follows zone apex.

Parameters

  d1 | first dname. pointer to uncompressed wireformat.
  labs1 | number of labels in first dname.
  d2 | second dname. pointer to uncompressed wireformat.
  labs2 | number of labels in second dname.
  mlabs | number of labels that matched exactly (the shared topdomain).

Returns
  : 0 for equal, -1 smaller, or +1 d1 larger than d2.

References log_assert.

Referenced by anchor_cmp(), anchors_init_parents_locked(), anchors_lookup(), auth_xfer_cmp(), auth_zone_cmp(), compress_tree_search(), dname_get_shared_topdomain(), dname_strict_subdomain(), dname_subdomain_c(), dname_test_dname_lab_cmp(), forwards_lookup(), fwd_cmp(), fwd_init_parents(), local_zone_cmp(), local_zones_tags_lookup(), lz_setup_implicit(), name_tree_compare(), name_tree_init_parents(), name_tree_lookup(), neg_closest_data_parent(), neg_closest_zone_parent(), and val_find_best_signer().

## ◆ dname_lab_startswith()

int dname_lab_startswith | ( | uint8_t * | label,
|  | char * | prefix,
|  | char ** | endptr )

Check if labels starts with given prefix.

Parameters

  label | dname label
  prefix | the string to match label with, null terminated.
  endptr | pointer to location in label after prefix, only if return value is 1. NULL if nothing in the label after the prefix, i.e. prefix and label are the same.

Returns
  : 1 if label starts with prefix, else 0

Referenced by processFinished(), rpz_dname_to_trigger(), and rpz_rr_to_action().

## ◆ dname_has_label()

int dname_has_label | ( | uint8_t * | dname,
|  | size_t | dnamelen,
|  | uint8_t * | label )

Check if dname contains label.

Parameters

  dname | dname
  dnamelen | length of dname
  label | label to be checked for presence in dname

Returns
  : 1 if dname has this label, 0 otherwise

References memlowercmp().

Referenced by dname_test_has_label().

## ◆ dname_strict_subdomain()

int dname_strict_subdomain | ( | uint8_t * | d1,
|  | int | labs1,
|  | uint8_t * | d2,
|  | int | labs2 )

See if domain name d1 is a strict subdomain of d2.

That is a subdomain, but not equal.

Parameters

  d1 | domain name, uncompressed wireformat
  labs1 | number of labels in d1, including root label.
  d2 | domain name, uncompressed wireformat
  labs2 | number of labels in d2, including root label.

Returns
  true if d1 is a subdomain of d2, but not equal to d2.

References dname_lab_cmp().

Referenced by az_nsec3_get_nextcloser(), dname_strict_subdomain_c(), dname_test_strict_subdomain(), hints_lookup_stub(), is_terminal(), iter_msg_from_zone(), iter_stub_fwd_no_cache(), and set_kiddo_parents().

## ◆ dname_strict_subdomain_c()

int dname_strict_subdomain_c | ( | uint8_t * | d1,
|  | uint8_t * | d2 )

Like dname_strict_subdomain but counts labels.

Parameters

  d1 | domain name, uncompressed wireformat
  d2 | domain name, uncompressed wireformat

Returns
  true if d1 is a subdomain of d2, but not equal to d2.

References dname_count_labels(), and dname_strict_subdomain().

Referenced by az_empty_nonterminal(), cname_under_previous_dname(), handle_cname_response(), nsec_proves_nodata(), pkt_strict_sub(), processInit(), processQueryResponse(), response_type_from_server(), val_find_signer(), val_nsec_proves_insecuredelegation(), val_nsec_proves_name_error(), and validate_msg_signatures().

## ◆ dname_subdomain_c()

int dname_subdomain_c | ( | uint8_t * | d1,
|  | uint8_t * | d2 )

Counts labels.

Tests if d1 is a subdomain of d2.

Parameters

  d1 | domain name, uncompressed wireformat
  d2 | domain name, uncompressed wireformat

Returns
  true if d1 is a subdomain of d2.

References dname_count_labels(), and dname_lab_cmp().

Referenced by auth_zone_delegpt(), az_find_wildcard(), dname_test_subdomain(), dns_cache_lookup(), dnskey_verify_rrset_sig(), filter_init(), follow_cname_chain(), generate_parentside_target_query(), iter_dp_is_useless(), iter_ds_toolow(), iter_scrub_ds(), nsec3_find_closest_encloser(), nsec_proves_nodata(), pkt_sub(), processDSNSFind(), processFindKey(), processInit(), processInitRequest2(), processQueryResponse(), processQueryTargets(), response_type_from_server(), rpz_dname_to_trigger(), rpz_insert_rr(), rpz_remove_rr(), rpz_rr_to_action(), sub_of_pkt(), sum_subtree_inuse(), sum_zone_subtree_inuse(), val_find_best_signer(), val_mark_insecure(), val_neg_addreferral(), val_neg_addreply(), val_neg_getmsg(), val_nsec_proves_insecuredelegation(), val_nsec_proves_name_error(), wipeout(), zone_del_kcache(), zone_del_msg(), zone_del_rrset(), and zonemd_simple_domain().

## ◆ dname_print()

void dname_print | ( | FILE * | out,
|  | struct sldns_buffer * | pkt,
|  | uint8_t * | dname )

Debug helper.

Print wireformat dname to output.

Parameters

  out | like stdout or a file.
  pkt | if not NULL, the packet for resolving compression ptrs.
  dname | pointer to (start of) dname.

References LABEL_IS_PTR, LDNS_MAX_LABELLEN, MAX_COMPRESS_PTRS, PTR_OFFSET, sldns_buffer_at(), and sldns_buffer_limit().

Referenced by analyze_dname(), parse_section(), and print_neg_cache().

## ◆ dname_str()

void dname_str | ( | uint8_t * | dname,
|  | char * | str )

Debug helper.

Print dname to given string buffer (string buffer must be at least 255 chars + 1 for the 0, in printable form. This may lose information (? for nonprintable characters, or & if the name is too long, # for a bad label length).

Parameters

  dname | uncompressed wireformat.
  str | buffer of 255+1 length.

References LDNS_MAX_DOMAINLEN, and LDNS_MAX_LABELLEN.

Referenced by anchors_assemble_rrsets(), answer_notify(), auth_xfer_probe_lookup_callback(), auth_xfer_probe_timer_callback(), auth_xfer_probe_udp_callback(), auth_xfer_transfer_lookup_callback(), auth_zone_delegpt(), auth_zone_log(), auth_zone_read_zonefile(), auth_zone_zonemd_check_hash(), auth_zone_zonemd_fail(), autr_debug_print_tp(), autr_tp_create(), delegpt_log(), do_dump_requestlist(), do_list_auth_zones(), do_list_local_zones(), dump_infra_host(), errinf_dname(), errinf_rrset(), errinf_to_str_bogus(), errinf_to_str_servfail(), fill_canon(), forwards_insert_data(), get_mesh_status(), hints_insert(), infra_ratelimit_inc(), iter_stub_fwd_no_cache(), local_zones_answer(), log_name_addr(), log_nametypeclass(), log_query_in(), log_reply_info(), log_rpz_apply(), log_rrlist_position(), lz_enter_zone_dname(), lz_inform_print(), print_neg_cache(), processLastResort(), processQueryTargets(), query_for_targets(), rate_list(), respip_rewrite_reply(), reuse_move_writewait_away(), rpz_callback_from_iterator_cname(), rpz_callback_from_worker_request(), rpz_insert_response_ip_trigger(), rpz_insert_rr(), serviced_perturb_qname(), ssl_print_name_dp(), val_init(), worker_handle_request(), xfr_probe_lookup_host(), xfr_probe_send_or_end(), xfr_probe_send_probe(), xfr_process_chunk_list(), xfr_set_timeout(), xfr_transfer_init_fetch(), xfr_transfer_lookup_host(), xfr_transfer_nexttarget_or_end(), xfr_write_after_update(), zonemd_generate_test(), and zonemd_lookup_dnskey().

## ◆ dname_is_root()

int dname_is_root | ( | uint8_t * | dname | ) |

Returns true if the uncompressed wireformat dname is the root ".".

Parameters

  dname | the dname to check

Returns
  true if ".", false if not.

References LABEL_IS_PTR, and log_assert.

Referenced by auth_zones_find_zone(), az_domain_go_up(), az_find_candidate_ce(), az_find_nsec_cover(), az_find_wildcard(), calc_data_need(), calc_zone_need(), can_have_last_resort(), check_data(), check_zone_invariants(), del_empty_term(), dname_test_isroot(), dns_cache_lookup(), filter_init(), forward_request(), key_cache_obtain(), local_zones_tags_lookup(), name_tree_next_root(), nsec3_do_prove_nodata(), nsec_proves_nodata(), processInitRequest(), processInitRequest2(), and processLastResort().

## ◆ dname_remove_label()

void dname_remove_label | ( | uint8_t ** | dname,
|  | size_t * | len )

Snip off first label from a dname, returning the parent zone.

Parameters

  dname | from what to strip off. uncompressed wireformat.
  len | length, adjusted to become less. return stripped off, or "." if input was ".".

References LABEL_IS_PTR, and log_assert.

Referenced by auth_zones_answer(), auth_zones_find_zone(), az_domain_go_up(), az_find_candidate_ce(), az_find_nsec_cover(), az_find_wildcard(), az_generate_wildcard_answer(), az_nsec3_find_ce(), calc_data_need(), calc_zone_need(), del_empty_term(), dname_remove_labels(), dname_test_removelabel(), dns_cache_lookup(), filter_init(), filter_next(), forward_request(), insert_can_owner(), key_cache_obtain(), local_zones_tags_lookup(), lz_find_create_node(), neg_data_chain(), neg_find_nsec3_ce(), neg_zone_chain(), nsec3_find_closest_encloser(), nsec3_get_nextowner_b32(), nsec_proves_nodata(), processDSNSFind(), processInit(), processInitRequest(), processInitRequest2(), and val_neg_getmsg().

## ◆ dname_remove_labels()

void dname_remove_labels | ( | uint8_t ** | dname,
|  | size_t * | len,
|  | int | n )

Snip off first N labels from a dname, returning the parent zone.

Parameters

  dname | from what to strip off. uncompressed wireformat.
  len | length, adjusted to become less.
  n | number of labels to strip off (from the left). if 0, nothing happens. return stripped off, or "." if input was ".".

References dname_remove_label().

Referenced by az_nsec3_get_nextcloser(), dname_get_shared_topdomain(), lz_setup_implicit(), next_closer(), processFindKey(), processQueryTargets(), val_nsec_proves_no_wc(), and val_rrset_wildcard().

## ◆ dname_signame_label_count()

int dname_signame_label_count | ( | uint8_t * | dname | ) |

Count labels for the RRSIG signature label field.

Like a normal labelcount, but "*" wildcard and "." root are not counted.

Parameters

  dname | valid uncompressed wireformat.

Returns
  number of labels like in RRSIG; '*' and '.' are not counted.

Referenced by dname_test_sigcount(), dnskey_verify_rrset_sig(), and insert_can_owner().

## ◆ dname_is_wild()

int dname_is_wild | ( | uint8_t * | dname | ) |

Return true if the label is a wildcard, *.example.com.

Parameters

  dname | valid uncompressed wireformat.

Returns
  true if wildcard, or false.

Referenced by dname_test_iswild(), local_data_answer(), nsec_proves_nodata(), val_nsec_prove_nodata_dsreply(), and val_rrset_wildcard().

## ◆ dname_canon_lab_cmp()

int dname_canon_lab_cmp | ( | uint8_t * | d1,
|  | int | labs1,
|  | uint8_t * | d2,
|  | int | labs2,
|  | int * | mlabs )

Compare dnames, Canonical in rfc4034 sense, but by label.

Such that zone contents follows zone apex.

Parameters

  d1 | first dname. pointer to uncompressed wireformat.
  labs1 | number of labels in first dname.
  d2 | second dname. pointer to uncompressed wireformat.
  labs2 | number of labels in second dname.
  mlabs | number of labels that matched exactly (the shared topdomain).

Returns
  : 0 for equal, -1 smaller, or +1 d1 larger than d2.

References log_assert, and memcanoncmp().

Referenced by auth_data_cmp(), dname_canonical_compare(), local_data_cmp(), val_neg_data_compare(), val_neg_zone_compare(), and wipeout().

## ◆ dname_canonical_compare()

int dname_canonical_compare | ( | uint8_t * | d1,
|  | uint8_t * | d2 )

Canonical dname compare.

Takes care of counting labels. Per rfc 4034 canonical order.

Parameters

  d1 | first dname. pointer to uncompressed wireformat.
  d2 | second dname. pointer to uncompressed wireformat.

Returns
  : 0 for equal, -1 smaller, or +1 d1 larger than d2.

References dname_canon_lab_cmp(), and dname_count_labels().

Referenced by dname_test_canoncmp(), nsec_proves_nodata(), processQueryTargets(), rrset_canonical_sort_cmp(), and val_nsec_proves_name_error().

## ◆ dname_get_shared_topdomain()

uint8_t * dname_get_shared_topdomain | ( | uint8_t * | d1,
|  | uint8_t * | d2 )

Get the shared topdomain between two names.

Root "." or longer.

Parameters

  d1 | first dname. pointer to uncompressed wireformat.
  d2 | second dname. pointer to uncompressed wireformat.

Returns
  pointer to shared topdomain. Ptr to a part of d1.

References dname_count_labels(), dname_lab_cmp(), dname_remove_labels(), and LDNS_MAX_DOMAINLEN.

Referenced by auth_zones_find_zone(), az_find_candidate_ce(), dname_test_topdomain(), nsec_closest_encloser(), and rpz_find_zone().