"q04jkcevqvmu85r014c7dkba38o0ji5r.example.com. 3600 IN NSEC3 1 1 12 "
"aabbccdd r53bq7cc2uvmubfu5ocmm6pers9tk9en A RRSIG\n";
+// NSEC3 for wild.example.com (used in wildcard tests, will be added on
+// demand not to confuse other tests)
+const char* const nsec3_atwild_txt =
+ "ji6neoaepv8b5o6k4ev33abha8ht9fgc.example.com. 3600 IN NSEC3 1 1 12 "
+ "aabbccdd r53bq7cc2uvmubfu5ocmm6pers9tk9en\n";
+
// NSEC3 for *.uwild.example.com (will be added on demand not to confuse
// other tests)
const char* const nsec3_wild_txt =
hash_map_[Name("unsigned-delegation-optout.example.com")] =
"vld46lphhasfapj8og1pglgiasa5o5gt";
+ // For wildcard proofs
+ hash_map_[Name("wild.example.com")] =
+ "ji6neoaepv8b5o6k4ev33abha8ht9fgc";
+ hash_map_[Name("y.wild.example.com")] =
+ "0p9mhaveqvm6t7vbl5lop2u3t2rp3ton"; // a bit larger than H(<apex>)
+ hash_map_[Name("x.y.wild.example.com")] =
+ "q04jkcevqvmu85r014c7dkba38o0ji6r"; // a bit larger than H(www)
+
// For closest encloser proof for www1.uwild.example.com:
hash_map_[Name("uwild.example.com")] =
"t644ebqk9bibcna874givr6joj62mlhv";
// hardcoded specific cases, ignoring other details such as canceling
// due to the existence of closer name.
if ((options & NO_WILDCARD) == 0) {
- const Name wild_suffix(name.split(1));
+ const Name wild_suffix(name == Name("x.y.wild.example.com") ?
+ Name("wild.example.com") : name.split(1));
// Unit Tests use those domains for Wildcard test.
- if (name.equals(Name("www.wild.example.com"))||
- name.equals(Name("www1.uwild.example.com"))||
- name.equals(Name("a.t.example.com"))) {
+ if (name.equals(Name("www.wild.example.com")) ||
+ name.equals(Name("x.y.wild.example.com")) ||
+ name.equals(Name("www1.uwild.example.com")) ||
+ name.equals(Name("a.t.example.com"))) {
if (name.compare(wild_suffix).getRelation() ==
NameComparisonResult::SUBDOMAIN) {
domain = domains_.find(Name("*").concatenate(wild_suffix));
mock_finder->getOrigin());
}
+TEST_F(QueryTest, wildcardNSEC3) {
+ // Similar to wildcardNSEC, but the zone is signed with NSEC3.
+ // The next closer is y.wild.example.com, the covering NSEC3 for it
+ // is (in our setup) the NSEC3 for the apex.
+ mock_finder->setNSEC3Flag(true);
+
+ // This is NSEC3 for wild.example.com, which will be used in the middle
+ // of identifying the next closer name.
+ mock_finder->addRecord(nsec3_atwild_txt);
+
+ Query(memory_client, Name("x.y.wild.example.com"), RRType::A(), response,
+ true).process();
+ responseCheck(response, Rcode::NOERROR(), AA_FLAG, 2, 6, 6,
+ (string(wild_txt).replace(0, 1, "x.y") +
+ string("x.y.wild.example.com. 3600 IN RRSIG ") +
+ getCommonRRSIGText("A") + "\n").c_str(),
+ // 3 NSes and their RRSIG
+ (zone_ns_txt + string("example.com. 3600 IN RRSIG ") +
+ getCommonRRSIGText("NS") + "\n" +
+ // NSEC3 for the wildcard proof and its RRSIG
+ string(nsec3_apex_txt) +
+ mock_finder->hash_map_[Name("example.com.")] +
+ string(".example.com. 3600 IN RRSIG ") +
+ getCommonRRSIGText("NSEC3") + "\n").c_str(),
+ NULL, // we are not interested in additionals in this test
+ mock_finder->getOrigin());
+}
+
TEST_F(QueryTest, badWildcardProof1) {
// Unexpected case in wildcard proof: ZoneFinder::find() returns SUCCESS
// when NXDOMAIN is expected.