Skip to content
Snippets Groups Projects
Commit b2bfbbb7 authored by Daniel Salzman's avatar Daniel Salzman
Browse files

Added support of TYPE12345 to NSEC(3) bitmaps

parent e746344a
No related branches found
No related tags found
No related merge requests found
This diff is collapsed.
......@@ -35,6 +35,8 @@
#define MAX_DNAME_LENGTH 255
#define MAX_LABEL_LENGTH 63
#define BITMAP_WINDOWS 256
#define INET4_ADDR_LENGTH 4
#define INET6_ADDR_LENGTH 16
......@@ -46,6 +48,11 @@
struct scanner;
typedef struct scanner scanner_t;
typedef struct {
uint8_t bitmap[32];
uint8_t length;
} window;
/*!
* \brief Context structure for Ragel scanner.
*/
......@@ -86,7 +93,10 @@ struct scanner {
/*!< Auxiliary buffer length. */
uint32_t buffer_length;
uint8_t bitmap[13]; /*!< 13 * 8 > 99. */
/*!< Bitmap window blocks. */
window windows[BITMAP_WINDOWS];
/*!< Last window block which is used (-1 means any). */
int16_t last_window;
uint8_t *r_data_end; /*!< Pointer to the actual r_data end. */
uint16_t *r_data_length_position; /*!< Pointer to the begin of rdata. */
......
......@@ -33,15 +33,20 @@
#define SCANNER_WARNING(code) { s->error_code = code; }
#define SCANNER_ERROR(code) { s->error_code = code; s->stop = true; }
#define TYPE_NUM(type) { \
*((uint16_t *)(s->r_data_end)) = htons(type); \
#define TYPE_NUM(type) { \
*((uint16_t *)(s->r_data_end)) = htons(type); \
}
#define TYPE_BIT(type, position) { \
(s->bitmap)[position] |= 128 >> (type - position * 8); \
if (s->item_length < position + 1) { \
s->item_length = position + 1; \
} \
#define WINDOW_ADD_BIT(type) { \
win = type / 256; bit_pos = type % 256; byte_pos = bit_pos / 8; \
\
((s->windows[win]).bitmap)[byte_pos] |= 128 >> (bit_pos % 8); \
if ((s->windows[win]).length < byte_pos + 1) { \
(s->windows[win]).length = byte_pos + 1; \
} \
if (s->last_window < win) { \
s->last_window = win; \
} \
}
// Include scanner file (in Ragel).
......@@ -91,7 +96,9 @@ int scanner_process(char *start,
// Auxiliary variables which are used in scanner body.
struct in_addr addr4;
struct in6_addr addr6;
uint8_t win, byte_pos, bit_pos;
uint32_t timestamp;
int16_t window;
// Restoring scanner states.
int cs = s->cs;
......
......@@ -1002,89 +1002,95 @@
# END
# BEGIN - Bitmap processing
action _bitmap_error {
SCANNER_WARNING(ZSCANNER_EBAD_BITMAP);
fhold; fgoto err_line;
action _type_bitmap_exit {
if (s->number64 <= UINT16_MAX) {
WINDOW_ADD_BIT(s->number64);
}
else {
SCANNER_WARNING(ZSCANNER_ENUMBER16_OVERFLOW);
fhold; fgoto err_line;
}
}
# TYPE0-65535.
type_bitmap = number %_type_bitmap_exit;
type_bit =
# Type numbers 0-7
( "A"i %{ TYPE_BIT(KNOT_RRTYPE_A, 0); }
| "NS"i %{ TYPE_BIT(KNOT_RRTYPE_NS, 0); }
| "CNAME"i %{ TYPE_BIT(KNOT_RRTYPE_CNAME, 0); }
| "SOA"i %{ TYPE_BIT(KNOT_RRTYPE_SOA, 0); }
# Type numbers 8-15
| "WKS"i %{ TYPE_BIT(KNOT_RRTYPE_WKS, 1); }
| "PTR"i %{ TYPE_BIT(KNOT_RRTYPE_PTR, 1); }
| "HINFO"i %{ TYPE_BIT(KNOT_RRTYPE_HINFO, 1); }
| "MINFO"i %{ TYPE_BIT(KNOT_RRTYPE_MINFO, 1); }
| "MX"i %{ TYPE_BIT(KNOT_RRTYPE_MX, 1); }
# Type numbers 16-23
| "TXT"i %{ TYPE_BIT(KNOT_RRTYPE_TXT, 2); }
| "RP"i %{ TYPE_BIT(KNOT_RRTYPE_RP, 2); }
| "AFSDB"i %{ TYPE_BIT(KNOT_RRTYPE_AFSDB, 2); }
| "X25"i %{ TYPE_BIT(KNOT_RRTYPE_X25, 2); }
| "ISDN"i %{ TYPE_BIT(KNOT_RRTYPE_ISDN, 2); }
| "RT"i %{ TYPE_BIT(KNOT_RRTYPE_RT, 2); }
| "NSAP"i %{ TYPE_BIT(KNOT_RRTYPE_NSAP, 2); }
# Type numbers 24-31
| "SIG"i %{ TYPE_BIT(KNOT_RRTYPE_SIG, 3); }
| "KEY"i %{ TYPE_BIT(KNOT_RRTYPE_KEY, 3); }
| "PX"i %{ TYPE_BIT(KNOT_RRTYPE_PX, 3); }
| "AAAA"i %{ TYPE_BIT(KNOT_RRTYPE_AAAA, 3); }
| "LOC"i %{ TYPE_BIT(KNOT_RRTYPE_LOC, 3); }
# Type numbers 32-39
| "SRV"i %{ TYPE_BIT(KNOT_RRTYPE_SRV, 4); }
| "NAPTR"i %{ TYPE_BIT(KNOT_RRTYPE_NAPTR, 4); }
| "KX"i %{ TYPE_BIT(KNOT_RRTYPE_KX, 4); }
| "CERT"i %{ TYPE_BIT(KNOT_RRTYPE_CERT, 4); }
| "DNAME"i %{ TYPE_BIT(KNOT_RRTYPE_DNAME, 4); }
# Type numbers 40-47
| "OPT"i %{ TYPE_BIT(KNOT_RRTYPE_OPT, 5); }
| "APL"i %{ TYPE_BIT(KNOT_RRTYPE_APL, 5); }
| "DS"i %{ TYPE_BIT(KNOT_RRTYPE_DS, 5); }
| "SSHFP"i %{ TYPE_BIT(KNOT_RRTYPE_SSHFP, 5); }
| "IPSECKEY"i %{ TYPE_BIT(KNOT_RRTYPE_IPSECKEY, 5); }
| "RRSIG"i %{ TYPE_BIT(KNOT_RRTYPE_RRSIG, 5); }
| "NSEC"i %{ TYPE_BIT(KNOT_RRTYPE_NSEC, 5); }
# Type numbers 48-55
| "DNSKEY"i %{ TYPE_BIT(KNOT_RRTYPE_DNSKEY, 6); }
| "DHCID"i %{ TYPE_BIT(KNOT_RRTYPE_DHCID, 6); }
| "NSEC3"i %{ TYPE_BIT(KNOT_RRTYPE_NSEC3, 6); }
| "NSEC3PARAM"i %{ TYPE_BIT(KNOT_RRTYPE_NSEC3PARAM, 6); }
| "TLSA"i %{ TYPE_BIT(KNOT_RRTYPE_TLSA, 6); }
# Type numbers 96-103
| "SPF"i %{ TYPE_BIT(KNOT_RRTYPE_SPF, 12); }
# Special types TYPE1 - TYPE65535
| "TYPE"i # TODO
( "A"i %{ WINDOW_ADD_BIT(KNOT_RRTYPE_A); }
| "NS"i %{ WINDOW_ADD_BIT(KNOT_RRTYPE_NS); }
| "CNAME"i %{ WINDOW_ADD_BIT(KNOT_RRTYPE_CNAME); }
| "SOA"i %{ WINDOW_ADD_BIT(KNOT_RRTYPE_SOA); }
| "WKS"i %{ WINDOW_ADD_BIT(KNOT_RRTYPE_WKS); }
| "PTR"i %{ WINDOW_ADD_BIT(KNOT_RRTYPE_PTR); }
| "HINFO"i %{ WINDOW_ADD_BIT(KNOT_RRTYPE_HINFO); }
| "MINFO"i %{ WINDOW_ADD_BIT(KNOT_RRTYPE_MINFO); }
| "MX"i %{ WINDOW_ADD_BIT(KNOT_RRTYPE_MX); }
| "TXT"i %{ WINDOW_ADD_BIT(KNOT_RRTYPE_TXT); }
| "RP"i %{ WINDOW_ADD_BIT(KNOT_RRTYPE_RP); }
| "AFSDB"i %{ WINDOW_ADD_BIT(KNOT_RRTYPE_AFSDB); }
| "X25"i %{ WINDOW_ADD_BIT(KNOT_RRTYPE_X25); }
| "ISDN"i %{ WINDOW_ADD_BIT(KNOT_RRTYPE_ISDN); }
| "RT"i %{ WINDOW_ADD_BIT(KNOT_RRTYPE_RT); }
| "NSAP"i %{ WINDOW_ADD_BIT(KNOT_RRTYPE_NSAP); }
| "SIG"i %{ WINDOW_ADD_BIT(KNOT_RRTYPE_SIG); }
| "KEY"i %{ WINDOW_ADD_BIT(KNOT_RRTYPE_KEY); }
| "PX"i %{ WINDOW_ADD_BIT(KNOT_RRTYPE_PX); }
| "AAAA"i %{ WINDOW_ADD_BIT(KNOT_RRTYPE_AAAA); }
| "LOC"i %{ WINDOW_ADD_BIT(KNOT_RRTYPE_LOC); }
| "SRV"i %{ WINDOW_ADD_BIT(KNOT_RRTYPE_SRV); }
| "NAPTR"i %{ WINDOW_ADD_BIT(KNOT_RRTYPE_NAPTR); }
| "KX"i %{ WINDOW_ADD_BIT(KNOT_RRTYPE_KX); }
| "CERT"i %{ WINDOW_ADD_BIT(KNOT_RRTYPE_CERT); }
| "DNAME"i %{ WINDOW_ADD_BIT(KNOT_RRTYPE_DNAME); }
| "OPT"i %{ WINDOW_ADD_BIT(KNOT_RRTYPE_OPT); }
| "APL"i %{ WINDOW_ADD_BIT(KNOT_RRTYPE_APL); }
| "DS"i %{ WINDOW_ADD_BIT(KNOT_RRTYPE_DS); }
| "SSHFP"i %{ WINDOW_ADD_BIT(KNOT_RRTYPE_SSHFP); }
| "IPSECKEY"i %{ WINDOW_ADD_BIT(KNOT_RRTYPE_IPSECKEY); }
| "RRSIG"i %{ WINDOW_ADD_BIT(KNOT_RRTYPE_RRSIG); }
| "NSEC"i %{ WINDOW_ADD_BIT(KNOT_RRTYPE_NSEC); }
| "DNSKEY"i %{ WINDOW_ADD_BIT(KNOT_RRTYPE_DNSKEY); }
| "DHCID"i %{ WINDOW_ADD_BIT(KNOT_RRTYPE_DHCID); }
| "NSEC3"i %{ WINDOW_ADD_BIT(KNOT_RRTYPE_NSEC3); }
| "NSEC3PARAM"i %{ WINDOW_ADD_BIT(KNOT_RRTYPE_NSEC3PARAM); }
| "TLSA"i %{ WINDOW_ADD_BIT(KNOT_RRTYPE_TLSA); }
| "SPF"i %{ WINDOW_ADD_BIT(KNOT_RRTYPE_SPF); }
| "TYPE"i . type_bitmap # Special types TYPE0-TYPE65535
);
action _bitmap_init {
memset(s->bitmap, 0, sizeof(s->bitmap));
s->item_length = 0;
memset(s->windows, 0, sizeof(s->windows));
s->last_window = -1;
}
action _bitmap_exit {
if (s->item_length > 0) {
if (s->r_data_length < MAX_RDATA_LENGTH - 2 - s->item_length) {
// Window number.
*(s->r_data_end) = 0;
s->r_data_end += 1;
// Bitmap length.
*(s->r_data_end) = s->item_length;
s->r_data_end += 1;
// Copying bitmap.
memcpy(s->r_data_end, s->bitmap, s->item_length);
s->r_data_end += s->item_length;
s->r_data_length += 2 + s->item_length;
}
else {
SCANNER_WARNING(ZSCANNER_ERDATA_OVERFLOW);
fhold; fgoto err_line;
for (window = 0; window <= s->last_window; window++) {
if ((s->windows[window]).length > 0) {
if (s->r_data_length < MAX_RDATA_LENGTH -
(2 + (s->windows[window]).length)) {
// Window number.
*(s->r_data_end) = (uint8_t)window;
s->r_data_end += 1;
// Bitmap length.
*(s->r_data_end) = (s->windows[window]).length;
s->r_data_end += 1;
// Copying bitmap.
memcpy(s->r_data_end,
(s->windows[window]).bitmap,
(s->windows[window]).length);
s->r_data_end += (s->windows[window]).length;
s->r_data_length += 2 + (s->windows[window]).length;
}
else {
SCANNER_WARNING(ZSCANNER_ERDATA_OVERFLOW);
fhold; fgoto err_line;
}
}
}
}
action _bitmap_error {
SCANNER_WARNING(ZSCANNER_EBAD_BITMAP);
fhold; fgoto err_line;
}
# Blank bitmap is allowed too.
bitmap := (sep? | (sep . type_bit)* . sep?) >_bitmap_init
......
......@@ -59,8 +59,11 @@ vv A 1.1.1.1
. AAAA ::5 ()
a TYPE1 \# 4 (aa
a TYPE1 \# 4 (aa
bbcc dd
) ; multiline
b TYPE123 \# 0
c TYPE6231 \# 1 05
\ No newline at end of file
b TYPE123 \# 0
c TYPE6231 \# 1 05
d TYPE0 \# 0
e TYPE65535 \# 0
e TYPE65536 \# 0
\ No newline at end of file
......@@ -22,7 +22,12 @@ vqans65vboe1qaq7ggf51hj65m10hu4m NSEC3 1 0 5 9F90818BBC2D8C46 VQJKMUVK0SL27G6KHB
vqjkmuvk0sl27g6khb1qe40c6qjdspjv NSEC3 1 0 5 9F90818BBC2D8C46 VQRE2R86TA7AD3SVCJMN483C5E86NGAE A AAAA RRSIG
www.zdrojak.root.cz. 600 IN NSEC root.cz. CNAME RRSIG NSEC
www.zdrojak.root.cz. 600 IN NSEC root.cz. A
alfa.example.com. 86400 IN NSEC host.example.com. (
A MX RRSIG NSEC TYPE1234 )
www.zdrojak.root.cz. 600 IN NSEC root.cz. A A
www.zdrojak.root.cz. 600 IN NSEC root.cz. TYPE1 TYPE255
www.zdrojak.root.cz. 600 IN NSEC root.cz. TYPE256 TYPE2550 TYPE65535 TYPE256 TYPE2550 TYPE65535 TYPE256
www.zdrojak.root.cz. 600 IN NSEC s
www.zdrojak.root.cz. 600 IN NSEC root.cz. AAA
www.zdrojak.root.cz. 600 IN NSEC root.cz.%CNAME RRSIG NSEC
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment