Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Incremental deleg support #432

Draft
wants to merge 36 commits into
base: master
Choose a base branch
from
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
36 commits
Select commit Hold shift + click to select a range
845854c
Adding build folder and IDEA project settings to gitignore
WP-Official Jan 14, 2025
4e24d55
Adding deleg feature flag
WP-Official Jan 14, 2025
8d1a489
Adding deleg RR type to dns
WP-Official Jan 14, 2025
58ca946
dns.c: Fixing typo in the number for unused 66 when not using deleg
WP-Official Jan 15, 2025
981d9f2
changing DELEG number to private use 66 -> 65280
WP-Official Jan 15, 2025
e8a3c7a
Changing to own simdzone fork
WP-Official Jan 15, 2025
d236091
Updating simdzone
WP-Official Jan 15, 2025
292a3f6
Updating simdszone to parse the DELEG RR type
WP-Official Jan 16, 2025
989d4e1
Changing gitmodules clone url from ssh to https
WP-Official Jan 16, 2025
e832ec9
Updating simdzone to convert DELEG -> IDELEG
WP-Official Jan 17, 2025
7af4b6f
Convert DELEG -> IDELEG
WP-Official Jan 17, 2025
45639e1
Removing obsolete `--enable-deleg` flag in simdzone
WP-Official Jan 17, 2025
7b6d5cc
Updating simdzone to include correct fallback matrix
WP-Official Jan 17, 2025
5eb676a
Moving dname function to add label to dname.c
WP-Official Jan 21, 2025
3dc70fd
Adding additional function to combine two labels
WP-Official Jan 21, 2025
4b99a75
Adding function to find IDELEG records
WP-Official Jan 21, 2025
021957b
Adding IDELEG search to answer_delegation
WP-Official Jan 21, 2025
d80c2ef
Fixing comment typo
WP-Official Jan 21, 2025
dc637c2
Adding RRSIG (if requested) to IDELEG
WP-Official Jan 21, 2025
5a9ee17
Removing debug statement
WP-Official Jan 21, 2025
9c0b81d
Fixing owners of IDELEG RRset
WP-Official Jan 26, 2025
a74a591
Including NSEC(3) responses when delegating an IDELEG domain
WP-Official Jan 26, 2025
15613cf
Updating labels copy to prevent 0-copy NULL error
WP-Official Jan 27, 2025
bbf99b1
Updating find IDELEG rrsets to also save the created dname
WP-Official Jan 27, 2025
169dabe
Changing delegation behavior of IDELEG domains to only include NSEC w…
WP-Official Jan 27, 2025
050ef67
Removing unneeded ds proof for IDELEG
WP-Official Jan 27, 2025
289649a
Adding NSEC3 records to IDELEG when there is no data (or NXDOMAIN)
WP-Official Jan 27, 2025
04918aa
Finishing merging upstream simdzone
WP-Official Feb 3, 2025
0ca85e7
Finishing updating IDELEG number in hashes
WP-Official Feb 3, 2025
65d4676
Fix minor styling issue
WP-Official Feb 3, 2025
094c602
Adding more NSEC(3) records in response
WP-Official Feb 4, 2025
e1a8419
Adding more NSEC(3) records in response
WP-Official Feb 4, 2025
45ea309
Fixing index error when copying labels
WP-Official Feb 4, 2025
50d2210
Fixing correct NSEC(3) record when having an IDELEG NXDOMAIN response
WP-Official Feb 4, 2025
4a618c7
Adding wildcard search for IDELEG
WP-Official Feb 4, 2025
a6095df
Merge branch 'wp-deleg' into features/ideleg
wtoorop Mar 14, 2025
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 4 additions & 0 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -43,8 +43,12 @@
/tpkg/long/result.*
/tpkg/long/.done-*
/tpkg/long/*.log
build/

# Eclipse IDE Project Settings
.cproject
.project
.settings/

# IDEA Project settings
.idea/
2 changes: 1 addition & 1 deletion .gitmodules
Original file line number Diff line number Diff line change
@@ -1,3 +1,3 @@
[submodule "simdzone"]
path = simdzone
url = https://github.com/NLnetLabs/simdzone.git
url = https://github.com/WP-Official/simdzone.git
11 changes: 10 additions & 1 deletion configure.ac
Original file line number Diff line number Diff line change
Expand Up @@ -966,6 +966,15 @@ case "$enable_zone_stats" in
;;
esac

AC_ARG_ENABLE(deleg, AS_HELP_STRING([--enable-ideleg],[Enables the use of the draft IDELEG RR type]))
case "$enable_deleg" in
yes)
AC_DEFINE_UNQUOTED([USE_IDELEG], [], [Define this to enable IDELEG draft RR type])
;;
no|''|*)
;;
esac

AC_ARG_ENABLE(checking, AS_HELP_STRING([--enable-checking],[Enable internal runtime checks]))
case "$enable_checking" in
yes)
Expand Down Expand Up @@ -1083,7 +1092,7 @@ AC_INCLUDES_DEFAULT
#include <openssl/x509v3.h>
#endif
])
AC_CHECK_DECL([TLS1_3_VERSION],
AC_CHECK_DECL([TLS1_3_VERSION],
[AC_DEFINE([HAVE_TLS_1_3], [1], [Define if TLS 1.3 is supported by OpenSSL])],
[AC_MSG_WARN([No TLS 1.3, therefore XFR-over-TLS is disabled])], [[#include <openssl/ssl.h>]])

Expand Down
78 changes: 78 additions & 0 deletions dname.c
Original file line number Diff line number Diff line change
Expand Up @@ -618,3 +618,81 @@ is_dname_subdomain_of_case(const uint8_t* d, unsigned int len,
/* The trailing portion is not at a label point. */
return 0;
}

dname_type*
label_plus_dname(const char* label, const dname_type* dname)
{
static struct {
dname_type dname;
uint8_t bytes[MAXDOMAINLEN + 128 /* max number of labels */];
} ATTR_PACKED name;
size_t i, ll;

if (!label || !dname || dname->label_count > 127)
return NULL;
ll = strlen(label);
if ((int)dname->name_size + ll + 1 > MAXDOMAINLEN)
return NULL;

/* In reversed order and first copy with memmove, so we can nest.
* i.e. label_plus_dname(label1, label_plus_dname(label2, dname))
*/
memmove(name.bytes + dname->label_count
+ 1 /* label_count increases by one */
+ 1 /* label type/length byte for label */ + ll,
((void*)dname) + sizeof(dname_type) + dname->label_count,
dname->name_size);
memcpy(name.bytes + dname->label_count
+ 1 /* label_count increases by one */
+ 1 /* label type/length byte for label */, label, ll);
name.bytes[dname->label_count + 1] = ll; /* label type/length byte */
name.bytes[dname->label_count] = 0; /* first label follows last
* label_offsets element */
for (i = 0; i < dname->label_count; i++)
name.bytes[i] = ((uint8_t*)(void*)dname)[sizeof(dname_type)+i]
+ 1 /* label type/length byte for label */ + ll;
name.dname.label_count = dname->label_count + 1 /* label_count incr. */;
name.dname.name_size = dname->name_size + ll
+ 1 /* label length */;
return &name.dname;
}

dname_type*
labels_plus_dname(const dname_type* labels, size_t amount_to_be_copied, dname_type* dname)
{
static struct {
dname_type dname;
uint8_t bytes[MAXDOMAINLEN + 128 /* max number of labels */];
} ATTR_PACKED name;
size_t i;
uint8_t copied_label_size;
copied_label_size = 0;
if (!amount_to_be_copied) return dname; // If the size is 0 we return the original dname
if (!labels || !dname || dname->label_count > 127 ||
amount_to_be_copied > labels->label_count)
return NULL;

for (i = 0; i < amount_to_be_copied; i++)
{
copied_label_size += label_length(dname_label(labels, labels->label_count - i - 1));
}
if ((int)dname->name_size + copied_label_size + 1 > MAXDOMAINLEN)
return NULL;

name.dname.label_count = dname->label_count + amount_to_be_copied;
name.dname.name_size = dname->name_size + copied_label_size + amount_to_be_copied;
/* In reversed order and first copy with memmove, so we can nest.
* i.e. labels_plus_dname(labels1, 1,labels_plus_dname(label2, 2, dname))
*/
memmove(name.bytes + copied_label_size + name.dname.label_count + 1, ((void*)dname) + sizeof(dname_type) + dname->label_count, dname->name_size);
memcpy(name.bytes + name.dname.label_count,
((void*)labels) + sizeof(dname_type) + labels->label_count,
copied_label_size + amount_to_be_copied);


name.bytes[dname->label_count] = 0;
for (i = 0; i < dname->label_count; i++)
name.bytes[i] = ((uint8_t*)(void*)dname)[sizeof(dname_type)+i]
+ copied_label_size /* label type/length byte for label */ + amount_to_be_copied;
return &name.dname;
}
7 changes: 7 additions & 0 deletions dname.h
Original file line number Diff line number Diff line change
Expand Up @@ -403,4 +403,11 @@ int dname_equal_nocase(uint8_t* a, uint8_t* b, uint16_t len);
int is_dname_subdomain_of_case(const uint8_t* d, unsigned int len,
const uint8_t* d2, unsigned int len2);

/** return dname with label prepended to dname */
dname_type* label_plus_dname(const char* label,const dname_type* dname);

/** return dname with amount_of_labels from labels prepended to dname */
dname_type* labels_plus_dname(const dname_type* labels,
size_t amount_to_be_copied, dname_type* dname);

#endif /* DNAME_H */
57 changes: 56 additions & 1 deletion dns.c
Original file line number Diff line number Diff line change
Expand Up @@ -416,7 +416,7 @@ static rrtype_descriptor_type rrtype_descriptors[(RRTYPE_DESCRIPTORS_LENGTH+2)]
, RDATA_WF_SVCPARAM, RDATA_WF_SVCPARAM, RDATA_WF_SVCPARAM
, RDATA_WF_SVCPARAM, RDATA_WF_SVCPARAM, RDATA_WF_SVCPARAM
},
{ RDATA_ZF_SHORT , RDATA_ZF_DNAME
{ RDATA_ZF_SHORT , RDATA_ZF_DNAME
, RDATA_ZF_SVCPARAM, RDATA_ZF_SVCPARAM
, RDATA_ZF_SVCPARAM, RDATA_ZF_SVCPARAM, RDATA_ZF_SVCPARAM
, RDATA_ZF_SVCPARAM, RDATA_ZF_SVCPARAM, RDATA_ZF_SVCPARAM
Expand Down Expand Up @@ -922,6 +922,57 @@ static rrtype_descriptor_type rrtype_descriptors[(RRTYPE_DESCRIPTORS_LENGTH+2)]
{ TYPE_DLV, "DLV", 4, 4,
{ RDATA_WF_SHORT, RDATA_WF_BYTE, RDATA_WF_BYTE, RDATA_WF_BINARY },
{ RDATA_ZF_SHORT, RDATA_ZF_ALGORITHM, RDATA_ZF_BYTE, RDATA_ZF_HEX } },
#ifdef USE_IDELEG
/* 65280 IDELEG*/
{ TYPE_IDELEG, "IDELEG", 2, MAXRDATALEN,
{ RDATA_WF_SHORT /* SvcFieldPriority */
, RDATA_WF_UNCOMPRESSED_DNAME /* SvcDomainName */
, RDATA_WF_SVCPARAM, RDATA_WF_SVCPARAM /* SvcFieldValue */
, RDATA_WF_SVCPARAM, RDATA_WF_SVCPARAM, RDATA_WF_SVCPARAM
, RDATA_WF_SVCPARAM, RDATA_WF_SVCPARAM, RDATA_WF_SVCPARAM
, RDATA_WF_SVCPARAM, RDATA_WF_SVCPARAM, RDATA_WF_SVCPARAM
, RDATA_WF_SVCPARAM, RDATA_WF_SVCPARAM, RDATA_WF_SVCPARAM
, RDATA_WF_SVCPARAM, RDATA_WF_SVCPARAM, RDATA_WF_SVCPARAM
, RDATA_WF_SVCPARAM, RDATA_WF_SVCPARAM, RDATA_WF_SVCPARAM
, RDATA_WF_SVCPARAM, RDATA_WF_SVCPARAM, RDATA_WF_SVCPARAM
, RDATA_WF_SVCPARAM, RDATA_WF_SVCPARAM, RDATA_WF_SVCPARAM
, RDATA_WF_SVCPARAM, RDATA_WF_SVCPARAM, RDATA_WF_SVCPARAM
, RDATA_WF_SVCPARAM, RDATA_WF_SVCPARAM, RDATA_WF_SVCPARAM
, RDATA_WF_SVCPARAM, RDATA_WF_SVCPARAM, RDATA_WF_SVCPARAM
, RDATA_WF_SVCPARAM, RDATA_WF_SVCPARAM, RDATA_WF_SVCPARAM
, RDATA_WF_SVCPARAM, RDATA_WF_SVCPARAM, RDATA_WF_SVCPARAM
, RDATA_WF_SVCPARAM, RDATA_WF_SVCPARAM, RDATA_WF_SVCPARAM
, RDATA_WF_SVCPARAM, RDATA_WF_SVCPARAM, RDATA_WF_SVCPARAM
, RDATA_WF_SVCPARAM, RDATA_WF_SVCPARAM, RDATA_WF_SVCPARAM
, RDATA_WF_SVCPARAM, RDATA_WF_SVCPARAM, RDATA_WF_SVCPARAM
, RDATA_WF_SVCPARAM, RDATA_WF_SVCPARAM, RDATA_WF_SVCPARAM
, RDATA_WF_SVCPARAM, RDATA_WF_SVCPARAM, RDATA_WF_SVCPARAM
, RDATA_WF_SVCPARAM, RDATA_WF_SVCPARAM, RDATA_WF_SVCPARAM
},
{ RDATA_ZF_SHORT , RDATA_ZF_DNAME
, RDATA_ZF_SVCPARAM, RDATA_ZF_SVCPARAM
, RDATA_ZF_SVCPARAM, RDATA_ZF_SVCPARAM, RDATA_ZF_SVCPARAM
, RDATA_ZF_SVCPARAM, RDATA_ZF_SVCPARAM, RDATA_ZF_SVCPARAM
, RDATA_ZF_SVCPARAM, RDATA_ZF_SVCPARAM, RDATA_ZF_SVCPARAM
, RDATA_ZF_SVCPARAM, RDATA_ZF_SVCPARAM, RDATA_ZF_SVCPARAM
, RDATA_ZF_SVCPARAM, RDATA_ZF_SVCPARAM, RDATA_ZF_SVCPARAM
, RDATA_ZF_SVCPARAM, RDATA_ZF_SVCPARAM, RDATA_ZF_SVCPARAM
, RDATA_ZF_SVCPARAM, RDATA_ZF_SVCPARAM, RDATA_ZF_SVCPARAM
, RDATA_ZF_SVCPARAM, RDATA_ZF_SVCPARAM, RDATA_ZF_SVCPARAM
, RDATA_ZF_SVCPARAM, RDATA_ZF_SVCPARAM, RDATA_ZF_SVCPARAM
, RDATA_ZF_SVCPARAM, RDATA_ZF_SVCPARAM, RDATA_ZF_SVCPARAM
, RDATA_ZF_SVCPARAM, RDATA_ZF_SVCPARAM, RDATA_ZF_SVCPARAM
, RDATA_ZF_SVCPARAM, RDATA_ZF_SVCPARAM, RDATA_ZF_SVCPARAM
, RDATA_ZF_SVCPARAM, RDATA_ZF_SVCPARAM, RDATA_ZF_SVCPARAM
, RDATA_ZF_SVCPARAM, RDATA_ZF_SVCPARAM, RDATA_ZF_SVCPARAM
, RDATA_ZF_SVCPARAM, RDATA_ZF_SVCPARAM, RDATA_ZF_SVCPARAM
, RDATA_ZF_SVCPARAM, RDATA_ZF_SVCPARAM, RDATA_ZF_SVCPARAM
, RDATA_ZF_SVCPARAM, RDATA_ZF_SVCPARAM, RDATA_ZF_SVCPARAM
, RDATA_ZF_SVCPARAM, RDATA_ZF_SVCPARAM, RDATA_ZF_SVCPARAM
, RDATA_ZF_SVCPARAM, RDATA_ZF_SVCPARAM, RDATA_ZF_SVCPARAM
, RDATA_ZF_SVCPARAM, RDATA_ZF_SVCPARAM, RDATA_ZF_SVCPARAM
} },
#endif
};

rrtype_descriptor_type *
Expand All @@ -933,6 +984,10 @@ rrtype_descriptor_by_type(uint16_t type)
return &rrtype_descriptors[PSEUDO_TYPE_DLV];
else if (type == TYPE_TA)
return &rrtype_descriptors[PSEUDO_TYPE_TA];
#ifdef USE_IDELEG
else if (type == TYPE_IDELEG)
return &rrtype_descriptors[PSEUDO_TYPE_IDELEG];
#endif
return &rrtype_descriptors[0];
}

Expand Down
10 changes: 9 additions & 1 deletion dns.h
Original file line number Diff line number Diff line change
Expand Up @@ -175,8 +175,16 @@ typedef enum nsd_rc nsd_rc_type;

#define TYPE_TA 32768 /* http://www.watson.org/~weiler/INI1999-19.pdf */
#define TYPE_DLV 32769 /* RFC 4431 */

#ifdef USE_IDELEG
#define TYPE_IDELEG 65280 /* IETF IDELEG draft*/
#endif

#define PSEUDO_TYPE_TA RRTYPE_DESCRIPTORS_LENGTH
#define PSEUDO_TYPE_DLV (RRTYPE_DESCRIPTORS_LENGTH + 1)
#ifdef USE_IDELEG
#define PSEUDO_TYPE_IDELEG (RRTYPE_DESCRIPTORS_LENGTH + 2)
#endif

#define SVCB_KEY_MANDATORY 0
#define SVCB_KEY_ALPN 1
Expand Down Expand Up @@ -299,7 +307,7 @@ typedef struct rrtype_descriptor rrtype_descriptor_type;
* Indexed by type. The special type "0" can be used to get a
* descriptor for unknown types (with one binary rdata).
*
* CLA + 1
* IPN + 1
*/
#define RRTYPE_DESCRIPTORS_LENGTH (TYPE_IPN + 1)
rrtype_descriptor_type *rrtype_descriptor_by_name(const char *name);
Expand Down
64 changes: 63 additions & 1 deletion namedb.c
Original file line number Diff line number Diff line change
Expand Up @@ -34,7 +34,7 @@ allocate_domain_info(domain_table_type* table,
result = (domain_type *) region_alloc(table->region,
sizeof(domain_type));
#ifdef USE_RADIX_TREE
result->dname
result->dname
#else
result->node.key
#endif
Expand Down Expand Up @@ -600,6 +600,68 @@ domain_find_ns_rrsets(domain_type* domain, zone_type* zone, rrset_type **ns)
return NULL;
}

#ifdef USE_IDELEG
rrset_type *
domain_find_deleg_rrsets(domain_type* delegation_domain, zone_type* zone,
namedb_type* db, domain_type** ideleg_domain, dname_type** ideleg_dname)
{
rrset_type* result;
*ideleg_dname = labels_plus_dname(delegation_domain->dname,
delegation_domain->dname->label_count - zone->apex->dname->label_count,
label_plus_dname("_deleg", zone->apex->dname));
*ideleg_domain = domain_table_find(db->domains, *ideleg_dname);
if (!*ideleg_domain)
return NULL;
result = domain_find_rrset(*ideleg_domain, zone, TYPE_IDELEG);

return result;
}

rrset_type *
domain_find_deleg_wildcard_rrsets(dname_type* ideleg_dname, zone_type* zone,
region_type* region, namedb_type* db, domain_type** wildcard_match)
{
domain_type* closest_match;
domain_type* closest_encloser;
domain_type* wildcard_child;
domain_type* match;
namedb_lookup(db, ideleg_dname, &closest_match, &closest_encloser);
wildcard_child = domain_wildcard_child(closest_encloser);
if (!wildcard_child || !wildcard_child->is_existing)
{
return NULL;
}
match = (domain_type *) region_alloc(region,
sizeof(domain_type));
#ifdef USE_RADIX_TREE
match->rnode = NULL;
match->dname = ideleg_dname;
#else
memcpy(&match->node, &wildcard_child->node, sizeof(rbnode_type));
match->node.parent = NULL;
#endif
match->parent = closest_encloser;
match->wildcard_child_closest_match = match;
// match->number = domain_number;
match->rrsets = wildcard_child->rrsets;
match->is_existing = wildcard_child->is_existing;
#ifdef NSEC3
match->nsec3 = wildcard_child->nsec3;
/* copy over these entries:
match->nsec3_is_exact = wildcard_child->nsec3_is_exact;
match->nsec3_cover = wildcard_child->nsec3_cover;
match->nsec3_wcard_child_cover = wildcard_child->nsec3_wcard_child_cover;
match->nsec3_ds_parent_is_exact = wildcard_child->nsec3_ds_parent_is_exact;
match->nsec3_ds_parent_cover = wildcard_child->nsec3_ds_parent_cover;
*/

#endif

*wildcard_match = match;
return domain_find_rrset(wildcard_child, zone, TYPE_IDELEG);
}
#endif

domain_type *
find_dname_above(domain_type* domain, zone_type* zone)
{
Expand Down
8 changes: 7 additions & 1 deletion namedb.h
Original file line number Diff line number Diff line change
Expand Up @@ -372,7 +372,7 @@ zone_type *namedb_find_zone(namedb_type *db, const dname_type *dname);
/*
* Delete a domain name from the domain table. Removes dname_info node.
* Only deletes if usage is 0, has no rrsets and no children. Checks parents
* for deletion as well. Adjusts numberlist(domain.number), and
* for deletion as well. Adjusts numberlist(domain.number), and
* wcard_child closest match.
*/
void domain_table_deldomain(namedb_type* db, domain_type* domain);
Expand Down Expand Up @@ -474,4 +474,10 @@ void zone_rr_iter_init(zone_rr_iter_type *iter, zone_type *zone);

rr_type *zone_rr_iter_next(zone_rr_iter_type *iter);

#ifdef USE_IDELEG
rrset_type *domain_find_deleg_rrsets(domain_type* delegation_domain, zone_type* zone, namedb_type* db, domain_type **ideleg_domain, dname_type **ideleg_dname);

rrset_type *domain_find_deleg_wildcard_rrsets(dname_type* ideleg_dname, zone_type* zone, region_type* region, namedb_type* db, domain_type** wildcard_match);
#endif

#endif /* NAMEDB_H */
2 changes: 1 addition & 1 deletion nsec3.c
Original file line number Diff line number Diff line change
Expand Up @@ -360,7 +360,7 @@ hash_tree_clear(rbtree_type* tree)
* then mean setting the key value of the nodes to NULL to indicate
* absence of the prehash.
* But since prehash structs are separatly allocated, this is no longer
* necessary as currently the prehash structs are simply recycled and
* necessary as currently the prehash structs are simply recycled and
* NULLed.
*
* rbnode_type* n;
Expand Down
Loading