Home | History | Annotate | Line # | Download | only in synthfromdnssec
      1      1.1  christos #!/bin/sh
      2  1.1.1.6  christos 
      3      1.1  christos # Copyright (C) Internet Systems Consortium, Inc. ("ISC")
      4      1.1  christos #
      5  1.1.1.6  christos # SPDX-License-Identifier: MPL-2.0
      6  1.1.1.6  christos #
      7      1.1  christos # This Source Code Form is subject to the terms of the Mozilla Public
      8  1.1.1.6  christos # License, v. 2.0.  If a copy of the MPL was not distributed with this
      9  1.1.1.5  christos # file, you can obtain one at https://mozilla.org/MPL/2.0/.
     10      1.1  christos #
     11      1.1  christos # See the COPYRIGHT file distributed with this work for additional
     12      1.1  christos # information regarding copyright ownership.
     13      1.1  christos 
     14  1.1.1.7  christos # set -e
     15  1.1.1.7  christos #
     16  1.1.1.3  christos # shellcheck source=conf.sh
     17  1.1.1.7  christos . ../conf.sh
     18  1.1.1.7  christos 
     19  1.1.1.7  christos RNDCCMD="$RNDC -c ../_common/rndc.conf -p ${CONTROLPORT} -s"
     20  1.1.1.3  christos 
     21  1.1.1.3  christos set -e
     22      1.1  christos 
     23      1.1  christos status=0
     24      1.1  christos n=1
     25  1.1.1.7  christos synth_default=yes
     26      1.1  christos 
     27      1.1  christos rm -f dig.out.*
     28      1.1  christos 
     29  1.1.1.3  christos dig_with_opts() {
     30  1.1.1.7  christos   "$DIG" +tcp +noadd +nosea +nostat +nocmd +dnssec -p "$PORT" "$@"
     31  1.1.1.3  christos }
     32      1.1  christos 
     33  1.1.1.7  christos check_ad_flag() {
     34  1.1.1.7  christos   if [ ${1} = yes ]; then
     35  1.1.1.7  christos     grep "flags:[^;]* ad[^;]*; QUERY" ${2} >/dev/null || return 1
     36  1.1.1.7  christos   else
     37  1.1.1.7  christos     grep "flags:[^;]* ad[^;]*; QUERY" ${2} >/dev/null && return 1
     38  1.1.1.7  christos   fi
     39  1.1.1.7  christos   return 0
     40  1.1.1.7  christos }
     41      1.1  christos 
     42  1.1.1.7  christos check_status() {
     43  1.1.1.7  christos   grep "status: ${1}," ${2} >/dev/null || return 1
     44  1.1.1.7  christos   return 0
     45  1.1.1.7  christos }
     46      1.1  christos 
     47  1.1.1.7  christos check_synth_soa() (
     48  1.1.1.7  christos   name=$(echo "$1" | sed 's/\./\\./g')
     49  1.1.1.7  christos   grep "^${name}.*[0-9]*.IN.SOA" ${2} >/dev/null || return 1
     50  1.1.1.7  christos   grep "^${name}.*3600.IN.SOA" ${2} >/dev/null && return 1
     51  1.1.1.7  christos   return 0
     52  1.1.1.7  christos )
     53  1.1.1.7  christos 
     54  1.1.1.7  christos check_nosynth_soa() (
     55  1.1.1.7  christos   name=$(echo "$1" | sed 's/\./\\./g')
     56  1.1.1.7  christos   grep "^${name}.*3600.IN.SOA" ${2} >/dev/null || return 1
     57  1.1.1.7  christos   return 0
     58  1.1.1.7  christos )
     59  1.1.1.7  christos 
     60  1.1.1.7  christos check_synth_a() (
     61  1.1.1.7  christos   name=$(echo "$1" | sed 's/\./\\./g')
     62  1.1.1.7  christos   grep "^${name}.*[0-9]*.IN.A.[0-2]" ${2} >/dev/null || return 1
     63  1.1.1.7  christos   grep "^${name}.*3600.IN.A.[0-2]" ${2} >/dev/null && return 1
     64  1.1.1.7  christos   return 0
     65  1.1.1.7  christos )
     66  1.1.1.7  christos 
     67  1.1.1.7  christos check_nosynth_a() (
     68  1.1.1.7  christos   name=$(echo "$1" | sed 's/\./\\./g')
     69  1.1.1.7  christos   grep "^${name}.*3600.IN.A.[0-2]" ${2} >/dev/null || return 1
     70  1.1.1.7  christos   return 0
     71  1.1.1.7  christos )
     72  1.1.1.7  christos 
     73  1.1.1.7  christos check_synth_aaaa() (
     74  1.1.1.7  christos   name=$(echo "$1" | sed 's/\./\\./g')
     75  1.1.1.7  christos   grep "^${name}.*[0-9]*.IN.AAAA" ${2} >/dev/null || return 1
     76  1.1.1.7  christos   grep "^${name}.*3600.IN.A" ${2} >/dev/null && return 1
     77  1.1.1.7  christos   return 0
     78  1.1.1.7  christos )
     79  1.1.1.7  christos 
     80  1.1.1.7  christos check_nosynth_aaaa() (
     81  1.1.1.7  christos   name=$(echo "$1" | sed 's/\./\\./g')
     82  1.1.1.7  christos   grep "^${name}.*3600.IN.AAAA" ${2} >/dev/null || return 1
     83  1.1.1.7  christos   return 0
     84  1.1.1.7  christos )
     85  1.1.1.7  christos 
     86  1.1.1.7  christos check_synth_cname() (
     87  1.1.1.7  christos   name=$(echo "$1" | sed 's/\./\\./g')
     88  1.1.1.7  christos   grep "^${name}.*[0-9]*.IN.CNAME" ${2} >/dev/null || return 1
     89  1.1.1.7  christos   grep "^${name}.*3600.IN.CNAME" ${2} >/dev/null && return 1
     90  1.1.1.7  christos   return 0
     91  1.1.1.7  christos )
     92  1.1.1.7  christos 
     93  1.1.1.7  christos check_nosynth_cname() (
     94  1.1.1.7  christos   name=$(echo "$1" | sed 's/\./\\./g')
     95  1.1.1.7  christos   grep "^${name}.*3600.IN.CNAME" ${2} >/dev/null || return 1
     96  1.1.1.7  christos   return 0
     97  1.1.1.7  christos )
     98  1.1.1.7  christos 
     99  1.1.1.7  christos check_auth_count() {
    100  1.1.1.7  christos   grep "AUTHORITY: ${1}," ${2} >/dev/null || return 1
    101  1.1.1.7  christos   return 0
    102  1.1.1.7  christos }
    103  1.1.1.7  christos 
    104  1.1.1.7  christos for ns in 2 4 5 6; do
    105  1.1.1.7  christos   case $ns in
    106  1.1.1.7  christos     2)
    107  1.1.1.7  christos       ad=yes
    108  1.1.1.7  christos       description="<default>"
    109  1.1.1.7  christos       ;;
    110  1.1.1.7  christos     4)
    111  1.1.1.7  christos       ad=yes
    112  1.1.1.7  christos       description="no"
    113  1.1.1.7  christos       ;;
    114  1.1.1.7  christos     5)
    115  1.1.1.7  christos       ad=yes
    116  1.1.1.7  christos       description="yes"
    117  1.1.1.7  christos       ;;
    118  1.1.1.7  christos     6)
    119  1.1.1.7  christos       ad=no
    120  1.1.1.7  christos       description="yes; dnssec-validation no"
    121  1.1.1.7  christos       ;;
    122  1.1.1.7  christos     *) exit 1 ;;
    123  1.1.1.7  christos   esac
    124  1.1.1.7  christos   echo_i "prime negative NXDOMAIN response (synth-from-dnssec ${description};) ($n)"
    125  1.1.1.7  christos   ret=0
    126  1.1.1.7  christos   dig_with_opts a.example. @10.53.0.${ns} a >dig.out.ns${ns}.test$n || ret=1
    127  1.1.1.7  christos   check_ad_flag $ad dig.out.ns${ns}.test$n || ret=1
    128  1.1.1.7  christos   check_status NXDOMAIN dig.out.ns${ns}.test$n || ret=1
    129  1.1.1.7  christos   check_nosynth_soa example. dig.out.ns${ns}.test$n || ret=1
    130  1.1.1.7  christos   [ $ns -eq 2 ] && cp dig.out.ns${ns}.test$n nxdomain.out
    131  1.1.1.7  christos   n=$((n + 1))
    132  1.1.1.7  christos   if [ $ret != 0 ]; then echo_i "failed"; fi
    133  1.1.1.7  christos   status=$((status + ret))
    134  1.1.1.7  christos 
    135  1.1.1.8  christos   echo_i "prime negative NXDOMAIN response no-apex-covering (synth-from-dnssec ${description};) ($n)"
    136  1.1.1.8  christos   ret=0
    137  1.1.1.8  christos   dig_with_opts a.no-apex-covering. @10.53.0.${ns} a >dig.out.ns${ns}.test$n || ret=1
    138  1.1.1.8  christos   check_ad_flag $ad dig.out.ns${ns}.test$n || ret=1
    139  1.1.1.8  christos   check_status NXDOMAIN dig.out.ns${ns}.test$n || ret=1
    140  1.1.1.8  christos   check_nosynth_soa no-apex-covering. dig.out.ns${ns}.test$n || ret=1
    141  1.1.1.8  christos   [ $ns -eq 2 ] && cp dig.out.ns${ns}.test$n no-apex-covering.out
    142  1.1.1.8  christos   n=$((n + 1))
    143  1.1.1.8  christos   if [ $ret != 0 ]; then echo_i "failed"; fi
    144  1.1.1.8  christos   status=$((status + ret))
    145  1.1.1.8  christos 
    146  1.1.1.7  christos   echo_i "prime negative NODATA response (synth-from-dnssec ${description};) ($n)"
    147  1.1.1.7  christos   ret=0
    148  1.1.1.7  christos   dig_with_opts nodata.example. @10.53.0.${ns} a >dig.out.ns${ns}.test$n || ret=1
    149  1.1.1.7  christos   check_ad_flag $ad dig.out.ns${ns}.test$n || ret=1
    150  1.1.1.7  christos   check_status NOERROR dig.out.ns${ns}.test$n || ret=1
    151  1.1.1.7  christos   check_nosynth_soa example. dig.out.ns${ns}.test$n || ret=1
    152  1.1.1.7  christos   [ $ns -eq 2 ] && cp dig.out.ns${ns}.test$n nodata.out
    153  1.1.1.7  christos   n=$((n + 1))
    154  1.1.1.7  christos   if [ $ret != 0 ]; then echo_i "failed"; fi
    155  1.1.1.7  christos   status=$((status + ret))
    156  1.1.1.7  christos 
    157  1.1.1.7  christos   echo_i "prime wildcard response (synth-from-dnssec ${description};) ($n)"
    158  1.1.1.7  christos   ret=0
    159  1.1.1.7  christos   dig_with_opts a.wild-a.example. @10.53.0.${ns} a >dig.out.ns${ns}.test$n || ret=1
    160  1.1.1.7  christos   check_ad_flag $ad dig.out.ns${ns}.test$n || ret=1
    161  1.1.1.7  christos   check_status NOERROR dig.out.ns${ns}.test$n || ret=1
    162  1.1.1.7  christos   check_nosynth_a a.wild-a.example. dig.out.ns${ns}.test$n || ret=1
    163  1.1.1.7  christos   [ $ns -eq 2 ] && sed 's/^a\./b./' dig.out.ns${ns}.test$n >wild.out
    164  1.1.1.7  christos   n=$((n + 1))
    165  1.1.1.7  christos   if [ $ret != 0 ]; then echo_i "failed"; fi
    166  1.1.1.7  christos   status=$((status + ret))
    167  1.1.1.7  christos 
    168  1.1.1.7  christos   echo_i "prime wildcard CNAME response (synth-from-dnssec ${description};) ($n)"
    169  1.1.1.7  christos   ret=0
    170  1.1.1.7  christos   dig_with_opts a.wild-cname.example. @10.53.0.${ns} a >dig.out.ns${ns}.test$n || ret=1
    171  1.1.1.7  christos   check_ad_flag $ad dig.out.ns${ns}.test$n || ret=1
    172  1.1.1.7  christos   check_status NOERROR dig.out.ns${ns}.test$n || ret=1
    173  1.1.1.7  christos   check_nosynth_cname a.wild-cname.example. dig.out.ns${ns}.test$n || ret=1
    174  1.1.1.7  christos   [ $ns -eq 2 ] && sed 's/^a\./b./' dig.out.ns${ns}.test$n >wildcname.out
    175  1.1.1.7  christos   n=$((n + 1))
    176  1.1.1.7  christos   if [ $ret != 0 ]; then echo_i "failed"; fi
    177  1.1.1.7  christos   status=$((status + ret))
    178  1.1.1.7  christos 
    179  1.1.1.7  christos   echo_i "prime wildcard NODATA 1 NSEC response (synth-from-dnssec ${description};) ($n)"
    180  1.1.1.7  christos   ret=0
    181  1.1.1.7  christos   dig_with_opts a.wild-1-nsec.example. @10.53.0.${ns} TXT >dig.out.ns${ns}.test$n || ret=1
    182  1.1.1.7  christos   check_ad_flag $ad dig.out.ns${ns}.test$n || ret=1
    183  1.1.1.7  christos   check_status NOERROR dig.out.ns${ns}.test$n || ret=1
    184  1.1.1.7  christos   check_nosynth_soa example. dig.out.ns${ns}.test$n || ret=1
    185  1.1.1.7  christos   check_auth_count 4 dig.out.ns${ns}.test$n || ret=1
    186  1.1.1.7  christos   [ $ns -eq 2 ] && sed 's/^a\./b./' dig.out.ns${ns}.test$n >wildnodata1nsec.out
    187  1.1.1.7  christos   n=$((n + 1))
    188  1.1.1.7  christos   if [ $ret != 0 ]; then echo_i "failed"; fi
    189  1.1.1.7  christos   status=$((status + ret))
    190  1.1.1.7  christos 
    191  1.1.1.7  christos   echo_i "prime wildcard NODATA 2 NSEC response (synth-from-dnssec ${description};) ($n)"
    192  1.1.1.7  christos   ret=0
    193  1.1.1.7  christos   dig_with_opts a.wild-2-nsec.example. @10.53.0.${ns} TXT >dig.out.ns${ns}.test$n || ret=1
    194  1.1.1.7  christos   check_ad_flag $ad dig.out.ns${ns}.test$n || ret=1
    195  1.1.1.7  christos   check_status NOERROR dig.out.ns${ns}.test$n || ret=1
    196  1.1.1.7  christos   check_nosynth_soa example. dig.out.ns${ns}.test$n || ret=1
    197  1.1.1.7  christos   check_auth_count 6 dig.out.ns${ns}.test$n || ret=1
    198  1.1.1.7  christos   [ $ns -eq 2 ] && sed 's/^a\./b./' dig.out.ns${ns}.test$n >wildnodata2nsec.out
    199  1.1.1.7  christos   n=$((n + 1))
    200  1.1.1.7  christos   if [ $ret != 0 ]; then echo_i "failed"; fi
    201  1.1.1.7  christos   status=$((status + ret))
    202  1.1.1.7  christos 
    203  1.1.1.7  christos   echo_i "prime wildcard NODATA 2 NSEC after data response (synth-from-dnssec ${description};) ($n)"
    204  1.1.1.7  christos   ret=0
    205  1.1.1.7  christos   dig_with_opts a.wild-2-nsec-afterdata.example. @10.53.0.${ns} TXT >dig.out.txt.ns${ns}.test$n || ret=1
    206  1.1.1.7  christos   check_ad_flag $ad dig.out.txt.ns${ns}.test$n || ret=1
    207  1.1.1.7  christos   check_status NOERROR dig.out.txt.ns${ns}.test$n || ret=1
    208  1.1.1.7  christos   check_nosynth_soa example. dig.out.txt.ns${ns}.test$n || ret=1
    209  1.1.1.7  christos   check_auth_count 6 dig.out.txt.ns${ns}.test$n || ret=1
    210  1.1.1.7  christos   [ $ns -eq 2 ] && sed 's/^a\./b./' dig.out.txt.ns${ns}.test$n >wildnodata2nsecafterdata.out
    211  1.1.1.7  christos   n=$((n + 1))
    212  1.1.1.7  christos   if [ $ret != 0 ]; then echo_i "failed"; fi
    213  1.1.1.7  christos   status=$((status + ret))
    214  1.1.1.7  christos 
    215  1.1.1.7  christos   echo_i "prime insecure negative NXDOMAIN response (synth-from-dnssec ${description};) ($n)"
    216  1.1.1.7  christos   ret=0
    217  1.1.1.7  christos   dig_with_opts a.insecure.example. @10.53.0.${ns} a >dig.out.ns${ns}.test$n || ret=1
    218  1.1.1.7  christos   check_ad_flag no dig.out.ns${ns}.test$n || ret=1
    219  1.1.1.7  christos   check_status NXDOMAIN dig.out.ns${ns}.test$n || ret=1
    220  1.1.1.7  christos   check_nosynth_soa insecure.example. dig.out.ns${ns}.test$n || ret=1
    221  1.1.1.7  christos   [ $ns -eq 2 ] && cp dig.out.ns${ns}.test$n insecure.nxdomain.out
    222  1.1.1.7  christos   n=$((n + 1))
    223  1.1.1.7  christos   if [ $ret != 0 ]; then echo_i "failed"; fi
    224  1.1.1.7  christos   status=$((status + ret))
    225  1.1.1.7  christos 
    226  1.1.1.7  christos   echo_i "prime insecure negative NODATA response (synth-from-dnssec ${description};) ($n)"
    227  1.1.1.7  christos   ret=0
    228  1.1.1.7  christos   dig_with_opts nodata.insecure.example. @10.53.0.${ns} a >dig.out.ns${ns}.test$n || ret=1
    229  1.1.1.7  christos   check_ad_flag no dig.out.ns${ns}.test$n || ret=1
    230  1.1.1.7  christos   check_status NOERROR dig.out.ns${ns}.test$n || ret=1
    231  1.1.1.7  christos   check_nosynth_soa insecure.example. dig.out.ns${ns}.test$n || ret=1
    232  1.1.1.7  christos   [ $ns -eq 2 ] && cp dig.out.ns${ns}.test$n insecure.nodata.out
    233  1.1.1.7  christos   n=$((n + 1))
    234  1.1.1.7  christos   if [ $ret != 0 ]; then echo_i "failed"; fi
    235  1.1.1.7  christos   status=$((status + ret))
    236  1.1.1.7  christos 
    237  1.1.1.7  christos   echo_i "prime insecure wildcard response (synth-from-dnssec ${description};) ($n)"
    238  1.1.1.7  christos   ret=0
    239  1.1.1.7  christos   dig_with_opts a.wild-a.insecure.example. @10.53.0.${ns} a >dig.out.ns${ns}.test$n || ret=1
    240  1.1.1.7  christos   check_ad_flag no dig.out.ns${ns}.test$n || ret=1
    241  1.1.1.7  christos   check_status NOERROR dig.out.ns${ns}.test$n || ret=1
    242  1.1.1.7  christos   check_nosynth_a a.wild-a.insecure.example. dig.out.ns${ns}.test$n || ret=1
    243  1.1.1.7  christos   [ $ns -eq 2 ] && sed 's/^a\./b./' dig.out.ns${ns}.test$n >insecure.wild.out
    244  1.1.1.7  christos   n=$((n + 1))
    245  1.1.1.7  christos   if [ $ret != 0 ]; then echo_i "failed"; fi
    246  1.1.1.7  christos   status=$((status + ret))
    247  1.1.1.7  christos 
    248  1.1.1.7  christos   echo_i "prime wildcard CNAME response (synth-from-dnssec ${description};) ($n)"
    249  1.1.1.7  christos   ret=0
    250  1.1.1.7  christos   dig_with_opts a.wild-cname.insecure.example. @10.53.0.${ns} a >dig.out.ns${ns}.test$n || ret=1
    251  1.1.1.7  christos   check_ad_flag no dig.out.ns${ns}.test$n || ret=1
    252  1.1.1.7  christos   check_status NOERROR dig.out.ns${ns}.test$n || ret=1
    253  1.1.1.7  christos   check_nosynth_cname a.wild-cname.insecure.example. dig.out.ns${ns}.test$n || ret=1
    254  1.1.1.7  christos   [ $ns -eq 2 ] && sed 's/^a\./b./' dig.out.ns${ns}.test$n >insecure.wildcname.out
    255  1.1.1.7  christos   n=$((n + 1))
    256  1.1.1.7  christos   if [ $ret != 0 ]; then echo_i "failed"; fi
    257  1.1.1.7  christos   status=$((status + ret))
    258  1.1.1.7  christos 
    259  1.1.1.7  christos   echo_i "prime insecure wildcard NODATA 1 NSEC response (synth-from-dnssec ${description};) ($n)"
    260  1.1.1.7  christos   ret=0
    261  1.1.1.7  christos   dig_with_opts a.wild-1-nsec.insecure.example. @10.53.0.${ns} TXT >dig.out.ns${ns}.test$n || ret=1
    262  1.1.1.7  christos   check_ad_flag no dig.out.ns${ns}.test$n || ret=1
    263  1.1.1.7  christos   check_status NOERROR dig.out.ns${ns}.test$n || ret=1
    264  1.1.1.7  christos   check_nosynth_soa insecure.example. dig.out.ns${ns}.test$n || ret=1
    265  1.1.1.7  christos   check_auth_count 4 dig.out.ns${ns}.test$n || ret=1
    266  1.1.1.7  christos   [ $ns -eq 2 ] && cp dig.out.ns${ns}.test$n insecure.wildnodata1nsec.out
    267  1.1.1.7  christos   n=$((n + 1))
    268  1.1.1.7  christos   if [ $ret != 0 ]; then echo_i "failed"; fi
    269  1.1.1.7  christos   status=$((status + ret))
    270  1.1.1.7  christos 
    271  1.1.1.7  christos   echo_i "prime insecure wildcard NODATA 2 NSEC response (synth-from-dnssec ${description};) ($n)"
    272  1.1.1.7  christos   ret=0
    273  1.1.1.7  christos   dig_with_opts a.wild-2-nsec.insecure.example. @10.53.0.${ns} TXT >dig.out.ns${ns}.test$n || ret=1
    274  1.1.1.7  christos   check_ad_flag no dig.out.ns${ns}.test$n || ret=1
    275  1.1.1.7  christos   check_status NOERROR dig.out.ns${ns}.test$n || ret=1
    276  1.1.1.7  christos   check_nosynth_soa insecure.example. dig.out.ns${ns}.test$n || ret=1
    277  1.1.1.7  christos   check_auth_count 6 dig.out.ns${ns}.test$n || ret=1
    278  1.1.1.7  christos   [ $ns -eq 2 ] && cp dig.out.ns${ns}.test$n insecure.wildnodata2nsec.out
    279  1.1.1.7  christos   n=$((n + 1))
    280  1.1.1.7  christos   if [ $ret != 0 ]; then echo_i "failed"; fi
    281  1.1.1.7  christos   status=$((status + ret))
    282  1.1.1.7  christos 
    283  1.1.1.7  christos   echo_i "prime insecure wildcard NODATA 2 NSEC after data response (synth-from-dnssec ${description};) ($n)"
    284  1.1.1.7  christos   ret=0
    285  1.1.1.7  christos   dig_with_opts a.wild-2-nsec-afterdata.insecure.example. @10.53.0.${ns} TXT >dig.out.txt.ns${ns}.test$n || ret=1
    286  1.1.1.7  christos   check_ad_flag no dig.out.txt.ns${ns}.test$n || ret=1
    287  1.1.1.7  christos   check_status NOERROR dig.out.txt.ns${ns}.test$n || ret=1
    288  1.1.1.7  christos   check_nosynth_soa insecure.example. dig.out.txt.ns${ns}.test$n || ret=1
    289  1.1.1.7  christos   check_auth_count 6 dig.out.txt.ns${ns}.test$n || ret=1
    290  1.1.1.7  christos   [ $ns -eq 2 ] && sed 's/^a\./b./' dig.out.txt.ns${ns}.test$n >insecure.wildnodata2nsecafterdata.out
    291  1.1.1.7  christos   n=$((n + 1))
    292  1.1.1.7  christos   if [ $ret != 0 ]; then echo_i "failed"; fi
    293  1.1.1.7  christos   status=$((status + ret))
    294  1.1.1.7  christos 
    295  1.1.1.7  christos   echo_i "prime minimal NXDOMAIN response (synth-from-dnssec ${description};) ($n)"
    296  1.1.1.7  christos   ret=0
    297  1.1.1.7  christos   dig_with_opts nxdomain.minimal. @10.53.0.${ns} a >dig.out.ns${ns}.test$n || ret=1
    298  1.1.1.7  christos   check_ad_flag $ad dig.out.ns${ns}.test$n || ret=1
    299  1.1.1.7  christos   check_status NXDOMAIN dig.out.ns${ns}.test$n || ret=1
    300  1.1.1.7  christos   check_nosynth_soa minimal. dig.out.ns${ns}.test$n || ret=1
    301  1.1.1.7  christos   grep "nxdomaia.minimal.*3600.IN.NSEC.nxdomaiz.minimal. RRSIG NSEC" dig.out.ns${ns}.test$n >/dev/null || ret=1
    302  1.1.1.7  christos   [ $ns -eq 2 ] && cp dig.out.ns${ns}.test$n minimal.nxdomain.out
    303  1.1.1.7  christos   n=$((n + 1))
    304  1.1.1.7  christos   if [ $ret != 0 ]; then echo_i "failed"; fi
    305  1.1.1.7  christos   status=$((status + ret))
    306  1.1.1.7  christos 
    307  1.1.1.7  christos   echo_i "prime black lie NODATA response (synth-from-dnssec ${description};) ($n)"
    308  1.1.1.7  christos   ret=0
    309  1.1.1.7  christos   dig_with_opts black.minimal. @10.53.0.${ns} a >dig.out.ns${ns}.test$n || ret=1
    310  1.1.1.7  christos   check_ad_flag $ad dig.out.ns${ns}.test$n || ret=1
    311  1.1.1.7  christos   check_status NOERROR dig.out.ns${ns}.test$n || ret=1
    312  1.1.1.7  christos   check_nosynth_soa minimal. dig.out.ns${ns}.test$n || ret=1
    313  1.1.1.7  christos   grep 'black.minimal.*3600.IN.NSEC.\\000.black.minimal. RRSIG NSEC' dig.out.ns${ns}.test$n >/dev/null || ret=1
    314  1.1.1.7  christos   [ $ns -eq 2 ] && cp dig.out.ns${ns}.test$n black.out
    315  1.1.1.7  christos   n=$((n + 1))
    316  1.1.1.7  christos   if [ $ret != 0 ]; then echo_i "failed"; fi
    317  1.1.1.7  christos   status=$((status + ret))
    318  1.1.1.7  christos 
    319  1.1.1.7  christos   echo_i "prime bad type map NODATA response (synth-from-dnssec ${description};) ($n)"
    320  1.1.1.7  christos   ret=0
    321  1.1.1.7  christos   dig_with_opts badtypemap.minimal. @10.53.0.${ns} TXT >dig.out.ns${ns}.test$n || ret=1
    322  1.1.1.7  christos   check_ad_flag $ad dig.out.ns${ns}.test$n || ret=1
    323  1.1.1.7  christos   check_status NOERROR dig.out.ns${ns}.test$n || ret=1
    324  1.1.1.7  christos   check_nosynth_soa minimal. dig.out.ns${ns}.test$n || ret=1
    325  1.1.1.7  christos   grep 'badtypemap.minimal.*3600.IN.NSEC.black.minimal. A$' dig.out.ns${ns}.test$n >/dev/null || ret=1
    326  1.1.1.7  christos   n=$((n + 1))
    327  1.1.1.7  christos   if [ $ret != 0 ]; then echo_i "failed"; fi
    328  1.1.1.7  christos   status=$((status + ret))
    329  1.1.1.7  christos 
    330  1.1.1.7  christos   echo_i "prime SOA without DNSKEY bad type map NODATA response (synth-from-dnssec ${description};) ($n)"
    331  1.1.1.7  christos   ret=0
    332  1.1.1.7  christos   dig_with_opts soa-without-dnskey. @10.53.0.${ns} TXT >dig.out.ns${ns}.test$n || ret=1
    333  1.1.1.7  christos   check_ad_flag $ad dig.out.ns${ns}.test$n || ret=1
    334  1.1.1.7  christos   check_status NOERROR dig.out.ns${ns}.test$n || ret=1
    335  1.1.1.7  christos   check_nosynth_soa soa-without-dnskey. dig.out.ns${ns}.test$n || ret=1
    336  1.1.1.7  christos   grep 'soa-without-dnskey.*3600.IN.NSEC.ns1.soa-without-dnskey. NS SOA RRSIG NSEC$' dig.out.ns${ns}.test$n >/dev/null || ret=1
    337  1.1.1.7  christos   n=$((n + 1))
    338  1.1.1.7  christos   if [ $ret != 0 ]; then echo_i "failed"; fi
    339  1.1.1.7  christos   status=$((status + ret))
    340      1.1  christos 
    341      1.1  christos done
    342      1.1  christos 
    343      1.1  christos echo_i "prime redirect response (+nodnssec) (synth-from-dnssec <default>;) ($n)"
    344      1.1  christos ret=0
    345  1.1.1.7  christos dig_with_opts +nodnssec a.redirect. @10.53.0.3 a >dig.out.ns3.test$n || ret=1
    346  1.1.1.7  christos check_ad_flag no dig.out.ns3.test$n || ret=1
    347  1.1.1.7  christos check_status NOERROR dig.out.ns3.test$n || ret=1
    348  1.1.1.7  christos grep 'a\.redirect\..*300.IN.A.100\.100\.100\.2' dig.out.ns3.test$n >/dev/null || ret=1
    349  1.1.1.7  christos n=$((n + 1))
    350      1.1  christos if [ $ret != 0 ]; then echo_i "failed"; fi
    351  1.1.1.7  christos status=$((status + ret))
    352      1.1  christos 
    353      1.1  christos #
    354      1.1  christos # ensure TTL of synthesised answers differs from direct answers.
    355      1.1  christos #
    356      1.1  christos sleep 1
    357      1.1  christos 
    358  1.1.1.7  christos for ns in 2 4 5 6; do
    359  1.1.1.7  christos   case $ns in
    360  1.1.1.7  christos     2) ad=yes synth=${synth_default} description="<default>" ;;
    361  1.1.1.7  christos     4) ad=yes synth=no description="no" ;;
    362  1.1.1.7  christos     5) ad=yes synth=yes description="yes" ;;
    363  1.1.1.7  christos     6) ad=no synth=no description="yes; dnssec-validation no" ;;
    364  1.1.1.7  christos     *) exit 1 ;;
    365  1.1.1.7  christos   esac
    366  1.1.1.7  christos   echo_i "check synthesized NXDOMAIN response (synth-from-dnssec ${description};) ($n)"
    367  1.1.1.7  christos   ret=0
    368  1.1.1.7  christos   nextpart ns1/named.run >/dev/null
    369  1.1.1.7  christos   dig_with_opts b.example. @10.53.0.${ns} a >dig.out.ns${ns}.test$n || ret=1
    370  1.1.1.7  christos   check_ad_flag $ad dig.out.ns${ns}.test$n || ret=1
    371  1.1.1.7  christos   check_status NXDOMAIN dig.out.ns${ns}.test$n || ret=1
    372  1.1.1.7  christos   if [ ${synth} = yes ]; then
    373  1.1.1.7  christos     check_synth_soa example. dig.out.ns${ns}.test$n || ret=1
    374  1.1.1.7  christos     nextpart ns1/named.run | grep b.example/A >/dev/null && ret=1
    375  1.1.1.7  christos   else
    376  1.1.1.7  christos     check_nosynth_soa example. dig.out.ns${ns}.test$n || ret=1
    377  1.1.1.7  christos     nextpart ns1/named.run | grep b.example/A >/dev/null || ret=1
    378  1.1.1.7  christos   fi
    379  1.1.1.7  christos   digcomp nxdomain.out dig.out.ns${ns}.test$n || ret=1
    380  1.1.1.7  christos   n=$((n + 1))
    381  1.1.1.7  christos   if [ $ret != 0 ]; then echo_i "failed"; fi
    382  1.1.1.7  christos   status=$((status + ret))
    383  1.1.1.7  christos 
    384  1.1.1.8  christos   echo_i "check synthesized NXDOMAIN response no-apex-covering (synth-from-dnssec ${description};) ($n)"
    385  1.1.1.8  christos   ret=0
    386  1.1.1.8  christos   nextpart ns1/named.run >/dev/null
    387  1.1.1.8  christos   dig_with_opts b.no-apex-covering. @10.53.0.${ns} a >dig.out.ns${ns}.test$n || ret=1
    388  1.1.1.8  christos   check_ad_flag $ad dig.out.ns${ns}.test$n || ret=1
    389  1.1.1.8  christos   check_status NXDOMAIN dig.out.ns${ns}.test$n || ret=1
    390  1.1.1.8  christos   if [ ${synth} = yes ]; then
    391  1.1.1.8  christos     check_synth_soa no-apex-covering. dig.out.ns${ns}.test$n || ret=1
    392  1.1.1.8  christos     nextpart ns1/named.run | grep b.no-apex-covering/A >/dev/null && ret=1
    393  1.1.1.8  christos   else
    394  1.1.1.8  christos     check_nosynth_soa no-apex-covering. dig.out.ns${ns}.test$n || ret=1
    395  1.1.1.8  christos     nextpart ns1/named.run | grep b.no-apex-covering/A >/dev/null || ret=1
    396  1.1.1.8  christos   fi
    397  1.1.1.8  christos   digcomp no-apex-covering.out dig.out.ns${ns}.test$n || ret=1
    398  1.1.1.8  christos   n=$((n + 1))
    399  1.1.1.8  christos   if [ $ret != 0 ]; then echo_i "failed"; fi
    400  1.1.1.8  christos   status=$((status + ret))
    401  1.1.1.8  christos 
    402  1.1.1.7  christos   echo_i "check synthesized NODATA response (synth-from-dnssec ${description};) ($n)"
    403  1.1.1.7  christos   ret=0
    404  1.1.1.7  christos   nextpart ns1/named.run >/dev/null
    405  1.1.1.7  christos   dig_with_opts nodata.example. @10.53.0.${ns} aaaa >dig.out.ns${ns}.test$n || ret=1
    406  1.1.1.7  christos   check_ad_flag $ad dig.out.ns${ns}.test$n || ret=1
    407  1.1.1.7  christos   check_status NOERROR dig.out.ns${ns}.test$n || ret=1
    408  1.1.1.7  christos   if [ ${synth} = yes ]; then
    409  1.1.1.7  christos     check_synth_soa example. dig.out.ns${ns}.test$n || ret=1
    410  1.1.1.7  christos     nextpart ns1/named.run | grep nodata.example/AAAA >/dev/null && ret=1
    411  1.1.1.7  christos   else
    412  1.1.1.7  christos     check_nosynth_soa example. dig.out.ns${ns}.test$n || ret=1
    413  1.1.1.7  christos     nextpart ns1/named.run | grep nodata.example/AAAA >/dev/null || ret=1
    414  1.1.1.7  christos   fi
    415  1.1.1.7  christos   digcomp nodata.out dig.out.ns${ns}.test$n || ret=1
    416  1.1.1.7  christos   n=$((n + 1))
    417  1.1.1.7  christos   if [ $ret != 0 ]; then echo_i "failed"; fi
    418  1.1.1.7  christos   status=$((status + ret))
    419  1.1.1.7  christos 
    420  1.1.1.7  christos   echo_i "check synthesized wildcard response (synth-from-dnssec ${description};) ($n)"
    421  1.1.1.7  christos   ret=0
    422  1.1.1.7  christos   nextpart ns1/named.run >/dev/null
    423  1.1.1.7  christos   dig_with_opts b.wild-a.example. @10.53.0.${ns} a >dig.out.ns${ns}.test$n || ret=1
    424  1.1.1.7  christos   check_ad_flag $ad dig.out.ns${ns}.test$n || ret=1
    425  1.1.1.7  christos   check_status NOERROR dig.out.ns${ns}.test$n || ret=1
    426  1.1.1.7  christos   if [ ${synth} = yes ]; then
    427  1.1.1.7  christos     check_synth_a b.wild-a.example. dig.out.ns${ns}.test$n || ret=1
    428  1.1.1.7  christos     nextpart ns1/named.run | grep b.wild-a.example/A >/dev/null && ret=1
    429  1.1.1.7  christos   else
    430  1.1.1.7  christos     check_nosynth_a b.wild-a.example. dig.out.ns${ns}.test$n || ret=1
    431  1.1.1.7  christos     nextpart ns1/named.run | grep b.wild-a.example/A >/dev/null || ret=1
    432  1.1.1.7  christos   fi
    433  1.1.1.7  christos   digcomp wild.out dig.out.ns${ns}.test$n || ret=1
    434  1.1.1.7  christos   n=$((n + 1))
    435  1.1.1.7  christos   if [ $ret != 0 ]; then echo_i "failed"; fi
    436  1.1.1.7  christos   status=$((status + ret))
    437  1.1.1.7  christos 
    438  1.1.1.7  christos   echo_i "check synthesized wildcard CNAME response (synth-from-dnssec ${description};) ($n)"
    439  1.1.1.7  christos   ret=0
    440  1.1.1.7  christos   nextpart ns1/named.run >/dev/null
    441  1.1.1.7  christos   dig_with_opts b.wild-cname.example. @10.53.0.${ns} a >dig.out.ns${ns}.test$n || ret=1
    442  1.1.1.7  christos   check_ad_flag $ad dig.out.ns${ns}.test$n || ret=1
    443  1.1.1.7  christos   check_status NOERROR dig.out.ns${ns}.test$n || ret=1
    444  1.1.1.7  christos   if [ ${synth} = yes ]; then
    445  1.1.1.7  christos     check_synth_cname b.wild-cname.example. dig.out.ns${ns}.test$n || ret=1
    446  1.1.1.7  christos     nextpart ns1/named.run | grep b.wild-cname.example/A >/dev/null && ret=1
    447  1.1.1.7  christos   else
    448  1.1.1.7  christos     check_nosynth_cname b.wild-cname.example. dig.out.ns${ns}.test$n || ret=1
    449  1.1.1.7  christos     nextpart ns1/named.run | grep b.wild-cname.example/A >/dev/null || ret=1
    450  1.1.1.7  christos   fi
    451  1.1.1.7  christos   grep "ns1.example.*.IN.A" dig.out.ns${ns}.test$n >/dev/null || ret=1
    452  1.1.1.7  christos   digcomp wildcname.out dig.out.ns${ns}.test$n || ret=1
    453  1.1.1.7  christos   n=$((n + 1))
    454  1.1.1.7  christos   if [ $ret != 0 ]; then echo_i "failed"; fi
    455  1.1.1.7  christos   status=$((status + ret))
    456  1.1.1.7  christos 
    457  1.1.1.7  christos   echo_i "check synthesized wildcard NODATA 1 NSEC response (synth-from-dnssec ${description};) ($n)"
    458  1.1.1.7  christos   ret=0
    459  1.1.1.7  christos   nextpart ns1/named.run >/dev/null
    460  1.1.1.7  christos   dig_with_opts b.wild-1-nsec.example. @10.53.0.${ns} AAAA >dig.out.ns${ns}.test$n || ret=1
    461  1.1.1.7  christos   check_ad_flag $ad dig.out.ns${ns}.test$n || ret=1
    462  1.1.1.7  christos   check_status NOERROR dig.out.ns${ns}.test$n || ret=1
    463  1.1.1.7  christos   if [ ${synth} = yes ]; then
    464  1.1.1.7  christos     check_synth_soa example. dig.out.ns${ns}.test$n || ret=1
    465  1.1.1.7  christos     nextpart ns1/named.run | grep b.wild-1-nsec.example/AAAA >/dev/null && ret=1
    466  1.1.1.7  christos   else
    467  1.1.1.7  christos     check_nosynth_soa example. dig.out.ns${ns}.test$n || ret=1
    468  1.1.1.7  christos     nextpart ns1/named.run | grep b.wild-1-nsec.example/AAAA >/dev/null || ret=1
    469  1.1.1.7  christos   fi
    470  1.1.1.7  christos   digcomp wildnodata1nsec.out dig.out.ns${ns}.test$n || ret=1
    471  1.1.1.7  christos   n=$((n + 1))
    472  1.1.1.7  christos   if [ $ret != 0 ]; then echo_i "failed"; fi
    473  1.1.1.7  christos   status=$((status + ret))
    474  1.1.1.7  christos 
    475  1.1.1.7  christos   echo_i "check synthesized wildcard NODATA 2 NSEC response (synth-from-dnssec ${description};) ($n)"
    476  1.1.1.7  christos   ret=0
    477  1.1.1.7  christos   nextpart ns1/named.run >/dev/null
    478  1.1.1.7  christos   dig_with_opts b.wild-2-nsec.example. @10.53.0.${ns} AAAA >dig.out.ns${ns}.test$n || ret=1
    479  1.1.1.7  christos   check_ad_flag $ad dig.out.ns${ns}.test$n || ret=1
    480  1.1.1.7  christos   check_status NOERROR dig.out.ns${ns}.test$n || ret=1
    481  1.1.1.7  christos   if [ ${synth} = yes ]; then
    482  1.1.1.7  christos     check_synth_soa example. dig.out.ns${ns}.test$n || ret=1
    483  1.1.1.7  christos     nextpart ns1/named.run | grep b.wild-2-nsec.example/AAAA >/dev/null && ret=1
    484  1.1.1.7  christos   else
    485  1.1.1.7  christos     check_nosynth_soa example. dig.out.ns${ns}.test$n || ret=1
    486  1.1.1.7  christos     nextpart ns1/named.run | grep b.wild-2-nsec.example/AAAA >/dev/null || ret=1
    487  1.1.1.7  christos   fi
    488  1.1.1.7  christos   digcomp wildnodata2nsec.out dig.out.ns${ns}.test$n || ret=1
    489  1.1.1.7  christos   n=$((n + 1))
    490  1.1.1.7  christos   if [ $ret != 0 ]; then echo_i "failed"; fi
    491  1.1.1.7  christos   status=$((status + ret))
    492  1.1.1.7  christos 
    493  1.1.1.7  christos   echo_i "check synthesized wildcard NODATA 2 NSEC after data response (synth-from-dnssec ${description};) ($n)"
    494  1.1.1.7  christos   ret=0
    495  1.1.1.7  christos   # Use AAAA to avoid cached qname minimisation _.wild-2-nsec-afterdata.example A record
    496  1.1.1.7  christos   dig_with_opts b.wild-2-nsec-afterdata.example. @10.53.0.${ns} AAAA >dig.out.a.ns${ns}.test$n || ret=1
    497  1.1.1.7  christos   check_ad_flag $ad dig.out.a.ns${ns}.test$n || ret=1
    498  1.1.1.7  christos   check_status NOERROR dig.out.a.ns${ns}.test$n || ret=1
    499  1.1.1.7  christos   check_nosynth_aaaa b.wild-2-nsec-afterdata.example. dig.out.a.ns${ns}.test$n || ret=1
    500  1.1.1.7  christos   #
    501  1.1.1.7  christos   nextpart ns1/named.run >/dev/null
    502  1.1.1.7  christos   dig_with_opts b.wild-2-nsec-afterdata.example. @10.53.0.${ns} TLSA >dig.out.ns${ns}.test$n || ret=1
    503  1.1.1.7  christos   check_ad_flag $ad dig.out.ns${ns}.test$n || ret=1
    504  1.1.1.7  christos   check_status NOERROR dig.out.ns${ns}.test$n || ret=1
    505  1.1.1.7  christos   if [ ${synth} = yes ]; then
    506  1.1.1.7  christos     check_synth_soa example. dig.out.ns${ns}.test$n || ret=1
    507  1.1.1.7  christos     nextpart ns1/named.run | grep b.wild-2-nsec-afterdata.example/TLSA >/dev/null && ret=1
    508  1.1.1.7  christos   else
    509  1.1.1.7  christos     check_nosynth_soa example. dig.out.ns${ns}.test$n || ret=1
    510  1.1.1.7  christos     nextpart ns1/named.run | grep b.wild-2-nsec-afterdata.example/TLSA >/dev/null || ret=1
    511  1.1.1.7  christos   fi
    512  1.1.1.7  christos   digcomp wildnodata2nsecafterdata.out dig.out.ns${ns}.test$n || ret=1
    513  1.1.1.7  christos   n=$((n + 1))
    514  1.1.1.7  christos   if [ $ret != 0 ]; then echo_i "failed"; fi
    515  1.1.1.7  christos   status=$((status + ret))
    516  1.1.1.7  christos 
    517  1.1.1.7  christos   echo_i "check insecure NXDOMAIN response (synth-from-dnssec ${description};) ($n)"
    518  1.1.1.7  christos   ret=0
    519  1.1.1.7  christos   nextpart ns1/named.run >/dev/null
    520  1.1.1.7  christos   dig_with_opts b.insecure.example. @10.53.0.${ns} a >dig.out.ns${ns}.test$n || ret=1
    521  1.1.1.7  christos   check_ad_flag no dig.out.ns${ns}.test$n || ret=1
    522  1.1.1.7  christos   check_status NXDOMAIN dig.out.ns${ns}.test$n || ret=1
    523  1.1.1.7  christos   check_nosynth_soa insecure.example. dig.out.ns${ns}.test$n || ret=1
    524  1.1.1.7  christos   nextpart ns1/named.run | grep b.insecure.example/A >/dev/null || ret=1
    525  1.1.1.7  christos   digcomp insecure.nxdomain.out dig.out.ns${ns}.test$n || ret=1
    526  1.1.1.7  christos   n=$((n + 1))
    527  1.1.1.7  christos   if [ $ret != 0 ]; then echo_i "failed"; fi
    528  1.1.1.7  christos   status=$((status + ret))
    529  1.1.1.7  christos 
    530  1.1.1.7  christos   echo_i "check insecure NODATA response (synth-from-dnssec ${description};) ($n)"
    531  1.1.1.7  christos   ret=0
    532  1.1.1.7  christos   nextpart ns1/named.run >/dev/null
    533  1.1.1.7  christos   dig_with_opts nodata.insecure.example. @10.53.0.${ns} aaaa >dig.out.ns${ns}.test$n || ret=1
    534  1.1.1.7  christos   check_ad_flag no dig.out.ns${ns}.test$n || ret=1
    535  1.1.1.7  christos   check_status NOERROR dig.out.ns${ns}.test$n || ret=1
    536  1.1.1.7  christos   check_nosynth_soa insecure.example. dig.out.ns${ns}.test$n || ret=1
    537  1.1.1.7  christos   nextpart ns1/named.run | grep nodata.insecure.example/AAAA >/dev/null || ret=1
    538  1.1.1.7  christos   digcomp insecure.nodata.out dig.out.ns${ns}.test$n || ret=1
    539  1.1.1.7  christos   n=$((n + 1))
    540  1.1.1.7  christos   if [ $ret != 0 ]; then echo_i "failed"; fi
    541  1.1.1.7  christos   status=$((status + ret))
    542  1.1.1.7  christos 
    543  1.1.1.7  christos   echo_i "check insecure wildcard response (synth-from-dnssec ${description};) ($n)"
    544  1.1.1.7  christos   ret=0
    545  1.1.1.7  christos   nextpart ns1/named.run >/dev/null
    546  1.1.1.7  christos   dig_with_opts b.wild-a.insecure.example. @10.53.0.${ns} a >dig.out.ns${ns}.test$n || ret=1
    547  1.1.1.7  christos   check_ad_flag no dig.out.ns${ns}.test$n || ret=1
    548  1.1.1.7  christos   check_status NOERROR dig.out.ns${ns}.test$n || ret=1
    549  1.1.1.7  christos   grep "b\.wild-a\.insecure\.example\..*3600.IN.A" dig.out.ns${ns}.test$n >/dev/null || ret=1
    550  1.1.1.7  christos   nextpart ns1/named.run | grep b.wild-a.insecure.example/A >/dev/null || ret=1
    551  1.1.1.7  christos   digcomp insecure.wild.out dig.out.ns${ns}.test$n || ret=1
    552  1.1.1.7  christos   n=$((n + 1))
    553  1.1.1.7  christos   if [ $ret != 0 ]; then echo_i "failed"; fi
    554  1.1.1.7  christos   status=$((status + ret))
    555  1.1.1.7  christos 
    556  1.1.1.7  christos   echo_i "check insecure wildcard CNAME response (synth-from-dnssec ${description};) ($n)"
    557  1.1.1.7  christos   ret=0
    558  1.1.1.7  christos   nextpart ns1/named.run >/dev/null
    559  1.1.1.7  christos   dig_with_opts b.wild-cname.insecure.example. @10.53.0.${ns} a >dig.out.ns${ns}.test$n || ret=1
    560  1.1.1.7  christos   check_ad_flag no dig.out.ns${ns}.test$n || ret=1
    561  1.1.1.7  christos   check_status NOERROR dig.out.ns${ns}.test$n || ret=1
    562  1.1.1.7  christos   check_nosynth_cname b.wild-cname.insecure.example dig.out.ns${ns}.test$n || ret=1
    563  1.1.1.7  christos   nextpart ns1/named.run | grep b.wild-cname.insecure.example/A >/dev/null || ret=1
    564  1.1.1.7  christos   grep "ns1.insecure.example.*.IN.A" dig.out.ns${ns}.test$n >/dev/null || ret=1
    565  1.1.1.7  christos   digcomp insecure.wildcname.out dig.out.ns${ns}.test$n || ret=1
    566  1.1.1.7  christos   n=$((n + 1))
    567  1.1.1.7  christos   if [ $ret != 0 ]; then echo_i "failed"; fi
    568  1.1.1.7  christos   status=$((status + ret))
    569  1.1.1.7  christos 
    570  1.1.1.7  christos   echo_i "check insecure wildcard NODATA 1 NSEC response (synth-from-dnssec ${description};) ($n)"
    571  1.1.1.7  christos   ret=0
    572  1.1.1.7  christos   nextpart ns1/named.run >/dev/null
    573  1.1.1.7  christos   dig_with_opts b.wild-1-nsec.insecure.example. @10.53.0.${ns} AAAA >dig.out.ns${ns}.test$n || ret=1
    574  1.1.1.7  christos   check_ad_flag no dig.out.ns${ns}.test$n || ret=1
    575  1.1.1.7  christos   check_status NOERROR dig.out.ns${ns}.test$n || ret=1
    576  1.1.1.7  christos   check_nosynth_soa insecure.example. dig.out.ns${ns}.test$n || ret=1
    577  1.1.1.7  christos   digcomp insecure.wildnodata1nsec.out dig.out.ns${ns}.test$n || ret=1
    578  1.1.1.7  christos   n=$((n + 1))
    579  1.1.1.7  christos   if [ $ret != 0 ]; then echo_i "failed"; fi
    580  1.1.1.7  christos   status=$((status + ret))
    581  1.1.1.7  christos 
    582  1.1.1.7  christos   echo_i "check insecure wildcard NODATA 2 NSEC response (synth-from-dnssec ${description};) ($n)"
    583  1.1.1.7  christos   ret=0
    584  1.1.1.7  christos   nextpart ns1/named.run >/dev/null
    585  1.1.1.7  christos   dig_with_opts b.wild-2-nsec.insecure.example. @10.53.0.${ns} AAAA >dig.out.ns${ns}.test$n || ret=1
    586  1.1.1.7  christos   check_ad_flag no dig.out.ns${ns}.test$n || ret=1
    587  1.1.1.7  christos   check_status NOERROR dig.out.ns${ns}.test$n || ret=1
    588  1.1.1.7  christos   check_nosynth_soa insecure.example. dig.out.ns${ns}.test$n || ret=1
    589  1.1.1.7  christos   digcomp insecure.wildnodata2nsec.out dig.out.ns${ns}.test$n || ret=1
    590  1.1.1.7  christos   n=$((n + 1))
    591  1.1.1.7  christos   if [ $ret != 0 ]; then echo_i "failed"; fi
    592  1.1.1.7  christos   status=$((status + ret))
    593  1.1.1.7  christos 
    594  1.1.1.7  christos   echo_i "check insecure wildcard NODATA 2 NSEC after data response (synth-from-dnssec ${description};) ($n)"
    595  1.1.1.7  christos   ret=0
    596  1.1.1.7  christos   nextpart ns1/named.run >/dev/null
    597  1.1.1.7  christos   dig_with_opts b.wild-2-nsec-afterdata.insecure.example. @10.53.0.${ns} AAAA >dig.out.a.ns${ns}.test$n || ret=1
    598  1.1.1.7  christos   check_ad_flag no dig.out.a.ns${ns}.test$n || ret=1
    599  1.1.1.7  christos   check_status NOERROR dig.out.a.ns${ns}.test$n || ret=1
    600  1.1.1.7  christos   check_nosynth_aaaa b.wild-2-nsec-afterdata.insecure.example. dig.out.a.ns${ns}.test$n || ret=1
    601  1.1.1.7  christos   #
    602  1.1.1.7  christos   dig_with_opts b.wild-2-nsec-afterdata.insecure.example. @10.53.0.${ns} TLSA >dig.out.ns${ns}.test$n || ret=1
    603  1.1.1.7  christos   check_ad_flag no dig.out.ns${ns}.test$n || ret=1
    604  1.1.1.7  christos   check_status NOERROR dig.out.ns${ns}.test$n || ret=1
    605  1.1.1.7  christos   check_nosynth_soa insecure.example. dig.out.ns${ns}.test$n || ret=1
    606  1.1.1.7  christos   digcomp insecure.wildnodata2nsecafterdata.out dig.out.ns${ns}.test$n || ret=1
    607  1.1.1.7  christos   n=$((n + 1))
    608  1.1.1.7  christos   if [ $ret != 0 ]; then echo_i "failed"; fi
    609  1.1.1.7  christos   status=$((status + ret))
    610  1.1.1.7  christos 
    611  1.1.1.7  christos   echo_i "check minimal NXDOMAIN response (synth-from-dnssec ${description};) ($n)"
    612  1.1.1.7  christos   ret=0
    613  1.1.1.7  christos   nextpart ns1/named.run >/dev/null
    614  1.1.1.7  christos   dig_with_opts nxdomaic.minimal. @10.53.0.${ns} a >dig.out.ns${ns}.test$n || ret=1
    615  1.1.1.7  christos   check_ad_flag $ad dig.out.ns${ns}.test$n || ret=1
    616  1.1.1.7  christos   check_status NXDOMAIN dig.out.ns${ns}.test$n || ret=1
    617  1.1.1.7  christos   check_nosynth_soa minimal. dig.out.ns${ns}.test$n || ret=1
    618  1.1.1.7  christos   nextpart ns1/named.run | grep nxdomaic.minimal/A >/dev/null || ret=1
    619  1.1.1.7  christos   digcomp minimal.nxdomain.out dig.out.ns${ns}.test$n || ret=1
    620  1.1.1.7  christos   n=$((n + 1))
    621  1.1.1.7  christos   if [ $ret != 0 ]; then echo_i "failed"; fi
    622  1.1.1.7  christos   status=$((status + ret))
    623  1.1.1.7  christos 
    624  1.1.1.7  christos   echo_i "check black lie NODATA response (synth-from-dnssec ${description};) ($n)"
    625  1.1.1.7  christos   ret=0
    626  1.1.1.7  christos   nextpart ns1/named.run >/dev/null
    627  1.1.1.7  christos   dig_with_opts black.minimal. @10.53.0.${ns} aaaa >dig.out.ns${ns}.test$n || ret=1
    628  1.1.1.7  christos   check_ad_flag $ad dig.out.ns${ns}.test$n || ret=1
    629  1.1.1.7  christos   check_status NOERROR dig.out.ns${ns}.test$n || ret=1
    630  1.1.1.7  christos   check_nosynth_soa minimal. dig.out.ns${ns}.test$n || ret=1
    631  1.1.1.7  christos   nextpart ns1/named.run | grep black.minimal/AAAA >/dev/null || ret=1
    632  1.1.1.7  christos   digcomp black.out dig.out.ns${ns}.test$n || ret=1
    633  1.1.1.7  christos   n=$((n + 1))
    634  1.1.1.7  christos   if [ $ret != 0 ]; then echo_i "failed"; fi
    635  1.1.1.7  christos   status=$((status + ret))
    636  1.1.1.7  christos 
    637  1.1.1.7  christos   echo_i "check bad type map NODATA response (synth-from-dnssec ${description};) ($n)"
    638  1.1.1.7  christos   ret=0
    639  1.1.1.7  christos   dig_with_opts badtypemap.minimal. @10.53.0.${ns} HINFO >dig.out.ns${ns}.test$n || ret=1
    640  1.1.1.7  christos   check_ad_flag $ad dig.out.ns${ns}.test$n || ret=1
    641  1.1.1.7  christos   check_status NOERROR dig.out.ns${ns}.test$n || ret=1
    642  1.1.1.7  christos   check_nosynth_soa minimal. dig.out.ns${ns}.test$n || ret=1
    643  1.1.1.7  christos   grep 'badtypemap.minimal.*3600.IN.NSEC.black.minimal. A$' dig.out.ns${ns}.test$n >/dev/null || ret=1
    644  1.1.1.7  christos   n=$((n + 1))
    645  1.1.1.7  christos   if [ $ret != 0 ]; then echo_i "failed"; fi
    646  1.1.1.7  christos   status=$((status + ret))
    647  1.1.1.7  christos 
    648  1.1.1.7  christos   echo_i "check bad type map NODATA response with existent data (synth-from-dnssec ${description};) ($n)"
    649  1.1.1.7  christos   ret=0
    650  1.1.1.7  christos   dig_with_opts badtypemap.minimal. @10.53.0.${ns} AAAA >dig.out.ns${ns}.test$n || ret=1
    651  1.1.1.7  christos   check_ad_flag $ad dig.out.ns${ns}.test$n || ret=1
    652  1.1.1.7  christos   check_status NOERROR dig.out.ns${ns}.test$n || ret=1
    653  1.1.1.7  christos   check_nosynth_aaaa badtypemap.minimal. dig.out.ns${ns}.test$n || ret=1
    654  1.1.1.7  christos   n=$((n + 1))
    655  1.1.1.7  christos   if [ $ret != 0 ]; then echo_i "failed"; fi
    656  1.1.1.7  christos   status=$((status + ret))
    657  1.1.1.7  christos 
    658  1.1.1.7  christos   echo_i "check SOA without DNSKEY bad type map NODATA response (synth-from-dnssec ${description};) ($n)"
    659  1.1.1.7  christos   ret=0
    660  1.1.1.7  christos   dig_with_opts soa-without-dnskey. @10.53.0.${ns} A >dig.out.ns${ns}.test$n || ret=1
    661  1.1.1.7  christos   check_ad_flag $ad dig.out.ns${ns}.test$n || ret=1
    662  1.1.1.7  christos   check_status NOERROR dig.out.ns${ns}.test$n || ret=1
    663  1.1.1.7  christos   check_nosynth_soa soa-without-dnskey. dig.out.ns${ns}.test$n || ret=1
    664  1.1.1.7  christos   grep 'soa-without-dnskey.*3600.IN.NSEC.ns1.soa-without-dnskey. NS SOA RRSIG NSEC$' dig.out.ns${ns}.test$n >/dev/null || ret=1
    665  1.1.1.7  christos   n=$((n + 1))
    666  1.1.1.7  christos   if [ $ret != 0 ]; then echo_i "failed"; fi
    667  1.1.1.7  christos   status=$((status + ret))
    668  1.1.1.7  christos 
    669  1.1.1.7  christos   echo_i "check 'rndc stats' output for 'covering nsec returned' (synth-from-dnssec ${description};) ($n)"
    670  1.1.1.7  christos   ret=0
    671  1.1.1.7  christos   ${RNDCCMD} 10.53.0.${ns} stats 2>&1 | sed 's/^/ns6 /' | cat_i
    672  1.1.1.7  christos   # 2 views, _bind should always be '0 covering nsec returned'
    673  1.1.1.7  christos   count=$(grep "covering nsec returned" ns${ns}/named.stats | wc -l)
    674  1.1.1.7  christos   test $count = 2 || ret=1
    675  1.1.1.7  christos   zero=$(grep " 0 covering nsec returned" ns${ns}/named.stats | wc -l)
    676  1.1.1.7  christos   if [ ${synth} = yes ]; then
    677  1.1.1.7  christos     test $zero = 1 || ret=1
    678  1.1.1.7  christos   else
    679  1.1.1.7  christos     test $zero = 2 || ret=1
    680  1.1.1.7  christos   fi
    681  1.1.1.7  christos   n=$((n + 1))
    682  1.1.1.7  christos   if [ $ret != 0 ]; then echo_i "failed"; fi
    683  1.1.1.7  christos   status=$((status + ret))
    684  1.1.1.7  christos 
    685  1.1.1.7  christos   echo_i "check 'rndc stats' output for 'cache NSEC auxiliary database nodes' (synth-from-dnssec ${description};) ($n)"
    686  1.1.1.7  christos   ret=0
    687  1.1.1.7  christos   # 2 views, _bind should always be '0 cache NSEC auxiliary database nodes'
    688  1.1.1.7  christos   count=$(grep "cache NSEC auxiliary database nodes" ns${ns}/named.stats | wc -l)
    689  1.1.1.7  christos   test $count = 2 || ret=1
    690  1.1.1.7  christos   zero=$(grep "0 cache NSEC auxiliary database nodes" ns${ns}/named.stats | wc -l)
    691  1.1.1.7  christos   if [ ${ad} = yes ]; then
    692  1.1.1.7  christos     test $zero = 1 || ret=1
    693  1.1.1.7  christos   else
    694  1.1.1.7  christos     test $zero = 2 || ret=1
    695  1.1.1.7  christos   fi
    696  1.1.1.7  christos   n=$((n + 1))
    697  1.1.1.7  christos   if [ $ret != 0 ]; then echo_i "failed"; fi
    698  1.1.1.7  christos   status=$((status + ret))
    699  1.1.1.7  christos 
    700  1.1.1.7  christos   for synthesized in NXDOMAIN no-data wildcard; do
    701  1.1.1.7  christos     case $synthesized in
    702  1.1.1.8  christos       NXDOMAIN) count=2 ;;
    703  1.1.1.7  christos       no-data) count=4 ;;
    704  1.1.1.7  christos       wildcard) count=2 ;;
    705      1.1  christos     esac
    706  1.1.1.7  christos     echo_i "check 'rndc stats' output for 'synthesized a ${synthesized} response' (synth-from-dnssec ${description};) ($n)"
    707  1.1.1.7  christos     ret=0
    708  1.1.1.7  christos     if [ ${synth} = yes ]; then
    709  1.1.1.7  christos       grep "$count synthesized a ${synthesized} response" ns${ns}/named.stats >/dev/null || ret=1
    710  1.1.1.7  christos     else
    711  1.1.1.7  christos       grep "synthesized a ${synthesized} response" ns${ns}/named.stats >/dev/null && ret=1
    712  1.1.1.7  christos     fi
    713  1.1.1.7  christos     n=$((n + 1))
    714  1.1.1.7  christos     if [ $ret != 0 ]; then echo_i "failed"; fi
    715  1.1.1.7  christos     status=$((status + ret))
    716  1.1.1.7  christos   done
    717  1.1.1.7  christos 
    718  1.1.1.8  christos   if ${FEATURETEST} --have-libxml2 && [ -x "${CURL}" ] && [ -x "${XMLLINT}" ]; then
    719  1.1.1.7  christos     echo_i "getting XML statisistcs for (synth-from-dnssec ${description};) ($n)"
    720      1.1  christos     ret=0
    721  1.1.1.7  christos     xml=xml.out$n
    722  1.1.1.7  christos     ${CURL} http://10.53.0.${ns}:${EXTRAPORT1}/xml/v3/server >$xml 2>/dev/null || ret=1
    723  1.1.1.7  christos     n=$((n + 1))
    724  1.1.1.7  christos     if [ $ret != 0 ]; then echo_i "failed"; fi
    725  1.1.1.7  christos     status=$((status + ret))
    726  1.1.1.7  christos 
    727  1.1.1.7  christos     echo_i "check XML for 'CoveringNSEC' with (synth-from-dnssec ${description};) ($n)"
    728  1.1.1.7  christos     ret=0
    729  1.1.1.8  christos     count=$("${XMLLINT}" --xpath 'count(/statistics/views/view[@name="_default"]/counters[@type="cachestats"]/counter[@name="CoveringNSEC"])' $xml)
    730  1.1.1.7  christos     test $count = 1 || ret=1
    731  1.1.1.8  christos     zero=$("${XMLLINT}" --xpath 'count(/statistics/views/view[@name="_default"]/counters[@type="cachestats"]/counter[@name="CoveringNSEC" and text()="0"])' $xml)
    732  1.1.1.7  christos     if [ ${synth} = yes ]; then
    733  1.1.1.7  christos       test $zero = 0 || ret=1
    734      1.1  christos     else
    735  1.1.1.7  christos       test $zero = 1 || ret=1
    736      1.1  christos     fi
    737  1.1.1.7  christos     n=$((n + 1))
    738      1.1  christos     if [ $ret != 0 ]; then echo_i "failed"; fi
    739  1.1.1.7  christos     status=$((status + ret))
    740      1.1  christos 
    741  1.1.1.7  christos     echo_i "check XML for 'CacheNSECNodes' with (synth-from-dnssec ${description};) ($n)"
    742      1.1  christos     ret=0
    743  1.1.1.8  christos     count=$("${XMLLINT}" --xpath 'count(/statistics/views/view[@name="_default"]/counters[@type="cachestats"]/counter[@name="CacheNSECNodes"])' $xml)
    744  1.1.1.7  christos     test $count = 1 || ret=1
    745  1.1.1.8  christos     zero=$("${XMLLINT}" --xpath 'count(/statistics/views/view[@name="_default"]/counters[@type="cachestats"]/counter[@name="CacheNSECNodes" and text()="0"])' $xml)
    746  1.1.1.7  christos     if [ ${ad} = yes ]; then
    747  1.1.1.7  christos       test $zero = 0 || ret=1
    748      1.1  christos     else
    749  1.1.1.7  christos       test $zero = 1 || ret=1
    750      1.1  christos     fi
    751  1.1.1.7  christos     n=$((n + 1))
    752  1.1.1.7  christos     if [ $ret != 0 ]; then echo_i "failed"; fi
    753  1.1.1.7  christos     status=$((status + ret))
    754  1.1.1.7  christos 
    755  1.1.1.7  christos     for synthesized in SynthNXDOMAIN SynthNODATA SynthWILDCARD; do
    756  1.1.1.7  christos       case $synthesized in
    757  1.1.1.8  christos         SynthNXDOMAIN) count=2 ;;
    758  1.1.1.7  christos         SynthNODATA) count=4 ;;
    759  1.1.1.7  christos         SynthWILDCARD) count=2 ;;
    760  1.1.1.7  christos       esac
    761  1.1.1.7  christos 
    762  1.1.1.7  christos       echo_i "check XML for '$synthesized}' with (synth-from-dnssec ${description};) ($n)"
    763  1.1.1.7  christos       ret=0
    764  1.1.1.8  christos       if [ ${synth} != yes ]; then
    765  1.1.1.8  christos         count=0
    766  1.1.1.7  christos       fi
    767  1.1.1.8  christos       test $("${XMLLINT}" --xpath '/statistics/server/counters[@type="nsstat"]/counter[@name="'"${synthesized}"'"]/text()' $xml) -eq $count || ret=1
    768  1.1.1.7  christos       n=$((n + 1))
    769  1.1.1.7  christos       if [ $ret != 0 ]; then echo_i "failed"; fi
    770  1.1.1.7  christos       status=$((status + ret))
    771  1.1.1.7  christos     done
    772  1.1.1.7  christos   else
    773  1.1.1.7  christos     echo_i "Skipping XML statistics checks"
    774  1.1.1.7  christos   fi
    775  1.1.1.7  christos 
    776  1.1.1.8  christos   if $FEATURETEST --have-json-c && [ -x "${CURL}" ] && [ -x "${JQ}" ]; then
    777  1.1.1.7  christos     echo_i "getting JSON statisistcs for (synth-from-dnssec ${description};) ($n)"
    778  1.1.1.7  christos     ret=0
    779  1.1.1.7  christos     json=json.out$n
    780  1.1.1.7  christos     ${CURL} http://10.53.0.${ns}:${EXTRAPORT1}/json/v1/server >$json 2>/dev/null || ret=1
    781  1.1.1.7  christos     n=$((n + 1))
    782      1.1  christos     if [ $ret != 0 ]; then echo_i "failed"; fi
    783  1.1.1.7  christos     status=$((status + ret))
    784      1.1  christos 
    785  1.1.1.7  christos     echo_i "check JSON for 'CoveringNSEC' with (synth-from-dnssec ${description};) ($n)"
    786      1.1  christos     ret=0
    787  1.1.1.8  christos     count=$("${JQ}" '.views | map(select(.resolver.cachestats | has("CoveringNSEC"))) | length' <$json)
    788  1.1.1.7  christos     test $count = 2 || ret=1
    789  1.1.1.8  christos     zero=$("${JQ}" '.views | map(select(.resolver.cachestats.CoveringNSEC == 0)) | length' <$json)
    790  1.1.1.7  christos     if [ ${synth} = yes ]; then
    791  1.1.1.7  christos       test $zero = 1 || ret=1
    792      1.1  christos     else
    793  1.1.1.7  christos       test $zero = 2 || ret=1
    794      1.1  christos     fi
    795  1.1.1.7  christos     n=$((n + 1))
    796      1.1  christos     if [ $ret != 0 ]; then echo_i "failed"; fi
    797  1.1.1.7  christos     status=$((status + ret))
    798      1.1  christos 
    799  1.1.1.7  christos     echo_i "check JSON for 'CacheNSECNodes' with (synth-from-dnssec ${description};) ($n)"
    800      1.1  christos     ret=0
    801  1.1.1.8  christos     count=$("${JQ}" '.views | map(select(.resolver.cachestats | has("CacheNSECNodes"))) | length' <$json)
    802  1.1.1.7  christos     test $count = 2 || ret=1
    803  1.1.1.8  christos     zero=$("${JQ}" '.views | map(select(.resolver.cachestats.CacheNSECNodes == 0)) | length' <$json)
    804  1.1.1.7  christos     if [ ${ad} = yes ]; then
    805  1.1.1.7  christos       test $zero = 1 || ret=1
    806      1.1  christos     else
    807  1.1.1.7  christos       test $zero = 2 || ret=1
    808      1.1  christos     fi
    809  1.1.1.7  christos     n=$((n + 1))
    810      1.1  christos     if [ $ret != 0 ]; then echo_i "failed"; fi
    811  1.1.1.7  christos     status=$((status + ret))
    812  1.1.1.7  christos 
    813  1.1.1.7  christos     for synthesized in SynthNXDOMAIN SynthNODATA SynthWILDCARD; do
    814  1.1.1.7  christos       case $synthesized in
    815  1.1.1.8  christos         SynthNXDOMAIN) count=2 ;;
    816  1.1.1.7  christos         SynthNODATA) count=4 ;;
    817  1.1.1.7  christos         SynthWILDCARD) count=2 ;;
    818  1.1.1.7  christos       esac
    819  1.1.1.7  christos 
    820  1.1.1.7  christos       echo_i "check JSON for '$synthesized}' with (synth-from-dnssec ${description};) ($n)"
    821  1.1.1.7  christos       ret=0
    822  1.1.1.7  christos       if [ ${synth} = yes ]; then
    823  1.1.1.8  christos         test $("${JQ}" ".nsstats.${synthesized}" <$json) -eq $count || ret=1
    824  1.1.1.7  christos       else
    825  1.1.1.8  christos         "${JQ}" -e '.nsstats | has("'"${synthesized}"'")' <$json >/dev/null && ret=1
    826  1.1.1.7  christos       fi
    827  1.1.1.7  christos       n=$((n + 1))
    828  1.1.1.7  christos       if [ $ret != 0 ]; then echo_i "failed"; fi
    829  1.1.1.7  christos       status=$((status + ret))
    830  1.1.1.7  christos     done
    831  1.1.1.7  christos   else
    832  1.1.1.7  christos     echo_i "Skipping JSON statistics checks"
    833  1.1.1.7  christos   fi
    834      1.1  christos done
    835      1.1  christos 
    836      1.1  christos echo_i "check redirect response (+dnssec) (synth-from-dnssec <default>;) ($n)"
    837      1.1  christos ret=0
    838  1.1.1.7  christos synth=${synth_default}
    839  1.1.1.7  christos dig_with_opts b.redirect. @10.53.0.3 a >dig.out.ns3.test$n || ret=1
    840  1.1.1.7  christos check_ad_flag yes dig.out.ns3.test$n || ret=1
    841  1.1.1.7  christos check_status NXDOMAIN dig.out.ns3.test$n || ret=1
    842  1.1.1.7  christos if [ ${synth} = yes ]; then
    843  1.1.1.7  christos   check_synth_soa . dig.out.ns3.test$n || ret=1
    844  1.1.1.7  christos else
    845  1.1.1.7  christos   check_nosynth_soa . dig.out.ns3.test$n || ret=1
    846  1.1.1.7  christos fi
    847  1.1.1.7  christos n=$((n + 1))
    848      1.1  christos if [ $ret != 0 ]; then echo_i "failed"; fi
    849  1.1.1.7  christos status=$((status + ret))
    850      1.1  christos 
    851      1.1  christos echo_i "check redirect response (+nodnssec) (synth-from-dnssec <default>;) ($n)"
    852      1.1  christos ret=0
    853  1.1.1.7  christos dig_with_opts +nodnssec b.redirect. @10.53.0.3 a >dig.out.ns3.test$n || ret=1
    854  1.1.1.7  christos check_ad_flag no dig.out.ns3.test$n || ret=1
    855  1.1.1.7  christos check_status NOERROR dig.out.ns3.test$n || ret=1
    856  1.1.1.7  christos grep 'b\.redirect\..*300.IN.A.100\.100\.100\.2' dig.out.ns3.test$n >/dev/null || ret=1
    857  1.1.1.7  christos n=$((n + 1))
    858      1.1  christos if [ $ret != 0 ]; then echo_i "failed"; fi
    859  1.1.1.7  christos status=$((status + ret))
    860  1.1.1.2  christos 
    861  1.1.1.2  christos echo_i "check DNAME handling (synth-from-dnssec yes;) ($n)"
    862  1.1.1.2  christos ret=0
    863  1.1.1.7  christos dig_with_opts dnamed.example. ns @10.53.0.5 >dig.out.ns5.test$n || ret=1
    864  1.1.1.7  christos dig_with_opts a.dnamed.example. a @10.53.0.5 >dig.out.ns5-1.test$n || ret=1
    865  1.1.1.7  christos check_status NOERROR dig.out.ns5-1.test$n || ret=1
    866  1.1.1.7  christos n=$((n + 1))
    867  1.1.1.7  christos if [ $ret != 0 ]; then echo_i "failed"; fi
    868  1.1.1.7  christos status=$((status + ret))
    869  1.1.1.7  christos 
    870  1.1.1.7  christos echo_i "regression test for CVE-2022-0635 ($n)"
    871  1.1.1.7  christos ret=0
    872  1.1.1.7  christos # add DNAME to cache
    873  1.1.1.7  christos dig_with_opts dname.dnamed. dname @10.53.0.5 >dig.out.ns5-1.test$n || ret=1
    874  1.1.1.7  christos grep "status: NOERROR" dig.out.ns5-1.test$n >/dev/null || ret=1
    875  1.1.1.7  christos # add A record to cache at name before DNAME owner
    876  1.1.1.7  christos dig_with_opts a.dnamed. a @10.53.0.5 >dig.out.ns5-2.test$n || ret=1
    877  1.1.1.7  christos grep "status: NOERROR" dig.out.ns5-2.test$n >/dev/null || ret=1
    878  1.1.1.7  christos # add NSEC record to cache at name before DNAME owner
    879  1.1.1.7  christos dig_with_opts a.dnamed. aaaa @10.53.0.5 >dig.out.ns5-3.test$n || ret=1
    880  1.1.1.7  christos grep "status: NOERROR" dig.out.ns5-3.test$n >/dev/null || ret=1
    881  1.1.1.7  christos # wait for NSEC to timeout
    882  1.1.1.7  christos sleep 6
    883  1.1.1.7  christos # use DNAME for lookup
    884  1.1.1.7  christos dig_with_opts b.dname.dnamed a @10.53.0.5 >dig.out.ns5-4.test$n || ret=1
    885  1.1.1.7  christos grep "status: NXDOMAIN" dig.out.ns5-4.test$n >/dev/null || ret=1
    886  1.1.1.7  christos n=$((n + 1))
    887  1.1.1.7  christos if [ $ret != 0 ]; then echo_i "failed"; fi
    888  1.1.1.7  christos status=$((status + ret))
    889  1.1.1.7  christos 
    890  1.1.1.7  christos echo_i "check synth-from-dnssec with grafted zone (forward only) ($n)"
    891  1.1.1.7  christos ret=0
    892  1.1.1.7  christos #prime cache with NXDOMAIN NSEC covering 'fun' to 'minimal'
    893  1.1.1.7  christos dig_with_opts internal @10.53.0.5 >dig.out.ns5-1.test$n || ret=1
    894  1.1.1.7  christos grep "status: NXDOMAIN" dig.out.ns5-1.test$n >/dev/null || ret=1
    895  1.1.1.7  christos grep '^fun\..*NSEC.minimal\. ' dig.out.ns5-1.test$n >/dev/null || ret=1
    896  1.1.1.7  christos #perform lookup in grafted zone
    897  1.1.1.7  christos dig_with_opts example.internal @10.53.0.5 >dig.out.ns5-2.test$n || ret=1
    898  1.1.1.7  christos grep "status: NOERROR" dig.out.ns5-2.test$n >/dev/null || ret=1
    899  1.1.1.7  christos grep '^example\.internal\..*A.1.2.3.4$' dig.out.ns5-2.test$n >/dev/null || ret=1
    900  1.1.1.7  christos n=$((n + 1))
    901  1.1.1.7  christos if [ $ret != 0 ]; then echo_i "failed"; fi
    902  1.1.1.7  christos status=$((status + ret))
    903  1.1.1.7  christos 
    904  1.1.1.7  christos echo_i "check synth-from-dnssec with grafted zone (primary zone) ($n)"
    905  1.1.1.7  christos ret=0
    906  1.1.1.7  christos #prime cache with NXDOMAIN NSEC covering 'fun' to 'minimal'
    907  1.1.1.7  christos dig_with_opts internal @10.53.0.5 >dig.out.ns5-1.test$n || ret=1
    908  1.1.1.7  christos grep "status: NXDOMAIN" dig.out.ns5-1.test$n >/dev/null || ret=1
    909  1.1.1.7  christos grep '^fun\..*NSEC.minimal\. ' dig.out.ns5-1.test$n >/dev/null || ret=1
    910  1.1.1.7  christos #perform lookup in grafted zone
    911  1.1.1.7  christos dig_with_opts example.internal2 @10.53.0.5 >dig.out.ns5-2.test$n || ret=1
    912  1.1.1.7  christos grep "status: NOERROR" dig.out.ns5-2.test$n >/dev/null || ret=1
    913  1.1.1.7  christos grep '^example\.internal2\..*A.1.2.3.4$' dig.out.ns5-2.test$n >/dev/null || ret=1
    914  1.1.1.7  christos n=$((n + 1))
    915  1.1.1.2  christos if [ $ret != 0 ]; then echo_i "failed"; fi
    916  1.1.1.7  christos status=$((status + ret))
    917  1.1.1.2  christos 
    918      1.1  christos echo_i "exit status: $status"
    919      1.1  christos [ $status -eq 0 ] || exit 1
    920