|
@@ -620,15 +620,47 @@ testGetTime() {
|
|
|
return (NOW);
|
|
|
}
|
|
|
|
|
|
+// bit-wise constant flags to configure DNS header flags for test
|
|
|
+// messages.
|
|
|
+const unsigned int QR_FLAG = 0x1;
|
|
|
+const unsigned int AA_FLAG = 0x2;
|
|
|
+const unsigned int RD_FLAG = 0x4;
|
|
|
+const unsigned int TC_FLAG = 0x8;
|
|
|
+
|
|
|
void
|
|
|
commonTSIGToWireCheck(Message& message, MessageRenderer& renderer,
|
|
|
- TSIGContext& tsig_ctx, const char* const expected_file)
|
|
|
+ TSIGContext& tsig_ctx, const char* const expected_file,
|
|
|
+ unsigned int message_flags = RD_FLAG,
|
|
|
+ RRType qtype = RRType::A(),
|
|
|
+ const vector<const char*>* answer_data = NULL)
|
|
|
{
|
|
|
message.setOpcode(Opcode::QUERY());
|
|
|
message.setRcode(Rcode::NOERROR());
|
|
|
- message.setHeaderFlag(Message::HEADERFLAG_RD);
|
|
|
+ if ((message_flags & QR_FLAG) != 0) {
|
|
|
+ message.setHeaderFlag(Message::HEADERFLAG_QR);
|
|
|
+ }
|
|
|
+ if ((message_flags & AA_FLAG) != 0) {
|
|
|
+ message.setHeaderFlag(Message::HEADERFLAG_AA);
|
|
|
+ }
|
|
|
+ if ((message_flags & RD_FLAG) != 0) {
|
|
|
+ message.setHeaderFlag(Message::HEADERFLAG_RD);
|
|
|
+ }
|
|
|
+ if ((message_flags & TC_FLAG) != 0) {
|
|
|
+ message.setHeaderFlag(Message::HEADERFLAG_TC);
|
|
|
+ }
|
|
|
message.addQuestion(Question(Name("www.example.com"), RRClass::IN(),
|
|
|
- RRType::A()));
|
|
|
+ qtype));
|
|
|
+
|
|
|
+ if (answer_data != NULL) {
|
|
|
+ RRsetPtr ans_rrset(new RRset(Name("www.example.com"), RRClass::IN(),
|
|
|
+ qtype, RRTTL(86400)));
|
|
|
+ for (vector<const char*>::const_iterator it = answer_data->begin();
|
|
|
+ it != answer_data->end();
|
|
|
+ ++it) {
|
|
|
+ ans_rrset->addRdata(createRdata(qtype, RRClass::IN(), *it));
|
|
|
+ }
|
|
|
+ message.addRRset(Message::SECTION_ANSWER, ans_rrset);
|
|
|
+ }
|
|
|
|
|
|
message.toWire(renderer, tsig_ctx);
|
|
|
vector<unsigned char> expected_data;
|
|
@@ -672,7 +704,18 @@ TEST_F(MessageTest, toWireWithEDNSAndTSIG) {
|
|
|
}
|
|
|
}
|
|
|
|
|
|
+// Some of the following tests involve truncation. We use the query name
|
|
|
+// "www.example.com" and some TXT question/answers. The length of the
|
|
|
+// header and question will be 33 bytes. If we also try to include a
|
|
|
+// TSIG of the same key name (not compressed) with HMAC-MD5, the TSIG RR
|
|
|
+// will be 85 bytes.
|
|
|
+
|
|
|
+// A long TXT RDATA. With a fully compressed owner name, the corresponding
|
|
|
+// RR will be 268 bytes.
|
|
|
const char* const long_txt1 = "0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcde";
|
|
|
+
|
|
|
+// With a fully compressed owner name, the corresponding RR will be 212 bytes.
|
|
|
+// It should result in truncation even without TSIG (33 + 268 + 212 = 513)
|
|
|
const char* const long_txt2 = "0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456";
|
|
|
|
|
|
// Example output generated by
|
|
@@ -684,32 +727,25 @@ const char* const long_txt2 = "0123456789abcdef0123456789abcdef0123456789abcdef0
|
|
|
TEST_F(MessageTest, toWireTSIGTruncation) {
|
|
|
isc::util::detail::gettimeFunction = testGetTime<0x4e179212>;
|
|
|
|
|
|
+ // Verify a validly signed query so that we can use the TSIG context
|
|
|
+ // in a response mode.
|
|
|
factoryFromFile(message_parse, "message_fromWire17.wire");
|
|
|
EXPECT_EQ(TSIGError::NOERROR(),
|
|
|
tsig_ctx.verify(message_parse.getTSIGRecord(),
|
|
|
&received_data[0], received_data.size()));
|
|
|
|
|
|
- // Note: the following should be merged to commonTSIGToWireCheck:
|
|
|
- message_render.setQid(0x22c2);
|
|
|
- message_render.setOpcode(Opcode::QUERY());
|
|
|
- message_render.setRcode(Rcode::NOERROR());
|
|
|
- message_render.setHeaderFlag(Message::HEADERFLAG_QR);
|
|
|
- message_render.setHeaderFlag(Message::HEADERFLAG_RD);
|
|
|
- message_render.setHeaderFlag(Message::HEADERFLAG_AA);
|
|
|
- message_render.addQuestion(Question(Name("www.example.com"),
|
|
|
- RRClass::IN(), RRType::TXT()));
|
|
|
- RRsetPtr rrset(new RRset(Name("www.example.com"), RRClass::IN(),
|
|
|
- RRType::TXT(), RRTTL(86400)));
|
|
|
- rrset->addRdata(generic::TXT(long_txt1));
|
|
|
- rrset->addRdata(generic::TXT(long_txt2));
|
|
|
- message_render.addRRset(Message::SECTION_ANSWER, rrset);
|
|
|
- message_render.toWire(renderer, tsig_ctx);
|
|
|
|
|
|
- vector<unsigned char> expected_data;
|
|
|
- UnitTestUtil::readWireData("message_toWire4.wire", expected_data);
|
|
|
- EXPECT_PRED_FORMAT4(UnitTestUtil::matchWireData, renderer.getData(),
|
|
|
- renderer.getLength(),
|
|
|
- &expected_data[0], expected_data.size());
|
|
|
+ message_render.setQid(0x22c2);
|
|
|
+ vector<const char*> answer_data;
|
|
|
+ answer_data.push_back(long_txt1);
|
|
|
+ answer_data.push_back(long_txt2);
|
|
|
+ {
|
|
|
+ SCOPED_TRACE("Message sign with TSIG and EDNS");
|
|
|
+ commonTSIGToWireCheck(message_render, renderer, tsig_ctx,
|
|
|
+ "message_toWire4.wire",
|
|
|
+ QR_FLAG|AA_FLAG|RD_FLAG|TC_FLAG,
|
|
|
+ RRType::TXT(), &answer_data);
|
|
|
+ }
|
|
|
}
|
|
|
|
|
|
TEST_F(MessageTest, toWireWithoutOpcode) {
|