Changeset 2682
- Timestamp:
- 07/20/12 13:18:55 (10 months ago)
- Files:
-
- 1 modified
-
trunk/pdns/pdns/nsec3dig.cc (modified) (4 diffs)
Legend:
- Unmodified
- Added
- Removed
-
trunk/pdns/pdns/nsec3dig.cc
r2681 r2682 18 18 } 19 19 20 string proveOrDeny(const nsec3set &nsec3s, const string &qname, const string &salt, unsigned int iters )20 string proveOrDeny(const nsec3set &nsec3s, const string &qname, const string &salt, unsigned int iters, set<string> &proven, set<string> &denied) 21 21 { 22 22 string hashed = nsec3Hash(qname, salt, iters); … … 29 29 if(hashed == base) 30 30 { 31 proven.insert(qname); 31 32 return qname+" ("+hashed+") proven by base of "+base+".."+next; 32 33 } 33 34 if(hashed == next) 34 35 { 36 proven.insert(qname); 35 37 return qname+" ("+hashed+") proven by next of "+base+".."+next; 36 38 } … … 38 40 (next < base && (hashed < next || hashed > base))) 39 41 { 42 denied.insert(qname); 40 43 return qname+" ("+hashed+") denied by "+base+".."+next; 41 44 } … … 125 128 126 129 cout<<"== nsec3 prove/deny report follows =="<<endl; 127 string r=proveOrDeny(nsec3s, qname, nsec3salt, nsec3iters); 130 set<string> proven; 131 set<string> denied; 132 string r=proveOrDeny(nsec3s, qname, nsec3salt, nsec3iters, proven, denied); 128 133 string shorter(qname); 129 134 do { 130 135 string r; 131 r=proveOrDeny(nsec3s, shorter, nsec3salt, nsec3iters );136 r=proveOrDeny(nsec3s, shorter, nsec3salt, nsec3iters, proven, denied); 132 137 if(r.size()) cout<<r<<endl; 133 r=proveOrDeny(nsec3s, "*."+shorter, nsec3salt, nsec3iters );138 r=proveOrDeny(nsec3s, "*."+shorter, nsec3salt, nsec3iters, proven, denied); 134 139 if(r.size()) cout<<r<<endl; 135 140 } while(chopOff(shorter)); 141 142 if(names.count(qname)) 143 { 144 cout<<"== qname found in names, not investigating denial any further"<<endl; 145 exit(EXIT_SUCCESS); 146 } 147 cout<<"== qname not found in names, investigating denial"<<endl; 148 if(proven.count(qname)) 149 { 150 cout<<"qname found proven, NODATA response?"<<endl; 151 exit(EXIT_SUCCESS); 152 } 153 shorter=qname; 154 string encloser; 155 string nextcloser; 156 string prev(qname); 157 while(chopOff(shorter)) 158 { 159 if(proven.count(shorter)) 160 { 161 encloser=shorter; 162 nextcloser=prev; 163 cout<<"found closest encloser at "<<encloser<<endl; 164 cout<<"next closer is "<<nextcloser<<endl; 165 break; 166 } 167 prev=shorter; 168 } 169 if(encloser.size() && nextcloser.size()) 170 { 171 if(denied.count(nextcloser)) 172 { 173 cout<<"next closer ("<<nextcloser<<") is denied correctly"<<endl; 174 } 175 else 176 { 177 cout<<"next closer ("<<nextcloser<<") NOT denied"<<endl; 178 } 179 if(denied.count("*."+encloser)) 180 { 181 cout<<"wildcard at encloser (*."<<encloser<<") is denied correctly"<<endl; 182 } 183 else 184 { 185 cout<<"wildcard at encloser (*."<<encloser<<") is NOT denied"<<endl; 186 } 187 } 188 exit(EXIT_SUCCESS); 136 189 } 137 190 catch(std::exception &e)