# -*- mmm-classes: donuts-perl -*-
# Copyright 2009-2011 SPARTA, Inc. All rights reserved.
# See the COPYING file included with the DNSSEC-Tools package for details.
#
# This file implements rules to check DNSSEC record validity
#
name: DNSSEC_NSEC_MEMORIZE
internal: yes
level: 1
type: NSEC
feature: nsec_check
push @DONUTS::DNSSEC::NSEC, $record;
return;
name: DNSSEC_NSEC3_MEMORIZE
internal: yes
level: 1
type: NSEC3
feature: nsec_check
push @DONUTS::DNSSEC::NSEC3, $record;
return;
name: DNSSEC_NSEC3_CHECK
level: 3
feature: nsec_check
ruletype: name
desc: This rule checks to see if all the NSEC3 records are complete and contain no breaks in record data gaps.
# only do this check once
return if ($current_domain ne $recordname);
if ($DONUTS::DNSSEC::NSEC3ZONE) {
my @sorted = sort { $a->name cmp $b->name } @DONUTS::DNSSEC::NSEC3;
my @results;
# print STDERR Dumper(\@sorted);
for($i = 0 ; $i < $#sorted; $i++) {
if ($sorted[$i]->hnxtname . ".$current_domain"
ne $sorted[$i+1]->name) {
push @results, "NSEC3 gap: next from " .
$sorted[$i]->name . " was expected to be " .
$sorted[$i+1]->name . ".$current_domain but was actually " .
$sorted[$i]->hnxtname;
}
}
if ($sorted[$#sorted]->hnxtname . ".$current_domain" ne $sorted[0]->name) {
push @results, "NSEC3 loop gap: next from " .
$sorted[$#sorted]->name . " was expected to be " .
$sorted[0]->name . ".$current_domain but was actually " .
$sorted[$#sorted]->hnxtname;
}
return \@results;
}
return;
name: DNSSEC_NSEC_CHECK
level: 3
feature: nsec_check
ruletype: name
desc: This rule checks to see if all the NSEC records are complete and contain no breaks in record data gaps.
# only do this check once
return if ($current_domain ne $recordname);
if (!$DONUTS::DNSSEC::NSEC3ZONE) {
my @sorted = sort {
@dname1=Net::DNS::name2labels($a->name());
@dname2=Net::DNS::name2labels($b->name());
my $i = 0;
while ($i <= $#dname1 &&
$i <= $#dname2 &&
$dname1[$#dname1-$i] eq $dname1[$#dname2-$i]) {
$i++;
}
# print "comparing: $dname1[$#dname1-$i] cmp $dname2[$#dname2-$i]\n";
# print " $i: " . join(".",@dname1) . " and " . join(".",@dname2) . "\n";
return $dname1[$#dname1-$i] cmp $dname2[$#dname2-$i]
#$a->_canonicaldata() cmp $b->_canonicaldata()
} @DONUTS::DNSSEC::NSEC;
my @results;
for($i = 0 ; $i < $#sorted; $i++) {
# print "canon: " . $sorted[$i]->name . " \n";
if ($sorted[$i]->nxtdname ne $sorted[$i+1]->name) {
push @results, "NSEC gap: next from " .
$sorted[$i]->name . " was expected to be " .
$sorted[$i+1]->name . " but was actually " .
$sorted[$i]->nxtdname;
}
}
if ($sorted[$#sorted]->nxtdname ne $sorted[0]->name) {
push @results, "NSEC loop gap: next from " .
$sorted[$#sorted]->name . " was expected to be " .
$sorted[0]->name . " but was actually " .
$sorted[$#sorted]->nxtdname;
}
return \@results;
}
return;