From: JINMEI Tatuya Date: Fri, 10 Feb 2012 23:22:12 +0000 (-0800) Subject: [1641] covered some more cases of NSEC3 with empty salt X-Git-Tag: trac2351_base~97^2~37^2~14 X-Git-Url: http://git.ipfire.org/gitweb.cgi?a=commitdiff_plain;h=e9647bb3c689941916508a663b72df63be7d3963;p=thirdparty%2Fkea.git [1641] covered some more cases of NSEC3 with empty salt --- diff --git a/src/lib/dns/rdata/generic/nsec3_50.cc b/src/lib/dns/rdata/generic/nsec3_50.cc index f9c295545c..21c5cf2839 100644 --- a/src/lib/dns/rdata/generic/nsec3_50.cc +++ b/src/lib/dns/rdata/generic/nsec3_50.cc @@ -53,12 +53,12 @@ struct NSEC3Impl { salt_(salt), next_(next), typebits_(typebits) {} - uint8_t hashalg_; - uint8_t flags_; - uint16_t iterations_; - vector salt_; - vector next_; - vector typebits_; + const uint8_t hashalg_; + const uint8_t flags_; + const uint16_t iterations_; + const vector salt_; + const vector next_; + const vector typebits_; }; NSEC3::NSEC3(const string& nsec3_str) : @@ -247,10 +247,10 @@ NSEC3::toText() const { using namespace boost; return (lexical_cast(static_cast(impl_->hashalg_)) + - " " + lexical_cast(static_cast(impl_->flags_)) + - " " + lexical_cast(static_cast(impl_->iterations_)) + - " " + encodeHex(impl_->salt_) + - " " + encodeBase32Hex(impl_->next_) + s.str()); + " " + lexical_cast(static_cast(impl_->flags_)) + + " " + lexical_cast(static_cast(impl_->iterations_)) + + " " + (impl_->salt_.empty() ? "-" : encodeHex(impl_->salt_)) + + " " + encodeBase32Hex(impl_->next_) + s.str()); } template @@ -260,7 +260,10 @@ toWireHelper(const NSEC3Impl& impl, OUTPUT_TYPE& output) { output.writeUint8(impl.flags_); output.writeUint16(impl.iterations_); output.writeUint8(impl.salt_.size()); - output.writeData(&impl.salt_[0], impl.salt_.size()); + if (!impl.salt_.empty()) { + output.writeData(&impl.salt_[0], impl.salt_.size()); + } + assert(!impl.next_.empty()); output.writeUint8(impl.next_.size()); output.writeData(&impl.next_[0], impl.next_.size()); if (!impl.typebits_.empty()) { diff --git a/src/lib/dns/tests/rdata_nsec3_unittest.cc b/src/lib/dns/tests/rdata_nsec3_unittest.cc index 2f85920187..3e7dcb15f6 100644 --- a/src/lib/dns/tests/rdata_nsec3_unittest.cc +++ b/src/lib/dns/tests/rdata_nsec3_unittest.cc @@ -44,8 +44,14 @@ class Rdata_NSEC3_Test : public RdataTest { public: Rdata_NSEC3_Test() : nsec3_txt("1 1 1 D399EAAB H9RSFB7FPF2L8HG35CMPC765TDK23RP6 " - "NS SOA RRSIG DNSKEY NSEC3PARAM") {} - string nsec3_txt; + "NS SOA RRSIG DNSKEY NSEC3PARAM"), + nsec3_nosalt_txt("1 1 1 - H9RSFB7FPF2L8HG35CMPC765TDK23RP6 A" ), + obuffer(0), renderer(obuffer) + {} + const string nsec3_txt; + const string nsec3_nosalt_txt; + OutputBuffer obuffer; + MessageRenderer renderer; }; TEST_F(Rdata_NSEC3_Test, fromText) { @@ -60,8 +66,7 @@ TEST_F(Rdata_NSEC3_Test, fromText) { "NS SOA RRSIG DNSKEY NSEC3PARAM")); // 0-length salt - EXPECT_EQ(0, generic::NSEC3("1 1 1 - H9RSFB7FPF2L8HG35CMPC765TDK23RP6 " - "A").getSalt().size()); + EXPECT_EQ(0, generic::NSEC3(nsec3_nosalt_txt).getSalt().size()); // salt that has the possible max length EXPECT_EQ(255, generic::NSEC3("1 1 1 " + string(255 * 2, '0') + @@ -80,8 +85,12 @@ TEST_F(Rdata_NSEC3_Test, fromText) { } TEST_F(Rdata_NSEC3_Test, toText) { + // normal case const generic::NSEC3 rdata_nsec3(nsec3_txt); EXPECT_EQ(nsec3_txt, rdata_nsec3.toText()); + + // empty salt case + EXPECT_EQ(nsec3_nosalt_txt, generic::NSEC3(nsec3_nosalt_txt).toText()); } TEST_F(Rdata_NSEC3_Test, badText) { @@ -184,21 +193,35 @@ TEST_F(Rdata_NSEC3_Test, createFromWire) { } } -TEST_F(Rdata_NSEC3_Test, toWireRenderer) { - renderer.skip(2); - const generic::NSEC3 rdata_nsec3(nsec3_txt); - rdata_nsec3.toWire(renderer); - - vector data; - UnitTestUtil::readWireData("rdata_nsec3_fromWire1", data); - EXPECT_PRED_FORMAT4(UnitTestUtil::matchWireData, - static_cast(obuffer.getData()) + 2, - obuffer.getLength() - 2, &data[2], data.size() - 2); +template +void +toWireCheck(OUTPUT_TYPE& output, const char* const data_file) { + vector data; + UnitTestUtil::readWireData(data_file, data); + InputBuffer buffer(&data[0], data.size()); + const uint16_t rdlen = buffer.readUint16(); + const generic::NSEC3 nsec3 = + dynamic_cast(*createRdata( + RRType::NSEC3(), RRClass::IN(), + buffer, rdlen)); + + output.clear(); + output.writeUint16(rdlen); + nsec3.toWire(output); + EXPECT_PRED_FORMAT4(UnitTestUtil::matchWireData, output.getData(), + output.getLength(), &data[0], data.size()); } -TEST_F(Rdata_NSEC3_Test, toWireBuffer) { - const generic::NSEC3 rdata_nsec3(nsec3_txt); - rdata_nsec3.toWire(obuffer); +TEST_F(Rdata_NSEC3_Test, toWire) { + // normal case + toWireCheck(renderer, "rdata_nsec3_fromWire1"); + toWireCheck(obuffer, "rdata_nsec3_fromWire1"); + + // empty salt + toWireCheck(renderer, "rdata_nsec3_fromWire13.wire"); + toWireCheck(obuffer, "rdata_nsec3_fromWire13.wire"); + + // empty bitmap case is handled in the bitmpa tests } TEST_F(Rdata_NSEC3_Test, assign) {