xref: /minix3/external/bsd/bind/dist/bin/tests/system/autosign/tests.sh (revision 00b67f09dd46474d133c95011a48590a8e8f94c7)
1*00b67f09SDavid van Moolenbroek#!/bin/sh
2*00b67f09SDavid van Moolenbroek#
3*00b67f09SDavid van Moolenbroek# Copyright (C) 2009-2014  Internet Systems Consortium, Inc. ("ISC")
4*00b67f09SDavid van Moolenbroek#
5*00b67f09SDavid van Moolenbroek# Permission to use, copy, modify, and/or distribute this software for any
6*00b67f09SDavid van Moolenbroek# purpose with or without fee is hereby granted, provided that the above
7*00b67f09SDavid van Moolenbroek# copyright notice and this permission notice appear in all copies.
8*00b67f09SDavid van Moolenbroek#
9*00b67f09SDavid van Moolenbroek# THE SOFTWARE IS PROVIDED "AS IS" AND ISC DISCLAIMS ALL WARRANTIES WITH
10*00b67f09SDavid van Moolenbroek# REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY
11*00b67f09SDavid van Moolenbroek# AND FITNESS.  IN NO EVENT SHALL ISC BE LIABLE FOR ANY SPECIAL, DIRECT,
12*00b67f09SDavid van Moolenbroek# INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM
13*00b67f09SDavid van Moolenbroek# LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE
14*00b67f09SDavid van Moolenbroek# OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
15*00b67f09SDavid van Moolenbroek# PERFORMANCE OF THIS SOFTWARE.
16*00b67f09SDavid van Moolenbroek
17*00b67f09SDavid van MoolenbroekSYSTEMTESTTOP=..
18*00b67f09SDavid van Moolenbroek. $SYSTEMTESTTOP/conf.sh
19*00b67f09SDavid van Moolenbroek
20*00b67f09SDavid van Moolenbroekstatus=0
21*00b67f09SDavid van Moolenbroekn=0
22*00b67f09SDavid van Moolenbroek
23*00b67f09SDavid van MoolenbroekDIGOPTS="+tcp +noadd +nosea +nostat +nocmd +dnssec -p 5300"
24*00b67f09SDavid van Moolenbroek
25*00b67f09SDavid van Moolenbroek# convert private-type records to readable form
26*00b67f09SDavid van Moolenbroekshowprivate () {
27*00b67f09SDavid van Moolenbroek    echo "-- $@ --"
28*00b67f09SDavid van Moolenbroek    $DIG $DIGOPTS +nodnssec +short @$2 -t type65534 $1 | cut -f3 -d' ' |
29*00b67f09SDavid van Moolenbroek        while read record; do
30*00b67f09SDavid van Moolenbroek            $PERL -e 'my $rdata = pack("H*", @ARGV[0]);
31*00b67f09SDavid van Moolenbroek                die "invalid record" unless length($rdata) == 5;
32*00b67f09SDavid van Moolenbroek                my ($alg, $key, $remove, $complete) = unpack("CnCC", $rdata);
33*00b67f09SDavid van Moolenbroek                my $action = "signing";
34*00b67f09SDavid van Moolenbroek                $action = "removing" if $remove;
35*00b67f09SDavid van Moolenbroek                my $state = " (incomplete)";
36*00b67f09SDavid van Moolenbroek                $state = " (complete)" if $complete;
37*00b67f09SDavid van Moolenbroek                print ("$action: alg: $alg, key: $key$state\n");' $record
38*00b67f09SDavid van Moolenbroek        done
39*00b67f09SDavid van Moolenbroek}
40*00b67f09SDavid van Moolenbroek
41*00b67f09SDavid van Moolenbroek# check that signing records are marked as complete
42*00b67f09SDavid van Moolenbroekcheckprivate () {
43*00b67f09SDavid van Moolenbroek    _ret=0
44*00b67f09SDavid van Moolenbroek    expected="${3:-0}"
45*00b67f09SDavid van Moolenbroek    x=`showprivate "$@"`
46*00b67f09SDavid van Moolenbroek    echo $x | grep incomplete > /dev/null && _ret=1
47*00b67f09SDavid van Moolenbroek
48*00b67f09SDavid van Moolenbroek    if [ $_ret = $expected ]; then
49*00b67f09SDavid van Moolenbroek        return 0
50*00b67f09SDavid van Moolenbroek    fi
51*00b67f09SDavid van Moolenbroek
52*00b67f09SDavid van Moolenbroek    echo "$x"
53*00b67f09SDavid van Moolenbroek    echo "I:failed"
54*00b67f09SDavid van Moolenbroek    return 1
55*00b67f09SDavid van Moolenbroek}
56*00b67f09SDavid van Moolenbroek
57*00b67f09SDavid van Moolenbroek#
58*00b67f09SDavid van Moolenbroek#  The NSEC record at the apex of the zone and its RRSIG records are
59*00b67f09SDavid van Moolenbroek#  added as part of the last step in signing a zone.  We wait for the
60*00b67f09SDavid van Moolenbroek#  NSEC records to appear before proceeding with a counter to prevent
61*00b67f09SDavid van Moolenbroek#  infinite loops if there is a error.
62*00b67f09SDavid van Moolenbroek#
63*00b67f09SDavid van Moolenbroekecho "I:waiting for autosign changes to take effect"
64*00b67f09SDavid van Moolenbroeki=0
65*00b67f09SDavid van Moolenbroekwhile [ $i -lt 30 ]
66*00b67f09SDavid van Moolenbroekdo
67*00b67f09SDavid van Moolenbroek	ret=0
68*00b67f09SDavid van Moolenbroek	#
69*00b67f09SDavid van Moolenbroek	# Wait for the root DNSKEY RRset to be fully signed.
70*00b67f09SDavid van Moolenbroek	#
71*00b67f09SDavid van Moolenbroek	$DIG $DIGOPTS . @10.53.0.1 dnskey > dig.out.ns1.test$n || ret=1
72*00b67f09SDavid van Moolenbroek	grep "ANSWER: 10," dig.out.ns1.test$n > /dev/null || ret=1
73*00b67f09SDavid van Moolenbroek	for z in .
74*00b67f09SDavid van Moolenbroek	do
75*00b67f09SDavid van Moolenbroek		$DIG $DIGOPTS $z @10.53.0.1 nsec > dig.out.ns1.test$n || ret=1
76*00b67f09SDavid van Moolenbroek		grep "NS SOA" dig.out.ns1.test$n > /dev/null || ret=1
77*00b67f09SDavid van Moolenbroek	done
78*00b67f09SDavid van Moolenbroek	for z in bar. example. private.secure.example.
79*00b67f09SDavid van Moolenbroek	do
80*00b67f09SDavid van Moolenbroek		$DIG $DIGOPTS $z @10.53.0.2 nsec > dig.out.ns2.test$n || ret=1
81*00b67f09SDavid van Moolenbroek		grep "NS SOA" dig.out.ns2.test$n > /dev/null || ret=1
82*00b67f09SDavid van Moolenbroek	done
83*00b67f09SDavid van Moolenbroek	for z in bar. example.
84*00b67f09SDavid van Moolenbroek	do
85*00b67f09SDavid van Moolenbroek		$DIG $DIGOPTS $z @10.53.0.3 nsec > dig.out.ns3.test$n || ret=1
86*00b67f09SDavid van Moolenbroek		grep "NS SOA" dig.out.ns3.test$n > /dev/null || ret=1
87*00b67f09SDavid van Moolenbroek	done
88*00b67f09SDavid van Moolenbroek	i=`expr $i + 1`
89*00b67f09SDavid van Moolenbroek	if [ $ret = 0 ]; then break; fi
90*00b67f09SDavid van Moolenbroek	echo "I:waiting ... ($i)"
91*00b67f09SDavid van Moolenbroek	sleep 2
92*00b67f09SDavid van Moolenbroekdone
93*00b67f09SDavid van Moolenbroekn=`expr $n + 1`
94*00b67f09SDavid van Moolenbroekif [ $ret != 0 ]; then echo "I:failed"; else echo "I:done"; fi
95*00b67f09SDavid van Moolenbroekstatus=`expr $status + $ret`
96*00b67f09SDavid van Moolenbroek
97*00b67f09SDavid van Moolenbroekecho "I:checking NSEC->NSEC3 conversion prerequisites ($n)"
98*00b67f09SDavid van Moolenbroekret=0
99*00b67f09SDavid van Moolenbroek# these commands should result in an empty file:
100*00b67f09SDavid van Moolenbroek$DIG $DIGOPTS +noall +answer nsec3.example. nsec3param @10.53.0.3 > dig.out.ns3.1.test$n || ret=1
101*00b67f09SDavid van Moolenbroekgrep "NSEC3PARAM" dig.out.ns3.1.test$n > /dev/null && ret=1
102*00b67f09SDavid van Moolenbroek$DIG $DIGOPTS +noall +answer autonsec3.example. nsec3param @10.53.0.3 > dig.out.ns3.2.test$n || ret=1
103*00b67f09SDavid van Moolenbroekgrep "NSEC3PARAM" dig.out.ns3.2.test$n > /dev/null && ret=1
104*00b67f09SDavid van Moolenbroekn=`expr $n + 1`
105*00b67f09SDavid van Moolenbroekif [ $ret != 0 ]; then echo "I:failed"; fi
106*00b67f09SDavid van Moolenbroekstatus=`expr $status + $ret`
107*00b67f09SDavid van Moolenbroek
108*00b67f09SDavid van Moolenbroekecho "I:checking NSEC3->NSEC conversion prerequisites ($n)"
109*00b67f09SDavid van Moolenbroekret=0
110*00b67f09SDavid van Moolenbroek$DIG $DIGOPTS +noall +answer nsec3-to-nsec.example. nsec3param @10.53.0.3 > dig.out.ns3.test$n || ret=1
111*00b67f09SDavid van Moolenbroekgrep "NSEC3PARAM" dig.out.ns3.test$n > /dev/null || ret=1
112*00b67f09SDavid van Moolenbroekn=`expr $n + 1`
113*00b67f09SDavid van Moolenbroekif [ $ret != 0 ]; then echo "I:failed"; fi
114*00b67f09SDavid van Moolenbroekstatus=`expr $status + $ret`
115*00b67f09SDavid van Moolenbroek
116*00b67f09SDavid van Moolenbroekecho "I:converting zones from nsec to nsec3"
117*00b67f09SDavid van Moolenbroek$NSUPDATE > /dev/null 2>&1 <<END	|| status=1
118*00b67f09SDavid van Moolenbroekserver 10.53.0.3 5300
119*00b67f09SDavid van Moolenbroekzone nsec3.nsec3.example.
120*00b67f09SDavid van Moolenbroekupdate add nsec3.nsec3.example. 3600 NSEC3PARAM 1 0 10 BEEF
121*00b67f09SDavid van Moolenbroeksend
122*00b67f09SDavid van Moolenbroekzone optout.nsec3.example.
123*00b67f09SDavid van Moolenbroekupdate add optout.nsec3.example. 3600 NSEC3PARAM 1 1 10 BEEF
124*00b67f09SDavid van Moolenbroeksend
125*00b67f09SDavid van Moolenbroekzone nsec3.example.
126*00b67f09SDavid van Moolenbroekupdate add nsec3.example. 3600 NSEC3PARAM 1 0 10 BEEF
127*00b67f09SDavid van Moolenbroeksend
128*00b67f09SDavid van Moolenbroekzone autonsec3.example.
129*00b67f09SDavid van Moolenbroekupdate add autonsec3.example. 3600 NSEC3PARAM 1 0 20 DEAF
130*00b67f09SDavid van Moolenbroeksend
131*00b67f09SDavid van Moolenbroekzone nsec3.optout.example.
132*00b67f09SDavid van Moolenbroekupdate add nsec3.optout.example. 3600 NSEC3PARAM 1 0 10 BEEF
133*00b67f09SDavid van Moolenbroeksend
134*00b67f09SDavid van Moolenbroekzone optout.optout.example.
135*00b67f09SDavid van Moolenbroekupdate add optout.optout.example. 3600 NSEC3PARAM 1 1 10 BEEF
136*00b67f09SDavid van Moolenbroeksend
137*00b67f09SDavid van Moolenbroekzone optout.example.
138*00b67f09SDavid van Moolenbroekupdate add optout.example. 3600 NSEC3PARAM 1 1 10 BEEF
139*00b67f09SDavid van Moolenbroeksend
140*00b67f09SDavid van MoolenbroekEND
141*00b67f09SDavid van Moolenbroek
142*00b67f09SDavid van Moolenbroek# try to convert nsec.example; this should fail due to non-NSEC key
143*00b67f09SDavid van Moolenbroekecho "I:preset nsec3param in unsigned zone via nsupdate ($n)"
144*00b67f09SDavid van Moolenbroek$NSUPDATE > nsupdate.out 2>&1 <<END
145*00b67f09SDavid van Moolenbroekserver 10.53.0.3 5300
146*00b67f09SDavid van Moolenbroekzone nsec.example.
147*00b67f09SDavid van Moolenbroekupdate add nsec.example. 3600 NSEC3PARAM 1 0 10 BEEF
148*00b67f09SDavid van Moolenbroeksend
149*00b67f09SDavid van MoolenbroekEND
150*00b67f09SDavid van Moolenbroek
151*00b67f09SDavid van Moolenbroekecho "I:checking for nsec3param in unsigned zone ($n)"
152*00b67f09SDavid van Moolenbroekret=0
153*00b67f09SDavid van Moolenbroek$DIG $DIGOPTS +noall +answer autonsec3.example. nsec3param @10.53.0.3 > dig.out.ns3.test$n || ret=1
154*00b67f09SDavid van Moolenbroekgrep "NSEC3PARAM" dig.out.ns3.test$n > /dev/null && ret=1
155*00b67f09SDavid van Moolenbroekn=`expr $n + 1`
156*00b67f09SDavid van Moolenbroekif [ $ret != 0 ]; then echo "I:failed"; fi
157*00b67f09SDavid van Moolenbroekstatus=`expr $status + $ret`
158*00b67f09SDavid van Moolenbroek
159*00b67f09SDavid van Moolenbroekecho "I:checking for nsec3param signing record ($n)"
160*00b67f09SDavid van Moolenbroekret=0
161*00b67f09SDavid van Moolenbroek$RNDC -c ../common/rndc.conf -s 10.53.0.3 -p 9953 signing -list autonsec3.example. > signing.out.test$n 2>&1
162*00b67f09SDavid van Moolenbroekgrep "Pending NSEC3 chain 1 0 20 DEAF" signing.out.test$n > /dev/null || ret=1
163*00b67f09SDavid van Moolenbroekn=`expr $n + 1`
164*00b67f09SDavid van Moolenbroekif [ $ret != 0 ]; then echo "I:failed"; fi
165*00b67f09SDavid van Moolenbroekstatus=`expr $status + $ret`
166*00b67f09SDavid van Moolenbroek
167*00b67f09SDavid van Moolenbroekecho "I:resetting nsec3param via rndc signing ($n)"
168*00b67f09SDavid van Moolenbroekret=0
169*00b67f09SDavid van Moolenbroek$RNDC -c ../common/rndc.conf -s 10.53.0.3 -p 9953 signing -clear all autonsec3.example. > /dev/null 2>&1
170*00b67f09SDavid van Moolenbroek$RNDC -c ../common/rndc.conf -s 10.53.0.3 -p 9953 signing -nsec3param 1 1 10 beef autonsec3.example. > /dev/null 2>&1
171*00b67f09SDavid van Moolenbroekfor i in 0 1 2 3 4 5 6 7 8 9; do
172*00b67f09SDavid van Moolenbroek	ret=0
173*00b67f09SDavid van Moolenbroek	$RNDC -c ../common/rndc.conf -s 10.53.0.3 -p 9953 signing -list autonsec3.example. > signing.out.test$n 2>&1
174*00b67f09SDavid van Moolenbroek	grep "Pending NSEC3 chain 1 1 10 BEEF" signing.out.test$n > /dev/null || ret=1
175*00b67f09SDavid van Moolenbroek	num=`grep "Pending " signing.out.test$n | wc -l`
176*00b67f09SDavid van Moolenbroek	[ $num -eq 1 ] || ret=1
177*00b67f09SDavid van Moolenbroek	[ $ret -eq 0 ] && break
178*00b67f09SDavid van Moolenbroek	echo "I:waiting ... ($i)"
179*00b67f09SDavid van Moolenbroek	sleep 2
180*00b67f09SDavid van Moolenbroekdone
181*00b67f09SDavid van Moolenbroekn=`expr $n + 1`
182*00b67f09SDavid van Moolenbroekif [ $ret != 0 ]; then echo "I:failed"; fi
183*00b67f09SDavid van Moolenbroekstatus=`expr $status + $ret`
184*00b67f09SDavid van Moolenbroek
185*00b67f09SDavid van Moolenbroekecho "I:signing preset nsec3 zone"
186*00b67f09SDavid van Moolenbroekzsk=`cat autozsk.key`
187*00b67f09SDavid van Moolenbroekksk=`cat autoksk.key`
188*00b67f09SDavid van Moolenbroek$SETTIME -K ns3 -P now -A now $zsk > /dev/null 2>&1
189*00b67f09SDavid van Moolenbroek$SETTIME -K ns3 -P now -A now $ksk > /dev/null 2>&1
190*00b67f09SDavid van Moolenbroek$RNDC -c ../common/rndc.conf -s 10.53.0.3 -p 9953 loadkeys autonsec3.example. 2>&1 | sed 's/^/I:ns3 /'
191*00b67f09SDavid van Moolenbroek
192*00b67f09SDavid van Moolenbroekecho "I:waiting for changes to take effect"
193*00b67f09SDavid van Moolenbroeksleep 3
194*00b67f09SDavid van Moolenbroek
195*00b67f09SDavid van Moolenbroekecho "I:converting zone from nsec3 to nsec"
196*00b67f09SDavid van Moolenbroek$NSUPDATE > /dev/null 2>&1 << END	|| status=1
197*00b67f09SDavid van Moolenbroekserver 10.53.0.3 5300
198*00b67f09SDavid van Moolenbroekzone nsec3-to-nsec.example.
199*00b67f09SDavid van Moolenbroekupdate delete nsec3-to-nsec.example. NSEC3PARAM
200*00b67f09SDavid van Moolenbroeksend
201*00b67f09SDavid van MoolenbroekEND
202*00b67f09SDavid van Moolenbroek
203*00b67f09SDavid van Moolenbroekecho "I:waiting for change to take effect"
204*00b67f09SDavid van Moolenbroeksleep 3
205*00b67f09SDavid van Moolenbroek
206*00b67f09SDavid van Moolenbroekecho "I:checking that expired RRSIGs from missing key are not deleted ($n)"
207*00b67f09SDavid van Moolenbroekret=0
208*00b67f09SDavid van Moolenbroekmissing=`sed 's/^K.*+007+0*\([0-9]\)/\1/' < missingzsk.key`
209*00b67f09SDavid van Moolenbroek$JOURNALPRINT ns3/nozsk.example.db.jnl | \
210*00b67f09SDavid van Moolenbroek   awk '{if ($1 == "del" && $5 == "RRSIG" && $12 == id) {exit 1}} END {exit 0}' id=$missing || ret=1
211*00b67f09SDavid van Moolenbroekn=`expr $n + 1`
212*00b67f09SDavid van Moolenbroekif [ $ret != 0 ]; then echo "I:failed"; fi
213*00b67f09SDavid van Moolenbroekstatus=`expr $status + $ret`
214*00b67f09SDavid van Moolenbroek
215*00b67f09SDavid van Moolenbroekecho "I:checking that expired RRSIGs from inactive key are not deleted ($n)"
216*00b67f09SDavid van Moolenbroekret=0
217*00b67f09SDavid van Moolenbroekinactive=`sed 's/^K.*+007+0*\([0-9]\)/\1/' < inactivezsk.key`
218*00b67f09SDavid van Moolenbroek$JOURNALPRINT ns3/inaczsk.example.db.jnl | \
219*00b67f09SDavid van Moolenbroek   awk '{if ($1 == "del" && $5 == "RRSIG" && $12 == id) {exit 1}} END {exit 0}' id=$inactive || ret=1
220*00b67f09SDavid van Moolenbroekn=`expr $n + 1`
221*00b67f09SDavid van Moolenbroekif [ $ret != 0 ]; then echo "I:failed"; fi
222*00b67f09SDavid van Moolenbroekstatus=`expr $status + $ret`
223*00b67f09SDavid van Moolenbroek
224*00b67f09SDavid van Moolenbroekecho "I:checking that non-replaceable RRSIGs are logged only once (missing private key) ($n)"
225*00b67f09SDavid van Moolenbroekret=0
226*00b67f09SDavid van Moolenbroekloglines=`grep "Key nozsk.example/NSEC3RSASHA1/$missing .* retaining signatures" ns3/named.run | wc -l`
227*00b67f09SDavid van Moolenbroek[ "$loglines" -eq 1 ] || ret=1
228*00b67f09SDavid van Moolenbroekn=`expr $n + 1`
229*00b67f09SDavid van Moolenbroekif [ $ret != 0 ]; then echo "I:failed"; fi
230*00b67f09SDavid van Moolenbroekstatus=`expr $status + $ret`
231*00b67f09SDavid van Moolenbroek
232*00b67f09SDavid van Moolenbroekecho "I:checking that non-replaceable RRSIGs are logged only once (inactive private key) ($n)"
233*00b67f09SDavid van Moolenbroekret=0
234*00b67f09SDavid van Moolenbroekloglines=`grep "Key inaczsk.example/NSEC3RSASHA1/$inactive .* retaining signatures" ns3/named.run | wc -l`
235*00b67f09SDavid van Moolenbroek[ "$loglines" -eq 1 ] || ret=1
236*00b67f09SDavid van Moolenbroekn=`expr $n + 1`
237*00b67f09SDavid van Moolenbroekif [ $ret != 0 ]; then echo "I:failed"; fi
238*00b67f09SDavid van Moolenbroekstatus=`expr $status + $ret`
239*00b67f09SDavid van Moolenbroek
240*00b67f09SDavid van Moolenbroek# Send rndc sync command to ns1, ns2 and ns3, to force the dynamically
241*00b67f09SDavid van Moolenbroek# signed zones to be dumped to their zone files
242*00b67f09SDavid van Moolenbroekecho "I:dumping zone files"
243*00b67f09SDavid van Moolenbroek$RNDC -c ../common/rndc.conf -s 10.53.0.1 -p 9953 sync 2>&1 | sed 's/^/I:ns1 /'
244*00b67f09SDavid van Moolenbroek$RNDC -c ../common/rndc.conf -s 10.53.0.2 -p 9953 sync 2>&1 | sed 's/^/I:ns2 /'
245*00b67f09SDavid van Moolenbroek$RNDC -c ../common/rndc.conf -s 10.53.0.3 -p 9953 sync 2>&1 | sed 's/^/I:ns3 /'
246*00b67f09SDavid van Moolenbroek
247*00b67f09SDavid van Moolenbroekecho "I:checking expired signatures were updated ($n)"
248*00b67f09SDavid van Moolenbroekfor i in 1 2 3 4 5 6 7 8 9
249*00b67f09SDavid van Moolenbroekdo
250*00b67f09SDavid van Moolenbroek	ret=0
251*00b67f09SDavid van Moolenbroek	$DIG $DIGOPTS +noauth a.oldsigs.example. @10.53.0.3 a > dig.out.ns3.test$n || ret=1
252*00b67f09SDavid van Moolenbroek	$DIG $DIGOPTS +noauth a.oldsigs.example. @10.53.0.4 a > dig.out.ns4.test$n || ret=1
253*00b67f09SDavid van Moolenbroek	$PERL ../digcomp.pl dig.out.ns3.test$n dig.out.ns4.test$n > digcomp.out.test$n || ret=1
254*00b67f09SDavid van Moolenbroek	grep "flags:.*ad.*QUERY" dig.out.ns4.test$n > /dev/null || ret=1
255*00b67f09SDavid van Moolenbroek	[ $ret = 0 ] && break
256*00b67f09SDavid van Moolenbroek	sleep 1
257*00b67f09SDavid van Moolenbroekdone
258*00b67f09SDavid van Moolenbroekif [ $ret != 0 ]; then cat digcomp.out.test$n; echo "I:failed"; fi
259*00b67f09SDavid van Moolenbroekn=`expr $n + 1`
260*00b67f09SDavid van Moolenbroekstatus=`expr $status + $ret`
261*00b67f09SDavid van Moolenbroek
262*00b67f09SDavid van Moolenbroekecho "I:checking NSEC->NSEC3 conversion succeeded ($n)"
263*00b67f09SDavid van Moolenbroekret=0
264*00b67f09SDavid van Moolenbroek$DIG $DIGOPTS nsec3.example. nsec3param @10.53.0.3 > dig.out.ns3.ok.test$n || ret=1
265*00b67f09SDavid van Moolenbroekgrep "status: NOERROR" dig.out.ns3.ok.test$n > /dev/null || ret=1
266*00b67f09SDavid van Moolenbroek$DIG $DIGOPTS +noauth q.nsec3.example. @10.53.0.3 a > dig.out.ns3.test$n || ret=1
267*00b67f09SDavid van Moolenbroek$DIG $DIGOPTS +noauth q.nsec3.example. @10.53.0.4 a > dig.out.ns4.test$n || ret=1
268*00b67f09SDavid van Moolenbroek$PERL ../digcomp.pl dig.out.ns3.test$n dig.out.ns4.test$n || ret=1
269*00b67f09SDavid van Moolenbroekgrep "flags:.*ad.*QUERY" dig.out.ns4.test$n > /dev/null || ret=1
270*00b67f09SDavid van Moolenbroekgrep "status: NXDOMAIN" dig.out.ns4.test$n > /dev/null || ret=1
271*00b67f09SDavid van Moolenbroekn=`expr $n + 1`
272*00b67f09SDavid van Moolenbroekif [ $ret != 0 ]; then echo "I:failed"; fi
273*00b67f09SDavid van Moolenbroekstatus=`expr $status + $ret`
274*00b67f09SDavid van Moolenbroek
275*00b67f09SDavid van Moolenbroekecho "I:checking direct NSEC3 autosigning succeeded ($n)"
276*00b67f09SDavid van Moolenbroekret=0
277*00b67f09SDavid van Moolenbroek$DIG $DIGOPTS +noall +answer autonsec3.example. nsec3param @10.53.0.3 > dig.out.ns3.ok.test$n || ret=1
278*00b67f09SDavid van Moolenbroek[ -s  dig.out.ns3.ok.test$n ] || ret=1
279*00b67f09SDavid van Moolenbroekgrep "NSEC3PARAM" dig.out.ns3.ok.test$n > /dev/null || ret=1
280*00b67f09SDavid van Moolenbroek$DIG $DIGOPTS +noauth q.autonsec3.example. @10.53.0.3 a > dig.out.ns3.test$n || ret=1
281*00b67f09SDavid van Moolenbroek$DIG $DIGOPTS +noauth q.autonsec3.example. @10.53.0.4 a > dig.out.ns4.test$n || ret=1
282*00b67f09SDavid van Moolenbroek$PERL ../digcomp.pl dig.out.ns3.test$n dig.out.ns4.test$n || ret=1
283*00b67f09SDavid van Moolenbroekgrep "flags:.*ad.*QUERY" dig.out.ns4.test$n > /dev/null || ret=1
284*00b67f09SDavid van Moolenbroekgrep "status: NXDOMAIN" dig.out.ns4.test$n > /dev/null || ret=1
285*00b67f09SDavid van Moolenbroekn=`expr $n + 1`
286*00b67f09SDavid van Moolenbroekif [ $ret != 0 ]; then echo "I:failed"; fi
287*00b67f09SDavid van Moolenbroekstatus=`expr $status + $ret`
288*00b67f09SDavid van Moolenbroek
289*00b67f09SDavid van Moolenbroekecho "I:checking NSEC->NSEC3 conversion failed with NSEC-only key ($n)"
290*00b67f09SDavid van Moolenbroekret=0
291*00b67f09SDavid van Moolenbroekgrep "failed: REFUSED" nsupdate.out > /dev/null || ret=1
292*00b67f09SDavid van Moolenbroekn=`expr $n + 1`
293*00b67f09SDavid van Moolenbroekif [ $ret != 0 ]; then echo "I:failed"; fi
294*00b67f09SDavid van Moolenbroekstatus=`expr $status + $ret`
295*00b67f09SDavid van Moolenbroek
296*00b67f09SDavid van Moolenbroekecho "I:checking NSEC3->NSEC conversion succeeded ($n)"
297*00b67f09SDavid van Moolenbroekret=0
298*00b67f09SDavid van Moolenbroek# this command should result in an empty file:
299*00b67f09SDavid van Moolenbroek$DIG $DIGOPTS +noall +answer nsec3-to-nsec.example. nsec3param @10.53.0.3 > dig.out.ns3.nx.test$n || ret=1
300*00b67f09SDavid van Moolenbroekgrep "NSEC3PARAM" dig.out.ns3.nx.test$n > /dev/null && ret=1
301*00b67f09SDavid van Moolenbroek$DIG $DIGOPTS +noauth q.nsec3-to-nsec.example. @10.53.0.3 a > dig.out.ns3.test$n || ret=1
302*00b67f09SDavid van Moolenbroek$DIG $DIGOPTS +noauth q.nsec3-to-nsec.example. @10.53.0.4 a > dig.out.ns4.test$n || ret=1
303*00b67f09SDavid van Moolenbroek$PERL ../digcomp.pl dig.out.ns3.test$n dig.out.ns4.test$n || ret=1
304*00b67f09SDavid van Moolenbroekgrep "flags:.*ad.*QUERY" dig.out.ns4.test$n > /dev/null || ret=1
305*00b67f09SDavid van Moolenbroekgrep "status: NXDOMAIN" dig.out.ns4.test$n > /dev/null || ret=1
306*00b67f09SDavid van Moolenbroekn=`expr $n + 1`
307*00b67f09SDavid van Moolenbroekif [ $ret != 0 ]; then echo "I:failed"; fi
308*00b67f09SDavid van Moolenbroekstatus=`expr $status + $ret`
309*00b67f09SDavid van Moolenbroek
310*00b67f09SDavid van Moolenbroekecho "I:checking NSEC3->NSEC conversion with 'rndc signing -nsec3param none' ($n)"
311*00b67f09SDavid van Moolenbroekret=0
312*00b67f09SDavid van Moolenbroek$RNDC -c ../common/rndc.conf -s 10.53.0.3 -p 9953 signing -nsec3param none autonsec3.example. > /dev/null 2>&1
313*00b67f09SDavid van Moolenbroeksleep 2
314*00b67f09SDavid van Moolenbroek# this command should result in an empty file:
315*00b67f09SDavid van Moolenbroek$DIG $DIGOPTS +noall +answer autonsec3.example. nsec3param @10.53.0.3 > dig.out.ns3.nx.test$n || ret=1
316*00b67f09SDavid van Moolenbroekgrep "NSEC3PARAM" dig.out.ns3.nx.test$n > /dev/null && ret=1
317*00b67f09SDavid van Moolenbroek$DIG $DIGOPTS +noauth q.autonsec3.example. @10.53.0.3 a > dig.out.ns3.test$n || ret=1
318*00b67f09SDavid van Moolenbroek$DIG $DIGOPTS +noauth q.autonsec3.example. @10.53.0.4 a > dig.out.ns4.test$n || ret=1
319*00b67f09SDavid van Moolenbroek$PERL ../digcomp.pl dig.out.ns3.test$n dig.out.ns4.test$n || ret=1
320*00b67f09SDavid van Moolenbroekgrep "flags:.*ad.*QUERY" dig.out.ns4.test$n > /dev/null || ret=1
321*00b67f09SDavid van Moolenbroekgrep "status: NXDOMAIN" dig.out.ns4.test$n > /dev/null || ret=1
322*00b67f09SDavid van Moolenbroekn=`expr $n + 1`
323*00b67f09SDavid van Moolenbroekif [ $ret != 0 ]; then echo "I:failed"; fi
324*00b67f09SDavid van Moolenbroekstatus=`expr $status + $ret`
325*00b67f09SDavid van Moolenbroek
326*00b67f09SDavid van Moolenbroekecho "I:checking TTLs of imported DNSKEYs (no default) ($n)"
327*00b67f09SDavid van Moolenbroekret=0
328*00b67f09SDavid van Moolenbroek$DIG $DIGOPTS +tcp +noall +answer dnskey ttl1.example. @10.53.0.3 > dig.out.ns3.test$n || ret=1
329*00b67f09SDavid van Moolenbroek[ -s dig.out.ns3.test$n ] || ret=1
330*00b67f09SDavid van Moolenbroekawk 'BEGIN {r=0} $2 != 300 {r=1; print "I:found TTL " $2} END {exit r}' dig.out.ns3.test$n || ret=1
331*00b67f09SDavid van Moolenbroekn=`expr $n + 1`
332*00b67f09SDavid van Moolenbroekif [ $ret != 0 ]; then echo "I:failed"; fi
333*00b67f09SDavid van Moolenbroekstatus=`expr $status + $ret`
334*00b67f09SDavid van Moolenbroek
335*00b67f09SDavid van Moolenbroekecho "I:checking TTLs of imported DNSKEYs (with default) ($n)"
336*00b67f09SDavid van Moolenbroekret=0
337*00b67f09SDavid van Moolenbroek$DIG $DIGOPTS +tcp +noall +answer dnskey ttl2.example. @10.53.0.3 > dig.out.ns3.test$n || ret=1
338*00b67f09SDavid van Moolenbroek[ -s dig.out.ns3.test$n ] || ret=1
339*00b67f09SDavid van Moolenbroekawk 'BEGIN {r=0} $2 != 60 {r=1; print "I:found TTL " $2} END {exit r}' dig.out.ns3.test$n || ret=1
340*00b67f09SDavid van Moolenbroekn=`expr $n + 1`
341*00b67f09SDavid van Moolenbroekif [ $ret != 0 ]; then echo "I:failed"; fi
342*00b67f09SDavid van Moolenbroekstatus=`expr $status + $ret`
343*00b67f09SDavid van Moolenbroek
344*00b67f09SDavid van Moolenbroekecho "I:checking TTLs of imported DNSKEYs (mismatched) ($n)"
345*00b67f09SDavid van Moolenbroekret=0
346*00b67f09SDavid van Moolenbroek$DIG $DIGOPTS +tcp +noall +answer dnskey ttl3.example. @10.53.0.3 > dig.out.ns3.test$n || ret=1
347*00b67f09SDavid van Moolenbroek[ -s dig.out.ns3.test$n ] || ret=1
348*00b67f09SDavid van Moolenbroekawk 'BEGIN {r=0} $2 != 30 {r=1; print "I:found TTL " $2} END {exit r}' dig.out.ns3.test$n || ret=1
349*00b67f09SDavid van Moolenbroekn=`expr $n + 1`
350*00b67f09SDavid van Moolenbroekif [ $ret != 0 ]; then echo "I:failed"; fi
351*00b67f09SDavid van Moolenbroekstatus=`expr $status + $ret`
352*00b67f09SDavid van Moolenbroek
353*00b67f09SDavid van Moolenbroekecho "I:checking TTLs of imported DNSKEYs (existing RRset) ($n)"
354*00b67f09SDavid van Moolenbroekret=0
355*00b67f09SDavid van Moolenbroek$DIG $DIGOPTS +tcp +noall +answer dnskey ttl4.example. @10.53.0.3 > dig.out.ns3.test$n || ret=1
356*00b67f09SDavid van Moolenbroek[ -s dig.out.ns3.test$n ] || ret=1
357*00b67f09SDavid van Moolenbroekawk 'BEGIN {r=0} $2 != 30 {r=1; print "I:found TTL " $2} END {exit r}' dig.out.ns3.test$n || ret=1
358*00b67f09SDavid van Moolenbroekn=`expr $n + 1`
359*00b67f09SDavid van Moolenbroekif [ $ret != 0 ]; then echo "I:failed"; fi
360*00b67f09SDavid van Moolenbroekstatus=`expr $status + $ret`
361*00b67f09SDavid van Moolenbroek
362*00b67f09SDavid van Moolenbroekecho "I:checking positive validation NSEC ($n)"
363*00b67f09SDavid van Moolenbroekret=0
364*00b67f09SDavid van Moolenbroek$DIG $DIGOPTS +noauth a.example. @10.53.0.2 a > dig.out.ns2.test$n || ret=1
365*00b67f09SDavid van Moolenbroek$DIG $DIGOPTS +noauth a.example. @10.53.0.4 a > dig.out.ns4.test$n || ret=1
366*00b67f09SDavid van Moolenbroek$PERL ../digcomp.pl dig.out.ns2.test$n dig.out.ns4.test$n || ret=1
367*00b67f09SDavid van Moolenbroekgrep "flags:.*ad.*QUERY" dig.out.ns4.test$n > /dev/null || ret=1
368*00b67f09SDavid van Moolenbroekn=`expr $n + 1`
369*00b67f09SDavid van Moolenbroekif [ $ret != 0 ]; then echo "I:failed"; fi
370*00b67f09SDavid van Moolenbroekstatus=`expr $status + $ret`
371*00b67f09SDavid van Moolenbroek
372*00b67f09SDavid van Moolenbroekecho "I:checking positive validation NSEC3 ($n)"
373*00b67f09SDavid van Moolenbroekret=0
374*00b67f09SDavid van Moolenbroek$DIG $DIGOPTS +noauth a.nsec3.example. \
375*00b67f09SDavid van Moolenbroek	@10.53.0.3 a > dig.out.ns3.test$n || ret=1
376*00b67f09SDavid van Moolenbroek$DIG $DIGOPTS +noauth a.nsec3.example. \
377*00b67f09SDavid van Moolenbroek	@10.53.0.4 a > dig.out.ns4.test$n || ret=1
378*00b67f09SDavid van Moolenbroek$PERL ../digcomp.pl dig.out.ns3.test$n dig.out.ns4.test$n || ret=1
379*00b67f09SDavid van Moolenbroekgrep "flags:.*ad.*QUERY" dig.out.ns4.test$n > /dev/null || ret=1
380*00b67f09SDavid van Moolenbroekn=`expr $n + 1`
381*00b67f09SDavid van Moolenbroekif [ $ret != 0 ]; then echo "I:failed"; fi
382*00b67f09SDavid van Moolenbroekstatus=`expr $status + $ret`
383*00b67f09SDavid van Moolenbroek
384*00b67f09SDavid van Moolenbroekecho "I:checking positive validation OPTOUT ($n)"
385*00b67f09SDavid van Moolenbroekret=0
386*00b67f09SDavid van Moolenbroek$DIG $DIGOPTS +noauth a.optout.example. \
387*00b67f09SDavid van Moolenbroek	@10.53.0.3 a > dig.out.ns3.test$n || ret=1
388*00b67f09SDavid van Moolenbroek$DIG $DIGOPTS +noauth a.optout.example. \
389*00b67f09SDavid van Moolenbroek	@10.53.0.4 a > dig.out.ns4.test$n || ret=1
390*00b67f09SDavid van Moolenbroek$PERL ../digcomp.pl dig.out.ns3.test$n dig.out.ns4.test$n || ret=1
391*00b67f09SDavid van Moolenbroekgrep "flags:.*ad.*QUERY" dig.out.ns4.test$n > /dev/null || ret=1
392*00b67f09SDavid van Moolenbroekn=`expr $n + 1`
393*00b67f09SDavid van Moolenbroekif [ $ret != 0 ]; then echo "I:failed"; fi
394*00b67f09SDavid van Moolenbroekstatus=`expr $status + $ret`
395*00b67f09SDavid van Moolenbroek
396*00b67f09SDavid van Moolenbroekecho "I:checking negative validation NXDOMAIN NSEC ($n)"
397*00b67f09SDavid van Moolenbroekret=0
398*00b67f09SDavid van Moolenbroek$DIG $DIGOPTS +noauth q.example. @10.53.0.2 a > dig.out.ns2.test$n || ret=1
399*00b67f09SDavid van Moolenbroek$DIG $DIGOPTS +noauth q.example. @10.53.0.4 a > dig.out.ns4.test$n || ret=1
400*00b67f09SDavid van Moolenbroek$PERL ../digcomp.pl dig.out.ns2.test$n dig.out.ns4.test$n || ret=1
401*00b67f09SDavid van Moolenbroekgrep "flags:.*ad.*QUERY" dig.out.ns4.test$n > /dev/null || ret=1
402*00b67f09SDavid van Moolenbroekgrep "status: NXDOMAIN" dig.out.ns4.test$n > /dev/null || ret=1
403*00b67f09SDavid van Moolenbroekn=`expr $n + 1`
404*00b67f09SDavid van Moolenbroekif [ $ret != 0 ]; then echo "I:failed"; fi
405*00b67f09SDavid van Moolenbroekstatus=`expr $status + $ret`
406*00b67f09SDavid van Moolenbroek
407*00b67f09SDavid van Moolenbroekecho "I:checking negative validation NXDOMAIN NSEC3 ($n)"
408*00b67f09SDavid van Moolenbroekret=0
409*00b67f09SDavid van Moolenbroek$DIG $DIGOPTS +noauth q.nsec3.example. \
410*00b67f09SDavid van Moolenbroek	@10.53.0.3 a > dig.out.ns3.test$n || ret=1
411*00b67f09SDavid van Moolenbroek$DIG $DIGOPTS +noauth q.nsec3.example. \
412*00b67f09SDavid van Moolenbroek	@10.53.0.4 a > dig.out.ns4.test$n || ret=1
413*00b67f09SDavid van Moolenbroek$PERL ../digcomp.pl dig.out.ns3.test$n dig.out.ns4.test$n || ret=1
414*00b67f09SDavid van Moolenbroekgrep "flags:.*ad.*QUERY" dig.out.ns4.test$n > /dev/null || ret=1
415*00b67f09SDavid van Moolenbroekgrep "status: NXDOMAIN" dig.out.ns4.test$n > /dev/null || ret=1
416*00b67f09SDavid van Moolenbroekn=`expr $n + 1`
417*00b67f09SDavid van Moolenbroekif [ $ret != 0 ]; then echo "I:failed"; fi
418*00b67f09SDavid van Moolenbroekstatus=`expr $status + $ret`
419*00b67f09SDavid van Moolenbroek
420*00b67f09SDavid van Moolenbroekecho "I:checking negative validation NXDOMAIN OPTOUT ($n)"
421*00b67f09SDavid van Moolenbroekret=0
422*00b67f09SDavid van Moolenbroek$DIG $DIGOPTS +noauth q.optout.example. \
423*00b67f09SDavid van Moolenbroek	@10.53.0.3 a > dig.out.ns3.test$n || ret=1
424*00b67f09SDavid van Moolenbroek$DIG $DIGOPTS +noauth q.optout.example. \
425*00b67f09SDavid van Moolenbroek	@10.53.0.4 a > dig.out.ns4.test$n || ret=1
426*00b67f09SDavid van Moolenbroek$PERL ../digcomp.pl dig.out.ns3.test$n dig.out.ns4.test$n || ret=1
427*00b67f09SDavid van Moolenbroekgrep "status: NXDOMAIN" dig.out.ns4.test$n > /dev/null || ret=1
428*00b67f09SDavid van Moolenbroek# Note - this is looking for failure, hence the &&
429*00b67f09SDavid van Moolenbroekgrep "flags:.*ad.*QUERY" dig.out.ns4.test$n > /dev/null && ret=1
430*00b67f09SDavid van Moolenbroekn=`expr $n + 1`
431*00b67f09SDavid van Moolenbroekif [ $ret != 0 ]; then echo "I:failed"; fi
432*00b67f09SDavid van Moolenbroekstatus=`expr $status + $ret`
433*00b67f09SDavid van Moolenbroek
434*00b67f09SDavid van Moolenbroekecho "I:checking negative validation NODATA NSEC ($n)"
435*00b67f09SDavid van Moolenbroekret=0
436*00b67f09SDavid van Moolenbroek$DIG $DIGOPTS +noauth a.example. @10.53.0.2 txt > dig.out.ns2.test$n || ret=1
437*00b67f09SDavid van Moolenbroek$DIG $DIGOPTS +noauth a.example. @10.53.0.4 txt > dig.out.ns4.test$n || ret=1
438*00b67f09SDavid van Moolenbroek$PERL ../digcomp.pl dig.out.ns2.test$n dig.out.ns4.test$n || ret=1
439*00b67f09SDavid van Moolenbroekgrep "flags:.*ad.*QUERY" dig.out.ns4.test$n > /dev/null || ret=1
440*00b67f09SDavid van Moolenbroekgrep "status: NOERROR" dig.out.ns4.test$n > /dev/null || ret=1
441*00b67f09SDavid van Moolenbroekgrep "ANSWER: 0" dig.out.ns4.test$n > /dev/null || ret=1
442*00b67f09SDavid van Moolenbroekn=`expr $n + 1`
443*00b67f09SDavid van Moolenbroekif [ $ret != 0 ]; then echo "I:failed"; fi
444*00b67f09SDavid van Moolenbroekstatus=`expr $status + $ret`
445*00b67f09SDavid van Moolenbroek
446*00b67f09SDavid van Moolenbroekecho "I:checking negative validation NODATA NSEC3 ($n)"
447*00b67f09SDavid van Moolenbroekret=0
448*00b67f09SDavid van Moolenbroek$DIG $DIGOPTS +noauth a.nsec3.example. \
449*00b67f09SDavid van Moolenbroek	@10.53.0.3 txt > dig.out.ns3.test$n || ret=1
450*00b67f09SDavid van Moolenbroek$DIG $DIGOPTS +noauth a.nsec3.example. \
451*00b67f09SDavid van Moolenbroek	@10.53.0.4 txt > dig.out.ns4.test$n || ret=1
452*00b67f09SDavid van Moolenbroek$PERL ../digcomp.pl dig.out.ns3.test$n dig.out.ns4.test$n || ret=1
453*00b67f09SDavid van Moolenbroekgrep "flags:.*ad.*QUERY" dig.out.ns4.test$n > /dev/null || ret=1
454*00b67f09SDavid van Moolenbroekgrep "status: NOERROR" dig.out.ns4.test$n > /dev/null || ret=1
455*00b67f09SDavid van Moolenbroekgrep "ANSWER: 0" dig.out.ns4.test$n > /dev/null || ret=1
456*00b67f09SDavid van Moolenbroekn=`expr $n + 1`
457*00b67f09SDavid van Moolenbroekif [ $ret != 0 ]; then echo "I:failed"; fi
458*00b67f09SDavid van Moolenbroekstatus=`expr $status + $ret`
459*00b67f09SDavid van Moolenbroek
460*00b67f09SDavid van Moolenbroekecho "I:checking negative validation NODATA OPTOUT ($n)"
461*00b67f09SDavid van Moolenbroekret=0
462*00b67f09SDavid van Moolenbroek$DIG $DIGOPTS +noauth a.optout.example. \
463*00b67f09SDavid van Moolenbroek	@10.53.0.3 txt > dig.out.ns3.test$n || ret=1
464*00b67f09SDavid van Moolenbroek$DIG $DIGOPTS +noauth a.optout.example. \
465*00b67f09SDavid van Moolenbroek	@10.53.0.4 txt > dig.out.ns4.test$n || ret=1
466*00b67f09SDavid van Moolenbroek$PERL ../digcomp.pl dig.out.ns3.test$n dig.out.ns4.test$n || ret=1
467*00b67f09SDavid van Moolenbroekgrep "flags:.*ad.*QUERY" dig.out.ns4.test$n > /dev/null || ret=1
468*00b67f09SDavid van Moolenbroekgrep "status: NOERROR" dig.out.ns4.test$n > /dev/null || ret=1
469*00b67f09SDavid van Moolenbroekgrep "ANSWER: 0" dig.out.ns4.test$n > /dev/null || ret=1
470*00b67f09SDavid van Moolenbroekn=`expr $n + 1`
471*00b67f09SDavid van Moolenbroekif [ $ret != 0 ]; then echo "I:failed"; fi
472*00b67f09SDavid van Moolenbroekstatus=`expr $status + $ret`
473*00b67f09SDavid van Moolenbroek
474*00b67f09SDavid van Moolenbroek# Check the insecure.example domain
475*00b67f09SDavid van Moolenbroek
476*00b67f09SDavid van Moolenbroekecho "I:checking 1-server insecurity proof NSEC ($n)"
477*00b67f09SDavid van Moolenbroekret=0
478*00b67f09SDavid van Moolenbroek$DIG $DIGOPTS +noauth a.insecure.example. @10.53.0.3 a > dig.out.ns3.test$n || ret=1
479*00b67f09SDavid van Moolenbroek$DIG $DIGOPTS +noauth a.insecure.example. @10.53.0.4 a > dig.out.ns4.test$n || ret=1
480*00b67f09SDavid van Moolenbroek$PERL ../digcomp.pl dig.out.ns3.test$n dig.out.ns4.test$n || ret=1
481*00b67f09SDavid van Moolenbroekgrep "status: NOERROR" dig.out.ns4.test$n > /dev/null || ret=1
482*00b67f09SDavid van Moolenbroek# Note - this is looking for failure, hence the &&
483*00b67f09SDavid van Moolenbroekgrep "flags:.*ad.*QUERY" dig.out.ns4.test$n > /dev/null && ret=1
484*00b67f09SDavid van Moolenbroekn=`expr $n + 1`
485*00b67f09SDavid van Moolenbroekif [ $ret != 0 ]; then echo "I:failed"; fi
486*00b67f09SDavid van Moolenbroekstatus=`expr $status + $ret`
487*00b67f09SDavid van Moolenbroek
488*00b67f09SDavid van Moolenbroekecho "I:checking 1-server negative insecurity proof NSEC ($n)"
489*00b67f09SDavid van Moolenbroekret=0
490*00b67f09SDavid van Moolenbroek$DIG $DIGOPTS q.insecure.example. a @10.53.0.3 \
491*00b67f09SDavid van Moolenbroek	> dig.out.ns3.test$n || ret=1
492*00b67f09SDavid van Moolenbroek$DIG $DIGOPTS q.insecure.example. a @10.53.0.4 \
493*00b67f09SDavid van Moolenbroek	> dig.out.ns4.test$n || ret=1
494*00b67f09SDavid van Moolenbroek$PERL ../digcomp.pl dig.out.ns3.test$n dig.out.ns4.test$n || ret=1
495*00b67f09SDavid van Moolenbroekgrep "status: NXDOMAIN" dig.out.ns4.test$n > /dev/null || ret=1
496*00b67f09SDavid van Moolenbroek# Note - this is looking for failure, hence the &&
497*00b67f09SDavid van Moolenbroekgrep "flags:.*ad.*QUERY" dig.out.ns4.test$n > /dev/null && ret=1
498*00b67f09SDavid van Moolenbroekn=`expr $n + 1`
499*00b67f09SDavid van Moolenbroekif [ $ret != 0 ]; then echo "I:failed"; fi
500*00b67f09SDavid van Moolenbroekstatus=`expr $status + $ret`
501*00b67f09SDavid van Moolenbroek
502*00b67f09SDavid van Moolenbroek# Check the secure.example domain
503*00b67f09SDavid van Moolenbroek
504*00b67f09SDavid van Moolenbroekecho "I:checking multi-stage positive validation NSEC/NSEC ($n)"
505*00b67f09SDavid van Moolenbroekret=0
506*00b67f09SDavid van Moolenbroek$DIG $DIGOPTS +noauth a.secure.example. \
507*00b67f09SDavid van Moolenbroek	@10.53.0.3 a > dig.out.ns3.test$n || ret=1
508*00b67f09SDavid van Moolenbroek$DIG $DIGOPTS +noauth a.secure.example. \
509*00b67f09SDavid van Moolenbroek	@10.53.0.4 a > dig.out.ns4.test$n || ret=1
510*00b67f09SDavid van Moolenbroek$PERL ../digcomp.pl dig.out.ns3.test$n dig.out.ns4.test$n || ret=1
511*00b67f09SDavid van Moolenbroekgrep "status: NOERROR" dig.out.ns4.test$n > /dev/null || ret=1
512*00b67f09SDavid van Moolenbroekgrep "flags:.*ad.*QUERY" dig.out.ns4.test$n > /dev/null || ret=1
513*00b67f09SDavid van Moolenbroekn=`expr $n + 1`
514*00b67f09SDavid van Moolenbroekif [ $ret != 0 ]; then echo "I:failed"; fi
515*00b67f09SDavid van Moolenbroekstatus=`expr $status + $ret`
516*00b67f09SDavid van Moolenbroek
517*00b67f09SDavid van Moolenbroekecho "I:checking multi-stage positive validation NSEC/NSEC3 ($n)"
518*00b67f09SDavid van Moolenbroekret=0
519*00b67f09SDavid van Moolenbroek$DIG $DIGOPTS +noauth a.nsec3.example. \
520*00b67f09SDavid van Moolenbroek	@10.53.0.3 a > dig.out.ns3.test$n || ret=1
521*00b67f09SDavid van Moolenbroek$DIG $DIGOPTS +noauth a.nsec3.example. \
522*00b67f09SDavid van Moolenbroek	@10.53.0.4 a > dig.out.ns4.test$n || ret=1
523*00b67f09SDavid van Moolenbroek$PERL ../digcomp.pl dig.out.ns3.test$n dig.out.ns4.test$n || ret=1
524*00b67f09SDavid van Moolenbroekgrep "status: NOERROR" dig.out.ns4.test$n > /dev/null || ret=1
525*00b67f09SDavid van Moolenbroekgrep "flags:.*ad.*QUERY" dig.out.ns4.test$n > /dev/null || ret=1
526*00b67f09SDavid van Moolenbroekn=`expr $n + 1`
527*00b67f09SDavid van Moolenbroekif [ $ret != 0 ]; then echo "I:failed"; fi
528*00b67f09SDavid van Moolenbroekstatus=`expr $status + $ret`
529*00b67f09SDavid van Moolenbroek
530*00b67f09SDavid van Moolenbroekecho "I:checking multi-stage positive validation NSEC/OPTOUT ($n)"
531*00b67f09SDavid van Moolenbroekret=0
532*00b67f09SDavid van Moolenbroek$DIG $DIGOPTS +noauth a.optout.example. \
533*00b67f09SDavid van Moolenbroek	@10.53.0.3 a > dig.out.ns3.test$n || ret=1
534*00b67f09SDavid van Moolenbroek$DIG $DIGOPTS +noauth a.optout.example. \
535*00b67f09SDavid van Moolenbroek	@10.53.0.4 a > dig.out.ns4.test$n || ret=1
536*00b67f09SDavid van Moolenbroek$PERL ../digcomp.pl dig.out.ns3.test$n dig.out.ns4.test$n || ret=1
537*00b67f09SDavid van Moolenbroekgrep "status: NOERROR" dig.out.ns4.test$n > /dev/null || ret=1
538*00b67f09SDavid van Moolenbroekgrep "flags:.*ad.*QUERY" dig.out.ns4.test$n > /dev/null || ret=1
539*00b67f09SDavid van Moolenbroekn=`expr $n + 1`
540*00b67f09SDavid van Moolenbroekif [ $ret != 0 ]; then echo "I:failed"; fi
541*00b67f09SDavid van Moolenbroekstatus=`expr $status + $ret`
542*00b67f09SDavid van Moolenbroek
543*00b67f09SDavid van Moolenbroekecho "I:checking multi-stage positive validation NSEC3/NSEC ($n)"
544*00b67f09SDavid van Moolenbroekret=0
545*00b67f09SDavid van Moolenbroek$DIG $DIGOPTS +noauth a.secure.nsec3.example. \
546*00b67f09SDavid van Moolenbroek	@10.53.0.3 a > dig.out.ns3.test$n || ret=1
547*00b67f09SDavid van Moolenbroek$DIG $DIGOPTS +noauth a.secure.nsec3.example. \
548*00b67f09SDavid van Moolenbroek	@10.53.0.4 a > dig.out.ns4.test$n || ret=1
549*00b67f09SDavid van Moolenbroek$PERL ../digcomp.pl dig.out.ns3.test$n dig.out.ns4.test$n || ret=1
550*00b67f09SDavid van Moolenbroekgrep "status: NOERROR" dig.out.ns4.test$n > /dev/null || ret=1
551*00b67f09SDavid van Moolenbroekgrep "flags:.*ad.*QUERY" dig.out.ns4.test$n > /dev/null || ret=1
552*00b67f09SDavid van Moolenbroekn=`expr $n + 1`
553*00b67f09SDavid van Moolenbroekif [ $ret != 0 ]; then echo "I:failed"; fi
554*00b67f09SDavid van Moolenbroekstatus=`expr $status + $ret`
555*00b67f09SDavid van Moolenbroek
556*00b67f09SDavid van Moolenbroekecho "I:checking multi-stage positive validation NSEC3/NSEC3 ($n)"
557*00b67f09SDavid van Moolenbroekret=0
558*00b67f09SDavid van Moolenbroek$DIG $DIGOPTS +noauth a.nsec3.nsec3.example. \
559*00b67f09SDavid van Moolenbroek	@10.53.0.3 a > dig.out.ns3.test$n || ret=1
560*00b67f09SDavid van Moolenbroek$DIG $DIGOPTS +noauth a.nsec3.nsec3.example. \
561*00b67f09SDavid van Moolenbroek	@10.53.0.4 a > dig.out.ns4.test$n || ret=1
562*00b67f09SDavid van Moolenbroek$PERL ../digcomp.pl dig.out.ns3.test$n dig.out.ns4.test$n || ret=1
563*00b67f09SDavid van Moolenbroekgrep "status: NOERROR" dig.out.ns4.test$n > /dev/null || ret=1
564*00b67f09SDavid van Moolenbroekgrep "flags:.*ad.*QUERY" dig.out.ns4.test$n > /dev/null || ret=1
565*00b67f09SDavid van Moolenbroekn=`expr $n + 1`
566*00b67f09SDavid van Moolenbroekif [ $ret != 0 ]; then echo "I:failed"; fi
567*00b67f09SDavid van Moolenbroekstatus=`expr $status + $ret`
568*00b67f09SDavid van Moolenbroek
569*00b67f09SDavid van Moolenbroekecho "I:checking multi-stage positive validation NSEC3/OPTOUT ($n)"
570*00b67f09SDavid van Moolenbroekret=0
571*00b67f09SDavid van Moolenbroek$DIG $DIGOPTS +noauth a.optout.nsec3.example. \
572*00b67f09SDavid van Moolenbroek	@10.53.0.3 a > dig.out.ns3.test$n || ret=1
573*00b67f09SDavid van Moolenbroek$DIG $DIGOPTS +noauth a.optout.nsec3.example. \
574*00b67f09SDavid van Moolenbroek	@10.53.0.4 a > dig.out.ns4.test$n || ret=1
575*00b67f09SDavid van Moolenbroek$PERL ../digcomp.pl dig.out.ns3.test$n dig.out.ns4.test$n || ret=1
576*00b67f09SDavid van Moolenbroekgrep "status: NOERROR" dig.out.ns4.test$n > /dev/null || ret=1
577*00b67f09SDavid van Moolenbroekgrep "flags:.*ad.*QUERY" dig.out.ns4.test$n > /dev/null || ret=1
578*00b67f09SDavid van Moolenbroekn=`expr $n + 1`
579*00b67f09SDavid van Moolenbroekif [ $ret != 0 ]; then echo "I:failed"; fi
580*00b67f09SDavid van Moolenbroekstatus=`expr $status + $ret`
581*00b67f09SDavid van Moolenbroek
582*00b67f09SDavid van Moolenbroekecho "I:checking multi-stage positive validation OPTOUT/NSEC ($n)"
583*00b67f09SDavid van Moolenbroekret=0
584*00b67f09SDavid van Moolenbroek$DIG $DIGOPTS +noauth a.secure.optout.example. \
585*00b67f09SDavid van Moolenbroek	@10.53.0.3 a > dig.out.ns3.test$n || ret=1
586*00b67f09SDavid van Moolenbroek$DIG $DIGOPTS +noauth a.secure.optout.example. \
587*00b67f09SDavid van Moolenbroek	@10.53.0.4 a > dig.out.ns4.test$n || ret=1
588*00b67f09SDavid van Moolenbroek$PERL ../digcomp.pl dig.out.ns3.test$n dig.out.ns4.test$n || ret=1
589*00b67f09SDavid van Moolenbroekgrep "status: NOERROR" dig.out.ns4.test$n > /dev/null || ret=1
590*00b67f09SDavid van Moolenbroekgrep "flags:.*ad.*QUERY" dig.out.ns4.test$n > /dev/null || ret=1
591*00b67f09SDavid van Moolenbroekn=`expr $n + 1`
592*00b67f09SDavid van Moolenbroekif [ $ret != 0 ]; then echo "I:failed"; fi
593*00b67f09SDavid van Moolenbroekstatus=`expr $status + $ret`
594*00b67f09SDavid van Moolenbroek
595*00b67f09SDavid van Moolenbroekecho "I:checking multi-stage positive validation OPTOUT/NSEC3 ($n)"
596*00b67f09SDavid van Moolenbroekret=0
597*00b67f09SDavid van Moolenbroek$DIG $DIGOPTS +noauth a.nsec3.optout.example. \
598*00b67f09SDavid van Moolenbroek	@10.53.0.3 a > dig.out.ns3.test$n || ret=1
599*00b67f09SDavid van Moolenbroek$DIG $DIGOPTS +noauth a.nsec3.optout.example. \
600*00b67f09SDavid van Moolenbroek	@10.53.0.4 a > dig.out.ns4.test$n || ret=1
601*00b67f09SDavid van Moolenbroek$PERL ../digcomp.pl dig.out.ns3.test$n dig.out.ns4.test$n || ret=1
602*00b67f09SDavid van Moolenbroekgrep "status: NOERROR" dig.out.ns4.test$n > /dev/null || ret=1
603*00b67f09SDavid van Moolenbroekgrep "flags:.*ad.*QUERY" dig.out.ns4.test$n > /dev/null || ret=1
604*00b67f09SDavid van Moolenbroekn=`expr $n + 1`
605*00b67f09SDavid van Moolenbroekif [ $ret != 0 ]; then echo "I:failed"; fi
606*00b67f09SDavid van Moolenbroekstatus=`expr $status + $ret`
607*00b67f09SDavid van Moolenbroek
608*00b67f09SDavid van Moolenbroekecho "I:checking multi-stage positive validation OPTOUT/OPTOUT ($n)"
609*00b67f09SDavid van Moolenbroekret=0
610*00b67f09SDavid van Moolenbroek$DIG $DIGOPTS +noauth a.optout.optout.example. \
611*00b67f09SDavid van Moolenbroek	@10.53.0.3 a > dig.out.ns3.test$n || ret=1
612*00b67f09SDavid van Moolenbroek$DIG $DIGOPTS +noauth a.optout.optout.example. \
613*00b67f09SDavid van Moolenbroek	@10.53.0.4 a > dig.out.ns4.test$n || ret=1
614*00b67f09SDavid van Moolenbroek$PERL ../digcomp.pl dig.out.ns3.test$n dig.out.ns4.test$n || ret=1
615*00b67f09SDavid van Moolenbroekgrep "status: NOERROR" dig.out.ns4.test$n > /dev/null || ret=1
616*00b67f09SDavid van Moolenbroekgrep "flags:.*ad.*QUERY" dig.out.ns4.test$n > /dev/null || ret=1
617*00b67f09SDavid van Moolenbroekn=`expr $n + 1`
618*00b67f09SDavid van Moolenbroekif [ $ret != 0 ]; then echo "I:failed"; fi
619*00b67f09SDavid van Moolenbroekstatus=`expr $status + $ret`
620*00b67f09SDavid van Moolenbroek
621*00b67f09SDavid van Moolenbroekecho "I:checking empty NODATA OPTOUT ($n)"
622*00b67f09SDavid van Moolenbroekret=0
623*00b67f09SDavid van Moolenbroek$DIG $DIGOPTS +noauth empty.optout.example. \
624*00b67f09SDavid van Moolenbroek	@10.53.0.3 a > dig.out.ns3.test$n || ret=1
625*00b67f09SDavid van Moolenbroek$DIG $DIGOPTS +noauth empty.optout.example. \
626*00b67f09SDavid van Moolenbroek	@10.53.0.4 a > dig.out.ns4.test$n || ret=1
627*00b67f09SDavid van Moolenbroek$PERL ../digcomp.pl dig.out.ns3.test$n dig.out.ns4.test$n || ret=1
628*00b67f09SDavid van Moolenbroekgrep "status: NOERROR" dig.out.ns4.test$n > /dev/null || ret=1
629*00b67f09SDavid van Moolenbroek#grep "flags:.*ad.*QUERY" dig.out.ns4.test$n > /dev/null || ret=1
630*00b67f09SDavid van Moolenbroekn=`expr $n + 1`
631*00b67f09SDavid van Moolenbroekif [ $ret != 0 ]; then echo "I:failed"; fi
632*00b67f09SDavid van Moolenbroekstatus=`expr $status + $ret`
633*00b67f09SDavid van Moolenbroek
634*00b67f09SDavid van Moolenbroek# Check the insecure.secure.example domain (insecurity proof)
635*00b67f09SDavid van Moolenbroek
636*00b67f09SDavid van Moolenbroekecho "I:checking 2-server insecurity proof ($n)"
637*00b67f09SDavid van Moolenbroekret=0
638*00b67f09SDavid van Moolenbroek$DIG $DIGOPTS +noauth a.insecure.secure.example. @10.53.0.2 a \
639*00b67f09SDavid van Moolenbroek	> dig.out.ns2.test$n || ret=1
640*00b67f09SDavid van Moolenbroek$DIG $DIGOPTS +noauth a.insecure.secure.example. @10.53.0.4 a \
641*00b67f09SDavid van Moolenbroek	> dig.out.ns4.test$n || ret=1
642*00b67f09SDavid van Moolenbroek$PERL ../digcomp.pl dig.out.ns2.test$n dig.out.ns4.test$n || ret=1
643*00b67f09SDavid van Moolenbroekgrep "status: NOERROR" dig.out.ns4.test$n > /dev/null || ret=1
644*00b67f09SDavid van Moolenbroek# Note - this is looking for failure, hence the &&
645*00b67f09SDavid van Moolenbroekgrep "flags:.*ad.*QUERY" dig.out.ns4.test$n > /dev/null && ret=1
646*00b67f09SDavid van Moolenbroekn=`expr $n + 1`
647*00b67f09SDavid van Moolenbroekif [ $ret != 0 ]; then echo "I:failed"; fi
648*00b67f09SDavid van Moolenbroekstatus=`expr $status + $ret`
649*00b67f09SDavid van Moolenbroek
650*00b67f09SDavid van Moolenbroek# Check a negative response in insecure.secure.example
651*00b67f09SDavid van Moolenbroek
652*00b67f09SDavid van Moolenbroekecho "I:checking 2-server insecurity proof with a negative answer ($n)"
653*00b67f09SDavid van Moolenbroekret=0
654*00b67f09SDavid van Moolenbroek$DIG $DIGOPTS q.insecure.secure.example. @10.53.0.2 a > dig.out.ns2.test$n \
655*00b67f09SDavid van Moolenbroek	|| ret=1
656*00b67f09SDavid van Moolenbroek$DIG $DIGOPTS q.insecure.secure.example. @10.53.0.4 a > dig.out.ns4.test$n \
657*00b67f09SDavid van Moolenbroek	|| ret=1
658*00b67f09SDavid van Moolenbroek$PERL ../digcomp.pl dig.out.ns2.test$n dig.out.ns4.test$n || ret=1
659*00b67f09SDavid van Moolenbroekgrep "status: NXDOMAIN" dig.out.ns4.test$n > /dev/null || ret=1
660*00b67f09SDavid van Moolenbroek# Note - this is looking for failure, hence the &&
661*00b67f09SDavid van Moolenbroekgrep "flags:.*ad.*QUERY" dig.out.ns4.test$n > /dev/null && ret=1
662*00b67f09SDavid van Moolenbroekn=`expr $n + 1`
663*00b67f09SDavid van Moolenbroekif [ $ret != 0 ]; then echo "I:failed"; fi
664*00b67f09SDavid van Moolenbroekstatus=`expr $status + $ret`
665*00b67f09SDavid van Moolenbroek
666*00b67f09SDavid van Moolenbroekecho "I:checking security root query ($n)"
667*00b67f09SDavid van Moolenbroekret=0
668*00b67f09SDavid van Moolenbroek$DIG $DIGOPTS . @10.53.0.4 key > dig.out.ns4.test$n || ret=1
669*00b67f09SDavid van Moolenbroekgrep "NOERROR" dig.out.ns4.test$n > /dev/null || ret=1
670*00b67f09SDavid van Moolenbroekgrep "flags:.*ad.*QUERY" dig.out.ns4.test$n > /dev/null || ret=1
671*00b67f09SDavid van Moolenbroekn=`expr $n + 1`
672*00b67f09SDavid van Moolenbroekif [ $ret != 0 ]; then echo "I:failed"; fi
673*00b67f09SDavid van Moolenbroekstatus=`expr $status + $ret`
674*00b67f09SDavid van Moolenbroek
675*00b67f09SDavid van Moolenbroekecho "I:checking positive validation RSASHA256 NSEC ($n)"
676*00b67f09SDavid van Moolenbroekret=0
677*00b67f09SDavid van Moolenbroek$DIG $DIGOPTS +noauth a.rsasha256.example. @10.53.0.3 a > dig.out.ns3.test$n || ret=1
678*00b67f09SDavid van Moolenbroek$DIG $DIGOPTS +noauth a.rsasha256.example. @10.53.0.4 a > dig.out.ns4.test$n || ret=1
679*00b67f09SDavid van Moolenbroek$PERL ../digcomp.pl dig.out.ns3.test$n dig.out.ns4.test$n || ret=1
680*00b67f09SDavid van Moolenbroekgrep "flags:.*ad.*QUERY" dig.out.ns4.test$n > /dev/null || ret=1
681*00b67f09SDavid van Moolenbroekn=`expr $n + 1`
682*00b67f09SDavid van Moolenbroekif [ $ret != 0 ]; then echo "I:failed"; fi
683*00b67f09SDavid van Moolenbroekstatus=`expr $status + $ret`
684*00b67f09SDavid van Moolenbroek
685*00b67f09SDavid van Moolenbroekecho "I:checking positive validation RSASHA512 NSEC ($n)"
686*00b67f09SDavid van Moolenbroekret=0
687*00b67f09SDavid van Moolenbroek$DIG $DIGOPTS +noauth a.rsasha512.example. @10.53.0.3 a > dig.out.ns3.test$n || ret=1
688*00b67f09SDavid van Moolenbroek$DIG $DIGOPTS +noauth a.rsasha512.example. @10.53.0.4 a > dig.out.ns4.test$n || ret=1
689*00b67f09SDavid van Moolenbroek$PERL ../digcomp.pl dig.out.ns3.test$n dig.out.ns4.test$n || ret=1
690*00b67f09SDavid van Moolenbroekgrep "flags:.*ad.*QUERY" dig.out.ns4.test$n > /dev/null || ret=1
691*00b67f09SDavid van Moolenbroekn=`expr $n + 1`
692*00b67f09SDavid van Moolenbroekif [ $ret != 0 ]; then echo "I:failed"; fi
693*00b67f09SDavid van Moolenbroekstatus=`expr $status + $ret`
694*00b67f09SDavid van Moolenbroek
695*00b67f09SDavid van Moolenbroekecho "I:checking that positive validation in a privately secure zone works ($n)"
696*00b67f09SDavid van Moolenbroekret=0
697*00b67f09SDavid van Moolenbroek$DIG $DIGOPTS +noauth a.private.secure.example. a @10.53.0.2 \
698*00b67f09SDavid van Moolenbroek	> dig.out.ns2.test$n || ret=1
699*00b67f09SDavid van Moolenbroek$DIG $DIGOPTS +noauth a.private.secure.example. a @10.53.0.4 \
700*00b67f09SDavid van Moolenbroek	> dig.out.ns4.test$n || ret=1
701*00b67f09SDavid van Moolenbroek$PERL ../digcomp.pl dig.out.ns2.test$n dig.out.ns4.test$n || ret=1
702*00b67f09SDavid van Moolenbroekgrep "NOERROR" dig.out.ns4.test$n > /dev/null || ret=1
703*00b67f09SDavid van Moolenbroek# Note - this is looking for failure, hence the &&
704*00b67f09SDavid van Moolenbroekgrep "flags:.*ad.*QUERY" dig.out.ns4.test$n > /dev/null && ret=1
705*00b67f09SDavid van Moolenbroekn=`expr $n + 1`
706*00b67f09SDavid van Moolenbroekif [ $ret != 0 ]; then echo "I:failed"; fi
707*00b67f09SDavid van Moolenbroekstatus=`expr $status + $ret`
708*00b67f09SDavid van Moolenbroek
709*00b67f09SDavid van Moolenbroekecho "I:checking that negative validation in a privately secure zone works ($n)"
710*00b67f09SDavid van Moolenbroekret=0
711*00b67f09SDavid van Moolenbroek$DIG $DIGOPTS +noauth q.private.secure.example. a @10.53.0.2 \
712*00b67f09SDavid van Moolenbroek	> dig.out.ns2.test$n || ret=1
713*00b67f09SDavid van Moolenbroek$DIG $DIGOPTS +noauth q.private.secure.example. a @10.53.0.4 \
714*00b67f09SDavid van Moolenbroek	> dig.out.ns4.test$n || ret=1
715*00b67f09SDavid van Moolenbroek$PERL ../digcomp.pl dig.out.ns2.test$n dig.out.ns4.test$n || ret=1
716*00b67f09SDavid van Moolenbroekgrep "NXDOMAIN" dig.out.ns4.test$n > /dev/null || ret=1
717*00b67f09SDavid van Moolenbroek# Note - this is looking for failure, hence the &&
718*00b67f09SDavid van Moolenbroekgrep "flags:.*ad.*QUERY" dig.out.ns4.test$n > /dev/null && ret=1
719*00b67f09SDavid van Moolenbroekn=`expr $n + 1`
720*00b67f09SDavid van Moolenbroekif [ $ret != 0 ]; then echo "I:failed"; fi
721*00b67f09SDavid van Moolenbroekstatus=`expr $status + $ret`
722*00b67f09SDavid van Moolenbroek
723*00b67f09SDavid van Moolenbroekecho "I:checking privately secure to nxdomain works ($n)"
724*00b67f09SDavid van Moolenbroekret=0
725*00b67f09SDavid van Moolenbroek$DIG $DIGOPTS +noauth private2secure-nxdomain.private.secure.example. SOA @10.53.0.2 \
726*00b67f09SDavid van Moolenbroek	> dig.out.ns2.test$n || ret=1
727*00b67f09SDavid van Moolenbroek$DIG $DIGOPTS +noauth private2secure-nxdomain.private.secure.example. SOA @10.53.0.4 \
728*00b67f09SDavid van Moolenbroek	> dig.out.ns4.test$n || ret=1
729*00b67f09SDavid van Moolenbroek$PERL ../digcomp.pl dig.out.ns2.test$n dig.out.ns4.test$n || ret=1
730*00b67f09SDavid van Moolenbroek# Note - this is looking for failure, hence the &&
731*00b67f09SDavid van Moolenbroekgrep "flags:.*ad.*QUERY" dig.out.ns4.test$n > /dev/null && ret=1
732*00b67f09SDavid van Moolenbroekn=`expr $n + 1`
733*00b67f09SDavid van Moolenbroekif [ $ret != 0 ]; then echo "I:failed"; fi
734*00b67f09SDavid van Moolenbroekstatus=`expr $status + $ret`
735*00b67f09SDavid van Moolenbroek
736*00b67f09SDavid van Moolenbroek# Try validating with a revoked trusted key.
737*00b67f09SDavid van Moolenbroek# This should fail.
738*00b67f09SDavid van Moolenbroek
739*00b67f09SDavid van Moolenbroekecho "I:checking that validation returns insecure due to revoked trusted key ($n)"
740*00b67f09SDavid van Moolenbroekret=0
741*00b67f09SDavid van Moolenbroek$DIG $DIGOPTS example. soa @10.53.0.5 > dig.out.ns5.test$n || ret=1
742*00b67f09SDavid van Moolenbroekgrep "flags:.*; QUERY" dig.out.ns5.test$n > /dev/null || ret=1
743*00b67f09SDavid van Moolenbroekgrep "flags:.* ad.*; QUERY" dig.out.ns5.test$n > /dev/null && ret=1
744*00b67f09SDavid van Moolenbroekn=`expr $n + 1`
745*00b67f09SDavid van Moolenbroekif [ $ret != 0 ]; then echo "I:failed"; fi
746*00b67f09SDavid van Moolenbroekstatus=`expr $status + $ret`
747*00b67f09SDavid van Moolenbroek
748*00b67f09SDavid van Moolenbroekecho "I:checking that revoked key is present ($n)"
749*00b67f09SDavid van Moolenbroekret=0
750*00b67f09SDavid van Moolenbroekid=`cat rev.key`
751*00b67f09SDavid van Moolenbroek$DIG $DIGOPTS +multi dnskey . @10.53.0.1 > dig.out.ns1.test$n || ret=1
752*00b67f09SDavid van Moolenbroekgrep '; key id = '"$id"'$' dig.out.ns1.test$n > /dev/null || ret=1
753*00b67f09SDavid van Moolenbroekn=`expr $n + 1`
754*00b67f09SDavid van Moolenbroekif [ $ret != 0 ]; then echo "I:failed"; fi
755*00b67f09SDavid van Moolenbroekstatus=`expr $status + $ret`
756*00b67f09SDavid van Moolenbroek
757*00b67f09SDavid van Moolenbroekecho "I:checking that revoked key self-signs ($n)"
758*00b67f09SDavid van Moolenbroekret=0
759*00b67f09SDavid van Moolenbroekid=`cat rev.key`
760*00b67f09SDavid van Moolenbroek$DIG $DIGOPTS dnskey . @10.53.0.1 > dig.out.ns1.test$n || ret=1
761*00b67f09SDavid van Moolenbroekgrep 'RRSIG.*'" $id "'\. ' dig.out.ns1.test$n > /dev/null || ret=1
762*00b67f09SDavid van Moolenbroekn=`expr $n + 1`
763*00b67f09SDavid van Moolenbroekif [ $ret != 0 ]; then echo "I:failed"; fi
764*00b67f09SDavid van Moolenbroekstatus=`expr $status + $ret`
765*00b67f09SDavid van Moolenbroek
766*00b67f09SDavid van Moolenbroekecho "I:checking for unpublished key ($n)"
767*00b67f09SDavid van Moolenbroekret=0
768*00b67f09SDavid van Moolenbroekid=`sed 's/^K.+007+0*\([0-9]\)/\1/' < unpub.key`
769*00b67f09SDavid van Moolenbroek$DIG $DIGOPTS +multi dnskey . @10.53.0.1 > dig.out.ns1.test$n || ret=1
770*00b67f09SDavid van Moolenbroekgrep '; key id = '"$id"'$' dig.out.ns1.test$n > /dev/null && ret=1
771*00b67f09SDavid van Moolenbroekn=`expr $n + 1`
772*00b67f09SDavid van Moolenbroekif [ $ret != 0 ]; then echo "I:failed"; fi
773*00b67f09SDavid van Moolenbroekstatus=`expr $status + $ret`
774*00b67f09SDavid van Moolenbroek
775*00b67f09SDavid van Moolenbroekecho "I:checking for activated but unpublished key ($n)"
776*00b67f09SDavid van Moolenbroekret=0
777*00b67f09SDavid van Moolenbroekid=`sed 's/^K.+007+0*\([0-9]\)/\1/' < activate-now-publish-1day.key`
778*00b67f09SDavid van Moolenbroek$DIG $DIGOPTS +multi dnskey . @10.53.0.1 > dig.out.ns1.test$n || ret=1
779*00b67f09SDavid van Moolenbroekgrep '; key id = '"$id"'$' dig.out.ns1.test$n > /dev/null && ret=1
780*00b67f09SDavid van Moolenbroekn=`expr $n + 1`
781*00b67f09SDavid van Moolenbroekif [ $ret != 0 ]; then echo "I:failed"; fi
782*00b67f09SDavid van Moolenbroekstatus=`expr $status + $ret`
783*00b67f09SDavid van Moolenbroek
784*00b67f09SDavid van Moolenbroekecho "I:checking that standby key does not sign records ($n)"
785*00b67f09SDavid van Moolenbroekret=0
786*00b67f09SDavid van Moolenbroekid=`sed 's/^K.+007+0*\([0-9]\)/\1/' < standby.key`
787*00b67f09SDavid van Moolenbroek$DIG $DIGOPTS dnskey . @10.53.0.1 > dig.out.ns1.test$n || ret=1
788*00b67f09SDavid van Moolenbroekgrep 'RRSIG.*'" $id "'\. ' dig.out.ns1.test$n > /dev/null && ret=1
789*00b67f09SDavid van Moolenbroekn=`expr $n + 1`
790*00b67f09SDavid van Moolenbroekif [ $ret != 0 ]; then echo "I:failed"; fi
791*00b67f09SDavid van Moolenbroekstatus=`expr $status + $ret`
792*00b67f09SDavid van Moolenbroek
793*00b67f09SDavid van Moolenbroekecho "I:checking that deactivated key does not sign records  ($n)"
794*00b67f09SDavid van Moolenbroekret=0
795*00b67f09SDavid van Moolenbroekid=`sed 's/^K.+007+0*\([0-9]\)/\1/' < inact.key`
796*00b67f09SDavid van Moolenbroek$DIG $DIGOPTS dnskey . @10.53.0.1 > dig.out.ns1.test$n || ret=1
797*00b67f09SDavid van Moolenbroekgrep 'RRSIG.*'" $id "'\. ' dig.out.ns1.test$n > /dev/null && ret=1
798*00b67f09SDavid van Moolenbroekn=`expr $n + 1`
799*00b67f09SDavid van Moolenbroekif [ $ret != 0 ]; then echo "I:failed"; fi
800*00b67f09SDavid van Moolenbroekstatus=`expr $status + $ret`
801*00b67f09SDavid van Moolenbroek
802*00b67f09SDavid van Moolenbroekecho "I:checking insertion of public-only key ($n)"
803*00b67f09SDavid van Moolenbroekret=0
804*00b67f09SDavid van Moolenbroekid=`sed 's/^K.+007+0*\([0-9]\)/\1/' < nopriv.key`
805*00b67f09SDavid van Moolenbroekfile="ns1/`cat nopriv.key`.key"
806*00b67f09SDavid van Moolenbroekkeydata=`grep DNSKEY $file`
807*00b67f09SDavid van Moolenbroek$NSUPDATE > /dev/null 2>&1 <<END	|| status=1
808*00b67f09SDavid van Moolenbroekserver 10.53.0.1 5300
809*00b67f09SDavid van Moolenbroekzone .
810*00b67f09SDavid van Moolenbroekttl 3600
811*00b67f09SDavid van Moolenbroekupdate add $keydata
812*00b67f09SDavid van Moolenbroeksend
813*00b67f09SDavid van MoolenbroekEND
814*00b67f09SDavid van Moolenbroeksleep 1
815*00b67f09SDavid van Moolenbroek$DIG $DIGOPTS dnskey . @10.53.0.1 > dig.out.ns1.test$n || ret=1
816*00b67f09SDavid van Moolenbroekgrep 'RRSIG.*'" $id "'\. ' dig.out.ns1.test$n > /dev/null && ret=1
817*00b67f09SDavid van Moolenbroekn=`expr $n + 1`
818*00b67f09SDavid van Moolenbroekif [ $ret != 0 ]; then echo "I:failed"; fi
819*00b67f09SDavid van Moolenbroekstatus=`expr $status + $ret`
820*00b67f09SDavid van Moolenbroek
821*00b67f09SDavid van Moolenbroekecho "I:checking key deletion ($n)"
822*00b67f09SDavid van Moolenbroekret=0
823*00b67f09SDavid van Moolenbroekid=`sed 's/^K.+007+0*\([0-9]\)/\1/' < del.key`
824*00b67f09SDavid van Moolenbroek$DIG $DIGOPTS +multi dnskey . @10.53.0.1 > dig.out.ns1.test$n || ret=1
825*00b67f09SDavid van Moolenbroekgrep '; key id = '"$id"'$' dig.out.ns1.test$n > /dev/null && ret=1
826*00b67f09SDavid van Moolenbroekn=`expr $n + 1`
827*00b67f09SDavid van Moolenbroekif [ $ret != 0 ]; then echo "I:failed"; fi
828*00b67f09SDavid van Moolenbroekstatus=`expr $status + $ret`
829*00b67f09SDavid van Moolenbroek
830*00b67f09SDavid van Moolenbroekecho "I:checking secure-to-insecure transition, nsupdate ($n)"
831*00b67f09SDavid van Moolenbroekret=0
832*00b67f09SDavid van Moolenbroek$NSUPDATE > /dev/null 2>&1 <<END	|| status=1
833*00b67f09SDavid van Moolenbroekserver 10.53.0.3 5300
834*00b67f09SDavid van Moolenbroekzone secure-to-insecure.example
835*00b67f09SDavid van Moolenbroekupdate delete secure-to-insecure.example dnskey
836*00b67f09SDavid van Moolenbroeksend
837*00b67f09SDavid van MoolenbroekEND
838*00b67f09SDavid van Moolenbroekfor i in 0 1 2 3 4 5 6 7 8 9; do
839*00b67f09SDavid van Moolenbroek	ret=0
840*00b67f09SDavid van Moolenbroek	$DIG $DIGOPTS axfr secure-to-insecure.example @10.53.0.3 > dig.out.ns3.test$n || ret=1
841*00b67f09SDavid van Moolenbroek	egrep '(RRSIG|DNSKEY|NSEC)' dig.out.ns3.test$n > /dev/null && ret=1
842*00b67f09SDavid van Moolenbroek	[ $ret -eq 0 ] && break
843*00b67f09SDavid van Moolenbroek	echo "I:waiting ... ($i)"
844*00b67f09SDavid van Moolenbroek	sleep 2
845*00b67f09SDavid van Moolenbroekdone
846*00b67f09SDavid van Moolenbroekn=`expr $n + 1`
847*00b67f09SDavid van Moolenbroekif [ $ret != 0 ]; then echo "I:failed"; fi
848*00b67f09SDavid van Moolenbroekstatus=`expr $status + $ret`
849*00b67f09SDavid van Moolenbroek
850*00b67f09SDavid van Moolenbroekecho "I:checking secure-to-insecure transition, scheduled ($n)"
851*00b67f09SDavid van Moolenbroekret=0
852*00b67f09SDavid van Moolenbroekfile="ns3/`cat del1.key`.key"
853*00b67f09SDavid van Moolenbroek$SETTIME -I now -D now $file > /dev/null
854*00b67f09SDavid van Moolenbroekfile="ns3/`cat del2.key`.key"
855*00b67f09SDavid van Moolenbroek$SETTIME -I now -D now $file > /dev/null
856*00b67f09SDavid van Moolenbroek$RNDC -c ../common/rndc.conf -s 10.53.0.3 -p 9953 sign secure-to-insecure2.example. 2>&1 | sed 's/^/I:ns3 /'
857*00b67f09SDavid van Moolenbroekfor i in 0 1 2 3 4 5 6 7 8 9; do
858*00b67f09SDavid van Moolenbroek	ret=0
859*00b67f09SDavid van Moolenbroek	$DIG $DIGOPTS axfr secure-to-insecure2.example @10.53.0.3 > dig.out.ns3.test$n || ret=1
860*00b67f09SDavid van Moolenbroek	egrep '(RRSIG|DNSKEY|NSEC3)' dig.out.ns3.test$n > /dev/null && ret=1
861*00b67f09SDavid van Moolenbroek	[ $ret -eq 0 ] && break
862*00b67f09SDavid van Moolenbroek	echo "I:waiting ... ($i)"
863*00b67f09SDavid van Moolenbroek	sleep 2
864*00b67f09SDavid van Moolenbroekdone
865*00b67f09SDavid van Moolenbroekn=`expr $n + 1`
866*00b67f09SDavid van Moolenbroekif [ $ret != 0 ]; then echo "I:failed"; fi
867*00b67f09SDavid van Moolenbroekstatus=`expr $status + $ret`
868*00b67f09SDavid van Moolenbroek
869*00b67f09SDavid van Moolenbroekecho "I:checking that serial number and RRSIGs are both updated (rt21045) ($n)"
870*00b67f09SDavid van Moolenbroekret=0
871*00b67f09SDavid van Moolenbroekoldserial=`$DIG $DIGOPTS +short soa prepub.example @10.53.0.3 | awk '$0 !~ /SOA/ {print $3}'`
872*00b67f09SDavid van Moolenbroekoldinception=`$DIG $DIGOPTS +short soa prepub.example @10.53.0.3 | awk '/SOA/ {print $6}' | sort -u`
873*00b67f09SDavid van Moolenbroek
874*00b67f09SDavid van Moolenbroek$KEYGEN -3 -q -r $RANDFILE -K ns3 -P 0 -A +6d -I +38d -D +45d prepub.example > /dev/null
875*00b67f09SDavid van Moolenbroek
876*00b67f09SDavid van Moolenbroek$RNDC -c ../common/rndc.conf -s 10.53.0.3 -p 9953 sign prepub.example 2>&1 | sed 's/^/I:ns1 /'
877*00b67f09SDavid van Moolenbroeknewserial=$oldserial
878*00b67f09SDavid van Moolenbroektry=0
879*00b67f09SDavid van Moolenbroekwhile [ $oldserial -eq $newserial -a $try -lt 42 ]
880*00b67f09SDavid van Moolenbroekdo
881*00b67f09SDavid van Moolenbroek	newserial=`$DIG $DIGOPTS +short soa prepub.example @10.53.0.3 |
882*00b67f09SDavid van Moolenbroek		 awk '$0 !~ /SOA/ {print $3}'`
883*00b67f09SDavid van Moolenbroek	sleep 1
884*00b67f09SDavid van Moolenbroek	try=`expr $try + 1`
885*00b67f09SDavid van Moolenbroekdone
886*00b67f09SDavid van Moolenbroeknewinception=`$DIG $DIGOPTS +short soa prepub.example @10.53.0.3 | awk '/SOA/ {print $6}' | sort -u`
887*00b67f09SDavid van Moolenbroek#echo "$oldserial : $newserial"
888*00b67f09SDavid van Moolenbroek#echo "$oldinception : $newinception"
889*00b67f09SDavid van Moolenbroek
890*00b67f09SDavid van Moolenbroek[ "$oldserial" = "$newserial" ] && ret=1
891*00b67f09SDavid van Moolenbroek[ "$oldinception" = "$newinception" ] && ret=1
892*00b67f09SDavid van Moolenbroekif [ $ret != 0 ]; then echo "I:failed"; fi
893*00b67f09SDavid van Moolenbroekstatus=`expr $status + $ret`
894*00b67f09SDavid van Moolenbroek
895*00b67f09SDavid van Moolenbroekecho "I:preparing to test key change corner cases"
896*00b67f09SDavid van Moolenbroekecho "I:removing a private key file"
897*00b67f09SDavid van Moolenbroekfile="ns1/`cat vanishing.key`.private"
898*00b67f09SDavid van Moolenbroekrm -f $file
899*00b67f09SDavid van Moolenbroek
900*00b67f09SDavid van Moolenbroekecho "I:preparing ZSK roll"
901*00b67f09SDavid van Moolenbroekstarttime=`$PERL -e 'print time(), "\n";'`
902*00b67f09SDavid van Moolenbroekoldfile=`cat active.key`
903*00b67f09SDavid van Moolenbroekoldid=`sed 's/^K.+007+0*\([0-9]\)/\1/' < active.key`
904*00b67f09SDavid van Moolenbroeknewfile=`cat standby.key`
905*00b67f09SDavid van Moolenbroeknewid=`sed 's/^K.+007+0*\([0-9]\)/\1/' < standby.key`
906*00b67f09SDavid van Moolenbroek$SETTIME -K ns1 -I now+2s -D now+25 $oldfile > /dev/null
907*00b67f09SDavid van Moolenbroek$SETTIME -K ns1 -i 0 -S $oldfile $newfile > /dev/null
908*00b67f09SDavid van Moolenbroek
909*00b67f09SDavid van Moolenbroek# note previous zone serial number
910*00b67f09SDavid van Moolenbroekoldserial=`$DIG $DIGOPTS +short soa . @10.53.0.1 | awk '{print $3}'`
911*00b67f09SDavid van Moolenbroek
912*00b67f09SDavid van Moolenbroek$RNDC -c ../common/rndc.conf -s 10.53.0.1 -p 9953 loadkeys . 2>&1 | sed 's/^/I:ns1 /'
913*00b67f09SDavid van Moolenbroeksleep 4
914*00b67f09SDavid van Moolenbroek
915*00b67f09SDavid van Moolenbroekecho "I:revoking key to duplicated key ID"
916*00b67f09SDavid van Moolenbroek$SETTIME -R now -K ns2 Kbar.+005+30676.key > /dev/null
917*00b67f09SDavid van Moolenbroek
918*00b67f09SDavid van Moolenbroek$RNDC -c ../common/rndc.conf -s 10.53.0.2 -p 9953 loadkeys bar. 2>&1 | sed 's/^/I:ns2 /'
919*00b67f09SDavid van Moolenbroek
920*00b67f09SDavid van Moolenbroekecho "I:waiting for changes to take effect"
921*00b67f09SDavid van Moolenbroeksleep 5
922*00b67f09SDavid van Moolenbroek
923*00b67f09SDavid van Moolenbroekecho "I:checking former standby key is now active ($n)"
924*00b67f09SDavid van Moolenbroekret=0
925*00b67f09SDavid van Moolenbroek$DIG $DIGOPTS dnskey . @10.53.0.1 > dig.out.ns1.test$n || ret=1
926*00b67f09SDavid van Moolenbroekgrep 'RRSIG.*'" $newid "'\. ' dig.out.ns1.test$n > /dev/null || ret=1
927*00b67f09SDavid van Moolenbroekn=`expr $n + 1`
928*00b67f09SDavid van Moolenbroekif [ $ret != 0 ]; then echo "I:failed"; fi
929*00b67f09SDavid van Moolenbroekstatus=`expr $status + $ret`
930*00b67f09SDavid van Moolenbroek
931*00b67f09SDavid van Moolenbroekecho "I:checking former standby key has only signed incrementally ($n)"
932*00b67f09SDavid van Moolenbroekret=0
933*00b67f09SDavid van Moolenbroek$DIG $DIGOPTS txt . @10.53.0.1 > dig.out.ns1.test$n || ret=1
934*00b67f09SDavid van Moolenbroekgrep 'RRSIG.*'" $newid "'\. ' dig.out.ns1.test$n > /dev/null && ret=1
935*00b67f09SDavid van Moolenbroekgrep 'RRSIG.*'" $oldid "'\. ' dig.out.ns1.test$n > /dev/null || ret=1
936*00b67f09SDavid van Moolenbroekn=`expr $n + 1`
937*00b67f09SDavid van Moolenbroekif [ $ret != 0 ]; then echo "I:failed"; fi
938*00b67f09SDavid van Moolenbroekstatus=`expr $status + $ret`
939*00b67f09SDavid van Moolenbroek
940*00b67f09SDavid van Moolenbroekecho "I:checking that signing records have been marked as complete ($n)"
941*00b67f09SDavid van Moolenbroekret=0
942*00b67f09SDavid van Moolenbroekcheckprivate . 10.53.0.1 || ret=1
943*00b67f09SDavid van Moolenbroekcheckprivate bar 10.53.0.2 || ret=1
944*00b67f09SDavid van Moolenbroekcheckprivate example 10.53.0.2 || ret=1
945*00b67f09SDavid van Moolenbroekcheckprivate private.secure.example 10.53.0.3 || ret=1
946*00b67f09SDavid van Moolenbroekcheckprivate nsec3.example 10.53.0.3 || ret=1
947*00b67f09SDavid van Moolenbroekcheckprivate nsec3.nsec3.example 10.53.0.3 || ret=1
948*00b67f09SDavid van Moolenbroekcheckprivate nsec3.optout.example 10.53.0.3 || ret=1
949*00b67f09SDavid van Moolenbroekcheckprivate nsec3-to-nsec.example 10.53.0.3 || ret=1
950*00b67f09SDavid van Moolenbroekcheckprivate nsec.example 10.53.0.3 || ret=1
951*00b67f09SDavid van Moolenbroekcheckprivate oldsigs.example 10.53.0.3 || ret=1
952*00b67f09SDavid van Moolenbroekcheckprivate optout.example 10.53.0.3 || ret=1
953*00b67f09SDavid van Moolenbroekcheckprivate optout.nsec3.example 10.53.0.3 || ret=1
954*00b67f09SDavid van Moolenbroekcheckprivate optout.optout.example 10.53.0.3 || ret=1
955*00b67f09SDavid van Moolenbroekcheckprivate prepub.example 10.53.0.3 1 || ret=1
956*00b67f09SDavid van Moolenbroekcheckprivate rsasha256.example 10.53.0.3 || ret=1
957*00b67f09SDavid van Moolenbroekcheckprivate rsasha512.example 10.53.0.3 || ret=1
958*00b67f09SDavid van Moolenbroekcheckprivate secure.example 10.53.0.3 || ret=1
959*00b67f09SDavid van Moolenbroekcheckprivate secure.nsec3.example 10.53.0.3 || ret=1
960*00b67f09SDavid van Moolenbroekcheckprivate secure.optout.example 10.53.0.3 || ret=1
961*00b67f09SDavid van Moolenbroekcheckprivate secure-to-insecure2.example 10.53.0.3 || ret=1
962*00b67f09SDavid van Moolenbroekcheckprivate secure-to-insecure.example 10.53.0.3 || ret=1
963*00b67f09SDavid van Moolenbroekcheckprivate ttl1.example 10.53.0.3 || ret=1
964*00b67f09SDavid van Moolenbroekcheckprivate ttl2.example 10.53.0.3 || ret=1
965*00b67f09SDavid van Moolenbroekcheckprivate ttl3.example 10.53.0.3 || ret=1
966*00b67f09SDavid van Moolenbroekcheckprivate ttl4.example 10.53.0.3 || ret=1
967*00b67f09SDavid van Moolenbroekn=`expr $n + 1`
968*00b67f09SDavid van Moolenbroekstatus=`expr $status + $ret`
969*00b67f09SDavid van Moolenbroek
970*00b67f09SDavid van Moolenbroekecho "I:forcing full sign"
971*00b67f09SDavid van Moolenbroek$RNDC -c ../common/rndc.conf -s 10.53.0.1 -p 9953 sign . 2>&1 | sed 's/^/I:ns1 /'
972*00b67f09SDavid van Moolenbroek
973*00b67f09SDavid van Moolenbroekecho "I:waiting for change to take effect"
974*00b67f09SDavid van Moolenbroeksleep 5
975*00b67f09SDavid van Moolenbroek
976*00b67f09SDavid van Moolenbroekecho "I:checking former standby key has now signed fully ($n)"
977*00b67f09SDavid van Moolenbroekret=0
978*00b67f09SDavid van Moolenbroek$DIG $DIGOPTS txt . @10.53.0.1 > dig.out.ns1.test$n || ret=1
979*00b67f09SDavid van Moolenbroekgrep 'RRSIG.*'" $newid "'\. ' dig.out.ns1.test$n > /dev/null || ret=1
980*00b67f09SDavid van Moolenbroekn=`expr $n + 1`
981*00b67f09SDavid van Moolenbroekif [ $ret != 0 ]; then echo "I:failed"; fi
982*00b67f09SDavid van Moolenbroekstatus=`expr $status + $ret`
983*00b67f09SDavid van Moolenbroek
984*00b67f09SDavid van Moolenbroekecho "I:checking SOA serial number has been incremented ($n)"
985*00b67f09SDavid van Moolenbroekret=0
986*00b67f09SDavid van Moolenbroeknewserial=`$DIG $DIGOPTS +short soa . @10.53.0.1 | awk '{print $3}'`
987*00b67f09SDavid van Moolenbroek[ "$newserial" != "$oldserial" ] || ret=1
988*00b67f09SDavid van Moolenbroekn=`expr $n + 1`
989*00b67f09SDavid van Moolenbroekif [ $ret != 0 ]; then echo "I:failed"; fi
990*00b67f09SDavid van Moolenbroekstatus=`expr $status + $ret`
991*00b67f09SDavid van Moolenbroek
992*00b67f09SDavid van Moolenbroekecho "I:checking delayed key publication/activation ($n)"
993*00b67f09SDavid van Moolenbroekret=0
994*00b67f09SDavid van Moolenbroekzsk=`cat delayzsk.key`
995*00b67f09SDavid van Moolenbroekksk=`cat delayksk.key`
996*00b67f09SDavid van Moolenbroek# publication and activation times should be unset
997*00b67f09SDavid van Moolenbroek$SETTIME -K ns3 -pA -pP $zsk | grep -v UNSET > /dev/null 2>&1 && ret=1
998*00b67f09SDavid van Moolenbroek$SETTIME -K ns3 -pA -pP $ksk | grep -v UNSET > /dev/null 2>&1 && ret=1
999*00b67f09SDavid van Moolenbroek$DIG $DIGOPTS +noall +answer dnskey delay.example. @10.53.0.3 > dig.out.ns3.test$n || ret=1
1000*00b67f09SDavid van Moolenbroek# DNSKEY not expected:
1001*00b67f09SDavid van Moolenbroekawk 'BEGIN {r=1} $4=="DNSKEY" {r=0} END {exit r}' dig.out.ns3.test$n && ret=1
1002*00b67f09SDavid van Moolenbroekn=`expr $n + 1`
1003*00b67f09SDavid van Moolenbroekif [ $ret != 0 ]; then echo "I:failed"; fi
1004*00b67f09SDavid van Moolenbroekstatus=`expr $status + $ret`
1005*00b67f09SDavid van Moolenbroek
1006*00b67f09SDavid van Moolenbroekecho "I:checking scheduled key publication, not activation ($n)"
1007*00b67f09SDavid van Moolenbroekret=0
1008*00b67f09SDavid van Moolenbroek$SETTIME -K ns3 -P now+3s -A none $zsk > /dev/null 2>&1
1009*00b67f09SDavid van Moolenbroek$SETTIME -K ns3 -P now+3s -A none $ksk > /dev/null 2>&1
1010*00b67f09SDavid van Moolenbroek$RNDC -c ../common/rndc.conf -s 10.53.0.3 -p 9953 loadkeys delay.example. 2>&1 | sed 's/^/I:ns2 /'
1011*00b67f09SDavid van Moolenbroek
1012*00b67f09SDavid van Moolenbroekecho "I:waiting for changes to take effect"
1013*00b67f09SDavid van Moolenbroeksleep 5
1014*00b67f09SDavid van Moolenbroek
1015*00b67f09SDavid van Moolenbroek$DIG $DIGOPTS +noall +answer dnskey delay.example. @10.53.0.3 > dig.out.ns3.test$n || ret=1
1016*00b67f09SDavid van Moolenbroek# DNSKEY expected:
1017*00b67f09SDavid van Moolenbroekawk 'BEGIN {r=1} $4=="DNSKEY" {r=0} END {exit r}' dig.out.ns3.test$n || ret=1
1018*00b67f09SDavid van Moolenbroek# RRSIG not expected:
1019*00b67f09SDavid van Moolenbroekawk 'BEGIN {r=1} $4=="RRSIG" {r=0} END {exit r}' dig.out.ns3.test$n && ret=1
1020*00b67f09SDavid van Moolenbroekn=`expr $n + 1`
1021*00b67f09SDavid van Moolenbroekif [ $ret != 0 ]; then echo "I:failed"; fi
1022*00b67f09SDavid van Moolenbroekstatus=`expr $status + $ret`
1023*00b67f09SDavid van Moolenbroek
1024*00b67f09SDavid van Moolenbroekecho "I:checking scheduled key activation ($n)"
1025*00b67f09SDavid van Moolenbroekret=0
1026*00b67f09SDavid van Moolenbroek$SETTIME -K ns3 -A now+3s $zsk > /dev/null 2>&1
1027*00b67f09SDavid van Moolenbroek$SETTIME -K ns3 -A now+3s $ksk > /dev/null 2>&1
1028*00b67f09SDavid van Moolenbroek$RNDC -c ../common/rndc.conf -s 10.53.0.3 -p 9953 loadkeys delay.example. 2>&1 | sed 's/^/I:ns2 /'
1029*00b67f09SDavid van Moolenbroek
1030*00b67f09SDavid van Moolenbroekecho "I:waiting for changes to take effect"
1031*00b67f09SDavid van Moolenbroeksleep 5
1032*00b67f09SDavid van Moolenbroek
1033*00b67f09SDavid van Moolenbroek$DIG $DIGOPTS +noall +answer dnskey delay.example. @10.53.0.3 > dig.out.ns3.1.test$n || ret=1
1034*00b67f09SDavid van Moolenbroek# DNSKEY expected:
1035*00b67f09SDavid van Moolenbroekawk 'BEGIN {r=1} $4=="DNSKEY" {r=0} END {exit r}' dig.out.ns3.1.test$n || ret=1
1036*00b67f09SDavid van Moolenbroek# RRSIG expected:
1037*00b67f09SDavid van Moolenbroekawk 'BEGIN {r=1} $4=="RRSIG" {r=0} END {exit r}' dig.out.ns3.1.test$n || ret=1
1038*00b67f09SDavid van Moolenbroek$DIG $DIGOPTS +noall +answer a a.delay.example. @10.53.0.3 > dig.out.ns3.2.test$n || ret=1
1039*00b67f09SDavid van Moolenbroek# A expected:
1040*00b67f09SDavid van Moolenbroekawk 'BEGIN {r=1} $4=="A" {r=0} END {exit r}' dig.out.ns3.2.test$n || ret=1
1041*00b67f09SDavid van Moolenbroek# RRSIG expected:
1042*00b67f09SDavid van Moolenbroekawk 'BEGIN {r=1} $4=="RRSIG" {r=0} END {exit r}' dig.out.ns3.2.test$n || ret=1
1043*00b67f09SDavid van Moolenbroekn=`expr $n + 1`
1044*00b67f09SDavid van Moolenbroekif [ $ret != 0 ]; then echo "I:failed"; fi
1045*00b67f09SDavid van Moolenbroekstatus=`expr $status + $ret`
1046*00b67f09SDavid van Moolenbroek
1047*00b67f09SDavid van Moolenbroekecho "I:checking former active key was removed ($n)"
1048*00b67f09SDavid van Moolenbroek#
1049*00b67f09SDavid van Moolenbroek# Work out how long we need to sleep. Allow 4 seconds for the records
1050*00b67f09SDavid van Moolenbroek# to be removed.
1051*00b67f09SDavid van Moolenbroek#
1052*00b67f09SDavid van Moolenbroeknow=`$PERL -e 'print time(), "\n";'`
1053*00b67f09SDavid van Moolenbroeksleep=`expr $starttime + 29 - $now`
1054*00b67f09SDavid van Moolenbroekcase $sleep in
1055*00b67f09SDavid van Moolenbroek-*|0);;
1056*00b67f09SDavid van Moolenbroek*) echo "I:waiting for timer to have activated"; sleep $sleep;;
1057*00b67f09SDavid van Moolenbroekesac
1058*00b67f09SDavid van Moolenbroekret=0
1059*00b67f09SDavid van Moolenbroek$DIG $DIGOPTS +multi dnskey . @10.53.0.1 > dig.out.ns1.test$n || ret=1
1060*00b67f09SDavid van Moolenbroekgrep '; key id = '"$oldid"'$' dig.out.ns1.test$n > /dev/null && ret=1
1061*00b67f09SDavid van Moolenbroekn=`expr $n + 1`
1062*00b67f09SDavid van Moolenbroekif [ $ret != 0 ]; then echo "I:failed"; fi
1063*00b67f09SDavid van Moolenbroekstatus=`expr $status + $ret`
1064*00b67f09SDavid van Moolenbroek
1065*00b67f09SDavid van Moolenbroekecho "I:checking private key file removal caused no immediate harm ($n)"
1066*00b67f09SDavid van Moolenbroekret=0
1067*00b67f09SDavid van Moolenbroekid=`sed 's/^K.+007+0*\([0-9]\)/\1/' < vanishing.key`
1068*00b67f09SDavid van Moolenbroek$DIG $DIGOPTS dnskey . @10.53.0.1 > dig.out.ns1.test$n || ret=1
1069*00b67f09SDavid van Moolenbroekgrep 'RRSIG.*'" $id "'\. ' dig.out.ns1.test$n > /dev/null || ret=1
1070*00b67f09SDavid van Moolenbroekn=`expr $n + 1`
1071*00b67f09SDavid van Moolenbroekif [ $ret != 0 ]; then echo "I:failed"; fi
1072*00b67f09SDavid van Moolenbroekstatus=`expr $status + $ret`
1073*00b67f09SDavid van Moolenbroek
1074*00b67f09SDavid van Moolenbroekecho "I:checking revoked key with duplicate key ID (failure expected) ($n)"
1075*00b67f09SDavid van Moolenbroeklret=0
1076*00b67f09SDavid van Moolenbroekid=30676
1077*00b67f09SDavid van Moolenbroek$DIG $DIGOPTS +multi dnskey bar @10.53.0.2 > dig.out.ns2.test$n || lret=1
1078*00b67f09SDavid van Moolenbroekgrep '; key id = '"$id"'$' dig.out.ns2.test$n > /dev/null || lret=1
1079*00b67f09SDavid van Moolenbroek$DIG $DIGOPTS dnskey bar @10.53.0.4 > dig.out.ns4.test$n || lret=1
1080*00b67f09SDavid van Moolenbroekgrep "flags:.*ad.*QUERY" dig.out.ns4.test$n > /dev/null || lret=1
1081*00b67f09SDavid van Moolenbroekn=`expr $n + 1`
1082*00b67f09SDavid van Moolenbroekif [ $lret != 0 ]; then echo "I:not yet implemented"; fi
1083*00b67f09SDavid van Moolenbroek
1084*00b67f09SDavid van Moolenbroekecho "I:checking key event timers are always set ($n)"
1085*00b67f09SDavid van Moolenbroek# this is a regression test for a bug in which the next key event could
1086*00b67f09SDavid van Moolenbroek# be scheduled for the present moment, and then never fire.  check for
1087*00b67f09SDavid van Moolenbroek# visible evidence of this error in the logs:
1088*00b67f09SDavid van Moolenbroekawk '/next key event/ {if ($1 == $8 && $2 == $9) exit 1}' */named.run || ret=1
1089*00b67f09SDavid van Moolenbroekn=`expr $n + 1`
1090*00b67f09SDavid van Moolenbroekif [ $ret != 0 ]; then echo "I:failed"; fi
1091*00b67f09SDavid van Moolenbroekstatus=`expr $status + $ret`
1092*00b67f09SDavid van Moolenbroek
1093*00b67f09SDavid van Moolenbroek# this confirms that key events are never scheduled more than
1094*00b67f09SDavid van Moolenbroek# 'dnssec-loadkeys-interval' minutes in the future, and that the
1095*00b67f09SDavid van Moolenbroek# event scheduled is within 10 seconds of expected interval.
1096*00b67f09SDavid van Moolenbroekcheck_interval () {
1097*00b67f09SDavid van Moolenbroek        awk '/next key event/ {print $2 ":" $9}' $1/named.run |
1098*00b67f09SDavid van Moolenbroek	sed 's/\.//g' |
1099*00b67f09SDavid van Moolenbroek            awk -F: '
1100*00b67f09SDavid van Moolenbroek                     {
1101*00b67f09SDavid van Moolenbroek                       x = ($6+ $5*60000 + $4*3600000) - ($3+ $2*60000 + $1*3600000);
1102*00b67f09SDavid van Moolenbroek		       # abs(x) < 1000 ms treat as 'now'
1103*00b67f09SDavid van Moolenbroek		       if (x < 1000 && x > -1000)
1104*00b67f09SDavid van Moolenbroek                         x = 0;
1105*00b67f09SDavid van Moolenbroek		       # convert to seconds
1106*00b67f09SDavid van Moolenbroek		       x = x/1000;
1107*00b67f09SDavid van Moolenbroek		       # handle end of day roll over
1108*00b67f09SDavid van Moolenbroek		       if (x < 0)
1109*00b67f09SDavid van Moolenbroek			 x = x + 24*3600;
1110*00b67f09SDavid van Moolenbroek		       # handle log timestamp being a few milliseconds later
1111*00b67f09SDavid van Moolenbroek                       if (x != int(x))
1112*00b67f09SDavid van Moolenbroek                         x = int(x + 1);
1113*00b67f09SDavid van Moolenbroek                       if (int(x) > int(interval))
1114*00b67f09SDavid van Moolenbroek                         exit (1);
1115*00b67f09SDavid van Moolenbroek                     }
1116*00b67f09SDavid van Moolenbroek                     END { if (int(x) > int(interval) || int(x) < int(interval-10)) exit(1) }' interval=$2
1117*00b67f09SDavid van Moolenbroek        return $?
1118*00b67f09SDavid van Moolenbroek}
1119*00b67f09SDavid van Moolenbroek
1120*00b67f09SDavid van Moolenbroekecho "I:checking automatic key reloading interval ($n)"
1121*00b67f09SDavid van Moolenbroekret=0
1122*00b67f09SDavid van Moolenbroekcheck_interval ns1 3600 || ret=1
1123*00b67f09SDavid van Moolenbroekcheck_interval ns2 1800 || ret=1
1124*00b67f09SDavid van Moolenbroekcheck_interval ns3 600 || ret=1
1125*00b67f09SDavid van Moolenbroekn=`expr $n + 1`
1126*00b67f09SDavid van Moolenbroekif [ $ret != 0 ]; then echo "I:failed"; fi
1127*00b67f09SDavid van Moolenbroekstatus=`expr $status + $ret`
1128*00b67f09SDavid van Moolenbroek
1129*00b67f09SDavid van Moolenbroekecho "I:checking for key reloading loops ($n)"
1130*00b67f09SDavid van Moolenbroekret=0
1131*00b67f09SDavid van Moolenbroek# every key event should schedule a successor, so these should be equal
1132*00b67f09SDavid van Moolenbroekrekey_calls=`grep "reconfiguring zone keys" ns*/named.run | wc -l`
1133*00b67f09SDavid van Moolenbroekrekey_events=`grep "next key event" ns*/named.run | wc -l`
1134*00b67f09SDavid van Moolenbroek[ "$rekey_calls" = "$rekey_events" ] || ret=1
1135*00b67f09SDavid van Moolenbroekn=`expr $n + 1`
1136*00b67f09SDavid van Moolenbroekif [ $ret != 0 ]; then echo "I:failed"; fi
1137*00b67f09SDavid van Moolenbroekstatus=`expr $status + $ret`
1138*00b67f09SDavid van Moolenbroek
1139*00b67f09SDavid van Moolenbroekecho "I:forcing full sign with unreadable keys ($n)"
1140*00b67f09SDavid van Moolenbroekret=0
1141*00b67f09SDavid van Moolenbroekchmod 0 ns1/K.+*+*.key ns1/K.+*+*.private || ret=1
1142*00b67f09SDavid van Moolenbroek$RNDC -c ../common/rndc.conf -s 10.53.0.1 -p 9953 sign . 2>&1 | sed 's/^/I:ns1 /'
1143*00b67f09SDavid van Moolenbroek$DIG $DIGOPTS . @10.53.0.1 dnskey > dig.out.ns1.test$n || ret=1
1144*00b67f09SDavid van Moolenbroekgrep "status: NOERROR" dig.out.ns1.test$n > /dev/null || ret=1
1145*00b67f09SDavid van Moolenbroekn=`expr $n + 1`
1146*00b67f09SDavid van Moolenbroekif [ $ret != 0 ]; then echo "I:failed"; fi
1147*00b67f09SDavid van Moolenbroekstatus=`expr $status + $ret`
1148*00b67f09SDavid van Moolenbroek
1149*00b67f09SDavid van Moolenbroekecho "I:test turning on auto-dnssec during reconfig ($n)"
1150*00b67f09SDavid van Moolenbroekret=0
1151*00b67f09SDavid van Moolenbroek# first create a zone that doesn't have auto-dnssec
1152*00b67f09SDavid van Moolenbroekrm -f ns3/*.nzf
1153*00b67f09SDavid van Moolenbroek$RNDC -c ../common/rndc.conf -s 10.53.0.3 -p 9953 addzone reconf.example '{ type master; file "reconf.example.db"; };' 2>&1 | sed 's/^/I:ns3 /'
1154*00b67f09SDavid van Moolenbroekrekey_calls=`grep "zone reconf.example.*next key event" ns3/named.run | wc -l`
1155*00b67f09SDavid van Moolenbroek[ "$rekey_calls" -eq 0 ] || ret=1
1156*00b67f09SDavid van Moolenbroek# ...then we add auto-dnssec and reconfigure
1157*00b67f09SDavid van Moolenbroeknzf=`ls ns3/*.nzf`
1158*00b67f09SDavid van Moolenbroekecho 'zone reconf.example { type master; file "reconf.example.db"; allow-update { any; }; auto-dnssec maintain; };' > $nzf
1159*00b67f09SDavid van Moolenbroek$RNDC -c ../common/rndc.conf -s 10.53.0.3 -p 9953 reconfig 2>&1 | sed 's/^/I:ns3 /'
1160*00b67f09SDavid van Moolenbroekfor i in 0 1 2 3 4 5 6 7 8 9; do
1161*00b67f09SDavid van Moolenbroek    lret=0
1162*00b67f09SDavid van Moolenbroek    rekey_calls=`grep "zone reconf.example.*next key event" ns3/named.run | wc -l`
1163*00b67f09SDavid van Moolenbroek    [ "$rekey_calls" -gt 0 ] || lret=1
1164*00b67f09SDavid van Moolenbroek    if [ "$lret" -eq 0 ]; then break; fi
1165*00b67f09SDavid van Moolenbroek    echo "I:waiting ... ($i)"
1166*00b67f09SDavid van Moolenbroek    sleep 1
1167*00b67f09SDavid van Moolenbroekdone
1168*00b67f09SDavid van Moolenbroekn=`expr $n + 1`
1169*00b67f09SDavid van Moolenbroekif [ "$lret" != 0 ]; then ret=$lret; fi
1170*00b67f09SDavid van Moolenbroekif [ $ret != 0 ]; then echo "I:failed"; fi
1171*00b67f09SDavid van Moolenbroekstatus=`expr $status + $ret`
1172*00b67f09SDavid van Moolenbroek
1173*00b67f09SDavid van Moolenbroekecho "I:exit status: $status"
1174*00b67f09SDavid van Moolenbroekexit $status
1175