tests.sh revision 1.1.1.1.2.2 1 #!/bin/sh
2 #
3 # Copyright (C) Internet Systems Consortium, Inc. ("ISC")
4 #
5 # This Source Code Form is subject to the terms of the Mozilla Public
6 # License, v. 2.0. If a copy of the MPL was not distributed with this
7 # file, You can obtain one at http://mozilla.org/MPL/2.0/.
8 #
9 # See the COPYRIGHT file distributed with this work for additional
10 # information regarding copyright ownership.
11
12 SYSTEMTESTTOP=..
13 . $SYSTEMTESTTOP/conf.sh
14
15 status=0
16 n=0
17
18 DIGOPTS="+tcp +noadd +nosea +nostat +nocmd +dnssec -p ${PORT}"
19 RNDCCMD="$RNDC -c $SYSTEMTESTTOP/common/rndc.conf -p ${CONTROLPORT} -s"
20
21 # convert private-type records to readable form
22 showprivate () {
23 echo "-- $@ --"
24 $DIG $DIGOPTS +nodnssec +short @$2 -t type65534 $1 | cut -f3 -d' ' |
25 while read record; do
26 $PERL -e 'my $rdata = pack("H*", @ARGV[0]);
27 die "invalid record" unless length($rdata) == 5;
28 my ($alg, $key, $remove, $complete) = unpack("CnCC", $rdata);
29 my $action = "signing";
30 $action = "removing" if $remove;
31 my $state = " (incomplete)";
32 $state = " (complete)" if $complete;
33 print ("$action: alg: $alg, key: $key$state\n");' $record
34 done
35 }
36
37 # check that signing records are marked as complete
38 checkprivate () {
39 _ret=0
40 expected="${3:-0}"
41 x=`showprivate "$@"`
42 echo $x | grep incomplete > /dev/null && _ret=1
43
44 if [ $_ret = $expected ]; then
45 return 0
46 fi
47
48 echo "$x"
49 echo_i "failed"
50 return 1
51 }
52
53 #
54 # The NSEC record at the apex of the zone and its RRSIG records are
55 # added as part of the last step in signing a zone. We wait for the
56 # NSEC records to appear before proceeding with a counter to prevent
57 # infinite loops if there is a error.
58 #
59 echo_i "waiting for autosign changes to take effect"
60 i=0
61 while [ $i -lt 30 ]
62 do
63 ret=0
64 #
65 # Wait for the root DNSKEY RRset to be fully signed.
66 #
67 $DIG $DIGOPTS . @10.53.0.1 dnskey > dig.out.ns1.test$n || ret=1
68 grep "ANSWER: 10," dig.out.ns1.test$n > /dev/null || ret=1
69 for z in .
70 do
71 $DIG $DIGOPTS $z @10.53.0.1 nsec > dig.out.ns1.test$n || ret=1
72 grep "NS SOA" dig.out.ns1.test$n > /dev/null || ret=1
73 done
74 for z in bar. example. private.secure.example.
75 do
76 $DIG $DIGOPTS $z @10.53.0.2 nsec > dig.out.ns2.test$n || ret=1
77 grep "NS SOA" dig.out.ns2.test$n > /dev/null || ret=1
78 done
79 for z in bar. example. inacksk2.example. inacksk3.example \
80 inaczsk2.example. inaczsk3.example
81 do
82 $DIG $DIGOPTS $z @10.53.0.3 nsec > dig.out.ns3.test$n || ret=1
83 grep "NS SOA" dig.out.ns3.test$n > /dev/null || ret=1
84 done
85 i=`expr $i + 1`
86 if [ $ret = 0 ]; then break; fi
87 echo_i "waiting ... ($i)"
88 sleep 2
89 done
90 n=`expr $n + 1`
91 if [ $ret != 0 ]; then echo_i "done"; fi
92 status=`expr $status + $ret`
93
94 #
95 # Check that DNSKEY is initially signed with a KSK and not a ZSK.
96 #
97 echo_i "check that zone with active and inactive KSK and active ZSK is properly"
98 echo_i " resigned after the active KSK is deleted - stage 1: Verify that DNSKEY"
99 echo_i " is initially signed with a KSK and not a ZSK. ($n)"
100 ret=0
101
102 $DIG $DIGOPTS @10.53.0.3 axfr inacksk3.example > dig.out.ns3.test$n
103
104 zskid=`awk '$4 == "DNSKEY" && $5 == 256 { print }' dig.out.ns3.test$n |
105 $DSFROMKEY -A -2 -f - inacksk3.example | awk '{ print $4}'`
106 grep "DNSKEY 7 2 " dig.out.ns3.test$n > /dev/null || ret=1
107
108 pattern="DNSKEY 7 2 [0-9]* [0-9]* [0-9]* ${zskid} "
109 grep "${pattern}" dig.out.ns3.test$n > /dev/null && ret=1
110
111 count=`awk 'BEGIN { count = 0 }
112 $4 == "RRSIG" && $5 == "DNSKEY" { count++ }
113 END {print count}' dig.out.ns3.test$n`
114 test $count -eq 1 || ret=1
115
116 count=`awk 'BEGIN { count = 0 }
117 $4 == "DNSKEY" { count++ }
118 END {print count}' dig.out.ns3.test$n`
119 test $count -eq 3 || ret=1
120
121 awk='$4 == "RRSIG" && $5 == "DNSKEY" { printf "%05u\n", $11 }'
122 id=`awk "${awk}" dig.out.ns3.test$n`
123
124 $SETTIME -D now+5 ns3/Kinacksk3.example.+007+${id} > /dev/null 2>&1
125 $RNDCCMD 10.53.0.3 loadkeys inacksk3.example 2>&1 | sed 's/^/ns3 /' | cat_i
126
127 n=`expr $n + 1`
128 if [ $ret != 0 ]; then echo_i "failed"; fi
129 status=`expr $status + $ret`
130
131 #
132 # Check that zone is initially signed with a ZSK and not a KSK.
133 #
134 echo_i "check that zone with active and inactive ZSK and active KSK is properly"
135 echo_i " resigned after the active ZSK is deleted - stage 1: Verify that zone"
136 echo_i " is initially signed with a ZSK and not a KSK. ($n)"
137 ret=0
138 $DIG $DIGOPTS @10.53.0.3 axfr inaczsk3.example > dig.out.ns3.test$n
139 kskid=`awk '$4 == "DNSKEY" && $5 == 257 { print }' dig.out.ns3.test$n |
140 $DSFROMKEY -2 -f - inaczsk3.example | awk '{ print $4}' `
141 grep "CNAME 7 3 " dig.out.ns3.test$n > /dev/null || ret=1
142 grep "CNAME 7 3 [0-9]* [0-9]* [0-9]* ${kskid} " dig.out.ns3.test$n > /dev/null && ret=1
143 count=`awk 'BEGIN { count = 0 }
144 $4 == "RRSIG" && $5 == "CNAME" { count++ }
145 END {print count}' dig.out.ns3.test$n`
146 test $count -eq 1 || ret=1
147 count=`awk 'BEGIN { count = 0 }
148 $4 == "DNSKEY" { count++ }
149 END {print count}' dig.out.ns3.test$n`
150 test $count -eq 3 || ret=1
151 id=`awk '$4 == "RRSIG" && $5 == "CNAME" { printf "%05u\n", $11 }' dig.out.ns3.test$n`
152 $SETTIME -D now+5 ns3/Kinaczsk3.example.+007+${id} > /dev/null 2>&1
153 $RNDCCMD 10.53.0.3 loadkeys inaczsk3.example 2>&1 | sed 's/^/ns3 /' | cat_i
154 n=`expr $n + 1`
155 if [ $ret != 0 ]; then echo_i "failed"; fi
156 status=`expr $status + $ret`
157
158 echo_i "checking NSEC->NSEC3 conversion prerequisites ($n)"
159 ret=0
160 # these commands should result in an empty file:
161 $DIG $DIGOPTS +noall +answer nsec3.example. nsec3param @10.53.0.3 > dig.out.ns3.1.test$n || ret=1
162 grep "NSEC3PARAM" dig.out.ns3.1.test$n > /dev/null && ret=1
163 $DIG $DIGOPTS +noall +answer autonsec3.example. nsec3param @10.53.0.3 > dig.out.ns3.2.test$n || ret=1
164 grep "NSEC3PARAM" dig.out.ns3.2.test$n > /dev/null && ret=1
165 n=`expr $n + 1`
166 if [ $ret != 0 ]; then echo_i "failed"; fi
167 status=`expr $status + $ret`
168
169 echo_i "checking NSEC3->NSEC conversion prerequisites ($n)"
170 ret=0
171 $DIG $DIGOPTS +noall +answer nsec3-to-nsec.example. nsec3param @10.53.0.3 > dig.out.ns3.test$n || ret=1
172 grep "NSEC3PARAM" dig.out.ns3.test$n > /dev/null || ret=1
173 n=`expr $n + 1`
174 if [ $ret != 0 ]; then echo_i "failed"; fi
175 status=`expr $status + $ret`
176
177 echo_i "converting zones from nsec to nsec3"
178 $NSUPDATE > /dev/null 2>&1 <<END || status=1
179 server 10.53.0.3 ${PORT}
180 zone nsec3.nsec3.example.
181 update add nsec3.nsec3.example. 3600 NSEC3PARAM 1 0 10 BEEF
182 send
183 zone optout.nsec3.example.
184 update add optout.nsec3.example. 3600 NSEC3PARAM 1 1 10 BEEF
185 send
186 zone nsec3.example.
187 update add nsec3.example. 3600 NSEC3PARAM 1 0 10 BEEF
188 send
189 zone autonsec3.example.
190 update add autonsec3.example. 3600 NSEC3PARAM 1 0 20 DEAF
191 send
192 zone nsec3.optout.example.
193 update add nsec3.optout.example. 3600 NSEC3PARAM 1 0 10 BEEF
194 send
195 zone optout.optout.example.
196 update add optout.optout.example. 3600 NSEC3PARAM 1 1 10 BEEF
197 send
198 zone optout.example.
199 update add optout.example. 3600 NSEC3PARAM 1 1 10 BEEF
200 send
201 END
202
203 # try to convert nsec.example; this should fail due to non-NSEC key
204 echo_i "preset nsec3param in unsigned zone via nsupdate ($n)"
205 $NSUPDATE > nsupdate.out 2>&1 <<END
206 server 10.53.0.3 ${PORT}
207 zone nsec.example.
208 update add nsec.example. 3600 NSEC3PARAM 1 0 10 BEEF
209 send
210 END
211
212 echo_i "checking for nsec3param in unsigned zone ($n)"
213 ret=0
214 $DIG $DIGOPTS +noall +answer autonsec3.example. nsec3param @10.53.0.3 > dig.out.ns3.test$n || ret=1
215 grep "NSEC3PARAM" dig.out.ns3.test$n > /dev/null && ret=1
216 n=`expr $n + 1`
217 if [ $ret != 0 ]; then echo_i "failed"; fi
218 status=`expr $status + $ret`
219
220 echo_i "checking for nsec3param signing record ($n)"
221 ret=0
222 $RNDCCMD 10.53.0.3 signing -list autonsec3.example. > signing.out.test$n 2>&1 | sed 's/^/ns3 /' | cat_i
223 grep "Pending NSEC3 chain 1 0 20 DEAF" signing.out.test$n > /dev/null || ret=1
224 n=`expr $n + 1`
225 if [ $ret != 0 ]; then echo_i "failed"; fi
226 status=`expr $status + $ret`
227
228 echo_i "resetting nsec3param via rndc signing ($n)"
229 ret=0
230 $RNDCCMD 10.53.0.3 signing -clear all autonsec3.example. > /dev/null 2>&1
231 $RNDCCMD 10.53.0.3 signing -nsec3param 1 1 10 beef autonsec3.example. > /dev/null 2>&1
232 for i in 0 1 2 3 4 5 6 7 8 9; do
233 ret=0
234 $RNDCCMD 10.53.0.3 signing -list autonsec3.example. > signing.out.test$n 2>&1
235 grep "Pending NSEC3 chain 1 1 10 BEEF" signing.out.test$n > /dev/null || ret=1
236 num=`grep "Pending " signing.out.test$n | wc -l`
237 [ $num -eq 1 ] || ret=1
238 [ $ret -eq 0 ] && break
239 echo_i "waiting ... ($i)"
240 sleep 2
241 done
242 n=`expr $n + 1`
243 if [ $ret != 0 ]; then echo_i "failed"; fi
244 status=`expr $status + $ret`
245
246 echo_i "signing preset nsec3 zone"
247 zsk=`cat autozsk.key`
248 ksk=`cat autoksk.key`
249 $SETTIME -K ns3 -P now -A now $zsk > /dev/null 2>&1
250 $SETTIME -K ns3 -P now -A now $ksk > /dev/null 2>&1
251 $RNDCCMD 10.53.0.3 loadkeys autonsec3.example. 2>&1 | sed 's/^/ns3 /' | cat_i
252
253 echo_i "waiting for changes to take effect"
254 sleep 3
255
256 echo_i "converting zone from nsec3 to nsec"
257 $NSUPDATE > /dev/null 2>&1 << END || status=1
258 server 10.53.0.3 ${PORT}
259 zone nsec3-to-nsec.example.
260 update delete nsec3-to-nsec.example. NSEC3PARAM
261 send
262 END
263
264 echo_i "waiting for change to take effect"
265 sleep 3
266
267 echo_i "checking that expired RRSIGs from missing key are not deleted ($n)"
268 ret=0
269 missing=`sed 's/^K.*+007+0*\([0-9]\)/\1/' < missingzsk.key`
270 $JOURNALPRINT ns3/nozsk.example.db.jnl | \
271 awk '{if ($1 == "del" && $5 == "RRSIG" && $12 == id) {exit 1}} END {exit 0}' id=$missing || ret=1
272 n=`expr $n + 1`
273 if [ $ret != 0 ]; then echo_i "failed"; fi
274 status=`expr $status + $ret`
275
276 echo_i "checking that expired RRSIGs from inactive key are not deleted ($n)"
277 ret=0
278 inactive=`sed 's/^K.*+007+0*\([0-9]\)/\1/' < inactivezsk.key`
279 $JOURNALPRINT ns3/inaczsk.example.db.jnl | \
280 awk '{if ($1 == "del" && $5 == "RRSIG" && $12 == id) {exit 1}} END {exit 0}' id=$inactive || ret=1
281 n=`expr $n + 1`
282 if [ $ret != 0 ]; then echo_i "failed"; fi
283 status=`expr $status + $ret`
284
285 echo_i "checking that non-replaceable RRSIGs are logged only once (missing private key) ($n)"
286 ret=0
287 loglines=`grep "Key nozsk.example/NSEC3RSASHA1/$missing .* retaining signatures" ns3/named.run | wc -l`
288 [ "$loglines" -eq 1 ] || ret=1
289 n=`expr $n + 1`
290 if [ $ret != 0 ]; then echo_i "failed"; fi
291 status=`expr $status + $ret`
292
293 echo_i "checking that non-replaceable RRSIGs are logged only once (inactive private key) ($n)"
294 ret=0
295 loglines=`grep "Key inaczsk.example/NSEC3RSASHA1/$inactive .* retaining signatures" ns3/named.run | wc -l`
296 [ "$loglines" -eq 1 ] || ret=1
297 n=`expr $n + 1`
298 if [ $ret != 0 ]; then echo_i "failed"; fi
299 status=`expr $status + $ret`
300
301 # Send rndc sync command to ns1, ns2 and ns3, to force the dynamically
302 # signed zones to be dumped to their zone files
303 echo_i "dumping zone files"
304 $RNDCCMD 10.53.0.1 sync 2>&1 | sed 's/^/ns1 /' | cat_i
305 $RNDCCMD 10.53.0.2 sync 2>&1 | sed 's/^/ns2 /' | cat_i
306 $RNDCCMD 10.53.0.3 sync 2>&1 | sed 's/^/ns3 /' | cat_i
307
308 echo_i "checking expired signatures were updated ($n)"
309 for i in 1 2 3 4 5 6 7 8 9
310 do
311 ret=0
312 $DIG $DIGOPTS +noauth a.oldsigs.example. @10.53.0.3 a > dig.out.ns3.test$n || ret=1
313 $DIG $DIGOPTS +noauth a.oldsigs.example. @10.53.0.4 a > dig.out.ns4.test$n || ret=1
314 digcomp dig.out.ns3.test$n dig.out.ns4.test$n || ret=1
315 grep "flags:.*ad.*QUERY" dig.out.ns4.test$n > /dev/null || ret=1
316 [ $ret = 0 ] && break
317 sleep 1
318 done
319 n=`expr $n + 1`
320 status=`expr $status + $ret`
321
322 echo_i "checking NSEC->NSEC3 conversion succeeded ($n)"
323 ret=0
324 $DIG $DIGOPTS nsec3.example. nsec3param @10.53.0.3 > dig.out.ns3.ok.test$n || ret=1
325 grep "status: NOERROR" dig.out.ns3.ok.test$n > /dev/null || ret=1
326 $DIG $DIGOPTS +noauth q.nsec3.example. @10.53.0.3 a > dig.out.ns3.test$n || ret=1
327 $DIG $DIGOPTS +noauth q.nsec3.example. @10.53.0.4 a > dig.out.ns4.test$n || ret=1
328 digcomp dig.out.ns3.test$n dig.out.ns4.test$n || ret=1
329 grep "flags:.*ad.*QUERY" dig.out.ns4.test$n > /dev/null || ret=1
330 grep "status: NXDOMAIN" dig.out.ns4.test$n > /dev/null || ret=1
331 n=`expr $n + 1`
332 if [ $ret != 0 ]; then echo_i "failed"; fi
333 status=`expr $status + $ret`
334
335 echo_i "checking direct NSEC3 autosigning succeeded ($n)"
336 ret=0
337 $DIG $DIGOPTS +noall +answer autonsec3.example. nsec3param @10.53.0.3 > dig.out.ns3.ok.test$n || ret=1
338 [ -s dig.out.ns3.ok.test$n ] || ret=1
339 grep "NSEC3PARAM" dig.out.ns3.ok.test$n > /dev/null || ret=1
340 $DIG $DIGOPTS +noauth q.autonsec3.example. @10.53.0.3 a > dig.out.ns3.test$n || ret=1
341 $DIG $DIGOPTS +noauth q.autonsec3.example. @10.53.0.4 a > dig.out.ns4.test$n || ret=1
342 digcomp dig.out.ns3.test$n dig.out.ns4.test$n || ret=1
343 grep "flags:.*ad.*QUERY" dig.out.ns4.test$n > /dev/null || ret=1
344 grep "status: NXDOMAIN" dig.out.ns4.test$n > /dev/null || ret=1
345 n=`expr $n + 1`
346 if [ $ret != 0 ]; then echo_i "failed"; fi
347 status=`expr $status + $ret`
348
349 echo_i "checking NSEC->NSEC3 conversion failed with NSEC-only key ($n)"
350 ret=0
351 grep "failed: REFUSED" nsupdate.out > /dev/null || ret=1
352 n=`expr $n + 1`
353 if [ $ret != 0 ]; then echo_i "failed"; fi
354 status=`expr $status + $ret`
355
356 echo_i "checking NSEC3->NSEC conversion succeeded ($n)"
357 ret=0
358 # this command should result in an empty file:
359 $DIG $DIGOPTS +noall +answer nsec3-to-nsec.example. nsec3param @10.53.0.3 > dig.out.ns3.nx.test$n || ret=1
360 grep "NSEC3PARAM" dig.out.ns3.nx.test$n > /dev/null && ret=1
361 $DIG $DIGOPTS +noauth q.nsec3-to-nsec.example. @10.53.0.3 a > dig.out.ns3.test$n || ret=1
362 $DIG $DIGOPTS +noauth q.nsec3-to-nsec.example. @10.53.0.4 a > dig.out.ns4.test$n || ret=1
363 digcomp dig.out.ns3.test$n dig.out.ns4.test$n || ret=1
364 grep "flags:.*ad.*QUERY" dig.out.ns4.test$n > /dev/null || ret=1
365 grep "status: NXDOMAIN" dig.out.ns4.test$n > /dev/null || ret=1
366 n=`expr $n + 1`
367 if [ $ret != 0 ]; then echo_i "failed"; fi
368 status=`expr $status + $ret`
369
370 echo_i "checking NSEC3->NSEC conversion with 'rndc signing -nsec3param none' ($n)"
371 ret=0
372 $RNDCCMD 10.53.0.3 signing -nsec3param none autonsec3.example. > /dev/null 2>&1
373 sleep 2
374 # this command should result in an empty file:
375 $DIG $DIGOPTS +noall +answer autonsec3.example. nsec3param @10.53.0.3 > dig.out.ns3.nx.test$n || ret=1
376 grep "NSEC3PARAM" dig.out.ns3.nx.test$n > /dev/null && ret=1
377 $DIG $DIGOPTS +noauth q.autonsec3.example. @10.53.0.3 a > dig.out.ns3.test$n || ret=1
378 $DIG $DIGOPTS +noauth q.autonsec3.example. @10.53.0.4 a > dig.out.ns4.test$n || ret=1
379 digcomp dig.out.ns3.test$n dig.out.ns4.test$n || ret=1
380 grep "flags:.*ad.*QUERY" dig.out.ns4.test$n > /dev/null || ret=1
381 grep "status: NXDOMAIN" dig.out.ns4.test$n > /dev/null || ret=1
382 n=`expr $n + 1`
383 if [ $ret != 0 ]; then echo_i "failed"; fi
384 status=`expr $status + $ret`
385
386 echo_i "checking TTLs of imported DNSKEYs (no default) ($n)"
387 ret=0
388 $DIG $DIGOPTS +tcp +noall +answer dnskey ttl1.example. @10.53.0.3 > dig.out.ns3.test$n || ret=1
389 [ -s dig.out.ns3.test$n ] || ret=1
390 awk 'BEGIN {r=0} $2 != 300 {r=1; print "found TTL " $2} END {exit r}' dig.out.ns3.test$n || ret=1 | cat_i
391 n=`expr $n + 1`
392 if [ $ret != 0 ]; then echo_i "failed"; fi
393 status=`expr $status + $ret`
394
395 echo_i "checking TTLs of imported DNSKEYs (with default) ($n)"
396 ret=0
397 $DIG $DIGOPTS +tcp +noall +answer dnskey ttl2.example. @10.53.0.3 > dig.out.ns3.test$n || ret=1
398 [ -s dig.out.ns3.test$n ] || ret=1
399 awk 'BEGIN {r=0} $2 != 60 {r=1; print "found TTL " $2} END {exit r}' dig.out.ns3.test$n || ret=1 | cat_i
400 n=`expr $n + 1`
401 if [ $ret != 0 ]; then echo_i "failed"; fi
402 status=`expr $status + $ret`
403
404 echo_i "checking TTLs of imported DNSKEYs (mismatched) ($n)"
405 ret=0
406 $DIG $DIGOPTS +tcp +noall +answer dnskey ttl3.example. @10.53.0.3 > dig.out.ns3.test$n || ret=1
407 [ -s dig.out.ns3.test$n ] || ret=1
408 awk 'BEGIN {r=0} $2 != 30 {r=1; print "found TTL " $2} END {exit r}' dig.out.ns3.test$n || ret=1 | cat_i
409 n=`expr $n + 1`
410 if [ $ret != 0 ]; then echo_i "failed"; fi
411 status=`expr $status + $ret`
412
413 echo_i "checking TTLs of imported DNSKEYs (existing RRset) ($n)"
414 ret=0
415 $DIG $DIGOPTS +tcp +noall +answer dnskey ttl4.example. @10.53.0.3 > dig.out.ns3.test$n || ret=1
416 [ -s dig.out.ns3.test$n ] || ret=1
417 awk 'BEGIN {r=0} $2 != 30 {r=1; print "found TTL " $2} END {exit r}' dig.out.ns3.test$n || ret=1 | cat_i
418 n=`expr $n + 1`
419 if [ $ret != 0 ]; then echo_i "failed"; fi
420 status=`expr $status + $ret`
421
422 echo_i "checking positive validation NSEC ($n)"
423 ret=0
424 $DIG $DIGOPTS +noauth a.example. @10.53.0.2 a > dig.out.ns2.test$n || ret=1
425 $DIG $DIGOPTS +noauth a.example. @10.53.0.4 a > dig.out.ns4.test$n || ret=1
426 digcomp dig.out.ns2.test$n dig.out.ns4.test$n || ret=1
427 grep "flags:.*ad.*QUERY" dig.out.ns4.test$n > /dev/null || ret=1
428 n=`expr $n + 1`
429 if [ $ret != 0 ]; then echo_i "failed"; fi
430 status=`expr $status + $ret`
431
432 echo_i "checking positive validation NSEC3 ($n)"
433 ret=0
434 $DIG $DIGOPTS +noauth a.nsec3.example. \
435 @10.53.0.3 a > dig.out.ns3.test$n || ret=1
436 $DIG $DIGOPTS +noauth a.nsec3.example. \
437 @10.53.0.4 a > dig.out.ns4.test$n || ret=1
438 digcomp dig.out.ns3.test$n dig.out.ns4.test$n || ret=1
439 grep "flags:.*ad.*QUERY" dig.out.ns4.test$n > /dev/null || ret=1
440 n=`expr $n + 1`
441 if [ $ret != 0 ]; then echo_i "failed"; fi
442 status=`expr $status + $ret`
443
444 echo_i "checking positive validation OPTOUT ($n)"
445 ret=0
446 $DIG $DIGOPTS +noauth a.optout.example. \
447 @10.53.0.3 a > dig.out.ns3.test$n || ret=1
448 $DIG $DIGOPTS +noauth a.optout.example. \
449 @10.53.0.4 a > dig.out.ns4.test$n || ret=1
450 digcomp dig.out.ns3.test$n dig.out.ns4.test$n || ret=1
451 grep "flags:.*ad.*QUERY" dig.out.ns4.test$n > /dev/null || ret=1
452 n=`expr $n + 1`
453 if [ $ret != 0 ]; then echo_i "failed"; fi
454 status=`expr $status + $ret`
455
456 echo_i "checking negative validation NXDOMAIN NSEC ($n)"
457 ret=0
458 $DIG $DIGOPTS +noauth q.example. @10.53.0.2 a > dig.out.ns2.test$n || ret=1
459 $DIG $DIGOPTS +noauth q.example. @10.53.0.4 a > dig.out.ns4.test$n || ret=1
460 digcomp dig.out.ns2.test$n dig.out.ns4.test$n || ret=1
461 grep "flags:.*ad.*QUERY" dig.out.ns4.test$n > /dev/null || ret=1
462 grep "status: NXDOMAIN" dig.out.ns4.test$n > /dev/null || ret=1
463 n=`expr $n + 1`
464 if [ $ret != 0 ]; then echo_i "failed"; fi
465 status=`expr $status + $ret`
466
467 echo_i "checking negative validation NXDOMAIN NSEC3 ($n)"
468 ret=0
469 $DIG $DIGOPTS +noauth q.nsec3.example. \
470 @10.53.0.3 a > dig.out.ns3.test$n || ret=1
471 $DIG $DIGOPTS +noauth q.nsec3.example. \
472 @10.53.0.4 a > dig.out.ns4.test$n || ret=1
473 digcomp dig.out.ns3.test$n dig.out.ns4.test$n || ret=1
474 grep "flags:.*ad.*QUERY" dig.out.ns4.test$n > /dev/null || ret=1
475 grep "status: NXDOMAIN" dig.out.ns4.test$n > /dev/null || ret=1
476 n=`expr $n + 1`
477 if [ $ret != 0 ]; then echo_i "failed"; fi
478 status=`expr $status + $ret`
479
480 echo_i "checking negative validation NXDOMAIN OPTOUT ($n)"
481 ret=0
482 $DIG $DIGOPTS +noauth q.optout.example. \
483 @10.53.0.3 a > dig.out.ns3.test$n || ret=1
484 $DIG $DIGOPTS +noauth q.optout.example. \
485 @10.53.0.4 a > dig.out.ns4.test$n || ret=1
486 digcomp dig.out.ns3.test$n dig.out.ns4.test$n || ret=1
487 grep "status: NXDOMAIN" dig.out.ns4.test$n > /dev/null || ret=1
488 # Note - this is looking for failure, hence the &&
489 grep "flags:.*ad.*QUERY" dig.out.ns4.test$n > /dev/null && ret=1
490 n=`expr $n + 1`
491 if [ $ret != 0 ]; then echo_i "failed"; fi
492 status=`expr $status + $ret`
493
494 echo_i "checking negative validation NODATA NSEC ($n)"
495 ret=0
496 $DIG $DIGOPTS +noauth a.example. @10.53.0.2 txt > dig.out.ns2.test$n || ret=1
497 $DIG $DIGOPTS +noauth a.example. @10.53.0.4 txt > dig.out.ns4.test$n || ret=1
498 digcomp dig.out.ns2.test$n dig.out.ns4.test$n || ret=1
499 grep "flags:.*ad.*QUERY" dig.out.ns4.test$n > /dev/null || ret=1
500 grep "status: NOERROR" dig.out.ns4.test$n > /dev/null || ret=1
501 grep "ANSWER: 0" dig.out.ns4.test$n > /dev/null || ret=1
502 n=`expr $n + 1`
503 if [ $ret != 0 ]; then echo_i "failed"; fi
504 status=`expr $status + $ret`
505
506 echo_i "checking negative validation NODATA NSEC3 ($n)"
507 ret=0
508 $DIG $DIGOPTS +noauth a.nsec3.example. \
509 @10.53.0.3 txt > dig.out.ns3.test$n || ret=1
510 $DIG $DIGOPTS +noauth a.nsec3.example. \
511 @10.53.0.4 txt > dig.out.ns4.test$n || ret=1
512 digcomp dig.out.ns3.test$n dig.out.ns4.test$n || ret=1
513 grep "flags:.*ad.*QUERY" dig.out.ns4.test$n > /dev/null || ret=1
514 grep "status: NOERROR" dig.out.ns4.test$n > /dev/null || ret=1
515 grep "ANSWER: 0" dig.out.ns4.test$n > /dev/null || ret=1
516 n=`expr $n + 1`
517 if [ $ret != 0 ]; then echo_i "failed"; fi
518 status=`expr $status + $ret`
519
520 echo_i "checking negative validation NODATA OPTOUT ($n)"
521 ret=0
522 $DIG $DIGOPTS +noauth a.optout.example. \
523 @10.53.0.3 txt > dig.out.ns3.test$n || ret=1
524 $DIG $DIGOPTS +noauth a.optout.example. \
525 @10.53.0.4 txt > dig.out.ns4.test$n || ret=1
526 digcomp dig.out.ns3.test$n dig.out.ns4.test$n || ret=1
527 grep "flags:.*ad.*QUERY" dig.out.ns4.test$n > /dev/null || ret=1
528 grep "status: NOERROR" dig.out.ns4.test$n > /dev/null || ret=1
529 grep "ANSWER: 0" dig.out.ns4.test$n > /dev/null || ret=1
530 n=`expr $n + 1`
531 if [ $ret != 0 ]; then echo_i "failed"; fi
532 status=`expr $status + $ret`
533
534 # Check the insecure.example domain
535
536 echo_i "checking 1-server insecurity proof NSEC ($n)"
537 ret=0
538 $DIG $DIGOPTS +noauth a.insecure.example. @10.53.0.3 a > dig.out.ns3.test$n || ret=1
539 $DIG $DIGOPTS +noauth a.insecure.example. @10.53.0.4 a > dig.out.ns4.test$n || ret=1
540 digcomp dig.out.ns3.test$n dig.out.ns4.test$n || ret=1
541 grep "status: NOERROR" dig.out.ns4.test$n > /dev/null || ret=1
542 # Note - this is looking for failure, hence the &&
543 grep "flags:.*ad.*QUERY" dig.out.ns4.test$n > /dev/null && ret=1
544 n=`expr $n + 1`
545 if [ $ret != 0 ]; then echo_i "failed"; fi
546 status=`expr $status + $ret`
547
548 echo_i "checking 1-server negative insecurity proof NSEC ($n)"
549 ret=0
550 $DIG $DIGOPTS q.insecure.example. a @10.53.0.3 \
551 > dig.out.ns3.test$n || ret=1
552 $DIG $DIGOPTS q.insecure.example. a @10.53.0.4 \
553 > dig.out.ns4.test$n || ret=1
554 digcomp dig.out.ns3.test$n dig.out.ns4.test$n || ret=1
555 grep "status: NXDOMAIN" dig.out.ns4.test$n > /dev/null || ret=1
556 # Note - this is looking for failure, hence the &&
557 grep "flags:.*ad.*QUERY" dig.out.ns4.test$n > /dev/null && ret=1
558 n=`expr $n + 1`
559 if [ $ret != 0 ]; then echo_i "failed"; fi
560 status=`expr $status + $ret`
561
562 # Check the secure.example domain
563
564 echo_i "checking multi-stage positive validation NSEC/NSEC ($n)"
565 ret=0
566 $DIG $DIGOPTS +noauth a.secure.example. \
567 @10.53.0.3 a > dig.out.ns3.test$n || ret=1
568 $DIG $DIGOPTS +noauth a.secure.example. \
569 @10.53.0.4 a > dig.out.ns4.test$n || ret=1
570 digcomp dig.out.ns3.test$n dig.out.ns4.test$n || ret=1
571 grep "status: NOERROR" dig.out.ns4.test$n > /dev/null || ret=1
572 grep "flags:.*ad.*QUERY" dig.out.ns4.test$n > /dev/null || ret=1
573 n=`expr $n + 1`
574 if [ $ret != 0 ]; then echo_i "failed"; fi
575 status=`expr $status + $ret`
576
577 echo_i "checking multi-stage positive validation NSEC/NSEC3 ($n)"
578 ret=0
579 $DIG $DIGOPTS +noauth a.nsec3.example. \
580 @10.53.0.3 a > dig.out.ns3.test$n || ret=1
581 $DIG $DIGOPTS +noauth a.nsec3.example. \
582 @10.53.0.4 a > dig.out.ns4.test$n || ret=1
583 digcomp dig.out.ns3.test$n dig.out.ns4.test$n || ret=1
584 grep "status: NOERROR" dig.out.ns4.test$n > /dev/null || ret=1
585 grep "flags:.*ad.*QUERY" dig.out.ns4.test$n > /dev/null || ret=1
586 n=`expr $n + 1`
587 if [ $ret != 0 ]; then echo_i "failed"; fi
588 status=`expr $status + $ret`
589
590 echo_i "checking multi-stage positive validation NSEC/OPTOUT ($n)"
591 ret=0
592 $DIG $DIGOPTS +noauth a.optout.example. \
593 @10.53.0.3 a > dig.out.ns3.test$n || ret=1
594 $DIG $DIGOPTS +noauth a.optout.example. \
595 @10.53.0.4 a > dig.out.ns4.test$n || ret=1
596 digcomp dig.out.ns3.test$n dig.out.ns4.test$n || ret=1
597 grep "status: NOERROR" dig.out.ns4.test$n > /dev/null || ret=1
598 grep "flags:.*ad.*QUERY" dig.out.ns4.test$n > /dev/null || ret=1
599 n=`expr $n + 1`
600 if [ $ret != 0 ]; then echo_i "failed"; fi
601 status=`expr $status + $ret`
602
603 echo_i "checking multi-stage positive validation NSEC3/NSEC ($n)"
604 ret=0
605 $DIG $DIGOPTS +noauth a.secure.nsec3.example. \
606 @10.53.0.3 a > dig.out.ns3.test$n || ret=1
607 $DIG $DIGOPTS +noauth a.secure.nsec3.example. \
608 @10.53.0.4 a > dig.out.ns4.test$n || ret=1
609 digcomp dig.out.ns3.test$n dig.out.ns4.test$n || ret=1
610 grep "status: NOERROR" dig.out.ns4.test$n > /dev/null || ret=1
611 grep "flags:.*ad.*QUERY" dig.out.ns4.test$n > /dev/null || ret=1
612 n=`expr $n + 1`
613 if [ $ret != 0 ]; then echo_i "failed"; fi
614 status=`expr $status + $ret`
615
616 echo_i "checking multi-stage positive validation NSEC3/NSEC3 ($n)"
617 ret=0
618 $DIG $DIGOPTS +noauth a.nsec3.nsec3.example. \
619 @10.53.0.3 a > dig.out.ns3.test$n || ret=1
620 $DIG $DIGOPTS +noauth a.nsec3.nsec3.example. \
621 @10.53.0.4 a > dig.out.ns4.test$n || ret=1
622 digcomp dig.out.ns3.test$n dig.out.ns4.test$n || ret=1
623 grep "status: NOERROR" dig.out.ns4.test$n > /dev/null || ret=1
624 grep "flags:.*ad.*QUERY" dig.out.ns4.test$n > /dev/null || ret=1
625 n=`expr $n + 1`
626 if [ $ret != 0 ]; then echo_i "failed"; fi
627 status=`expr $status + $ret`
628
629 echo_i "checking multi-stage positive validation NSEC3/OPTOUT ($n)"
630 ret=0
631 $DIG $DIGOPTS +noauth a.optout.nsec3.example. \
632 @10.53.0.3 a > dig.out.ns3.test$n || ret=1
633 $DIG $DIGOPTS +noauth a.optout.nsec3.example. \
634 @10.53.0.4 a > dig.out.ns4.test$n || ret=1
635 digcomp dig.out.ns3.test$n dig.out.ns4.test$n || ret=1
636 grep "status: NOERROR" dig.out.ns4.test$n > /dev/null || ret=1
637 grep "flags:.*ad.*QUERY" dig.out.ns4.test$n > /dev/null || ret=1
638 n=`expr $n + 1`
639 if [ $ret != 0 ]; then echo_i "failed"; fi
640 status=`expr $status + $ret`
641
642 echo_i "checking multi-stage positive validation OPTOUT/NSEC ($n)"
643 ret=0
644 $DIG $DIGOPTS +noauth a.secure.optout.example. \
645 @10.53.0.3 a > dig.out.ns3.test$n || ret=1
646 $DIG $DIGOPTS +noauth a.secure.optout.example. \
647 @10.53.0.4 a > dig.out.ns4.test$n || ret=1
648 digcomp dig.out.ns3.test$n dig.out.ns4.test$n || ret=1
649 grep "status: NOERROR" dig.out.ns4.test$n > /dev/null || ret=1
650 grep "flags:.*ad.*QUERY" dig.out.ns4.test$n > /dev/null || ret=1
651 n=`expr $n + 1`
652 if [ $ret != 0 ]; then echo_i "failed"; fi
653 status=`expr $status + $ret`
654
655 echo_i "checking multi-stage positive validation OPTOUT/NSEC3 ($n)"
656 ret=0
657 $DIG $DIGOPTS +noauth a.nsec3.optout.example. \
658 @10.53.0.3 a > dig.out.ns3.test$n || ret=1
659 $DIG $DIGOPTS +noauth a.nsec3.optout.example. \
660 @10.53.0.4 a > dig.out.ns4.test$n || ret=1
661 digcomp dig.out.ns3.test$n dig.out.ns4.test$n || ret=1
662 grep "status: NOERROR" dig.out.ns4.test$n > /dev/null || ret=1
663 grep "flags:.*ad.*QUERY" dig.out.ns4.test$n > /dev/null || ret=1
664 n=`expr $n + 1`
665 if [ $ret != 0 ]; then echo_i "failed"; fi
666 status=`expr $status + $ret`
667
668 echo_i "checking multi-stage positive validation OPTOUT/OPTOUT ($n)"
669 ret=0
670 $DIG $DIGOPTS +noauth a.optout.optout.example. \
671 @10.53.0.3 a > dig.out.ns3.test$n || ret=1
672 $DIG $DIGOPTS +noauth a.optout.optout.example. \
673 @10.53.0.4 a > dig.out.ns4.test$n || ret=1
674 digcomp dig.out.ns3.test$n dig.out.ns4.test$n || ret=1
675 grep "status: NOERROR" dig.out.ns4.test$n > /dev/null || ret=1
676 grep "flags:.*ad.*QUERY" dig.out.ns4.test$n > /dev/null || ret=1
677 n=`expr $n + 1`
678 if [ $ret != 0 ]; then echo_i "failed"; fi
679 status=`expr $status + $ret`
680
681 echo_i "checking empty NODATA OPTOUT ($n)"
682 ret=0
683 $DIG $DIGOPTS +noauth empty.optout.example. \
684 @10.53.0.3 a > dig.out.ns3.test$n || ret=1
685 $DIG $DIGOPTS +noauth empty.optout.example. \
686 @10.53.0.4 a > dig.out.ns4.test$n || ret=1
687 digcomp dig.out.ns3.test$n dig.out.ns4.test$n || ret=1
688 grep "status: NOERROR" dig.out.ns4.test$n > /dev/null || ret=1
689 #grep "flags:.*ad.*QUERY" dig.out.ns4.test$n > /dev/null || ret=1
690 n=`expr $n + 1`
691 if [ $ret != 0 ]; then echo_i "failed"; fi
692 status=`expr $status + $ret`
693
694 # Check the insecure.secure.example domain (insecurity proof)
695
696 echo_i "checking 2-server insecurity proof ($n)"
697 ret=0
698 $DIG $DIGOPTS +noauth a.insecure.secure.example. @10.53.0.2 a \
699 > dig.out.ns2.test$n || ret=1
700 $DIG $DIGOPTS +noauth a.insecure.secure.example. @10.53.0.4 a \
701 > dig.out.ns4.test$n || ret=1
702 digcomp dig.out.ns2.test$n dig.out.ns4.test$n || ret=1
703 grep "status: NOERROR" dig.out.ns4.test$n > /dev/null || ret=1
704 # Note - this is looking for failure, hence the &&
705 grep "flags:.*ad.*QUERY" dig.out.ns4.test$n > /dev/null && ret=1
706 n=`expr $n + 1`
707 if [ $ret != 0 ]; then echo_i "failed"; fi
708 status=`expr $status + $ret`
709
710 # Check a negative response in insecure.secure.example
711
712 echo_i "checking 2-server insecurity proof with a negative answer ($n)"
713 ret=0
714 $DIG $DIGOPTS q.insecure.secure.example. @10.53.0.2 a > dig.out.ns2.test$n \
715 || ret=1
716 $DIG $DIGOPTS q.insecure.secure.example. @10.53.0.4 a > dig.out.ns4.test$n \
717 || ret=1
718 digcomp dig.out.ns2.test$n dig.out.ns4.test$n || ret=1
719 grep "status: NXDOMAIN" dig.out.ns4.test$n > /dev/null || ret=1
720 # Note - this is looking for failure, hence the &&
721 grep "flags:.*ad.*QUERY" dig.out.ns4.test$n > /dev/null && ret=1
722 n=`expr $n + 1`
723 if [ $ret != 0 ]; then echo_i "failed"; fi
724 status=`expr $status + $ret`
725
726 echo_i "checking security root query ($n)"
727 ret=0
728 $DIG $DIGOPTS . @10.53.0.4 key > dig.out.ns4.test$n || ret=1
729 grep "NOERROR" dig.out.ns4.test$n > /dev/null || ret=1
730 grep "flags:.*ad.*QUERY" dig.out.ns4.test$n > /dev/null || ret=1
731 n=`expr $n + 1`
732 if [ $ret != 0 ]; then echo_i "failed"; fi
733 status=`expr $status + $ret`
734
735 echo_i "checking positive validation RSASHA256 NSEC ($n)"
736 ret=0
737 $DIG $DIGOPTS +noauth a.rsasha256.example. @10.53.0.3 a > dig.out.ns3.test$n || ret=1
738 $DIG $DIGOPTS +noauth a.rsasha256.example. @10.53.0.4 a > dig.out.ns4.test$n || ret=1
739 digcomp dig.out.ns3.test$n dig.out.ns4.test$n || ret=1
740 grep "flags:.*ad.*QUERY" dig.out.ns4.test$n > /dev/null || ret=1
741 n=`expr $n + 1`
742 if [ $ret != 0 ]; then echo_i "failed"; fi
743 status=`expr $status + $ret`
744
745 echo_i "checking positive validation RSASHA512 NSEC ($n)"
746 ret=0
747 $DIG $DIGOPTS +noauth a.rsasha512.example. @10.53.0.3 a > dig.out.ns3.test$n || ret=1
748 $DIG $DIGOPTS +noauth a.rsasha512.example. @10.53.0.4 a > dig.out.ns4.test$n || ret=1
749 digcomp dig.out.ns3.test$n dig.out.ns4.test$n || ret=1
750 grep "flags:.*ad.*QUERY" dig.out.ns4.test$n > /dev/null || ret=1
751 n=`expr $n + 1`
752 if [ $ret != 0 ]; then echo_i "failed"; fi
753 status=`expr $status + $ret`
754
755 echo_i "checking that positive validation in a privately secure zone works ($n)"
756 ret=0
757 $DIG $DIGOPTS +noauth a.private.secure.example. a @10.53.0.2 \
758 > dig.out.ns2.test$n || ret=1
759 $DIG $DIGOPTS +noauth a.private.secure.example. a @10.53.0.4 \
760 > dig.out.ns4.test$n || ret=1
761 digcomp dig.out.ns2.test$n dig.out.ns4.test$n || ret=1
762 grep "NOERROR" dig.out.ns4.test$n > /dev/null || ret=1
763 grep "flags:.*ad.*QUERY" dig.out.ns4.test$n > /dev/null || ret=1
764 n=`expr $n + 1`
765 if [ $ret != 0 ]; then echo_i "failed"; fi
766 status=`expr $status + $ret`
767
768 echo_i "checking that negative validation in a privately secure zone works ($n)"
769 ret=0
770 $DIG $DIGOPTS +noauth q.private.secure.example. a @10.53.0.2 \
771 > dig.out.ns2.test$n || ret=1
772 $DIG $DIGOPTS +noauth q.private.secure.example. a @10.53.0.4 \
773 > dig.out.ns4.test$n || ret=1
774 digcomp dig.out.ns2.test$n dig.out.ns4.test$n || ret=1
775 grep "NXDOMAIN" dig.out.ns4.test$n > /dev/null || ret=1
776 # Note - this is looking for failure, hence the &&
777 grep "flags:.*ad.*QUERY" dig.out.ns4.test$n > /dev/null && ret=1
778 n=`expr $n + 1`
779 if [ $ret != 0 ]; then echo_i "failed"; fi
780 status=`expr $status + $ret`
781
782 echo_i "checking privately secure to nxdomain works ($n)"
783 ret=0
784 $DIG $DIGOPTS +noauth private2secure-nxdomain.private.secure.example. SOA @10.53.0.4 > dig.out.ns4.test$n || ret=1
785 grep "NXDOMAIN" dig.out.ns4.test$n > /dev/null || ret=1
786 grep "flags:.*ad.*QUERY" dig.out.ns4.test$n > /dev/null || ret=1
787 n=`expr $n + 1`
788 if [ $ret != 0 ]; then echo_i "failed"; fi
789 status=`expr $status + $ret`
790
791 # Try validating with a revoked trusted key.
792 # This should fail.
793
794 echo_i "checking that validation returns insecure due to revoked trusted key ($n)"
795 ret=0
796 $DIG $DIGOPTS example. soa @10.53.0.5 > dig.out.ns5.test$n || ret=1
797 grep "flags:.*; QUERY" dig.out.ns5.test$n > /dev/null || ret=1
798 grep "flags:.* ad.*; QUERY" dig.out.ns5.test$n > /dev/null && ret=1
799 n=`expr $n + 1`
800 if [ $ret != 0 ]; then echo_i "failed"; fi
801 status=`expr $status + $ret`
802
803 echo_i "checking that revoked key is present ($n)"
804 ret=0
805 id=`cat rev.key`
806 $DIG $DIGOPTS +multi dnskey . @10.53.0.1 > dig.out.ns1.test$n || ret=1
807 grep '; key id = '"$id"'$' dig.out.ns1.test$n > /dev/null || ret=1
808 n=`expr $n + 1`
809 if [ $ret != 0 ]; then echo_i "failed"; fi
810 status=`expr $status + $ret`
811
812 echo_i "checking that revoked key self-signs ($n)"
813 ret=0
814 id=`cat rev.key`
815 $DIG $DIGOPTS dnskey . @10.53.0.1 > dig.out.ns1.test$n || ret=1
816 grep 'RRSIG.*'" $id "'\. ' dig.out.ns1.test$n > /dev/null || ret=1
817 n=`expr $n + 1`
818 if [ $ret != 0 ]; then echo_i "failed"; fi
819 status=`expr $status + $ret`
820
821 echo_i "checking for unpublished key ($n)"
822 ret=0
823 id=`sed 's/^K.+007+0*\([0-9]\)/\1/' < unpub.key`
824 $DIG $DIGOPTS +multi dnskey . @10.53.0.1 > dig.out.ns1.test$n || ret=1
825 grep '; key id = '"$id"'$' dig.out.ns1.test$n > /dev/null && ret=1
826 n=`expr $n + 1`
827 if [ $ret != 0 ]; then echo_i "failed"; fi
828 status=`expr $status + $ret`
829
830 echo_i "checking for activated but unpublished key ($n)"
831 ret=0
832 id=`sed 's/^K.+007+0*\([0-9]\)/\1/' < activate-now-publish-1day.key`
833 $DIG $DIGOPTS +multi dnskey . @10.53.0.1 > dig.out.ns1.test$n || ret=1
834 grep '; key id = '"$id"'$' dig.out.ns1.test$n > /dev/null && ret=1
835 n=`expr $n + 1`
836 if [ $ret != 0 ]; then echo_i "failed"; fi
837 status=`expr $status + $ret`
838
839 echo_i "checking that standby key does not sign records ($n)"
840 ret=0
841 id=`sed 's/^K.+007+0*\([0-9]\)/\1/' < standby.key`
842 $DIG $DIGOPTS dnskey . @10.53.0.1 > dig.out.ns1.test$n || ret=1
843 grep 'RRSIG.*'" $id "'\. ' dig.out.ns1.test$n > /dev/null && ret=1
844 n=`expr $n + 1`
845 if [ $ret != 0 ]; then echo_i "failed"; fi
846 status=`expr $status + $ret`
847
848 echo_i "checking that deactivated key does not sign records ($n)"
849 ret=0
850 id=`sed 's/^K.+007+0*\([0-9]\)/\1/' < inact.key`
851 $DIG $DIGOPTS dnskey . @10.53.0.1 > dig.out.ns1.test$n || ret=1
852 grep 'RRSIG.*'" $id "'\. ' dig.out.ns1.test$n > /dev/null && ret=1
853 n=`expr $n + 1`
854 if [ $ret != 0 ]; then echo_i "failed"; fi
855 status=`expr $status + $ret`
856
857 echo_i "checking insertion of public-only key ($n)"
858 ret=0
859 id=`sed 's/^K.+007+0*\([0-9]\)/\1/' < nopriv.key`
860 file="ns1/`cat nopriv.key`.key"
861 keydata=`grep DNSKEY $file`
862 $NSUPDATE > /dev/null 2>&1 <<END || status=1
863 server 10.53.0.1 ${PORT}
864 zone .
865 ttl 3600
866 update add $keydata
867 send
868 END
869 sleep 1
870 $DIG $DIGOPTS dnskey . @10.53.0.1 > dig.out.ns1.test$n || ret=1
871 grep 'RRSIG.*'" $id "'\. ' dig.out.ns1.test$n > /dev/null && ret=1
872 n=`expr $n + 1`
873 if [ $ret != 0 ]; then echo_i "failed"; fi
874 status=`expr $status + $ret`
875
876 echo_i "checking key deletion ($n)"
877 ret=0
878 id=`sed 's/^K.+007+0*\([0-9]\)/\1/' < del.key`
879 $DIG $DIGOPTS +multi dnskey . @10.53.0.1 > dig.out.ns1.test$n || ret=1
880 grep '; key id = '"$id"'$' dig.out.ns1.test$n > /dev/null && ret=1
881 n=`expr $n + 1`
882 if [ $ret != 0 ]; then echo_i "failed"; fi
883 status=`expr $status + $ret`
884
885 echo_i "checking secure-to-insecure transition, nsupdate ($n)"
886 ret=0
887 $NSUPDATE > /dev/null 2>&1 <<END || status=1
888 server 10.53.0.3 ${PORT}
889 zone secure-to-insecure.example
890 update delete secure-to-insecure.example dnskey
891 send
892 END
893 for i in 0 1 2 3 4 5 6 7 8 9; do
894 ret=0
895 $DIG $DIGOPTS axfr secure-to-insecure.example @10.53.0.3 > dig.out.ns3.test$n || ret=1
896 egrep '(RRSIG|DNSKEY|NSEC)' dig.out.ns3.test$n > /dev/null && ret=1
897 [ $ret -eq 0 ] && break
898 echo_i "waiting ... ($i)"
899 sleep 2
900 done
901 n=`expr $n + 1`
902 if [ $ret != 0 ]; then echo_i "failed"; fi
903 status=`expr $status + $ret`
904
905 echo_i "checking secure-to-insecure transition, scheduled ($n)"
906 ret=0
907 file="ns3/`cat del1.key`.key"
908 $SETTIME -I now -D now $file > /dev/null
909 file="ns3/`cat del2.key`.key"
910 $SETTIME -I now -D now $file > /dev/null
911 $RNDCCMD 10.53.0.3 sign secure-to-insecure2.example. 2>&1 | sed 's/^/ns3 /' | cat_i
912 for i in 0 1 2 3 4 5 6 7 8 9; do
913 ret=0
914 $DIG $DIGOPTS axfr secure-to-insecure2.example @10.53.0.3 > dig.out.ns3.test$n || ret=1
915 egrep '(RRSIG|DNSKEY|NSEC3)' dig.out.ns3.test$n > /dev/null && ret=1
916 [ $ret -eq 0 ] && break
917 echo_i "waiting ... ($i)"
918 sleep 2
919 done
920 n=`expr $n + 1`
921 if [ $ret != 0 ]; then echo_i "failed"; fi
922 status=`expr $status + $ret`
923
924 echo_i "checking that serial number and RRSIGs are both updated (rt21045) ($n)"
925 ret=0
926 oldserial=`$DIG $DIGOPTS +short soa prepub.example @10.53.0.3 | awk '$0 !~ /SOA/ {print $3}'`
927 oldinception=`$DIG $DIGOPTS +short soa prepub.example @10.53.0.3 | awk '/SOA/ {print $6}' | sort -u`
928
929 $KEYGEN -a rsasha1 -3 -q -r $RANDFILE -K ns3 -P 0 -A +6d -I +38d -D +45d prepub.example > /dev/null
930
931 $RNDCCMD 10.53.0.3 sign prepub.example 2>&1 | sed 's/^/ns1 /' | cat_i
932 newserial=$oldserial
933 try=0
934 while [ $oldserial -eq $newserial -a $try -lt 42 ]
935 do
936 newserial=`$DIG $DIGOPTS +short soa prepub.example @10.53.0.3 |
937 awk '$0 !~ /SOA/ {print $3}'`
938 sleep 1
939 try=`expr $try + 1`
940 done
941 newinception=`$DIG $DIGOPTS +short soa prepub.example @10.53.0.3 | awk '/SOA/ {print $6}' | sort -u`
942 #echo "$oldserial : $newserial"
943 #echo "$oldinception : $newinception"
944
945 [ "$oldserial" = "$newserial" ] && ret=1
946 [ "$oldinception" = "$newinception" ] && ret=1
947 n=`expr $n + 1`
948 if [ $ret != 0 ]; then echo_i "failed"; fi
949 status=`expr $status + $ret`
950
951 echo_i "preparing to test key change corner cases"
952 echo_i "removing a private key file"
953 file="ns1/`cat vanishing.key`.private"
954 rm -f $file
955
956 echo_i "preparing ZSK roll"
957 starttime=`$PERL -e 'print time(), "\n";'`
958 oldfile=`cat active.key`
959 oldid=`sed 's/^K.+007+0*\([0-9]\)/\1/' < active.key`
960 newfile=`cat standby.key`
961 newid=`sed 's/^K.+007+0*\([0-9]\)/\1/' < standby.key`
962 $SETTIME -K ns1 -I now+2s -D now+25 $oldfile > /dev/null
963 $SETTIME -K ns1 -i 0 -S $oldfile $newfile > /dev/null
964
965 # note previous zone serial number
966 oldserial=`$DIG $DIGOPTS +short soa . @10.53.0.1 | awk '{print $3}'`
967
968 $RNDCCMD 10.53.0.1 loadkeys . 2>&1 | sed 's/^/ns1 /' | cat_i
969 sleep 4
970
971 echo_i "revoking key to duplicated key ID"
972 $SETTIME -R now -K ns2 Kbar.+005+30676.key > /dev/null 2>&1
973
974 $RNDCCMD 10.53.0.2 loadkeys bar. 2>&1 | sed 's/^/ns2 /' | cat_i
975
976 echo_i "waiting for changes to take effect"
977 sleep 5
978
979 echo_i "checking former standby key is now active ($n)"
980 ret=0
981 $DIG $DIGOPTS dnskey . @10.53.0.1 > dig.out.ns1.test$n || ret=1
982 grep 'RRSIG.*'" $newid "'\. ' dig.out.ns1.test$n > /dev/null || ret=1
983 n=`expr $n + 1`
984 if [ $ret != 0 ]; then echo_i "failed"; fi
985 status=`expr $status + $ret`
986
987 echo_i "checking former standby key has only signed incrementally ($n)"
988 ret=0
989 $DIG $DIGOPTS txt . @10.53.0.1 > dig.out.ns1.test$n || ret=1
990 grep 'RRSIG.*'" $newid "'\. ' dig.out.ns1.test$n > /dev/null && ret=1
991 grep 'RRSIG.*'" $oldid "'\. ' dig.out.ns1.test$n > /dev/null || ret=1
992 n=`expr $n + 1`
993 if [ $ret != 0 ]; then echo_i "failed"; fi
994 status=`expr $status + $ret`
995
996 echo_i "checking that signing records have been marked as complete ($n)"
997 ret=0
998 checkprivate . 10.53.0.1 || ret=1
999 checkprivate bar 10.53.0.2 || ret=1
1000 checkprivate example 10.53.0.2 || ret=1
1001 checkprivate private.secure.example 10.53.0.3 || ret=1
1002 checkprivate nsec3.example 10.53.0.3 || ret=1
1003 checkprivate nsec3.nsec3.example 10.53.0.3 || ret=1
1004 checkprivate nsec3.optout.example 10.53.0.3 || ret=1
1005 checkprivate nsec3-to-nsec.example 10.53.0.3 || ret=1
1006 checkprivate nsec.example 10.53.0.3 || ret=1
1007 checkprivate oldsigs.example 10.53.0.3 || ret=1
1008 checkprivate optout.example 10.53.0.3 || ret=1
1009 checkprivate optout.nsec3.example 10.53.0.3 || ret=1
1010 checkprivate optout.optout.example 10.53.0.3 || ret=1
1011 checkprivate prepub.example 10.53.0.3 1 || ret=1
1012 checkprivate rsasha256.example 10.53.0.3 || ret=1
1013 checkprivate rsasha512.example 10.53.0.3 || ret=1
1014 checkprivate secure.example 10.53.0.3 || ret=1
1015 checkprivate secure.nsec3.example 10.53.0.3 || ret=1
1016 checkprivate secure.optout.example 10.53.0.3 || ret=1
1017 checkprivate secure-to-insecure2.example 10.53.0.3 || ret=1
1018 checkprivate secure-to-insecure.example 10.53.0.3 || ret=1
1019 checkprivate ttl1.example 10.53.0.3 || ret=1
1020 checkprivate ttl2.example 10.53.0.3 || ret=1
1021 checkprivate ttl3.example 10.53.0.3 || ret=1
1022 checkprivate ttl4.example 10.53.0.3 || ret=1
1023 n=`expr $n + 1`
1024 status=`expr $status + $ret`
1025
1026 echo_i "forcing full sign"
1027 $RNDCCMD 10.53.0.1 sign . 2>&1 | sed 's/^/ns1 /' | cat_i
1028
1029 echo_i "waiting for change to take effect"
1030 sleep 5
1031
1032 echo_i "checking former standby key has now signed fully ($n)"
1033 ret=0
1034 $DIG $DIGOPTS txt . @10.53.0.1 > dig.out.ns1.test$n || ret=1
1035 grep 'RRSIG.*'" $newid "'\. ' dig.out.ns1.test$n > /dev/null || ret=1
1036 n=`expr $n + 1`
1037 if [ $ret != 0 ]; then echo_i "failed"; fi
1038 status=`expr $status + $ret`
1039
1040 echo_i "checking SOA serial number has been incremented ($n)"
1041 ret=0
1042 newserial=`$DIG $DIGOPTS +short soa . @10.53.0.1 | awk '{print $3}'`
1043 [ "$newserial" != "$oldserial" ] || ret=1
1044 n=`expr $n + 1`
1045 if [ $ret != 0 ]; then echo_i "failed"; fi
1046 status=`expr $status + $ret`
1047
1048 echo_i "checking delayed key publication/activation ($n)"
1049 ret=0
1050 zsk=`cat delayzsk.key`
1051 ksk=`cat delayksk.key`
1052 # publication and activation times should be unset
1053 $SETTIME -K ns3 -pA -pP $zsk | grep -v UNSET > /dev/null 2>&1 && ret=1
1054 $SETTIME -K ns3 -pA -pP $ksk | grep -v UNSET > /dev/null 2>&1 && ret=1
1055 $DIG $DIGOPTS +noall +answer dnskey delay.example. @10.53.0.3 > dig.out.ns3.test$n || ret=1
1056 # DNSKEY not expected:
1057 awk 'BEGIN {r=1} $4=="DNSKEY" {r=0} END {exit r}' dig.out.ns3.test$n && ret=1
1058 n=`expr $n + 1`
1059 if [ $ret != 0 ]; then echo_i "failed"; fi
1060 status=`expr $status + $ret`
1061
1062 echo_i "checking scheduled key publication, not activation ($n)"
1063 ret=0
1064 $SETTIME -K ns3 -P now+3s -A none $zsk > /dev/null 2>&1
1065 $SETTIME -K ns3 -P now+3s -A none $ksk > /dev/null 2>&1
1066 $RNDCCMD 10.53.0.3 loadkeys delay.example. 2>&1 | sed 's/^/ns2 /' | cat_i
1067
1068 echo_i "waiting for changes to take effect"
1069 sleep 5
1070
1071 $DIG $DIGOPTS +noall +answer dnskey delay.example. @10.53.0.3 > dig.out.ns3.test$n || ret=1
1072 # DNSKEY expected:
1073 awk 'BEGIN {r=1} $4=="DNSKEY" {r=0} END {exit r}' dig.out.ns3.test$n || ret=1
1074 # RRSIG not expected:
1075 awk 'BEGIN {r=1} $4=="RRSIG" {r=0} END {exit r}' dig.out.ns3.test$n && ret=1
1076 n=`expr $n + 1`
1077 if [ $ret != 0 ]; then echo_i "failed"; fi
1078 status=`expr $status + $ret`
1079
1080 echo_i "checking scheduled key activation ($n)"
1081 ret=0
1082 $SETTIME -K ns3 -A now+3s $zsk > /dev/null 2>&1
1083 $SETTIME -K ns3 -A now+3s $ksk > /dev/null 2>&1
1084 $RNDCCMD 10.53.0.3 loadkeys delay.example. 2>&1 | sed 's/^/ns2 /' | cat_i
1085
1086 echo_i "waiting for changes to take effect"
1087 sleep 5
1088
1089 $DIG $DIGOPTS +noall +answer dnskey delay.example. @10.53.0.3 > dig.out.ns3.1.test$n || ret=1
1090 # DNSKEY expected:
1091 awk 'BEGIN {r=1} $4=="DNSKEY" {r=0} END {exit r}' dig.out.ns3.1.test$n || ret=1
1092 # RRSIG expected:
1093 awk 'BEGIN {r=1} $4=="RRSIG" {r=0} END {exit r}' dig.out.ns3.1.test$n || ret=1
1094 $DIG $DIGOPTS +noall +answer a a.delay.example. @10.53.0.3 > dig.out.ns3.2.test$n || ret=1
1095 # A expected:
1096 awk 'BEGIN {r=1} $4=="A" {r=0} END {exit r}' dig.out.ns3.2.test$n || ret=1
1097 # RRSIG expected:
1098 awk 'BEGIN {r=1} $4=="RRSIG" {r=0} END {exit r}' dig.out.ns3.2.test$n || ret=1
1099 n=`expr $n + 1`
1100 if [ $ret != 0 ]; then echo_i "failed"; fi
1101 status=`expr $status + $ret`
1102
1103 echo_i "checking former active key was removed ($n)"
1104 #
1105 # Work out how long we need to sleep. Allow 4 seconds for the records
1106 # to be removed.
1107 #
1108 now=`$PERL -e 'print time(), "\n";'`
1109 sleep=`expr $starttime + 29 - $now`
1110 case $sleep in
1111 -*|0);;
1112 *) echo_i "waiting for timer to have activated"; sleep $sleep;;
1113 esac
1114 ret=0
1115 $DIG $DIGOPTS +multi dnskey . @10.53.0.1 > dig.out.ns1.test$n || ret=1
1116 grep '; key id = '"$oldid"'$' dig.out.ns1.test$n > /dev/null && ret=1
1117 n=`expr $n + 1`
1118 if [ $ret != 0 ]; then echo_i "failed"; fi
1119 status=`expr $status + $ret`
1120
1121 echo_i "checking private key file removal caused no immediate harm ($n)"
1122 ret=0
1123 id=`sed 's/^K.+007+0*\([0-9]\)/\1/' < vanishing.key`
1124 $DIG $DIGOPTS dnskey . @10.53.0.1 > dig.out.ns1.test$n || ret=1
1125 grep 'RRSIG.*'" $id "'\. ' dig.out.ns1.test$n > /dev/null || ret=1
1126 n=`expr $n + 1`
1127 if [ $ret != 0 ]; then echo_i "failed"; fi
1128 status=`expr $status + $ret`
1129
1130 echo_i "checking revoked key with duplicate key ID (failure expected) ($n)"
1131 lret=0
1132 id=30676
1133 $DIG $DIGOPTS +multi dnskey bar @10.53.0.2 > dig.out.ns2.test$n || lret=1
1134 grep '; key id = '"$id"'$' dig.out.ns2.test$n > /dev/null || lret=1
1135 $DIG $DIGOPTS dnskey bar @10.53.0.4 > dig.out.ns4.test$n || lret=1
1136 grep "flags:.*ad.*QUERY" dig.out.ns4.test$n > /dev/null || lret=1
1137 n=`expr $n + 1`
1138 if [ $lret != 0 ]; then echo_i "not yet implemented"; fi
1139
1140 echo_i "checking key event timers are always set ($n)"
1141 # this is a regression test for a bug in which the next key event could
1142 # be scheduled for the present moment, and then never fire. check for
1143 # visible evidence of this error in the logs:
1144 awk '/next key event/ {if ($1 == $8 && $2 == $9) exit 1}' */named.run || ret=1
1145 n=`expr $n + 1`
1146 if [ $ret != 0 ]; then echo_i "failed"; fi
1147 status=`expr $status + $ret`
1148
1149 # this confirms that key events are never scheduled more than
1150 # 'dnssec-loadkeys-interval' minutes in the future, and that the
1151 # event scheduled is within 10 seconds of expected interval.
1152 check_interval () {
1153 awk '/next key event/ {print $2 ":" $9}' $1/named.run |
1154 sed 's/\.//g' |
1155 awk -F: '
1156 {
1157 x = ($6+ $5*60000 + $4*3600000) - ($3+ $2*60000 + $1*3600000);
1158 # abs(x) < 1000 ms treat as 'now'
1159 if (x < 1000 && x > -1000)
1160 x = 0;
1161 # convert to seconds
1162 x = x/1000;
1163 # handle end of day roll over
1164 if (x < 0)
1165 x = x + 24*3600;
1166 # handle log timestamp being a few milliseconds later
1167 if (x != int(x))
1168 x = int(x + 1);
1169 if (int(x) > int(interval))
1170 exit (1);
1171 }
1172 END { if (int(x) > int(interval) || int(x) < int(interval-10)) exit(1) }' interval=$2
1173 return $?
1174 }
1175
1176 echo_i "checking automatic key reloading interval ($n)"
1177 ret=0
1178 check_interval ns1 3600 || ret=1
1179 check_interval ns2 1800 || ret=1
1180 check_interval ns3 600 || ret=1
1181 n=`expr $n + 1`
1182 if [ $ret != 0 ]; then echo_i "failed"; fi
1183 status=`expr $status + $ret`
1184
1185 echo_i "checking for key reloading loops ($n)"
1186 ret=0
1187 # every key event should schedule a successor, so these should be equal
1188 rekey_calls=`grep "reconfiguring zone keys" ns*/named.run | wc -l`
1189 rekey_events=`grep "next key event" ns*/named.run | wc -l`
1190 [ "$rekey_calls" = "$rekey_events" ] || ret=1
1191 n=`expr $n + 1`
1192 if [ $ret != 0 ]; then echo_i "failed"; fi
1193 status=`expr $status + $ret`
1194
1195 echo_i "forcing full sign with unreadable keys ($n)"
1196 ret=0
1197 chmod 0 ns1/K.+*+*.key ns1/K.+*+*.private || ret=1
1198 $RNDCCMD 10.53.0.1 sign . 2>&1 | sed 's/^/ns1 /' | cat_i
1199 $DIG $DIGOPTS . @10.53.0.1 dnskey > dig.out.ns1.test$n || ret=1
1200 grep "status: NOERROR" dig.out.ns1.test$n > /dev/null || ret=1
1201 n=`expr $n + 1`
1202 if [ $ret != 0 ]; then echo_i "failed"; fi
1203 status=`expr $status + $ret`
1204
1205 echo_i "test turning on auto-dnssec during reconfig ($n)"
1206 ret=0
1207 # first create a zone that doesn't have auto-dnssec
1208 $RNDCCMD 10.53.0.3 addzone reconf.example '{ type master; file "reconf.example.db"; };' 2>&1 | sed 's/^/ns3 /' | cat_i
1209 rekey_calls=`grep "zone reconf.example.*next key event" ns3/named.run | wc -l`
1210 [ "$rekey_calls" -eq 0 ] || ret=1
1211 # ...then we add auto-dnssec and reconfigure
1212 $RNDCCMD 10.53.0.3 modzone reconf.example '{ type master; file "reconf.example.db"; allow-update { any; }; auto-dnssec maintain; };' 2>&1 | sed 's/^/ns3 /' | cat_i
1213 $RNDCCMD 10.53.0.3 reconfig 2>&1 | sed 's/^/ns3 /' | cat_i
1214 for i in 0 1 2 3 4 5 6 7 8 9; do
1215 lret=0
1216 rekey_calls=`grep "zone reconf.example.*next key event" ns3/named.run | wc -l`
1217 [ "$rekey_calls" -gt 0 ] || lret=1
1218 if [ "$lret" -eq 0 ]; then break; fi
1219 echo_i "waiting ... ($i)"
1220 sleep 1
1221 done
1222 n=`expr $n + 1`
1223 if [ "$lret" != 0 ]; then ret=$lret; fi
1224 if [ $ret != 0 ]; then echo_i "failed"; fi
1225 status=`expr $status + $ret`
1226
1227 echo_i "test CDS and CDNSKEY auto generation ($n)"
1228 ret=0
1229 $DIG $DIGOPTS @10.53.0.3 sync.example cds > dig.out.ns3.cdstest$n
1230 $DIG $DIGOPTS @10.53.0.3 sync.example cdnskey > dig.out.ns3.cdnskeytest$n
1231 grep -i "sync.example.*in.cds.*[1-9][0-9]* " dig.out.ns3.cdstest$n > /dev/null || ret=1
1232 grep -i "sync.example.*in.cdnskey.*257 " dig.out.ns3.cdnskeytest$n > /dev/null || ret=1
1233 n=`expr $n + 1`
1234 if [ "$lret" != 0 ]; then ret=$lret; fi
1235 if [ $ret != 0 ]; then echo_i "failed"; fi
1236 status=`expr $status + $ret`
1237
1238 echo_i "test 'dnssec-dnskey-kskonly no' affects DNSKEY/CDS/CDNSKEY ($n)"
1239 ret=0
1240 $DIG $DIGOPTS @10.53.0.3 sync.example dnskey > dig.out.ns3.dnskeytest$n
1241 $DIG $DIGOPTS @10.53.0.3 sync.example cdnskey > dig.out.ns3.cdnskeytest$n
1242 $DIG $DIGOPTS @10.53.0.3 sync.example cds > dig.out.ns3.cdstest$n
1243 lines=`awk '$4 == "RRSIG" && $5 == "DNSKEY" {print}' dig.out.ns3.dnskeytest$n | wc -l`
1244 test ${lines:-0} -eq 2 || ret=1
1245 lines=`awk '$4 == "RRSIG" && $5 == "CDNSKEY" {print}' dig.out.ns3.cdnskeytest$n | wc -l`
1246 test ${lines:-0} -eq 2 || ret=1
1247 lines=`awk '$4 == "RRSIG" && $5 == "CDS" {print}' dig.out.ns3.cdstest$n | wc -l`
1248 test ${lines:-0} -eq 2 || ret=1
1249 n=`expr $n + 1`
1250 if [ $ret != 0 ]; then echo_i "failed"; fi
1251 status=`expr $status + $ret`
1252
1253 echo_i "test 'dnssec-dnskey-kskonly yes' affects DNSKEY/CDS/CDNSKEY ($n)"
1254 ret=0
1255 $DIG $DIGOPTS @10.53.0.3 kskonly.example dnskey > dig.out.ns3.dnskeytest$n
1256 $DIG $DIGOPTS @10.53.0.3 kskonly.example cdnskey > dig.out.ns3.cdnskeytest$n
1257 $DIG $DIGOPTS @10.53.0.3 kskonly.example cds > dig.out.ns3.cdstest$n
1258 lines=`awk '$4 == "RRSIG" && $5 == "DNSKEY" {print}' dig.out.ns3.dnskeytest$n | wc -l`
1259 test ${lines:-0} -eq 1 || ret=1
1260 lines=`awk '$4 == "RRSIG" && $5 == "CDNSKEY" {print}' dig.out.ns3.cdnskeytest$n | wc -l`
1261 test ${lines:-0} -eq 1 || ret=1
1262 lines=`awk '$4 == "RRSIG" && $5 == "CDS" {print}' dig.out.ns3.cdstest$n | wc -l`
1263 test ${lines:-0} -eq 1 || ret=1
1264 n=`expr $n + 1`
1265 if [ $ret != 0 ]; then echo_i "failed"; fi
1266 status=`expr $status + $ret`
1267
1268 echo_i "setting CDS and CDNSKEY deletion times and calling 'rndc loadkeys'"
1269 $SETTIME -D sync now+2 `cat sync.key` > /dev/null
1270 $RNDCCMD 10.53.0.3 loadkeys sync.example | sed 's/^/ns3 /' | cat_i
1271 echo_i "waiting for deletion to occur"
1272 sleep 3
1273
1274 echo_i "checking that the CDS and CDNSKEY are deleted ($n)"
1275 ret=0
1276 $DIG $DIGOPTS @10.53.0.3 sync.example cds > dig.out.ns3.cdstest$n
1277 $DIG $DIGOPTS @10.53.0.3 sync.example cdnskey > dig.out.ns3.cdnskeytest$n
1278 grep -i "sync.example.*in.cds.*[1-9][0-9]* " dig.out.ns3.cdstest$n > /dev/null && ret=1
1279 grep -i "sync.example.*in.cdnskey.*257 " dig.out.ns3.cdnskeytest$n > /dev/null && ret=1
1280 n=`expr $n + 1`
1281 if [ "$lret" != 0 ]; then ret=$lret; fi
1282 if [ $ret != 0 ]; then echo_i "failed"; fi
1283 status=`expr $status + $ret`
1284
1285 echo_i "check that dnssec-settime -p Dsync works ($n)"
1286 ret=0
1287 $SETTIME -p Dsync `cat sync.key` > settime.out.$n|| ret=0
1288 grep "SYNC Delete:" settime.out.$n >/dev/null || ret=0
1289 n=`expr $n + 1`
1290 if [ "$lret" != 0 ]; then ret=$lret; fi
1291 if [ $ret != 0 ]; then echo_i "failed"; fi
1292 status=`expr $status + $ret`
1293
1294 echo_i "check that dnssec-settime -p Psync works ($n)"
1295 ret=0
1296 $SETTIME -p Psync `cat sync.key` > settime.out.$n|| ret=0
1297 grep "SYNC Publish:" settime.out.$n >/dev/null || ret=0
1298 n=`expr $n + 1`
1299 if [ "$lret" != 0 ]; then ret=$lret; fi
1300 if [ $ret != 0 ]; then echo_i "failed"; fi
1301 status=`expr $status + $ret`
1302
1303 echo_i "check that zone with inactive KSK and active ZSK is properly autosigned ($n)"
1304 ret=0
1305 $DIG $DIGOPTS @10.53.0.3 axfr inacksk2.example > dig.out.ns3.test$n
1306
1307 zskid=`awk '$4 == "DNSKEY" && $5 == 256 { print }' dig.out.ns3.test$n |
1308 $DSFROMKEY -A -2 -f - inacksk2.example | awk '{ print $4}' `
1309 pattern="DNSKEY 7 2 [0-9]* [0-9]* [0-9]* ${zskid} "
1310 grep "${pattern}" dig.out.ns3.test$n > /dev/null || ret=1
1311
1312 kskid=`awk '$4 == "DNSKEY" && $5 == 257 { print }' dig.out.ns3.test$n |
1313 $DSFROMKEY -2 -f - inacksk2.example | awk '{ print $4}' `
1314 pattern="DNSKEY 7 2 [0-9]* [0-9]* [0-9]* ${kskid} "
1315 grep "${pattern}" dig.out.ns3.test$n > /dev/null && ret=1
1316
1317 n=`expr $n + 1`
1318 if [ $ret != 0 ]; then echo_i "failed"; fi
1319 status=`expr $status + $ret`
1320
1321 echo_i "check that zone with inactive ZSK and active KSK is properly autosigned ($n)"
1322 ret=0
1323 $DIG $DIGOPTS @10.53.0.3 axfr inaczsk2.example > dig.out.ns3.test$n
1324 grep "SOA 7 2" dig.out.ns3.test$n > /dev/null || ret=1
1325 n=`expr $n + 1`
1326 if [ $ret != 0 ]; then echo_i "failed"; fi
1327 status=`expr $status + $ret`
1328
1329 #
1330 # Check that DNSKEY is now signed with the ZSK.
1331 #
1332 echo_i "check that zone with active and inactive KSK and active ZSK is properly"
1333 echo_i " resigned after the active KSK is deleted - stage 2: Verify that DNSKEY"
1334 echo_i " is now signed with the ZSK. ($n)"
1335 ret=0
1336
1337 $DIG $DIGOPTS @10.53.0.3 axfr inacksk3.example > dig.out.ns3.test$n
1338
1339 zskid=`awk '$4 == "DNSKEY" && $5 == 256 { print }' dig.out.ns3.test$n |
1340 $DSFROMKEY -A -2 -f - inacksk3.example | awk '{ print $4}' `
1341 pattern="DNSKEY 7 2 [0-9]* [0-9]* [0-9]* ${zskid} "
1342 grep "${pattern}" dig.out.ns3.test$n > /dev/null || ret=1
1343
1344 count=`awk 'BEGIN { count = 0 }
1345 $4 == "RRSIG" && $5 == "DNSKEY" { count++ }
1346 END {print count}' dig.out.ns3.test$n`
1347 test $count -eq 1 || ret=1
1348
1349 count=`awk 'BEGIN { count = 0 }
1350 $4 == "DNSKEY" { count++ }
1351 END {print count}' dig.out.ns3.test$n`
1352 test $count -eq 2 || ret=1
1353
1354 n=`expr $n + 1`
1355 if [ $ret != 0 ]; then echo_i "failed"; fi
1356 status=`expr $status + $ret`
1357
1358 #
1359 # Check that zone is now signed with the KSK.
1360 #
1361 echo_i "check that zone with active and inactive ZSK and active KSK is properly"
1362 echo_i " resigned after the active ZSK is deleted - stage 2: Verify that zone"
1363 echo_i " is now signed with the KSK. ($n)"
1364 ret=0
1365 $DIG $DIGOPTS @10.53.0.3 axfr inaczsk3.example > dig.out.ns3.test$n
1366 kskid=`awk '$4 == "DNSKEY" && $5 == 257 { print }' dig.out.ns3.test$n |
1367 $DSFROMKEY -2 -f - inaczsk3.example | awk '{ print $4}' `
1368 grep "CNAME 7 3 [0-9]* [0-9]* [0-9]* ${kskid} " dig.out.ns3.test$n > /dev/null || ret=1
1369 count=`awk 'BEGIN { count = 0 }
1370 $4 == "RRSIG" && $5 == "CNAME" { count++ }
1371 END {print count}' dig.out.ns3.test$n`
1372 test $count -eq 1 || ret=1
1373 count=`awk 'BEGIN { count = 0 }
1374 $4 == "DNSKEY" { count++ }
1375 END {print count}' dig.out.ns3.test$n`
1376 test $count -eq 2 || ret=1
1377 n=`expr $n + 1`
1378 if [ $ret != 0 ]; then echo_i "failed"; fi
1379 status=`expr $status + $ret`
1380
1381 echo_i "exit status: $status"
1382 [ $status -eq 0 ] || exit 1
1383