|
|
|
@ -674,13 +674,131 @@ void RegisterDNSTCPParsers(void)
|
|
|
|
|
"still on.", proto_name);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
#ifdef UNITTESTS
|
|
|
|
|
AppLayerParserRegisterProtocolUnittests(IPPROTO_TCP, ALPROTO_DNS,
|
|
|
|
|
DNSTCPParserRegisterTests);
|
|
|
|
|
#endif
|
|
|
|
|
|
|
|
|
|
return;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/* UNITTESTS */
|
|
|
|
|
#ifdef UNITTESTS
|
|
|
|
|
|
|
|
|
|
#include "util-unittest-helper.h"
|
|
|
|
|
|
|
|
|
|
static int DNSTCPParserTestMultiRecord(void)
|
|
|
|
|
{
|
|
|
|
|
/* This is a buffer containing 20 DNS requests each prefixed by
|
|
|
|
|
* the request length for transport over TCP. It was generated with Scapy,
|
|
|
|
|
* where each request is:
|
|
|
|
|
* DNS(id=i, rd=1, qd=DNSQR(qname="%d.google.com" % i, qtype="A"))
|
|
|
|
|
* where i is 0 to 19.
|
|
|
|
|
*/
|
|
|
|
|
uint8_t req[] = {
|
|
|
|
|
0x00, 0x1e, 0x00, 0x00, 0x01, 0x00, 0x00, 0x01,
|
|
|
|
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x30,
|
|
|
|
|
0x06, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x03,
|
|
|
|
|
0x63, 0x6f, 0x6d, 0x00, 0x00, 0x01, 0x00, 0x01,
|
|
|
|
|
0x00, 0x1e, 0x00, 0x01, 0x01, 0x00, 0x00, 0x01,
|
|
|
|
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x31,
|
|
|
|
|
0x06, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x03,
|
|
|
|
|
0x63, 0x6f, 0x6d, 0x00, 0x00, 0x01, 0x00, 0x01,
|
|
|
|
|
0x00, 0x1e, 0x00, 0x02, 0x01, 0x00, 0x00, 0x01,
|
|
|
|
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x32,
|
|
|
|
|
0x06, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x03,
|
|
|
|
|
0x63, 0x6f, 0x6d, 0x00, 0x00, 0x01, 0x00, 0x01,
|
|
|
|
|
0x00, 0x1e, 0x00, 0x03, 0x01, 0x00, 0x00, 0x01,
|
|
|
|
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x33,
|
|
|
|
|
0x06, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x03,
|
|
|
|
|
0x63, 0x6f, 0x6d, 0x00, 0x00, 0x01, 0x00, 0x01,
|
|
|
|
|
0x00, 0x1e, 0x00, 0x04, 0x01, 0x00, 0x00, 0x01,
|
|
|
|
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x34,
|
|
|
|
|
0x06, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x03,
|
|
|
|
|
0x63, 0x6f, 0x6d, 0x00, 0x00, 0x01, 0x00, 0x01,
|
|
|
|
|
0x00, 0x1e, 0x00, 0x05, 0x01, 0x00, 0x00, 0x01,
|
|
|
|
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x35,
|
|
|
|
|
0x06, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x03,
|
|
|
|
|
0x63, 0x6f, 0x6d, 0x00, 0x00, 0x01, 0x00, 0x01,
|
|
|
|
|
0x00, 0x1e, 0x00, 0x06, 0x01, 0x00, 0x00, 0x01,
|
|
|
|
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x36,
|
|
|
|
|
0x06, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x03,
|
|
|
|
|
0x63, 0x6f, 0x6d, 0x00, 0x00, 0x01, 0x00, 0x01,
|
|
|
|
|
0x00, 0x1e, 0x00, 0x07, 0x01, 0x00, 0x00, 0x01,
|
|
|
|
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x37,
|
|
|
|
|
0x06, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x03,
|
|
|
|
|
0x63, 0x6f, 0x6d, 0x00, 0x00, 0x01, 0x00, 0x01,
|
|
|
|
|
0x00, 0x1e, 0x00, 0x08, 0x01, 0x00, 0x00, 0x01,
|
|
|
|
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x38,
|
|
|
|
|
0x06, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x03,
|
|
|
|
|
0x63, 0x6f, 0x6d, 0x00, 0x00, 0x01, 0x00, 0x01,
|
|
|
|
|
0x00, 0x1e, 0x00, 0x09, 0x01, 0x00, 0x00, 0x01,
|
|
|
|
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x39,
|
|
|
|
|
0x06, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x03,
|
|
|
|
|
0x63, 0x6f, 0x6d, 0x00, 0x00, 0x01, 0x00, 0x01,
|
|
|
|
|
0x00, 0x1f, 0x00, 0x0a, 0x01, 0x00, 0x00, 0x01,
|
|
|
|
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x31,
|
|
|
|
|
0x30, 0x06, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65,
|
|
|
|
|
0x03, 0x63, 0x6f, 0x6d, 0x00, 0x00, 0x01, 0x00,
|
|
|
|
|
0x01, 0x00, 0x1f, 0x00, 0x0b, 0x01, 0x00, 0x00,
|
|
|
|
|
0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02,
|
|
|
|
|
0x31, 0x31, 0x06, 0x67, 0x6f, 0x6f, 0x67, 0x6c,
|
|
|
|
|
0x65, 0x03, 0x63, 0x6f, 0x6d, 0x00, 0x00, 0x01,
|
|
|
|
|
0x00, 0x01, 0x00, 0x1f, 0x00, 0x0c, 0x01, 0x00,
|
|
|
|
|
0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
|
|
|
|
0x02, 0x31, 0x32, 0x06, 0x67, 0x6f, 0x6f, 0x67,
|
|
|
|
|
0x6c, 0x65, 0x03, 0x63, 0x6f, 0x6d, 0x00, 0x00,
|
|
|
|
|
0x01, 0x00, 0x01, 0x00, 0x1f, 0x00, 0x0d, 0x01,
|
|
|
|
|
0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00,
|
|
|
|
|
0x00, 0x02, 0x31, 0x33, 0x06, 0x67, 0x6f, 0x6f,
|
|
|
|
|
0x67, 0x6c, 0x65, 0x03, 0x63, 0x6f, 0x6d, 0x00,
|
|
|
|
|
0x00, 0x01, 0x00, 0x01, 0x00, 0x1f, 0x00, 0x0e,
|
|
|
|
|
0x01, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00,
|
|
|
|
|
0x00, 0x00, 0x02, 0x31, 0x34, 0x06, 0x67, 0x6f,
|
|
|
|
|
0x6f, 0x67, 0x6c, 0x65, 0x03, 0x63, 0x6f, 0x6d,
|
|
|
|
|
0x00, 0x00, 0x01, 0x00, 0x01, 0x00, 0x1f, 0x00,
|
|
|
|
|
0x0f, 0x01, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00,
|
|
|
|
|
0x00, 0x00, 0x00, 0x02, 0x31, 0x35, 0x06, 0x67,
|
|
|
|
|
0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x03, 0x63, 0x6f,
|
|
|
|
|
0x6d, 0x00, 0x00, 0x01, 0x00, 0x01, 0x00, 0x1f,
|
|
|
|
|
0x00, 0x10, 0x01, 0x00, 0x00, 0x01, 0x00, 0x00,
|
|
|
|
|
0x00, 0x00, 0x00, 0x00, 0x02, 0x31, 0x36, 0x06,
|
|
|
|
|
0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x03, 0x63,
|
|
|
|
|
0x6f, 0x6d, 0x00, 0x00, 0x01, 0x00, 0x01, 0x00,
|
|
|
|
|
0x1f, 0x00, 0x11, 0x01, 0x00, 0x00, 0x01, 0x00,
|
|
|
|
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x31, 0x37,
|
|
|
|
|
0x06, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x03,
|
|
|
|
|
0x63, 0x6f, 0x6d, 0x00, 0x00, 0x01, 0x00, 0x01,
|
|
|
|
|
0x00, 0x1f, 0x00, 0x12, 0x01, 0x00, 0x00, 0x01,
|
|
|
|
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x31,
|
|
|
|
|
0x38, 0x06, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65,
|
|
|
|
|
0x03, 0x63, 0x6f, 0x6d, 0x00, 0x00, 0x01, 0x00,
|
|
|
|
|
0x01, 0x00, 0x1f, 0x00, 0x13, 0x01, 0x00, 0x00,
|
|
|
|
|
0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02,
|
|
|
|
|
0x31, 0x39, 0x06, 0x67, 0x6f, 0x6f, 0x67, 0x6c,
|
|
|
|
|
0x65, 0x03, 0x63, 0x6f, 0x6d, 0x00, 0x00, 0x01,
|
|
|
|
|
0x00, 0x01
|
|
|
|
|
};
|
|
|
|
|
size_t reqlen = sizeof(req);
|
|
|
|
|
|
|
|
|
|
DNSState *state = DNSStateAlloc();
|
|
|
|
|
FAIL_IF_NULL(state);
|
|
|
|
|
Flow *f = UTHBuildFlow(AF_INET, "1.2.3.4", "1.2.3.5", 1024, 53);
|
|
|
|
|
FAIL_IF_NULL(f);
|
|
|
|
|
f->proto = IPPROTO_TCP;
|
|
|
|
|
f->alproto = ALPROTO_DNS;
|
|
|
|
|
f->alstate = state;
|
|
|
|
|
|
|
|
|
|
FAIL_IF_NOT(DNSTCPRequestParse(f, f->alstate, NULL, req, reqlen, NULL));
|
|
|
|
|
FAIL_IF(state->transaction_max != 20);
|
|
|
|
|
|
|
|
|
|
UTHFreeFlow(f);
|
|
|
|
|
PASS;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
void DNSTCPParserRegisterTests(void)
|
|
|
|
|
{
|
|
|
|
|
// UtRegisterTest("DNSTCPParserTest01", DNSTCPParserTest01, 1);
|
|
|
|
|
UtRegisterTest("DNSTCPParserTestMultiRecord", DNSTCPParserTestMultiRecord);
|
|
|
|
|
}
|
|
|
|
|
#endif
|
|
|
|
|
|
|
|
|
|
#endif /* UNITTESTS */
|
|
|
|
|