From 6dd373ebab79c3642e3ff024d431c79560ec099f Mon Sep 17 00:00:00 2001 From: Evan Hunt Date: Thu, 26 May 2011 23:10:13 +0000 Subject: [PATCH] 3121. [security] An authoritative name server sending a negative response containing a very large RRset could trigger an off-by-one error in the ncache code and crash named. [RT #24650] 3120. [bug] Named could fail to validate zones listed in a DLV that validated insecure without using DLV and had DS records in the parent zone. [RT #24631] 3119. [bug] When rolling to a new DNSSEC key, a private-type record could be created and never marked complete. [RT #23253] --- CHANGES | 12 ++ bin/tests/system/autosign/ns2/keygen.sh | 4 +- bin/tests/system/autosign/tests.sh | 63 +++++++- bin/tests/system/dlv/clean.sh | 17 ++- bin/tests/system/dlv/ns1/named.conf | 6 +- .../system/dlv/ns1/{root.db => root.db.in} | 4 +- bin/tests/system/dlv/ns1/sign.sh | 52 +++++++ bin/tests/system/dlv/ns2/druz.db.in | 54 +++++++ bin/tests/system/dlv/ns2/named.conf | 5 +- bin/tests/system/dlv/ns2/sign.sh | 44 ++++++ bin/tests/system/dlv/ns3/named.conf | 10 +- bin/tests/system/dlv/ns3/sign.sh | 143 ++++++++++++++++-- bin/tests/system/dlv/ns5/named.conf | 3 +- bin/tests/system/dlv/ns6/named.conf | 10 +- bin/tests/system/dlv/ns6/sign.sh | 121 ++++++++++++++- bin/tests/system/dlv/setup.sh | 4 +- bin/tests/system/dlv/tests.sh | 18 ++- bin/tests/system/dnssec/tests.sh | 45 +++++- lib/dns/ncache.c | 4 +- lib/dns/validator.c | 37 +++-- lib/dns/zone.c | 107 ++++++------- 21 files changed, 655 insertions(+), 108 deletions(-) rename bin/tests/system/dlv/ns1/{root.db => root.db.in} (90%) create mode 100755 bin/tests/system/dlv/ns1/sign.sh create mode 100644 bin/tests/system/dlv/ns2/druz.db.in create mode 100755 bin/tests/system/dlv/ns2/sign.sh diff --git a/CHANGES b/CHANGES index 99ed3564a7..e90cc7090e 100644 --- a/CHANGES +++ b/CHANGES @@ -1,3 +1,15 @@ +3121. [security] An authoritative name server sending a negative + response containing a very large RRset could + trigger an off-by-one error in the ncache code + and crash named. [RT #24650] + +3120. [bug] Named could fail to validate zones listed in a DLV + that validated insecure without using DLV and had + DS records in the parent zone. [RT #24631] + +3119. [bug] When rolling to a new DNSSEC key, a private-type + record could be created and never marked complete. + [RT #23253] --- 9.7.4rc1 released --- diff --git a/bin/tests/system/autosign/ns2/keygen.sh b/bin/tests/system/autosign/ns2/keygen.sh index 154d708b20..1062078b8e 100644 --- a/bin/tests/system/autosign/ns2/keygen.sh +++ b/bin/tests/system/autosign/ns2/keygen.sh @@ -14,7 +14,7 @@ # OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR # PERFORMANCE OF THIS SOFTWARE. -# $Id: keygen.sh,v 1.3.6.4 2010/06/07 04:47:26 marka Exp $ +# $Id: keygen.sh,v 1.3.6.5 2011/05/26 23:10:11 each Exp $ SYSTEMTESTTOP=../.. . $SYSTEMTESTTOP/conf.sh @@ -57,5 +57,5 @@ for i in Xbar.+005+30676.key Xbar.+005+30804.key Xbar.+005+30676.private \ do cp $i `echo $i | sed s/X/K/` done -$KEYGEN -3 -q -r $RANDFILE $zone > /dev/null +$KEYGEN -q -r $RANDFILE $zone > /dev/null $DSFROMKEY Kbar.+005+30804.key > dsset-bar. diff --git a/bin/tests/system/autosign/tests.sh b/bin/tests/system/autosign/tests.sh index 9c28fb5106..ac42dffe6b 100644 --- a/bin/tests/system/autosign/tests.sh +++ b/bin/tests/system/autosign/tests.sh @@ -14,7 +14,7 @@ # OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR # PERFORMANCE OF THIS SOFTWARE. -# $Id: tests.sh,v 1.4.6.18 2011/05/03 00:37:24 marka Exp $ +# $Id: tests.sh,v 1.4.6.19 2011/05/26 23:10:11 each Exp $ SYSTEMTESTTOP=.. . $SYSTEMTESTTOP/conf.sh @@ -26,6 +26,34 @@ n=0 DIGOPTS="+tcp +noadd +nosea +nostat +nocmd +dnssec -p 5300" +# convert private-type records to readable form +showprivate () { + echo "-- $@ --" + $DIG $DIGOPTS +nodnssec +short @$2 -t type65534 $1 | cut -f3 -d' ' | + while read record; do + perl -e 'my $rdata = pack("H*", @ARGV[0]); + die "invalid record" unless length($rdata) == 5; + my ($alg, $key, $remove, $complete) = unpack("CnCC", $rdata); + my $action = "signing"; + $action = "removing" if $remove; + my $state = " (incomplete)"; + $state = " (complete)" if $complete; + print ("$action: alg: $alg, key: $key$state\n");' $record + done +} + +# check that signing records are marked as complete +checkprivate () { + ret=0 + x=`showprivate "$@"` + echo $x | grep incomplete >&- 2>&- && ret=1 + [ $ret = 1 ] && { + echo "$x" + echo "I:failed" + } + return $ret +} + # # The NSEC record at the apex of the zone and its RRSIG records are # added as part of the last step in signing a zone. We wait for the @@ -708,13 +736,14 @@ oldfile=`cat active.key` oldid=`sed 's/^K.+007+0*//' < active.key` newfile=`cat standby.key` newid=`sed 's/^K.+007+0*//' < standby.key` -$SETTIME -K ns1 -I now -D now+15 $oldfile > /dev/null +$SETTIME -K ns1 -I now+2s -D now+15 $oldfile > /dev/null $SETTIME -K ns1 -i 0 -S $oldfile $newfile > /dev/null # note previous zone serial number oldserial=`$DIG $DIGOPTS +short soa . @10.53.0.1 | awk '{print $3}'` $RNDC -c ../common/rndc.conf -s 10.53.0.1 -p 9953 loadkeys . 2>&1 | sed 's/^/I:ns1 /' +sleep 4 echo "I:revoking key to duplicated key ID" $SETTIME -R now -K ns2 Kbar.+005+30676.key > /dev/null @@ -741,6 +770,36 @@ n=`expr $n + 1` if [ $ret != 0 ]; then echo "I:failed"; fi status=`expr $status + $ret` +echo "I:checking that signing records have been marked as complete ($n)" +ret=0 +checkprivate . 10.53.0.1 || ret=1 +checkprivate bar 10.53.0.2 || ret=1 +checkprivate example 10.53.0.2 || ret=1 +checkprivate private.secure.example 10.53.0.3 || ret=1 +checkprivate nsec3.example 10.53.0.3 || ret=1 +checkprivate nsec3.nsec3.example 10.53.0.3 || ret=1 +checkprivate nsec3.optout.example 10.53.0.3 || ret=1 +checkprivate nsec3-to-nsec.example 10.53.0.3 || ret=1 +checkprivate nsec.example 10.53.0.3 || ret=1 +checkprivate oldsigs.example 10.53.0.3 || ret=1 +checkprivate optout.example 10.53.0.3 || ret=1 +checkprivate optout.nsec3.example 10.53.0.3 || ret=1 +checkprivate optout.optout.example 10.53.0.3 || ret=1 +checkprivate prepub.example 10.53.0.3 || ret=1 +checkprivate rsasha256.example 10.53.0.3 || ret=1 +checkprivate rsasha512.example 10.53.0.3 || ret=1 +checkprivate secure.example 10.53.0.3 || ret=1 +checkprivate secure.nsec3.example 10.53.0.3 || ret=1 +checkprivate secure.optout.example 10.53.0.3 || ret=1 +checkprivate secure-to-insecure2.example 10.53.0.3 || ret=1 +checkprivate secure-to-insecure.example 10.53.0.3 || ret=1 +checkprivate ttl1.example 10.53.0.3 || ret=1 +checkprivate ttl2.example 10.53.0.3 || ret=1 +checkprivate ttl3.example 10.53.0.3 || ret=1 +checkprivate ttl4.example 10.53.0.3 || ret=1 +n=`expr $n + 1` +status=`expr $status + $ret` + echo "I:forcing full sign" $RNDC -c ../common/rndc.conf -s 10.53.0.1 -p 9953 sign . 2>&1 | sed 's/^/I:ns1 /' diff --git a/bin/tests/system/dlv/clean.sh b/bin/tests/system/dlv/clean.sh index 0fd253a128..2be6794986 100644 --- a/bin/tests/system/dlv/clean.sh +++ b/bin/tests/system/dlv/clean.sh @@ -14,17 +14,30 @@ # OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR # PERFORMANCE OF THIS SOFTWARE. -# $Id: clean.sh,v 1.5.476.2 2010/05/27 23:49:55 tbox Exp $ +# $Id: clean.sh,v 1.5.476.3 2011/05/26 23:10:11 each Exp $ rm -f random.data rm -f ns*/named.run +rm -f ns1/K* +rm -f ns1/dsset-* +rm -f ns1/*.signed +rm -f ns1/signer.err +rm -f ns1/root.db +rm -f ns2/K* +rm -f ns2/dlvset-* +rm -f ns2/dsset-* +rm -f ns2/*.signed +rm -f ns2/*.pre +rm -f ns2/signer.err +rm -f ns2/druz.db rm -f ns3/K* rm -f ns3/*.db rm -f ns3/*.signed rm -f ns3/dlvset-* rm -f ns3/dsset-* rm -f ns3/keyset-* -rm -f ns3/trusted.conf ns5/trusted.conf +rm -f ns1/trusted.conf ns5/trusted.conf +rm -f ns3/trusted-dlv.conf ns5/trusted-dlv.conf rm -f ns3/signer.err rm -f ns6/K* rm -f ns6/*.db diff --git a/bin/tests/system/dlv/ns1/named.conf b/bin/tests/system/dlv/ns1/named.conf index bfb64ed220..40b7592663 100644 --- a/bin/tests/system/dlv/ns1/named.conf +++ b/bin/tests/system/dlv/ns1/named.conf @@ -14,7 +14,7 @@ * PERFORMANCE OF THIS SOFTWARE. */ -/* $Id: named.conf,v 1.4 2007/06/19 23:47:02 tbox Exp $ */ +/* $Id: named.conf,v 1.4.558.1 2011/05/26 23:10:11 each Exp $ */ controls { /* empty */ }; @@ -28,8 +28,8 @@ options { listen-on-v6 { none; }; recursion no; notify yes; - dnssec-enable no; + dnssec-enable yes; }; -zone "." { type master; file "root.db"; }; +zone "." { type master; file "root.signed"; }; zone "rootservers.utld" { type master; file "rootservers.utld.db"; }; diff --git a/bin/tests/system/dlv/ns1/root.db b/bin/tests/system/dlv/ns1/root.db.in similarity index 90% rename from bin/tests/system/dlv/ns1/root.db rename to bin/tests/system/dlv/ns1/root.db.in index ed7aee3524..b934e18829 100644 --- a/bin/tests/system/dlv/ns1/root.db +++ b/bin/tests/system/dlv/ns1/root.db.in @@ -12,7 +12,7 @@ ; OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR ; PERFORMANCE OF THIS SOFTWARE. -; $Id: root.db,v 1.4 2007/06/19 23:47:02 tbox Exp $ +; $Id: root.db.in,v 1.2.6.2 2011/05/26 23:10:11 each Exp $ $TTL 120 @ SOA ns.rootservers.utld hostmaster.ns.rootservers.utld ( @@ -22,3 +22,5 @@ ns A 10.53.0.1 ; utld NS ns.utld ns.utld A 10.53.0.2 +druz NS ns.druz +ns.druz A 10.53.0.2 diff --git a/bin/tests/system/dlv/ns1/sign.sh b/bin/tests/system/dlv/ns1/sign.sh new file mode 100755 index 0000000000..6b60f73ffe --- /dev/null +++ b/bin/tests/system/dlv/ns1/sign.sh @@ -0,0 +1,52 @@ +#!/bin/sh +# +# Copyright (C) 2004, 2007, 2009, 2010 Internet Systems Consortium, Inc. ("ISC") +# +# Permission to use, copy, modify, and/or distribute this software for any +# purpose with or without fee is hereby granted, provided that the above +# copyright notice and this permission notice appear in all copies. +# +# THE SOFTWARE IS PROVIDED "AS IS" AND ISC DISCLAIMS ALL WARRANTIES WITH +# REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY +# AND FITNESS. IN NO EVENT SHALL ISC BE LIABLE FOR ANY SPECIAL, DIRECT, +# INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM +# LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE +# OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR +# PERFORMANCE OF THIS SOFTWARE. + +# $Id: sign.sh,v 1.2.6.2 2011/05/26 23:10:12 each Exp $ + +(cd ../ns2 && sh -e ./sign.sh || exit 1) + +echo "I:dlv/ns1/sign.sh" + +SYSTEMTESTTOP=../.. +. $SYSTEMTESTTOP/conf.sh + +RANDFILE=../random.data + +zone=. +infile=root.db.in +zonefile=root.db +outfile=root.signed + +keyname1=`$KEYGEN -r $RANDFILE -a DSA -b 768 -n zone $zone 2> /dev/null` +keyname2=`$KEYGEN -f KSK -r $RANDFILE -a DSA -b 768 -n zone $zone 2> /dev/null` + +cat $infile $keyname1.key $keyname2.key >$zonefile + +$SIGNER -r $RANDFILE -g -o $zone -f $outfile $zonefile > /dev/null 2> signer.err || cat signer.err + +echo "I: signed $zone" + +grep -v '^;' $keyname2.key | $PERL -n -e ' +local ($dn, $class, $type, $flags, $proto, $alg, @rest) = split; +local $key = join("", @rest); +print < trusted.conf +cp trusted.conf ../ns5 + diff --git a/bin/tests/system/dlv/ns2/druz.db.in b/bin/tests/system/dlv/ns2/druz.db.in new file mode 100644 index 0000000000..af1ec2d65a --- /dev/null +++ b/bin/tests/system/dlv/ns2/druz.db.in @@ -0,0 +1,54 @@ +; Copyright (C) 2004, 2007 Internet Systems Consortium, Inc. ("ISC") +; +; Permission to use, copy, modify, and/or distribute this software for any +; purpose with or without fee is hereby granted, provided that the above +; copyright notice and this permission notice appear in all copies. +; +; THE SOFTWARE IS PROVIDED "AS IS" AND ISC DISCLAIMS ALL WARRANTIES WITH +; REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY +; AND FITNESS. IN NO EVENT SHALL ISC BE LIABLE FOR ANY SPECIAL, DIRECT, +; INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM +; LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE +; OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR +; PERFORMANCE OF THIS SOFTWARE. + +; $Id: druz.db.in,v 1.3.6.2 2011/05/26 23:10:12 each Exp $ + +$TTL 120 +@ SOA ns hostmaster.ns 1 3600 1200 604800 60 +@ NS ns +ns A 10.53.0.2 +; +rootservers NS ns.rootservers +ns.rootservers A 10.53.0.1 +; +; +child1 NS ns.child1 +ns.child1 A 10.53.0.3 +; +child2 NS ns.child2 +ns.child2 A 10.53.0.4 +; +child3 NS ns.child3 +ns.child3 A 10.53.0.3 +; +child4 NS ns.child4 +ns.child4 A 10.53.0.3 +; +child5 NS ns.child5 +ns.child5 A 10.53.0.3 +; +child6 NS ns.child6 +ns.child6 A 10.53.0.4 +; +child7 NS ns.child7 +ns.child7 A 10.53.0.3 +; +child8 NS ns.child8 +ns.child8 A 10.53.0.3 +; +child9 NS ns.child9 +ns.child9 A 10.53.0.3 +; +child10 NS ns.child10 +ns.child10 A 10.53.0.3 diff --git a/bin/tests/system/dlv/ns2/named.conf b/bin/tests/system/dlv/ns2/named.conf index 195a46f8a0..c3729b6f41 100644 --- a/bin/tests/system/dlv/ns2/named.conf +++ b/bin/tests/system/dlv/ns2/named.conf @@ -14,7 +14,7 @@ * PERFORMANCE OF THIS SOFTWARE. */ -/* $Id: named.conf,v 1.4 2007/06/19 23:47:02 tbox Exp $ */ +/* $Id: named.conf,v 1.4.558.1 2011/05/26 23:10:12 each Exp $ */ controls { /* empty */ }; @@ -28,8 +28,9 @@ options { listen-on-v6 { none; }; recursion no; notify yes; - dnssec-enable no; + dnssec-enable yes; }; zone "." { type hint; file "hints"; }; zone "utld" { type master; file "utld.db"; }; +zone "druz" { type master; file "druz.signed"; }; diff --git a/bin/tests/system/dlv/ns2/sign.sh b/bin/tests/system/dlv/ns2/sign.sh new file mode 100755 index 0000000000..9f76c89d14 --- /dev/null +++ b/bin/tests/system/dlv/ns2/sign.sh @@ -0,0 +1,44 @@ +#!/bin/sh +# +# Copyright (C) 2004, 2007, 2009, 2010 Internet Systems Consortium, Inc. ("ISC") +# +# Permission to use, copy, modify, and/or distribute this software for any +# purpose with or without fee is hereby granted, provided that the above +# copyright notice and this permission notice appear in all copies. +# +# THE SOFTWARE IS PROVIDED "AS IS" AND ISC DISCLAIMS ALL WARRANTIES WITH +# REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY +# AND FITNESS. IN NO EVENT SHALL ISC BE LIABLE FOR ANY SPECIAL, DIRECT, +# INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM +# LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE +# OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR +# PERFORMANCE OF THIS SOFTWARE. + +# $Id: sign.sh,v 1.2.6.2 2011/05/26 23:10:12 each Exp $ + +(cd ../ns3 && sh -e ./sign.sh || exit 1) + +echo "I:dlv/ns2/sign.sh" + +SYSTEMTESTTOP=../.. +. $SYSTEMTESTTOP/conf.sh + +RANDFILE=../random.data + +zone=druz. +infile=druz.db.in +zonefile=druz.db +outfile=druz.pre +dlvzone=utld. + +keyname1=`$KEYGEN -r $RANDFILE -a DSA -b 768 -n zone $zone 2> /dev/null` +keyname2=`$KEYGEN -f KSK -r $RANDFILE -a DSA -b 768 -n zone $zone 2> /dev/null` + +cat $infile $keyname1.key $keyname2.key >$zonefile + +$SIGNER -r $RANDFILE -l $dlvzone -g -o $zone -f $outfile $zonefile > /dev/null 2> signer.err || cat signer.err + +$CHECKZONE -q -D -i none druz druz.pre | +sed '/IN DNSKEY/s/\([a-z0-9A-Z/]\{10\}\)[a-z0-9A-Z/]\{16\}/\1XXXXXXXXXXXXXXXX/'> druz.signed + +echo "I: signed $zone" diff --git a/bin/tests/system/dlv/ns3/named.conf b/bin/tests/system/dlv/ns3/named.conf index a03fb05de7..d00496343b 100644 --- a/bin/tests/system/dlv/ns3/named.conf +++ b/bin/tests/system/dlv/ns3/named.conf @@ -14,7 +14,7 @@ * PERFORMANCE OF THIS SOFTWARE. */ -/* $Id: named.conf,v 1.4 2007/06/19 23:47:02 tbox Exp $ */ +/* $Id: named.conf,v 1.4.558.1 2011/05/26 23:10:12 each Exp $ */ controls { /* empty */ }; @@ -41,3 +41,11 @@ zone "child7.utld" { type master; file "child7.signed"; }; // no dlv zone "child8.utld" { type master; file "child8.signed"; }; // no dlv zone "child9.utld" { type master; file "child9.signed"; }; // dlv zone "child10.utld" { type master; file "child.db.in"; }; // dlv unsigned +zone "child1.druz" { type master; file "child1.druz.signed"; }; // dlv +zone "child3.druz" { type master; file "child3.druz.signed"; }; // dlv +zone "child4.druz" { type master; file "child4.druz.signed"; }; // dlv +zone "child5.druz" { type master; file "child5.druz.signed"; }; // dlv +zone "child7.druz" { type master; file "child7.druz.signed"; }; // no dlv +zone "child8.druz" { type master; file "child8.druz.signed"; }; // no dlv +zone "child9.druz" { type master; file "child9.druz.signed"; }; // dlv +zone "child10.druz" { type master; file "child.db.in"; }; // dlv unsigned diff --git a/bin/tests/system/dlv/ns3/sign.sh b/bin/tests/system/dlv/ns3/sign.sh index 1e216496c4..257f7b2eb4 100755 --- a/bin/tests/system/dlv/ns3/sign.sh +++ b/bin/tests/system/dlv/ns3/sign.sh @@ -14,21 +14,24 @@ # OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR # PERFORMANCE OF THIS SOFTWARE. -# $Id: sign.sh,v 1.6.32.3 2010/05/27 23:49:55 tbox Exp $ +# $Id: sign.sh,v 1.6.32.4 2011/05/26 23:10:12 each Exp $ (cd ../ns6 && sh -e ./sign.sh) +echo "I:dlv/ns3/sign.sh" + SYSTEMTESTTOP=../.. . $SYSTEMTESTTOP/conf.sh RANDFILE=../random.data +dlvzone=dlv.utld. dlvsets= +dssets= zone=child1.utld. infile=child.db.in zonefile=child1.utld.db outfile=child1.signed -dlvzone=dlv.utld. dlvsets="$dlvsets dlvset-$zone" keyname1=`$KEYGEN -r $RANDFILE -a DSA -b 768 -n zone $zone 2> /dev/null` @@ -44,7 +47,6 @@ zone=child3.utld. infile=child.db.in zonefile=child3.utld.db outfile=child3.signed -dlvzone=dlv.utld. dlvsets="$dlvsets dlvset-$zone" keyname1=`$KEYGEN -r $RANDFILE -a DSA -b 768 -n zone $zone 2> /dev/null` @@ -60,7 +62,6 @@ zone=child4.utld. infile=child.db.in zonefile=child4.utld.db outfile=child4.signed -dlvzone=dlv.utld. dlvsets="$dlvsets dlvset-$zone" keyname1=`$KEYGEN -r $RANDFILE -a DSA -b 768 -n zone $zone 2> /dev/null` @@ -76,7 +77,6 @@ zone=child5.utld. infile=child.db.in zonefile=child5.utld.db outfile=child5.signed -dlvzone=dlv.utld. dlvsets="$dlvsets dlvset-$zone" keyname1=`$KEYGEN -r $RANDFILE -a DSA -b 768 -n zone $zone 2> /dev/null` @@ -92,7 +92,6 @@ zone=child7.utld. infile=child.db.in zonefile=child7.utld.db outfile=child7.signed -dlvzone=dlv.utld. keyname1=`$KEYGEN -r $RANDFILE -a DSA -b 768 -n zone $zone 2> /dev/null` keyname2=`$KEYGEN -f KSK -r $RANDFILE -a DSA -b 768 -n zone $zone 2> /dev/null` @@ -107,7 +106,6 @@ zone=child8.utld. infile=child.db.in zonefile=child8.utld.db outfile=child8.signed -dlvzone=dlv.utld. keyname1=`$KEYGEN -r $RANDFILE -a DSA -b 768 -n zone $zone 2> /dev/null` keyname2=`$KEYGEN -f KSK -r $RANDFILE -a DSA -b 768 -n zone $zone 2> /dev/null` @@ -122,7 +120,6 @@ zone=child9.utld. infile=child.db.in zonefile=child9.utld.db outfile=child9.signed -dlvzone=dlv.utld. dlvsets="$dlvsets dlvset-$zone" keyname1=`$KEYGEN -r $RANDFILE -a DSA -b 768 -n zone $zone 2> /dev/null` @@ -137,7 +134,6 @@ zone=child10.utld. infile=child.db.in zonefile=child10.utld.db outfile=child10.signed -dlvzone=dlv.utld. dlvsets="$dlvsets dlvset-$zone" keyname1=`$KEYGEN -r $RANDFILE -a DSA -b 768 -n zone $zone 2> /dev/null` @@ -148,12 +144,133 @@ cat $infile $keyname1.key $keyname2.key >$zonefile $SIGNER -r $RANDFILE -l $dlvzone -o $zone -f $outfile $zonefile > /dev/null 2> signer.err || cat signer.err echo "I: signed $zone" +zone=child1.druz. +infile=child.db.in +zonefile=child1.druz.db +outfile=child1.druz.signed +dlvsets="$dlvsets dlvset-$zone" +dssets="$dssets dsset-$zone" + +keyname1=`$KEYGEN -r $RANDFILE -a DSA -b 768 -n zone $zone 2> /dev/null` +keyname2=`$KEYGEN -f KSK -r $RANDFILE -a DSA -b 768 -n zone $zone 2> /dev/null` + +cat $infile $keyname1.key $keyname2.key ../ns6/dsset-grand.$zone >$zonefile + +$SIGNER -r $RANDFILE -l $dlvzone -o $zone -f $outfile $zonefile > /dev/null 2> signer.err || cat signer.err +echo "I: signed $zone" + + +zone=child3.druz. +infile=child.db.in +zonefile=child3.druz.db +outfile=child3.druz.signed +dlvsets="$dlvsets dlvset-$zone" +dssets="$dssets dsset-$zone" + +keyname1=`$KEYGEN -r $RANDFILE -a DSA -b 768 -n zone $zone 2> /dev/null` +keyname2=`$KEYGEN -f KSK -r $RANDFILE -a DSA -b 768 -n zone $zone 2> /dev/null` + +cat $infile $keyname1.key $keyname2.key ../ns6/dsset-grand.$zone >$zonefile + +$SIGNER -r $RANDFILE -l $dlvzone -o $zone -f $outfile $zonefile > /dev/null 2> signer.err || cat signer.err +echo "I: signed $zone" + + +zone=child4.druz. +infile=child.db.in +zonefile=child4.druz.db +outfile=child4.druz.signed +dlvsets="$dlvsets dlvset-$zone" +dssets="$dssets dsset-$zone" + +keyname1=`$KEYGEN -r $RANDFILE -a DSA -b 768 -n zone $zone 2> /dev/null` +keyname2=`$KEYGEN -f KSK -r $RANDFILE -a DSA -b 768 -n zone $zone 2> /dev/null` + +cat $infile $keyname1.key $keyname2.key >$zonefile + +$SIGNER -r $RANDFILE -l $dlvzone -o $zone -f $outfile $zonefile > /dev/null 2> signer.err || cat signer.err +echo "I: signed $zone" + + +zone=child5.druz. +infile=child.db.in +zonefile=child5.druz.db +outfile=child5.druz.signed +dlvsets="$dlvsets dlvset-$zone" +dssets="$dssets dsset-$zone" + +keyname1=`$KEYGEN -r $RANDFILE -a DSA -b 768 -n zone $zone 2> /dev/null` +keyname2=`$KEYGEN -f KSK -r $RANDFILE -a DSA -b 768 -n zone $zone 2> /dev/null` + +cat $infile $keyname1.key $keyname2.key ../ns6/dsset-grand.$zone >$zonefile + +$SIGNER -r $RANDFILE -l $dlvzone -o $zone -f $outfile $zonefile > /dev/null 2> signer.err || cat signer.err +echo "I: signed $zone" + + +zone=child7.druz. +infile=child.db.in +zonefile=child7.druz.db +outfile=child7.druz.signed +dssets="$dssets dsset-$zone" + +keyname1=`$KEYGEN -r $RANDFILE -a DSA -b 768 -n zone $zone 2> /dev/null` +keyname2=`$KEYGEN -f KSK -r $RANDFILE -a DSA -b 768 -n zone $zone 2> /dev/null` + +cat $infile $keyname1.key $keyname2.key ../ns6/dsset-grand.$zone >$zonefile + +$SIGNER -r $RANDFILE -o $zone -f $outfile $zonefile > /dev/null 2> signer.err || cat signer.err +echo "I: signed $zone" + + +zone=child8.druz. +infile=child.db.in +zonefile=child8.druz.db +outfile=child8.druz.signed + +keyname1=`$KEYGEN -r $RANDFILE -a DSA -b 768 -n zone $zone 2> /dev/null` +keyname2=`$KEYGEN -f KSK -r $RANDFILE -a DSA -b 768 -n zone $zone 2> /dev/null` + +cat $infile $keyname1.key $keyname2.key >$zonefile + +$SIGNER -r $RANDFILE -l $dlvzone -o $zone -f $outfile $zonefile > /dev/null 2> signer.err || cat signer.err +echo "I: signed $zone" + + +zone=child9.druz. +infile=child.db.in +zonefile=child9.druz.db +outfile=child9.druz.signed +dlvsets="$dlvsets dlvset-$zone" + +keyname1=`$KEYGEN -r $RANDFILE -a DSA -b 768 -n zone $zone 2> /dev/null` +keyname2=`$KEYGEN -f KSK -r $RANDFILE -a DSA -b 768 -n zone $zone 2> /dev/null` + +cat $infile $keyname1.key $keyname2.key >$zonefile + +$SIGNER -r $RANDFILE -l $dlvzone -o $zone -f $outfile $zonefile > /dev/null 2> signer.err || cat signer.err +echo "I: signed $zone" + +zone=child10.druz. +infile=child.db.in +zonefile=child10.druz.db +outfile=child10.druz.signed +dlvsets="$dlvsets dlvset-$zone" +dssets="$dssets dsset-$zone" + +keyname1=`$KEYGEN -r $RANDFILE -a DSA -b 768 -n zone $zone 2> /dev/null` +keyname2=`$KEYGEN -f KSK -r $RANDFILE -a DSA -b 768 -n zone $zone 2> /dev/null` + +cat $infile $keyname1.key $keyname2.key >$zonefile + +$SIGNER -r $RANDFILE -l $dlvzone -o $zone -f $outfile $zonefile > /dev/null 2> signer.err || cat signer.err +echo "I: signed $zone" + zone=dlv.utld. infile=dlv.db.in zonefile=dlv.utld.db outfile=dlv.signed -dlvzone=dlv.utld. keyname1=`$KEYGEN -r $RANDFILE -a DSA -b 768 -n zone $zone 2> /dev/null` keyname2=`$KEYGEN -f KSK -r $RANDFILE -a DSA -b 768 -n zone $zone 2> /dev/null` @@ -172,5 +289,7 @@ trusted-keys { "$dn" $flags $proto $alg "$key"; }; EOF -' > trusted.conf -cp trusted.conf ../ns5 +' > trusted-dlv.conf +cp trusted-dlv.conf ../ns5 + +cp $dssets ../ns2 diff --git a/bin/tests/system/dlv/ns5/named.conf b/bin/tests/system/dlv/ns5/named.conf index b35c4a77b6..8e37d3a884 100644 --- a/bin/tests/system/dlv/ns5/named.conf +++ b/bin/tests/system/dlv/ns5/named.conf @@ -14,7 +14,7 @@ * PERFORMANCE OF THIS SOFTWARE. */ -/* $Id: named.conf,v 1.8 2007/06/18 23:47:28 tbox Exp $ */ +/* $Id: named.conf,v 1.8.558.1 2011/05/26 23:10:12 each Exp $ */ /* * Choose a keyname that is unlikely to clash with any real key names. @@ -46,6 +46,7 @@ controls { }; include "trusted.conf"; +include "trusted-dlv.conf"; options { query-source address 10.53.0.5; diff --git a/bin/tests/system/dlv/ns6/named.conf b/bin/tests/system/dlv/ns6/named.conf index 648ede0e16..6fe8185043 100644 --- a/bin/tests/system/dlv/ns6/named.conf +++ b/bin/tests/system/dlv/ns6/named.conf @@ -14,7 +14,7 @@ * PERFORMANCE OF THIS SOFTWARE. */ -/* $Id: named.conf,v 1.2.2.3 2010/07/11 01:18:17 each Exp $ */ +/* $Id: named.conf,v 1.2.2.4 2011/05/26 23:10:13 each Exp $ */ controls { /* empty */ }; @@ -40,3 +40,11 @@ zone "grand.child7.utld" { type master; file "grand.child7.signed"; }; zone "grand.child8.utld" { type master; file "grand.child8.signed"; }; zone "grand.child9.utld" { type master; file "grand.child9.signed"; }; zone "grand.child10.utld" { type master; file "grand.child10.signed"; }; +zone "grand.child1.druz" { type master; file "grand.child1.druz.signed"; }; +zone "grand.child3.druz" { type master; file "grand.child3.druz.signed"; }; +zone "grand.child4.druz" { type master; file "grand.child4.druz.signed"; }; +zone "grand.child5.druz" { type master; file "grand.child5.druz.signed"; }; +zone "grand.child7.druz" { type master; file "grand.child7.druz.signed"; }; +zone "grand.child8.druz" { type master; file "grand.child8.druz.signed"; }; +zone "grand.child9.druz" { type master; file "grand.child9.druz.signed"; }; +zone "grand.child10.druz" { type master; file "grand.child10.druz.signed"; }; diff --git a/bin/tests/system/dlv/ns6/sign.sh b/bin/tests/system/dlv/ns6/sign.sh index 6da675f6bb..36a9611357 100755 --- a/bin/tests/system/dlv/ns6/sign.sh +++ b/bin/tests/system/dlv/ns6/sign.sh @@ -14,11 +14,13 @@ # OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR # PERFORMANCE OF THIS SOFTWARE. -# $Id: sign.sh,v 1.2.2.2 2010/05/27 23:49:55 tbox Exp $ +# $Id: sign.sh,v 1.2.2.3 2011/05/26 23:10:13 each Exp $ SYSTEMTESTTOP=../.. . $SYSTEMTESTTOP/conf.sh +echo "I:dlv/ns6/sign.sh" + RANDFILE=../random.data zone=grand.child1.utld. @@ -137,3 +139,120 @@ cat $infile $keyname1.key $keyname2.key >$zonefile $SIGNER -g -r $RANDFILE -o $zone -f $outfile $zonefile > /dev/null 2> signer.err || cat signer.err echo "I: signed $zone" + +zone=grand.child1.druz. +infile=child.db.in +zonefile=grand.child1.druz.db +outfile=grand.child1.druz.signed + +keyname1=`$KEYGEN -r $RANDFILE -a DSA -b 768 -n zone $zone 2> /dev/null` +keyname2=`$KEYGEN -f KSK -r $RANDFILE -a DSA -b 768 -n zone $zone 2> /dev/null` + +cat $infile $keyname1.key $keyname2.key >$zonefile + +$SIGNER -g -r $RANDFILE -o $zone -f $outfile $zonefile > /dev/null 2> signer.err || cat signer.err +echo "I: signed $zone" + + +zone=grand.child3.druz. +infile=child.db.in +zonefile=grand.child3.druz.db +outfile=grand.child3.druz.signed +dlvzone=dlv.druz. + +keyname1=`$KEYGEN -r $RANDFILE -a DSA -b 768 -n zone $zone 2> /dev/null` +keyname2=`$KEYGEN -f KSK -r $RANDFILE -a DSA -b 768 -n zone $zone 2> /dev/null` + +cat $infile $keyname1.key $keyname2.key >$zonefile + +$SIGNER -g -r $RANDFILE -o $zone -f $outfile $zonefile > /dev/null 2> signer.err || cat signer.err +echo "I: signed $zone" + + +zone=grand.child4.druz. +infile=child.db.in +zonefile=grand.child4.druz.db +outfile=grand.child4.druz.signed +dlvzone=dlv.druz. + +keyname1=`$KEYGEN -r $RANDFILE -a DSA -b 768 -n zone $zone 2> /dev/null` +keyname2=`$KEYGEN -f KSK -r $RANDFILE -a DSA -b 768 -n zone $zone 2> /dev/null` + +cat $infile $keyname1.key $keyname2.key >$zonefile + +$SIGNER -g -r $RANDFILE -o $zone -f $outfile $zonefile > /dev/null 2> signer.err || cat signer.err +echo "I: signed $zone" + + +zone=grand.child5.druz. +infile=child.db.in +zonefile=grand.child5.druz.db +outfile=grand.child5.druz.signed +dlvzone=dlv.druz. + +keyname1=`$KEYGEN -r $RANDFILE -a DSA -b 768 -n zone $zone 2> /dev/null` +keyname2=`$KEYGEN -f KSK -r $RANDFILE -a DSA -b 768 -n zone $zone 2> /dev/null` + +cat $infile $keyname1.key $keyname2.key >$zonefile + +$SIGNER -g -r $RANDFILE -o $zone -f $outfile $zonefile > /dev/null 2> signer.err || cat signer.err +echo "I: signed $zone" + + +zone=grand.child7.druz. +infile=child.db.in +zonefile=grand.child7.druz.db +outfile=grand.child7.druz.signed +dlvzone=dlv.druz. + +keyname1=`$KEYGEN -r $RANDFILE -a DSA -b 768 -n zone $zone 2> /dev/null` +keyname2=`$KEYGEN -f KSK -r $RANDFILE -a DSA -b 768 -n zone $zone 2> /dev/null` + +cat $infile $keyname1.key $keyname2.key >$zonefile + +$SIGNER -g -r $RANDFILE -o $zone -f $outfile $zonefile > /dev/null 2> signer.err || cat signer.err +echo "I: signed $zone" + + +zone=grand.child8.druz. +infile=child.db.in +zonefile=grand.child8.druz.db +outfile=grand.child8.druz.signed +dlvzone=dlv.druz. + +keyname1=`$KEYGEN -r $RANDFILE -a DSA -b 768 -n zone $zone 2> /dev/null` +keyname2=`$KEYGEN -f KSK -r $RANDFILE -a DSA -b 768 -n zone $zone 2> /dev/null` + +cat $infile $keyname1.key $keyname2.key >$zonefile + +$SIGNER -g -r $RANDFILE -o $zone -f $outfile $zonefile > /dev/null 2> signer.err || cat signer.err +echo "I: signed $zone" + + +zone=grand.child9.druz. +infile=child.db.in +zonefile=grand.child9.druz.db +outfile=grand.child9.druz.signed +dlvzone=dlv.druz. + +keyname1=`$KEYGEN -r $RANDFILE -a DSA -b 768 -n zone $zone 2> /dev/null` +keyname2=`$KEYGEN -f KSK -r $RANDFILE -a DSA -b 768 -n zone $zone 2> /dev/null` + +cat $infile $keyname1.key $keyname2.key >$zonefile + +$SIGNER -g -r $RANDFILE -o $zone -f $outfile $zonefile > /dev/null 2> signer.err || cat signer.err +echo "I: signed $zone" + +zone=grand.child10.druz. +infile=child.db.in +zonefile=grand.child10.druz.db +outfile=grand.child10.druz.signed +dlvzone=dlv.druz. + +keyname1=`$KEYGEN -r $RANDFILE -a DSA -b 768 -n zone $zone 2> /dev/null` +keyname2=`$KEYGEN -f KSK -r $RANDFILE -a DSA -b 768 -n zone $zone 2> /dev/null` + +cat $infile $keyname1.key $keyname2.key >$zonefile + +$SIGNER -g -r $RANDFILE -o $zone -f $outfile $zonefile > /dev/null 2> signer.err || cat signer.err +echo "I: signed $zone" diff --git a/bin/tests/system/dlv/setup.sh b/bin/tests/system/dlv/setup.sh index 34e8c17433..3421d89ff1 100644 --- a/bin/tests/system/dlv/setup.sh +++ b/bin/tests/system/dlv/setup.sh @@ -14,8 +14,8 @@ # OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR # PERFORMANCE OF THIS SOFTWARE. -# $Id: setup.sh,v 1.6 2009/03/02 23:47:43 tbox Exp $ +# $Id: setup.sh,v 1.6.154.1 2011/05/26 23:10:11 each Exp $ ../../../tools/genrandom 400 random.data -(cd ns3 && sh -e sign.sh) +(cd ns1 && sh -e sign.sh) diff --git a/bin/tests/system/dlv/tests.sh b/bin/tests/system/dlv/tests.sh index d8235807f5..7e7b1c8a28 100644 --- a/bin/tests/system/dlv/tests.sh +++ b/bin/tests/system/dlv/tests.sh @@ -14,7 +14,7 @@ # OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR # PERFORMANCE OF THIS SOFTWARE. -# $Id: tests.sh,v 1.4.558.2 2010/05/27 23:49:55 tbox Exp $ +# $Id: tests.sh,v 1.4.558.3 2011/05/26 23:10:11 each Exp $ SYSTEMTESTTOP=.. . $SYSTEMTESTTOP/conf.sh @@ -42,5 +42,21 @@ n=`expr $n + 1` if [ $ret != 0 ]; then echo "I:failed"; fi status=`expr $status + $ret` +echo "I:checking that SOA reference by DLV in a DRUZ with DS validates as secure ($n)" +ret=0 +$DIG $DIGOPTS child1.druz soa @10.53.0.5 > dig.out.ns5.test$n || ret=1 +grep "flags:.*ad.*QUERY" dig.out.ns5.test$n > /dev/null || ret=1 +n=`expr $n + 1` +if [ $ret != 0 ]; then echo "I:failed"; fi +status=`expr $status + $ret` + +echo "I:checking that child SOA reference by DLV in a DRUZ with DS validates as secure ($n)" +ret=0 +$DIG $DIGOPTS grand.child1.druz soa @10.53.0.5 > dig.out.ns5.test$n || ret=1 +grep "flags:.*ad.*QUERY" dig.out.ns5.test$n > /dev/null || ret=1 +n=`expr $n + 1` +if [ $ret != 0 ]; then echo "I:failed"; fi +status=`expr $status + $ret` + echo "I:exit status: $status" exit $status diff --git a/bin/tests/system/dnssec/tests.sh b/bin/tests/system/dnssec/tests.sh index 43b2014e52..7c466b9ed6 100644 --- a/bin/tests/system/dnssec/tests.sh +++ b/bin/tests/system/dnssec/tests.sh @@ -15,7 +15,7 @@ # OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR # PERFORMANCE OF THIS SOFTWARE. -# $Id: tests.sh,v 1.55.32.27 2011/05/19 04:42:17 each Exp $ +# $Id: tests.sh,v 1.55.32.28 2011/05/26 23:10:13 each Exp $ SYSTEMTESTTOP=.. . $SYSTEMTESTTOP/conf.sh @@ -27,6 +27,34 @@ rm -f dig.out.* DIGOPTS="+tcp +noadd +nosea +nostat +nocmd +dnssec -p 5300" +# convert private-type records to readable form +showprivate () { + echo "-- $@ --" + $DIG $DIGOPTS +nodnssec +short @$2 -t type65534 $1 | cut -f3 -d' ' | + while read record; do + perl -e 'my $rdata = pack("H*", @ARGV[0]); + die "invalid record" unless length($rdata) == 5; + my ($alg, $key, $remove, $complete) = unpack("CnCC", $rdata); + my $action = "signing"; + $action = "removing" if $remove; + my $state = " (incomplete)"; + $state = " (complete)" if $complete; + print ("$action: alg: $alg, key: $key$state\n");' $record + done +} + +# check that signing records are marked as complete +checkprivate () { + ret=0 + x=`showprivate "$@"` + echo $x | grep incomplete >&- 2>&- && ret=1 + [ $ret = 1 ] && { + echo "$x" + echo "I:failed" + } + return $ret +} + # Check the example. domain echo "I:checking that zone transfer worked ($n)" @@ -1119,7 +1147,7 @@ ret=0 $DIG $DIGOPTS +dnssec a auto-nsec.example. @10.53.0.4 > dig.out.ns4.test$n || ret=1 grep "NOERROR" dig.out.ns4.test$n > /dev/null || ret=1 grep "flags:.* ad[ ;]" dig.out.ns4.test$n > /dev/null || ret=1 -grep "IN.NSEC[^3].* TYPE65534" dig.out.ns4.test$n > /dev/null || ret=1 +grep "IN.NSEC[^3].* DNSKEY" dig.out.ns4.test$n > /dev/null || ret=1 n=`expr $n + 1` if [ $ret != 0 ]; then echo "I:failed"; fi status=`expr $status + $ret` @@ -1129,7 +1157,18 @@ ret=0 $DIG $DIGOPTS +dnssec a auto-nsec3.example. @10.53.0.4 > dig.out.ns4.test$n || ret=1 grep "NOERROR" dig.out.ns4.test$n > /dev/null || ret=1 grep "flags:.* ad[ ;]" dig.out.ns4.test$n > /dev/null || ret=1 -grep "IN.NSEC3 .* TYPE65534" dig.out.ns4.test$n > /dev/null || ret=1 +grep "IN.NSEC3 .* DNSKEY" dig.out.ns4.test$n > /dev/null || ret=1 +n=`expr $n + 1` +if [ $ret != 0 ]; then echo "I:failed"; fi +status=`expr $status + $ret` + +echo "I:checking that signing records have been marked as complete ($n)" +ret=0 +checkprivate dynamic.example 10.53.0.3 || ret=1 +checkprivate update-nsec3.example 10.53.0.3 || ret=1 +checkprivate auto-nsec3.example 10.53.0.3 || ret=1 +checkprivate expiring.example 10.53.0.3 || ret=1 +checkprivate auto-nsec.example 10.53.0.3 || ret=1 n=`expr $n + 1` if [ $ret != 0 ]; then echo "I:failed"; fi status=`expr $status + $ret` diff --git a/lib/dns/ncache.c b/lib/dns/ncache.c index 488e8dcf85..ed8267db1f 100644 --- a/lib/dns/ncache.c +++ b/lib/dns/ncache.c @@ -15,7 +15,7 @@ * PERFORMANCE OF THIS SOFTWARE. */ -/* $Id: ncache.c,v 1.43.268.7 2010/05/19 09:51:31 marka Exp $ */ +/* $Id: ncache.c,v 1.43.268.8 2011/05/26 23:10:13 each Exp $ */ /*! \file */ @@ -186,7 +186,7 @@ dns_ncache_addoptout(dns_message_t *message, dns_db_t *cache, */ isc_buffer_availableregion(&buffer, &r); - if (r.length < 2) + if (r.length < 3) return (ISC_R_NOSPACE); isc_buffer_putuint16(&buffer, rdataset->type); diff --git a/lib/dns/validator.c b/lib/dns/validator.c index 8bd291597d..4c65620403 100644 --- a/lib/dns/validator.c +++ b/lib/dns/validator.c @@ -15,7 +15,7 @@ * PERFORMANCE OF THIS SOFTWARE. */ -/* $Id: validator.c,v 1.182.16.19 2011/03/11 07:11:59 marka Exp $ */ +/* $Id: validator.c,v 1.182.16.20 2011/05/26 23:10:13 each Exp $ */ #include @@ -419,7 +419,8 @@ fetch_callback_validator(isc_task_t *task, isc_event_t *event) { validator_done(val, ISC_R_CANCELED); } else if (eresult == ISC_R_SUCCESS) { validator_log(val, ISC_LOG_DEBUG(3), - "keyset with trust %d", rdataset->trust); + "keyset with trust %s", + dns_trust_totext(rdataset->trust)); /* * Only extract the dst key if the keyset is secure. */ @@ -496,7 +497,8 @@ dsfetched(isc_task_t *task, isc_event_t *event) { validator_done(val, ISC_R_CANCELED); } else if (eresult == ISC_R_SUCCESS) { validator_log(val, ISC_LOG_DEBUG(3), - "dsset with trust %d", rdataset->trust); + "dsset with trust %s", + dns_trust_totext(rdataset->trust)); val->dsset = &val->frdataset; result = validatezonekey(val); if (result != DNS_R_WAIT) @@ -656,7 +658,8 @@ keyvalidated(isc_task_t *task, isc_event_t *event) { validator_done(val, ISC_R_CANCELED); } else if (eresult == ISC_R_SUCCESS) { validator_log(val, ISC_LOG_DEBUG(3), - "keyset with trust %d", val->frdataset.trust); + "keyset with trust %s", + dns_trust_totext(val->frdataset.trust)); /* * Only extract the dst key if the keyset is secure. */ @@ -727,10 +730,10 @@ dsvalidated(isc_task_t *task, isc_event_t *event) { isc_boolean_t have_dsset; dns_name_t *name; validator_log(val, ISC_LOG_DEBUG(3), - "%s with trust %d", + "%s with trust %s", val->frdataset.type == dns_rdatatype_ds ? "dsset" : "ds non-existance", - val->frdataset.trust); + dns_trust_totext(val->frdataset.trust)); have_dsset = ISC_TF(val->frdataset.type == dns_rdatatype_ds); name = dns_fixedname_name(&val->fname); if ((val->attributes & VALATTR_INSECURITY) != 0 && @@ -802,8 +805,8 @@ cnamevalidated(isc_task_t *task, isc_event_t *event) { if (CANCELED(val)) { validator_done(val, ISC_R_CANCELED); } else if (eresult == ISC_R_SUCCESS) { - validator_log(val, ISC_LOG_DEBUG(3), "cname with trust %d", - val->frdataset.trust); + validator_log(val, ISC_LOG_DEBUG(3), "cname with trust %s", + dns_trust_totext(val->frdataset.trust)); result = proveunsecure(val, ISC_FALSE, ISC_TRUE); if (result != DNS_R_WAIT) validator_done(val, result); @@ -1433,8 +1436,8 @@ view_find(dns_validator_t *val, dns_name_t *name, dns_rdatatype_t type) { INSIST(type == dns_rdatatype_dlv); if (val->frdataset.trust != dns_trust_secure) { validator_log(val, ISC_LOG_DEBUG(3), - "covering nsec: trust %u", - val->frdataset.trust); + "covering nsec: trust %s", + dns_trust_totext(val->frdataset.trust)); goto notfound; } result = dns_rdataset_first(&val->frdataset); @@ -1769,8 +1772,8 @@ get_key(dns_validator_t *val, dns_rdata_rrsig_t *siginfo) { * See if we've got the key used in the signature. */ validator_log(val, ISC_LOG_DEBUG(3), - "keyset with trust %d", - val->frdataset.trust); + "keyset with trust %s", + dns_trust_totext(val->frdataset.trust)); result = get_dst_key(val, siginfo, val->keyset); if (result != ISC_R_SUCCESS) { /* @@ -2544,8 +2547,11 @@ validatezonekey(dns_validator_t *val) { " insecure DS"); return (DNS_R_MUSTBESECURE); } - markanswer(val, "validatezonekey (2)"); - return (ISC_R_SUCCESS); + if (val->view->dlv == NULL || DLVTRIED(val)) { + markanswer(val, "validatezonekey (2)"); + return (ISC_R_SUCCESS); + } + return (startfinddlvsep(val, val->event->name)); } /* @@ -3280,7 +3286,8 @@ dlvvalidated(isc_task_t *task, isc_event_t *event) { validator_done(val, ISC_R_CANCELED); } else if (eresult == ISC_R_SUCCESS) { validator_log(val, ISC_LOG_DEBUG(3), - "dlvset with trust %d", val->frdataset.trust); + "dlvset with trust %s", + dns_trust_totext(val->frdataset.trust)); dns_rdataset_clone(&val->frdataset, &val->dlv); val->havedlvsep = ISC_TRUE; if (dlv_algorithm_supported(val)) diff --git a/lib/dns/zone.c b/lib/dns/zone.c index 54040914c5..49b115eb65 100644 --- a/lib/dns/zone.c +++ b/lib/dns/zone.c @@ -15,7 +15,7 @@ * PERFORMANCE OF THIS SOFTWARE. */ -/* $Id: zone.c,v 1.540.2.57 2011/05/19 23:46:29 tbox Exp $ */ +/* $Id: zone.c,v 1.540.2.58 2011/05/26 23:10:13 each Exp $ */ /*! \file */ @@ -13658,7 +13658,8 @@ rr_exists(dns_db_t *db, dns_dbversion_t *ver, dns_name_t *name, */ static isc_result_t add_signing_records(dns_db_t *db, dns_rdatatype_t privatetype, - dns_dbversion_t *ver, dns_diff_t *diff) + dns_dbversion_t *ver, dns_diff_t *diff, + isc_boolean_t sign_all) { dns_difftuple_t *tuple, *newtuple = NULL; dns_rdata_dnskey_t dnskey; @@ -13697,13 +13698,16 @@ add_signing_records(dns_db_t *db, dns_rdatatype_t privatetype, rdata.type = privatetype; rdata.rdclass = tuple->rdata.rdclass; - CHECK(rr_exists(db, ver, name, &rdata, &flag)); - if (flag) - continue; - CHECK(dns_difftuple_create(diff->mctx, DNS_DIFFOP_ADD, - name, 0, &rdata, &newtuple)); - CHECK(do_one_tuple(&newtuple, db, ver, diff)); - INSIST(newtuple == NULL); + if (sign_all || tuple->op == DNS_DIFFOP_DEL) { + CHECK(rr_exists(db, ver, name, &rdata, &flag)); + if (flag) + continue; + CHECK(dns_difftuple_create(diff->mctx, DNS_DIFFOP_ADD, + name, 0, &rdata, &newtuple)); + CHECK(do_one_tuple(&newtuple, db, ver, diff)); + INSIST(newtuple == NULL); + } + /* * Remove any record which says this operation has already * completed. @@ -13940,6 +13944,7 @@ zone_rekey(dns_zone_t *zone) { dns_dnsseckey_t *key; dns_diff_t diff, sig_diff; isc_boolean_t commit = ISC_FALSE, newactive = ISC_FALSE; + isc_boolean_t newalg = ISC_FALSE; isc_boolean_t fullsign; dns_ttl_t ttl = 3600; const char *dir; @@ -14017,52 +14022,11 @@ zone_rekey(dns_zone_t *zone) { goto trylater; } - /* See if any pre-existing keys have newly become active */ - for (key = ISC_LIST_HEAD(dnskeys); - key != NULL; - key = ISC_LIST_NEXT(key, link)) { - if (key->first_sign) { - newactive = ISC_TRUE; - break; - } - } - - if ((newactive || fullsign || !ISC_LIST_EMPTY(diff.tuples)) && - dnskey_sane(zone, db, ver, &diff)) { - CHECK(dns_diff_apply(&diff, db, ver)); - CHECK(clean_nsec3param(zone, db, ver, &diff)); - CHECK(add_signing_records(db, zone->privatetype, ver, - &diff)); - CHECK(increment_soa_serial(db, ver, &diff, mctx)); - CHECK(add_chains(zone, db, ver, &diff)); - CHECK(sign_apex(zone, db, ver, &diff, &sig_diff)); - CHECK(zone_journal(zone, &sig_diff, "zone_rekey")); - commit = ISC_TRUE; - } - } - - dns_db_closeversion(db, &ver, commit); - - if (commit) { - isc_time_t timenow; - dns_difftuple_t *tuple; - isc_boolean_t newkey = ISC_FALSE; - isc_boolean_t newalg = ISC_FALSE; - - LOCK_ZONE(zone); - DNS_ZONE_SETFLAG(zone, DNS_ZONEFLG_NEEDNOTIFY); - - zone_needdump(zone, DNS_DUMP_DELAY); - - TIME_NOW(&timenow); - zone_settimer(zone, &timenow); - - /* - * Has a new key become active? If so, is it for - * a new algorithm? In that event, we need to sign the - * zone fully. If there's a new key, but it's for an - * already-existing algorithm, then the zone signing - * can be handled incrementally. + /* See if any pre-existing keys have newly become active; + * also, see if any new key is for a new algorithm, as in that + * event, we need to sign the zone fully. (If there's a new + * key, but it's for an already-existing algorithm, then + * the zone signing can be handled incrementally.) */ for (key = ISC_LIST_HEAD(dnskeys); key != NULL; @@ -14070,7 +14034,8 @@ zone_rekey(dns_zone_t *zone) { if (!key->first_sign) continue; - newkey = ISC_TRUE; + newactive = ISC_TRUE; + if (!dns_rdataset_isassociated(&keysigs)) { newalg = ISC_TRUE; break; @@ -14089,6 +14054,35 @@ zone_rekey(dns_zone_t *zone) { } } + if ((newactive || fullsign || !ISC_LIST_EMPTY(diff.tuples)) && + dnskey_sane(zone, db, ver, &diff)) { + CHECK(dns_diff_apply(&diff, db, ver)); + CHECK(clean_nsec3param(zone, db, ver, &diff)); + CHECK(add_signing_records(db, zone->privatetype, + ver, &diff, + ISC_TF(newalg || fullsign))); + CHECK(increment_soa_serial(db, ver, &diff, mctx)); + CHECK(add_chains(zone, db, ver, &diff)); + CHECK(sign_apex(zone, db, ver, &diff, &sig_diff)); + CHECK(zone_journal(zone, &sig_diff, "zone_rekey")); + commit = ISC_TRUE; + } + } + + dns_db_closeversion(db, &ver, commit); + + if (commit) { + isc_time_t timenow; + dns_difftuple_t *tuple; + + LOCK_ZONE(zone); + DNS_ZONE_SETFLAG(zone, DNS_ZONEFLG_NEEDNOTIFY); + + zone_needdump(zone, DNS_DUMP_DELAY); + + TIME_NOW(&timenow); + zone_settimer(zone, &timenow); + /* Remove any signatures from removed keys. */ if (!ISC_LIST_EMPTY(rmkeys)) { for (key = ISC_LIST_HEAD(rmkeys); @@ -14106,7 +14100,6 @@ zone_rekey(dns_zone_t *zone) { } } - if (fullsign) { /* * "rndc sign" was called, so we now sign the zone