This file contains helper functions for the validator module. More...
#include "config.h"
#include <ctype.h>
#include "validator/val_nsec3.h"
#include "validator/val_secalgo.h"
#include "validator/validator.h"
#include "validator/val_kentry.h"
#include "services/cache/rrset.h"
#include "util/regional.h"
#include "util/rbtree.h"
#include "util/module.h"
#include "util/net_help.h"
#include "util/data/packed_rrset.h"
#include "util/data/dname.h"
#include "util/data/msgreply.h"
#include "validator/val_nsec.h"
#include "sldns/sbuffer.h"
#include "util/config_file.h"
Data Structures | |
struct | ce_response |
Closest encloser (ce) proof results Contains the ce and the next-closer (nc) proof. More... | |
struct | nsec3_filter |
Filter conditions for NSEC3 proof Used to iterate over the applicable NSEC3 RRs. More... | |
Macros | |
#define | MAX_NSEC3_CALCULATIONS 8 |
Max number of NSEC3 calculations at once, suspend query for later. More... | |
#define | MAX_NSEC3_ERRORS -1 |
When all allowed NSEC3 calculations at once resulted in error treat as bogus. More... | |
Functions | |
int | sldns_b32_ntop_extended_hex (uint8_t const *src, size_t srclength, char *target, size_t targsize) |
This function we get from ldns-compat or from base system it returns the number of data bytes stored at the target, or <0 on error. | |
int | sldns_b32_pton_extended_hex (char const *src, size_t hashed_owner_str_len, uint8_t *target, size_t targsize) |
This function we get from ldns-compat or from base system it returns the number of data bytes stored at the target, or <0 on error. | |
static size_t | rrset_get_count (struct ub_packed_rrset_key *rrset) |
return number of rrs in an rrset | |
static int | nsec3_unknown_flags (struct ub_packed_rrset_key *rrset, int r) |
return if nsec3 RR has unknown flags | |
int | nsec3_has_optout (struct ub_packed_rrset_key *rrset, int r) |
return if nsec3 RR has the optout flag More... | |
static int | nsec3_get_algo (struct ub_packed_rrset_key *rrset, int r) |
return nsec3 RR algorithm | |
static int | nsec3_known_algo (struct ub_packed_rrset_key *rrset, int r) |
return if nsec3 RR has known algorithm | |
static size_t | nsec3_get_iter (struct ub_packed_rrset_key *rrset, int r) |
return nsec3 RR iteration count | |
static int | nsec3_get_salt (struct ub_packed_rrset_key *rrset, int r, uint8_t **salt, size_t *saltlen) |
return nsec3 RR salt | |
int | nsec3_get_params (struct ub_packed_rrset_key *rrset, int r, int *algo, size_t *iter, uint8_t **salt, size_t *saltlen) |
Get NSEC3 parameters out of rr. More... | |
int | nsec3_get_nextowner (struct ub_packed_rrset_key *rrset, int r, uint8_t **next, size_t *nextlen) |
Return nsec3 RR next hashed owner name. More... | |
size_t | nsec3_hash_to_b32 (uint8_t *hash, size_t hashlen, uint8_t *zone, size_t zonelen, uint8_t *buf, size_t max) |
Convert hash into base32 encoding and with the zone name appended. More... | |
size_t | nsec3_get_nextowner_b32 (struct ub_packed_rrset_key *rrset, int r, uint8_t *buf, size_t max) |
Get next owner name, converted to base32 encoding and with the zone name (taken from the nsec3 owner name) appended. More... | |
int | nsec3_has_type (struct ub_packed_rrset_key *rrset, int r, uint16_t type) |
see if NSEC3 RR contains given type More... | |
static struct ub_packed_rrset_key * | filter_next (struct nsec3_filter *filter, size_t *rrsetnum, int *rrnum) |
Iterate through NSEC3 list, per RR This routine gives the next RR in the list (or sets rrset null). More... | |
static struct ub_packed_rrset_key * | filter_first (struct nsec3_filter *filter, size_t *rrsetnum, int *rrnum) |
Start iterating over NSEC3 records. More... | |
static int | nsec3_rrset_has_known (struct ub_packed_rrset_key *s) |
see if at least one RR is known (flags, algo) | |
static void | filter_init (struct nsec3_filter *filter, struct ub_packed_rrset_key **list, size_t num, struct query_info *qinfo) |
Initialize the filter structure. More... | |
static size_t | get_max_iter (struct val_env *ve, size_t bits) |
Find max iteration count using config settings and key size. More... | |
static int | nsec3_iteration_count_high (struct val_env *ve, struct nsec3_filter *filter, struct key_entry_key *kkey) |
Determine if any of the NSEC3 rrs iteration count is too high, from key. More... | |
int | nsec3_hash_cmp (const void *c1, const void *c2) |
Rbtree for hash cache comparison function. More... | |
int | nsec3_cache_table_init (struct nsec3_cache_table *ct, struct regional *region) |
Initialise the NSEC3 cache table. More... | |
size_t | nsec3_get_hashed (sldns_buffer *buf, uint8_t *nm, size_t nmlen, int algo, size_t iter, uint8_t *salt, size_t saltlen, uint8_t *res, size_t max) |
Get NSEC3 hashed in a buffer. More... | |
static int | nsec3_calc_hash (struct regional *region, sldns_buffer *buf, struct nsec3_cached_hash *c) |
perform hash of name | |
static int | nsec3_calc_b32 (struct regional *region, sldns_buffer *buf, struct nsec3_cached_hash *c) |
perform b32 encoding of hash | |
int | nsec3_hash_name (rbtree_type *table, struct regional *region, sldns_buffer *buf, struct ub_packed_rrset_key *nsec3, int rr, uint8_t *dname, size_t dname_len, struct nsec3_cached_hash **hash) |
Obtain the hash of an owner name. More... | |
static int | label_compare_lower (uint8_t *lab1, uint8_t *lab2, size_t lablen) |
compare a label lowercased | |
static int | nsec3_hash_matches_owner (struct nsec3_filter *flt, struct nsec3_cached_hash *hash, struct ub_packed_rrset_key *s) |
Compare a hashed name with the owner name of an NSEC3 RRset. More... | |
static int | find_matching_nsec3 (struct module_env *env, struct nsec3_filter *flt, struct nsec3_cache_table *ct, uint8_t *nm, size_t nmlen, struct ub_packed_rrset_key **rrset, int *rr, int *calculations) |
Find matching NSEC3 Find the NSEC3Record that matches a hash of a name. More... | |
int | nsec3_covers (uint8_t *zone, struct nsec3_cached_hash *hash, struct ub_packed_rrset_key *rrset, int rr, sldns_buffer *buf) |
nsec3Covers Given a hash and a candidate NSEC3Record, determine if that NSEC3Record covers the hash. More... | |
static int | find_covering_nsec3 (struct module_env *env, struct nsec3_filter *flt, struct nsec3_cache_table *ct, uint8_t *nm, size_t nmlen, struct ub_packed_rrset_key **rrset, int *rr, int *calculations) |
findCoveringNSEC3 Given a name, find a covering NSEC3 from among a list of NSEC3s. More... | |
static int | nsec3_find_closest_encloser (struct module_env *env, struct nsec3_filter *flt, struct nsec3_cache_table *ct, struct query_info *qinfo, struct ce_response *ce, int *calculations) |
findClosestEncloser Given a name and a list of NSEC3s, find the candidate closest encloser. More... | |
static void | next_closer (uint8_t *qname, size_t qnamelen, uint8_t *ce, uint8_t **nm, size_t *nmlen) |
Given a qname and its proven closest encloser, calculate the "next
closest" name. More... | |
static enum sec_status | nsec3_prove_closest_encloser (struct module_env *env, struct nsec3_filter *flt, struct nsec3_cache_table *ct, struct query_info *qinfo, int prove_does_not_exist, struct ce_response *ce, int *calculations) |
proveClosestEncloser Given a List of nsec3 RRs, find and prove the closest encloser to qname. More... | |
static uint8_t * | nsec3_ce_wildcard (struct regional *region, uint8_t *ce, size_t celen, size_t *len) |
allocate a wildcard for the closest encloser | |
static enum sec_status | nsec3_do_prove_nameerror (struct module_env *env, struct nsec3_filter *flt, struct nsec3_cache_table *ct, struct query_info *qinfo, int *calc) |
Do the name error proof. | |
enum sec_status | nsec3_prove_nameerror (struct module_env *env, struct val_env *ve, struct ub_packed_rrset_key **list, size_t num, struct query_info *qinfo, struct key_entry_key *kkey, struct nsec3_cache_table *ct, int *calc) |
Determine if the set of NSEC3 records provided with a response prove NAME ERROR. More... | |
static enum sec_status | nsec3_do_prove_nodata (struct module_env *env, struct nsec3_filter *flt, struct nsec3_cache_table *ct, struct query_info *qinfo, int *calc) |
Do the nodata proof. | |
enum sec_status | nsec3_prove_nodata (struct module_env *env, struct val_env *ve, struct ub_packed_rrset_key **list, size_t num, struct query_info *qinfo, struct key_entry_key *kkey, struct nsec3_cache_table *ct, int *calc) |
Determine if the NSEC3s provided in a response prove the NOERROR/NODATA status. More... | |
enum sec_status | nsec3_prove_wildcard (struct module_env *env, struct val_env *ve, struct ub_packed_rrset_key **list, size_t num, struct query_info *qinfo, struct key_entry_key *kkey, uint8_t *wc, struct nsec3_cache_table *ct, int *calc) |
Prove that a positive wildcard match was appropriate (no direct match RRset). More... | |
static int | list_is_secure (struct module_env *env, struct val_env *ve, struct ub_packed_rrset_key **list, size_t num, struct key_entry_key *kkey, char **reason, sldns_ede_code *reason_bogus, struct module_qstate *qstate, char *reasonbuf, size_t reasonlen) |
test if list is all secure | |
enum sec_status | nsec3_prove_nods (struct module_env *env, struct val_env *ve, struct ub_packed_rrset_key **list, size_t num, struct query_info *qinfo, struct key_entry_key *kkey, char **reason, sldns_ede_code *reason_bogus, struct module_qstate *qstate, struct nsec3_cache_table *ct, char *reasonbuf, size_t reasonlen) |
Prove that a DS response either had no DS, or wasn't a delegation point. More... | |
enum sec_status | nsec3_prove_nxornodata (struct module_env *env, struct val_env *ve, struct ub_packed_rrset_key **list, size_t num, struct query_info *qinfo, struct key_entry_key *kkey, int *nodata, struct nsec3_cache_table *ct, int *calc) |
Prove NXDOMAIN or NODATA. More... | |
This file contains helper functions for the validator module.
The functions help with NSEC3 checking, the different NSEC3 proofs for denial of existence, and proofs for presence of types.
#define MAX_NSEC3_CALCULATIONS 8 |
Max number of NSEC3 calculations at once, suspend query for later.
8 is low enough and allows for cases where multiple proofs are needed.
#define MAX_NSEC3_ERRORS -1 |
When all allowed NSEC3 calculations at once resulted in error treat as bogus.
NSEC3 hash errors are not cached and this helps breaks loops with erroneous data.
int nsec3_has_optout | ( | struct ub_packed_rrset_key * | rrset, |
int | r | ||
) |
return if nsec3 RR has the optout flag
rrset | NSEC3 rrset |
r | RR in rrset |
References packed_rrset_data::count, lruhash_entry::data, ub_packed_rrset_key::entry, log_assert, NSEC3_OPTOUT, packed_rrset_data::rr_data, and packed_rrset_data::rr_len.
int nsec3_get_params | ( | struct ub_packed_rrset_key * | rrset, |
int | r, | ||
int * | algo, | ||
size_t * | iter, | ||
uint8_t ** | salt, | ||
size_t * | saltlen | ||
) |
Get NSEC3 parameters out of rr.
rrset | the NSEC3 rrset. |
r | the rr num of the nsec3 in the rrset. |
algo | nsec3 hash algo. |
iter | iteration count. |
salt | ptr to salt inside rdata. |
saltlen | length of salt. |
References nsec3_get_algo(), nsec3_get_iter(), nsec3_get_salt(), nsec3_known_algo(), and nsec3_unknown_flags().
Referenced by neg_params_ok(), and nsec3_of_param_has_type().
int nsec3_get_nextowner | ( | struct ub_packed_rrset_key * | rrset, |
int | r, | ||
uint8_t ** | next, | ||
size_t * | nextlen | ||
) |
Return nsec3 RR next hashed owner name.
rrset | NSEC3 rrset |
r | RR in rrset |
next | ptr into rdata to next owner hash |
nextlen | length of hash. |
References packed_rrset_data::count, lruhash_entry::data, ub_packed_rrset_key::entry, log_assert, packed_rrset_data::rr_data, and packed_rrset_data::rr_len.
Referenced by nsec3_covers(), and nsec3_get_nextowner_b32().
size_t nsec3_hash_to_b32 | ( | uint8_t * | hash, |
size_t | hashlen, | ||
uint8_t * | zone, | ||
size_t | zonelen, | ||
uint8_t * | buf, | ||
size_t | max | ||
) |
Convert hash into base32 encoding and with the zone name appended.
hash | hashed buffer |
hashlen | length of hash |
zone | name of zone |
zonelen | length of zonename. |
buf | buffer to store name in |
max | size of buffer. |
References sldns_b32_ntop_extended_hex().
Referenced by neg_nsec3_getnc(), and nsec3_get_nextowner_b32().
size_t nsec3_get_nextowner_b32 | ( | struct ub_packed_rrset_key * | rrset, |
int | r, | ||
uint8_t * | buf, | ||
size_t | max | ||
) |
Get next owner name, converted to base32 encoding and with the zone name (taken from the nsec3 owner name) appended.
rrset | the NSEC3 rrset. |
r | the rr num of the nsec3 in the rrset. |
buf | buffer to store name in |
max | size of buffer. |
References packed_rrset_key::dname, packed_rrset_key::dname_len, dname_remove_label(), nsec3_get_nextowner(), nsec3_hash_to_b32(), and ub_packed_rrset_key::rk.
int nsec3_has_type | ( | struct ub_packed_rrset_key * | rrset, |
int | r, | ||
uint16_t | type | ||
) |
see if NSEC3 RR contains given type
rrset | NSEC3 rrset |
r | RR in rrset |
type | in host order to check bit for. |
References packed_rrset_data::count, lruhash_entry::data, ub_packed_rrset_key::entry, log_assert, nsecbitmap_has_type_rdata(), packed_rrset_data::rr_data, and packed_rrset_data::rr_len.
Referenced by nsec3_no_type(), and nsec3_of_param_has_type().
|
static |
Iterate through NSEC3 list, per RR This routine gives the next RR in the list (or sets rrset null).
Usage:
size_t rrsetnum; int rrnum; struct ub_packed_rrset_key* rrset; for(rrset=filter_first(filter, &rrsetnum, &rrnum); rrset; rrset=filter_next(filter, &rrsetnum, &rrnum)) do_stuff;
Also filters out o unknown flag NSEC3s o unknown algorithm NSEC3s.
filter | nsec3 filter structure. |
rrsetnum | in/out rrset number to look at. |
rrnum | in/out rr number in rrset to look at. |
References nsec3_filter::list, nsec3_filter::num, ub_packed_rrset_key::rk, packed_rrset_key::type, and nsec3_filter::zone.
Referenced by filter_first(), find_covering_nsec3(), find_matching_nsec3(), and nsec3_iteration_count_high().
|
static |
Start iterating over NSEC3 records.
filter | the filter structure, must have been filter_init-ed. |
rrsetnum | can be undefined on call, initialised. |
rrnum | can be undefined on call, initialised. |
References filter_next().
Referenced by find_covering_nsec3(), find_matching_nsec3(), and nsec3_iteration_count_high().
|
static |
Initialize the filter structure.
Finds the zone by looking at available NSEC3 records and best match. (skips the unknown flag and unknown algo NSEC3s).
filter | nsec3 filter structure. |
list | list of rrsets, an array of them. |
num | number of rrsets in list. |
qinfo | query name to match a zone for. query type (if DS a higher zone must be chosen) qclass, to filter NSEC3s with. |
References nsec3_filter::fclass, nsec3_filter::list, nsec3_filter::num, query_info::qclass, ub_packed_rrset_key::rk, packed_rrset_key::type, nsec3_filter::zone, and nsec3_filter::zone_len.
|
static |
Find max iteration count using config settings and key size.
ve | validator environment with iteration count config settings. |
bits | key size |
References log_assert, val_env::nsec3_keyiter_count, and val_env::nsec3_maxiter.
Referenced by nsec3_iteration_count_high().
|
static |
Determine if any of the NSEC3 rrs iteration count is too high, from key.
ve | validator environment with iteration count config settings. |
filter | what NSEC3s to loop over. |
kkey | key entry used for verification; used for iteration counts. |
References filter_first(), filter_next(), get_max_iter(), key_entry_keysize(), nsec3_get_iter(), VERB_ALGO, and verbose().
int nsec3_hash_cmp | ( | const void * | c1, |
const void * | c2 | ||
) |
Rbtree for hash cache comparison function.
c1 | key 1. |
c2 | key 2. |
References nsec3_cached_hash::dname, nsec3_cached_hash::nsec3, nsec3_get_algo(), nsec3_get_iter(), nsec3_get_salt(), query_dname_compare(), and nsec3_cached_hash::rr.
Referenced by nsec3_cache_table_init().
int nsec3_cache_table_init | ( | struct nsec3_cache_table * | ct, |
struct regional * | region | ||
) |
Initialise the NSEC3 cache table.
ct | the nsec3 cache table. |
region | the region where allocations for the table will happen. |
References nsec3_hash_cmp(), rbtree_init(), and regional_alloc().
size_t nsec3_get_hashed | ( | struct sldns_buffer * | buf, |
uint8_t * | nm, | ||
size_t | nmlen, | ||
int | algo, | ||
size_t | iter, | ||
uint8_t * | salt, | ||
size_t | saltlen, | ||
uint8_t * | res, | ||
size_t | max | ||
) |
Get NSEC3 hashed in a buffer.
buf | buffer for temp use. |
nm | name to hash |
nmlen | length of nm. |
algo | algo to use, must be known. |
iter | iterations |
salt | salt for nsec3 |
saltlen | length of salt. |
res | result of hash stored here. |
max | maximum space for result. |
References nsec3_cached_hash::hash_len, log_err(), nsec3_hash_algo_size_supported(), query_dname_tolower(), secalgo_nsec3_hash(), sldns_buffer_begin(), sldns_buffer_clear(), sldns_buffer_flip(), sldns_buffer_limit(), and sldns_buffer_write().
int nsec3_hash_name | ( | rbtree_type * | table, |
struct regional * | region, | ||
struct sldns_buffer * | buf, | ||
struct ub_packed_rrset_key * | nsec3, | ||
int | rr, | ||
uint8_t * | dname, | ||
size_t | dname_len, | ||
struct nsec3_cached_hash ** | hash | ||
) |
Obtain the hash of an owner name.
Used internally by the nsec3 proof functions in this file. published to enable unit testing of hash algorithms and cache.
table | the cache table. Must be initialised at start. |
region | scratch region to use for allocation. This region holds the tree, if you wipe the region, reinit the tree. |
buf | temporary buffer. |
nsec3 | the rrset with parameters |
rr | rr number from d that has the NSEC3 parameters to hash to. |
dname | name to hash This pointer is used inside the tree, assumed region-alloced. |
dname_len | the length of the name. |
hash | the hash node is returned on success. |
References nsec3_cached_hash::dname, nsec3_cached_hash::dname_len, nsec3_cached_hash::hash, rbnode_type::key, log_assert, nsec3_cached_hash::node, nsec3_cached_hash::nsec3, nsec3_calc_b32(), nsec3_calc_hash(), rbtree_insert(), rbtree_search(), regional_alloc(), and nsec3_cached_hash::rr.
Referenced by find_covering_nsec3(), and find_matching_nsec3().
|
static |
Compare a hashed name with the owner name of an NSEC3 RRset.
flt | filter with zone name. |
hash | the hashed name. |
s | rrset with owner name. |
References packed_rrset_key::dname, nsec3_cached_hash::hash, label_compare_lower(), query_dname_compare(), ub_packed_rrset_key::rk, and nsec3_filter::zone.
Referenced by find_matching_nsec3().
|
static |
Find matching NSEC3 Find the NSEC3Record that matches a hash of a name.
env | module environment with temporary region and buffer. |
flt | the NSEC3 RR filter, contains zone name and RRs. |
ct | cached hashes table. |
nm | name to look for. |
nmlen | length of name. |
rrset | nsec3 that matches is returned here. |
rr | rr number in nsec3 rrset that matches. |
calculations | current hash calculations. |
References filter_first(), filter_next(), nsec3_cached_hash::hash, log_err(), MAX_NSEC3_CALCULATIONS, MAX_NSEC3_ERRORS, nsec3_hash_matches_owner(), nsec3_hash_name(), nsec3_cached_hash::rr, and module_env::scratch_buffer.
Referenced by nsec3_find_closest_encloser().
int nsec3_covers | ( | uint8_t * | zone, |
struct nsec3_cached_hash * | hash, | ||
struct ub_packed_rrset_key * | rrset, | ||
int | rr, | ||
struct sldns_buffer * | buf | ||
) |
nsec3Covers Given a hash and a candidate NSEC3Record, determine if that NSEC3Record covers the hash.
Covers specifically means that the hash is in between the owner and next hashes and does not equal either.
zone | the zone name. |
hash | the hash of the name |
rrset | the rrset of the NSEC3. |
rr | which rr in the rrset. |
buf | temporary buffer. |
References packed_rrset_key::dname, nsec3_cached_hash::hash, label_compare_lower(), nsec3_get_nextowner(), query_dname_compare(), ub_packed_rrset_key::rk, nsec3_cached_hash::rr, sldns_b32_pton_extended_hex(), sldns_buffer_begin(), sldns_buffer_clear(), and sldns_buffer_limit().
Referenced by find_covering_nsec3().
|
static |
findCoveringNSEC3 Given a name, find a covering NSEC3 from among a list of NSEC3s.
env | module environment with temporary region and buffer. |
flt | the NSEC3 RR filter, contains zone name and RRs. |
ct | cached hashes table. |
nm | name to check if covered. |
nmlen | length of name. |
rrset | covering NSEC3 rrset is returned here. |
rr | rr of cover is returned here. |
calculations | current hash calculations. |
References filter_first(), filter_next(), nsec3_cached_hash::hash, log_err(), MAX_NSEC3_CALCULATIONS, MAX_NSEC3_ERRORS, nsec3_covers(), nsec3_hash_name(), nsec3_cached_hash::rr, module_env::scratch_buffer, and nsec3_filter::zone.
|
static |
findClosestEncloser Given a name and a list of NSEC3s, find the candidate closest encloser.
This will be the first ancestor of 'name' (including itself) to have a matching NSEC3 RR.
env | module environment with temporary region and buffer. |
flt | the NSEC3 RR filter, contains zone name and RRs. |
ct | cached hashes table. |
qinfo | query that is verified for. |
ce | closest encloser information is returned in here. |
calculations | current hash calculations. |
References ce_response::ce, ce_response::ce_len, ce_response::ce_rr, ce_response::ce_rrset, dname_remove_label(), dname_subdomain_c(), find_matching_nsec3(), MAX_NSEC3_CALCULATIONS, MAX_NSEC3_ERRORS, query_info::qname, query_info::qname_len, and nsec3_filter::zone.
|
static |
Given a qname and its proven closest encloser, calculate the "next closest" name.
Basically, this is the name that is one label longer than the closest encloser that is still a subdomain of qname.
qname | query name. |
qnamelen | length of qname. |
ce | closest encloser |
nm | result name. |
nmlen | length of nm. |
References dname_count_labels(), and dname_remove_labels().
|
static |
proveClosestEncloser Given a List of nsec3 RRs, find and prove the closest encloser to qname.
env | module environment with temporary region and buffer. |
flt | the NSEC3 RR filter, contains zone name and RRs. |
ct | cached hashes table. |
qinfo | query that is verified for. |
prove_does_not_exist | If true, then if the closest encloser turns out to be qname, then null is returned. If set true, and the return value is true, then you can be certain that the ce.nc_rrset and ce.nc_rr are set properly. |
ce | closest encloser information is returned in here. |
calculations | pointer to the current NSEC3 hash calculations. |
enum sec_status nsec3_prove_nameerror | ( | struct module_env * | env, |
struct val_env * | ve, | ||
struct ub_packed_rrset_key ** | list, | ||
size_t | num, | ||
struct query_info * | qinfo, | ||
struct key_entry_key * | kkey, | ||
struct nsec3_cache_table * | ct, | ||
int * | calc | ||
) |
Determine if the set of NSEC3 records provided with a response prove NAME ERROR.
This means that the NSEC3s prove a) the closest encloser exists, b) the direct child of the closest encloser towards qname doesn't exist, and c) *.closest encloser does not exist.
env | module environment with temporary region and buffer. |
ve | validator environment, with iteration count settings. |
list | array of RRsets, some of which are NSEC3s. |
num | number of RRsets in the array to examine. |
qinfo | query that is verified for. |
kkey | key entry that signed the NSEC3s. |
ct | cached hashes table. |
calc | current hash calculations. |
enum sec_status nsec3_prove_nodata | ( | struct module_env * | env, |
struct val_env * | ve, | ||
struct ub_packed_rrset_key ** | list, | ||
size_t | num, | ||
struct query_info * | qinfo, | ||
struct key_entry_key * | kkey, | ||
struct nsec3_cache_table * | ct, | ||
int * | calc | ||
) |
Determine if the NSEC3s provided in a response prove the NOERROR/NODATA status.
There are a number of different variants to this:
1) Normal NODATA – qname is matched to an NSEC3 record, type is not present.
2) ENT NODATA – because there must be NSEC3 record for empty-non-terminals, this is the same as #1.
3) NSEC3 ownername NODATA – qname matched an existing, lone NSEC3 ownername, but qtype was not NSEC3. NOTE: as of nsec-05, this case no longer exists.
4) Wildcard NODATA – A wildcard matched the name, but not the type.
5) Opt-In DS NODATA – the qname is covered by an opt-in span and qtype == DS. (or maybe some future record with the same parent-side-only property)
env | module environment with temporary region and buffer. |
ve | validator environment, with iteration count settings. |
list | array of RRsets, some of which are NSEC3s. |
num | number of RRsets in the array to examine. |
qinfo | query that is verified for. |
kkey | key entry that signed the NSEC3s. |
ct | cached hashes table. |
calc | current hash calculations. |
enum sec_status nsec3_prove_wildcard | ( | struct module_env * | env, |
struct val_env * | ve, | ||
struct ub_packed_rrset_key ** | list, | ||
size_t | num, | ||
struct query_info * | qinfo, | ||
struct key_entry_key * | kkey, | ||
uint8_t * | wc, | ||
struct nsec3_cache_table * | ct, | ||
int * | calc | ||
) |
Prove that a positive wildcard match was appropriate (no direct match RRset).
env | module environment with temporary region and buffer. |
ve | validator environment, with iteration count settings. |
list | array of RRsets, some of which are NSEC3s. |
num | number of RRsets in the array to examine. |
qinfo | query that is verified for. |
kkey | key entry that signed the NSEC3s. |
wc | The purported wildcard that matched. This is the wildcard name as *.wildcard.name., with the *. label already removed. |
ct | cached hashes table. |
calc | current hash calculations. |
enum sec_status nsec3_prove_nods | ( | struct module_env * | env, |
struct val_env * | ve, | ||
struct ub_packed_rrset_key ** | list, | ||
size_t | num, | ||
struct query_info * | qinfo, | ||
struct key_entry_key * | kkey, | ||
char ** | reason, | ||
sldns_ede_code * | reason_bogus, | ||
struct module_qstate * | qstate, | ||
struct nsec3_cache_table * | ct, | ||
char * | reasonbuf, | ||
size_t | reasonlen | ||
) |
Prove that a DS response either had no DS, or wasn't a delegation point.
Fundamentally there are two cases here: normal NODATA and Opt-In NODATA.
env | module environment with temporary region and buffer. |
ve | validator environment, with iteration count settings. |
list | array of RRsets, some of which are NSEC3s. |
num | number of RRsets in the array to examine. |
qinfo | query that is verified for. |
kkey | key entry that signed the NSEC3s. |
reason | string for bogus result. |
reason_bogus | EDE (RFC8914) code paired with the reason of failure. |
qstate | qstate with region. |
ct | cached hashes table. |
reasonbuf | buffer to use for fail reason string print. |
reasonlen | length of reasonbuf. |
enum sec_status nsec3_prove_nxornodata | ( | struct module_env * | env, |
struct val_env * | ve, | ||
struct ub_packed_rrset_key ** | list, | ||
size_t | num, | ||
struct query_info * | qinfo, | ||
struct key_entry_key * | kkey, | ||
int * | nodata, | ||
struct nsec3_cache_table * | ct, | ||
int * | calc | ||
) |
Prove NXDOMAIN or NODATA.
env | module environment with temporary region and buffer. |
ve | validator environment, with iteration count settings. |
list | array of RRsets, some of which are NSEC3s. |
num | number of RRsets in the array to examine. |
qinfo | query that is verified for. |
kkey | key entry that signed the NSEC3s. |
nodata | if return value is secure, this indicates if nodata or nxdomain was proven. |
ct | cached hashes table. |
calc | current hash calculations. |