diff -Naur validns-0.8/aaaa.c validns/aaaa.c --- validns-0.8/aaaa.c 2014-02-11 15:47:05.000000000 -0500 +++ validns/aaaa.c 2020-10-05 16:59:29.353681351 -0400 @@ -20,44 +20,44 @@ static struct rr *aaaa_parse(char *name, long ttl, int type, char *s) { - struct rr_aaaa *rr = getmem(sizeof(*rr)); + struct rr_aaaa *rr = getmem(sizeof(*rr)); - if (extract_ipv6(&s, "IPv6 address", &rr->address) <= 0) - return NULL; - if (*s) { - return bitch("garbage after valid AAAA data"); - } + if (extract_ipv6(&s, "IPv6 address", &rr->address) <= 0) + return NULL; + if (*s) { + return bitch("garbage after valid AAAA data"); + } - return store_record(type, name, ttl, rr); + return store_record(type, name, ttl, rr); } static char* aaaa_human(struct rr *rrv) { - RRCAST(aaaa); + RRCAST(aaaa); char s[1024]; - if (inet_ntop(AF_INET6, &rr->address, s, 1024)) - return quickstrdup_temp(s); - return "????"; + if (inet_ntop(AF_INET6, &rr->address, s, 1024)) + return quickstrdup_temp(s); + return "????"; } static struct binary_data aaaa_wirerdata(struct rr *rrv) { - RRCAST(aaaa); - struct binary_data r; + RRCAST(aaaa); + struct binary_data r; - r.length = sizeof(rr->address); - r.data = (void *)&rr->address; - return r; + r.length = sizeof(rr->address); + r.data = (void *)&rr->address; + return r; } static void* aaaa_validate_set(struct rr_set *rr_set) { - if (rr_set->named_rr->flags & NAME_FLAG_CONTAINS_SLASH) { - struct rr *rr = rr_set->tail; - return moan(rr->file_name, rr->line, "host name contains '/'"); - } - return NULL; + if (rr_set->named_rr->flags & NAME_FLAG_CONTAINS_SLASH) { + struct rr *rr = rr_set->tail; + return moan(rr->file_name, rr->line, "host name contains '/'"); + } + return NULL; } struct rr_methods aaaa_methods = { aaaa_parse, aaaa_human, aaaa_wirerdata, aaaa_validate_set, NULL }; diff -Naur validns-0.8/a.c validns/a.c --- validns-0.8/a.c 2014-02-11 15:47:08.000000000 -0500 +++ validns/a.c 2020-10-05 16:59:29.353681351 -0400 @@ -20,44 +20,44 @@ static struct rr *a_parse(char *name, long ttl, int type, char *s) { - struct rr_a *rr = getmem(sizeof(*rr)); + struct rr_a *rr = getmem(sizeof(*rr)); - if (extract_ipv4(&s, "IPv4 address", &rr->address) <= 0) - return NULL; - if (*s) { - return bitch("garbage after valid A data"); - } + if (extract_ipv4(&s, "IPv4 address", &rr->address) <= 0) + return NULL; + if (*s) { + return bitch("garbage after valid A data"); + } - return store_record(type, name, ttl, rr); + return store_record(type, name, ttl, rr); } static char* a_human(struct rr *rrv) { - RRCAST(a); - char s[1024]; + RRCAST(a); + char s[1024]; - if (inet_ntop(AF_INET, &rr->address, s, 1024)) - return quickstrdup_temp(s); - return "????"; + if (inet_ntop(AF_INET, &rr->address, s, 1024)) + return quickstrdup_temp(s); + return "????"; } static struct binary_data a_wirerdata(struct rr *rrv) { - RRCAST(a); - struct binary_data r; + RRCAST(a); + struct binary_data r; - r.length = sizeof(rr->address); - r.data = (void *)&rr->address; - return r; + r.length = sizeof(rr->address); + r.data = (void *)&rr->address; + return r; } static void* a_validate_set(struct rr_set *rr_set) { - if (rr_set->named_rr->flags & NAME_FLAG_CONTAINS_SLASH) { - struct rr *rr = rr_set->tail; - return moan(rr->file_name, rr->line, "host name contains '/'"); - } - return NULL; + if (rr_set->named_rr->flags & NAME_FLAG_CONTAINS_SLASH) { + struct rr *rr = rr_set->tail; + return moan(rr->file_name, rr->line, "host name contains '/'"); + } + return NULL; } struct rr_methods a_methods = { a_parse, a_human, a_wirerdata, a_validate_set, NULL }; diff -Naur validns-0.8/afsdb.c validns/afsdb.c --- validns-0.8/afsdb.c 2014-02-11 15:46:27.000000000 -0500 +++ validns/afsdb.c 2020-10-05 16:59:29.353681351 -0400 @@ -19,42 +19,42 @@ static struct rr *afsdb_parse(char *name, long ttl, int type, char *s) { - struct rr_afsdb *rr = getmem(sizeof(*rr)); + struct rr_afsdb *rr = getmem(sizeof(*rr)); - rr->subtype = extract_integer(&s, "AFSDB subtype"); - if (rr->subtype < 0) - return NULL; + rr->subtype = extract_integer(&s, "AFSDB subtype", NULL); + if (rr->subtype < 0) + return NULL; - if (rr->subtype != 1 && rr->subtype != 2) - return bitch("unknown AFSDB subtype"); + if (rr->subtype != 1 && rr->subtype != 2) + return bitch("unknown AFSDB subtype"); - rr->hostname = extract_name(&s, "AFSDB hostname", 0); - if (!rr->hostname) - return NULL; + rr->hostname = extract_name(&s, "AFSDB hostname", 0); + if (!rr->hostname) + return NULL; - if (*s) { - return bitch("garbage after valid AFSDB data"); - } + if (*s) { + return bitch("garbage after valid AFSDB data"); + } - return store_record(type, name, ttl, rr); + return store_record(type, name, ttl, rr); } static char* afsdb_human(struct rr *rrv) { - RRCAST(afsdb); + RRCAST(afsdb); char s[1024]; snprintf(s, 1024, "%d %s", - rr->subtype, rr->hostname); + rr->subtype, rr->hostname); return quickstrdup_temp(s); } static struct binary_data afsdb_wirerdata(struct rr *rrv) { - RRCAST(afsdb); + RRCAST(afsdb); return compose_binary_data("2d", 1, - rr->subtype, name2wire_name(rr->hostname)); + rr->subtype, name2wire_name(rr->hostname)); } struct rr_methods afsdb_methods = { afsdb_parse, afsdb_human, afsdb_wirerdata, NULL, NULL }; diff -Naur validns-0.8/base32hex.c validns/base32hex.c --- validns-0.8/base32hex.c 2014-02-11 15:44:11.000000000 -0500 +++ validns/base32hex.c 2020-10-05 16:59:29.353681351 -0400 @@ -36,319 +36,319 @@ int decode_base32hex(void *dest, char *src, size_t dstsize) { - size_t processed = 0; - int full_bytes = 0; - unsigned char *dst = dest; - - while (*src) { - int v; - if (*src >= 'A' && *src <= 'V') - v = *src - 'A' + 10; - else if (*src >= 'a' && *src <= 'v') - v = *src - 'a' + 10; - else if (*src >= '0' && *src <= '9') - v = *src - '0'; - else if (isspace(*src) || *src == '=') { - src++; - continue; - } else { - /* any junk chars means input is corrupted */ - errno = EINVAL; - return -1; - } - src++; - if (processed % 8 == 0) { - if (dstsize <= 0) { - errno = EINVAL; - return -1; - } - dst[0] &= 0x07; - dst[0] |= (v << 3) & 0xF8; - processed++; - } else if (processed % 8 == 1) { - if (dstsize < 1) { - errno = EINVAL; - return -1; - } - dst[0] &= 0xF8; - dst[0] |= (v >> 2) & 0x07; - if (dstsize >= 2) { - dst[1] &= 0x3F; - dst[1] |= (v << 6) & 0xC0; - } - processed++; - full_bytes++; - } else if (processed % 8 == 2) { - if (dstsize < 2) { - errno = EINVAL; - return -1; - } - dst[1] &= 0xC1; - dst[1] |= (v << 1) & 0x3E; - processed++; - } else if (processed % 8 == 3) { - if (dstsize < 2) { - errno = EINVAL; - return -1; - } - dst[1] &= 0xFE; - dst[1] |= (v >> 4) & 0x01; - if (dstsize >= 3) { - dst[2] &= 0x0F; - dst[2] |= (v << 4) & 0xF0; - } - processed++; - full_bytes++; - } else if (processed % 8 == 4) { - if (dstsize < 3) { - errno = EINVAL; - return -1; - } - dst[2] &= 0xF0; - dst[2] |= (v >> 1) & 0x0F; - if (dstsize >= 4) { - dst[3] &= 0x7F; - dst[3] |= (v << 7) & 0x80; - } - processed++; - full_bytes++; - } else if (processed % 8 == 5) { - if (dstsize < 4) { - errno = EINVAL; - return -1; - } - dst[3] &= 0x83; - dst[3] |= (v << 2) & 0x7C; - processed++; - } else if (processed % 8 == 6) { - if (dstsize < 4) { - errno = EINVAL; - return -1; - } - dst[3] &= 0xFC; - dst[3] |= (v >> 3) & 0x03; - if (dstsize >= 5) { - dst[4] &= 0x1F; - dst[4] |= (v << 5) & 0xE0; - } - processed++; - full_bytes++; - } else { - if (dstsize < 5) { - errno = EINVAL; - return -1; - } - dst[4] &= 0xE0; - dst[4] |= v & 0x1F; - processed++; - dst += 5; - dstsize -= 5; - full_bytes++; - } - } - return full_bytes; + size_t processed = 0; + int full_bytes = 0; + unsigned char *dst = dest; + + while (*src) { + int v; + if (*src >= 'A' && *src <= 'V') + v = *src - 'A' + 10; + else if (*src >= 'a' && *src <= 'v') + v = *src - 'a' + 10; + else if (*src >= '0' && *src <= '9') + v = *src - '0'; + else if (isspace(*src) || *src == '=') { + src++; + continue; + } else { + /* any junk chars means input is corrupted */ + errno = EINVAL; + return -1; + } + src++; + if (processed % 8 == 0) { + if (dstsize <= 0) { + errno = EINVAL; + return -1; + } + dst[0] &= 0x07; + dst[0] |= (v << 3) & 0xF8; + processed++; + } else if (processed % 8 == 1) { + if (dstsize < 1) { + errno = EINVAL; + return -1; + } + dst[0] &= 0xF8; + dst[0] |= (v >> 2) & 0x07; + if (dstsize >= 2) { + dst[1] &= 0x3F; + dst[1] |= (v << 6) & 0xC0; + } + processed++; + full_bytes++; + } else if (processed % 8 == 2) { + if (dstsize < 2) { + errno = EINVAL; + return -1; + } + dst[1] &= 0xC1; + dst[1] |= (v << 1) & 0x3E; + processed++; + } else if (processed % 8 == 3) { + if (dstsize < 2) { + errno = EINVAL; + return -1; + } + dst[1] &= 0xFE; + dst[1] |= (v >> 4) & 0x01; + if (dstsize >= 3) { + dst[2] &= 0x0F; + dst[2] |= (v << 4) & 0xF0; + } + processed++; + full_bytes++; + } else if (processed % 8 == 4) { + if (dstsize < 3) { + errno = EINVAL; + return -1; + } + dst[2] &= 0xF0; + dst[2] |= (v >> 1) & 0x0F; + if (dstsize >= 4) { + dst[3] &= 0x7F; + dst[3] |= (v << 7) & 0x80; + } + processed++; + full_bytes++; + } else if (processed % 8 == 5) { + if (dstsize < 4) { + errno = EINVAL; + return -1; + } + dst[3] &= 0x83; + dst[3] |= (v << 2) & 0x7C; + processed++; + } else if (processed % 8 == 6) { + if (dstsize < 4) { + errno = EINVAL; + return -1; + } + dst[3] &= 0xFC; + dst[3] |= (v >> 3) & 0x03; + if (dstsize >= 5) { + dst[4] &= 0x1F; + dst[4] |= (v << 5) & 0xE0; + } + processed++; + full_bytes++; + } else { + if (dstsize < 5) { + errno = EINVAL; + return -1; + } + dst[4] &= 0xE0; + dst[4] |= v & 0x1F; + processed++; + dst += 5; + dstsize -= 5; + full_bytes++; + } + } + return full_bytes; } int encode_base32hex(void *dest, size_t dstsize, void *source, size_t srclength) { - size_t need_dstsize; - int byte = 0; - unsigned char *dst = dest; - unsigned char *src = source; - int i; - - need_dstsize = 8*(srclength / 5); - switch (srclength % 5) { - case 1: need_dstsize += 2; break; - case 2: need_dstsize += 4; break; - case 3: need_dstsize += 5; break; - case 4: need_dstsize += 7; break; - } - if (dstsize < need_dstsize) { - errno = EINVAL; - return -1; - } - while (srclength) { - switch (byte) { - case 0: - dst[0] = *src >> 3; - dst[1] = (*src & 0x07) << 2; - break; - case 1: - dst[1] |= (*src >> 6) & 0x03; - dst[2] = (*src >> 1) & 0x1f; - dst[3] = (*src & 0x01) << 4; - break; - case 2: - dst[3] |= (*src >> 4) & 0x0f; - dst[4] = (*src & 0x0f) << 1; - break; - case 3: - dst[4] |= (*src >> 7) & 0x01; - dst[5] = (*src >> 2) & 0x1f; - dst[6] = (*src & 0x03) << 3; - break; - case 4: - dst[6] |= (*src >> 5) & 0x07; - dst[7] = *src & 0x1f; - break; - } - - srclength--; - src++; - byte++; - if (byte == 5) { - dst += 8; - byte = 0; - } - } - dst = dest; - for (i = 0; i < need_dstsize; i++) { - if (*dst < 10) - *dst = *dst +'0'; - else if (*dst < 32) - *dst = *dst - 10 + 'a'; - else - *dst = '?'; - dst++; - } - return need_dstsize; + size_t need_dstsize; + int byte = 0; + unsigned char *dst = dest; + unsigned char *src = source; + int i; + + need_dstsize = 8*(srclength / 5); + switch (srclength % 5) { + case 1: need_dstsize += 2; break; + case 2: need_dstsize += 4; break; + case 3: need_dstsize += 5; break; + case 4: need_dstsize += 7; break; + } + if (dstsize < need_dstsize) { + errno = EINVAL; + return -1; + } + while (srclength) { + switch (byte) { + case 0: + dst[0] = *src >> 3; + dst[1] = (*src & 0x07) << 2; + break; + case 1: + dst[1] |= (*src >> 6) & 0x03; + dst[2] = (*src >> 1) & 0x1f; + dst[3] = (*src & 0x01) << 4; + break; + case 2: + dst[3] |= (*src >> 4) & 0x0f; + dst[4] = (*src & 0x0f) << 1; + break; + case 3: + dst[4] |= (*src >> 7) & 0x01; + dst[5] = (*src >> 2) & 0x1f; + dst[6] = (*src & 0x03) << 3; + break; + case 4: + dst[6] |= (*src >> 5) & 0x07; + dst[7] = *src & 0x1f; + break; + } + + srclength--; + src++; + byte++; + if (byte == 5) { + dst += 8; + byte = 0; + } + } + dst = dest; + for (i = 0; i < need_dstsize; i++) { + if (*dst < 10) + *dst = *dst +'0'; + else if (*dst < 32) + *dst = *dst - 10 + 'a'; + else + *dst = '?'; + dst++; + } + return need_dstsize; } #ifdef TEST_PROGRAM static int ok_string_test(int testnum, char *src, char *expect) { - unsigned char dstbuf[512]; - unsigned char reverse_buf[1024]; - int r, r0, i; - int expect_sz = strlen(expect); - int expect_reverse; - char *s, *d; - - if (expect_sz >= 512) { - printf("test %d: NOT OK: internal *test* error, buffer too small for proper testing, FIXME\n", testnum); - return 1; - } - memset(dstbuf, 0xAA, 512); - r = decode_base32hex(dstbuf, src, expect_sz); - if (r != expect_sz) { - printf("test %d: NOT OK: expect size %d, got %d\n", testnum, expect_sz, r); - return 1; - } else if (memcmp(dstbuf, expect, r) != 0) { - printf("test %d: NOT OK: unexpected buffer content\n", testnum); - return 1; - } - if (dstbuf[expect_sz] != 0xAA) { - printf("test %d: NOT OK: corrupts memory with \"just enough\" bufsize\n", testnum); - return 1; - } - r = encode_base32hex(reverse_buf, 1024, dstbuf, expect_sz); - s = src; d = (char*)dstbuf; - expect_reverse = 0; - while (*s) { - if (*s != ' ' && *s != '=') { - *d++ = tolower(*s); - expect_reverse++; - } - s++; - } - if (r != expect_reverse) { - printf("test %d: NOT OK: REVERSE: expect size %d, got %d\n", testnum, expect_reverse, r); - return 1; - } else if (memcmp(reverse_buf, dstbuf, r) != 0) { - printf("test %d: NOT OK: REVERSE: unexpected buffer content\n", testnum); - return 1; - } - memset(dstbuf, 0xAA, 512); - for (i = 0; i < expect_sz; i++) { - r0 = decode_base32hex(dstbuf, src, i); - if (r0 > 0) { - printf("test %d: NOT OK: buffer size %d should not be enough\n", testnum, i); - return 1; - } - if (dstbuf[i] != 0xAA) { - printf("test %d: NOT OK: corrupts memory with bufsize %d\n", testnum, i); - return 1; - } - } - printf("test %d: ok\n", testnum); - return 0; + unsigned char dstbuf[512]; + unsigned char reverse_buf[1024]; + int r, r0, i; + int expect_sz = strlen(expect); + int expect_reverse; + char *s, *d; + + if (expect_sz >= 512) { + printf("test %d: NOT OK: internal *test* error, buffer too small for proper testing, FIXME\n", testnum); + return 1; + } + memset(dstbuf, 0xAA, 512); + r = decode_base32hex(dstbuf, src, expect_sz); + if (r != expect_sz) { + printf("test %d: NOT OK: expect size %d, got %d\n", testnum, expect_sz, r); + return 1; + } else if (memcmp(dstbuf, expect, r) != 0) { + printf("test %d: NOT OK: unexpected buffer content\n", testnum); + return 1; + } + if (dstbuf[expect_sz] != 0xAA) { + printf("test %d: NOT OK: corrupts memory with \"just enough\" bufsize\n", testnum); + return 1; + } + r = encode_base32hex(reverse_buf, 1024, dstbuf, expect_sz); + s = src; d = (char*)dstbuf; + expect_reverse = 0; + while (*s) { + if (*s != ' ' && *s != '=') { + *d++ = tolower(*s); + expect_reverse++; + } + s++; + } + if (r != expect_reverse) { + printf("test %d: NOT OK: REVERSE: expect size %d, got %d\n", testnum, expect_reverse, r); + return 1; + } else if (memcmp(reverse_buf, dstbuf, r) != 0) { + printf("test %d: NOT OK: REVERSE: unexpected buffer content\n", testnum); + return 1; + } + memset(dstbuf, 0xAA, 512); + for (i = 0; i < expect_sz; i++) { + r0 = decode_base32hex(dstbuf, src, i); + if (r0 > 0) { + printf("test %d: NOT OK: buffer size %d should not be enough\n", testnum, i); + return 1; + } + if (dstbuf[i] != 0xAA) { + printf("test %d: NOT OK: corrupts memory with bufsize %d\n", testnum, i); + return 1; + } + } + printf("test %d: ok\n", testnum); + return 0; } static int expect_junk_error(int testnum, char *src) { - char *buf[20]; - int r; + char *buf[20]; + int r; - r = decode_base32hex(buf, src, 20); - if (r != -1) { - printf("test %d: NOT OK: junk input not recognized\n", testnum); - return 1; - } - printf("test %d: ok\n", testnum); - return 0; + r = decode_base32hex(buf, src, 20); + if (r != -1) { + printf("test %d: NOT OK: junk input not recognized\n", testnum); + return 1; + } + printf("test %d: ok\n", testnum); + return 0; } int main(void) { - int ret = 0; - int t = 1; + int ret = 0; + int t = 1; - /* from http://tools.ietf.org/html/rfc4648#section-10 */ - ret |= ok_string_test(t++, "", ""); - ret |= ok_string_test(t++, "CO======", "f"); - ret |= ok_string_test(t++, "Co=====", "f"); - ret |= ok_string_test(t++, "cO====", "f"); - ret |= ok_string_test(t++, "co===", "f"); - ret |= ok_string_test(t++, "CO==", "f"); - ret |= ok_string_test(t++, "CO=", "f"); - ret |= ok_string_test(t++, "CO", "f"); - - ret |= ok_string_test(t++, "CPNG====", "fo"); - ret |= ok_string_test(t++, "cPNG===", "fo"); - ret |= ok_string_test(t++, "cpNG==", "fo"); - ret |= ok_string_test(t++, "cpnG=", "fo"); - ret |= ok_string_test(t++, "cpng", "fo"); - - ret |= ok_string_test(t++, "CPNMU===", "foo"); - ret |= ok_string_test(t++, "CPnMU==", "foo"); - ret |= ok_string_test(t++, "CPnmu=", "foo"); - ret |= ok_string_test(t++, "cpNMU", "foo"); - - ret |= ok_string_test(t++, "CPNMUOG=", "foob"); - ret |= ok_string_test(t++, "CPNMUoG", "foob"); - - ret |= ok_string_test(t++, "CPNMUOJ1", "fooba"); - ret |= ok_string_test(t++, "cPnMuOj1", "fooba"); - ret |= ok_string_test(t++, "CpNmUoJ1", "fooba"); - ret |= ok_string_test(t++, "CpNm UoJ1", "fooba"); - - ret |= ok_string_test(t++, "CPNMUOJ1E8======", "foobar"); - ret |= ok_string_test(t++, "CPNMuOJ1E8=====", "foobar"); - ret |= ok_string_test(t++, "CpNMuOJ1E8====", "foobar"); - ret |= ok_string_test(t++, "CpNMuOJ1e8===", "foobar"); - ret |= ok_string_test(t++, "CpNmuOJ 1e8==", "foobar"); - ret |= ok_string_test(t++, "CpnmuOJ 1e8=", "foobar"); - ret |= ok_string_test(t++, "Cpn muOj 1e8", "foobar"); - - ret |= expect_junk_error(t++, "?m9vmF"); - ret |= expect_junk_error(t++, "%m9vmF"); - ret |= expect_junk_error(t++, "m&9vmF"); - ret |= expect_junk_error(t++, "m9-vmF"); - ret |= expect_junk_error(t++, "m9v*mF"); - ret |= expect_junk_error(t++, "m9v#mF"); - ret |= expect_junk_error(t++, "m9vm\x01F"); - ret |= expect_junk_error(t++, "m9vmF!"); - ret |= expect_junk_error(t++, "m9vmF."); - ret |= expect_junk_error(t++, "CpnmuOj/1e8x"); - ret |= expect_junk_error(t++, "CpnYmuOj1e8"); - ret |= expect_junk_error(t++, "CZpnmuOj1e8"); - ret |= expect_junk_error(t++, "CzpnmuOj1e8"); + /* from http://tools.ietf.org/html/rfc4648#section-10 */ + ret |= ok_string_test(t++, "", ""); + ret |= ok_string_test(t++, "CO======", "f"); + ret |= ok_string_test(t++, "Co=====", "f"); + ret |= ok_string_test(t++, "cO====", "f"); + ret |= ok_string_test(t++, "co===", "f"); + ret |= ok_string_test(t++, "CO==", "f"); + ret |= ok_string_test(t++, "CO=", "f"); + ret |= ok_string_test(t++, "CO", "f"); + + ret |= ok_string_test(t++, "CPNG====", "fo"); + ret |= ok_string_test(t++, "cPNG===", "fo"); + ret |= ok_string_test(t++, "cpNG==", "fo"); + ret |= ok_string_test(t++, "cpnG=", "fo"); + ret |= ok_string_test(t++, "cpng", "fo"); + + ret |= ok_string_test(t++, "CPNMU===", "foo"); + ret |= ok_string_test(t++, "CPnMU==", "foo"); + ret |= ok_string_test(t++, "CPnmu=", "foo"); + ret |= ok_string_test(t++, "cpNMU", "foo"); + + ret |= ok_string_test(t++, "CPNMUOG=", "foob"); + ret |= ok_string_test(t++, "CPNMUoG", "foob"); + + ret |= ok_string_test(t++, "CPNMUOJ1", "fooba"); + ret |= ok_string_test(t++, "cPnMuOj1", "fooba"); + ret |= ok_string_test(t++, "CpNmUoJ1", "fooba"); + ret |= ok_string_test(t++, "CpNm UoJ1", "fooba"); + + ret |= ok_string_test(t++, "CPNMUOJ1E8======", "foobar"); + ret |= ok_string_test(t++, "CPNMuOJ1E8=====", "foobar"); + ret |= ok_string_test(t++, "CpNMuOJ1E8====", "foobar"); + ret |= ok_string_test(t++, "CpNMuOJ1e8===", "foobar"); + ret |= ok_string_test(t++, "CpNmuOJ 1e8==", "foobar"); + ret |= ok_string_test(t++, "CpnmuOJ 1e8=", "foobar"); + ret |= ok_string_test(t++, "Cpn muOj 1e8", "foobar"); + + ret |= expect_junk_error(t++, "?m9vmF"); + ret |= expect_junk_error(t++, "%m9vmF"); + ret |= expect_junk_error(t++, "m&9vmF"); + ret |= expect_junk_error(t++, "m9-vmF"); + ret |= expect_junk_error(t++, "m9v*mF"); + ret |= expect_junk_error(t++, "m9v#mF"); + ret |= expect_junk_error(t++, "m9vm\x01F"); + ret |= expect_junk_error(t++, "m9vmF!"); + ret |= expect_junk_error(t++, "m9vmF."); + ret |= expect_junk_error(t++, "CpnmuOj/1e8x"); + ret |= expect_junk_error(t++, "CpnYmuOj1e8"); + ret |= expect_junk_error(t++, "CZpnmuOj1e8"); + ret |= expect_junk_error(t++, "CzpnmuOj1e8"); - ret |= ok_string_test(t++, "MEQIMI6FJE5NI47PJAHV5QIGU1LV3JLJ", "\xb3\xb5\x2b\x48\xcf\x9b\x8b\x79\x10\xf9\x9a\xa3\xf2\xea\x50\xf0\x6b\xf1\xce\xb3"); + ret |= ok_string_test(t++, "MEQIMI6FJE5NI47PJAHV5QIGU1LV3JLJ", "\xb3\xb5\x2b\x48\xcf\x9b\x8b\x79\x10\xf9\x9a\xa3\xf2\xea\x50\xf0\x6b\xf1\xce\xb3"); - return ret; + return ret; } #endif diff -Naur validns-0.8/base64.c validns/base64.c --- validns-0.8/base64.c 2014-02-11 15:45:08.000000000 -0500 +++ validns/base64.c 2020-10-05 16:59:29.353681351 -0400 @@ -23,180 +23,180 @@ int decode_base64(void *dest, char *src, size_t dstsize) { - size_t processed = 0; - int full_bytes = 0; - unsigned char *dst = dest; - - while (*src) { - int v; - if (*src >= 'A' && *src <= 'Z') - v = *src - 'A'; - else if (*src >= 'a' && *src <= 'z') - v = 26 + *src - 'a'; - else if (*src >= '0' && *src <= '9') - v = 52 + *src - '0'; - else if (*src == '+') - v = 62; - else if (*src == '/') - v = 63; - else if (isspace(*src) || *src == '=') { - src++; - continue; - } else { - /* any junk chars means input is corrupted */ - errno = EINVAL; - return -1; - } - src++; - if (processed % 4 == 0) { - if (dstsize <= 0) { - errno = EINVAL; - return -1; - } - dst[0] &= 0x03; - dst[0] |= (v << 2) & 0xFC; - processed++; - } else if (processed % 4 == 1) { - if (dstsize < 1) { - errno = EINVAL; - return -1; - } - dst[0] &= 0xFC; - dst[0] |= (v >> 4) & 0x03; - if (dstsize >= 2) { - dst[1] &= 0x0F; - dst[1] |= (v << 4) & 0xF0; - } - processed++; - full_bytes++; - } else if (processed % 4 == 2) { - if (dstsize < 2) { - errno = EINVAL; - return -1; - } - dst[1] &= 0xF0; - dst[1] |= (v >> 2) & 0x0F; - if (dstsize >= 3) { - dst[2] &= 0x3F; - dst[2] |= (v << 6) & 0xC0; - } - processed++; - full_bytes++; - } else { - if (dstsize <= 2) { - errno = EINVAL; - return -1; - } - dst[2] &= 0xC0; - dst[2] |= v & 0x3F; - processed++; - dst += 3; - dstsize -= 3; - full_bytes++; - } - } - return full_bytes; + size_t processed = 0; + int full_bytes = 0; + unsigned char *dst = dest; + + while (*src) { + int v; + if (*src >= 'A' && *src <= 'Z') + v = *src - 'A'; + else if (*src >= 'a' && *src <= 'z') + v = 26 + *src - 'a'; + else if (*src >= '0' && *src <= '9') + v = 52 + *src - '0'; + else if (*src == '+') + v = 62; + else if (*src == '/') + v = 63; + else if (isspace(*src) || *src == '=') { + src++; + continue; + } else { + /* any junk chars means input is corrupted */ + errno = EINVAL; + return -1; + } + src++; + if (processed % 4 == 0) { + if (dstsize <= 0) { + errno = EINVAL; + return -1; + } + dst[0] &= 0x03; + dst[0] |= (v << 2) & 0xFC; + processed++; + } else if (processed % 4 == 1) { + if (dstsize < 1) { + errno = EINVAL; + return -1; + } + dst[0] &= 0xFC; + dst[0] |= (v >> 4) & 0x03; + if (dstsize >= 2) { + dst[1] &= 0x0F; + dst[1] |= (v << 4) & 0xF0; + } + processed++; + full_bytes++; + } else if (processed % 4 == 2) { + if (dstsize < 2) { + errno = EINVAL; + return -1; + } + dst[1] &= 0xF0; + dst[1] |= (v >> 2) & 0x0F; + if (dstsize >= 3) { + dst[2] &= 0x3F; + dst[2] |= (v << 6) & 0xC0; + } + processed++; + full_bytes++; + } else { + if (dstsize <= 2) { + errno = EINVAL; + return -1; + } + dst[2] &= 0xC0; + dst[2] |= v & 0x3F; + processed++; + dst += 3; + dstsize -= 3; + full_bytes++; + } + } + return full_bytes; } #ifdef TEST_PROGRAM static int ok_string_test(int testnum, char *src, char *expect) { - unsigned char dstbuf[512]; - int r, r0, i; - int expect_sz = strlen(expect); - - if (expect_sz >= 512) { - printf("test %d: NOT OK: internal *test* error, buffer too small for proper testing, FIXME\n", testnum); - return 1; - } - memset(dstbuf, 0xAA, 512); - r = decode_base64(dstbuf, src, expect_sz); - if (r != expect_sz) { - printf("test %d: NOT OK: expect size %d, got %d\n", testnum, expect_sz, r); - return 1; - } else if (memcmp(dstbuf, expect, r) != 0) { - printf("test %d: NOT OK: unexpected buffer content\n", testnum); - return 1; - } - if (dstbuf[expect_sz] != 0xAA) { - printf("test %d: NOT OK: corrupts memory with \"just enough\" bufsize\n", testnum); - return 1; - } - memset(dstbuf, 0xAA, 512); - for (i = 0; i < expect_sz; i++) { - r0 = decode_base64(dstbuf, src, i); - if (r0 > 0) { - printf("test %d: NOT OK: buffer size %d should not be enough\n", testnum, i); - return 1; - } - if (dstbuf[i] != 0xAA) { - printf("test %d: NOT OK: corrupts memory with bufsize %d\n", testnum, i); - return 1; - } - } - printf("test %d: ok\n", testnum); - return 0; + unsigned char dstbuf[512]; + int r, r0, i; + int expect_sz = strlen(expect); + + if (expect_sz >= 512) { + printf("test %d: NOT OK: internal *test* error, buffer too small for proper testing, FIXME\n", testnum); + return 1; + } + memset(dstbuf, 0xAA, 512); + r = decode_base64(dstbuf, src, expect_sz); + if (r != expect_sz) { + printf("test %d: NOT OK: expect size %d, got %d\n", testnum, expect_sz, r); + return 1; + } else if (memcmp(dstbuf, expect, r) != 0) { + printf("test %d: NOT OK: unexpected buffer content\n", testnum); + return 1; + } + if (dstbuf[expect_sz] != 0xAA) { + printf("test %d: NOT OK: corrupts memory with \"just enough\" bufsize\n", testnum); + return 1; + } + memset(dstbuf, 0xAA, 512); + for (i = 0; i < expect_sz; i++) { + r0 = decode_base64(dstbuf, src, i); + if (r0 > 0) { + printf("test %d: NOT OK: buffer size %d should not be enough\n", testnum, i); + return 1; + } + if (dstbuf[i] != 0xAA) { + printf("test %d: NOT OK: corrupts memory with bufsize %d\n", testnum, i); + return 1; + } + } + printf("test %d: ok\n", testnum); + return 0; } static int expect_junk_error(int testnum, char *src) { - char *buf[20]; - int r; + char *buf[20]; + int r; - r = decode_base64(buf, src, 20); - if (r != -1) { - printf("test %d: NOT OK: junk input not recognized\n", testnum); - return 1; - } - printf("test %d: ok\n", testnum); - return 0; + r = decode_base64(buf, src, 20); + if (r != -1) { + printf("test %d: NOT OK: junk input not recognized\n", testnum); + return 1; + } + printf("test %d: ok\n", testnum); + return 0; } int main(void) { - int ret = 0; + int ret = 0; - /* from http://en.wikipedia.org/wiki/Base64 */ - ret |= ok_string_test(1, "bGVhc3VyZS4=", "leasure."); - ret |= ok_string_test(2, "bGVhc3VyZS4", "leasure."); - ret |= ok_string_test(3, "ZWFzdXJlLg==", "easure."); - ret |= ok_string_test(4, "ZWFzdXJlLg=", "easure."); - ret |= ok_string_test(5, "ZWFzdXJlLg", "easure."); - ret |= ok_string_test(6, "YXN1cmUu", "asure."); - ret |= ok_string_test(7, "c3VyZS4=", "sure."); - ret |= ok_string_test(8, "c3VyZS4", "sure."); - ret |= ok_string_test(9, "TWFuIGlzIGRpc3Rpbmd1aXNoZWQsIG5vdCBvbmx5IGJ5IGhpcyByZWFzb24sIGJ1dCBieSB0aGlz\n" - "IHNpbmd1bGFyIHBhc3Npb24gZnJvbSBvdGhlciBhbmltYWxzLCB3aGljaCBpcyBhIGx1c3Qgb2Yg\n" - "dGhlIG1pbmQsIHRoYXQgYnkgYSBwZXJzZXZlcmFuY2Ugb2YgZGVsaWdodCBpbiB0aGUgY29udGlu\n" - "dWVkIGFuZCBpbmRlZmF0aWdhYmxlIGdlbmVyYXRpb24gb2Yga25vd2xlZGdlLCBleGNlZWRzIHRo\n" - "ZSBzaG9ydCB2ZWhlbWVuY2Ugb2YgYW55IGNhcm5hbCBwbGVhc3VyZS4=", - "Man is distinguished, not only by his reason, but by this singular passion from other animals, which is a lust of the mind, that by a perseverance of delight in the continued and indefatigable generation of knowledge, exceeds the short vehemence of any carnal pleasure."); - /* from http://tools.ietf.org/html/rfc4648#section-10 */ - ret |= ok_string_test(10, "", ""); - ret |= ok_string_test(11, "Zg==", "f"); - ret |= ok_string_test(12, "Zg=", "f"); - ret |= ok_string_test(13, "Zg", "f"); - ret |= ok_string_test(14, "Zm8=", "fo"); - ret |= ok_string_test(15, "Zm8", "fo"); - ret |= ok_string_test(16, "Zm9v", "foo"); - ret |= ok_string_test(17, "Zm9vYg==", "foob"); - ret |= ok_string_test(18, "Zm9vYg=", "foob"); - ret |= ok_string_test(19, "Zm9vYg", "foob"); - ret |= ok_string_test(20, "Zm9vYmE=", "fooba"); - ret |= ok_string_test(21, "Zm9vYmE", "fooba"); - ret |= ok_string_test(22, "Zm9vYmFy", "foobar"); - - ret |= expect_junk_error(23, "?Zm9vYmFy"); - ret |= expect_junk_error(24, "Z%m9vYmFy"); - ret |= expect_junk_error(25, "Zm&9vYmFy"); - ret |= expect_junk_error(26, "Zm9-vYmFy"); - ret |= expect_junk_error(27, "Zm9v*YmFy"); - ret |= expect_junk_error(28, "Zm9vY#mFy"); - ret |= expect_junk_error(29, "Zm9vYm\x01Fy"); - ret |= expect_junk_error(30, "Zm9vYmF!y"); - ret |= expect_junk_error(31, "Zm9vYmFy."); + /* from http://en.wikipedia.org/wiki/Base64 */ + ret |= ok_string_test(1, "bGVhc3VyZS4=", "leasure."); + ret |= ok_string_test(2, "bGVhc3VyZS4", "leasure."); + ret |= ok_string_test(3, "ZWFzdXJlLg==", "easure."); + ret |= ok_string_test(4, "ZWFzdXJlLg=", "easure."); + ret |= ok_string_test(5, "ZWFzdXJlLg", "easure."); + ret |= ok_string_test(6, "YXN1cmUu", "asure."); + ret |= ok_string_test(7, "c3VyZS4=", "sure."); + ret |= ok_string_test(8, "c3VyZS4", "sure."); + ret |= ok_string_test(9, "TWFuIGlzIGRpc3Rpbmd1aXNoZWQsIG5vdCBvbmx5IGJ5IGhpcyByZWFzb24sIGJ1dCBieSB0aGlz\n" + "IHNpbmd1bGFyIHBhc3Npb24gZnJvbSBvdGhlciBhbmltYWxzLCB3aGljaCBpcyBhIGx1c3Qgb2Yg\n" + "dGhlIG1pbmQsIHRoYXQgYnkgYSBwZXJzZXZlcmFuY2Ugb2YgZGVsaWdodCBpbiB0aGUgY29udGlu\n" + "dWVkIGFuZCBpbmRlZmF0aWdhYmxlIGdlbmVyYXRpb24gb2Yga25vd2xlZGdlLCBleGNlZWRzIHRo\n" + "ZSBzaG9ydCB2ZWhlbWVuY2Ugb2YgYW55IGNhcm5hbCBwbGVhc3VyZS4=", + "Man is distinguished, not only by his reason, but by this singular passion from other animals, which is a lust of the mind, that by a perseverance of delight in the continued and indefatigable generation of knowledge, exceeds the short vehemence of any carnal pleasure."); + /* from http://tools.ietf.org/html/rfc4648#section-10 */ + ret |= ok_string_test(10, "", ""); + ret |= ok_string_test(11, "Zg==", "f"); + ret |= ok_string_test(12, "Zg=", "f"); + ret |= ok_string_test(13, "Zg", "f"); + ret |= ok_string_test(14, "Zm8=", "fo"); + ret |= ok_string_test(15, "Zm8", "fo"); + ret |= ok_string_test(16, "Zm9v", "foo"); + ret |= ok_string_test(17, "Zm9vYg==", "foob"); + ret |= ok_string_test(18, "Zm9vYg=", "foob"); + ret |= ok_string_test(19, "Zm9vYg", "foob"); + ret |= ok_string_test(20, "Zm9vYmE=", "fooba"); + ret |= ok_string_test(21, "Zm9vYmE", "fooba"); + ret |= ok_string_test(22, "Zm9vYmFy", "foobar"); + + ret |= expect_junk_error(23, "?Zm9vYmFy"); + ret |= expect_junk_error(24, "Z%m9vYmFy"); + ret |= expect_junk_error(25, "Zm&9vYmFy"); + ret |= expect_junk_error(26, "Zm9-vYmFy"); + ret |= expect_junk_error(27, "Zm9v*YmFy"); + ret |= expect_junk_error(28, "Zm9vY#mFy"); + ret |= expect_junk_error(29, "Zm9vYm\x01Fy"); + ret |= expect_junk_error(30, "Zm9vYmF!y"); + ret |= expect_junk_error(31, "Zm9vYmFy."); - return ret; + return ret; } #endif diff -Naur validns-0.8/caa.c validns/caa.c --- validns-0.8/caa.c 1969-12-31 19:00:00.000000000 -0500 +++ validns/caa.c 2020-10-05 16:59:29.353681351 -0400 @@ -0,0 +1,90 @@ +/* + * Part of DNS zone file validator `validns`. + * + * Copyright 2011-2017 Anton Berezin + * Modified BSD license. + * (See LICENSE file in the distribution.) + * + */ +#include +#include +#include +#include +#include + +#include "common.h" +#include "textparse.h" +#include "mempool.h" +#include "carp.h" +#include "rr.h" + +static struct rr* caa_parse(char *name, long ttl, int type, char *s) +{ + struct rr_caa *rr = getmem(sizeof(*rr)); + int flags; + char *str_tag; + + flags = extract_integer(&s, "CAA flags", NULL); + if (flags < 0) return NULL; + if (flags != 0 && flags != 128) + return bitch("CAA unrecognized flags value"); + rr->flags = flags; + + str_tag = extract_label(&s, "CAA tag", "temporary"); + if (!str_tag) return NULL; + + if (strcmp(str_tag, "issue") == 0) { + /* ok */ + } else if (strcmp(str_tag, "issuewild") == 0) { + /* ok */ + } else if (strcmp(str_tag, "iodef") == 0) { + /* ok */ + } else if (strcmp(str_tag, "auth") == 0) + return bitch("CAA reserved tag name"); + else if (strcmp(str_tag, "path") == 0) + return bitch("CAA reserved tag name"); + else if (strcmp(str_tag, "policy") == 0) + return bitch("CAA reserved tag name"); + else + return bitch("CAA unrecognized tag name"); + + rr->tag = compose_binary_data("s", 0, str_tag); + rr->value = extract_text(&s, "CAA tag value"); + if (rr->value.length <= 0) + return bitch("CAA missing tag value"); + + if (*s) { + return bitch("garbage after valid CAA data"); + } + return store_record(type, name, ttl, rr); +} + +static char* caa_human(struct rr *rrv) +{ + RRCAST(caa); + char ss[4096]; + char *s = ss; + int l; + + /* incomplete */ + l = snprintf(s, 4096, "%u", rr->flags); + s += l; + return quickstrdup_temp(ss); +} + +static struct binary_data caa_wirerdata(struct rr *rrv) +{ + RRCAST(caa); + + return compose_binary_data("1dd", 1, rr->flags, rr->tag, rr->value); +} + +/* +static void *caa_validate(struct rr *rrv) +{ + dump_binary_data(stderr, call_get_wired(rrv)); + return NULL; +} +*/ + +struct rr_methods caa_methods = { caa_parse, caa_human, caa_wirerdata, NULL, NULL }; diff -Naur validns-0.8/carp.c validns/carp.c --- validns-0.8/carp.c 2014-02-11 15:47:14.000000000 -0500 +++ validns/carp.c 2020-10-05 16:59:29.353681351 -0400 @@ -23,77 +23,77 @@ void croak(int exit_code, const char *fmt, ...) { - va_list ap; - va_start(ap, fmt); - v(1, errno, exit_code, fmt, ap); - va_end(ap); + va_list ap; + va_start(ap, fmt); + v(1, errno, exit_code, fmt, ap); + va_end(ap); } void croakx(int exit_code, const char *fmt, ...) { - va_list ap; - va_start(ap, fmt); - v(1, -1, exit_code, fmt, ap); - va_end(ap); + va_list ap; + va_start(ap, fmt); + v(1, -1, exit_code, fmt, ap); + va_end(ap); } void * bitch(const char *fmt, ...) { - va_list ap; - va_start(ap, fmt); - if (!G.opt.no_output) { - fprintf(stderr, "%s:%d: ", file_info->name, file_info->line); - if (fmt != NULL) { - vfprintf(stderr, fmt, ap); - } - fprintf(stderr, "\n"); - } - va_end(ap); - G.exit_code = 1; - G.stats.error_count++; - file_info->paren_mode = 0; - if (G.opt.die_on_first_error) - exit(1); - return NULL; + va_list ap; + va_start(ap, fmt); + if (!G.opt.no_output) { + fprintf(stderr, "%s:%d: ", file_info->name, file_info->line); + if (fmt != NULL) { + vfprintf(stderr, fmt, ap); + } + fprintf(stderr, "\n"); + } + va_end(ap); + G.exit_code = 1; + G.stats.error_count++; + file_info->paren_mode = 0; + if (G.opt.die_on_first_error) + exit(1); + return NULL; } void * moan(char *file_name, int line, const char *fmt, ...) { - va_list ap; - va_start(ap, fmt); - if (!G.opt.no_output) { - fprintf(stderr, "%s:%d: ", file_name, line); - if (fmt != NULL) { - vfprintf(stderr, fmt, ap); - } - fprintf(stderr, "\n"); - } - va_end(ap); - G.exit_code = 1; - G.stats.error_count++; - if (G.opt.die_on_first_error) - exit(1); - return NULL; + va_list ap; + va_start(ap, fmt); + if (!G.opt.no_output) { + fprintf(stderr, "%s:%d: ", file_name, line); + if (fmt != NULL) { + vfprintf(stderr, fmt, ap); + } + fprintf(stderr, "\n"); + } + va_end(ap); + G.exit_code = 1; + G.stats.error_count++; + if (G.opt.die_on_first_error) + exit(1); + return NULL; } void v(int is_croak, int use_errno, int exit_code, const char *fmt, va_list ap) { - fprintf(stderr, "%s: ", thisprogname()); - if (fmt != NULL) { - vfprintf(stderr, fmt, ap); - if (use_errno >= 0) - fprintf(stderr, ": "); - } - if (use_errno >= 0) - fprintf(stderr, "%s\n", strerror(use_errno)); - else - fprintf(stderr, "\n"); - if (is_croak) - exit(exit_code); + fprintf(stderr, "%s: ", thisprogname()); + if (fmt != NULL) { + vfprintf(stderr, fmt, ap); + if (use_errno >= 0) + fprintf(stderr, ": "); + } + if (use_errno >= 0) + fprintf(stderr, "%s\n", strerror(use_errno)); + else + fprintf(stderr, "\n"); + if (is_croak) + exit(exit_code); } #if defined(__linux__) @@ -103,15 +103,15 @@ const char *thisprogname(void) { #if defined(__FreeBSD__) - return getprogname(); + return getprogname(); #elif defined(__APPLE__) - return getprogname(); + return getprogname(); #elif defined(__sun__) - return getexecname(); + return getexecname(); #elif defined(__linux__) - if (readlink("/proc/self/exe", proggy, MAXPATHLEN) != -1) - return proggy; - return ""; + if (readlink("/proc/self/exe", proggy, MAXPATHLEN) != -1) + return proggy; + return ""; #else #error "unsupported OS" #endif diff -Naur validns-0.8/cbtree.c validns/cbtree.c --- validns-0.8/cbtree.c 2013-04-11 15:38:07.000000000 -0400 +++ validns/cbtree.c 2020-10-05 16:59:29.353681351 -0400 @@ -24,10 +24,10 @@ struct pool { - struct pool *next; - size_t pool_size; - size_t free_index; - char mem[0]; + struct pool *next; + size_t pool_size; + size_t free_index; + char mem[0]; }; static struct pool *internal = NULL; @@ -35,35 +35,35 @@ static int new_pool(struct pool **root, size_t size) { - struct pool *pool; + struct pool *pool; - size = (size + sizeof(void *) - 1) / sizeof(void *); - size *= sizeof(void *); - pool = malloc(size + sizeof(struct pool)); - if (!pool) { - return 1; - } - pool->next = *root; - pool->free_index = 0; - pool->pool_size = size; - *root = pool; - return 0; + size = (size + sizeof(void *) - 1) / sizeof(void *); + size *= sizeof(void *); + pool = malloc(size + sizeof(struct pool)); + if (!pool) { + return 1; + } + pool->next = *root; + pool->free_index = 0; + pool->pool_size = size; + *root = pool; + return 0; } static void *alloc(struct pool **root, size_t size) { - void *ret; - size = (size + sizeof(void *) - 1) / sizeof(void *); - size *= sizeof(void *); - if (!*root) - if (new_pool(root, size > 256000 ? size : 256000) != 0) - return NULL; - if ((*root)->pool_size - (*root)->free_index < size) - if (new_pool(root, size > 256000 ? size : 256000) != 0) - return NULL; - ret = (*root)->mem + (*root)->free_index; - (*root)->free_index += size; - return ret; + void *ret; + size = (size + sizeof(void *) - 1) / sizeof(void *); + size *= sizeof(void *); + if (!*root) + if (new_pool(root, size > 256000 ? size : 256000) != 0) + return NULL; + if ((*root)->pool_size - (*root)->free_index < size) + if (new_pool(root, size > 256000 ? size : 256000) != 0) + return NULL; + ret = (*root)->mem + (*root)->free_index; + (*root)->free_index += size; + return ret; } /* main code */ @@ -75,318 +75,318 @@ const size_t ulen = strlen(u); uint8_t *p = t->root; - /* Test for empty tree */ - if (!p) return NULL; + /* Test for empty tree */ + if (!p) return NULL; /* Walk tree for best member */ - while (1 & (intptr_t) p) { - struct node *q = (void *)(p - 1); - /* Calculate direction */ - int direction; - uint8_t c = 0; - - if (q->byte < ulen) - c = ubytes[q->byte]; - direction = (1 + (q->otherbits | c)) >> 8; - - p = q->child[direction]; - } - - /* The leaves contain "[data ptr][string]" */ - if (strcmp(u, (const char *)(p + sizeof(intptr_t))) == 0) - return (intptr_t *)p; - return NULL; + while (1 & (intptr_t) p) { + struct node *q = (void *)(p - 1); + /* Calculate direction */ + int direction; + uint8_t c = 0; + + if (q->byte < ulen) + c = ubytes[q->byte]; + direction = (1 + (q->otherbits | c)) >> 8; + + p = q->child[direction]; + } + + /* The leaves contain "[data ptr][string]" */ + if (strcmp(u, (const char *)(p + sizeof(intptr_t))) == 0) + return (intptr_t *)p; + return NULL; } intptr_t* cbtree_insert(struct cbtree *t, const char *u) { - const uint8_t *const ubytes = (void *) u; - const size_t ulen = strlen(u); - uint8_t *p = t->root; - - /* Deal with inserting into an empty tree */ - if (!p) { - char *x = alloc(&external, ulen + 1 + sizeof(intptr_t)); - if (!x) - return NULL; - *((intptr_t *)x) = 0; - memcpy(x + sizeof(intptr_t), u, ulen + 1); - t->root = x; - return (intptr_t *)x; - } + const uint8_t *const ubytes = (void *) u; + const size_t ulen = strlen(u); + uint8_t *p = t->root; + + /* Deal with inserting into an empty tree */ + if (!p) { + char *x = alloc(&external, ulen + 1 + sizeof(intptr_t)); + if (!x) + return NULL; + *((intptr_t *)x) = 0; + memcpy(x + sizeof(intptr_t), u, ulen + 1); + t->root = x; + return (intptr_t *)x; + } /* Walk tree for best member */ - while (1 & (intptr_t) p) { - struct node *q = (void *)(p - 1); - /* Calculate direction */ - int direction; - uint8_t c = 0; - - if (q->byte < ulen) - c = ubytes[q->byte]; - direction = (1 + (q->otherbits | c)) >> 8; - - p = q->child[direction]; - } - - /* Find the critical bit */ - /* 1: Find differing byte */ - uint32_t newbyte; - uint32_t newotherbits; - - for (newbyte = 0; newbyte < ulen; ++newbyte) { - if (p[sizeof(intptr_t) + newbyte] != ubytes[newbyte]) { - newotherbits = p[sizeof(intptr_t) + newbyte] ^ ubytes[newbyte]; - goto different_byte_found; - } - } - - if (p[sizeof(intptr_t) + newbyte] != 0) { - newotherbits = p[sizeof(intptr_t) + newbyte]; - goto different_byte_found; - } - return (intptr_t *)p; + while (1 & (intptr_t) p) { + struct node *q = (void *)(p - 1); + /* Calculate direction */ + int direction; + uint8_t c = 0; + + if (q->byte < ulen) + c = ubytes[q->byte]; + direction = (1 + (q->otherbits | c)) >> 8; + + p = q->child[direction]; + } + + /* Find the critical bit */ + /* 1: Find differing byte */ + uint32_t newbyte; + uint32_t newotherbits; + + for (newbyte = 0; newbyte < ulen; ++newbyte) { + if (p[sizeof(intptr_t) + newbyte] != ubytes[newbyte]) { + newotherbits = p[sizeof(intptr_t) + newbyte] ^ ubytes[newbyte]; + goto different_byte_found; + } + } + + if (p[sizeof(intptr_t) + newbyte] != 0) { + newotherbits = p[sizeof(intptr_t) + newbyte]; + goto different_byte_found; + } + return (intptr_t *)p; different_byte_found: - /* 2: Find differing bit */ - newotherbits |= newotherbits >> 1; - newotherbits |= newotherbits >> 2; - newotherbits |= newotherbits >> 4; - newotherbits = (newotherbits & ~(newotherbits >> 1)) ^ 255; - uint8_t c = p[sizeof(intptr_t) + newbyte]; - int newdirection = (1 + (newotherbits | c)) >> 8; - - /* Insert new string */ - - /* 1: Allocate new node structure */ - struct node *newnode; - - newnode = alloc(&internal, sizeof(struct node)); - if (!newnode) - return NULL; - - char *x = alloc(&external, ulen + 1 + sizeof(intptr_t)); - if (!x) - return NULL; - *((intptr_t *)x) = 0; - memcpy(x + sizeof(intptr_t), ubytes, ulen + 1); - - newnode->byte = newbyte; - newnode->otherbits = newotherbits; - newnode->child[1 - newdirection] = x; - - /* 2: Insert new node */ - void **wherep = &t->root; - for (;;) { - uint8_t *p = *wherep; - if (!(1 & (intptr_t) p)) break; - struct node *q = (void *) (p - 1); - if (q->byte > newbyte) break; - if (q->byte == newbyte && q->otherbits > newotherbits) break; - uint8_t c = 0; - if (q->byte < ulen) c = ubytes[q->byte]; - const int direction = (1 + (q->otherbits | c)) >> 8; - wherep = q->child + direction; - } + /* 2: Find differing bit */ + newotherbits |= newotherbits >> 1; + newotherbits |= newotherbits >> 2; + newotherbits |= newotherbits >> 4; + newotherbits = (newotherbits & ~(newotherbits >> 1)) ^ 255; + uint8_t c = p[sizeof(intptr_t) + newbyte]; + int newdirection = (1 + (newotherbits | c)) >> 8; + + /* Insert new string */ + + /* 1: Allocate new node structure */ + struct node *newnode; + + newnode = alloc(&internal, sizeof(struct node)); + if (!newnode) + return NULL; + + char *x = alloc(&external, ulen + 1 + sizeof(intptr_t)); + if (!x) + return NULL; + *((intptr_t *)x) = 0; + memcpy(x + sizeof(intptr_t), ubytes, ulen + 1); + + newnode->byte = newbyte; + newnode->otherbits = newotherbits; + newnode->child[1 - newdirection] = x; + + /* 2: Insert new node */ + void **wherep = &t->root; + for (;;) { + uint8_t *p = *wherep; + if (!(1 & (intptr_t) p)) break; + struct node *q = (void *) (p - 1); + if (q->byte > newbyte) break; + if (q->byte == newbyte && q->otherbits > newotherbits) break; + uint8_t c = 0; + if (q->byte < ulen) c = ubytes[q->byte]; + const int direction = (1 + (q->otherbits | c)) >> 8; + wherep = q->child + direction; + } - newnode->child[newdirection] = *wherep; - *wherep = (void *) (1 + (char *) newnode); + newnode->child[newdirection] = *wherep; + *wherep = (void *) (1 + (char *) newnode); - return (intptr_t *)x; + return (intptr_t *)x; } intptr_t cbtree_delete(struct cbtree *t, const char *u) { - const uint8_t *ubytes = (void *) u; - const size_t ulen = strlen(u); - uint8_t *p = t->root; - void **wherep = &t->root; - void **whereq = 0; - struct node *q = 0; - int direction = 0; - intptr_t ret; - - /* Deal with deleting from an empty tree */ - if (!p) return 0; - - /* Walk the tree for the best match */ - while (1 & (intptr_t) p) { - whereq = wherep; - q = (void *) (p - 1); - uint8_t c = 0; - if (q->byte < ulen) c = ubytes[q->byte]; - direction = (1 + (q->otherbits | c)) >> 8; - wherep = q->child + direction; - p = *wherep; - } - - /* Check the best match */ - if (0 != strcmp(u, (const char *)(p + sizeof(intptr_t)))) - return 0; - ret = *((intptr_t *)p); - - /* Remove the element and/or node */ - if (!whereq) { - t->root = 0; - return ret; - } + const uint8_t *ubytes = (void *) u; + const size_t ulen = strlen(u); + uint8_t *p = t->root; + void **wherep = &t->root; + void **whereq = 0; + struct node *q = 0; + int direction = 0; + intptr_t ret; + + /* Deal with deleting from an empty tree */ + if (!p) return 0; + + /* Walk the tree for the best match */ + while (1 & (intptr_t) p) { + whereq = wherep; + q = (void *) (p - 1); + uint8_t c = 0; + if (q->byte < ulen) c = ubytes[q->byte]; + direction = (1 + (q->otherbits | c)) >> 8; + wherep = q->child + direction; + p = *wherep; + } + + /* Check the best match */ + if (0 != strcmp(u, (const char *)(p + sizeof(intptr_t)))) + return 0; + ret = *((intptr_t *)p); + + /* Remove the element and/or node */ + if (!whereq) { + t->root = 0; + return ret; + } - *whereq = q->child[1 - direction]; - // free(q); + *whereq = q->child[1 - direction]; + // free(q); - return ret; + return ret; } static void traverse(void *top) { - uint8_t *p = top; + uint8_t *p = top; - if (1 & (intptr_t) p) { - struct node *q = (void *) (p - 1); - traverse(q->child[0]); - traverse(q->child[1]); - // free(q); - } else { - // free(p); - } + if (1 & (intptr_t) p) { + struct node *q = (void *) (p - 1); + traverse(q->child[0]); + traverse(q->child[1]); + // free(q); + } else { + // free(p); + } } void cbtree_clear(struct cbtree *t) { - if (t->root) traverse(t->root); - t->root = NULL; + if (t->root) traverse(t->root); + t->root = NULL; } static int allprefixed_traverse(uint8_t *top, int (*handle)(const char *, intptr_t *, void *), void *arg) { - int direction; + int direction; - /* Deal with an internal node */ - if (1 & (intptr_t) top) { - struct node *q = (void *) (top - 1); - for (direction = 0; direction < 2; ++direction) - switch(allprefixed_traverse(q->child[direction], handle, arg)) { - case 1: break; - case 0: return 0; - default: return -1; - } - return 1; - } + /* Deal with an internal node */ + if (1 & (intptr_t) top) { + struct node *q = (void *) (top - 1); + for (direction = 0; direction < 2; ++direction) + switch(allprefixed_traverse(q->child[direction], handle, arg)) { + case 1: break; + case 0: return 0; + default: return -1; + } + return 1; + } - /* Deal with an external node */ - return handle((const char *)(top + sizeof(intptr_t)), (intptr_t *)top, arg); + /* Deal with an external node */ + return handle((const char *)(top + sizeof(intptr_t)), (intptr_t *)top, arg); } int cbtree_allprefixed(struct cbtree *t, const char *prefix, - int (*handle)(const char *, intptr_t *, void *), - void *arg) + int (*handle)(const char *, intptr_t *, void *), + void *arg) { - const uint8_t *ubytes = (void *) prefix; - const size_t ulen = strlen(prefix); - uint8_t *p = t->root; - uint8_t *top = p; - int i; - - if (!p) return 1; /* S = $\emptyset$ */ - - /* Walk tree, maintaining top pointer */ - while (1 & (intptr_t) p) { - struct node *q = (void *) (p - 1); - uint8_t c = 0; - if (q->byte < ulen) c = ubytes[q->byte]; - const int direction = (1 + (q->otherbits | c)) >> 8; - p = q->child[direction]; - if (q->byte < ulen) top = p; - } - - /* Check prefix */ - for (i = 0; i < ulen; ++i) { - if (p[i+sizeof(intptr_t)] != ubytes[i]) return 1; - } + const uint8_t *ubytes = (void *) prefix; + const size_t ulen = strlen(prefix); + uint8_t *p = t->root; + uint8_t *top = p; + int i; - return allprefixed_traverse(top, handle, arg); + if (!p) return 1; /* S = $\emptyset$ */ + + /* Walk tree, maintaining top pointer */ + while (1 & (intptr_t) p) { + struct node *q = (void *) (p - 1); + uint8_t c = 0; + if (q->byte < ulen) c = ubytes[q->byte]; + const int direction = (1 + (q->otherbits | c)) >> 8; + p = q->child[direction]; + if (q->byte < ulen) top = p; + } + + /* Check prefix */ + for (i = 0; i < ulen; ++i) { + if (p[i+sizeof(intptr_t)] != ubytes[i]) return 1; + } + + return allprefixed_traverse(top, handle, arg); } static const char *byte_to_binary(int x) { - static char b[9]; - int z; + static char b[9]; + int z; - b[0] = '\0'; - for (z = 128; z > 0; z >>= 1) - strcat(b, ((x & z) == z) ? "1" : "0"); + b[0] = '\0'; + for (z = 128; z > 0; z >>= 1) + strcat(b, ((x & z) == z) ? "1" : "0"); - return b; + return b; } static void traverse_dump(void *top, int level, int byte) { - uint8_t *p = top; - int i; + uint8_t *p = top; + int i; - for (i = 0; i < level; i++) printf(" "); - if (1 & (intptr_t) p) { - struct node *q = (void *) (p - 1); - printf("[byte(%d),otherbits(%s)]\n", q->byte, byte_to_binary(q->otherbits)); - traverse_dump(q->child[0], level + 1, q->byte); - traverse_dump(q->child[1], level + 1, q->byte); - } else { - const size_t ulen = strlen((char *)(p + sizeof(intptr_t))); - int c = byte < ulen ? p[sizeof(intptr_t) + byte] : 0; - printf("\"%s\" (%s)\n", p + sizeof(intptr_t), byte_to_binary(c)); - } + for (i = 0; i < level; i++) printf(" "); + if (1 & (intptr_t) p) { + struct node *q = (void *) (p - 1); + printf("[byte(%d),otherbits(%s)]\n", q->byte, byte_to_binary(q->otherbits)); + traverse_dump(q->child[0], level + 1, q->byte); + traverse_dump(q->child[1], level + 1, q->byte); + } else { + const size_t ulen = strlen((char *)(p + sizeof(intptr_t))); + int c = byte < ulen ? p[sizeof(intptr_t) + byte] : 0; + printf("\"%s\" (%s)\n", p + sizeof(intptr_t), byte_to_binary(c)); + } } void cbtree_dump(struct cbtree *t) { - if (t->root) - traverse_dump(t->root, 0, 0); - printf("\n"); + if (t->root) + traverse_dump(t->root, 0, 0); + printf("\n"); } char* cbtree_next(struct cbtree *t, const char *u, intptr_t *data) { - const uint8_t *ubytes = (void *) u; - const size_t ulen = strlen(u); - uint8_t *p = t->root; - uint8_t *branch = NULL; - - if (!p) return NULL; - - /* Walk tree, maintaining top pointer */ - while (1 & (intptr_t) p) { - struct node *q = (void *) (p - 1); - uint8_t c = 0; - if (q->byte < ulen) c = ubytes[q->byte]; - const int direction = (1 + (q->otherbits | c)) >> 8; - if (direction == 0) - branch = q->child[1]; - p = q->child[direction]; - } - - /* check whether what we found is what we are looking for already */ - if (strcmp((char *)(p + sizeof(intptr_t)), u) > 0) { - if (data) *data = *((intptr_t *)p); - return (char *)(p + sizeof(intptr_t)); - } - - if (!branch) return NULL; - - /* select the lowest value on the branch */ - p = branch; - while (1 & (intptr_t) p) { - struct node *q = (void *) (p - 1); - p = q->child[0]; - } - if (data) *data = *((intptr_t *)p); - return (char *)(p + sizeof(intptr_t)); + const uint8_t *ubytes = (void *) u; + const size_t ulen = strlen(u); + uint8_t *p = t->root; + uint8_t *branch = NULL; + + if (!p) return NULL; + + /* Walk tree, maintaining top pointer */ + while (1 & (intptr_t) p) { + struct node *q = (void *) (p - 1); + uint8_t c = 0; + if (q->byte < ulen) c = ubytes[q->byte]; + const int direction = (1 + (q->otherbits | c)) >> 8; + if (direction == 0) + branch = q->child[1]; + p = q->child[direction]; + } + + /* check whether what we found is what we are looking for already */ + if (strcmp((char *)(p + sizeof(intptr_t)), u) > 0) { + if (data) *data = *((intptr_t *)p); + return (char *)(p + sizeof(intptr_t)); + } + + if (!branch) return NULL; + + /* select the lowest value on the branch */ + p = branch; + while (1 & (intptr_t) p) { + struct node *q = (void *) (p - 1); + p = q->child[0]; + } + if (data) *data = *((intptr_t *)p); + return (char *)(p + sizeof(intptr_t)); } diff -Naur validns-0.8/cbtree.h validns/cbtree.h --- validns-0.8/cbtree.h 2013-04-11 15:38:07.000000000 -0400 +++ validns/cbtree.h 2020-10-05 16:59:29.353681351 -0400 @@ -47,8 +47,8 @@ void cbtree_clear(struct cbtree *t); int cbtree_allprefixed(struct cbtree *t, const char *prefix, - int (*handle)(const char *, intptr_t *, void *), - void *arg); + int (*handle)(const char *, intptr_t *, void *), + void *arg); void cbtree_dump(struct cbtree *t); diff -Naur validns-0.8/cert.c validns/cert.c --- validns-0.8/cert.c 2014-02-11 15:46:12.000000000 -0500 +++ validns/cert.c 2020-10-05 16:59:29.353681351 -0400 @@ -26,115 +26,115 @@ static int extract_certificate_type(char **s, char *what) { - int type; - char *str_type; + int type; + char *str_type; - if (isdigit(**s)) { - type = extract_integer(s, what); - if (type >= 1 && type <= 8) - return type; - if (type == 253 || type == 254) - return type; - if (type >= 65280 && type <= 65534) - return type; - if (type < 0 || type > 65535) { - bitch("bad certificate type %d", type); - return -1; - } - if (type == 0 || type == 255 || type == 65535) { - bitch("certificate type %d is reserved by IANA", type); - return -1; - } - bitch("certificate type %d is unassigned", type); - return -1; - } else { - str_type = extract_label(s, what, "temporary"); - if (!str_type) return -1; - if (strcmp(str_type, "pkix") == 0) - return 1; - if (strcmp(str_type, "spki") == 0) - return 2; - if (strcmp(str_type, "pgp") == 0) - return 3; - if (strcmp(str_type, "ipkix") == 0) - return 4; - if (strcmp(str_type, "ispki") == 0) - return 5; - if (strcmp(str_type, "ipgp") == 0) - return 6; - if (strcmp(str_type, "acpkix") == 0) - return 7; - if (strcmp(str_type, "iacpkix") == 0) - return 8; - if (strcmp(str_type, "uri") == 0) - return 253; - if (strcmp(str_type, "oid") == 0) - return 254; - bitch("bad certificate type %s", str_type); - return -1; - } + if (isdigit(**s)) { + type = extract_integer(s, what, NULL); + if (type >= 1 && type <= 8) + return type; + if (type == 253 || type == 254) + return type; + if (type >= 65280 && type <= 65534) + return type; + if (type < 0 || type > 65535) { + bitch("bad certificate type %d", type); + return -1; + } + if (type == 0 || type == 255 || type == 65535) { + bitch("certificate type %d is reserved by IANA", type); + return -1; + } + bitch("certificate type %d is unassigned", type); + return -1; + } else { + str_type = extract_label(s, what, "temporary"); + if (!str_type) return -1; + if (strcmp(str_type, "pkix") == 0) + return 1; + if (strcmp(str_type, "spki") == 0) + return 2; + if (strcmp(str_type, "pgp") == 0) + return 3; + if (strcmp(str_type, "ipkix") == 0) + return 4; + if (strcmp(str_type, "ispki") == 0) + return 5; + if (strcmp(str_type, "ipgp") == 0) + return 6; + if (strcmp(str_type, "acpkix") == 0) + return 7; + if (strcmp(str_type, "iacpkix") == 0) + return 8; + if (strcmp(str_type, "uri") == 0) + return 253; + if (strcmp(str_type, "oid") == 0) + return 254; + bitch("bad certificate type %s", str_type); + return -1; + } } static struct rr* cert_parse(char *name, long ttl, int type, char *s) { - struct rr_cert *rr = getmem(sizeof(*rr)); - int cert_type, key_tag, alg; + struct rr_cert *rr = getmem(sizeof(*rr)); + int cert_type, key_tag, alg; - cert_type = extract_certificate_type(&s, "certificate type"); - if (cert_type < 0) return NULL; - rr->type = cert_type; - - key_tag = extract_integer(&s, "key tag"); - if (key_tag < 0) return NULL; - if (key_tag > 65535) - return bitch("bad key tag"); - rr->key_tag = key_tag; - - if (isdigit(*s)) { - alg = extract_integer(&s, "algorithm"); - if (alg < 0) return NULL; - if (alg > 255) return bitch("bad algorithm"); - if (alg != 0) { /* 0 is just fine */ - if (algorithm_type(alg) == ALG_UNSUPPORTED) - return bitch("bad algorithm %d", alg); - } - } else { - alg = extract_algorithm(&s, "algorithm"); - if (alg == ALG_UNSUPPORTED) return NULL; - } - rr->algorithm = alg; - - if (alg == 0 && key_tag != 0) { - /* we might want to bitch here, but RFC says "SHOULD", so we don't */ - } - - rr->certificate = extract_base64_binary_data(&s, "certificate"); - if (rr->certificate.length < 0) return NULL; - /* TODO validate cert length based on algorithm */ - - if (*s) { - return bitch("garbage after valid CERT data"); - } - return store_record(type, name, ttl, rr); + cert_type = extract_certificate_type(&s, "certificate type"); + if (cert_type < 0) return NULL; + rr->type = cert_type; + + key_tag = extract_integer(&s, "key tag", NULL); + if (key_tag < 0) return NULL; + if (key_tag > 65535) + return bitch("bad key tag"); + rr->key_tag = key_tag; + + if (isdigit(*s)) { + alg = extract_integer(&s, "algorithm", NULL); + if (alg < 0) return NULL; + if (alg > 255) return bitch("bad algorithm"); + if (alg != 0) { /* 0 is just fine */ + if (algorithm_type(alg) == ALG_UNSUPPORTED) + return bitch("bad algorithm %d", alg); + } + } else { + alg = extract_algorithm(&s, "algorithm"); + if (alg == ALG_UNSUPPORTED) return NULL; + } + rr->algorithm = alg; + + if (alg == 0 && key_tag != 0) { + /* we might want to bitch here, but RFC says "SHOULD", so we don't */ + } + + rr->certificate = extract_base64_binary_data(&s, "certificate"); + if (rr->certificate.length < 0) return NULL; + /* TODO validate cert length based on algorithm */ + + if (*s) { + return bitch("garbage after valid CERT data"); + } + return store_record(type, name, ttl, rr); } static char* cert_human(struct rr *rrv) { - RRCAST(cert); + RRCAST(cert); char s[1024]; snprintf(s, 1024, "%d %d %d ...", - rr->type, rr->key_tag, rr->algorithm); + rr->type, rr->key_tag, rr->algorithm); return quickstrdup_temp(s); } static struct binary_data cert_wirerdata(struct rr *rrv) { - RRCAST(cert); + RRCAST(cert); - return compose_binary_data("221d", 1, - rr->type, rr->key_tag, rr->algorithm, - rr->certificate); + return compose_binary_data("221d", 1, + rr->type, rr->key_tag, rr->algorithm, + rr->certificate); } struct rr_methods cert_methods = { cert_parse, cert_human, cert_wirerdata, NULL, NULL }; diff -Naur validns-0.8/cname.c validns/cname.c --- validns-0.8/cname.c 2014-02-11 15:46:59.000000000 -0500 +++ validns/cname.c 2020-10-05 16:59:29.353681351 -0400 @@ -19,58 +19,58 @@ static struct rr *cname_parse(char *name, long ttl, int type, char *s) { - struct rr_cname *rr = getmem(sizeof(*rr)); + struct rr_cname *rr = getmem(sizeof(*rr)); - rr->cname = extract_name(&s, "cname", 0); - if (!rr->cname) - return NULL; - if (*s) { - return bitch("garbage after valid CNAME data"); - } + rr->cname = extract_name(&s, "cname", 0); + if (!rr->cname) + return NULL; + if (*s) { + return bitch("garbage after valid CNAME data"); + } - return store_record(type, name, ttl, rr); + return store_record(type, name, ttl, rr); } static char* cname_human(struct rr *rrv) { - RRCAST(cname); + RRCAST(cname); return rr->cname; } static struct binary_data cname_wirerdata(struct rr *rrv) { - RRCAST(cname); - return name2wire_name(rr->cname); + RRCAST(cname); + return name2wire_name(rr->cname); } static void* cname_validate_set(struct rr_set *rr_set) { - struct rr *rr; - struct rr_set *another_set; - struct named_rr *named_rr; - int count; - - if (G.opt.policy_checks[POLICY_CNAME_OTHER_DATA]) { - if (rr_set->count > 1) { - rr = rr_set->tail; - return moan(rr->file_name, rr->line, "CNAME and other data"); - } - named_rr = rr_set->named_rr; - count = get_rr_set_count(named_rr); - if (count > 1) { - another_set = find_rr_set_in_named_rr(named_rr, T_RRSIG); - if (another_set) - count -= another_set->count; - another_set = find_rr_set_in_named_rr(named_rr, T_NSEC); - if (another_set) - count -= another_set->count; - if (count > 1) { - rr = rr_set->tail; - return moan(rr->file_name, rr->line, "CNAME and other data"); - } - } - } - return NULL; + struct rr *rr; + struct rr_set *another_set; + struct named_rr *named_rr; + int count; + + if (G.opt.policy_checks[POLICY_CNAME_OTHER_DATA]) { + if (rr_set->count > 1) { + rr = rr_set->tail; + return moan(rr->file_name, rr->line, "CNAME and other data"); + } + named_rr = rr_set->named_rr; + count = get_rr_set_count(named_rr); + if (count > 1) { + another_set = find_rr_set_in_named_rr(named_rr, T_RRSIG); + if (another_set) + count -= another_set->count; + another_set = find_rr_set_in_named_rr(named_rr, T_NSEC); + if (another_set) + count -= another_set->count; + if (count > 1) { + rr = rr_set->tail; + return moan(rr->file_name, rr->line, "CNAME and other data"); + } + } + } + return NULL; } struct rr_methods cname_methods = { cname_parse, cname_human, cname_wirerdata, cname_validate_set, NULL }; diff -Naur validns-0.8/common.h validns/common.h --- validns-0.8/common.h 2020-10-05 16:54:14.346790446 -0400 +++ validns/common.h 2020-10-05 16:59:29.353681351 -0400 @@ -9,19 +9,37 @@ #ifndef _COMMON_H_ #define _COMMON_H_ 1 +struct generate_template_piece; +struct generate_template_piece +{ + char *constant_string; + struct generate_template_piece *next; +}; + +#define LINEBUFSZ 2048 + struct file_info { - struct file_info *next; - FILE *file; - int line; - int paren_mode; - char buf[2048]; - char name[0]; + struct file_info *next; + FILE *file; + int line; + int paren_mode; + char buf[LINEBUFSZ]; + char *current_origin; + + int generate_cur; + int generate_lim; + char *generate_type; + struct generate_template_piece *generate_lhs; + struct generate_template_piece *generate_rhs; + + /* must be last struct member */ + char name[0]; }; extern struct file_info *file_info; -#define N_POLICY_CHECKS 9 +#define N_POLICY_CHECKS 11 #define POLICY_SINGLE_NS 0 #define POLICY_CNAME_OTHER_DATA 1 @@ -32,41 +50,44 @@ #define POLICY_DNAME 6 #define POLICY_DNSKEY 7 #define POLICY_TLSA_HOST 8 +#define POLICY_KSK_EXISTS 9 +#define POLICY_SMIMEA_HOST 10 #define MAX_TIMES_TO_CHECK 32 struct globals { - struct stats { - int names_count; - int rr_count; - int rrset_count; - int error_count; - int skipped_dup_rr_count; - int soa_rr_count; - int signatures_verified; - int delegations; - int not_authoritative; - int nsec3_count; - } stats; - struct command_line_options - { - int die_on_first_error; - int no_output; - int summary; - int notiming; - int verbose; - char *include_path; - char *current_origin; - int n_times_to_check; - uint32_t times_to_check[MAX_TIMES_TO_CHECK]; - char policy_checks[N_POLICY_CHECKS]; - int n_threads; - } opt; - int exit_code; - long default_ttl; - int nsec3_present; - int nsec3_opt_out_present; - int dnssec_active; + struct stats { + int names_count; + int rr_count; + int rrset_count; + int error_count; + int skipped_dup_rr_count; + int soa_rr_count; + int signatures_verified; + int delegations; + int not_authoritative; + int nsec3_count; + } stats; + struct command_line_options + { + int die_on_first_error; + int no_output; + int summary; + int verbose; + char *include_path; + int include_path_specified; + char *first_origin; + int n_times_to_check; + uint32_t times_to_check[MAX_TIMES_TO_CHECK]; + char policy_checks[N_POLICY_CHECKS]; + int n_threads; + int soa_minttl_as_default_ttl; + } opt; + int exit_code; + long default_ttl; + int nsec3_present; + int nsec3_opt_out_present; + int dnssec_active; }; extern struct globals G; diff -Naur validns-0.8/dhcid.c validns/dhcid.c --- validns-0.8/dhcid.c 2014-02-11 15:46:29.000000000 -0500 +++ validns/dhcid.c 2020-10-05 16:59:29.354681360 -0400 @@ -21,35 +21,35 @@ static struct rr* dhcid_parse(char *name, long ttl, int type, char *s) { - struct rr_dhcid *rr = getmem(sizeof(*rr)); - struct binary_data data; + struct rr_dhcid *rr = getmem(sizeof(*rr)); + struct binary_data data; - data = extract_base64_binary_data(&s, "rdata"); - if (data.length < 0) return NULL; + data = extract_base64_binary_data(&s, "rdata"); + if (data.length < 0) return NULL; - if (data.length < 3) - return bitch("rdata too short"); + if (data.length < 3) + return bitch("rdata too short"); - rr->id_type = data.data[0]*256 + data.data[1]; - if (rr->id_type > 2) - return bitch("unsupported identifier type %s", rr->id_type); - - rr->digest_type = data.data[2]; - if (rr->digest_type != 1) - return bitch("unsupported digest type %s", rr->digest_type); - - if (data.length != 35) - return bitch("wrong digest length, must be 32 for SHA-256"); - - /* let's cheat a bit */ - data.length -= 3; - data.data += 3; - rr->digest = data; - - if (*s) { - return bitch("garbage after valid DHCID data"); - } - return store_record(type, name, ttl, rr); + rr->id_type = data.data[0]*256 + data.data[1]; + if (rr->id_type > 2) + return bitch("unsupported identifier type %s", rr->id_type); + + rr->digest_type = data.data[2]; + if (rr->digest_type != 1) + return bitch("unsupported digest type %s", rr->digest_type); + + if (data.length != 35) + return bitch("wrong digest length, must be 32 for SHA-256"); + + /* let's cheat a bit */ + data.length -= 3; + data.data += 3; + rr->digest = data; + + if (*s) { + return bitch("garbage after valid DHCID data"); + } + return store_record(type, name, ttl, rr); } static char* dhcid_human(struct rr *rrv) @@ -59,10 +59,10 @@ static struct binary_data dhcid_wirerdata(struct rr *rrv) { - RRCAST(dhcid); + RRCAST(dhcid); - return compose_binary_data("21d", 1, - rr->id_type, rr->digest_type, rr->digest); + return compose_binary_data("21d", 1, + rr->id_type, rr->digest_type, rr->digest); } struct rr_methods dhcid_methods = { dhcid_parse, dhcid_human, dhcid_wirerdata, NULL, NULL }; diff -Naur validns-0.8/dlv.c validns/dlv.c --- validns-0.8/dlv.c 2014-02-11 15:46:32.000000000 -0500 +++ validns/dlv.c 2020-10-05 16:59:29.354681360 -0400 @@ -19,80 +19,80 @@ static struct rr* dlv_parse(char *name, long ttl, int type, char *s) { - struct rr_dlv *rr = getmem(sizeof(*rr)); - int key_tag, algorithm, digest_type; + struct rr_dlv *rr = getmem(sizeof(*rr)); + int key_tag, algorithm, digest_type; - key_tag = extract_integer(&s, "key tag"); - if (key_tag < 0) return NULL; - rr->key_tag = key_tag; - - algorithm = extract_algorithm(&s, "algorithm"); - if (algorithm == ALG_UNSUPPORTED) return NULL; - rr->algorithm = algorithm; - - digest_type = extract_integer(&s, "digest type"); - if (digest_type < 0) return NULL; - rr->digest_type = digest_type; - - rr->digest = extract_hex_binary_data(&s, "digest", EXTRACT_EAT_WHITESPACE); - if (rr->digest.length < 0) return NULL; - - switch (digest_type) { - case 1: - if (rr->digest.length != SHA1_BYTES) { - return bitch("wrong SHA-1 digest length: %d bytes found, %d bytes expected", rr->digest.length, SHA1_BYTES); - } - break; - case 2: - if (rr->digest.length != SHA256_BYTES) { - return bitch("wrong SHA-256 digest length: %d bytes found, %d bytes expected", rr->digest.length, SHA256_BYTES); - } - break; - case 3: - if (rr->digest.length != GOST_BYTES) { - return bitch("wrong GOST R 34.11-94 digest length: %d bytes found, %d bytes expected", rr->digest.length, GOST_BYTES); - } - break; - case 4: - if (rr->digest.length != SHA384_BYTES) { - return bitch("wrong SHA-384 digest length: %d bytes found, %d bytes expected", rr->digest.length, SHA384_BYTES); - } - break; - default: - return bitch("bad or unsupported digest type %d", digest_type); - } - - if (*s) { - return bitch("garbage after valid DLV data"); - } - G.dnssec_active = 1; - return store_record(type, name, ttl, rr); + key_tag = extract_integer(&s, "key tag", NULL); + if (key_tag < 0) return NULL; + rr->key_tag = key_tag; + + algorithm = extract_algorithm(&s, "algorithm"); + if (algorithm == ALG_UNSUPPORTED) return NULL; + rr->algorithm = algorithm; + + digest_type = extract_integer(&s, "digest type", NULL); + if (digest_type < 0) return NULL; + rr->digest_type = digest_type; + + rr->digest = extract_hex_binary_data(&s, "digest", EXTRACT_EAT_WHITESPACE); + if (rr->digest.length < 0) return NULL; + + switch (digest_type) { + case 1: + if (rr->digest.length != SHA1_BYTES) { + return bitch("wrong SHA-1 digest length: %d bytes found, %d bytes expected", rr->digest.length, SHA1_BYTES); + } + break; + case 2: + if (rr->digest.length != SHA256_BYTES) { + return bitch("wrong SHA-256 digest length: %d bytes found, %d bytes expected", rr->digest.length, SHA256_BYTES); + } + break; + case 3: + if (rr->digest.length != GOST_BYTES) { + return bitch("wrong GOST R 34.11-94 digest length: %d bytes found, %d bytes expected", rr->digest.length, GOST_BYTES); + } + break; + case 4: + if (rr->digest.length != SHA384_BYTES) { + return bitch("wrong SHA-384 digest length: %d bytes found, %d bytes expected", rr->digest.length, SHA384_BYTES); + } + break; + default: + return bitch("bad or unsupported digest type %d", digest_type); + } + + if (*s) { + return bitch("garbage after valid DLV data"); + } + G.dnssec_active = 1; + return store_record(type, name, ttl, rr); } static char* dlv_human(struct rr *rrv) { - RRCAST(dlv); + RRCAST(dlv); char ss[4096]; - char *s = ss; - int l; - int i; + char *s = ss; + int l; + int i; l = snprintf(s, 4096, "%u %u %u ", rr->key_tag, rr->algorithm, rr->digest_type); - s += l; - for (i = 0; i < rr->digest.length; i++) { - l = snprintf(s, 4096-(s-ss), "%02X", (unsigned char)rr->digest.data[i]); - s += l; - } + s += l; + for (i = 0; i < rr->digest.length; i++) { + l = snprintf(s, 4096-(s-ss), "%02X", (unsigned char)rr->digest.data[i]); + s += l; + } return quickstrdup_temp(ss); } static struct binary_data dlv_wirerdata(struct rr *rrv) { - RRCAST(dlv); + RRCAST(dlv); - return compose_binary_data("211d", 1, - rr->key_tag, rr->algorithm, rr->digest_type, - rr->digest); + return compose_binary_data("211d", 1, + rr->key_tag, rr->algorithm, rr->digest_type, + rr->digest); } struct rr_methods dlv_methods = { dlv_parse, dlv_human, dlv_wirerdata, NULL, NULL }; diff -Naur validns-0.8/dname.c validns/dname.c --- validns-0.8/dname.c 2014-02-11 15:46:14.000000000 -0500 +++ validns/dname.c 2020-10-05 16:59:29.354681360 -0400 @@ -21,66 +21,66 @@ static struct rr *dname_parse(char *name, long ttl, int type, char *s) { - struct rr_dname *rr = getmem(sizeof(*rr)); + struct rr_dname *rr = getmem(sizeof(*rr)); - rr->target = extract_name(&s, "dname target", 0); - if (!rr->target) - return NULL; - if (*s) { - return bitch("garbage after valid DNAME data"); - } + rr->target = extract_name(&s, "dname target", 0); + if (!rr->target) + return NULL; + if (*s) { + return bitch("garbage after valid DNAME data"); + } - return store_record(type, name, ttl, rr); + return store_record(type, name, ttl, rr); } static char* dname_human(struct rr *rrv) { - RRCAST(dname); + RRCAST(dname); return rr->target; } static struct binary_data dname_wirerdata(struct rr *rrv) { - RRCAST(dname); - return name2wire_name(rr->target); + RRCAST(dname); + return name2wire_name(rr->target); } static void* dname_validate_set(struct rr_set *rr_set) { - struct rr *rr; - struct rr_set *suspect; - int count; - struct named_rr *named_rr, *next_named_rr; - - if (G.opt.policy_checks[POLICY_DNAME]) { - named_rr = rr_set->named_rr; - rr = rr_set->tail; - if (rr_set->count > 1) - return moan(rr->file_name, rr->line, "multiple DNAMEs"); - /* This check is already handled by "CNAME and other data" in cname.c * - another_set = find_rr_set_in_named_rr(named_rr, T_CNAME); - if (another_set) - return moan(rr->file_name, rr->line, "DNAME cannot co-exist with a CNAME"); - */ - next_named_rr = find_next_named_rr(named_rr); - /* handle http://tools.ietf.org/html/rfc5155#section-10.2 case */ - if (next_named_rr && next_named_rr->parent == named_rr && (named_rr->flags & NAME_FLAG_APEX)) { - count = get_rr_set_count(next_named_rr); - if (count > 0) { - suspect = find_rr_set_in_named_rr(next_named_rr, T_RRSIG); - if (suspect) count--; - suspect = find_rr_set_in_named_rr(next_named_rr, T_NSEC3); - if (suspect) count--; - if (count == 0) - next_named_rr = find_next_named_rr(next_named_rr); - } - } - if (next_named_rr && next_named_rr->parent == named_rr) - return moan(rr->file_name, rr->line, - "DNAME must not have any children (but %s exists)", - next_named_rr->name); - } - return NULL; + struct rr *rr; + struct rr_set *suspect; + int count; + struct named_rr *named_rr, *next_named_rr; + + if (G.opt.policy_checks[POLICY_DNAME]) { + named_rr = rr_set->named_rr; + rr = rr_set->tail; + if (rr_set->count > 1) + return moan(rr->file_name, rr->line, "multiple DNAMEs"); + /* This check is already handled by "CNAME and other data" in cname.c * + another_set = find_rr_set_in_named_rr(named_rr, T_CNAME); + if (another_set) + return moan(rr->file_name, rr->line, "DNAME cannot co-exist with a CNAME"); + */ + next_named_rr = find_next_named_rr(named_rr); + /* handle http://tools.ietf.org/html/rfc5155#section-10.2 case */ + if (next_named_rr && next_named_rr->parent == named_rr && (named_rr->flags & NAME_FLAG_APEX)) { + count = get_rr_set_count(next_named_rr); + if (count > 0) { + suspect = find_rr_set_in_named_rr(next_named_rr, T_RRSIG); + if (suspect) count--; + suspect = find_rr_set_in_named_rr(next_named_rr, T_NSEC3); + if (suspect) count--; + if (count == 0) + next_named_rr = find_next_named_rr(next_named_rr); + } + } + if (next_named_rr && next_named_rr->parent == named_rr) + return moan(rr->file_name, rr->line, + "DNAME must not have any children (but %s exists)", + next_named_rr->name); + } + return NULL; } struct rr_methods dname_methods = { dname_parse, dname_human, dname_wirerdata, dname_validate_set, NULL }; diff -Naur validns-0.8/dnskey.c validns/dnskey.c --- validns-0.8/dnskey.c 2020-10-05 16:57:07.219376944 -0400 +++ validns/dnskey.c 2020-10-05 16:59:48.870860473 -0400 @@ -13,6 +13,8 @@ #include #include #include +#include +#include #include "common.h" #include "textparse.h" @@ -20,172 +22,239 @@ #include "carp.h" #include "rr.h" -static struct rr* dnskey_parse(char *name, long ttl, int type, char *s) +static struct rr_dnskey *all_dns_keys = NULL; + +static struct rr* dnskey_cdnskey_parse(char *name, long ttl, int type, char *s) { - struct rr_dnskey *rr = getmem(sizeof(*rr)); - struct binary_data key; - int flags, proto, algorithm; - unsigned int ac; - int i; - - flags = extract_integer(&s, "flags"); - if (flags < 0) return NULL; - if (flags & 0xfefe) - return bitch("reserved flags bits are set"); - if (flags & 0x0001 && !(flags & 0x0100)) - return bitch("SEP bit is set but Zone Key bit is unset"); - rr->flags = flags; - - /* TODO validate that `name` is the name of the zone if flags have Zone Key bit set */ - - proto = extract_integer(&s, "protocol"); - if (proto < 0) return NULL; - if (proto != 3) - return bitch("bad protocol value"); - rr->protocol = proto; - - algorithm = extract_algorithm(&s, "algorithm"); - if (algorithm == ALG_UNSUPPORTED) return NULL; - if (algorithm == ALG_PRIVATEDNS || algorithm == ALG_PRIVATEOID) { - return bitch("private algorithms are not supported in DNSKEY"); - } - rr->algorithm = algorithm; - - key = extract_base64_binary_data(&s, "public key"); - if (key.length < 0) return NULL; - /* TODO validate key length based on algorithm */ - rr->pubkey = key; - - ac = 0; - ac += rr->flags; - ac += rr->protocol << 8; - ac += rr->algorithm; - for (i = 0; i < rr->pubkey.length; i++) { - ac += (i & 1) ? (unsigned char)rr->pubkey.data[i] : ((unsigned char)rr->pubkey.data[i]) << 8; - } - ac += (ac >> 16) & 0xFFFF; - rr->key_tag = ac & 0xFFFF; - - rr->pkey_built = 0; - rr->pkey = NULL; - - if (*s) { - return bitch("garbage after valid DNSKEY data"); - } - return store_record(type, name, ttl, rr); + struct rr_dnskey *rr = getmem(sizeof(*rr)); + struct binary_data key; + int flags, proto, algorithm; + unsigned int ac; + int i; + static struct rr *result; + + flags = extract_integer(&s, "flags", NULL); + if (flags < 0) return NULL; + if (flags & 0xfe7e) + return bitch("reserved flags bits are set"); + if (flags & 0x0001 && !(flags & 0x0100)) + return bitch("SEP bit is set but Zone Key bit is unset"); + rr->flags = flags; + + /* TODO validate that `name` is the name of the zone if flags have Zone Key bit set */ + + proto = extract_integer(&s, "protocol", NULL); + if (proto < 0) return NULL; + if (proto != 3) + return bitch("bad protocol value"); + rr->protocol = proto; + + algorithm = extract_algorithm(&s, "algorithm"); + if (algorithm == ALG_UNSUPPORTED) return NULL; + if (algorithm == ALG_PRIVATEDNS || algorithm == ALG_PRIVATEOID) { + return bitch("private algorithms are not supported in %s", type == T_CDNSKEY ? "CDNSKEY" : "DNSKEY"); + } + rr->algorithm = algorithm; + + key = extract_base64_binary_data(&s, "public key"); + if (key.length < 0) return NULL; + /* TODO validate key length based on algorithm */ + rr->pubkey = key; + + ac = 0; + ac += rr->flags; + ac += rr->protocol << 8; + ac += rr->algorithm; + for (i = 0; i < rr->pubkey.length; i++) { + ac += (i & 1) ? (unsigned char)rr->pubkey.data[i] : ((unsigned char)rr->pubkey.data[i]) << 8; + } + ac += (ac >> 16) & 0xFFFF; + rr->key_tag = ac & 0xFFFF; + + rr->pkey_built = 0; + rr->pkey = NULL; + rr->key_type = KEY_TYPE_UNUSED; + + if (*s) { + return bitch("garbage after valid %s data", type == T_CDNSKEY ? "CDNSKEY" : "DNSKEY"); + } + result = store_record(type, name, ttl, rr); + if (result && type == T_DNSKEY) { + rr->next_key = all_dns_keys; + all_dns_keys = rr; + } + return result; } -static char* dnskey_human(struct rr *rrv) +static char* dnskey_cdnskey_human(struct rr *rrv) { - RRCAST(dnskey); + RRCAST(dnskey); char s[1024]; snprintf(s, 1024, "%hu %d %d XXX ; key id = %hu", - rr->flags, rr->protocol, rr->algorithm, rr->key_tag); + rr->flags, rr->protocol, rr->algorithm, rr->key_tag); return quickstrdup_temp(s); } -static struct binary_data dnskey_wirerdata(struct rr *rrv) +static struct binary_data dnskey_cdnskey_wirerdata(struct rr *rrv) +{ + RRCAST(dnskey); + + return compose_binary_data("211d", 1, + rr->flags, rr->protocol, rr->algorithm, + rr->pubkey); +} + +static void *dnskey_cdnskey_validate(struct rr *rrv) { - RRCAST(dnskey); + RRCAST(dnskey); - return compose_binary_data("211d", 1, - rr->flags, rr->protocol, rr->algorithm, - rr->pubkey); -} - -static void *dnskey_validate(struct rr *rrv) -{ - RRCAST(dnskey); - - if (G.opt.policy_checks[POLICY_DNSKEY]) { - if (algorithm_type(rr->algorithm) == ALG_RSA_FAMILY) { - unsigned int e_bytes; - unsigned char *pk; - int l; - - pk = (unsigned char *)rr->pubkey.data; - l = rr->pubkey.length; - - e_bytes = *pk++; - l--; - if (e_bytes == 0) { - if (l < 2) - return moan(rr->rr.file_name, rr->rr.line, "public key is too short"); - e_bytes = (*pk++) << 8; - e_bytes += *pk++; - l -= 2; - } - if (l < e_bytes) - return moan(rr->rr.file_name, rr->rr.line, "public key is too short"); - - if (*pk == 0) - return moan(rr->rr.file_name, rr->rr.line, "leading zero octets in public key exponent"); - pk += e_bytes; - l -= e_bytes; - if (l > 0 && *pk == 0) - return moan(rr->rr.file_name, rr->rr.line, "leading zero octets in key modulus"); - } - } - return NULL; + if (G.opt.policy_checks[POLICY_DNSKEY]) { + if (algorithm_type(rr->algorithm) == ALG_RSA_FAMILY) { + unsigned int e_bytes; + unsigned char *pk; + int l; + + pk = (unsigned char *)rr->pubkey.data; + l = rr->pubkey.length; + + e_bytes = *pk++; + l--; + if (e_bytes == 0) { + if (l < 2) + return moan(rr->rr.file_name, rr->rr.line, "public key is too short"); + e_bytes = (*pk++) << 8; + e_bytes += *pk++; + l -= 2; + } + if (l < e_bytes) + return moan(rr->rr.file_name, rr->rr.line, "public key is too short"); + + if (*pk == 0) + return moan(rr->rr.file_name, rr->rr.line, "leading zero octets in public key exponent"); + pk += e_bytes; + l -= e_bytes; + if (l > 0 && *pk == 0) + return moan(rr->rr.file_name, rr->rr.line, "leading zero octets in key modulus"); + } + } + return NULL; } -struct rr_methods dnskey_methods = { dnskey_parse, dnskey_human, dnskey_wirerdata, NULL, dnskey_validate }; +struct rr_methods dnskey_methods = { dnskey_cdnskey_parse, dnskey_cdnskey_human, dnskey_cdnskey_wirerdata, NULL, dnskey_cdnskey_validate }; +struct rr_methods cdnskey_methods = { dnskey_cdnskey_parse, dnskey_cdnskey_human, dnskey_cdnskey_wirerdata, NULL, dnskey_cdnskey_validate }; int dnskey_build_pkey(struct rr_dnskey *rr) { - if (rr->pkey_built) - return rr->pkey ? 1 : 0; + if (rr->pkey_built) + return rr->pkey ? 1 : 0; - rr->pkey_built = 1; + rr->pkey_built = 1; - if (algorithm_type(rr->algorithm) == ALG_RSA_FAMILY) { - RSA *rsa; - EVP_PKEY *pkey; - unsigned int e_bytes; - unsigned char *pk; - int l; + if (algorithm_type(rr->algorithm) == ALG_RSA_FAMILY) { + RSA *rsa; + EVP_PKEY *pkey; + unsigned int e_bytes; + unsigned char *pk; + int l; BIGNUM *n, *e; - rsa = RSA_new(); - if (!rsa) - goto done; - - pk = (unsigned char *)rr->pubkey.data; - l = rr->pubkey.length; - - e_bytes = *pk++; - l--; - if (e_bytes == 0) { - if (l < 2) /* public key is too short */ - goto done; - e_bytes = (*pk++) << 8; - e_bytes += *pk++; - l -= 2; - } - if (l < e_bytes) /* public key is too short */ - goto done; + rsa = RSA_new(); + if (!rsa) + goto done; + + pk = (unsigned char *)rr->pubkey.data; + l = rr->pubkey.length; + + e_bytes = *pk++; + l--; + if (e_bytes == 0) { + if (l < 2) /* public key is too short */ + goto done; + e_bytes = (*pk++) << 8; + e_bytes += *pk++; + l -= 2; + } + if (l < e_bytes) /* public key is too short */ + goto done; e = BN_bin2bn(pk, e_bytes, NULL); - pk += e_bytes; - l -= e_bytes; + pk += e_bytes; + l -= e_bytes; n = BN_bin2bn(pk, l, NULL); RSA_set0_key(rsa, n, e, NULL); - pkey = EVP_PKEY_new(); - if (!pkey) - goto done; + pkey = EVP_PKEY_new(); + if (!pkey) + goto done; + + if (!EVP_PKEY_set1_RSA(pkey, rsa)) + goto done; + + rr->pkey = pkey; + } else if (algorithm_type(rr->algorithm) == ALG_ECC_FAMILY) { + EC_KEY *pubeckey; + EVP_PKEY *pkey; + unsigned char *pk; + int l; + BIGNUM *bn_x = NULL; + BIGNUM *bn_y = NULL; + + if (rr->algorithm == ALG_ECDSAP256SHA256) { + l = SHA256_DIGEST_LENGTH; + pubeckey = EC_KEY_new_by_curve_name(NID_X9_62_prime256v1); + } else if (rr->algorithm == ALG_ECDSAP384SHA384) { + l = SHA384_DIGEST_LENGTH; + pubeckey = EC_KEY_new_by_curve_name(NID_secp384r1); + } else { + goto done; + } + + if (!pubeckey) + goto done; + + if (rr->pubkey.length != 2*l) { + goto done; + } + + pk = (unsigned char *)rr->pubkey.data; + + bn_x = BN_bin2bn(pk, l, NULL); + bn_y = BN_bin2bn(&pk[l], l, NULL); + + if (1 != EC_KEY_set_public_key_affine_coordinates(pubeckey, bn_x, bn_y)) { + goto done; + } + + pkey = EVP_PKEY_new(); + if (!pkey) + goto done; - if (!EVP_PKEY_set1_RSA(pkey, rsa)) - goto done; + if (!EVP_PKEY_assign_EC_KEY(pkey, pubeckey)) + goto done; - rr->pkey = pkey; - } + rr->pkey = pkey; + } done: - if (!rr->pkey) { - moan(rr->rr.file_name, rr->rr.line, "error building pkey"); - } - return rr->pkey ? 1 : 0; + if (!rr->pkey) { + moan(rr->rr.file_name, rr->rr.line, "error building pkey"); + } + return rr->pkey ? 1 : 0; +} + +void +dnskey_ksk_policy_check(void) +{ + struct rr_dnskey *rr = all_dns_keys; + int ksk_found = 0; + + while (rr) { + if (rr->key_type == KEY_TYPE_KSK) + ksk_found = 1; + rr = rr->next_key; + } + if (!ksk_found) + moan(all_dns_keys->rr.file_name, all_dns_keys->rr.line, "No KSK found"); } diff -Naur validns-0.8/dnskey.c.orig validns/dnskey.c.orig --- validns-0.8/dnskey.c.orig 2014-02-11 15:45:11.000000000 -0500 +++ validns/dnskey.c.orig 1969-12-31 19:00:00.000000000 -0500 @@ -1,189 +0,0 @@ -/* - * Part of DNS zone file validator `validns`. - * - * Copyright 2011-2014 Anton Berezin - * Modified BSD license. - * (See LICENSE file in the distribution.) - * - */ -#include -#include -#include -#include -#include -#include -#include - -#include "common.h" -#include "textparse.h" -#include "mempool.h" -#include "carp.h" -#include "rr.h" - -static struct rr* dnskey_parse(char *name, long ttl, int type, char *s) -{ - struct rr_dnskey *rr = getmem(sizeof(*rr)); - struct binary_data key; - int flags, proto, algorithm; - unsigned int ac; - int i; - - flags = extract_integer(&s, "flags"); - if (flags < 0) return NULL; - if (flags & 0xfefe) - return bitch("reserved flags bits are set"); - if (flags & 0x0001 && !(flags & 0x0100)) - return bitch("SEP bit is set but Zone Key bit is unset"); - rr->flags = flags; - - /* TODO validate that `name` is the name of the zone if flags have Zone Key bit set */ - - proto = extract_integer(&s, "protocol"); - if (proto < 0) return NULL; - if (proto != 3) - return bitch("bad protocol value"); - rr->protocol = proto; - - algorithm = extract_algorithm(&s, "algorithm"); - if (algorithm == ALG_UNSUPPORTED) return NULL; - if (algorithm == ALG_PRIVATEDNS || algorithm == ALG_PRIVATEOID) { - return bitch("private algorithms are not supported in DNSKEY"); - } - rr->algorithm = algorithm; - - key = extract_base64_binary_data(&s, "public key"); - if (key.length < 0) return NULL; - /* TODO validate key length based on algorithm */ - rr->pubkey = key; - - ac = 0; - ac += rr->flags; - ac += rr->protocol << 8; - ac += rr->algorithm; - for (i = 0; i < rr->pubkey.length; i++) { - ac += (i & 1) ? (unsigned char)rr->pubkey.data[i] : ((unsigned char)rr->pubkey.data[i]) << 8; - } - ac += (ac >> 16) & 0xFFFF; - rr->key_tag = ac & 0xFFFF; - - rr->pkey_built = 0; - rr->pkey = NULL; - - if (*s) { - return bitch("garbage after valid DNSKEY data"); - } - return store_record(type, name, ttl, rr); -} - -static char* dnskey_human(struct rr *rrv) -{ - RRCAST(dnskey); - char s[1024]; - - snprintf(s, 1024, "%hu %d %d XXX ; key id = %hu", - rr->flags, rr->protocol, rr->algorithm, rr->key_tag); - return quickstrdup_temp(s); -} - -static struct binary_data dnskey_wirerdata(struct rr *rrv) -{ - RRCAST(dnskey); - - return compose_binary_data("211d", 1, - rr->flags, rr->protocol, rr->algorithm, - rr->pubkey); -} - -static void *dnskey_validate(struct rr *rrv) -{ - RRCAST(dnskey); - - if (G.opt.policy_checks[POLICY_DNSKEY]) { - if (algorithm_type(rr->algorithm) == ALG_RSA_FAMILY) { - unsigned int e_bytes; - unsigned char *pk; - int l; - - pk = (unsigned char *)rr->pubkey.data; - l = rr->pubkey.length; - - e_bytes = *pk++; - l--; - if (e_bytes == 0) { - if (l < 2) - return moan(rr->rr.file_name, rr->rr.line, "public key is too short"); - e_bytes = (*pk++) << 8; - e_bytes += *pk++; - l -= 2; - } - if (l < e_bytes) - return moan(rr->rr.file_name, rr->rr.line, "public key is too short"); - - if (*pk == 0) - return moan(rr->rr.file_name, rr->rr.line, "leading zero octets in public key exponent"); - pk += e_bytes; - l -= e_bytes; - if (l > 0 && *pk == 0) - return moan(rr->rr.file_name, rr->rr.line, "leading zero octets in key modulus"); - } - } - return NULL; -} - -struct rr_methods dnskey_methods = { dnskey_parse, dnskey_human, dnskey_wirerdata, NULL, dnskey_validate }; - -int dnskey_build_pkey(struct rr_dnskey *rr) -{ - if (rr->pkey_built) - return rr->pkey ? 1 : 0; - - rr->pkey_built = 1; - - if (algorithm_type(rr->algorithm) == ALG_RSA_FAMILY) { - RSA *rsa; - EVP_PKEY *pkey; - unsigned int e_bytes; - unsigned char *pk; - int l; - - rsa = RSA_new(); - if (!rsa) - goto done; - - pk = (unsigned char *)rr->pubkey.data; - l = rr->pubkey.length; - - e_bytes = *pk++; - l--; - if (e_bytes == 0) { - if (l < 2) /* public key is too short */ - goto done; - e_bytes = (*pk++) << 8; - e_bytes += *pk++; - l -= 2; - } - if (l < e_bytes) /* public key is too short */ - goto done; - - rsa->e = BN_bin2bn(pk, e_bytes, NULL); - pk += e_bytes; - l -= e_bytes; - - rsa->n = BN_bin2bn(pk, l, NULL); - - pkey = EVP_PKEY_new(); - if (!pkey) - goto done; - - if (!EVP_PKEY_set1_RSA(pkey, rsa)) - goto done; - - rr->pkey = pkey; - } -done: - if (!rr->pkey) { - moan(rr->rr.file_name, rr->rr.line, "error building pkey"); - } - return rr->pkey ? 1 : 0; -} - diff -Naur validns-0.8/ds.c validns/ds.c --- validns-0.8/ds.c 2014-02-11 15:44:59.000000000 -0500 +++ validns/ds.c 2020-10-05 16:59:29.354681360 -0400 @@ -17,83 +17,84 @@ #include "carp.h" #include "rr.h" -static struct rr* ds_parse(char *name, long ttl, int type, char *s) +static struct rr* ds_cds_parse(char *name, long ttl, int type, char *s) { - struct rr_ds *rr = getmem(sizeof(*rr)); - int key_tag, algorithm, digest_type; + struct rr_ds *rr = getmem(sizeof(*rr)); + int key_tag, algorithm, digest_type; - key_tag = extract_integer(&s, "key tag"); - if (key_tag < 0) return NULL; - rr->key_tag = key_tag; - - algorithm = extract_algorithm(&s, "algorithm"); - if (algorithm == ALG_UNSUPPORTED) return NULL; - rr->algorithm = algorithm; - - digest_type = extract_integer(&s, "digest type"); - if (digest_type < 0) return NULL; - rr->digest_type = digest_type; - - rr->digest = extract_hex_binary_data(&s, "digest", EXTRACT_EAT_WHITESPACE); - if (rr->digest.length < 0) return NULL; - - /* See http://www.iana.org/assignments/ds-rr-types/ds-rr-types.xml - * for valid digest types. */ - switch (digest_type) { - case 1: - if (rr->digest.length != SHA1_BYTES) { - return bitch("wrong SHA-1 digest length: %d bytes found, %d bytes expected", rr->digest.length, SHA1_BYTES); - } - break; - case 2: - if (rr->digest.length != SHA256_BYTES) { - return bitch("wrong SHA-256 digest length: %d bytes found, %d bytes expected", rr->digest.length, SHA256_BYTES); - } - break; - case 3: - if (rr->digest.length != GOST_BYTES) { - return bitch("wrong GOST R 34.11-94 digest length: %d bytes found, %d bytes expected", rr->digest.length, GOST_BYTES); - } - break; - case 4: - if (rr->digest.length != SHA384_BYTES) { - return bitch("wrong SHA-384 digest length: %d bytes found, %d bytes expected", rr->digest.length, SHA384_BYTES); - } - break; - default: - return bitch("bad or unsupported digest type %d", digest_type); - } - - if (*s) { - return bitch("garbage after valid DS data"); - } - return store_record(type, name, ttl, rr); + key_tag = extract_integer(&s, "key tag", NULL); + if (key_tag < 0) return NULL; + rr->key_tag = key_tag; + + algorithm = extract_algorithm(&s, "algorithm"); + if (algorithm == ALG_UNSUPPORTED) return NULL; + rr->algorithm = algorithm; + + digest_type = extract_integer(&s, "digest type", NULL); + if (digest_type < 0) return NULL; + rr->digest_type = digest_type; + + rr->digest = extract_hex_binary_data(&s, "digest", EXTRACT_EAT_WHITESPACE); + if (rr->digest.length < 0) return NULL; + + /* See http://www.iana.org/assignments/ds-rr-types/ds-rr-types.xml + * for valid digest types. */ + switch (digest_type) { + case 1: + if (rr->digest.length != SHA1_BYTES) { + return bitch("wrong SHA-1 digest length: %d bytes found, %d bytes expected", rr->digest.length, SHA1_BYTES); + } + break; + case 2: + if (rr->digest.length != SHA256_BYTES) { + return bitch("wrong SHA-256 digest length: %d bytes found, %d bytes expected", rr->digest.length, SHA256_BYTES); + } + break; + case 3: + if (rr->digest.length != GOST_BYTES) { + return bitch("wrong GOST R 34.11-94 digest length: %d bytes found, %d bytes expected", rr->digest.length, GOST_BYTES); + } + break; + case 4: + if (rr->digest.length != SHA384_BYTES) { + return bitch("wrong SHA-384 digest length: %d bytes found, %d bytes expected", rr->digest.length, SHA384_BYTES); + } + break; + default: + return bitch("bad or unsupported digest type %d", digest_type); + } + + if (*s) { + return bitch("garbage after valid %s data", type == T_CDS ? "CDS" : "DS"); + } + return store_record(type, name, ttl, rr); } -static char* ds_human(struct rr *rrv) +static char* ds_cds_human(struct rr *rrv) { - RRCAST(ds); + RRCAST(ds); char ss[4096]; - char *s = ss; - int l; - int i; + char *s = ss; + int l; + int i; l = snprintf(s, 4096, "%u %u %u ", rr->key_tag, rr->algorithm, rr->digest_type); - s += l; - for (i = 0; i < rr->digest.length; i++) { - l = snprintf(s, 4096-(s-ss), "%02X", (unsigned char)rr->digest.data[i]); - s += l; - } + s += l; + for (i = 0; i < rr->digest.length; i++) { + l = snprintf(s, 4096-(s-ss), "%02X", (unsigned char)rr->digest.data[i]); + s += l; + } return quickstrdup_temp(ss); } -static struct binary_data ds_wirerdata(struct rr *rrv) +static struct binary_data ds_cds_wirerdata(struct rr *rrv) { - RRCAST(ds); + RRCAST(ds); - return compose_binary_data("211d", 1, - rr->key_tag, rr->algorithm, rr->digest_type, - rr->digest); + return compose_binary_data("211d", 1, + rr->key_tag, rr->algorithm, rr->digest_type, + rr->digest); } -struct rr_methods ds_methods = { ds_parse, ds_human, ds_wirerdata, NULL, NULL }; +struct rr_methods ds_methods = { ds_cds_parse, ds_cds_human, ds_cds_wirerdata, NULL, NULL }; +struct rr_methods cds_methods = { ds_cds_parse, ds_cds_human, ds_cds_wirerdata, NULL, NULL }; diff -Naur validns-0.8/hinfo.c validns/hinfo.c --- validns-0.8/hinfo.c 2014-02-11 15:45:14.000000000 -0500 +++ validns/hinfo.c 2020-10-05 16:59:29.354681360 -0400 @@ -20,30 +20,30 @@ static struct rr *hinfo_parse(char *name, long ttl, int type, char *s) { - struct rr_hinfo *rr = getmem(sizeof(*rr)); + struct rr_hinfo *rr = getmem(sizeof(*rr)); - rr->cpu = extract_text(&s, "CPU"); - if (rr->cpu.length < 0) - return NULL; - if (rr->cpu.length > 255) - return bitch("CPU string is too long"); - - rr->os = extract_text(&s, "OS"); - if (rr->os.length < 0) - return NULL; - if (rr->os.length > 255) - return bitch("OS string is too long"); - - if (*s) { - return bitch("garbage after valid HINFO data"); - } + rr->cpu = extract_text(&s, "CPU"); + if (rr->cpu.length < 0) + return NULL; + if (rr->cpu.length > 255) + return bitch("CPU string is too long"); + + rr->os = extract_text(&s, "OS"); + if (rr->os.length < 0) + return NULL; + if (rr->os.length > 255) + return bitch("OS string is too long"); + + if (*s) { + return bitch("garbage after valid HINFO data"); + } - return store_record(type, name, ttl, rr); + return store_record(type, name, ttl, rr); } static char* hinfo_human(struct rr *rrv) { - RRCAST(hinfo); + RRCAST(hinfo); char s[1024]; snprintf(s, 1024, "\"%s\" \"%s\"", rr->cpu.data, rr->os.data); @@ -52,7 +52,7 @@ static struct binary_data hinfo_wirerdata(struct rr *rrv) { - RRCAST(hinfo); + RRCAST(hinfo); return compose_binary_data("bb", 1, rr->cpu, rr->os); } diff -Naur validns-0.8/ipseckey.c validns/ipseckey.c --- validns-0.8/ipseckey.c 2020-10-05 16:54:14.348790465 -0400 +++ validns/ipseckey.c 2020-10-05 16:59:29.354681360 -0400 @@ -21,157 +21,157 @@ static struct rr *ipseckey_parse(char *name, long ttl, int type, char *s) { - struct rr_ipseckey *rr = getmem(sizeof(*rr)); - int i; + struct rr_ipseckey *rr = getmem(sizeof(*rr)); + int i; - rr->precedence = i = extract_integer(&s, "precedence"); - if (i < 0) return NULL; - if (i >= 256) return bitch("precedence range is not valid"); - - rr->gateway_type = i = extract_integer(&s, "gateway type"); - if (i < 0) return NULL; - if (i > 3) return bitch("gateway type is not valid"); - - rr->algorithm = i = extract_integer(&s, "algorithm"); - if (i < 0) return NULL; - if (i > 2) return bitch("algorithm is not valid"); - - switch (rr->gateway_type) { - case 0: - rr->gateway.gateway_none = extract_name(&s, "gateway/.", KEEP_CAPITALIZATION); - if (!rr->gateway.gateway_none) return NULL; - if (strcmp(rr->gateway.gateway_none, ".") != 0) - return bitch("gateway must be \".\" for gateway type 0"); - break; - case 1: - if (extract_ipv4(&s, "gateway/IPv4", &rr->gateway.gateway_ipv4) <= 0) - return NULL; - break; - case 2: - if (extract_ipv6(&s, "gateway/IPv6", &rr->gateway.gateway_ipv6) <= 0) - return NULL; - break; - case 3: - rr->gateway.gateway_name = extract_name(&s, "gateway/name", KEEP_CAPITALIZATION); - if (!rr->gateway.gateway_name) return NULL; - break; - default: - croakx(7, "assertion failed: gateway type %d not within range", rr->gateway_type); - } - - /* My reading of http://tools.ietf.org/html/rfc4025 is fuzzy on: - * - * - whether it is possible to have algorithm 0 and non-empty key; - * - whether it is possible to have empty key and algorithm != 0. - * - * Here I assume "not possible" for both. - */ - switch (rr->algorithm) { - case 0: - break; - case 1: - /* DSA key */ - rr->public_key = extract_base64_binary_data(&s, "public key"); - if (rr->public_key.length < 0) return NULL; - break; - case 2: - /* RSA key */ - rr->public_key = extract_base64_binary_data(&s, "public key"); - if (rr->public_key.length < 0) return NULL; - break; - default: - croakx(7, "assertion failed: algorithm %d not within range", rr->algorithm); - } - - if (*s) { - return bitch("garbage after valid IPSECKEY data"); - } + rr->precedence = i = extract_integer(&s, "precedence", NULL); + if (i < 0) return NULL; + if (i >= 256) return bitch("precedence range is not valid"); + + rr->gateway_type = i = extract_integer(&s, "gateway type", NULL); + if (i < 0) return NULL; + if (i > 3) return bitch("gateway type is not valid"); + + rr->algorithm = i = extract_integer(&s, "algorithm", NULL); + if (i < 0) return NULL; + if (i > 2) return bitch("algorithm is not valid"); + + switch (rr->gateway_type) { + case 0: + rr->gateway.gateway_none = extract_name(&s, "gateway/.", KEEP_CAPITALIZATION); + if (!rr->gateway.gateway_none) return NULL; + if (strcmp(rr->gateway.gateway_none, ".") != 0) + return bitch("gateway must be \".\" for gateway type 0"); + break; + case 1: + if (extract_ipv4(&s, "gateway/IPv4", &rr->gateway.gateway_ipv4) <= 0) + return NULL; + break; + case 2: + if (extract_ipv6(&s, "gateway/IPv6", &rr->gateway.gateway_ipv6) <= 0) + return NULL; + break; + case 3: + rr->gateway.gateway_name = extract_name(&s, "gateway/name", KEEP_CAPITALIZATION); + if (!rr->gateway.gateway_name) return NULL; + break; + default: + croakx(7, "assertion failed: gateway type %d not within range", rr->gateway_type); + } + + /* My reading of http://tools.ietf.org/html/rfc4025 is fuzzy on: + * + * - whether it is possible to have algorithm 0 and non-empty key; + * - whether it is possible to have empty key and algorithm != 0. + * + * Here I assume "not possible" for both. + */ + switch (rr->algorithm) { + case 0: + break; + case 1: + /* DSA key */ + rr->public_key = extract_base64_binary_data(&s, "public key"); + if (rr->public_key.length < 0) return NULL; + break; + case 2: + /* RSA key */ + rr->public_key = extract_base64_binary_data(&s, "public key"); + if (rr->public_key.length < 0) return NULL; + break; + default: + croakx(7, "assertion failed: algorithm %d not within range", rr->algorithm); + } + + if (*s) { + return bitch("garbage after valid IPSECKEY data"); + } - return store_record(type, name, ttl, rr); + return store_record(type, name, ttl, rr); } static char* ipseckey_human(struct rr *rrv) { - RRCAST(ipseckey); + RRCAST(ipseckey); char s[1024], gw[1024]; - switch (rr->gateway_type) { - case 0: - strcpy(gw, rr->gateway.gateway_none); - break; - case 1: - inet_ntop(AF_INET, &rr->gateway.gateway_ipv4, gw, 2048); - break; - case 2: - inet_ntop(AF_INET6, &rr->gateway.gateway_ipv6, gw, 2048); - break; - case 3: - strcpy(gw, rr->gateway.gateway_name); - break; - default: - strcpy(gw, "??"); - } - snprintf(s, 2048, "( %d %d %d %s ... )", - rr->precedence, rr->gateway_type, rr->algorithm, gw); + switch (rr->gateway_type) { + case 0: + strcpy(gw, rr->gateway.gateway_none); + break; + case 1: + inet_ntop(AF_INET, &rr->gateway.gateway_ipv4, gw, 1024); + break; + case 2: + inet_ntop(AF_INET6, &rr->gateway.gateway_ipv6, gw, 1024); + break; + case 3: + strcpy(gw, rr->gateway.gateway_name); + break; + default: + strcpy(gw, "??"); + } + snprintf(s, 1024, "( %d %d %d %s ... )", + rr->precedence, rr->gateway_type, rr->algorithm, gw); return quickstrdup_temp(s); } static struct binary_data ipseckey_wirerdata(struct rr *rrv) { - RRCAST(ipseckey); - struct binary_data helper; + RRCAST(ipseckey); + struct binary_data helper; - switch (rr->gateway_type) { - case 0: - if (rr->algorithm != 0) - return compose_binary_data("111d", 1, - rr->precedence, rr->gateway_type, rr->algorithm, - rr->public_key); - else - return compose_binary_data("111", 1, - rr->precedence, rr->gateway_type, rr->algorithm); - break; - case 1: - helper.length = sizeof(rr->gateway.gateway_ipv4); - helper.data = (void *)&rr->gateway.gateway_ipv4; - - if (rr->algorithm != 0) - return compose_binary_data("111dd", 1, - rr->precedence, rr->gateway_type, rr->algorithm, - helper, - rr->public_key); - else - return compose_binary_data("111d", 1, - rr->precedence, rr->gateway_type, rr->algorithm, - helper); - break; - case 2: - - helper.length = sizeof(rr->gateway.gateway_ipv6); - helper.data = (void *)&rr->gateway.gateway_ipv6; - - if (rr->algorithm != 0) - return compose_binary_data("111dd", 1, - rr->precedence, rr->gateway_type, rr->algorithm, - helper, - rr->public_key); - else - return compose_binary_data("111d", 1, - rr->precedence, rr->gateway_type, rr->algorithm, - helper); - break; - case 3: - if (rr->algorithm != 0) - return compose_binary_data("111dd", 1, - rr->precedence, rr->gateway_type, rr->algorithm, - name2wire_name(rr->gateway.gateway_name), - rr->public_key); - else - return compose_binary_data("111d", 1, - rr->precedence, rr->gateway_type, rr->algorithm, - name2wire_name(rr->gateway.gateway_name)); - break; - } + switch (rr->gateway_type) { + case 0: + if (rr->algorithm != 0) + return compose_binary_data("111d", 1, + rr->precedence, rr->gateway_type, rr->algorithm, + rr->public_key); + else + return compose_binary_data("111", 1, + rr->precedence, rr->gateway_type, rr->algorithm); + break; + case 1: + helper.length = sizeof(rr->gateway.gateway_ipv4); + helper.data = (void *)&rr->gateway.gateway_ipv4; + + if (rr->algorithm != 0) + return compose_binary_data("111dd", 1, + rr->precedence, rr->gateway_type, rr->algorithm, + helper, + rr->public_key); + else + return compose_binary_data("111d", 1, + rr->precedence, rr->gateway_type, rr->algorithm, + helper); + break; + case 2: + + helper.length = sizeof(rr->gateway.gateway_ipv6); + helper.data = (void *)&rr->gateway.gateway_ipv6; + + if (rr->algorithm != 0) + return compose_binary_data("111dd", 1, + rr->precedence, rr->gateway_type, rr->algorithm, + helper, + rr->public_key); + else + return compose_binary_data("111d", 1, + rr->precedence, rr->gateway_type, rr->algorithm, + helper); + break; + case 3: + if (rr->algorithm != 0) + return compose_binary_data("111dd", 1, + rr->precedence, rr->gateway_type, rr->algorithm, + name2wire_name(rr->gateway.gateway_name), + rr->public_key); + else + return compose_binary_data("111d", 1, + rr->precedence, rr->gateway_type, rr->algorithm, + name2wire_name(rr->gateway.gateway_name)); + break; + } return bad_binary_data(); } diff -Naur validns-0.8/isdn.c validns/isdn.c --- validns-0.8/isdn.c 2014-02-11 15:46:34.000000000 -0500 +++ validns/isdn.c 2020-10-05 16:59:29.354681360 -0400 @@ -23,52 +23,52 @@ static struct rr *isdn_parse(char *name, long ttl, int type, char *s) { - struct rr_isdn *rr = getmem(sizeof(*rr)); + struct rr_isdn *rr = getmem(sizeof(*rr)); - rr->isdn_address = extract_text(&s, "ISDN-address"); - if (rr->isdn_address.length < 0) - return NULL; - if (rr->isdn_address.length > 255) - return bitch("ISDN-address too long"); - - rr->sa_present = 0; - if (*s) { - rr->sa = extract_text(&s, "subaddress"); - if (rr->sa.length < 0) - return NULL; - if (rr->sa.length > 255) - return bitch("subaddress too long"); - rr->sa_present = 1; - } - - if (*s) { - return bitch("garbage after valid ISDN data"); - } + rr->isdn_address = extract_text(&s, "ISDN-address"); + if (rr->isdn_address.length < 0) + return NULL; + if (rr->isdn_address.length > 255) + return bitch("ISDN-address too long"); + + rr->sa_present = 0; + if (*s) { + rr->sa = extract_text(&s, "subaddress"); + if (rr->sa.length < 0) + return NULL; + if (rr->sa.length > 255) + return bitch("subaddress too long"); + rr->sa_present = 1; + } + + if (*s) { + return bitch("garbage after valid ISDN data"); + } - return store_record(type, name, ttl, rr); + return store_record(type, name, ttl, rr); } static char* isdn_human(struct rr *rrv) { - RRCAST(isdn); + RRCAST(isdn); return rr->isdn_address.data; } static struct binary_data isdn_wirerdata(struct rr *rrv) { - RRCAST(isdn); - struct binary_data r, t; + RRCAST(isdn); + struct binary_data r, t; - r = bad_binary_data(); - t.length = 0; - t.data = NULL; - r = compose_binary_data("db", 1, t, rr->isdn_address); - t = r; - if (rr->sa_present) { - r = compose_binary_data("db", 1, t, rr->sa); - t = r; - } + r = bad_binary_data(); + t.length = 0; + t.data = NULL; + r = compose_binary_data("db", 1, t, rr->isdn_address); + t = r; + if (rr->sa_present) { + r = compose_binary_data("db", 1, t, rr->sa); + t = r; + } return r; } diff -Naur validns-0.8/kx.c validns/kx.c --- validns-0.8/kx.c 2014-02-11 15:46:36.000000000 -0500 +++ validns/kx.c 2020-10-05 16:59:29.354681360 -0400 @@ -19,40 +19,40 @@ static struct rr *kx_parse(char *name, long ttl, int type, char *s) { - struct rr_kx *rr = getmem(sizeof(*rr)); + struct rr_kx *rr = getmem(sizeof(*rr)); - rr->preference = extract_integer(&s, "KX preference"); - if (rr->preference < 0) - return NULL; + rr->preference = extract_integer(&s, "KX preference", NULL); + if (rr->preference < 0) + return NULL; - rr->exchanger = extract_name(&s, "KX exchanger", 0); - if (!rr->exchanger) - return NULL; + rr->exchanger = extract_name(&s, "KX exchanger", 0); + if (!rr->exchanger) + return NULL; - if (*s) { - return bitch("garbage after valid KX data"); - } + if (*s) { + return bitch("garbage after valid KX data"); + } - return store_record(type, name, ttl, rr); + return store_record(type, name, ttl, rr); } static char* kx_human(struct rr *rrv) { - RRCAST(kx); + RRCAST(kx); char s[1024]; snprintf(s, 1024, "%d %s", - rr->preference, rr->exchanger); + rr->preference, rr->exchanger); return quickstrdup_temp(s); } static struct binary_data kx_wirerdata(struct rr *rrv) { - RRCAST(kx); + RRCAST(kx); return compose_binary_data("2d", 1, - rr->preference, - name2wire_name(rr->exchanger)); + rr->preference, + name2wire_name(rr->exchanger)); } struct rr_methods kx_methods = { kx_parse, kx_human, kx_wirerdata, NULL, NULL }; diff -Naur validns-0.8/l32.c validns/l32.c --- validns-0.8/l32.c 2014-02-11 15:46:17.000000000 -0500 +++ validns/l32.c 2020-10-05 16:59:29.354681360 -0400 @@ -19,41 +19,41 @@ static struct rr *l32_parse(char *name, long ttl, int type, char *s) { - struct rr_l32 *rr = getmem(sizeof(*rr)); - struct in_addr ipv4_like; - int preference; - - rr->preference = preference = extract_integer(&s, "L32 preference"); - if (preference < 0) - return NULL; - if (extract_ipv4(&s, "Locator32", &ipv4_like) <= 0) - return NULL; - rr->locator32 = ipv4_like.s_addr; - - if (*s) { - return bitch("garbage after valid L32 data"); - } + struct rr_l32 *rr = getmem(sizeof(*rr)); + struct in_addr ipv4_like; + int preference; + + rr->preference = preference = extract_integer(&s, "L32 preference", NULL); + if (preference < 0) + return NULL; + if (extract_ipv4(&s, "Locator32", &ipv4_like) <= 0) + return NULL; + rr->locator32 = ipv4_like.s_addr; + + if (*s) { + return bitch("garbage after valid L32 data"); + } - return store_record(type, name, ttl, rr); + return store_record(type, name, ttl, rr); } static char* l32_human(struct rr *rrv) { - RRCAST(l32); + RRCAST(l32); char s[1024]; snprintf(s, 1024, "%d %d.%d.%d.%d", - rr->preference, - (rr->locator32 >> 24) & 0xff, - (rr->locator32 >> 16) & 0xff, - (rr->locator32 >> 8) & 0xff, - (rr->locator32 >> 0) & 0xff); + rr->preference, + (rr->locator32 >> 24) & 0xff, + (rr->locator32 >> 16) & 0xff, + (rr->locator32 >> 8) & 0xff, + (rr->locator32 >> 0) & 0xff); return quickstrdup_temp(s); } static struct binary_data l32_wirerdata(struct rr *rrv) { - RRCAST(l32); + RRCAST(l32); return compose_binary_data("24", 1, rr->preference, rr->locator32); } diff -Naur validns-0.8/l64.c validns/l64.c --- validns-0.8/l64.c 2014-02-11 15:46:18.000000000 -0500 +++ validns/l64.c 2020-10-05 16:59:29.354681360 -0400 @@ -19,39 +19,39 @@ static struct rr *l64_parse(char *name, long ttl, int type, char *s) { - struct rr_l64 *rr = getmem(sizeof(*rr)); - int preference; + struct rr_l64 *rr = getmem(sizeof(*rr)); + int preference; - rr->preference = preference = extract_integer(&s, "L64 preference"); - if (preference < 0) - return NULL; - if (extract_u64(&s, "Locator64", &rr->locator64) < 0) - return NULL; - - if (*s) { - return bitch("garbage after valid L64 data"); - } + rr->preference = preference = extract_integer(&s, "L64 preference", NULL); + if (preference < 0) + return NULL; + if (extract_u64(&s, "Locator64", &rr->locator64) < 0) + return NULL; + + if (*s) { + return bitch("garbage after valid L64 data"); + } - return store_record(type, name, ttl, rr); + return store_record(type, name, ttl, rr); } static char* l64_human(struct rr *rrv) { - RRCAST(l64); + RRCAST(l64); char s[1024]; snprintf(s, 1024, "%d %x:%x:%x:%x", - rr->preference, - (unsigned)(rr->locator64 >> 48) & 0xffff, - (unsigned)(rr->locator64 >> 32) & 0xffff, - (unsigned)(rr->locator64 >> 16) & 0xffff, - (unsigned)(rr->locator64 >> 0) & 0xffff); + rr->preference, + (unsigned)(rr->locator64 >> 48) & 0xffff, + (unsigned)(rr->locator64 >> 32) & 0xffff, + (unsigned)(rr->locator64 >> 16) & 0xffff, + (unsigned)(rr->locator64 >> 0) & 0xffff); return quickstrdup_temp(s); } static struct binary_data l64_wirerdata(struct rr *rrv) { - RRCAST(l64); + RRCAST(l64); return compose_binary_data("28", 1, rr->preference, rr->locator64); } diff -Naur validns-0.8/loc.c validns/loc.c --- validns-0.8/loc.c 2014-02-11 15:45:16.000000000 -0500 +++ validns/loc.c 2020-10-05 16:59:29.354681360 -0400 @@ -21,161 +21,161 @@ static uint8_t double2loc_format(double val) { - if (val > 1000000000) { - return (((uint8_t)(val / 1000000000)) << 4) | 9; - } else if (val > 100000000) { - return (((uint8_t)(val / 100000000)) << 4) | 8; - } else if (val > 10000000) { - return (((uint8_t)(val / 10000000)) << 4) | 7; - } else if (val > 1000000) { - return (((uint8_t)(val / 1000000)) << 4) | 6; - } else if (val > 100000) { - return (((uint8_t)(val / 100000)) << 4) | 5; - } else if (val > 10000) { - return (((uint8_t)(val / 10000)) << 4) | 4; - } else if (val > 1000) { - return (((uint8_t)(val / 1000)) << 4) | 3; - } else if (val > 100) { - return (((uint8_t)(val / 100)) << 4) | 2; - } else if (val > 10) { - return (((uint8_t)(val / 10)) << 4) | 1; - } else { - return (((uint8_t)(val)) << 4); - } + if (val > 1000000000) { + return (((uint8_t)(val / 1000000000)) << 4) | 9; + } else if (val > 100000000) { + return (((uint8_t)(val / 100000000)) << 4) | 8; + } else if (val > 10000000) { + return (((uint8_t)(val / 10000000)) << 4) | 7; + } else if (val > 1000000) { + return (((uint8_t)(val / 1000000)) << 4) | 6; + } else if (val > 100000) { + return (((uint8_t)(val / 100000)) << 4) | 5; + } else if (val > 10000) { + return (((uint8_t)(val / 10000)) << 4) | 4; + } else if (val > 1000) { + return (((uint8_t)(val / 1000)) << 4) | 3; + } else if (val > 100) { + return (((uint8_t)(val / 100)) << 4) | 2; + } else if (val > 10) { + return (((uint8_t)(val / 10)) << 4) | 1; + } else { + return (((uint8_t)(val)) << 4); + } } static struct rr *loc_parse(char *name, long ttl, int type, char *s) { - struct rr_loc *rr = getmem(sizeof(*rr)); - long long i; - int deg; - int min; - double sec, val; - - rr->version = 0; - - /* latitude block */ - i = extract_integer(&s, "degrees latitude"); - if (i < 0) - return NULL; - if (i > 90) - return bitch("degrees latitude not in the range 0..90"); - deg = i; - min = 0; - sec = 0; - if (isdigit(*s)) { - i = extract_integer(&s, "minutes latitude"); - if (i < 0) - return NULL; - if (i > 59) - return bitch("minutes latitude not in the range 0..59"); - min = i; - - if (isdigit(*s)) { /* restricted floating point, starting with a digit */ - if (extract_double(&s, "seconds latitude", &sec, 0) < 0) - return NULL; - if (sec < 0 || sec > 59.999) - return bitch("seconds latitude not in the range 0..59.999"); - } - } - rr->latitude = sec*1000 + .5 + min*1000*60 + deg*1000*60*60; - if (*s == 'n' || *s == 'N') { - s++; - rr->latitude = 2147483648u + rr->latitude; - } else if (*s == 's' || *s == 'S') { - s++; - rr->latitude = 2147483648u - rr->latitude; - } else { - return bitch("latitude: N or S is expected"); - } - if (*s && !isspace(*s) && *s != ';' && *s != ')') { - return bitch("latitude: N or S is expected"); - } - s = skip_white_space(s); - if (!s) return NULL; - - /* longitude block */ - i = extract_integer(&s, "degrees longitude"); - if (i < 0) - return NULL; - if (i > 180) - return bitch("degrees longitude not in the range 0..90"); - deg = i; - min = 0; - sec = 0; - if (isdigit(*s)) { - i = extract_integer(&s, "minutes longitude"); - if (i < 0) - return NULL; - if (i > 59) - return bitch("minutes longitude not in the range 0..59"); - min = i; - - if (isdigit(*s)) { /* restricted floating point, starting with a digit */ - if (extract_double(&s, "seconds longitude", &sec, 0) < 0) - return NULL; - if (sec < 0 || sec > 59.999) - return bitch("seconds longitude not in the range 0..59.999"); - } - } - rr->longitude = sec*1000 + .5 + min*1000*60 + deg*1000*60*60; - if (*s == 'e' || *s == 'E') { - s++; - rr->longitude = 2147483648u + rr->longitude; - } else if (*s == 'w' || *s == 'W') { - s++; - rr->longitude = 2147483648u - rr->longitude; - } else { - return bitch("longitude: E or W is expected"); - } - if (*s && !isspace(*s) && *s != ';' && *s != ')') { - return bitch("longitude: E or W is expected"); - } - s = skip_white_space(s); - if (!s) return NULL; - - if (extract_double(&s, "altitude", &val, 1) < 0) - return NULL; - if (val < -100000.00 || val > 42849672.95) - return bitch("altitude is out of supported range"); - rr->altitude = (val + 100000.00) * 100 + 0.5; - - if (*s) { - if (extract_double(&s, "sphere size", &val, 1) < 0) - return NULL; - if (val < 0 || val > 90000000.00) - return bitch("sphere size is out of supported range"); - rr->size = double2loc_format(val * 100 + 0.5); - - if (*s) { - if (extract_double(&s, "horizontal precision", &val, 1) < 0) - return NULL; - if (val < 0 || val > 90000000.00) - return bitch("horizontal precision is out of supported range"); - rr->horiz_pre = double2loc_format(val * 100 + 0.5); - - if (*s) { - if (extract_double(&s, "vertical precision", &val, 1) < 0) - return NULL; - if (val < 0 || val > 90000000.00) - return bitch("vertical precision is out of supported range"); - rr->vert_pre = double2loc_format(val * 100 + 0.5); - } else { - rr->vert_pre = double2loc_format(10 * 100 + 0.5); - } - } else { - rr->horiz_pre = double2loc_format(10000 * 100 + 0.5); - } - } else { - rr->size = double2loc_format(1 * 100 + 0.5); - } - - if (*s) { - return bitch("garbage after valid LOC data"); - } + struct rr_loc *rr = getmem(sizeof(*rr)); + long long i; + int deg; + int min; + double sec, val; + + rr->version = 0; + + /* latitude block */ + i = extract_integer(&s, "degrees latitude", NULL); + if (i < 0) + return NULL; + if (i > 90) + return bitch("degrees latitude not in the range 0..90"); + deg = i; + min = 0; + sec = 0; + if (isdigit(*s)) { + i = extract_integer(&s, "minutes latitude", NULL); + if (i < 0) + return NULL; + if (i > 59) + return bitch("minutes latitude not in the range 0..59"); + min = i; + + if (isdigit(*s)) { /* restricted floating point, starting with a digit */ + if (extract_double(&s, "seconds latitude", &sec, 0) < 0) + return NULL; + if (sec < 0 || sec > 59.999) + return bitch("seconds latitude not in the range 0..59.999"); + } + } + rr->latitude = sec*1000 + .5 + min*1000*60 + deg*1000*60*60; + if (*s == 'n' || *s == 'N') { + s++; + rr->latitude = 2147483648u + rr->latitude; + } else if (*s == 's' || *s == 'S') { + s++; + rr->latitude = 2147483648u - rr->latitude; + } else { + return bitch("latitude: N or S is expected"); + } + if (*s && !isspace(*s) && *s != ';' && *s != ')') { + return bitch("latitude: N or S is expected"); + } + s = skip_white_space(s); + if (!s) return NULL; + + /* longitude block */ + i = extract_integer(&s, "degrees longitude", NULL); + if (i < 0) + return NULL; + if (i > 180) + return bitch("degrees longitude not in the range 0..90"); + deg = i; + min = 0; + sec = 0; + if (isdigit(*s)) { + i = extract_integer(&s, "minutes longitude", NULL); + if (i < 0) + return NULL; + if (i > 59) + return bitch("minutes longitude not in the range 0..59"); + min = i; + + if (isdigit(*s)) { /* restricted floating point, starting with a digit */ + if (extract_double(&s, "seconds longitude", &sec, 0) < 0) + return NULL; + if (sec < 0 || sec > 59.999) + return bitch("seconds longitude not in the range 0..59.999"); + } + } + rr->longitude = sec*1000 + .5 + min*1000*60 + deg*1000*60*60; + if (*s == 'e' || *s == 'E') { + s++; + rr->longitude = 2147483648u + rr->longitude; + } else if (*s == 'w' || *s == 'W') { + s++; + rr->longitude = 2147483648u - rr->longitude; + } else { + return bitch("longitude: E or W is expected"); + } + if (*s && !isspace(*s) && *s != ';' && *s != ')') { + return bitch("longitude: E or W is expected"); + } + s = skip_white_space(s); + if (!s) return NULL; + + if (extract_double(&s, "altitude", &val, 1) < 0) + return NULL; + if (val < -100000.00 || val > 42849672.95) + return bitch("altitude is out of supported range"); + rr->altitude = (val + 100000.00) * 100 + 0.5; + + if (*s) { + if (extract_double(&s, "sphere size", &val, 1) < 0) + return NULL; + if (val < 0 || val > 90000000.00) + return bitch("sphere size is out of supported range"); + rr->size = double2loc_format(val * 100 + 0.5); + + if (*s) { + if (extract_double(&s, "horizontal precision", &val, 1) < 0) + return NULL; + if (val < 0 || val > 90000000.00) + return bitch("horizontal precision is out of supported range"); + rr->horiz_pre = double2loc_format(val * 100 + 0.5); + + if (*s) { + if (extract_double(&s, "vertical precision", &val, 1) < 0) + return NULL; + if (val < 0 || val > 90000000.00) + return bitch("vertical precision is out of supported range"); + rr->vert_pre = double2loc_format(val * 100 + 0.5); + } else { + rr->vert_pre = double2loc_format(10 * 100 + 0.5); + } + } else { + rr->horiz_pre = double2loc_format(10000 * 100 + 0.5); + } + } else { + rr->size = double2loc_format(1 * 100 + 0.5); + } + + if (*s) { + return bitch("garbage after valid LOC data"); + } - return store_record(type, name, ttl, rr); + return store_record(type, name, ttl, rr); } static char* loc_human(struct rr *rrv) @@ -185,17 +185,17 @@ // snprintf(s, 1024, "\"%s\" \"%s\"", rr->cpu.data, rr->os.data); // return quickstrdup_temp(s); - return "meow"; + return "meow"; } static struct binary_data loc_wirerdata(struct rr *rrv) { - RRCAST(loc); + RRCAST(loc); return compose_binary_data("1111444", 1, - rr->version, rr->size, - rr->horiz_pre, rr->vert_pre, - rr->latitude, rr->longitude, rr->altitude); + rr->version, rr->size, + rr->horiz_pre, rr->vert_pre, + rr->latitude, rr->longitude, rr->altitude); } struct rr_methods loc_methods = { loc_parse, loc_human, loc_wirerdata, NULL, NULL }; diff -Naur validns-0.8/lp.c validns/lp.c --- validns-0.8/lp.c 2014-02-11 15:45:55.000000000 -0500 +++ validns/lp.c 2020-10-05 16:59:29.354681360 -0400 @@ -20,41 +20,41 @@ static struct rr *lp_parse(char *name, long ttl, int type, char *s) { - struct rr_lp *rr = getmem(sizeof(*rr)); - int preference; + struct rr_lp *rr = getmem(sizeof(*rr)); + int preference; - rr->preference = preference = extract_integer(&s, "LP preference"); - if (preference < 0) - return NULL; - rr->fqdn = extract_name(&s, "LP fqdn", 0); - if (!rr->fqdn) - return NULL; - if (strcasecmp(name, rr->fqdn) == 0) { - return bitch("LP points to itself"); - } - - if (*s) { - return bitch("garbage after valid LP data"); - } + rr->preference = preference = extract_integer(&s, "LP preference", NULL); + if (preference < 0) + return NULL; + rr->fqdn = extract_name(&s, "LP fqdn", 0); + if (!rr->fqdn) + return NULL; + if (strcasecmp(name, rr->fqdn) == 0) { + return bitch("LP points to itself"); + } + + if (*s) { + return bitch("garbage after valid LP data"); + } - return store_record(type, name, ttl, rr); + return store_record(type, name, ttl, rr); } static char* lp_human(struct rr *rrv) { - RRCAST(lp); - char s[1024]; + RRCAST(lp); + char s[1024]; - snprintf(s, 1024, "%d %s", - rr->preference, rr->fqdn); - return quickstrdup_temp(s); + snprintf(s, 1024, "%d %s", + rr->preference, rr->fqdn); + return quickstrdup_temp(s); } static struct binary_data lp_wirerdata(struct rr *rrv) { - RRCAST(lp); + RRCAST(lp); return compose_binary_data("2d", 1, - rr->preference, name2wire_name(rr->fqdn)); + rr->preference, name2wire_name(rr->fqdn)); } struct rr_methods lp_methods = { lp_parse, lp_human, lp_wirerdata, NULL, NULL }; diff -Naur validns-0.8/main.c validns/main.c --- validns-0.8/main.c 2020-10-05 16:54:14.347790456 -0400 +++ validns/main.c 2020-10-05 16:59:29.354681360 -0400 @@ -17,6 +17,7 @@ #include #include #include +#include #include "common.h" #include "carp.h" @@ -27,418 +28,631 @@ struct globals G; struct file_info *file_info = NULL; -int -read_zone_file(void); +int read_zone_file(void); +void open_zone_file(char *fname); + +static void +concat_generate_template(char *buf, int bufsz, int val, struct generate_template_piece *t) +{ + char sval[40]; + + while (t) { + if (t->constant_string) { + mystrlcat(buf, t->constant_string, bufsz); + } else { + snprintf(sval, 40, "%d", val); + mystrlcat(buf, sval, bufsz); + } + t = t->next; + } +} + +static struct generate_template_piece * +free_generate_template(struct generate_template_piece *t) +{ + struct generate_template_piece *n; + while (t) { + n = t->next; + free(t); + t = n; + } + return NULL; +} + +static void +create_generate_template_piece(struct generate_template_piece **generate_template, char *s) +{ + if (s && *s == 0) + return; + + struct generate_template_piece *p = malloc(sizeof(struct generate_template_piece)); + + p->constant_string = s; + p->next = NULL; + + if (*generate_template) { + struct generate_template_piece *t = *generate_template; + while (t->next) + t = t->next; + t->next = p; + } else { + *generate_template = p; + } +} + +static struct generate_template_piece * +prepare_generate_template(char *t) +{ + char *s = t; + struct generate_template_piece *r = NULL; + + while (1) { + while (*t && *t != '$') t++; + if (!*t) { + create_generate_template_piece(&r, s); + break; + } else { + *t = 0; + create_generate_template_piece(&r, s); + create_generate_template_piece(&r, NULL); + t++; + s = t; + } + } + + return r; +} static char *process_directive(char *s) { - char *d = s+1; - if (*(s+1) == 'O' && strncmp(s, "$ORIGIN", 7) == 0) { - char *o; - s += 7; - if (!isspace(*s)) { - if (isalnum(*s)) goto unrecognized_directive; - return bitch("bad $ORIGIN format"); - } - s = skip_white_space(s); - o = extract_name(&s, "$ORIGIN value", 0); - if (!o) { - return NULL; - } - if (*s) { - return bitch("garbage after valid $ORIGIN directive"); - } - G.opt.current_origin = o; - if (G.opt.verbose) { - fprintf(stderr, "-> %s:%d: ", file_info->name, file_info->line); - fprintf(stderr, "origin is now %s\n", o); - } - } else if (*(s+1) == 'T' && strncmp(s, "$TTL", 4) == 0) { - s += 4; - if (!isspace(*s)) { - if (isalnum(*s)) goto unrecognized_directive; - return bitch("bad $TTL format"); - } - s = skip_white_space(s); - G.default_ttl = extract_timevalue(&s, "$TTL value"); - if (G.default_ttl < 0) { - return NULL; - } - if (*s) { - return bitch("garbage after valid $TTL directive"); - } - if (G.opt.verbose) { - fprintf(stderr, "-> %s:%d: ", file_info->name, file_info->line); - fprintf(stderr, "default ttl is now %ld\n", G.default_ttl); - } - } else if (*(s+1) == 'I' && strncmp(s, "$INCLUDE", 8) == 0) { - s += 8; - if (!isspace(*s)) { - if (isalnum(*s)) goto unrecognized_directive; - return bitch("bad $INCLUDE format"); - } - s = skip_white_space(s); - return bitch("XXX include support is not implemented"); - } else { + char *d = s+1; + if (*(s+1) == 'O' && strncmp(s, "$ORIGIN", 7) == 0) { + char *o; + s += 7; + if (!isspace(*s)) { + if (isalnum(*s)) goto unrecognized_directive; + return bitch("bad $ORIGIN format"); + } + s = skip_white_space(s); + o = extract_name(&s, "$ORIGIN value", 0); + if (!o) { + return NULL; + } + if (*s) { + return bitch("garbage after valid $ORIGIN directive"); + } + file_info->current_origin = o; + if (G.opt.verbose) { + fprintf(stderr, "-> %s:%d: ", file_info->name, file_info->line); + fprintf(stderr, "origin is now %s\n", o); + } + } else if (*(s+1) == 'T' && strncmp(s, "$TTL", 4) == 0) { + s += 4; + if (!isspace(*s)) { + if (isalnum(*s)) goto unrecognized_directive; + return bitch("bad $TTL format"); + } + s = skip_white_space(s); + G.default_ttl = extract_timevalue(&s, "$TTL value"); + if (G.default_ttl < 0) { + return NULL; + } + if (*s) { + return bitch("garbage after valid $TTL directive"); + } + if (G.opt.verbose) { + fprintf(stderr, "-> %s:%d: ", file_info->name, file_info->line); + fprintf(stderr, "default ttl is now %ld\n", G.default_ttl); + } + } else if (*(s+1) == 'G' && strncmp(s, "$GENERATE", 9) == 0) { + int from, to; + char *lhs, *rdtype; + + s += 9; + if (!isspace(*s)) { + if (isalnum(*s)) goto unrecognized_directive; + return bitch("bad $GENERATE format"); + } + s = skip_white_space(s); + + from = extract_integer(&s, "generate-from", "-"); + if (from < 0) + return NULL; + if (*s != '-') + return bitch("'-' between generate-from and generate-to is expected"); + s++; + to = extract_integer(&s, "generate-to", "-"); + if (to < 0) + return NULL; + + if (*s == '/') + return bitch("generate-step is unsupported for now"); + + lhs = extract_name(&s, "generate-lhs", KEEP_CAPITALIZATION | DOLLAR_OK_IN_NAMES); + if (!lhs) + return NULL; + + if (*s == '{') + return bitch("{offset,width,type} is unsupported for now"); + + rdtype = extract_label(&s, "type", NULL); + if (!rdtype) + return NULL; + + file_info->generate_cur = from; + file_info->generate_lim = to; + file_info->generate_type = rdtype; + file_info->generate_lhs = prepare_generate_template(lhs); + file_info->generate_rhs = prepare_generate_template(quickstrdup(s)); + + return s; + } else if (*(s+1) == 'I' && strncmp(s, "$INCLUDE", 8) == 0) { + char *p, *f; + char c; + s += 8; + if (!isspace(*s)) { + if (isalnum(*s)) goto unrecognized_directive; + return bitch("bad $INCLUDE format"); + } + s = skip_white_space(s); + p = s; + while (*s && !isspace(*s) && *s != ';') + s++; + c = *s; + *s = '\0'; + if (!*p) { + return bitch("$INCLUDE directive with empty file name"); + } + f = quickstrdup_temp(p); + *s = c; + s = skip_white_space(s); + + if (*s) { + return bitch("garbage after valid $INCLUDE directive"); + } + if (*f == '/') { + open_zone_file(f); + } else { + char buf[1024]; + + snprintf(buf, 1024, "%s/%s", G.opt.include_path, f); + open_zone_file(buf); + } + } else { unrecognized_directive: - s = d-1; - while (isalnum(*d)) d++; - *d = '\0'; - return bitch("unrecognized directive: %s", s); - } - return s; + s = d-1; + while (isalnum(*d)) d++; + *d = '\0'; + return bitch("unrecognized directive: %s", s); + } + return s; +} + +char * +read_zone_line(void) +{ + char *r; + + if (file_info->generate_lhs) { + if (file_info->generate_cur <= file_info->generate_lim) { + file_info->buf[0] = 0; + concat_generate_template(file_info->buf, LINEBUFSZ, file_info->generate_cur, file_info->generate_lhs); + mystrlcat(file_info->buf, " ", LINEBUFSZ); + mystrlcat(file_info->buf, file_info->generate_type, LINEBUFSZ); + mystrlcat(file_info->buf, " ", LINEBUFSZ); + concat_generate_template(file_info->buf, LINEBUFSZ, file_info->generate_cur, file_info->generate_rhs); + file_info->generate_cur++; + return file_info->buf; + } else { + /* Done with this $GENERATE */ + file_info->generate_cur = 0; + file_info->generate_lim = 0; + file_info->generate_type = NULL; + file_info->generate_lhs = NULL; + free_generate_template(file_info->generate_lhs); + free_generate_template(file_info->generate_rhs); + file_info->generate_rhs = NULL; + } + } + + r = fgets(file_info->buf, LINEBUFSZ, file_info->file); + if (r) + file_info->line++; + return r; } int read_zone_file(void) { - char *s; - char *name = NULL, *class, *rdtype; - long ttl = -1; - while (file_info) { - while (fgets(file_info->buf, 2048, file_info->file)) { - freeall_temp(); - file_info->line++; - file_info->paren_mode = 0; - rdtype = NULL; - if (empty_line_or_comment(file_info->buf)) - continue; - - s = file_info->buf; - if (!isspace(*s)) { - /* , $INCLUDE, $ORIGIN */ - if (*s == '$') { - process_directive(s); - continue; - } else { - /* */ - name = extract_name(&s, "record name", 0); - if (!name) - continue; - } - } else { - s = skip_white_space(s); - } - if (!s) - continue; - if (!name) { - bitch("cannot assume previous name for it is not known"); - continue; - } - if (G.default_ttl >= 0) - ttl = G.default_ttl; - if (isdigit(*s)) { - ttl = extract_timevalue(&s, "TTL"); - if (ttl < 0) - continue; - class = extract_label(&s, "class or type", "temporary"); - if (!class) - continue; - if (*class == 'i' && *(class+1) == 'n' && *(class+2) == 0) { - } else if (*class == 'c' && *(class+1) == 's' && *(class+2) == 0) { - bitch("CSNET class is not supported"); - continue; - } else if (*class == 'c' && *(class+1) == 'h' && *(class+2) == 0) { - bitch("CHAOS class is not supported"); - continue; - } else if (*class == 'h' && *(class+1) == 's' && *(class+2) == 0) { - bitch("HESIOD class is not supported"); - continue; - } else { - rdtype = class; - } - } else { - class = extract_label(&s, "class or type", "temporary"); - if (!class) - continue; - if (*class == 'i' && *(class+1) == 'n' && *(class+2) == 0) { - if (isdigit(*s)) { - ttl = extract_timevalue(&s, "TTL"); - if (ttl < 0) - continue; - } - } else if (*class == 'c' && *(class+1) == 's' && *(class+2) == 0) { - bitch("CSNET class is not supported"); - continue; - } else if (*class == 'c' && *(class+1) == 'h' && *(class+2) == 0) { - bitch("CHAOS class is not supported"); - continue; - } else if (*class == 'h' && *(class+1) == 's' && *(class+2) == 0) { - bitch("HESIOD class is not supported"); - continue; - } else { - rdtype = class; - } - } - if (!rdtype) { - rdtype = extract_label(&s, "type", "temporary"); - } - if (!rdtype) { - continue; - } - if (ttl < 0) { - ttl = G.default_ttl; - } - if (ttl < 0) { - bitch("ttl not specified and default is not known"); - continue; - } - - { - int is_generic; - int type = str2rdtype(rdtype, &is_generic); - if (type <= 0) continue; - if (is_generic) - rr_parse_any(name, ttl, type, s); - else if (type > T_MAX) - rr_parse_any(name, ttl, type, s); - else if (rr_methods[type].rr_parse) - rr_methods[type].rr_parse(name, ttl, type, s); - else - rr_parse_any(name, ttl, type, s); - } - } - if (ferror(file_info->file)) - croak(1, "read error for %s", file_info->name); - file_info = file_info->next; - } - return 0; + char *s; + char *name = NULL, *class, *rdtype; + long ttl = -1; + while (file_info) { + while (read_zone_line()) { + freeall_temp(); + file_info->paren_mode = 0; + rdtype = NULL; + if (empty_line_or_comment(file_info->buf)) + continue; + + s = file_info->buf; + if (!isspace(*s)) { + /* , $INCLUDE, $ORIGIN */ + if (*s == '$') { + process_directive(s); + continue; + } else { + /* */ + name = extract_name(&s, "record name", 0); + if (!name) + continue; + } + } else { + s = skip_white_space(s); + } + if (!s) + continue; + if (!name) { + bitch("cannot assume previous name for it is not known"); + continue; + } + if (G.default_ttl >= 0) + ttl = G.default_ttl; + if (isdigit(*s)) { + ttl = extract_timevalue(&s, "TTL"); + if (ttl < 0) + continue; + class = extract_label(&s, "class or type", "temporary"); + if (!class) + continue; + if (*class == 'i' && *(class+1) == 'n' && *(class+2) == 0) { + } else if (*class == 'c' && *(class+1) == 's' && *(class+2) == 0) { + bitch("CSNET class is not supported"); + continue; + } else if (*class == 'c' && *(class+1) == 'h' && *(class+2) == 0) { + bitch("CHAOS class is not supported"); + continue; + } else if (*class == 'h' && *(class+1) == 's' && *(class+2) == 0) { + bitch("HESIOD class is not supported"); + continue; + } else { + rdtype = class; + } + } else { + class = extract_label(&s, "class or type", "temporary"); + if (!class) + continue; + if (*class == 'i' && *(class+1) == 'n' && *(class+2) == 0) { + if (isdigit(*s)) { + ttl = extract_timevalue(&s, "TTL"); + if (ttl < 0) + continue; + } + } else if (*class == 'c' && *(class+1) == 's' && *(class+2) == 0) { + bitch("CSNET class is not supported"); + continue; + } else if (*class == 'c' && *(class+1) == 'h' && *(class+2) == 0) { + bitch("CHAOS class is not supported"); + continue; + } else if (*class == 'h' && *(class+1) == 's' && *(class+2) == 0) { + bitch("HESIOD class is not supported"); + continue; + } else { + rdtype = class; + } + } + if (!rdtype) { + rdtype = extract_label(&s, "type", "temporary"); + } + if (!rdtype) { + continue; + } + if (ttl < 0) { + ttl = G.default_ttl; + } + + { + int is_generic; + int type = str2rdtype(rdtype, &is_generic); + struct rr *rr; + + if (type <= 0) continue; + + if (ttl < 0 && !(G.opt.soa_minttl_as_default_ttl && type == T_SOA)) { + bitch("ttl not specified and default is not known"); + continue; + } + + if (is_generic) + rr = rr_parse_any(name, ttl, type, s); + else if (type > T_MAX) + rr = rr_parse_any(name, ttl, type, s); + else if (rr_methods[type].rr_parse) + rr = rr_methods[type].rr_parse(name, ttl, type, s); + else + rr = rr_parse_any(name, ttl, type, s); + + if (type == T_SOA && ttl < 0 && rr) { + struct rr_soa *soa = (struct rr_soa *) rr; + soa->rr.ttl = G.default_ttl = soa->minimum; + if (G.opt.verbose) { + fprintf(stderr, "-> %s:%d: ", file_info->name, file_info->line); + fprintf(stderr, "no ttl specified; using SOA MINTTL (%ld) instead\n", G.default_ttl); + } + } + } + } + if (ferror(file_info->file)) + croak(1, "read error for %s", file_info->name); + file_info = file_info->next; + } + return 0; } void open_zone_file(char *fname) { - FILE *f; - struct file_info *new_file_info; + FILE *f; + struct file_info *new_file_info; - if (strcmp(fname, "-") == 0) { - f = stdin; - fname = "stdin"; - } else { - f = fopen(fname, "r"); - } - if (!f) - croak(1, "open %s", fname); - new_file_info = malloc(sizeof(*new_file_info) + strlen(fname) + 1); - if (!new_file_info) - croak(1, "malloc(file_info), %s", fname); - new_file_info->next = file_info; - new_file_info->file = f; - new_file_info->line = 0; - strcpy(new_file_info->name, fname); - file_info = new_file_info; + if (strcmp(fname, "-") == 0) { + f = stdin; + fname = "stdin"; + } else { + f = fopen(fname, "r"); + if (!file_info && !G.opt.include_path_specified) { + G.opt.include_path = quickstrdup(dirname(quickstrdup_temp(fname))); + } + } + if (!f) + croak(1, "open %s", fname); + new_file_info = malloc(sizeof(*new_file_info) + strlen(fname) + 1); + if (!new_file_info) + croak(1, "malloc(file_info), %s", fname); + new_file_info->next = file_info; + new_file_info->file = f; + new_file_info->line = 0; + strcpy(new_file_info->name, fname); + if (file_info) { + new_file_info->current_origin = file_info->current_origin; + } else { + new_file_info->current_origin = G.opt.first_origin; + } + file_info = new_file_info; } void usage(char *err) { - if (err) - fprintf(stderr, "%s\n", err); - fprintf(stderr, "Usage:\n"); - fprintf(stderr, " %s -h\n", thisprogname()); - fprintf(stderr, " %s [options] zone-file\n", thisprogname()); - fprintf(stderr, "Usage parameters:\n"); - fprintf(stderr, "\t-h\t\tproduce usage text and quit\n"); - fprintf(stderr, "\t-f\t\tquit on first validation error\n"); - - fprintf(stderr, "\t-p name\tperform policy check \n"); - fprintf(stderr, "\t\t\tsingle-ns\n"); - fprintf(stderr, "\t\t\tcname-other-data\n"); - fprintf(stderr, "\t\t\tdname\n"); - fprintf(stderr, "\t\t\tnsec3param-not-apex\n"); - fprintf(stderr, "\t\t\tmx-alias\n"); - fprintf(stderr, "\t\t\tns-alias\n"); - fprintf(stderr, "\t\t\trp-txt-exists\n"); - fprintf(stderr, "\t\t\tall\n"); - - fprintf(stderr, "\t-n N\t\tuse N worker threads\n"); - fprintf(stderr, "\t-q\t\tquiet - do not produce any output\n"); - fprintf(stderr, "\t-s\t\tprint validation summary/stats\n"); - fprintf(stderr, "\t-x\t\tskip printing 'time taken' entry in summary/stats\n"); - fprintf(stderr, "\t-v\t\tbe extra verbose\n"); - fprintf(stderr, "\t-I path\tuse this path for $INCLUDE files\n"); - fprintf(stderr, "\t-z origin\tuse this origin as initial $ORIGIN\n"); - fprintf(stderr, "\t-t epoch-time\tuse this time instead of \"now\"\n"); - exit(1); + if (err) + fprintf(stderr, "%s\n", err); + fprintf(stderr, "Usage:\n"); + fprintf(stderr, " %s -h\n", thisprogname()); + fprintf(stderr, " %s [options] zone-file\n", thisprogname()); + fprintf(stderr, "Usage parameters:\n"); + fprintf(stderr, "\t-h\t\tproduce usage text and quit\n"); + fprintf(stderr, "\t-f\t\tquit on first validation error\n"); + + fprintf(stderr, "\t-p name\tperform policy check \n"); + fprintf(stderr, "\t\t\tsingle-ns\n"); + fprintf(stderr, "\t\t\tcname-other-data\n"); + fprintf(stderr, "\t\t\tdname\n"); + fprintf(stderr, "\t\t\tnsec3param-not-apex\n"); + fprintf(stderr, "\t\t\tmx-alias\n"); + fprintf(stderr, "\t\t\tns-alias\n"); + fprintf(stderr, "\t\t\trp-txt-exists\n"); + fprintf(stderr, "\t\t\ttlsa-host\n"); + fprintf(stderr, "\t\t\tksk-exists\n"); + fprintf(stderr, "\t\t\tsmimea-host\n"); + fprintf(stderr, "\t\t\tall\n"); + + fprintf(stderr, "\t-n N\t\tuse N worker threads\n"); + fprintf(stderr, "\t-q\t\tquiet - do not produce any output\n"); + fprintf(stderr, "\t-s\t\tprint validation summary/stats\n"); + fprintf(stderr, "\t-v\t\tbe extra verbose\n"); + fprintf(stderr, "\t-I path\tuse this path for $INCLUDE files\n"); + fprintf(stderr, "\t-z origin\tuse this origin as initial $ORIGIN\n"); + fprintf(stderr, "\t-t epoch-time\tuse this time instead of \"now\"\n"); + exit(1); } struct rr_methods rr_methods[T_MAX+1]; static void initialize_globals(void) { - int i; + int i; - setenv("TZ", "GMT0", 1); tzset(); - memset(&G, 0, sizeof(G)); - memset(&G.opt, 0, sizeof(G.opt)); - memset(&G.stats, 0, sizeof(G.stats)); - G.default_ttl = -1; /* XXX orly? */ - G.opt.times_to_check[0] = time(NULL); - G.opt.n_times_to_check = 0; - - for (i = 0; i <= T_MAX; i++) { - rr_methods[i] = unknown_methods; - } - rr_methods[T_AAAA] = aaaa_methods; - rr_methods[T_A] = a_methods; - rr_methods[T_AFSDB] = afsdb_methods; - rr_methods[T_CERT] = cert_methods; - rr_methods[T_CNAME] = cname_methods; - rr_methods[T_DHCID] = dhcid_methods; - rr_methods[T_DLV] = dlv_methods; - rr_methods[T_DNAME] = dname_methods; - rr_methods[T_DNSKEY] = dnskey_methods; - rr_methods[T_DS] = ds_methods; - rr_methods[T_HINFO] = hinfo_methods; - rr_methods[T_IPSECKEY] = ipseckey_methods; - rr_methods[T_ISDN] = isdn_methods; - rr_methods[T_KX] = kx_methods; - rr_methods[T_L32] = l32_methods; - rr_methods[T_L64] = l64_methods; - rr_methods[T_LOC] = loc_methods; - rr_methods[T_LP] = lp_methods; - rr_methods[T_MB] = mb_methods; - rr_methods[T_MG] = mg_methods; - rr_methods[T_MINFO] = minfo_methods; - rr_methods[T_MR] = mr_methods; - rr_methods[T_MX] = mx_methods; - rr_methods[T_NAPTR] = naptr_methods; - rr_methods[T_NID] = nid_methods; - rr_methods[T_NSAP] = nsap_methods; - rr_methods[T_NSEC3PARAM] = nsec3param_methods; - rr_methods[T_NSEC3] = nsec3_methods; - rr_methods[T_NSEC] = nsec_methods; - rr_methods[T_NS] = ns_methods; - rr_methods[T_PTR] = ptr_methods; - rr_methods[T_PX] = px_methods; - rr_methods[T_RP] = rp_methods; - rr_methods[T_RT] = rt_methods; - rr_methods[T_RRSIG] = rrsig_methods; - rr_methods[T_SOA] = soa_methods; - rr_methods[T_SPF] = spf_methods; - rr_methods[T_SRV] = srv_methods; - rr_methods[T_SSHFP] = sshfp_methods; - rr_methods[T_TLSA] = tlsa_methods; - rr_methods[T_TXT] = txt_methods; - rr_methods[T_X25] = x25_methods; + setenv("TZ", "GMT0", 1); tzset(); + memset(&G, 0, sizeof(G)); + memset(&G.opt, 0, sizeof(G.opt)); + memset(&G.stats, 0, sizeof(G.stats)); + memset(rr_counts, 0, sizeof(rr_counts[0])*(T_MAX+1)); + G.default_ttl = -1; /* XXX orly? */ + G.opt.times_to_check[0] = time(NULL); + G.opt.n_times_to_check = 0; + G.opt.include_path = "."; + + for (i = 0; i <= T_MAX; i++) { + rr_methods[i] = unknown_methods; + } + rr_methods[T_AAAA] = aaaa_methods; + rr_methods[T_A] = a_methods; + rr_methods[T_AFSDB] = afsdb_methods; + rr_methods[T_CAA] = caa_methods; + rr_methods[T_CDNSKEY] = cdnskey_methods; + rr_methods[T_CDS] = cds_methods; + rr_methods[T_CERT] = cert_methods; + rr_methods[T_CNAME] = cname_methods; + rr_methods[T_DHCID] = dhcid_methods; + rr_methods[T_DLV] = dlv_methods; + rr_methods[T_DNAME] = dname_methods; + rr_methods[T_DNSKEY] = dnskey_methods; + rr_methods[T_DS] = ds_methods; + rr_methods[T_HINFO] = hinfo_methods; + rr_methods[T_IPSECKEY] = ipseckey_methods; + rr_methods[T_ISDN] = isdn_methods; + rr_methods[T_KX] = kx_methods; + rr_methods[T_L32] = l32_methods; + rr_methods[T_L64] = l64_methods; + rr_methods[T_LOC] = loc_methods; + rr_methods[T_LP] = lp_methods; + rr_methods[T_MB] = mb_methods; + rr_methods[T_MG] = mg_methods; + rr_methods[T_MINFO] = minfo_methods; + rr_methods[T_MR] = mr_methods; + rr_methods[T_MX] = mx_methods; + rr_methods[T_NAPTR] = naptr_methods; + rr_methods[T_NID] = nid_methods; + rr_methods[T_NSAP] = nsap_methods; + rr_methods[T_NSEC3PARAM] = nsec3param_methods; + rr_methods[T_NSEC3] = nsec3_methods; + rr_methods[T_NSEC] = nsec_methods; + rr_methods[T_NS] = ns_methods; + rr_methods[T_PTR] = ptr_methods; + rr_methods[T_PX] = px_methods; + rr_methods[T_RP] = rp_methods; + rr_methods[T_RT] = rt_methods; + rr_methods[T_RRSIG] = rrsig_methods; + rr_methods[T_SMIMEA] = smimea_methods; + rr_methods[T_SOA] = soa_methods; + rr_methods[T_SPF] = spf_methods; + rr_methods[T_SRV] = srv_methods; + rr_methods[T_SSHFP] = sshfp_methods; + rr_methods[T_TLSA] = tlsa_methods; + rr_methods[T_TXT] = txt_methods; + rr_methods[T_X25] = x25_methods; } int main(int argc, char **argv) { - int o; - struct timeval start, stop; + int o; + struct timeval start, stop; - initialize_globals(); - while ((o = getopt(argc, argv, "fhqsxvI:z:t:p:n:")) != -1) { - switch(o) { - case 'h': - usage(NULL); - break; - case 'f': - G.opt.die_on_first_error = 1; - break; - case 'q': - G.opt.no_output = 1; - break; - case 's': - G.opt.summary = 1; - break; - case 'x': - G.opt.notiming = 1; - break; - case 'v': - G.opt.verbose = 1; - break; - case 'p': - if (strcmp(optarg, "all") == 0) { - int i; - for (i = 0; i < N_POLICY_CHECKS; i++) { - G.opt.policy_checks[i] = 1; - } - } else if (strcmp(optarg, "single-ns") == 0) { - G.opt.policy_checks[POLICY_SINGLE_NS] = 1; - } else if (strcmp(optarg, "cname-other-data") == 0) { - G.opt.policy_checks[POLICY_CNAME_OTHER_DATA] = 1; - } else if (strcmp(optarg, "dname") == 0) { - G.opt.policy_checks[POLICY_DNAME] = 1; - } else if (strcmp(optarg, "dnskey") == 0) { - G.opt.policy_checks[POLICY_DNSKEY] = 1; - } else if (strcmp(optarg, "nsec3param-not-apex") == 0) { - G.opt.policy_checks[POLICY_NSEC3PARAM_NOT_APEX] = 1; - } else if (strcmp(optarg, "mx-alias") == 0) { - G.opt.policy_checks[POLICY_MX_ALIAS] = 1; - } else if (strcmp(optarg, "ns-alias") == 0) { - G.opt.policy_checks[POLICY_NS_ALIAS] = 1; - } else if (strcmp(optarg, "rp-txt-exists") == 0) { - G.opt.policy_checks[POLICY_RP_TXT_EXISTS] = 1; - } else if (strcmp(optarg, "tlsa-host") == 0) { - G.opt.policy_checks[POLICY_TLSA_HOST] = 1; - } else { - usage("unknown policy name"); - } - break; - case 'I': - G.opt.include_path = optarg; - break; - case 'z': - if (strlen(optarg) && *(optarg+strlen(optarg)-1) == '.') { - G.opt.current_origin = optarg; - } else if (strlen(optarg)) { - G.opt.current_origin = getmem(strlen(optarg)+2); - strcpy(mystpcpy(G.opt.current_origin, optarg), "."); - } else { - usage("origin must not be empty"); - } - break; - case 'n': - G.opt.n_threads = strtol(optarg, NULL, 10); - if (G.opt.n_threads > 256) - usage("non-sensical number of threads requested"); - if (G.opt.verbose) - fprintf(stderr, "using %d worker threads\n", G.opt.n_threads); - break; - case 't': - if (G.opt.n_times_to_check >= MAX_TIMES_TO_CHECK) - usage("too many -t specified"); - G.opt.times_to_check[G.opt.n_times_to_check++] = strtol(optarg, NULL, 10); - break; - default: - usage(NULL); - } - } - if (G.opt.n_times_to_check <= 0) - G.opt.n_times_to_check = 1; - argc -= optind; - argv += optind; - if (argc != 1) - usage(NULL); - gettimeofday(&start, NULL); - open_zone_file(argv[0]); - read_zone_file(); - validate_zone(); - verify_all_keys(); - if (G.nsec3_present) { - if (first_nsec3) nsec3_validate(&first_nsec3->rr); - perform_remaining_nsec3checks(); - } - gettimeofday(&stop, NULL); - if (G.opt.summary) { - printf("records found: %d\n", G.stats.rr_count); - printf("skipped dups: %d\n", G.stats.skipped_dup_rr_count); - printf("record sets found: %d\n", G.stats.rrset_count); - printf("unique names found: %d\n", G.stats.names_count); - printf("delegations found: %d\n", G.stats.delegations); - printf(" nsec3 records: %d\n", G.stats.nsec3_count); - /* "not authoritative names" - non-empty terminals without any authoritative records */ - /* delegation points count as authoritative, which might or might not be correct */ - printf("not authoritative names, not counting delegation points:\n" - " %d\n", G.stats.not_authoritative); - printf("validation errors: %d\n", G.stats.error_count); - printf("signatures verified: %d\n", G.stats.signatures_verified); - if (!G.opt.notiming) { - printf("time taken: %.3fs\n", - stop.tv_sec - start.tv_sec + (stop.tv_usec - start.tv_usec)/1000000.); - } - } - return G.exit_code; + initialize_globals(); + while ((o = getopt(argc, argv, "fhMqsvI:z:t:p:n:")) != -1) { + switch(o) { + case 'h': + usage(NULL); + break; + case 'f': + G.opt.die_on_first_error = 1; + break; + case 'M': + G.opt.soa_minttl_as_default_ttl = 1; + break; + case 'q': + G.opt.no_output = 1; + break; + case 's': + G.opt.summary++; + break; + case 'v': + G.opt.verbose = 1; + break; + case 'p': + if (strcmp(optarg, "all") == 0) { + int i; + for (i = 0; i < N_POLICY_CHECKS; i++) { + G.opt.policy_checks[i] = 1; + } + } else if (strcmp(optarg, "single-ns") == 0) { + G.opt.policy_checks[POLICY_SINGLE_NS] = 1; + } else if (strcmp(optarg, "cname-other-data") == 0) { + G.opt.policy_checks[POLICY_CNAME_OTHER_DATA] = 1; + } else if (strcmp(optarg, "dname") == 0) { + G.opt.policy_checks[POLICY_DNAME] = 1; + } else if (strcmp(optarg, "dnskey") == 0) { + G.opt.policy_checks[POLICY_DNSKEY] = 1; + } else if (strcmp(optarg, "nsec3param-not-apex") == 0) { + G.opt.policy_checks[POLICY_NSEC3PARAM_NOT_APEX] = 1; + } else if (strcmp(optarg, "mx-alias") == 0) { + G.opt.policy_checks[POLICY_MX_ALIAS] = 1; + } else if (strcmp(optarg, "ns-alias") == 0) { + G.opt.policy_checks[POLICY_NS_ALIAS] = 1; + } else if (strcmp(optarg, "rp-txt-exists") == 0) { + G.opt.policy_checks[POLICY_RP_TXT_EXISTS] = 1; + } else if (strcmp(optarg, "tlsa-host") == 0) { + G.opt.policy_checks[POLICY_TLSA_HOST] = 1; + } else if (strcmp(optarg, "smimea-host") == 0) { + G.opt.policy_checks[POLICY_SMIMEA_HOST] = 1; + } else if (strcmp(optarg, "ksk-exists") == 0) { + G.opt.policy_checks[POLICY_KSK_EXISTS] = 1; + } else { + usage("unknown policy name"); + } + break; + case 'I': + G.opt.include_path = optarg; + G.opt.include_path_specified = 1; + break; + case 'z': + if (strlen(optarg) && *(optarg+strlen(optarg)-1) == '.') { + G.opt.first_origin = optarg; + } else if (strlen(optarg)) { + G.opt.first_origin = getmem(strlen(optarg)+2); + strcpy(mystpcpy(G.opt.first_origin, optarg), "."); + } else { + usage("origin must not be empty"); + } + break; + case 'n': + G.opt.n_threads = strtol(optarg, NULL, 10); + if (G.opt.n_threads > 256) + usage("non-sensical number of threads requested"); + if (G.opt.verbose) + fprintf(stderr, "using %d worker threads\n", G.opt.n_threads); + break; + case 't': + if (G.opt.n_times_to_check >= MAX_TIMES_TO_CHECK) + usage("too many -t specified"); + G.opt.times_to_check[G.opt.n_times_to_check++] = strtol(optarg, NULL, 10); + break; + default: + usage(NULL); + } + } + if (G.opt.n_times_to_check <= 0) + G.opt.n_times_to_check = 1; + argc -= optind; + argv += optind; + if (argc != 1) + usage(NULL); + gettimeofday(&start, NULL); + open_zone_file(argv[0]); + read_zone_file(); + validate_zone(); + verify_all_keys(); + if (G.nsec3_present) { + if (first_nsec3) nsec3_validate(&first_nsec3->rr); + perform_remaining_nsec3checks(); + } + if (G.dnssec_active && G.opt.policy_checks[POLICY_KSK_EXISTS]) { + dnskey_ksk_policy_check(); + } + gettimeofday(&stop, NULL); + if (G.opt.summary) { + printf("records found: %d\n", G.stats.rr_count); + printf("skipped dups: %d\n", G.stats.skipped_dup_rr_count); + printf("record sets found: %d\n", G.stats.rrset_count); + printf("unique names found: %d\n", G.stats.names_count); + printf("delegations found: %d\n", G.stats.delegations); + printf(" nsec3 records: %d\n", G.stats.nsec3_count); + /* "not authoritative names" - non-empty terminals without any authoritative records */ + /* delegation points count as authoritative, which might or might not be correct */ + printf("not authoritative names, not counting delegation points:\n" + " %d\n", G.stats.not_authoritative); + printf("validation errors: %d\n", G.stats.error_count); + printf("signatures verified: %d\n", G.stats.signatures_verified); + printf("time taken: %.3fs\n", + stop.tv_sec - start.tv_sec + (stop.tv_usec - start.tv_usec)/1000000.); + if (G.opt.summary > 1) { + int i; + printf("record count by type:\n"); + for (i = 1; i <= T_MAX; i++) { + if (rr_counts[i]) + printf("%20s: %d\n", rdtype2str(i), rr_counts[i]); + } + } + } + return G.exit_code; } diff -Naur validns-0.8/Makefile validns/Makefile --- validns-0.8/Makefile 2014-02-11 15:08:39.000000000 -0500 +++ validns/Makefile 2020-10-05 16:59:29.353681351 -0400 @@ -27,7 +27,7 @@ dname.o tlsa.o nid.o l32.o l64.o lp.o \ ipseckey.o cbtree.o mb.o mg.o mr.o minfo.o \ afsdb.o x25.o isdn.o rt.o px.o kx.o \ - dlv.o dhcid.o nsap.o + dlv.o dhcid.o nsap.o caa.o $(CC) $(CFLAGS) $(OPTIMIZE) -o validns \ main.o carp.o mempool.o textparse.o base64.o base32hex.o \ rr.o soa.o a.o cname.o mx.o ns.o \ @@ -38,7 +38,7 @@ dname.o tlsa.o nid.o l32.o l64.o lp.o \ ipseckey.o cbtree.o mb.o mg.o mr.o minfo.o \ afsdb.o x25.o isdn.o rt.o px.o kx.o \ - dlv.o dhcid.o nsap.o \ + dlv.o dhcid.o nsap.o caa.o \ -L/usr/local/lib -L/opt/local/lib $(EXTRALPATH) \ -lJudy -lcrypto $(EXTRALIBS) $(EXTRALINKING) @@ -53,7 +53,7 @@ -rm -f nid.o l32.o l64.o lp.o ipseckey.o -rm -f cbtree.o mb.o mg.o mr.o minfo.o -rm -f afsdb.o x25.o isdn.o rt.o px.o kx.o - -rm -f dlv.o dhcid.o nsap.o + -rm -f dlv.o dhcid.o nsap.o caa.o -rm -f validns.core core @echo ':-)' @@ -177,6 +177,9 @@ sshfp.o: sshfp.c common.h textparse.h mempool.h carp.h rr.h $(CC) $(CFLAGS) $(OPTIMIZE) -c -o sshfp.o sshfp.c $(INCPATH) +caa.o: caa.c common.h textparse.h mempool.h carp.h rr.h + $(CC) $(CFLAGS) $(OPTIMIZE) -c -o caa.o caa.c $(INCPATH) + rp.o: rp.c common.h textparse.h mempool.h carp.h rr.h $(CC) $(CFLAGS) $(OPTIMIZE) -c -o rp.o rp.c $(INCPATH) diff -Naur validns-0.8/mb.c validns/mb.c --- validns-0.8/mb.c 2014-02-11 15:46:38.000000000 -0500 +++ validns/mb.c 2020-10-05 16:59:29.354681360 -0400 @@ -19,28 +19,28 @@ static struct rr *mb_parse(char *name, long ttl, int type, char *s) { - struct rr_mb *rr = getmem(sizeof(*rr)); + struct rr_mb *rr = getmem(sizeof(*rr)); - rr->madname = extract_name(&s, "madname", 0); - if (!rr->madname) - return NULL; - if (*s) { - return bitch("garbage after valid MB data"); - } + rr->madname = extract_name(&s, "madname", 0); + if (!rr->madname) + return NULL; + if (*s) { + return bitch("garbage after valid MB data"); + } - return store_record(type, name, ttl, rr); + return store_record(type, name, ttl, rr); } static char* mb_human(struct rr *rrv) { - RRCAST(mb); + RRCAST(mb); return rr->madname; } static struct binary_data mb_wirerdata(struct rr *rrv) { - RRCAST(mb); - return name2wire_name(rr->madname); + RRCAST(mb); + return name2wire_name(rr->madname); } struct rr_methods mb_methods = { mb_parse, mb_human, mb_wirerdata, NULL, NULL }; diff -Naur validns-0.8/mempool.c validns/mempool.c --- validns-0.8/mempool.c 2014-02-11 15:47:03.000000000 -0500 +++ validns/mempool.c 2020-10-05 16:59:29.354681360 -0400 @@ -14,10 +14,10 @@ struct pool { - struct pool *next; - size_t pool_size; - size_t free_index; - char mem[0]; + struct pool *next; + size_t pool_size; + size_t free_index; + char mem[0]; }; static struct pool *freespace = NULL; @@ -25,78 +25,78 @@ static void new_pool(size_t size) { - struct pool *pool; + struct pool *pool; - size = (size + sizeof(void *) - 1) / sizeof(void *); - size *= sizeof(void *); - pool = malloc(size + sizeof(struct pool)); - if (!pool) - croak(1, "new_pool malloc"); - pool->next = freespace; - pool->free_index = 0; - pool->pool_size = size; - freespace = pool; + size = (size + sizeof(void *) - 1) / sizeof(void *); + size *= sizeof(void *); + pool = malloc(size + sizeof(struct pool)); + if (!pool) + croak(1, "new_pool malloc"); + pool->next = freespace; + pool->free_index = 0; + pool->pool_size = size; + freespace = pool; } void mem_requirements_hint(size_t size) { - if (freespace) return; - new_pool(size); + if (freespace) return; + new_pool(size); } void *getmem(size_t size) { - void *ret; - size = (size + sizeof(void *) - 1) / sizeof(void *); - size *= sizeof(void *); - if (!freespace) new_pool(size > 256000 ? size : 256000); - if (freespace->pool_size - freespace->free_index < size) - new_pool(size > 256000 ? size : 256000); - ret = freespace->mem + freespace->free_index; - freespace->free_index += size; - return ret; + void *ret; + size = (size + sizeof(void *) - 1) / sizeof(void *); + size *= sizeof(void *); + if (!freespace) new_pool(size > 256000 ? size : 256000); + if (freespace->pool_size - freespace->free_index < size) + new_pool(size > 256000 ? size : 256000); + ret = freespace->mem + freespace->free_index; + freespace->free_index += size; + return ret; } void *getmem_temp(size_t size) { - void *ret; - size = (size + sizeof(void *) - 1) / sizeof(void *); - size *= sizeof(void *); - if (!temp_freespace) { - size_t pool_size = size > 1024*1024 ? size : 1024*1024; - pool_size = (pool_size + sizeof(void *) - 1) / sizeof(void *); - pool_size *= sizeof(void *); - temp_freespace = malloc(pool_size + sizeof(struct pool)); - if (!temp_freespace) - croak(1, "getmem_temp malloc"); - temp_freespace->next = NULL; - temp_freespace->free_index = 0; - temp_freespace->pool_size = pool_size; - } - if (temp_freespace->pool_size - temp_freespace->free_index < size) - croak(1, "getmem_temp request too large"); - ret = temp_freespace->mem + temp_freespace->free_index; - temp_freespace->free_index += size; - return ret; + void *ret; + size = (size + sizeof(void *) - 1) / sizeof(void *); + size *= sizeof(void *); + if (!temp_freespace) { + size_t pool_size = size > 1024*1024 ? size : 1024*1024; + pool_size = (pool_size + sizeof(void *) - 1) / sizeof(void *); + pool_size *= sizeof(void *); + temp_freespace = malloc(pool_size + sizeof(struct pool)); + if (!temp_freespace) + croak(1, "getmem_temp malloc"); + temp_freespace->next = NULL; + temp_freespace->free_index = 0; + temp_freespace->pool_size = pool_size; + } + if (temp_freespace->pool_size - temp_freespace->free_index < size) + croak(1, "getmem_temp request too large"); + ret = temp_freespace->mem + temp_freespace->free_index; + temp_freespace->free_index += size; + return ret; } int freeall_temp(void) { - if (temp_freespace) { - temp_freespace->free_index = 0; - } - return 1; + if (temp_freespace) { + temp_freespace->free_index = 0; + } + return 1; } char *quickstrdup(char *s) { - char *r = getmem(strlen(s)+1); - return strcpy(r, s); + char *r = getmem(strlen(s)+1); + return strcpy(r, s); } char *quickstrdup_temp(char *s) { - char *r = getmem_temp(strlen(s)+1); - return strcpy(r, s); + char *r = getmem_temp(strlen(s)+1); + return strcpy(r, s); } diff -Naur validns-0.8/mg.c validns/mg.c --- validns-0.8/mg.c 2014-02-11 15:46:40.000000000 -0500 +++ validns/mg.c 2020-10-05 16:59:29.355681369 -0400 @@ -19,28 +19,28 @@ static struct rr *mg_parse(char *name, long ttl, int type, char *s) { - struct rr_mg *rr = getmem(sizeof(*rr)); + struct rr_mg *rr = getmem(sizeof(*rr)); - rr->mgmname = extract_name(&s, "mgmname", 0); - if (!rr->mgmname) - return NULL; - if (*s) { - return bitch("garbage after valid MG data"); - } + rr->mgmname = extract_name(&s, "mgmname", 0); + if (!rr->mgmname) + return NULL; + if (*s) { + return bitch("garbage after valid MG data"); + } - return store_record(type, name, ttl, rr); + return store_record(type, name, ttl, rr); } static char* mg_human(struct rr *rrv) { - RRCAST(mg); + RRCAST(mg); return rr->mgmname; } static struct binary_data mg_wirerdata(struct rr *rrv) { - RRCAST(mg); - return name2wire_name(rr->mgmname); + RRCAST(mg); + return name2wire_name(rr->mgmname); } struct rr_methods mg_methods = { mg_parse, mg_human, mg_wirerdata, NULL, NULL }; diff -Naur validns-0.8/minfo.c validns/minfo.c --- validns-0.8/minfo.c 2014-02-11 15:46:43.000000000 -0500 +++ validns/minfo.c 2020-10-05 16:59:29.355681369 -0400 @@ -19,38 +19,38 @@ static struct rr *minfo_parse(char *name, long ttl, int type, char *s) { - struct rr_minfo *rr = getmem(sizeof(*rr)); + struct rr_minfo *rr = getmem(sizeof(*rr)); - rr->rmailbx = extract_name(&s, "rmailbx", 0); - if (!rr->rmailbx) - return NULL; + rr->rmailbx = extract_name(&s, "rmailbx", 0); + if (!rr->rmailbx) + return NULL; - rr->emailbx = extract_name(&s, "emailbx", 0); - if (!rr->emailbx) - return NULL; + rr->emailbx = extract_name(&s, "emailbx", 0); + if (!rr->emailbx) + return NULL; - if (*s) { - return bitch("garbage after valid MINFO data"); - } + if (*s) { + return bitch("garbage after valid MINFO data"); + } - return store_record(type, name, ttl, rr); + return store_record(type, name, ttl, rr); } static char* minfo_human(struct rr *rrv) { - RRCAST(minfo); - char s[1024]; + RRCAST(minfo); + char s[1024]; - snprintf(s, 1024, "%s %s", rr->rmailbx, rr->emailbx); - return quickstrdup_temp(s); + snprintf(s, 1024, "%s %s", rr->rmailbx, rr->emailbx); + return quickstrdup_temp(s); } static struct binary_data minfo_wirerdata(struct rr *rrv) { - RRCAST(minfo); - return compose_binary_data("dd", 1, - name2wire_name(rr->rmailbx), - name2wire_name(rr->emailbx)); + RRCAST(minfo); + return compose_binary_data("dd", 1, + name2wire_name(rr->rmailbx), + name2wire_name(rr->emailbx)); } struct rr_methods minfo_methods = { minfo_parse, minfo_human, minfo_wirerdata, NULL, NULL }; diff -Naur validns-0.8/mr.c validns/mr.c --- validns-0.8/mr.c 2014-02-11 15:46:46.000000000 -0500 +++ validns/mr.c 2020-10-05 16:59:29.355681369 -0400 @@ -19,28 +19,28 @@ static struct rr *mr_parse(char *name, long ttl, int type, char *s) { - struct rr_mr *rr = getmem(sizeof(*rr)); + struct rr_mr *rr = getmem(sizeof(*rr)); - rr->newname = extract_name(&s, "newname", 0); - if (!rr->newname) - return NULL; - if (*s) { - return bitch("garbage after valid MR data"); - } + rr->newname = extract_name(&s, "newname", 0); + if (!rr->newname) + return NULL; + if (*s) { + return bitch("garbage after valid MR data"); + } - return store_record(type, name, ttl, rr); + return store_record(type, name, ttl, rr); } static char* mr_human(struct rr *rrv) { - RRCAST(mr); + RRCAST(mr); return rr->newname; } static struct binary_data mr_wirerdata(struct rr *rrv) { - RRCAST(mr); - return name2wire_name(rr->newname); + RRCAST(mr); + return name2wire_name(rr->newname); } struct rr_methods mr_methods = { mr_parse, mr_human, mr_wirerdata, NULL, NULL }; diff -Naur validns-0.8/mx.c validns/mx.c --- validns-0.8/mx.c 2014-02-11 15:45:19.000000000 -0500 +++ validns/mx.c 2020-10-05 16:59:29.355681369 -0400 @@ -19,59 +19,59 @@ static struct rr *mx_parse(char *name, long ttl, int type, char *s) { - struct rr_mx *rr = getmem(sizeof(*rr)); + struct rr_mx *rr = getmem(sizeof(*rr)); - rr->preference = extract_integer(&s, "MX preference"); - if (rr->preference < 0) - return NULL; - /* XXX preference range check */ - rr->exchange = extract_name(&s, "MX exchange", 0); - if (!rr->exchange) - return NULL; - if (*s) { - return bitch("garbage after valid MX data"); - } + rr->preference = extract_integer(&s, "MX preference", NULL); + if (rr->preference < 0) + return NULL; + /* XXX preference range check */ + rr->exchange = extract_name(&s, "MX exchange", 0); + if (!rr->exchange) + return NULL; + if (*s) { + return bitch("garbage after valid MX data"); + } - return store_record(type, name, ttl, rr); + return store_record(type, name, ttl, rr); } static char* mx_human(struct rr *rrv) { - RRCAST(mx); + RRCAST(mx); char s[1024]; snprintf(s, 1024, "%d %s", - rr->preference, rr->exchange); + rr->preference, rr->exchange); return quickstrdup_temp(s); } static struct binary_data mx_wirerdata(struct rr *rrv) { - RRCAST(mx); + RRCAST(mx); return compose_binary_data("2d", 1, - rr->preference, name2wire_name(rr->exchange)); + rr->preference, name2wire_name(rr->exchange)); } static void* mx_validate_set(struct rr_set *rr_set) { - if (rr_set->named_rr->flags & NAME_FLAG_CONTAINS_SLASH) { - struct rr *rr = rr_set->tail; - return moan(rr->file_name, rr->line, "host name contains '/'"); - } - return NULL; + if (rr_set->named_rr->flags & NAME_FLAG_CONTAINS_SLASH) { + struct rr *rr = rr_set->tail; + return moan(rr->file_name, rr->line, "host name contains '/'"); + } + return NULL; } static void *mx_validate(struct rr *rrv) { - RRCAST(mx); + RRCAST(mx); - if (G.opt.policy_checks[POLICY_MX_ALIAS]) { - if (find_rr_set(T_CNAME, rr->exchange)) { - return moan(rr->rr.file_name, rr->rr.line, "MX exchange is an alias"); - } - } - return NULL; + if (G.opt.policy_checks[POLICY_MX_ALIAS]) { + if (find_rr_set(T_CNAME, rr->exchange)) { + return moan(rr->rr.file_name, rr->rr.line, "MX exchange is an alias"); + } + } + return NULL; } struct rr_methods mx_methods = { mx_parse, mx_human, mx_wirerdata, mx_validate_set, mx_validate }; diff -Naur validns-0.8/naptr.c validns/naptr.c --- validns-0.8/naptr.c 2014-02-11 15:45:22.000000000 -0500 +++ validns/naptr.c 2020-10-05 16:59:29.355681369 -0400 @@ -20,74 +20,74 @@ static struct rr *naptr_parse(char *name, long ttl, int type, char *s) { - struct rr_naptr *rr = getmem(sizeof(*rr)); - int i; - struct binary_data text; - - i = extract_integer(&s, "order"); - if (i < 0) - return NULL; - if (i >= 65536) - return bitch("order range is not valid"); - rr->order = i; - - i = extract_integer(&s, "preference"); - if (i < 0) - return NULL; - if (i >= 65536) - return bitch("preference range is not valid"); - rr->preference = i; - - text = extract_text(&s, "flags"); - if (text.length < 0) - return NULL; - for (i = 0; i < text.length; i++) { - if (!isalnum(text.data[i])) { - return bitch("flags contains illegal characters"); - } - } - rr->flags = text; - - text = extract_text(&s, "services"); - if (text.length < 0) - return NULL; - rr->services = text; - - text = extract_text(&s, "regexp"); - if (text.length < 0) - return NULL; - rr->regexp = text; - - rr->replacement = extract_name(&s, "replacement", 0); - if (!rr->replacement) - return NULL; - - if (*s) { - return bitch("garbage after valid NAPTR data"); - } + struct rr_naptr *rr = getmem(sizeof(*rr)); + int i; + struct binary_data text; + + i = extract_integer(&s, "order", NULL); + if (i < 0) + return NULL; + if (i >= 65536) + return bitch("order range is not valid"); + rr->order = i; + + i = extract_integer(&s, "preference", NULL); + if (i < 0) + return NULL; + if (i >= 65536) + return bitch("preference range is not valid"); + rr->preference = i; + + text = extract_text(&s, "flags"); + if (text.length < 0) + return NULL; + for (i = 0; i < text.length; i++) { + if (!isalnum(text.data[i])) { + return bitch("flags contains illegal characters"); + } + } + rr->flags = text; + + text = extract_text(&s, "services"); + if (text.length < 0) + return NULL; + rr->services = text; + + text = extract_text(&s, "regexp"); + if (text.length < 0) + return NULL; + rr->regexp = text; + + rr->replacement = extract_name(&s, "replacement", 0); + if (!rr->replacement) + return NULL; + + if (*s) { + return bitch("garbage after valid NAPTR data"); + } - return store_record(type, name, ttl, rr); + return store_record(type, name, ttl, rr); } static char* naptr_human(struct rr *rrv) { - RRCAST(naptr); + RRCAST(naptr); char s[1024]; - snprintf(s, 1024, "%hu %hu \"%s\" ...", - rr->order, rr->preference, rr->flags.data); + snprintf(s, 1024, "%hu %hu \"%s\" ...", + rr->order, rr->preference, rr->flags.data); - return quickstrdup_temp(s); + return quickstrdup_temp(s); } static struct binary_data naptr_wirerdata(struct rr *rrv) { - RRCAST(naptr); + RRCAST(naptr); return compose_binary_data("22bbbd", 1, - rr->order, rr->preference, - rr->flags, rr->services, rr->regexp, - name2wire_name(rr->replacement)); + rr->order, rr->preference, + rr->flags, rr->services, rr->regexp, + name2wire_name(rr->replacement)); } struct rr_methods naptr_methods = { naptr_parse, naptr_human, naptr_wirerdata, NULL, NULL }; diff -Naur validns-0.8/nid.c validns/nid.c --- validns-0.8/nid.c 2014-02-11 15:46:20.000000000 -0500 +++ validns/nid.c 2020-10-05 16:59:29.355681369 -0400 @@ -19,39 +19,39 @@ static struct rr *nid_parse(char *name, long ttl, int type, char *s) { - struct rr_nid *rr = getmem(sizeof(*rr)); - int preference; + struct rr_nid *rr = getmem(sizeof(*rr)); + int preference; - rr->preference = preference = extract_integer(&s, "NID preference"); - if (preference < 0) - return NULL; - if (extract_u64(&s, "NodeID", &rr->node_id) < 0) - return NULL; - - if (*s) { - return bitch("garbage after valid NID data"); - } + rr->preference = preference = extract_integer(&s, "NID preference", NULL); + if (preference < 0) + return NULL; + if (extract_u64(&s, "NodeID", &rr->node_id) < 0) + return NULL; + + if (*s) { + return bitch("garbage after valid NID data"); + } - return store_record(type, name, ttl, rr); + return store_record(type, name, ttl, rr); } static char* nid_human(struct rr *rrv) { - RRCAST(nid); + RRCAST(nid); char s[1024]; snprintf(s, 1024, "%d %x:%x:%x:%x", - rr->preference, - (unsigned)(rr->node_id >> 48) & 0xffff, - (unsigned)(rr->node_id >> 32) & 0xffff, - (unsigned)(rr->node_id >> 16) & 0xffff, - (unsigned)(rr->node_id >> 0) & 0xffff); + rr->preference, + (unsigned)(rr->node_id >> 48) & 0xffff, + (unsigned)(rr->node_id >> 32) & 0xffff, + (unsigned)(rr->node_id >> 16) & 0xffff, + (unsigned)(rr->node_id >> 0) & 0xffff); return quickstrdup_temp(s); } static struct binary_data nid_wirerdata(struct rr *rrv) { - RRCAST(nid); + RRCAST(nid); return compose_binary_data("28", 1, rr->preference, rr->node_id); } diff -Naur validns-0.8/nsap.c validns/nsap.c --- validns-0.8/nsap.c 2014-02-11 15:46:48.000000000 -0500 +++ validns/nsap.c 2020-10-05 16:59:29.355681369 -0400 @@ -19,15 +19,15 @@ static struct rr* nsap_parse(char *name, long ttl, int type, char *s) { - struct rr_nsap *rr = getmem(sizeof(*rr)); + struct rr_nsap *rr = getmem(sizeof(*rr)); - rr->data = extract_hex_binary_data(&s, "NSAP data", EXTRACT_EAT_WHITESPACE); - if (rr->data.length < 0) return NULL; + rr->data = extract_hex_binary_data(&s, "NSAP data", EXTRACT_EAT_WHITESPACE); + if (rr->data.length < 0) return NULL; - if (*s) { - return bitch("garbage after valid NSAP data"); - } - return store_record(type, name, ttl, rr); + if (*s) { + return bitch("garbage after valid NSAP data"); + } + return store_record(type, name, ttl, rr); } static char* nsap_human(struct rr *rrv) @@ -37,9 +37,9 @@ static struct binary_data nsap_wirerdata(struct rr *rrv) { - RRCAST(nsap); + RRCAST(nsap); - return compose_binary_data("d", 1, rr->data); + return compose_binary_data("d", 1, rr->data); } struct rr_methods nsap_methods = { nsap_parse, nsap_human, nsap_wirerdata, NULL, NULL }; diff -Naur validns-0.8/ns.c validns/ns.c --- validns-0.8/ns.c 2014-02-11 15:45:28.000000000 -0500 +++ validns/ns.c 2020-10-05 16:59:29.355681369 -0400 @@ -20,63 +20,63 @@ static struct rr *ns_parse(char *name, long ttl, int type, char *s) { - struct rr_ns *rr = getmem(sizeof(*rr)); - struct rr *ret_rr; + struct rr_ns *rr = getmem(sizeof(*rr)); + struct rr *ret_rr; - rr->nsdname = extract_name(&s, "name server domain name", 0); - if (!rr->nsdname) - return NULL; - if (*s) { - return bitch("garbage after valid NS data"); - } - - ret_rr = store_record(type, name, ttl, rr); - if (ret_rr) { - if (!(ret_rr->rr_set->named_rr->flags & (NAME_FLAG_APEX|NAME_FLAG_DELEGATION))) { - ret_rr->rr_set->named_rr->flags |= NAME_FLAG_DELEGATION; - G.stats.delegations++; - } - } - return ret_rr; + rr->nsdname = extract_name(&s, "name server domain name", 0); + if (!rr->nsdname) + return NULL; + if (*s) { + return bitch("garbage after valid NS data"); + } + + ret_rr = store_record(type, name, ttl, rr); + if (ret_rr) { + if (!(ret_rr->rr_set->named_rr->flags & (NAME_FLAG_APEX|NAME_FLAG_DELEGATION))) { + ret_rr->rr_set->named_rr->flags |= NAME_FLAG_DELEGATION; + G.stats.delegations++; + } + } + return ret_rr; } static char* ns_human(struct rr *rrv) { - RRCAST(ns); + RRCAST(ns); return rr->nsdname; } static struct binary_data ns_wirerdata(struct rr *rrv) { - RRCAST(ns); - return name2wire_name(rr->nsdname); + RRCAST(ns); + return name2wire_name(rr->nsdname); } static void* ns_validate_set(struct rr_set *rr_set) { - struct rr *rr; - if (G.opt.policy_checks[POLICY_SINGLE_NS]) { - if (rr_set->count < 2) { - rr = rr_set->tail; - return moan(rr->file_name, rr->line, "there should be at least two NS records per name"); - } - } - return NULL; + struct rr *rr; + if (G.opt.policy_checks[POLICY_SINGLE_NS]) { + if (rr_set->count < 2) { + rr = rr_set->tail; + return moan(rr->file_name, rr->line, "there should be at least two NS records per name"); + } + } + return NULL; } static void *ns_validate(struct rr *rrv) { - RRCAST(ns); + RRCAST(ns); - if (G.opt.policy_checks[POLICY_NS_ALIAS]) { - if (find_rr_set(T_CNAME, rr->nsdname)) { - return moan(rr->rr.file_name, rr->rr.line, "NS data is an alias"); - } - } - if (strchr(rr->nsdname, '/') != NULL) - return moan(rr->rr.file_name, rr->rr.line, "NS data contains '/'"); - return NULL; + if (G.opt.policy_checks[POLICY_NS_ALIAS]) { + if (find_rr_set(T_CNAME, rr->nsdname)) { + return moan(rr->rr.file_name, rr->rr.line, "NS data is an alias"); + } + } + if (strchr(rr->nsdname, '/') != NULL) + return moan(rr->rr.file_name, rr->rr.line, "NS data contains '/'"); + return NULL; } struct rr_methods ns_methods = { ns_parse, ns_human, ns_wirerdata, ns_validate_set, ns_validate }; diff -Naur validns-0.8/nsec3.c validns/nsec3.c --- validns-0.8/nsec3.c 2014-02-11 15:45:31.000000000 -0500 +++ validns/nsec3.c 2020-10-05 16:59:29.355681369 -0400 @@ -24,125 +24,125 @@ static struct rr* nsec3_parse(char *name, long ttl, int type, char *s) { struct rr_nsec3 *rr = getmem(sizeof(*rr)); - struct rr *ret_rr; - struct binary_data bitmap; - int i; - int opt_out = 0; - char *str_type = NULL; - int ltype; - - i = extract_integer(&s, "hash algorithm"); - if (i < 0) - return NULL; - if (i > 255) - return bitch("bad hash algorithm value"); - if (i != 1) - return bitch("unrecognized or unsupported hash algorithm"); - rr->hash_algorithm = i; - - i = extract_integer(&s, "flags"); - if (i < 0) - return NULL; - if (i > 255) - return bitch("bad flags value"); - - if (!(i == 0 || i == 1)) - return bitch("unsupported flags value"); - if (i == 1) - opt_out = 1; - rr->flags = i; - - i = extract_integer(&s, "iterations"); - if (i < 0) - return NULL; - if (i > 2500) - return bitch("bad iterations value"); - rr->iterations = i; - /* TODO validate iteration count according to key size, - * as per http://tools.ietf.org/html/rfc5155#section-10.3 */ - - if (*s == '-') { - rr->salt.length = 0; - rr->salt.data = NULL; - s++; - if (*s && !isspace(*s) && *s != ';' && *s != ')') - return bitch("salt is not valid"); - s = skip_white_space(s); - } else { - rr->salt = extract_hex_binary_data(&s, "salt", EXTRACT_DONT_EAT_WHITESPACE); - if (rr->salt.length <= 0) - return NULL; - if (rr->salt.length > 255) - return bitch("salt is too long"); - } - - rr->next_hashed_owner = extract_base32hex_binary_data(&s, "next hashed owner"); - if (rr->next_hashed_owner.length != 20) { - return bitch("next hashed owner does not have the right size"); - } - - bitmap = new_set(); - while (s && *s) { - str_type = extract_label(&s, "type list", "temporary"); - if (!str_type) return NULL; - ltype = str2rdtype(str_type, NULL); - if (ltype < 0) - return NULL; - add_bit_to_set(&bitmap, ltype); - } - if (!s) - return NULL; - rr->type_bitmap = compressed_set(&bitmap); + struct rr *ret_rr; + struct binary_data bitmap; + int i; + int opt_out = 0; + char *str_type = NULL; + int ltype; + + i = extract_integer(&s, "hash algorithm", NULL); + if (i < 0) + return NULL; + if (i > 255) + return bitch("bad hash algorithm value"); + if (i != 1) + return bitch("unrecognized or unsupported hash algorithm"); + rr->hash_algorithm = i; + + i = extract_integer(&s, "flags", NULL); + if (i < 0) + return NULL; + if (i > 255) + return bitch("bad flags value"); + + if (!(i == 0 || i == 1)) + return bitch("unsupported flags value"); + if (i == 1) + opt_out = 1; + rr->flags = i; + + i = extract_integer(&s, "iterations", NULL); + if (i < 0) + return NULL; + if (i > 2500) + return bitch("bad iterations value"); + rr->iterations = i; + /* TODO validate iteration count according to key size, + * as per http://tools.ietf.org/html/rfc5155#section-10.3 */ + + if (*s == '-') { + rr->salt.length = 0; + rr->salt.data = NULL; + s++; + if (*s && !isspace(*s) && *s != ';' && *s != ')') + return bitch("salt is not valid"); + s = skip_white_space(s); + } else { + rr->salt = extract_hex_binary_data(&s, "salt", EXTRACT_DONT_EAT_WHITESPACE); + if (rr->salt.length <= 0) + return NULL; + if (rr->salt.length > 255) + return bitch("salt is too long"); + } + + rr->next_hashed_owner = extract_base32hex_binary_data(&s, "next hashed owner"); + if (rr->next_hashed_owner.length != 20) { + return bitch("next hashed owner does not have the right size"); + } + + bitmap = new_set(); + while (s && *s) { + str_type = extract_label(&s, "type list", "temporary"); + if (!str_type) return NULL; + ltype = str2rdtype(str_type, NULL); + if (ltype < 0) + return NULL; + add_bit_to_set(&bitmap, ltype); + } + if (!s) + return NULL; + rr->type_bitmap = compressed_set(&bitmap); - rr->corresponding_name = NULL; - rr->next_nsec3 = NULL; + rr->corresponding_name = NULL; + rr->next_nsec3 = NULL; - if (!remember_nsec3(name, rr)) - return NULL; + if (!remember_nsec3(name, rr)) + return NULL; ret_rr = store_record(type, name, ttl, rr); - if (ret_rr) { - G.nsec3_present = 1; - G.dnssec_active = 1; - G.stats.nsec3_count++; - if (opt_out) { - G.nsec3_opt_out_present = 1; - } - if (ret_rr && !nsec3param) - nsec3param = ret_rr; - } - return ret_rr; + if (ret_rr) { + G.nsec3_present = 1; + G.dnssec_active = 1; + G.stats.nsec3_count++; + if (opt_out) { + G.nsec3_opt_out_present = 1; + } + if (ret_rr && !nsec3param) + nsec3param = ret_rr; + } + return ret_rr; } static char* nsec3_human(struct rr *rrv) { - RRCAST(nsec3); + RRCAST(nsec3); char ss[1024]; - char *s = ss; - int l; - int i; + char *s = ss; + int l; + int i; l = snprintf(s, 1024, "%u %u %u ", rr->hash_algorithm, rr->flags, rr->iterations); - s += l; - if (rr->salt.length) { - for (i = 0; i < rr->salt.length; i++) { - l = snprintf(s, 1024-(s-ss), "%02X", (unsigned char)rr->salt.data[i]); - s += l; - } - } else { - sprintf(s, "-"); - } + s += l; + if (rr->salt.length) { + for (i = 0; i < rr->salt.length; i++) { + l = snprintf(s, 1024-(s-ss), "%02X", (unsigned char)rr->salt.data[i]); + s += l; + } + } else { + sprintf(s, "-"); + } return quickstrdup_temp(ss); } static struct binary_data nsec3_wirerdata(struct rr *rrv) { - RRCAST(nsec3); + RRCAST(nsec3); - return compose_binary_data("112bbd", 1, - rr->hash_algorithm, rr->flags, - rr->iterations, rr->salt, - rr->next_hashed_owner, rr->type_bitmap); + return compose_binary_data("112bbd", 1, + rr->hash_algorithm, rr->flags, + rr->iterations, rr->salt, + rr->next_hashed_owner, rr->type_bitmap); } struct rr_nsec3 *first_nsec3 = NULL; @@ -150,36 +150,36 @@ void* nsec3_validate(struct rr *rrv) { - RRCAST(nsec3); + RRCAST(nsec3); - if (!first_nsec3) { - first_nsec3 = rr; - } - if (latest_nsec3) { - if (memcmp(latest_nsec3->next_hashed_owner.data, rr->this_hashed_name.data, 20) != 0) { - char *expected_name = quickstrdup_temp(rr->rr.rr_set->named_rr->name); - /* guaranteed to have same length, I think */ - encode_base32hex(expected_name, 32, latest_nsec3->next_hashed_owner.data, 20); - if (rr == first_nsec3) { - moan(latest_nsec3->rr.file_name, latest_nsec3->rr.line, - "broken NSEC3 chain, expected %s, but nothing found", - expected_name); - } else { - moan(latest_nsec3->rr.file_name, latest_nsec3->rr.line, - "broken NSEC3 chain, expected %s, but found %s", - expected_name, - rr->rr.rr_set->named_rr->name); - } - if (rr != first_nsec3) - latest_nsec3->next_nsec3 = rr; - latest_nsec3 = rr; - return NULL; - } - if (rr != first_nsec3) - latest_nsec3->next_nsec3 = rr; - } - latest_nsec3 = rr; - return rr; + if (!first_nsec3) { + first_nsec3 = rr; + } + if (latest_nsec3) { + if (memcmp(latest_nsec3->next_hashed_owner.data, rr->this_hashed_name.data, 20) != 0) { + char *expected_name = quickstrdup_temp(rr->rr.rr_set->named_rr->name); + /* guaranteed to have same length, I think */ + encode_base32hex(expected_name, 32, latest_nsec3->next_hashed_owner.data, 20); + if (rr == first_nsec3) { + moan(latest_nsec3->rr.file_name, latest_nsec3->rr.line, + "broken NSEC3 chain, expected %s, but nothing found", + expected_name); + } else { + moan(latest_nsec3->rr.file_name, latest_nsec3->rr.line, + "broken NSEC3 chain, expected %s, but found %s", + expected_name, + rr->rr.rr_set->named_rr->name); + } + if (rr != first_nsec3) + latest_nsec3->next_nsec3 = rr; + latest_nsec3 = rr; + return NULL; + } + if (rr != first_nsec3) + latest_nsec3->next_nsec3 = rr; + } + latest_nsec3 = rr; + return rr; } struct rr_methods nsec3_methods = { nsec3_parse, nsec3_human, nsec3_wirerdata, NULL, nsec3_validate }; diff -Naur validns-0.8/nsec3checks.c validns/nsec3checks.c --- validns-0.8/nsec3checks.c 2020-10-05 16:57:07.219376944 -0400 +++ validns/nsec3checks.c 2020-10-05 16:59:48.870860473 -0400 @@ -29,44 +29,44 @@ { struct rr_nsec3param *p = (struct rr_nsec3param *)param; EVP_MD_CTX *ctx; - unsigned char md0[EVP_MAX_MD_SIZE]; - unsigned char md1[EVP_MAX_MD_SIZE]; - unsigned char *md[2]; - int mdi = 0; - struct binary_data r = bad_binary_data(); - struct binary_data wire_name = name2wire_name(name); - int i; - int digest_size; - - md[0] = md0; - md[1] = md1; - if (wire_name.length < 0) - return r; + unsigned char md0[EVP_MAX_MD_SIZE]; + unsigned char md1[EVP_MAX_MD_SIZE]; + unsigned char *md[2]; + int mdi = 0; + struct binary_data r = bad_binary_data(); + struct binary_data wire_name = name2wire_name(name); + int i; + int digest_size; + + md[0] = md0; + md[1] = md1; + if (wire_name.length < 0) + return r; - /* XXX Maybe use Init_ex and Final_ex for speed? */ + /* XXX Maybe use Init_ex and Final_ex for speed? */ ctx = EVP_MD_CTX_new(); - return r; + return r; digest_size = EVP_MD_CTX_size(ctx); EVP_DigestUpdate(ctx, wire_name.data, wire_name.length); EVP_DigestUpdate(ctx, p->salt.data, p->salt.length); EVP_DigestFinal(ctx, md[mdi], NULL); - for (i = 0; i < p->iterations; i++) { + for (i = 0; i < p->iterations; i++) { if (EVP_DigestInit(ctx, EVP_sha1()) != 1) - return r; + return r; EVP_DigestUpdate(ctx, md[mdi], digest_size); - mdi = (mdi + 1) % 2; + mdi = (mdi + 1) % 2; EVP_DigestUpdate(ctx, p->salt.data, p->salt.length); EVP_DigestFinal(ctx, md[mdi], NULL); - } + } EVP_MD_CTX_free(ctx); - r.length = digest_size; - r.data = getmem(digest_size); - memcpy(r.data, md[mdi], digest_size); - return r; + r.length = digest_size; + r.data = getmem(digest_size); + memcpy(r.data, md[mdi], digest_size); + return r; } int sorted_hashed_names_count; @@ -77,193 +77,193 @@ static int validate_nsec3_for_name(const char *name, intptr_t *data, void *p) { - struct named_rr *named_rr = *((struct named_rr **)data); - struct binary_data hash; - struct rr_nsec3 **nsec3_slot; - struct rr_nsec3 *nsec3; + struct named_rr *named_rr = *((struct named_rr **)data); + struct binary_data hash; + struct rr_nsec3 **nsec3_slot; + struct rr_nsec3 *nsec3; - if ((named_rr->flags & mask) == NAME_FLAG_KIDS_WITH_RECORDS) { - //fprintf(stderr, "--- need nsec3, kids with records: %s\n", named_rr->name); + if ((named_rr->flags & mask) == NAME_FLAG_KIDS_WITH_RECORDS) { + //fprintf(stderr, "--- need nsec3, kids with records: %s\n", named_rr->name); needs_nsec3: - freeall_temp(); - hash = name2hash(named_rr->name, nsec3param); - if (hash.length < 0) { - moan(named_rr->file_name, named_rr->line, "internal: cannot calculate hashed name"); - goto next; - } - if (hash.length != 20) - croak(4, "assertion failed: wrong hashed name size %d", hash.length); - JHSG(nsec3_slot, nsec3_hash, hash.data, hash.length); - if (nsec3_slot == PJERR) - croak(5, "perform_remaining_nsec3checks: JHSG failed"); - if (!nsec3_slot) { - moan(named_rr->file_name, named_rr->line, - "no corresponding NSEC3 found for %s", - named_rr->name); - goto next; - } - nsec3 = *nsec3_slot; - if (!nsec3) - croak(6, "assertion failed: existing nsec3 from hash is empty"); - nsec3->corresponding_name = named_rr; - sorted_hashed_names_count++; - check_typemap(nsec3->type_bitmap, named_rr, &nsec3->rr); - } else if ((named_rr->flags & - (NAME_FLAG_NOT_AUTHORITATIVE|NAME_FLAG_SIGNED_DELEGATION)) == - NAME_FLAG_SIGNED_DELEGATION) - { - //fprintf(stderr, "--- need nsec3, signed delegation: %s\n", named_rr->name); - goto needs_nsec3; - } else if (!G.nsec3_opt_out_present && (named_rr->flags & - (NAME_FLAG_APEX_PARENT|NAME_FLAG_NOT_AUTHORITATIVE|NAME_FLAG_DELEGATION|NAME_FLAG_HAS_RECORDS)) == - 0) - { - //fprintf(stderr, "--- need nsec3, empty non-term: %s\n", named_rr->name); - goto needs_nsec3; - } else if (!G.nsec3_opt_out_present && (named_rr->flags & (NAME_FLAG_DELEGATION|NAME_FLAG_NOT_AUTHORITATIVE))==NAME_FLAG_DELEGATION) - { - //fprintf(stderr, "--- need nsec3, no opt-out: %s\n", named_rr->name); - goto needs_nsec3; - } else if (!G.nsec3_opt_out_present && (named_rr->flags & (NAME_FLAG_THIS_WITH_RECORDS|NAME_FLAG_NOT_AUTHORITATIVE)) == NAME_FLAG_THIS_WITH_RECORDS) - { - //fprintf(stderr, "--- need nsec3, this with records: %s\n", named_rr->name); - goto needs_nsec3; - } else { - //fprintf(stderr, "--- NO need for nsec3: %s\n", named_rr->name); - } + freeall_temp(); + hash = name2hash(named_rr->name, nsec3param); + if (hash.length < 0) { + moan(named_rr->file_name, named_rr->line, "internal: cannot calculate hashed name"); + goto next; + } + if (hash.length != 20) + croak(4, "assertion failed: wrong hashed name size %d", hash.length); + JHSG(nsec3_slot, nsec3_hash, hash.data, hash.length); + if (nsec3_slot == PJERR) + croak(5, "perform_remaining_nsec3checks: JHSG failed"); + if (!nsec3_slot) { + moan(named_rr->file_name, named_rr->line, + "no corresponding NSEC3 found for %s", + named_rr->name); + goto next; + } + nsec3 = *nsec3_slot; + if (!nsec3) + croak(6, "assertion failed: existing nsec3 from hash is empty"); + nsec3->corresponding_name = named_rr; + sorted_hashed_names_count++; + check_typemap(nsec3->type_bitmap, named_rr, &nsec3->rr); + } else if ((named_rr->flags & + (NAME_FLAG_NOT_AUTHORITATIVE|NAME_FLAG_SIGNED_DELEGATION)) == + NAME_FLAG_SIGNED_DELEGATION) + { + //fprintf(stderr, "--- need nsec3, signed delegation: %s\n", named_rr->name); + goto needs_nsec3; + } else if (!G.nsec3_opt_out_present && (named_rr->flags & + (NAME_FLAG_APEX_PARENT|NAME_FLAG_NOT_AUTHORITATIVE|NAME_FLAG_DELEGATION|NAME_FLAG_HAS_RECORDS)) == + 0) + { + //fprintf(stderr, "--- need nsec3, empty non-term: %s\n", named_rr->name); + goto needs_nsec3; + } else if (!G.nsec3_opt_out_present && (named_rr->flags & (NAME_FLAG_DELEGATION|NAME_FLAG_NOT_AUTHORITATIVE))==NAME_FLAG_DELEGATION) + { + //fprintf(stderr, "--- need nsec3, no opt-out: %s\n", named_rr->name); + goto needs_nsec3; + } else if (!G.nsec3_opt_out_present && (named_rr->flags & (NAME_FLAG_THIS_WITH_RECORDS|NAME_FLAG_NOT_AUTHORITATIVE)) == NAME_FLAG_THIS_WITH_RECORDS) + { + //fprintf(stderr, "--- need nsec3, this with records: %s\n", named_rr->name); + goto needs_nsec3; + } else { + //fprintf(stderr, "--- NO need for nsec3: %s\n", named_rr->name); + } next: - return 1; + return 1; } void perform_remaining_nsec3checks(void) { - struct rr_nsec3 *nsec3; + struct rr_nsec3 *nsec3; - sorted_hashed_names_count = 0; - mask = NAME_FLAG_NOT_AUTHORITATIVE|NAME_FLAG_NSEC3_ONLY|NAME_FLAG_KIDS_WITH_RECORDS; - if (G.nsec3_opt_out_present) { - mask |= NAME_FLAG_DELEGATION; - } - - cbtree_allprefixed(&zone_data, "", validate_nsec3_for_name, NULL); - - nsec3 = first_nsec3; - while (nsec3) { - if (!nsec3->corresponding_name) { - moan(nsec3->rr.file_name, nsec3->rr.line, - "NSEC3 without a corresponding record (or empty non-terminal)"); - } - nsec3 = nsec3->next_nsec3; - } + sorted_hashed_names_count = 0; + mask = NAME_FLAG_NOT_AUTHORITATIVE|NAME_FLAG_NSEC3_ONLY|NAME_FLAG_KIDS_WITH_RECORDS; + if (G.nsec3_opt_out_present) { + mask |= NAME_FLAG_DELEGATION; + } + + cbtree_allprefixed(&zone_data, "", validate_nsec3_for_name, NULL); + + nsec3 = first_nsec3; + while (nsec3) { + if (!nsec3->corresponding_name) { + moan(nsec3->rr.file_name, nsec3->rr.line, + "NSEC3 without a corresponding record (or empty non-terminal)"); + } + nsec3 = nsec3->next_nsec3; + } } void *remember_nsec3(char *name, struct rr_nsec3 *rr) { - char hashed_name[33]; - char binary_hashed_name[20]; - int l; - struct rr_nsec3 **nsec3_slot; - - l = strlen(name); - if (l < 33 || name[32] != '.') - return bitch("NSEC3 record name is not valid"); - if (l == 33 && zone_apex_l != 1) /* root zone */ - return bitch("NSEC3 record name is not valid"); - if (l > 33 && strcmp(name+33, zone_apex) != 0) - return bitch("NSEC3 record name is not valid"); - - memcpy(hashed_name, name, 32); hashed_name[32] = 0; - l = decode_base32hex(binary_hashed_name, hashed_name, 20); - if (l != 20) - return bitch("NSEC3 record name is not valid"); - JHSI(nsec3_slot, nsec3_hash, binary_hashed_name, 20); - if (nsec3_slot == PJERR) - croak(2, "remember_nsec3: JHSI failed"); - if (*nsec3_slot) - return bitch("multiple NSEC3 with the same record name"); - *nsec3_slot = rr; - rr->this_hashed_name.length = 20; - rr->this_hashed_name.data = getmem(20); - memcpy(rr->this_hashed_name.data, binary_hashed_name, 20); - return rr; + char hashed_name[33]; + char binary_hashed_name[20]; + int l; + struct rr_nsec3 **nsec3_slot; + + l = strlen(name); + if (l < 33 || name[32] != '.') + return bitch("NSEC3 record name is not valid"); + if (l == 33 && zone_apex_l != 1) /* root zone */ + return bitch("NSEC3 record name is not valid"); + if (l > 33 && strcmp(name+33, zone_apex) != 0) + return bitch("NSEC3 record name is not valid"); + + memcpy(hashed_name, name, 32); hashed_name[32] = 0; + l = decode_base32hex(binary_hashed_name, hashed_name, 20); + if (l != 20) + return bitch("NSEC3 record name is not valid"); + JHSI(nsec3_slot, nsec3_hash, binary_hashed_name, 20); + if (nsec3_slot == PJERR) + croak(2, "remember_nsec3: JHSI failed"); + if (*nsec3_slot) + return bitch("multiple NSEC3 with the same record name"); + *nsec3_slot = rr; + rr->this_hashed_name.length = 20; + rr->this_hashed_name.data = getmem(20); + memcpy(rr->this_hashed_name.data, binary_hashed_name, 20); + return rr; } void *check_typemap(struct binary_data type_bitmap, struct named_rr *named_rr, struct rr *reference_rr) { - int type; - char *base; - int i, k; - struct rr_set *set; - uint32_t nsec_distinct_types = 0; - uint32_t real_distinct_types; - - base = type_bitmap.data; - while (base - type_bitmap.data < type_bitmap.length) { - for (i = 0; i < base[1]; i++) { - for (k = 0; k <= 7; k++) { - if (base[2+i] & (0x80 >> k)) { - type = ((unsigned char)base[0])*256 + i*8 + k; - nsec_distinct_types++; - set = find_rr_set_in_named_rr(named_rr, type); - if (!set) { - return moan(reference_rr->file_name, reference_rr->line, - "%s mentions %s, but no such record found for %s", - rdtype2str(reference_rr->rdtype), rdtype2str(type), named_rr->name); - } - } - } - } - base += base[1]+2; - } - real_distinct_types = get_rr_set_count(named_rr); - if (real_distinct_types > nsec_distinct_types) { - void *bitmap = NULL; - struct rr_set **rr_set_slot; - int rc; - Word_t rcw; - Word_t rdtype; - int skipped = 0; - - base = type_bitmap.data; - while (base - type_bitmap.data < type_bitmap.length) { - for (i = 0; i < base[1]; i++) { - for (k = 0; k <= 7; k++) { - if (base[2+i] & (0x80 >> k)) { - type = ((unsigned char)base[0])*256 + i*8 + k; - J1S(rc, bitmap, type); - } - } - } - base += base[1]+2; - } - rdtype = 0; - JLF(rr_set_slot, named_rr->rr_sets, rdtype); - while (rr_set_slot) { - J1T(rc, bitmap, (*rr_set_slot)->rdtype); - if (!rc) { - if ((named_rr->flags & NAME_FLAG_DELEGATION) && - ((*rr_set_slot)->rdtype == T_A || - (*rr_set_slot)->rdtype == T_AAAA)) - { - skipped++; - } else { - moan(reference_rr->file_name, reference_rr->line, - "%s exists, but %s does not mention it for %s", - rdtype2str((*rr_set_slot)->rdtype), - rdtype2str(reference_rr->rdtype), - named_rr->name); - J1FA(rcw, bitmap); - return NULL; - } - } - JLN(rr_set_slot, named_rr->rr_sets, rdtype); - } - J1FA(rcw, bitmap); - if (real_distinct_types - skipped > nsec_distinct_types) { - return moan(reference_rr->file_name, reference_rr->line, - "internal: we know %s typemap is wrong, but don't know any details", - rdtype2str(reference_rr->rdtype)); - } - } - return reference_rr; + int type; + char *base; + int i, k; + struct rr_set *set; + uint32_t nsec_distinct_types = 0; + uint32_t real_distinct_types; + + base = type_bitmap.data; + while (base - type_bitmap.data < type_bitmap.length) { + for (i = 0; i < base[1]; i++) { + for (k = 0; k <= 7; k++) { + if (base[2+i] & (0x80 >> k)) { + type = ((unsigned char)base[0])*256 + i*8 + k; + nsec_distinct_types++; + set = find_rr_set_in_named_rr(named_rr, type); + if (!set) { + return moan(reference_rr->file_name, reference_rr->line, + "%s mentions %s, but no such record found for %s", + rdtype2str(reference_rr->rdtype), rdtype2str(type), named_rr->name); + } + } + } + } + base += base[1]+2; + } + real_distinct_types = get_rr_set_count(named_rr); + if (real_distinct_types > nsec_distinct_types) { + void *bitmap = NULL; + struct rr_set **rr_set_slot; + int rc; + Word_t rcw; + Word_t rdtype; + int skipped = 0; + + base = type_bitmap.data; + while (base - type_bitmap.data < type_bitmap.length) { + for (i = 0; i < base[1]; i++) { + for (k = 0; k <= 7; k++) { + if (base[2+i] & (0x80 >> k)) { + type = ((unsigned char)base[0])*256 + i*8 + k; + J1S(rc, bitmap, type); + } + } + } + base += base[1]+2; + } + rdtype = 0; + JLF(rr_set_slot, named_rr->rr_sets, rdtype); + while (rr_set_slot) { + J1T(rc, bitmap, (*rr_set_slot)->rdtype); + if (!rc) { + if ((named_rr->flags & NAME_FLAG_DELEGATION) && + ((*rr_set_slot)->rdtype == T_A || + (*rr_set_slot)->rdtype == T_AAAA)) + { + skipped++; + } else { + moan(reference_rr->file_name, reference_rr->line, + "%s exists, but %s does not mention it for %s", + rdtype2str((*rr_set_slot)->rdtype), + rdtype2str(reference_rr->rdtype), + named_rr->name); + J1FA(rcw, bitmap); + return NULL; + } + } + JLN(rr_set_slot, named_rr->rr_sets, rdtype); + } + J1FA(rcw, bitmap); + if (real_distinct_types - skipped > nsec_distinct_types) { + return moan(reference_rr->file_name, reference_rr->line, + "internal: we know %s typemap is wrong, but don't know any details", + rdtype2str(reference_rr->rdtype)); + } + } + return reference_rr; } diff -Naur validns-0.8/nsec3param.c validns/nsec3param.c --- validns-0.8/nsec3param.c 2014-02-11 15:45:41.000000000 -0500 +++ validns/nsec3param.c 2020-10-05 16:59:29.355681369 -0400 @@ -24,94 +24,94 @@ static struct rr* nsec3param_parse(char *name, long ttl, int type, char *s) { struct rr_nsec3param *rr = getmem(sizeof(*rr)); - struct rr *ret_rr; - int i; + struct rr *ret_rr; + int i; - i = extract_integer(&s, "hash algorithm"); - if (i < 0) - return NULL; - if (i > 255) - return bitch("bad hash algorithm value"); - if (i != 1) - return bitch("unrecognized or unsupported hash algorithm"); - rr->hash_algorithm = i; - - i = extract_integer(&s, "flags"); - if (i < 0) - return NULL; - if (i > 255) - return bitch("bad flags value"); - if (i != 0) - return bitch("flags is supposed to be 0 for NSEC3PARAM"); - rr->flags = i; - - i = extract_integer(&s, "iterations"); - if (i < 0) - return NULL; - if (i > 2500) - return bitch("bad iterations value"); - rr->iterations = i; - /* TODO validate iteration count according to key size, - * as per http://tools.ietf.org/html/rfc5155#section-10.3 */ - - if (*s == '-') { - rr->salt.length = 0; - rr->salt.data = NULL; - s++; - if (*s && !isspace(*s) && *s != ';' && *s != ')') - return bitch("salt is not valid"); - s = skip_white_space(s); - } else { - rr->salt = extract_hex_binary_data(&s, "salt", EXTRACT_DONT_EAT_WHITESPACE); - if (rr->salt.length <= 0) - return NULL; - if (rr->salt.length > 255) - return bitch("salt is too long"); - } - if (*s) { - return bitch("garbage after valid NSEC3PARAM data"); - } + i = extract_integer(&s, "hash algorithm", NULL); + if (i < 0) + return NULL; + if (i > 255) + return bitch("bad hash algorithm value"); + if (i != 1) + return bitch("unrecognized or unsupported hash algorithm"); + rr->hash_algorithm = i; + + i = extract_integer(&s, "flags", NULL); + if (i < 0) + return NULL; + if (i > 255) + return bitch("bad flags value"); + if (i != 0) + return bitch("flags is supposed to be 0 for NSEC3PARAM"); + rr->flags = i; + + i = extract_integer(&s, "iterations", NULL); + if (i < 0) + return NULL; + if (i > 2500) + return bitch("bad iterations value"); + rr->iterations = i; + /* TODO validate iteration count according to key size, + * as per http://tools.ietf.org/html/rfc5155#section-10.3 */ + + if (*s == '-') { + rr->salt.length = 0; + rr->salt.data = NULL; + s++; + if (*s && !isspace(*s) && *s != ';' && *s != ')') + return bitch("salt is not valid"); + s = skip_white_space(s); + } else { + rr->salt = extract_hex_binary_data(&s, "salt", EXTRACT_DONT_EAT_WHITESPACE); + if (rr->salt.length <= 0) + return NULL; + if (rr->salt.length > 255) + return bitch("salt is too long"); + } + if (*s) { + return bitch("garbage after valid NSEC3PARAM data"); + } - G.dnssec_active = 1; + G.dnssec_active = 1; ret_rr = store_record(type, name, ttl, rr); - if (ret_rr && !nsec3param && (ret_rr->rr_set->named_rr->flags & NAME_FLAG_APEX)) - nsec3param = ret_rr; - if (G.opt.policy_checks[POLICY_NSEC3PARAM_NOT_APEX] && - (ret_rr->rr_set->named_rr->flags & NAME_FLAG_APEX) == 0) - { - return bitch("NSEC3PARAM found not at zone apex"); - } - return ret_rr; + if (ret_rr && !nsec3param && (ret_rr->rr_set->named_rr->flags & NAME_FLAG_APEX)) + nsec3param = ret_rr; + if (G.opt.policy_checks[POLICY_NSEC3PARAM_NOT_APEX] && + (ret_rr->rr_set->named_rr->flags & NAME_FLAG_APEX) == 0) + { + return bitch("NSEC3PARAM found not at zone apex"); + } + return ret_rr; } static char* nsec3param_human(struct rr *rrv) { - RRCAST(nsec3param); + RRCAST(nsec3param); char ss[1024]; - char *s = ss; - int l; - int i; + char *s = ss; + int l; + int i; l = snprintf(s, 1024, "%u %u %u ", rr->hash_algorithm, rr->flags, rr->iterations); - s += l; - if (rr->salt.length) { - for (i = 0; i < rr->salt.length; i++) { - l = snprintf(s, 1024-(s-ss), "%02X", (unsigned char)rr->salt.data[i]); - s += l; - } - } else { - sprintf(s, "-"); - } + s += l; + if (rr->salt.length) { + for (i = 0; i < rr->salt.length; i++) { + l = snprintf(s, 1024-(s-ss), "%02X", (unsigned char)rr->salt.data[i]); + s += l; + } + } else { + sprintf(s, "-"); + } return quickstrdup_temp(ss); } static struct binary_data nsec3param_wirerdata(struct rr *rrv) { - RRCAST(nsec3param); + RRCAST(nsec3param); - return compose_binary_data("112b", 1, - rr->hash_algorithm, rr->flags, - rr->iterations, rr->salt); + return compose_binary_data("112b", 1, + rr->hash_algorithm, rr->flags, + rr->iterations, rr->salt); } struct rr_methods nsec3param_methods = { nsec3param_parse, nsec3param_human, nsec3param_wirerdata, NULL, NULL }; diff -Naur validns-0.8/nsec.c validns/nsec.c --- validns-0.8/nsec.c 2014-02-11 15:44:21.000000000 -0500 +++ validns/nsec.c 2020-10-05 16:59:29.355681369 -0400 @@ -1,18 +1,18 @@ /* * Part of DNS zone file validator `validns`. - 604800 NSEC example.com. NS DS RRSIG NSEC - 604800 RRSIG NSEC 10 3 604800 20130321184221 ( - 20130219184221 35615 example.com. - WWg7EiYoY8Hp593I2i5Mkl2ezg7YuAnq0y75 - oymTCuEfGwh4OxbMT/mWNqAFL5Y8f0YoQOOY - wZP0m/sGK/EJN7ulNsfQyULY4WsyHIGlKMwT - KdyDXJLrmrzlmRnGv7pFb0bo53n3osE0uFfH - yMQYOkQRYfqa4yWXF9Nl48dy67frtVih0foy - 9Mm76mmJSDUd/jGsYQmaoFGVU/a64rWapVQ9 - O/mXPqr6Pw2ZCHecsF4ElMEp41YqG1DfR5QR - khTjvTlg4aTKvgX1YuvDhjUygSHit47xn2NC - 2WwEZF+vYXT9DIUCMcKdVeb4bjWwUXbWNFqz - Ca3jb/mpOpUDFnrRPw== ) + 604800 NSEC example.com. NS DS RRSIG NSEC + 604800 RRSIG NSEC 10 3 604800 20130321184221 ( + 20130219184221 35615 example.com. + WWg7EiYoY8Hp593I2i5Mkl2ezg7YuAnq0y75 + oymTCuEfGwh4OxbMT/mWNqAFL5Y8f0YoQOOY + wZP0m/sGK/EJN7ulNsfQyULY4WsyHIGlKMwT + KdyDXJLrmrzlmRnGv7pFb0bo53n3osE0uFfH + yMQYOkQRYfqa4yWXF9Nl48dy67frtVih0foy + 9Mm76mmJSDUd/jGsYQmaoFGVU/a64rWapVQ9 + O/mXPqr6Pw2ZCHecsF4ElMEp41YqG1DfR5QR + khTjvTlg4aTKvgX1YuvDhjUygSHit47xn2NC + 2WwEZF+vYXT9DIUCMcKdVeb4bjWwUXbWNFqz + Ca3jb/mpOpUDFnrRPw== ) * * Copyright 2011-2014 Anton Berezin * Modified BSD license. @@ -35,114 +35,114 @@ static struct rr* nsec_parse(char *name, long ttl, int type, char *s) { struct rr_nsec *rr = getmem(sizeof(*rr)); - struct binary_data bitmap; - char *str_type = NULL; - int ltype; + struct binary_data bitmap; + char *str_type = NULL; + int ltype; rr->next_domain = extract_name(&s, "next domain", KEEP_CAPITALIZATION); - /* TODO: validate next_domain, http://tools.ietf.org/html/rfc4034#section-4.1.1 */ + /* TODO: validate next_domain, http://tools.ietf.org/html/rfc4034#section-4.1.1 */ - bitmap = new_set(); - while (s && *s) { - str_type = extract_label(&s, "type list", "temporary"); - if (!str_type) return NULL; - ltype = str2rdtype(str_type, NULL); - if (ltype < 0) - return NULL; - add_bit_to_set(&bitmap, ltype); - } - if (!s) - return NULL; - if (!str_type) { - return bitch("NSEC type list should not be empty"); - } - rr->type_bitmap = compressed_set(&bitmap); - G.dnssec_active = 1; + bitmap = new_set(); + while (s && *s) { + str_type = extract_label(&s, "type list", "temporary"); + if (!str_type) return NULL; + ltype = str2rdtype(str_type, NULL); + if (ltype < 0) + return NULL; + add_bit_to_set(&bitmap, ltype); + } + if (!s) + return NULL; + if (!str_type) { + return bitch("NSEC type list should not be empty"); + } + rr->type_bitmap = compressed_set(&bitmap); + G.dnssec_active = 1; return store_record(type, name, ttl, rr); } static char* nsec_human(struct rr *rrv) { - RRCAST(nsec); + RRCAST(nsec); char ss[1024]; - char *s = ss; - int l; - char *base; - int i, k; - int type; - char *type_name; + char *s = ss; + int l; + char *base; + int i, k; + int type; + char *type_name; l = snprintf(s, 1024, "%s", rr->next_domain); - s += l; - base = rr->type_bitmap.data; - while (base - rr->type_bitmap.data < rr->type_bitmap.length) { - for (i = 0; i < base[1]; i++) { - for (k = 0; k <= 7; k++) { - if (base[2+i] & (0x80 >> k)) { - type = ((unsigned char)base[0])*256 + i*8 + k; - type_name = rdtype2str(type); - l = snprintf(s, 1024-(s-ss), " %s", type_name); - s += l; - } - } - } - base += base[1]+2; - } + s += l; + base = rr->type_bitmap.data; + while (base - rr->type_bitmap.data < rr->type_bitmap.length) { + for (i = 0; i < base[1]; i++) { + for (k = 0; k <= 7; k++) { + if (base[2+i] & (0x80 >> k)) { + type = ((unsigned char)base[0])*256 + i*8 + k; + type_name = rdtype2str(type); + l = snprintf(s, 1024-(s-ss), " %s", type_name); + s += l; + } + } + } + base += base[1]+2; + } return quickstrdup_temp(ss); } static struct binary_data nsec_wirerdata(struct rr *rrv) { - RRCAST(nsec); + RRCAST(nsec); - return compose_binary_data("dd", 1, - name2wire_name(rr->next_domain), rr->type_bitmap); + return compose_binary_data("dd", 1, + name2wire_name(rr->next_domain), rr->type_bitmap); } static void* nsec_validate(struct rr *rrv) { - RRCAST(nsec); - struct named_rr *named_rr; + RRCAST(nsec); + struct named_rr *named_rr; - named_rr = rr->rr.rr_set->named_rr; - if (!check_typemap(rr->type_bitmap, named_rr, rrv)) - return NULL; + named_rr = rr->rr.rr_set->named_rr; + if (!check_typemap(rr->type_bitmap, named_rr, rrv)) + return NULL; - return rr; + return rr; } void validate_nsec_chain(void) { - struct rr_set *rr_set; - struct named_rr *named_rr; + struct rr_set *rr_set; + struct named_rr *named_rr; - rr_set = find_rr_set(T_NSEC, zone_apex); - if (!rr_set) { - named_rr = find_named_rr(zone_apex); - moan(named_rr->file_name, named_rr->line, "apex NSEC not found"); - return; - } - while (1) { - char name[1024]; - struct rr_nsec *rr = (struct rr_nsec *)rr_set->tail; - char *s, *t; - - if (strcasecmp(rr->next_domain, zone_apex) == 0) /* chain complete */ - break; - freeall_temp(); - s = rr->next_domain; - t = name; - while (*s) *t++ = tolower(*s++); - *t = 0; - rr_set = find_rr_set(T_NSEC, name); - if (!rr_set) { - moan(rr->rr.file_name, rr->rr.line, "broken NSEC chain %s -> %s", - rr->rr.rr_set->named_rr->name, rr->next_domain); - break; - } - } - freeall_temp(); + rr_set = find_rr_set(T_NSEC, zone_apex); + if (!rr_set) { + named_rr = find_named_rr(zone_apex); + moan(named_rr->file_name, named_rr->line, "apex NSEC not found"); + return; + } + while (1) { + char name[1024]; + struct rr_nsec *rr = (struct rr_nsec *)rr_set->tail; + char *s, *t; + + if (strcasecmp(rr->next_domain, zone_apex) == 0) /* chain complete */ + break; + freeall_temp(); + s = rr->next_domain; + t = name; + while (*s) *t++ = tolower(*s++); + *t = 0; + rr_set = find_rr_set(T_NSEC, name); + if (!rr_set) { + moan(rr->rr.file_name, rr->rr.line, "broken NSEC chain %s -> %s", + rr->rr.rr_set->named_rr->name, rr->next_domain); + break; + } + } + freeall_temp(); } struct rr_methods nsec_methods = { nsec_parse, nsec_human, nsec_wirerdata, NULL, nsec_validate }; diff -Naur validns-0.8/PAUL.txt validns/PAUL.txt --- validns-0.8/PAUL.txt 1969-12-31 19:00:00.000000000 -0500 +++ validns/PAUL.txt 2020-10-05 17:00:40.157331142 -0400 @@ -0,0 +1 @@ +new: diff -Naur validns-0.8/ptr.c validns/ptr.c --- validns-0.8/ptr.c 2014-02-11 15:45:36.000000000 -0500 +++ validns/ptr.c 2020-10-05 16:59:29.355681369 -0400 @@ -19,29 +19,29 @@ static struct rr *ptr_parse(char *name, long ttl, int type, char *s) { - struct rr_ptr *rr = getmem(sizeof(*rr)); + struct rr_ptr *rr = getmem(sizeof(*rr)); - rr->ptrdname = extract_name(&s, "name server domain name", 0); - if (!rr->ptrdname) - return NULL; - if (*s) { - return bitch("garbage after valid PTR data"); - } + rr->ptrdname = extract_name(&s, "name server domain name", 0); + if (!rr->ptrdname) + return NULL; + if (*s) { + return bitch("garbage after valid PTR data"); + } - return store_record(type, name, ttl, rr); + return store_record(type, name, ttl, rr); } static char* ptr_human(struct rr *rrv) { - RRCAST(ptr); + RRCAST(ptr); return rr->ptrdname; } static struct binary_data ptr_wirerdata(struct rr *rrv) { - RRCAST(ptr); - return name2wire_name(rr->ptrdname); + RRCAST(ptr); + return name2wire_name(rr->ptrdname); } struct rr_methods ptr_methods = { ptr_parse, ptr_human, ptr_wirerdata, NULL, NULL }; diff -Naur validns-0.8/px.c validns/px.c --- validns-0.8/px.c 2014-02-11 15:46:50.000000000 -0500 +++ validns/px.c 2020-10-05 16:59:29.355681369 -0400 @@ -19,45 +19,45 @@ static struct rr *px_parse(char *name, long ttl, int type, char *s) { - struct rr_px *rr = getmem(sizeof(*rr)); + struct rr_px *rr = getmem(sizeof(*rr)); - rr->preference = extract_integer(&s, "PX preference"); - if (rr->preference < 0) - return NULL; + rr->preference = extract_integer(&s, "PX preference", NULL); + if (rr->preference < 0) + return NULL; - rr->map822 = extract_name(&s, "map822", 0); - if (!rr->map822) - return NULL; + rr->map822 = extract_name(&s, "map822", 0); + if (!rr->map822) + return NULL; - rr->mapx400 = extract_name(&s, "mapx400", 0); - if (!rr->mapx400) - return NULL; + rr->mapx400 = extract_name(&s, "mapx400", 0); + if (!rr->mapx400) + return NULL; - if (*s) { - return bitch("garbage after valid KX data"); - } + if (*s) { + return bitch("garbage after valid KX data"); + } - return store_record(type, name, ttl, rr); + return store_record(type, name, ttl, rr); } static char* px_human(struct rr *rrv) { - RRCAST(px); + RRCAST(px); char s[1024]; snprintf(s, 1024, "%d %s %s", - rr->preference, rr->map822, rr->mapx400); + rr->preference, rr->map822, rr->mapx400); return quickstrdup_temp(s); } static struct binary_data px_wirerdata(struct rr *rrv) { - RRCAST(px); + RRCAST(px); return compose_binary_data("2dd", 1, - rr->preference, - name2wire_name(rr->map822), - name2wire_name(rr->mapx400)); + rr->preference, + name2wire_name(rr->map822), + name2wire_name(rr->mapx400)); } struct rr_methods px_methods = { px_parse, px_human, px_wirerdata, NULL, NULL }; diff -Naur validns-0.8/rp.c validns/rp.c --- validns-0.8/rp.c 2014-02-11 15:45:43.000000000 -0500 +++ validns/rp.c 2020-10-05 16:59:29.355681369 -0400 @@ -20,26 +20,26 @@ static struct rr *rp_parse(char *name, long ttl, int type, char *s) { - struct rr_rp *rr = getmem(sizeof(*rr)); + struct rr_rp *rr = getmem(sizeof(*rr)); - rr->mbox_dname = extract_name(&s, "mbox domain name", 0); - if (!rr->mbox_dname) - return NULL; + rr->mbox_dname = extract_name(&s, "mbox domain name", 0); + if (!rr->mbox_dname) + return NULL; - rr->txt_dname = extract_name(&s, "txt domain name", 0); - if (!rr->txt_dname) - return NULL; + rr->txt_dname = extract_name(&s, "txt domain name", 0); + if (!rr->txt_dname) + return NULL; - if (*s) { - return bitch("garbage after valid RP data"); - } + if (*s) { + return bitch("garbage after valid RP data"); + } - return store_record(type, name, ttl, rr); + return store_record(type, name, ttl, rr); } static char* rp_human(struct rr *rrv) { - RRCAST(rp); + RRCAST(rp); char s[1024]; snprintf(s, 1024, "\"%s\" \"%s\"", rr->mbox_dname, rr->txt_dname); @@ -48,24 +48,24 @@ static struct binary_data rp_wirerdata(struct rr *rrv) { - RRCAST(rp); + RRCAST(rp); - return compose_binary_data("dd", 1, - name2wire_name(rr->mbox_dname), - name2wire_name(rr->txt_dname)); + return compose_binary_data("dd", 1, + name2wire_name(rr->mbox_dname), + name2wire_name(rr->txt_dname)); } static void *rp_validate(struct rr *rrv) { - RRCAST(rp); + RRCAST(rp); - if (G.opt.policy_checks[POLICY_RP_TXT_EXISTS]) { - if (name_belongs_to_zone(rr->txt_dname) && !find_rr_set(T_TXT, rr->txt_dname)) { - return moan(rr->rr.file_name, rr->rr.line, "%s RP TXT %s does not exist", - rr->rr.rr_set->named_rr->name, rr->txt_dname); - } - } - return NULL; + if (G.opt.policy_checks[POLICY_RP_TXT_EXISTS]) { + if (name_belongs_to_zone(rr->txt_dname) && !find_rr_set(T_TXT, rr->txt_dname)) { + return moan(rr->rr.file_name, rr->rr.line, "%s RP TXT %s does not exist", + rr->rr.rr_set->named_rr->name, rr->txt_dname); + } + } + return NULL; } struct rr_methods rp_methods = { rp_parse, rp_human, rp_wirerdata, NULL, rp_validate }; diff -Naur validns-0.8/rr.c validns/rr.c --- validns-0.8/rr.c 2014-02-11 15:45:34.000000000 -0500 +++ validns/rr.c 2020-10-05 16:59:29.355681369 -0400 @@ -20,859 +20,899 @@ #include "cbtree.h" static char* rdtype2str_map[T_MAX+1] = { - "0", - "A", - "NS", - "MD", - "MF", - "CNAME", /* 5 */ - "SOA", - "MB", - "MG", - "MR", - "NULL", /* 10 */ - "WKS", - "PTR", - "HINFO", - "MINFO", - "MX", /* 15 */ - "TXT", - "RP", - "AFSDB", - "X25", - "ISDN", /* 20 */ - "RT", - "NSAP", - "NSAP-PTR", - "SIG", - "KEY", /* 25 */ - "PX", - "GPOS", - "AAAA", - "LOC", - "NXT", /* 30 */ - "EID", - "NIMLOC", - "SRV", - "ATMA", - "NAPTR", /* 35 */ - "KX", - "CERT", - "A6", - "DNAME", - "SINK", /* 40 */ - "OPT", - "APL", - "DS", - "SSHFP", - "IPSECKEY", /* 45 */ - "RRSIG", - "NSEC", - "DNSKEY", - "DHCID", - "NSEC3", /* 50 */ - "NSEC3PARAM", - "TLSA", - 0, 0, 0, 0, 0, 0, 0, 0, /* 60 */ - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* 70 */ - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* 80 */ - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* 90 */ - 0, 0, 0, 0, 0, 0, 0, 0, - "SPF", - 0, /* 100 */ - 0, 0, 0, - "NID", - "L32", - "L64", - "LP", + "0", + "A", + "NS", + "MD", + "MF", + "CNAME", /* 5 */ + "SOA", + "MB", + "MG", + "MR", + "NULL", /* 10 */ + "WKS", + "PTR", + "HINFO", + "MINFO", + "MX", /* 15 */ + "TXT", + "RP", + "AFSDB", + "X25", + "ISDN", /* 20 */ + "RT", + "NSAP", + "NSAP-PTR", + "SIG", + "KEY", /* 25 */ + "PX", + "GPOS", + "AAAA", + "LOC", + "NXT", /* 30 */ + "EID", + "NIMLOC", + "SRV", + "ATMA", + "NAPTR", /* 35 */ + "KX", + "CERT", + "A6", + "DNAME", + "SINK", /* 40 */ + "OPT", + "APL", + "DS", + "SSHFP", + "IPSECKEY", /* 45 */ + "RRSIG", + "NSEC", + "DNSKEY", + "DHCID", + "NSEC3", /* 50 */ + "NSEC3PARAM", + "TLSA", + "SMIMEA", + 0, 0, 0, 0, 0, + "CDS", + "CDNSKEY", /* 60 */ + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* 70 */ + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* 80 */ + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* 90 */ + 0, 0, 0, 0, 0, 0, 0, 0, + "SPF", + 0, /* 100 */ + 0, 0, 0, + "NID", + "L32", + "L64", + "LP", + 0, 0, 0, /* 110 */ + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* 120 */ + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* 130 */ + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* 140 */ + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* 150 */ + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* 160 */ + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* 170 */ + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* 180 */ + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* 190 */ + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* 200 */ + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* 210 */ + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* 220 */ + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* 230 */ + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* 240 */ + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* 250 */ + 0, 0, 0, 0, 0, 0, + "CAA", + 0, 0, 0, /* 260 */ }; struct cbtree zone_data = {NULL}; char *zone_apex = NULL; int zone_apex_l = 0; +int rr_counts[T_MAX+1]; char *rdtype2str(int type) { - char s[10]; - char *r; - if (type < 0 || type > 65535) { - return "???"; - } - if (type > T_MAX) { - sprintf(s, "TYPE%d", type); - return quickstrdup_temp(s); - } - r = rdtype2str_map[type]; - if (r) return r; - if (type == 32769) { - return rdtype2str_map[type] = "DLV"; - } - sprintf(s, "TYPE%d", type); - return quickstrdup_temp(s); + char s[10]; + char *r; + if (type < 0 || type > 65535) { + return "???"; + } + if (type > T_MAX) { + sprintf(s, "TYPE%d", type); + return quickstrdup_temp(s); + } + r = rdtype2str_map[type]; + if (r) return r; + if (type == 32769) { + return rdtype2str_map[type] = "DLV"; + } + sprintf(s, "TYPE%d", type); + return quickstrdup_temp(s); } static unsigned char *name2findable_name(char *s) { - int l = strlen(s); - unsigned char *res = getmem_temp(l+1); - unsigned char *r = res; - int i; - - if (l > 0 && s[l-1] == '.') - l--; - while (--l >= 0) { - i = l; - while (i >= 0 && s[i] != '.') - i--; - memcpy(r, s+i+1, l-i); - r += l-i; - *r = '\x01'; - r++; - l = i; - } - if (r > res) r--; - *r = 0; - return res; + int l = strlen(s); + unsigned char *res = getmem_temp(l+1); + unsigned char *r = res; + int i; + + if (l > 0 && s[l-1] == '.') + l--; + while (--l >= 0) { + i = l; + while (i >= 0 && s[i] != '.') + i--; + memcpy(r, s+i+1, l-i); + r += l-i; + *r = '\x01'; + r++; + l = i; + } + if (r > res) r--; + *r = 0; + return res; } struct binary_data name2wire_name(char *s) { - unsigned char *res = getmem_temp(strlen(s)+2); - unsigned char *r = res; - unsigned char *c = res; - struct binary_data toret; - - r++; - *c = 0; - while (*s) { - if (*s != '.') { - *r++ = *s++; - } else { - *c = (unsigned char)(r-c-1); - c = r; - *c = 0; - r++; - s++; - } - } - *c = (unsigned char)(r-c-1); - toret.length = r-res; - toret.data = (char*)res; - if (toret.length == 2) /* "." is just 00, not 00 00 */ - toret.length = 1; - return toret; + unsigned char *res = getmem_temp(strlen(s)+2); + unsigned char *r = res; + unsigned char *c = res; + struct binary_data toret; + + r++; + *c = 0; + while (*s) { + if (*s != '.') { + *r++ = *s++; + } else { + *c = (unsigned char)(r-c-1); + c = r; + *c = 0; + r++; + s++; + } + } + *c = (unsigned char)(r-c-1); + toret.length = r-res; + toret.data = (char*)res; + if (toret.length == 2) /* "." is just 00, not 00 00 */ + toret.length = 1; + return toret; } static struct named_rr *find_or_create_named_rr(char *name) { - struct named_rr *named_rr = find_named_rr(name); + struct named_rr *named_rr = find_named_rr(name); - if (!named_rr) { - struct named_rr **named_rr_slot; - char *s; - - named_rr = getmem(sizeof(struct named_rr)); - named_rr->name = quickstrdup(name); - named_rr->rr_sets = NULL; - named_rr->line = file_info->line; - named_rr->file_name = file_info->name; - named_rr->flags = 0; - named_rr->parent = NULL; - - if (strchr(name, '/') != NULL) - named_rr->flags |= NAME_FLAG_CONTAINS_SLASH; - - named_rr_slot = (void *)cbtree_insert(&zone_data, (char *)name2findable_name(name)); - if (!named_rr_slot) - croak(2, "find_or_create_named_rr: tree insertion failed"); - if (*named_rr_slot) - croak(3, "find_or_create_named_rr: assertion error, %s should not be there", name); - *named_rr_slot = named_rr; - G.stats.names_count++; - - s = strchr(name, '.'); - if (s && s[1] != '\0') { - named_rr->parent = find_or_create_named_rr(s+1); - } - } + if (!named_rr) { + struct named_rr **named_rr_slot; + char *s; + + named_rr = getmem(sizeof(struct named_rr)); + named_rr->name = quickstrdup(name); + named_rr->rr_sets = NULL; + named_rr->line = file_info->line; + named_rr->file_name = file_info->name; + named_rr->flags = 0; + named_rr->parent = NULL; + + if (strchr(name, '/') != NULL) + named_rr->flags |= NAME_FLAG_CONTAINS_SLASH; + + named_rr_slot = (void *)cbtree_insert(&zone_data, (char *)name2findable_name(name)); + if (!named_rr_slot) + croak(2, "find_or_create_named_rr: tree insertion failed"); + if (*named_rr_slot) + croak(3, "find_or_create_named_rr: assertion error, %s should not be there", name); + *named_rr_slot = named_rr; + G.stats.names_count++; + + s = strchr(name, '.'); + if (s && s[1] != '\0') { + named_rr->parent = find_or_create_named_rr(s+1); + } + } - return named_rr; + return named_rr; } static struct rr_set *find_or_create_rr_set(struct named_rr *named_rr, int rdtype) { - struct rr_set *rr_set = find_rr_set_in_named_rr(named_rr, rdtype); - if (!rr_set) { - struct rr_set **rr_set_slot; - - rr_set = getmem(sizeof(struct rr_set)); - rr_set->head = NULL; - rr_set->tail = NULL; - rr_set->named_rr = named_rr; - rr_set->rdtype = rdtype; - rr_set->count = 0; - - JLI(rr_set_slot, named_rr->rr_sets, rdtype); - if (rr_set_slot == PJERR) - croak(2, "find_or_create_rr_set: JLI failed"); - if (*rr_set_slot) - croak(3, "find_or_create_rr_set: assertion error, %s/%s should not be there", - named_rr->name, rdtype2str(rdtype)); - *rr_set_slot = rr_set; - G.stats.rrset_count++; - } - return rr_set; + struct rr_set *rr_set = find_rr_set_in_named_rr(named_rr, rdtype); + if (!rr_set) { + struct rr_set **rr_set_slot; + + rr_set = getmem(sizeof(struct rr_set)); + rr_set->head = NULL; + rr_set->tail = NULL; + rr_set->named_rr = named_rr; + rr_set->rdtype = rdtype; + rr_set->count = 0; + + JLI(rr_set_slot, named_rr->rr_sets, rdtype); + if (rr_set_slot == PJERR) + croak(2, "find_or_create_rr_set: JLI failed"); + if (*rr_set_slot) + croak(3, "find_or_create_rr_set: assertion error, %s/%s should not be there", + named_rr->name, rdtype2str(rdtype)); + *rr_set_slot = rr_set; + G.stats.rrset_count++; + } + return rr_set; } int name_belongs_to_zone(const char *name) { - int name_l; + int name_l; - name_l = strlen(name); - if (zone_apex && name_l >= zone_apex_l) { - if (strcmp(zone_apex, name+name_l-zone_apex_l) != 0) { - return 0; - } else if (name_l > zone_apex_l && name[name_l-zone_apex_l-1] != '.') { - return 0; - } - } else { - if (zone_apex) { - return 0; - } else { - // XXX this is actually very bad, zone apex is not know - return 0; - } - } - return 1; + name_l = strlen(name); + if (zone_apex && name_l >= zone_apex_l) { + if (strcmp(zone_apex, name+name_l-zone_apex_l) != 0) { + return 0; + } else if (name_l > zone_apex_l && name[name_l-zone_apex_l-1] != '.') { + return 0; + } + } else { + if (zone_apex) { + return 0; + } else { + // XXX this is actually very bad, zone apex is not know + return 0; + } + } + return 1; } struct binary_data call_get_wired(struct rr *rr) { - rr_wire_func get_wired; + rr_wire_func get_wired; - if (rr->rdtype > T_MAX || rr->is_generic) - get_wired = any_wirerdata; - else - get_wired = rr_methods[rr->rdtype].rr_wire; - if (!get_wired) return bad_binary_data(); - return get_wired(rr); + if (rr->rdtype > T_MAX || rr->is_generic) + get_wired = any_wirerdata; + else + get_wired = rr_methods[rr->rdtype].rr_wire; + if (!get_wired) return bad_binary_data(); + return get_wired(rr); } struct rr *store_record(int rdtype, char *name, long ttl, void *rrptr) { - struct rr *rr = rrptr; - struct named_rr *named_rr; - struct rr_set *rr_set; - int name_l; - int apex_assigned = 0; - int is_generic = 0; - - if (rdtype < 0) { - rdtype = -rdtype; - is_generic = 1; - } - name_l = strlen(name); - if (name_l > 511) - return bitch("name is too long: %s", name); - - if (G.stats.rr_count == 0) { - if (rdtype != T_SOA) { - return bitch("the first record in the zone must be an SOA record"); - } else { - zone_apex = name; - zone_apex_l = name_l; - apex_assigned = 1; - } - } - if (zone_apex && name_l >= zone_apex_l) { - if (strcmp(zone_apex, name+name_l-zone_apex_l) != 0) { - return bitch("%s does not belong to zone %s", name, zone_apex); - } else if (name_l > zone_apex_l && name[name_l-zone_apex_l-1] != '.') { - return bitch("%s does not belong to zone %s", name, zone_apex); - } - } else { - if (zone_apex) { - return bitch("%s does not belong to zone %s", name, zone_apex); - } else { - croakx(3, "assertion error: %s does not belong to a zone", name); - } - } - - named_rr = find_or_create_named_rr(name); - if (apex_assigned) { - named_rr->flags |= NAME_FLAG_APEX; - } - rr_set = find_or_create_rr_set(named_rr, rdtype); - - rr->rdtype = rdtype; - rr->ttl = ttl; - rr->line = file_info->line; - rr->file_name = file_info->name; - rr->is_generic = is_generic; - - if (rr_set->count > 0) { - struct binary_data new_d, old_d; - struct rr *old_rr; - - new_d = call_get_wired(rr); - if (new_d.length < 0) goto after_dup_check; - - old_rr = rr_set->tail; - while (old_rr) { - old_d = call_get_wired(old_rr); - if (old_d.length == new_d.length && - memcmp(old_d.data, new_d.data, old_d.length) == 0) - { - G.stats.skipped_dup_rr_count++; - return old_rr; - } - old_rr = old_rr->next; - } - } + struct rr *rr = rrptr; + struct named_rr *named_rr; + struct rr_set *rr_set; + int name_l; + int apex_assigned = 0; + int is_generic = 0; + + if (rdtype < 0) { + rdtype = -rdtype; + is_generic = 1; + } + name_l = strlen(name); + if (name_l > 511) + return bitch("name is too long: %s", name); + + if (G.stats.rr_count == 0) { + if (rdtype != T_SOA) { + return bitch("the first record in the zone must be an SOA record"); + } else { + zone_apex = name; + zone_apex_l = name_l; + apex_assigned = 1; + } + } + if (zone_apex && name_l >= zone_apex_l) { + if (strcmp(zone_apex, name+name_l-zone_apex_l) != 0) { + return bitch("%s does not belong to zone %s", name, zone_apex); + } else if (name_l > zone_apex_l && name[name_l-zone_apex_l-1] != '.') { + return bitch("%s does not belong to zone %s", name, zone_apex); + } + } else { + if (zone_apex) { + return bitch("%s does not belong to zone %s", name, zone_apex); + } else { + croakx(3, "assertion error: %s does not belong to a zone", name); + } + } + + named_rr = find_or_create_named_rr(name); + if (apex_assigned) { + named_rr->flags |= NAME_FLAG_APEX; + } + rr_set = find_or_create_rr_set(named_rr, rdtype); + + rr->rdtype = rdtype; + rr->ttl = ttl; + rr->line = file_info->line; + rr->file_name = file_info->name; + rr->is_generic = is_generic; + + if (rr_set->count > 0) { + struct binary_data new_d, old_d; + struct rr *old_rr; + + new_d = call_get_wired(rr); + if (new_d.length < 0) goto after_dup_check; + + old_rr = rr_set->tail; + while (old_rr) { + old_d = call_get_wired(old_rr); + if (old_d.length == new_d.length && + memcmp(old_d.data, new_d.data, old_d.length) == 0) + { + G.stats.skipped_dup_rr_count++; + return old_rr; + } + old_rr = old_rr->next; + } + } after_dup_check: - if (rdtype == T_SOA) { - if (G.stats.soa_rr_count++) { - return bitch("there could only be one SOA in a zone"); - } - } - - rr->rr_set = rr_set; - rr->next = NULL; - rr->prev = rr_set->head; - rr_set->head = rr; - if (rr->prev) - rr->prev->next = rr; - if (!rr_set->tail) - rr_set->tail = rr; - - rr_set->count++; - - if (G.opt.verbose) { - char *rdata; - if (rdtype > T_MAX) - rdata = any_human(rr); - else - rdata = rr_methods[rdtype].rr_human(rr); - fprintf(stderr, "-> %s:%d: %s IN %ld %s", - file_info->name, file_info->line, - name, ttl, rdtype2str(rdtype)); - if (rdata) { - fprintf(stderr, " %s\n", rdata); - } else { - fprintf(stderr, "\n"); - } - } + if (rdtype == T_SOA) { + if (G.stats.soa_rr_count++) { + return bitch("there could only be one SOA in a zone"); + } + } + + rr->rr_set = rr_set; + rr->next = NULL; + rr->prev = rr_set->head; + rr_set->head = rr; + if (rr->prev) + rr->prev->next = rr; + if (!rr_set->tail) + rr_set->tail = rr; + + rr_set->count++; + + if (G.opt.verbose) { + char *rdata; + if (rdtype > T_MAX) + rdata = any_human(rr); + else + rdata = rr_methods[rdtype].rr_human(rr); + fprintf(stderr, "-> %s:%d: %s IN %ld %s", + file_info->name, file_info->line, + name, ttl, rdtype2str(rdtype)); + if (rdata) { + fprintf(stderr, " %s\n", rdata); + } else { + fprintf(stderr, "\n"); + } + } - G.stats.rr_count++; - named_rr->flags |= NAME_FLAG_HAS_RECORDS; + G.stats.rr_count++; + named_rr->flags |= NAME_FLAG_HAS_RECORDS; - return rr; + return rr; } struct named_rr *find_named_rr(char *name) { - struct named_rr **named_rr_slot; + struct named_rr **named_rr_slot; - named_rr_slot = (void*) cbtree_find(&zone_data, (char *)name2findable_name(name)); - if (named_rr_slot) - return *named_rr_slot; - return NULL; + named_rr_slot = (void*) cbtree_find(&zone_data, (char *)name2findable_name(name)); + if (named_rr_slot) + return *named_rr_slot; + return NULL; } struct named_rr *find_next_named_rr(struct named_rr *named_rr) { - struct named_rr *res; + struct named_rr *res; - if (cbtree_next(&zone_data, (char *)name2findable_name(named_rr->name), (intptr_t *)&res) == NULL) - return NULL; + if (cbtree_next(&zone_data, (char *)name2findable_name(named_rr->name), (intptr_t *)&res) == NULL) + return NULL; - return res; + return res; } struct rr_set *find_rr_set(int rdtype, char *name) { - struct named_rr *named_rr; + struct named_rr *named_rr; - named_rr = find_named_rr(name); - if (!named_rr) - return NULL; + named_rr = find_named_rr(name); + if (!named_rr) + return NULL; - return find_rr_set_in_named_rr(named_rr, rdtype); + return find_rr_set_in_named_rr(named_rr, rdtype); } struct rr_set *find_rr_set_in_named_rr(struct named_rr *named_rr, int rdtype) { - struct rr_set **rr_set_slot; + struct rr_set **rr_set_slot; - JLG(rr_set_slot, named_rr->rr_sets, rdtype); - if (rr_set_slot) - return *rr_set_slot; - return NULL; + JLG(rr_set_slot, named_rr->rr_sets, rdtype); + if (rr_set_slot) + return *rr_set_slot; + return NULL; } uint32_t get_rr_set_count(struct named_rr *named_rr) { - uint32_t count; - JLC(count, named_rr->rr_sets, 0, -1); - return count; + uint32_t count; + JLC(count, named_rr->rr_sets, 0, -1); + return count; } struct rr *rr_parse_any(char *name, long ttl, int type, char *s) { - struct rr_any *rr = getmem(sizeof(*rr)); - long long len; + struct rr_any *rr = getmem(sizeof(*rr)); + long long len; - if (*s++ != '\\') { + if (*s++ != '\\') { invalid: - return bitch("invalid custom type rdata"); - } - if (*s++ != '#') - goto invalid; - if (*s && !isspace(*s) && *s != ';' && *s != ')') - goto invalid; - s = skip_white_space(s); - if (!s) return NULL; - - len = extract_integer(&s, "custom data size"); - if (len < 0) return NULL; - if (len > 65535) goto invalid; - - rr->data = extract_hex_binary_data(&s, "custom data", EXTRACT_EAT_WHITESPACE); - if (rr->data.length < 0) return NULL; - if (rr->data.length != len) - return bitch("custom data is longer than specified"); - - if (*s) { - return bitch("garbage after valid %s data", rdtype2str(type)); - } + return bitch("invalid custom type rdata"); + } + if (*s++ != '#') + goto invalid; + if (*s && !isspace(*s) && *s != ';' && *s != ')') + goto invalid; + s = skip_white_space(s); + if (!s) return NULL; + + len = extract_integer(&s, "custom data size", NULL); + if (len < 0) return NULL; + if (len > 65535) goto invalid; + + rr->data = extract_hex_binary_data(&s, "custom data", EXTRACT_EAT_WHITESPACE); + if (rr->data.length < 0) return NULL; + if (rr->data.length != len) + return bitch("custom data is longer than specified"); + + if (*s) { + return bitch("garbage after valid %s data", rdtype2str(type)); + } - return store_record(-type, name, ttl, rr); + return store_record(-type, name, ttl, rr); } char* any_human(struct rr *rrv) { - RRCAST(any); - char buf[80]; + RRCAST(any); + char buf[80]; - sprintf(buf, "\\# %d ...", rr->data.length); - return quickstrdup_temp(buf); + sprintf(buf, "\\# %d ...", rr->data.length); + return quickstrdup_temp(buf); } struct binary_data any_wirerdata(struct rr *rrv) { - RRCAST(any); + RRCAST(any); - return compose_binary_data("d", 1, rr->data); + return compose_binary_data("d", 1, rr->data); } struct rr_methods unknown_methods = { NULL, any_human, any_wirerdata, NULL, NULL }; int str2rdtype(char *rdtype, int *is_generic) { - if (!rdtype) return -1; - if (is_generic) *is_generic = 0; - switch (*rdtype) { - case 'a': - if (strcmp(rdtype, "a") == 0) { - return T_A; - } else if (strcmp(rdtype, "aaaa") == 0) { - return T_AAAA; - } else if (strcmp(rdtype, "afsdb") == 0) { - return T_AFSDB; - } - break; - case 'c': - if (strcmp(rdtype, "cname") == 0) { - return T_CNAME; - } else if (strcmp(rdtype, "cert") == 0) { - return T_CERT; - } - break; - case 'd': - if (strcmp(rdtype, "ds") == 0) { - return T_DS; - } else if (strcmp(rdtype, "dnskey") == 0) { - return T_DNSKEY; - } else if (strcmp(rdtype, "dname") == 0) { - return T_DNAME; - } else if (strcmp(rdtype, "dlv") == 0) { - return T_DLV; - } else if (strcmp(rdtype, "dhcid") == 0) { - return T_DHCID; - } - break; - case 'h': - if (strcmp(rdtype, "hinfo") == 0) { - return T_HINFO; - } - break; - case 'i': - if (strcmp(rdtype, "ipseckey") == 0) { - return T_IPSECKEY; - } else if (strcmp(rdtype, "isdn") == 0) { - return T_ISDN; - } - break; - case 'k': - if (strcmp(rdtype, "kx") == 0) { - return T_KX; - } - break; - case 'l': - if (strcmp(rdtype, "loc") == 0) { - return T_LOC; - } else if (strcmp(rdtype, "l32") == 0) { - return T_L32; - } else if (strcmp(rdtype, "l64") == 0) { - return T_L64; - } else if (strcmp(rdtype, "lp") == 0) { - return T_LP; - } - break; - case 'm': - if (strcmp(rdtype, "mx") == 0) { - return T_MX; - } else if (strcmp(rdtype, "mb") == 0) { - return T_MB; - } else if (strcmp(rdtype, "mg") == 0) { - return T_MG; - } else if (strcmp(rdtype, "minfo") == 0) { - return T_MINFO; - } else if (strcmp(rdtype, "mr") == 0) { - return T_MR; - } - break; - case 'n': - if (strcmp(rdtype, "ns") == 0) { - return T_NS; - } else if (strcmp(rdtype, "naptr") == 0) { - return T_NAPTR; - } else if (strcmp(rdtype, "nsec") == 0) { - return T_NSEC; - } else if (strcmp(rdtype, "nsec3") == 0) { - return T_NSEC3; - } else if (strcmp(rdtype, "nid") == 0) { - return T_NID; - } else if (strcmp(rdtype, "nsec3param") == 0) { - return T_NSEC3PARAM; - } else if (strcmp(rdtype, "nsap") == 0) { - return T_NSAP; - } - break; - case 'p': - if (strcmp(rdtype, "ptr") == 0) { - return T_PTR; - } else if (strcmp(rdtype, "px") == 0) { - return T_PX; - } - break; - case 'r': - if (strcmp(rdtype, "rrsig") == 0) { - return T_RRSIG; - } else if (strcmp(rdtype, "rp") == 0) { - return T_RP; - } else if (strcmp(rdtype, "rt") == 0) { - return T_RT; - } - break; - case 's': - if (strcmp(rdtype, "soa") == 0) { - return T_SOA; - } else if (strcmp(rdtype, "srv") == 0) { - return T_SRV; - } else if (strcmp(rdtype, "spf") == 0) { - return T_SPF; - } else if (strcmp(rdtype, "sshfp") == 0) { - return T_SSHFP; - } - break; - case 't': - if (strcmp(rdtype, "txt") == 0) { - return T_TXT; - } else if (strcmp(rdtype, "tlsa") == 0) { - return T_TLSA; - } else if (strncmp(rdtype, "type", 4) == 0) { - long type = strtol(rdtype+4, NULL, 10); - if (is_generic) *is_generic = 1; - if (type <= 0 || type > 65535) - bitch("invalid rdtype %s", rdtype); - return type; - } - break; - case 'x': - if (strcmp(rdtype, "x25") == 0) { - return T_X25; - } - break; - } - bitch("invalid or unsupported rdtype %s", rdtype); - return -1; + if (!rdtype) return -1; + if (is_generic) *is_generic = 0; + switch (*rdtype) { + case 'a': + if (strcmp(rdtype, "a") == 0) { + return T_A; + } else if (strcmp(rdtype, "aaaa") == 0) { + return T_AAAA; + } else if (strcmp(rdtype, "afsdb") == 0) { + return T_AFSDB; + } + break; + case 'c': + if (strcmp(rdtype, "cname") == 0) { + return T_CNAME; + } else if (strcmp(rdtype, "cert") == 0) { + return T_CERT; + } else if (strcmp(rdtype, "caa") == 0) { + return T_CAA; + } else if (strcmp(rdtype, "cds") == 0) { + return T_CDS; + } else if (strcmp(rdtype, "cdnskey") == 0) { + return T_CDNSKEY; + } + break; + case 'd': + if (strcmp(rdtype, "ds") == 0) { + return T_DS; + } else if (strcmp(rdtype, "dnskey") == 0) { + return T_DNSKEY; + } else if (strcmp(rdtype, "dname") == 0) { + return T_DNAME; + } else if (strcmp(rdtype, "dlv") == 0) { + return T_DLV; + } else if (strcmp(rdtype, "dhcid") == 0) { + return T_DHCID; + } + break; + case 'h': + if (strcmp(rdtype, "hinfo") == 0) { + return T_HINFO; + } + break; + case 'i': + if (strcmp(rdtype, "ipseckey") == 0) { + return T_IPSECKEY; + } else if (strcmp(rdtype, "isdn") == 0) { + return T_ISDN; + } + break; + case 'k': + if (strcmp(rdtype, "kx") == 0) { + return T_KX; + } + break; + case 'l': + if (strcmp(rdtype, "loc") == 0) { + return T_LOC; + } else if (strcmp(rdtype, "l32") == 0) { + return T_L32; + } else if (strcmp(rdtype, "l64") == 0) { + return T_L64; + } else if (strcmp(rdtype, "lp") == 0) { + return T_LP; + } + break; + case 'm': + if (strcmp(rdtype, "mx") == 0) { + return T_MX; + } else if (strcmp(rdtype, "mb") == 0) { + return T_MB; + } else if (strcmp(rdtype, "mg") == 0) { + return T_MG; + } else if (strcmp(rdtype, "minfo") == 0) { + return T_MINFO; + } else if (strcmp(rdtype, "mr") == 0) { + return T_MR; + } + break; + case 'n': + if (strcmp(rdtype, "ns") == 0) { + return T_NS; + } else if (strcmp(rdtype, "naptr") == 0) { + return T_NAPTR; + } else if (strcmp(rdtype, "nsec") == 0) { + return T_NSEC; + } else if (strcmp(rdtype, "nsec3") == 0) { + return T_NSEC3; + } else if (strcmp(rdtype, "nid") == 0) { + return T_NID; + } else if (strcmp(rdtype, "nsec3param") == 0) { + return T_NSEC3PARAM; + } else if (strcmp(rdtype, "nsap") == 0) { + return T_NSAP; + } + break; + case 'p': + if (strcmp(rdtype, "ptr") == 0) { + return T_PTR; + } else if (strcmp(rdtype, "px") == 0) { + return T_PX; + } + break; + case 'r': + if (strcmp(rdtype, "rrsig") == 0) { + return T_RRSIG; + } else if (strcmp(rdtype, "rp") == 0) { + return T_RP; + } else if (strcmp(rdtype, "rt") == 0) { + return T_RT; + } + break; + case 's': + if (strcmp(rdtype, "soa") == 0) { + return T_SOA; + } else if (strcmp(rdtype, "srv") == 0) { + return T_SRV; + } else if (strcmp(rdtype, "spf") == 0) { + return T_SPF; + } else if (strcmp(rdtype, "sshfp") == 0) { + return T_SSHFP; + } else if (strcmp(rdtype, "smimea") == 0) { + return T_SMIMEA; + } + break; + case 't': + if (strcmp(rdtype, "txt") == 0) { + return T_TXT; + } else if (strcmp(rdtype, "tlsa") == 0) { + return T_TLSA; + } else if (strncmp(rdtype, "type", 4) == 0) { + long type = strtol(rdtype+4, NULL, 10); + if (is_generic) *is_generic = 1; + if (type <= 0 || type > 65535) + bitch("invalid rdtype %s", rdtype); + return type; + } + break; + case 'x': + if (strcmp(rdtype, "x25") == 0) { + return T_X25; + } + break; + } + bitch("invalid or unsupported rdtype %s", rdtype); + return -1; } void validate_rrset(struct rr_set *rr_set) { - struct rr *rr; - int ttl; + struct rr *rr; + int ttl; - /* This can happen when rr_set was allocated but - * nothing was added to it due to an error. */ - if (rr_set->count == 0) return; - rr = rr_set->tail; - if (!rr) { - croakx(4, "assertion failed: %s %s is null, but count is %d", - rdtype2str(rr_set->rdtype), rr_set->named_rr->name, - rr_set->count); - } - if (rr_set->rdtype < T_MAX && rr_methods[rr_set->rdtype].rr_validate_set) - rr_methods[rr_set->rdtype].rr_validate_set(rr_set); - ttl = rr->ttl; - - while (rr) { - validate_record(rr); - if (ttl != rr->ttl) { - if (rr->rdtype != T_RRSIG) /* RRSIG is an exception */ - moan(rr->file_name, rr->line, "TTL values differ within an RR set"); - } - rr = rr->next; - } + /* This can happen when rr_set was allocated but + * nothing was added to it due to an error. */ + if (rr_set->count == 0) return; + rr = rr_set->tail; + if (!rr) { + croakx(4, "assertion failed: %s %s is null, but count is %d", + rdtype2str(rr_set->rdtype), rr_set->named_rr->name, + rr_set->count); + } + if (rr_set->rdtype < T_MAX && rr_methods[rr_set->rdtype].rr_validate_set) + rr_methods[rr_set->rdtype].rr_validate_set(rr_set); + ttl = rr->ttl; + + while (rr) { + validate_record(rr); + if (ttl != rr->ttl) { + if (rr->rdtype != T_RRSIG) /* RRSIG is an exception */ + moan(rr->file_name, rr->line, "TTL values differ within an RR set"); + } + rr = rr->next; + } } void debug(struct named_rr *named_rr, char *s) { - fprintf(stderr, "%s %s", s, named_rr->name); - if ((named_rr->flags & NAME_FLAG_APEX)) - fprintf(stderr, ", apex"); - if ((named_rr->flags & NAME_FLAG_HAS_RECORDS)) - fprintf(stderr, ", has records"); - if ((named_rr->flags & NAME_FLAG_DELEGATION)) - fprintf(stderr, ", delegation"); - if ((named_rr->flags & NAME_FLAG_NOT_AUTHORITATIVE)) - fprintf(stderr, ", not auth"); - if ((named_rr->flags & NAME_FLAG_NSEC3_ONLY)) - fprintf(stderr, ", nsec3 only"); - if ((named_rr->flags & NAME_FLAG_KIDS_WITH_RECORDS)) - fprintf(stderr, ", kid records"); - if ((named_rr->flags & NAME_FLAG_SIGNED_DELEGATION)) - fprintf(stderr, ", signed delegation"); - if ((named_rr->flags & NAME_FLAG_APEX_PARENT)) - fprintf(stderr, ", apex parent"); - fprintf(stderr, "\n"); + fprintf(stderr, "%s %s", s, named_rr->name); + if ((named_rr->flags & NAME_FLAG_APEX)) + fprintf(stderr, ", apex"); + if ((named_rr->flags & NAME_FLAG_HAS_RECORDS)) + fprintf(stderr, ", has records"); + if ((named_rr->flags & NAME_FLAG_DELEGATION)) + fprintf(stderr, ", delegation"); + if ((named_rr->flags & NAME_FLAG_NOT_AUTHORITATIVE)) + fprintf(stderr, ", not auth"); + if ((named_rr->flags & NAME_FLAG_NSEC3_ONLY)) + fprintf(stderr, ", nsec3 only"); + if ((named_rr->flags & NAME_FLAG_KIDS_WITH_RECORDS)) + fprintf(stderr, ", kid records"); + if ((named_rr->flags & NAME_FLAG_SIGNED_DELEGATION)) + fprintf(stderr, ", signed delegation"); + if ((named_rr->flags & NAME_FLAG_APEX_PARENT)) + fprintf(stderr, ", apex parent"); + fprintf(stderr, "\n"); } static int validate_named_rr(const char *name, intptr_t *data, void *p) { - struct named_rr *named_rr = *((struct named_rr **)data); - Word_t rdtype; - struct rr_set **rr_set_p; - int nsec3_present = 0; - int nsec3_only = 1; - static int seen_apex = 0; - - if ((named_rr->flags & NAME_FLAG_APEX)) - seen_apex = 1; - if (!seen_apex) - named_rr->flags |= NAME_FLAG_APEX_PARENT; - - if (named_rr->parent && (named_rr->parent->flags & (NAME_FLAG_DELEGATION|NAME_FLAG_NOT_AUTHORITATIVE)) != 0) { - named_rr->flags |= NAME_FLAG_NOT_AUTHORITATIVE; - if ((named_rr->flags & NAME_FLAG_HAS_RECORDS) != 0) { - G.stats.not_authoritative++; - } - } - - if (G.nsec3_opt_out_present && (named_rr->flags & NAME_FLAG_DELEGATION)) { - JLG(rr_set_p, named_rr->rr_sets, T_DS); - if (!rr_set_p) - named_rr->flags |= NAME_FLAG_NOT_AUTHORITATIVE; - } + struct named_rr *named_rr = *((struct named_rr **)data); + Word_t rdtype; + struct rr_set **rr_set_p; + int nsec3_present = 0; + int nsec3_only = 1; + static int seen_apex = 0; + + if ((named_rr->flags & NAME_FLAG_APEX)) + seen_apex = 1; + if (!seen_apex) + named_rr->flags |= NAME_FLAG_APEX_PARENT; + + if (named_rr->parent && (named_rr->parent->flags & (NAME_FLAG_DELEGATION|NAME_FLAG_NOT_AUTHORITATIVE)) != 0) { + named_rr->flags |= NAME_FLAG_NOT_AUTHORITATIVE; + if ((named_rr->flags & NAME_FLAG_HAS_RECORDS) != 0) { + G.stats.not_authoritative++; + } + } + + if (G.nsec3_opt_out_present && (named_rr->flags & NAME_FLAG_DELEGATION)) { + JLG(rr_set_p, named_rr->rr_sets, T_DS); + if (!rr_set_p) + named_rr->flags |= NAME_FLAG_NOT_AUTHORITATIVE; + } //debug(named_rr, ">>>>"); - rdtype = 0; - JLF(rr_set_p, named_rr->rr_sets, rdtype); + rdtype = 0; + JLF(rr_set_p, named_rr->rr_sets, rdtype); - while (rr_set_p) { - validate_rrset(*rr_set_p); - if (rdtype == T_NSEC3) - nsec3_present = 1; - else if (rdtype != T_RRSIG) - nsec3_only = 0; - if (rdtype != T_NSEC3 && rdtype != T_RRSIG && rdtype != T_NS) - named_rr->flags |= NAME_FLAG_THIS_WITH_RECORDS; - if ((named_rr->flags & NAME_FLAG_NOT_AUTHORITATIVE) == 0 && - rdtype != T_NS && rdtype != T_NSEC3 && rdtype != T_RRSIG) - { - struct named_rr *nrr = named_rr; - int skip_first = rdtype == T_NS; - - while (nrr && (nrr->flags & NAME_FLAG_KIDS_WITH_RECORDS) == 0) { - if ((nrr->flags & NAME_FLAG_APEX_PARENT) || strlen(nrr->name) < zone_apex_l) { - nrr->flags |= NAME_FLAG_APEX_PARENT; - break; - } - if (!skip_first) - nrr->flags |= NAME_FLAG_KIDS_WITH_RECORDS; - skip_first = 0; - nrr = nrr->parent; - } - } - if (rdtype == T_DS) { - struct named_rr *nrr = named_rr; - while (nrr && (nrr->flags & (NAME_FLAG_DELEGATION|NAME_FLAG_NOT_AUTHORITATIVE)) != 0) { - // nrr->flags &= ~(NAME_FLAG_DELEGATION|NAME_FLAG_NOT_AUTHORITATIVE); - nrr->flags |= NAME_FLAG_SIGNED_DELEGATION; - nrr = nrr->parent; - } - } - JLN(rr_set_p, named_rr->rr_sets, rdtype); - } - if (nsec3_present && nsec3_only) { - named_rr->flags |= NAME_FLAG_NSEC3_ONLY; - } - return 1; + while (rr_set_p) { + validate_rrset(*rr_set_p); + if (rdtype == T_NSEC3) + nsec3_present = 1; + else if (rdtype != T_RRSIG) + nsec3_only = 0; + if (rdtype != T_NSEC3 && rdtype != T_RRSIG && rdtype != T_NS) + named_rr->flags |= NAME_FLAG_THIS_WITH_RECORDS; + if ((named_rr->flags & NAME_FLAG_NOT_AUTHORITATIVE) == 0 && + rdtype != T_NS && rdtype != T_NSEC3 && rdtype != T_RRSIG) + { + struct named_rr *nrr = named_rr; + int skip_first = rdtype == T_NS; + + while (nrr && (nrr->flags & NAME_FLAG_KIDS_WITH_RECORDS) == 0) { + if ((nrr->flags & NAME_FLAG_APEX_PARENT) || strlen(nrr->name) < zone_apex_l) { + nrr->flags |= NAME_FLAG_APEX_PARENT; + break; + } + if (!skip_first) + nrr->flags |= NAME_FLAG_KIDS_WITH_RECORDS; + skip_first = 0; + nrr = nrr->parent; + } + } + if (rdtype == T_DS) { + struct named_rr *nrr = named_rr; + while (nrr && (nrr->flags & (NAME_FLAG_DELEGATION|NAME_FLAG_NOT_AUTHORITATIVE)) != 0) { + // nrr->flags &= ~(NAME_FLAG_DELEGATION|NAME_FLAG_NOT_AUTHORITATIVE); + nrr->flags |= NAME_FLAG_SIGNED_DELEGATION; + nrr = nrr->parent; + } + } + JLN(rr_set_p, named_rr->rr_sets, rdtype); + } + if (nsec3_present && nsec3_only) { + named_rr->flags |= NAME_FLAG_NSEC3_ONLY; + } + return 1; } static void* nsec_validate_pass2(struct rr *rrv) { - RRCAST(nsec); - struct named_rr *named_rr, *next_named_rr; + RRCAST(nsec); + struct named_rr *named_rr, *next_named_rr; - named_rr = rr->rr.rr_set->named_rr; - next_named_rr = find_next_named_rr(named_rr); - /* Skip empty non-terminals and not authoritative records from consideration */ - while (next_named_rr) { - if ((next_named_rr->flags & NAME_FLAG_HAS_RECORDS) == 0) { - next_named_rr = find_next_named_rr(next_named_rr); - continue; - } - if (next_named_rr->parent && - (next_named_rr->parent->flags & (NAME_FLAG_DELEGATION|NAME_FLAG_NOT_AUTHORITATIVE)) != 0) - { - named_rr->flags |= NAME_FLAG_NOT_AUTHORITATIVE; - next_named_rr = find_next_named_rr(next_named_rr); - continue; - } - break; - } - - if (strcasecmp(rr->next_domain, zone_apex) == 0) { - if (next_named_rr) { - return moan(rr->rr.file_name, rr->rr.line, "NSEC says %s is the last name, but %s exists", - named_rr->name, next_named_rr->name); - } - } else { - if (!next_named_rr) { - return moan(rr->rr.file_name, rr->rr.line, "NSEC says %s comes after %s, but nothing does", - rr->next_domain, named_rr->name); - } else if (strcasecmp(rr->next_domain, next_named_rr->name) != 0) { - return moan(rr->rr.file_name, rr->rr.line, "NSEC says %s comes after %s, but %s does", - rr->next_domain, named_rr->name, next_named_rr->name); - } - } + named_rr = rr->rr.rr_set->named_rr; + next_named_rr = find_next_named_rr(named_rr); + /* Skip empty non-terminals and not authoritative records from consideration */ + while (next_named_rr) { + if ((next_named_rr->flags & NAME_FLAG_HAS_RECORDS) == 0) { + next_named_rr = find_next_named_rr(next_named_rr); + continue; + } + if (next_named_rr->parent && + (next_named_rr->parent->flags & (NAME_FLAG_DELEGATION|NAME_FLAG_NOT_AUTHORITATIVE)) != 0) + { + named_rr->flags |= NAME_FLAG_NOT_AUTHORITATIVE; + next_named_rr = find_next_named_rr(next_named_rr); + continue; + } + break; + } + + if (strcasecmp(rr->next_domain, zone_apex) == 0) { + if (next_named_rr) { + return moan(rr->rr.file_name, rr->rr.line, "NSEC says %s is the last name, but %s exists", + named_rr->name, next_named_rr->name); + } + } else { + if (!next_named_rr) { + return moan(rr->rr.file_name, rr->rr.line, "NSEC says %s comes after %s, but nothing does", + rr->next_domain, named_rr->name); + } else if (strcasecmp(rr->next_domain, next_named_rr->name) != 0) { + return moan(rr->rr.file_name, rr->rr.line, "NSEC says %s comes after %s, but %s does", + rr->next_domain, named_rr->name, next_named_rr->name); + } + } - /* TODO: more checks */ - return rr; + /* TODO: more checks */ + return rr; } static int second_pass_one_name(const char *name, intptr_t *data, void *p) { - struct named_rr *named_rr = *((struct named_rr **)data); - struct rr_set **rr_set_p; + struct named_rr *named_rr = *((struct named_rr **)data); + struct rr_set **rr_set_p; - freeall_temp(); - JLG(rr_set_p, named_rr->rr_sets, T_NSEC); - if (rr_set_p && (*rr_set_p)->tail) { - nsec_validate_pass2((*rr_set_p)->tail); - } - return 1; + freeall_temp(); + JLG(rr_set_p, named_rr->rr_sets, T_NSEC); + if (rr_set_p && (*rr_set_p)->tail) { + nsec_validate_pass2((*rr_set_p)->tail); + } + return 1; } void validate_zone(void) { - cbtree_allprefixed(&zone_data, "", validate_named_rr, NULL); - cbtree_allprefixed(&zone_data, "", second_pass_one_name, NULL); + cbtree_allprefixed(&zone_data, "", validate_named_rr, NULL); + cbtree_allprefixed(&zone_data, "", second_pass_one_name, NULL); - if (G.dnssec_active && !G.nsec3_present) - validate_nsec_chain(); + if (G.dnssec_active && !G.nsec3_present) + validate_nsec_chain(); } void validate_record(struct rr *rr) { - freeall_temp(); - if (!rr->is_generic && rr->rdtype < T_MAX && rr_methods[rr->rdtype].rr_validate) - rr_methods[rr->rdtype].rr_validate(rr); + freeall_temp(); + if (!rr->is_generic && rr->rdtype <= T_MAX) + rr_counts[rr->rdtype]++; + if (!rr->is_generic && rr->rdtype <= T_MAX && rr_methods[rr->rdtype].rr_validate) + rr_methods[rr->rdtype].rr_validate(rr); } int extract_algorithm(char **s, char *what) { - int alg; - char *str_alg; + int alg; + char *str_alg; - if (isdigit(**s)) { - alg = extract_integer(s, what); - if (algorithm_type(alg) == ALG_UNSUPPORTED) { - bitch("bad or unsupported algorithm %d", alg); - return ALG_UNSUPPORTED; - } - return alg; - } else { - str_alg = extract_label(s, what, "temporary"); - if (!str_alg) return ALG_UNSUPPORTED; - if (strcmp(str_alg, "dsa") == 0) - return ALG_DSA; - if (strcmp(str_alg, "rsasha1") == 0) - return ALG_RSASHA1; - if (strcmp(str_alg, "dsa-nsec3-sha1") == 0) - return ALG_DSA_NSEC3_SHA1; - if (strcmp(str_alg, "rsasha1-nsec3-sha1") == 0) - return ALG_RSASHA1_NSEC3_SHA1; - if (strcmp(str_alg, "rsasha256") == 0) - return ALG_RSASHA256; - if (strcmp(str_alg, "rsasha512") == 0) - return ALG_RSASHA512; - - if (strcmp(str_alg, "ecc-gost") == 0) - return ALG_ECCGOST; - if (strcmp(str_alg, "ecdsap256sha256") == 0) - return ALG_ECDSAP256SHA256; - if (strcmp(str_alg, "ecdsap384sha384") == 0) - return ALG_ECDSAP384SHA384; - - if (strcmp(str_alg, "privatedns") == 0) - return ALG_PRIVATEDNS; - if (strcmp(str_alg, "privateoid") == 0) - return ALG_PRIVATEOID; - bitch("bad or unsupported algorithm %s", str_alg); - return ALG_UNSUPPORTED; - } + if (isdigit(**s)) { + alg = extract_integer(s, what, NULL); + if (algorithm_type(alg) == ALG_UNSUPPORTED) { + bitch("bad or unsupported algorithm %d", alg); + return ALG_UNSUPPORTED; + } + return alg; + } else { + str_alg = extract_label(s, what, "temporary"); + if (!str_alg) return ALG_UNSUPPORTED; + if (strcmp(str_alg, "dsa") == 0) + return ALG_DSA; + if (strcmp(str_alg, "rsasha1") == 0) + return ALG_RSASHA1; + if (strcmp(str_alg, "dsa-nsec3-sha1") == 0) + return ALG_DSA_NSEC3_SHA1; + if (strcmp(str_alg, "rsasha1-nsec3-sha1") == 0) + return ALG_RSASHA1_NSEC3_SHA1; + if (strcmp(str_alg, "rsasha256") == 0) + return ALG_RSASHA256; + if (strcmp(str_alg, "rsasha512") == 0) + return ALG_RSASHA512; + + if (strcmp(str_alg, "ecc-gost") == 0) + return ALG_ECCGOST; + if (strcmp(str_alg, "ecdsap256sha256") == 0) + return ALG_ECDSAP256SHA256; + if (strcmp(str_alg, "ecdsap384sha384") == 0) + return ALG_ECDSAP384SHA384; + if (strcmp(str_alg, "ed25519") == 0) + return ALG_ED25519; + if (strcmp(str_alg, "ed448") == 0) + return ALG_ED448; + + if (strcmp(str_alg, "privatedns") == 0) + return ALG_PRIVATEDNS; + if (strcmp(str_alg, "privateoid") == 0) + return ALG_PRIVATEOID; + bitch("bad or unsupported algorithm %s", str_alg); + return ALG_UNSUPPORTED; + } } int algorithm_type(int alg) { - switch (alg) { - case ALG_DSA: - return ALG_DSA_FAMILY; - case ALG_RSASHA1: - return ALG_RSA_FAMILY; - case ALG_DSA_NSEC3_SHA1: - return ALG_DSA_FAMILY; - case ALG_RSASHA1_NSEC3_SHA1: - return ALG_RSA_FAMILY; - case ALG_RSASHA256: - return ALG_RSA_FAMILY; - case ALG_RSASHA512: - return ALG_RSA_FAMILY; + switch (alg) { + case ALG_DSA: + return ALG_DSA_FAMILY; + case ALG_RSASHA1: + return ALG_RSA_FAMILY; + case ALG_DSA_NSEC3_SHA1: + return ALG_DSA_FAMILY; + case ALG_RSASHA1_NSEC3_SHA1: + return ALG_RSA_FAMILY; + case ALG_RSASHA256: + return ALG_RSA_FAMILY; + case ALG_RSASHA512: + return ALG_RSA_FAMILY; case ALG_ECCGOST: return ALG_ECC_FAMILY; case ALG_ECDSAP256SHA256: return ALG_ECC_FAMILY; case ALG_ECDSAP384SHA384: return ALG_ECC_FAMILY; - case ALG_PRIVATEDNS: - return ALG_PRIVATE_FAMILY; - case ALG_PRIVATEOID: - return ALG_PRIVATE_FAMILY; - } - return ALG_UNSUPPORTED; + case ALG_ED25519: + return ALG_ECC_FAMILY; + case ALG_ED448: + return ALG_ECC_FAMILY; + case ALG_PRIVATEDNS: + return ALG_PRIVATE_FAMILY; + case ALG_PRIVATEOID: + return ALG_PRIVATE_FAMILY; + } + return ALG_UNSUPPORTED; } diff -Naur validns-0.8/rr.h validns/rr.h --- validns-0.8/rr.h 2014-02-11 15:46:57.000000000 -0500 +++ validns/rr.h 2020-10-05 16:59:29.355681369 -0400 @@ -9,49 +9,53 @@ #ifndef _RR_H #define _RR_H 1 -#define T_A 1 -#define T_NS 2 -#define T_CNAME 5 -#define T_SOA 6 -#define T_MB 7 -#define T_MG 8 -#define T_MR 9 -#define T_PTR 12 -#define T_HINFO 13 -#define T_MINFO 14 -#define T_MX 15 -#define T_TXT 16 -#define T_RP 17 -#define T_AFSDB 18 -#define T_X25 19 -#define T_ISDN 20 -#define T_RT 21 -#define T_NSAP 22 -#define T_PX 26 -#define T_AAAA 28 -#define T_LOC 29 -#define T_SRV 33 -#define T_NAPTR 35 -#define T_KX 36 -#define T_CERT 37 -#define T_DNAME 39 -#define T_DS 43 -#define T_SSHFP 44 -#define T_IPSECKEY 45 -#define T_RRSIG 46 -#define T_NSEC 47 -#define T_DNSKEY 48 -#define T_DHCID 49 -#define T_NSEC3 50 -#define T_NSEC3PARAM 51 -#define T_TLSA 52 -#define T_SPF 99 -#define T_NID 104 -#define T_L32 105 -#define T_L64 106 -#define T_LP 107 +#define T_A 1 +#define T_NS 2 +#define T_CNAME 5 +#define T_SOA 6 +#define T_MB 7 +#define T_MG 8 +#define T_MR 9 +#define T_PTR 12 +#define T_HINFO 13 +#define T_MINFO 14 +#define T_MX 15 +#define T_TXT 16 +#define T_RP 17 +#define T_AFSDB 18 +#define T_X25 19 +#define T_ISDN 20 +#define T_RT 21 +#define T_NSAP 22 +#define T_PX 26 +#define T_AAAA 28 +#define T_LOC 29 +#define T_SRV 33 +#define T_NAPTR 35 +#define T_KX 36 +#define T_CERT 37 +#define T_DNAME 39 +#define T_DS 43 +#define T_SSHFP 44 +#define T_IPSECKEY 45 +#define T_RRSIG 46 +#define T_NSEC 47 +#define T_DNSKEY 48 +#define T_DHCID 49 +#define T_NSEC3 50 +#define T_NSEC3PARAM 51 +#define T_TLSA 52 +#define T_SMIMEA 53 +#define T_CDS 59 +#define T_CDNSKEY 60 +#define T_SPF 99 +#define T_NID 104 +#define T_L32 105 +#define T_L64 106 +#define T_LP 107 +#define T_CAA 257 #define T_DLV 32769 -#define T_MAX 32769 +#define T_MAX 32769 #define ALG_DSA 3 #define ALG_RSASHA1 5 @@ -62,6 +66,8 @@ #define ALG_ECCGOST 12 #define ALG_ECDSAP256SHA256 13 #define ALG_ECDSAP384SHA384 14 +#define ALG_ED25519 15 +#define ALG_ED448 16 #define ALG_PRIVATEDNS 253 #define ALG_PRIVATEOID 254 @@ -88,14 +94,15 @@ typedef void* (*rr_validate_set_func)(struct rr_set*); typedef void* (*rr_validate_func)(struct rr*); struct rr_methods { - rr_parse_func rr_parse; - rr_human_func rr_human; - rr_wire_func rr_wire; - rr_validate_set_func rr_validate_set; - rr_validate_func rr_validate; + rr_parse_func rr_parse; + rr_human_func rr_human; + rr_wire_func rr_wire; + rr_validate_set_func rr_validate_set; + rr_validate_func rr_validate; }; extern struct rr_methods rr_methods[T_MAX+1]; extern struct rr_methods unknown_methods; +extern int rr_counts[T_MAX+1]; struct binary_data call_get_wired(struct rr *rr); struct rr *rr_parse_any(char *name, long ttl, int type, char *s); @@ -130,58 +137,58 @@ struct named_rr { - char *name; - void *rr_sets; + char *name; + void *rr_sets; - int line; - char *file_name; - uint32_t flags; - struct named_rr *parent; + int line; + char *file_name; + uint32_t flags; + struct named_rr *parent; }; struct rr_set { - struct rr* head; - struct rr* tail; - struct named_rr *named_rr; - int rdtype; - int count; + struct rr* head; + struct rr* tail; + struct named_rr *named_rr; + int rdtype; + int count; }; struct rr { - struct rr* next; - struct rr* prev; - struct rr_set *rr_set; - - int ttl; - int rdtype; - - int line; - int is_generic; - char *file_name; + struct rr* next; + struct rr* prev; + struct rr_set *rr_set; + + int ttl; + int rdtype; + + int line; + int is_generic; + char *file_name; }; struct rr_any { - struct rr rr; - struct binary_data data; + struct rr rr; + struct binary_data data; }; struct rr_a { - struct rr rr; - struct in_addr address; + struct rr rr; + struct in_addr address; }; extern struct rr_methods a_methods; struct rr_soa { - struct rr rr; - uint32_t serial; - int refresh, retry, expire, minimum; - char *rname; - char *mname; + struct rr rr; + uint32_t serial; + int refresh, retry, expire, minimum; + char *rname; + char *mname; }; extern struct rr_methods soa_methods; @@ -197,19 +204,23 @@ struct rr rr; int id_type; int digest_type; - struct binary_data digest; + struct binary_data digest; }; extern struct rr_methods dhcid_methods; +struct rr_txt_segment { + struct binary_data txt; + struct rr_txt_segment *next; +}; struct rr_txt { struct rr rr; int count; - struct binary_data txt[1]; + struct rr_txt_segment *txt; }; extern struct rr_methods txt_methods; -struct rr_tlsa +struct rr_tlsa_smimea { struct rr rr; uint8_t cert_usage; @@ -218,20 +229,21 @@ struct binary_data association_data; }; extern struct rr_methods tlsa_methods; +extern struct rr_methods smimea_methods; struct rr_ipseckey { struct rr rr; - uint8_t precedence; - uint8_t gateway_type; - uint8_t algorithm; - union { - char *gateway_none; /* gateway_type == 0 */ - struct in_addr gateway_ipv4; /* gateway_type == 1 */ - struct in6_addr gateway_ipv6; /* gateway_type == 2 */ - char *gateway_name; /* gateway_type == 3 */ - } gateway; - struct binary_data public_key; + uint8_t precedence; + uint8_t gateway_type; + uint8_t algorithm; + union { + char *gateway_none; /* gateway_type == 0 */ + struct in_addr gateway_ipv4; /* gateway_type == 1 */ + struct in6_addr gateway_ipv6; /* gateway_type == 2 */ + char *gateway_name; /* gateway_type == 3 */ + } gateway; + struct binary_data public_key; }; extern struct rr_methods ipseckey_methods; @@ -270,20 +282,20 @@ struct rr_naptr { struct rr rr; - uint16_t order; - uint16_t preference; - struct binary_data flags; - struct binary_data services; - struct binary_data regexp; - char *replacement; + uint16_t order; + uint16_t preference; + struct binary_data flags; + struct binary_data services; + struct binary_data regexp; + char *replacement; }; extern struct rr_methods naptr_methods; struct rr_nsec { - struct rr rr; - char *next_domain; - struct binary_data type_bitmap; + struct rr rr; + char *next_domain; + struct binary_data type_bitmap; }; extern struct rr_methods nsec_methods; @@ -291,208 +303,218 @@ struct rr_nsec3 { - struct rr rr; - uint8_t hash_algorithm; - uint8_t flags; - uint16_t iterations; - struct binary_data salt; - struct binary_data next_hashed_owner; - struct binary_data type_bitmap; - struct binary_data this_hashed_name; - struct named_rr *corresponding_name; - struct rr_nsec3 *next_nsec3; + struct rr rr; + uint8_t hash_algorithm; + uint8_t flags; + uint16_t iterations; + struct binary_data salt; + struct binary_data next_hashed_owner; + struct binary_data type_bitmap; + struct binary_data this_hashed_name; + struct named_rr *corresponding_name; + struct rr_nsec3 *next_nsec3; }; extern struct rr_methods nsec3_methods; struct rr_nsec3param { - struct rr rr; - uint8_t hash_algorithm; - uint8_t flags; - uint16_t iterations; - struct binary_data salt; + struct rr rr; + uint8_t hash_algorithm; + uint8_t flags; + uint16_t iterations; + struct binary_data salt; }; extern struct rr_methods nsec3param_methods; extern struct rr *nsec3param; struct rr_rrsig { - struct rr rr; - uint16_t type_covered; - int algorithm; - int labels; - int orig_ttl; - uint32_t sig_expiration; - uint32_t sig_inception; - uint16_t key_tag; - char *signer; - struct binary_data signature; + struct rr rr; + uint16_t type_covered; + int algorithm; + int labels; + int orig_ttl; + uint32_t sig_expiration; + uint32_t sig_inception; + uint16_t key_tag; + char *signer; + struct binary_data signature; }; extern struct rr_methods rrsig_methods; struct rr_srv { - struct rr rr; - uint16_t priority; - uint16_t weight; - uint16_t port; - char *target; + struct rr rr; + uint16_t priority; + uint16_t weight; + uint16_t port; + char *target; }; extern struct rr_methods srv_methods; struct rr_cname { - struct rr rr; - char *cname; + struct rr rr; + char *cname; }; extern struct rr_methods cname_methods; struct rr_mb { - struct rr rr; - char *madname; + struct rr rr; + char *madname; }; extern struct rr_methods mb_methods; struct rr_mg { - struct rr rr; - char *mgmname; + struct rr rr; + char *mgmname; }; extern struct rr_methods mg_methods; struct rr_minfo { - struct rr rr; - char *rmailbx; - char *emailbx; + struct rr rr; + char *rmailbx; + char *emailbx; }; extern struct rr_methods minfo_methods; struct rr_mr { - struct rr rr; - char *newname; + struct rr rr; + char *newname; }; extern struct rr_methods mr_methods; struct rr_dname { - struct rr rr; - char *target; + struct rr rr; + char *target; }; extern struct rr_methods dname_methods; struct rr_aaaa { - struct rr rr; - struct in6_addr address; + struct rr rr; + struct in6_addr address; }; extern struct rr_methods aaaa_methods; struct rr_mx { - struct rr rr; - int preference; - char *exchange; + struct rr rr; + int preference; + char *exchange; }; extern struct rr_methods mx_methods; struct rr_rt { - struct rr rr; - int preference; - char *intermediate_host; + struct rr rr; + int preference; + char *intermediate_host; }; extern struct rr_methods rt_methods; struct rr_afsdb { - struct rr rr; - int subtype; - char *hostname; + struct rr rr; + int subtype; + char *hostname; }; extern struct rr_methods afsdb_methods; struct rr_x25 { - struct rr rr; + struct rr rr; struct binary_data psdn_address; }; extern struct rr_methods x25_methods; struct rr_isdn { - struct rr rr; + struct rr rr; struct binary_data isdn_address; struct binary_data sa; - int sa_present; + int sa_present; }; extern struct rr_methods isdn_methods; struct rr_px { - struct rr rr; - int preference; - char *map822; - char *mapx400; + struct rr rr; + int preference; + char *map822; + char *mapx400; }; extern struct rr_methods px_methods; struct rr_kx { - struct rr rr; - int preference; - char *exchanger; + struct rr rr; + int preference; + char *exchanger; }; extern struct rr_methods kx_methods; struct rr_dnskey { - struct rr rr; - uint16_t flags; - uint8_t protocol; - uint8_t algorithm; - struct binary_data pubkey; - /* calculated */ - uint16_t key_tag; - int pkey_built; - void *pkey; + struct rr rr; + uint16_t flags; + uint8_t protocol; + uint8_t algorithm; + struct binary_data pubkey; + /* calculated */ + uint16_t key_tag; + int pkey_built; + void *pkey; + /* extras */ + int key_type; + struct rr_dnskey *next_key; }; extern struct rr_methods dnskey_methods; +extern struct rr_methods cdnskey_methods; + +#define KEY_TYPE_UNUSED 0 +#define KEY_TYPE_KSK 1 +#define KEY_TYPE_ZSK 2 int dnskey_build_pkey(struct rr_dnskey *rr); +void dnskey_ksk_policy_check(void); struct rr_ds { - struct rr rr; - uint16_t key_tag; - uint8_t algorithm; - uint8_t digest_type; - struct binary_data digest; + struct rr rr; + uint16_t key_tag; + uint8_t algorithm; + uint8_t digest_type; + struct binary_data digest; }; extern struct rr_methods ds_methods; +extern struct rr_methods cds_methods; struct rr_dlv { - struct rr rr; - uint16_t key_tag; - uint8_t algorithm; - uint8_t digest_type; - struct binary_data digest; + struct rr rr; + uint16_t key_tag; + uint8_t algorithm; + uint8_t digest_type; + struct binary_data digest; }; extern struct rr_methods dlv_methods; struct rr_nsap { - struct rr rr; - struct binary_data data; + struct rr rr; + struct binary_data data; }; extern struct rr_methods nsap_methods; struct rr_hinfo { - struct rr rr; + struct rr rr; struct binary_data cpu; struct binary_data os; }; @@ -500,7 +522,7 @@ struct rr_rp { - struct rr rr; + struct rr rr; char *mbox_dname; char *txt_dname; }; @@ -508,14 +530,14 @@ struct rr_loc { - struct rr rr; - uint8_t version; - uint8_t size; - uint8_t horiz_pre; - uint8_t vert_pre; - uint32_t latitude; - uint32_t longitude; - uint32_t altitude; + struct rr rr; + uint8_t version; + uint8_t size; + uint8_t horiz_pre; + uint8_t vert_pre; + uint32_t latitude; + uint32_t longitude; + uint32_t altitude; }; extern struct rr_methods loc_methods; @@ -530,15 +552,15 @@ { struct rr rr; uint8_t algorithm; - uint8_t fp_type; - struct binary_data fingerprint; + uint8_t fp_type; + struct binary_data fingerprint; }; extern struct rr_methods sshfp_methods; struct rr_spf { struct rr rr; - int count; + int count; struct binary_data spf[1]; }; extern struct rr_methods spf_methods; @@ -546,13 +568,22 @@ struct rr_cert { struct rr rr; - uint16_t type; - uint16_t key_tag; - int algorithm; - struct binary_data certificate; + uint16_t type; + uint16_t key_tag; + int algorithm; + struct binary_data certificate; }; extern struct rr_methods cert_methods; +struct rr_caa +{ + struct rr rr; + uint8_t flags; + struct binary_data tag; + struct binary_data value; +}; +extern struct rr_methods caa_methods; + extern struct rr_nsec3 *first_nsec3; extern struct rr_nsec3 *latest_nsec3; diff -Naur validns-0.8/rrsig.c validns/rrsig.c --- validns-0.8/rrsig.c 2020-10-05 16:57:07.219376944 -0400 +++ validns/rrsig.c 2020-10-05 16:59:48.871860482 -0400 @@ -16,6 +16,7 @@ #include #include #include +#include #include "common.h" #include "textparse.h" @@ -25,135 +26,154 @@ struct verification_data { - struct verification_data *next; + struct verification_data *next; EVP_MD_CTX *ctx; - struct rr_dnskey *key; - struct rr_rrsig *rr; - int ok; - unsigned long openssl_error; + struct rr_dnskey *key; + struct rr_rrsig *rr; + int ok; + unsigned long openssl_error; }; struct keys_to_verify { - struct keys_to_verify *next; - struct rr_rrsig *rr; - struct rr_set *signed_set; - int n_keys; - struct verification_data to_verify[1]; + struct keys_to_verify *next; + struct rr_rrsig *rr; + struct rr_set *signed_set; + int n_keys; + struct verification_data to_verify[1]; }; static struct keys_to_verify *all_keys_to_verify = NULL; static struct rr* rrsig_parse(char *name, long ttl, int type, char *s) { - struct rr_rrsig *rr = getmem(sizeof(*rr)); - int type_covered, key_tag; - char *str_type_covered; - struct binary_data sig; - long long ts; - - str_type_covered = extract_label(&s, "type covered", "temporary"); - if (!str_type_covered) return NULL; - type_covered = str2rdtype(str_type_covered, NULL); - if (type_covered <= 0 || type_covered > 65535) return NULL; - rr->type_covered = type_covered; - - rr->algorithm = extract_algorithm(&s, "algorithm"); - if (rr->algorithm == ALG_UNSUPPORTED) return NULL; - if (rr->algorithm == ALG_PRIVATEDNS || rr->algorithm == ALG_PRIVATEOID) { - return bitch("private algorithms are not supported in RRSIG"); - } - - rr->labels = extract_integer(&s, "labels"); - if (rr->labels < 0) return NULL; - /* TODO validate labels, see http://tools.ietf.org/html/rfc4034#section-3.1.3 */ - - rr->orig_ttl = extract_timevalue(&s, "original TTL"); - if (rr->orig_ttl < 0) return NULL; - - ts = extract_timestamp(&s, "signature expiration"); - if (ts < 0) return NULL; - rr->sig_expiration = ts; - - ts = extract_timestamp(&s, "signature inception"); - if (ts < 0) return NULL; - rr->sig_inception = ts; - - key_tag = extract_integer(&s, "key tag"); - if (key_tag < 0) return NULL; - rr->key_tag = key_tag; - - rr->signer = extract_name(&s, "signer name", 0); - if (!rr->signer) return NULL; - /* TODO validate signer name, http://tools.ietf.org/html/rfc4034#section-3.1.7 */ - - sig = extract_base64_binary_data(&s, "signature"); - if (sig.length < 0) return NULL; - /* TODO validate signature length based on algorithm */ - rr->signature = sig; - - if (*s) { - return bitch("garbage after valid RRSIG data"); - } - G.dnssec_active = 1; - return store_record(type, name, ttl, rr); + struct rr_rrsig *rr = getmem(sizeof(*rr)); + int type_covered, key_tag; + char *str_type_covered; + struct binary_data sig; + long long ts; + + str_type_covered = extract_label(&s, "type covered", "temporary"); + if (!str_type_covered) return NULL; + type_covered = str2rdtype(str_type_covered, NULL); + if (type_covered <= 0 || type_covered > 65535) return NULL; + rr->type_covered = type_covered; + + rr->algorithm = extract_algorithm(&s, "algorithm"); + if (rr->algorithm == ALG_UNSUPPORTED) return NULL; + if (rr->algorithm == ALG_PRIVATEDNS || rr->algorithm == ALG_PRIVATEOID) { + return bitch("private algorithms are not supported in RRSIG"); + } + + rr->labels = extract_integer(&s, "labels", NULL); + if (rr->labels < 0) return NULL; + /* TODO validate labels, see http://tools.ietf.org/html/rfc4034#section-3.1.3 */ + + rr->orig_ttl = extract_timevalue(&s, "original TTL"); + if (rr->orig_ttl < 0) return NULL; + + ts = extract_timestamp(&s, "signature expiration"); + if (ts < 0) return NULL; + rr->sig_expiration = ts; + + ts = extract_timestamp(&s, "signature inception"); + if (ts < 0) return NULL; + rr->sig_inception = ts; + + key_tag = extract_integer(&s, "key tag", NULL); + if (key_tag < 0) return NULL; + rr->key_tag = key_tag; + + rr->signer = extract_name(&s, "signer name", 0); + if (!rr->signer) return NULL; + /* TODO validate signer name, http://tools.ietf.org/html/rfc4034#section-3.1.7 */ + + sig = extract_base64_binary_data(&s, "signature"); + if (sig.length < 0) return NULL; + /* TODO validate signature length based on algorithm */ + if (algorithm_type(rr->algorithm) == ALG_ECC_FAMILY) { + /* + * Transform ECDSA signatures from DNSSEC vanilla binary + * representation (r || s) into OpenSSL ASN.1 DER format + */ + ECDSA_SIG *ecdsa_sig = ECDSA_SIG_new(); + BIGNUM *r, *s; + int l = sig.length / 2; + r = BN_bin2bn((unsigned char *)sig.data, l, NULL); + s = BN_bin2bn((unsigned char *)sig.data + l, l, NULL); + if ((r == NULL) || (s == NULL)) + return NULL; + ECDSA_SIG_set0(ecdsa_sig, r, s); + sig.length = i2d_ECDSA_SIG(ecdsa_sig, NULL); + sig.data = getmem(sig.length); /* reallocate larger mempool chunk */ + unsigned char *sig_ptr = (unsigned char *)sig.data; + sig.length = i2d_ECDSA_SIG(ecdsa_sig, &sig_ptr); + ECDSA_SIG_free(ecdsa_sig); + } + rr->signature = sig; + + if (*s) { + return bitch("garbage after valid RRSIG data"); + } + G.dnssec_active = 1; + return store_record(type, name, ttl, rr); } static char* rrsig_human(struct rr *rrv) { - // RRCAST(rrsig); + // RRCAST(rrsig); // char s[1024]; //snprintf(s, 1024, "SOA %s %s %d %d %d %d %d", - // rr->mname, rr->rname, rr->serial, - // rr->refresh, rr->retry, rr->expire, rr->minimum); + // rr->mname, rr->rname, rr->serial, + // rr->refresh, rr->retry, rr->expire, rr->minimum); //return quickstrdup_temp(s); - return NULL; + return NULL; } static struct binary_data rrsig_wirerdata_ex(struct rr *rrv, int with_signature) { - RRCAST(rrsig); - struct binary_data bd; + RRCAST(rrsig); + struct binary_data bd; - bd = compose_binary_data("2114442d", 1, - rr->type_covered, rr->algorithm, rr->labels, - rr->orig_ttl, rr->sig_expiration, rr->sig_inception, - rr->key_tag, name2wire_name(rr->signer)); - if (with_signature) { - return compose_binary_data("dd", 1, bd, rr->signature); - } - return bd; + bd = compose_binary_data("2114442d", 1, + rr->type_covered, rr->algorithm, rr->labels, + rr->orig_ttl, rr->sig_expiration, rr->sig_inception, + rr->key_tag, name2wire_name(rr->signer)); + if (with_signature) { + return compose_binary_data("dd", 1, bd, rr->signature); + } + return bd; } static struct binary_data rrsig_wirerdata(struct rr *rrv) { - return rrsig_wirerdata_ex(rrv, 1); + return rrsig_wirerdata_ex(rrv, 1); } struct rr_with_wired { - struct rr *rr; - struct binary_data wired; + struct rr *rr; + struct binary_data wired; }; static int compare_rr_with_wired(const void *va, const void *vb) { - const struct rr_with_wired *a = va; - const struct rr_with_wired *b = vb; - int r; - - if (a->wired.length == b->wired.length) { - return memcmp(a->wired.data, b->wired.data, a->wired.length); - } else if (a->wired.length < b->wired.length) { - r = memcmp(a->wired.data, b->wired.data, a->wired.length); - if (r != 0) return r; - return -1; - } else { - r = memcmp(a->wired.data, b->wired.data, b->wired.length); - if (r != 0) return r; - return 1; - } + const struct rr_with_wired *a = va; + const struct rr_with_wired *b = vb; + int r; + + if (a->wired.length == b->wired.length) { + return memcmp(a->wired.data, b->wired.data, a->wired.length); + } else if (a->wired.length < b->wired.length) { + r = memcmp(a->wired.data, b->wired.data, a->wired.length); + if (r != 0) return r; + return -1; + } else { + r = memcmp(a->wired.data, b->wired.data, b->wired.length); + if (r != 0) return r; + return 1; + } } static struct verification_data *verification_queue = NULL; @@ -164,211 +184,219 @@ void *verification_thread(void *dummy) { - struct verification_data *d; - struct timespec sleep_time; + struct verification_data *d; + struct timespec sleep_time; - while (1) { - if (pthread_mutex_lock(&queue_lock) != 0) - croak(1, "pthread_mutex_lock"); - d = verification_queue; - if (d) { - verification_queue = d->next; - G.stats.signatures_verified++; - } - if (pthread_mutex_unlock(&queue_lock) != 0) - croak(1, "pthread_mutex_unlock"); - if (d) { - int r; - d->next = NULL; + while (1) { + if (pthread_mutex_lock(&queue_lock) != 0) + croak(1, "pthread_mutex_lock"); + d = verification_queue; + if (d) { + verification_queue = d->next; + G.stats.signatures_verified++; + } + if (pthread_mutex_unlock(&queue_lock) != 0) + croak(1, "pthread_mutex_unlock"); + if (d) { + int r; + d->next = NULL; r = EVP_VerifyFinal(d->ctx, (unsigned char *)d->rr->signature.data, d->rr->signature.length, d->key->pkey); - if (r == 1) { - d->ok = 1; - } else { - d->openssl_error = ERR_peek_last_error(); - } - if (pthread_mutex_lock(&queue_lock) != 0) - croak(1, "pthread_mutex_lock"); - verification_queue_size--; - if (pthread_mutex_unlock(&queue_lock) != 0) - croak(1, "pthread_mutex_unlock"); - } else { - sleep_time.tv_sec = 0; - sleep_time.tv_nsec = 10000000; - nanosleep(&sleep_time, NULL); - } - } + if (r == 1) { + d->ok = 1; + } else { + d->openssl_error = ERR_peek_last_error(); + } + if (pthread_mutex_lock(&queue_lock) != 0) + croak(1, "pthread_mutex_lock"); + verification_queue_size--; + if (pthread_mutex_unlock(&queue_lock) != 0) + croak(1, "pthread_mutex_unlock"); + } else { + sleep_time.tv_sec = 0; + sleep_time.tv_nsec = 10000000; + nanosleep(&sleep_time, NULL); + } + } } static void start_workers(void) { - int i; + int i; - if (workers_started) - return; - if (G.opt.verbose) - fprintf(stderr, "starting workers for signature verification\n"); - workers = getmem(sizeof(*workers)*G.opt.n_threads); - for (i = 0; i < G.opt.n_threads; i++) { - if (pthread_create(&workers[i], NULL, verification_thread, NULL) != 0) - croak(1, "pthread_create"); - } - workers_started = 1; + if (workers_started) + return; + if (G.opt.verbose) + fprintf(stderr, "starting workers for signature verification\n"); + workers = getmem(sizeof(*workers)*G.opt.n_threads); + for (i = 0; i < G.opt.n_threads; i++) { + if (pthread_create(&workers[i], NULL, verification_thread, NULL) != 0) + croak(1, "pthread_create"); + } + workers_started = 1; } static void schedule_verification(struct verification_data *d) { - int cur_size; - if (G.opt.n_threads > 1) { - if (pthread_mutex_lock(&queue_lock) != 0) - croak(1, "pthread_mutex_lock"); - d->next = verification_queue; - verification_queue = d; - verification_queue_size++; - cur_size = verification_queue_size; - if (pthread_mutex_unlock(&queue_lock) != 0) - croak(1, "pthread_mutex_unlock"); - if (!workers_started && cur_size >= G.opt.n_threads) - start_workers(); - } else { - int r; - G.stats.signatures_verified++; + int cur_size; + if (G.opt.n_threads > 1) { + if (pthread_mutex_lock(&queue_lock) != 0) + croak(1, "pthread_mutex_lock"); + d->next = verification_queue; + verification_queue = d; + verification_queue_size++; + cur_size = verification_queue_size; + if (pthread_mutex_unlock(&queue_lock) != 0) + croak(1, "pthread_mutex_unlock"); + if (!workers_started && cur_size >= G.opt.n_threads) + start_workers(); + } else { + int r; + G.stats.signatures_verified++; r = EVP_VerifyFinal(d->ctx, (unsigned char *)d->rr->signature.data, d->rr->signature.length, d->key->pkey); - if (r == 1) { - d->ok = 1; - } else { - d->openssl_error = ERR_peek_last_error(); - } - } + if (r == 1) { + d->ok = 1; + } else { + d->openssl_error = ERR_peek_last_error(); + } + } } static int verify_signature(struct verification_data *d, struct rr_set *signed_set) { - uint16_t b2; - uint32_t b4; - struct binary_data chunk; - struct rr_with_wired *set; - struct rr *signed_rr; - int i; - - EVP_MD_CTX_init(&d->ctx); - switch (d->rr->algorithm) { - case ALG_DSA: - case ALG_RSASHA1: - case ALG_DSA_NSEC3_SHA1: - case ALG_RSASHA1_NSEC3_SHA1: - if (EVP_VerifyInit(&d->ctx, EVP_sha1()) != 1) - return 0; - break; - case ALG_RSASHA256: - if (EVP_VerifyInit(&d->ctx, EVP_sha256()) != 1) - return 0; - break; - case ALG_RSASHA512: - if (EVP_VerifyInit(&d->ctx, EVP_sha512()) != 1) - return 0; - break; - default: - return 0; - } - - chunk = rrsig_wirerdata_ex(&d->rr->rr, 0); - if (chunk.length < 0) - return 0; + uint16_t b2; + uint32_t b4; + struct binary_data chunk; + struct rr_with_wired *set; + struct rr *signed_rr; + int i; + + d->ctx = EVP_MD_CTX_new(); + switch (d->rr->algorithm) { + case ALG_DSA: + case ALG_RSASHA1: + case ALG_DSA_NSEC3_SHA1: + case ALG_RSASHA1_NSEC3_SHA1: + if (EVP_VerifyInit(d->ctx, EVP_sha1()) != 1) + return 0; + break; + case ALG_RSASHA256: + if (EVP_VerifyInit(d->ctx, EVP_sha256()) != 1) + return 0; + break; + case ALG_RSASHA512: + if (EVP_VerifyInit(d->ctx, EVP_sha512()) != 1) + return 0; + break; + case ALG_ECDSAP256SHA256: + if (EVP_VerifyInit(d->ctx, EVP_sha256()) != 1) + return 0; + break; + case ALG_ECDSAP384SHA384: + if (EVP_VerifyInit(d->ctx, EVP_sha384()) != 1) + return 0; + break; + default: + return 0; + } + + chunk = rrsig_wirerdata_ex(&d->rr->rr, 0); + if (chunk.length < 0) + return 0; EVP_VerifyUpdate(d->ctx, chunk.data, chunk.length); - set = getmem_temp(sizeof(*set) * signed_set->count); + set = getmem_temp(sizeof(*set) * signed_set->count); - signed_rr = signed_set->tail; - i = 0; - while (signed_rr) { - set[i].rr = signed_rr; - set[i].wired = call_get_wired(signed_rr); - if (set[i].wired.length < 0) - return 0; - i++; - signed_rr = signed_rr->next; - } - qsort(set, signed_set->count, sizeof(*set), compare_rr_with_wired); - - for (i = 0; i < signed_set->count; i++) { - chunk = name2wire_name(signed_set->named_rr->name); - if (chunk.length < 0) - return 0; + signed_rr = signed_set->tail; + i = 0; + while (signed_rr) { + set[i].rr = signed_rr; + set[i].wired = call_get_wired(signed_rr); + if (set[i].wired.length < 0) + return 0; + i++; + signed_rr = signed_rr->next; + } + qsort(set, signed_set->count, sizeof(*set), compare_rr_with_wired); + + for (i = 0; i < signed_set->count; i++) { + chunk = name2wire_name(signed_set->named_rr->name); + if (chunk.length < 0) + return 0; EVP_VerifyUpdate(d->ctx, chunk.data, chunk.length); b2 = htons(set[i].rr->rdtype); EVP_VerifyUpdate(d->ctx, &b2, 2); b2 = htons(1); /* class IN */ EVP_VerifyUpdate(d->ctx, &b2, 2); b4 = htonl(set[i].rr->ttl); EVP_VerifyUpdate(d->ctx, &b4, 4); b2 = htons(set[i].wired.length); EVP_VerifyUpdate(d->ctx, &b2, 2); EVP_VerifyUpdate(d->ctx, set[i].wired.data, set[i].wired.length); - } + } - schedule_verification(d); - return 1; + schedule_verification(d); + return 1; } static void *rrsig_validate(struct rr *rrv) { - RRCAST(rrsig); - struct named_rr *named_rr; - struct rr_set *signed_set; - struct rr_dnskey *key = NULL; - struct rr_set *dnskey_rr_set; - int candidate_keys = 0; - struct keys_to_verify *candidates; - int i = 0; - int t; - - named_rr = rr->rr.rr_set->named_rr; - for (t = 0; t < G.opt.n_times_to_check; t++) { - if (G.opt.times_to_check[t] < rr->sig_inception) { - return moan(rr->rr.file_name, rr->rr.line, "%s signature is too new", named_rr->name); - } - if (G.opt.times_to_check[t] > rr->sig_expiration) { - return moan(rr->rr.file_name, rr->rr.line, "%s signature is too old", named_rr->name); - } - } - signed_set = find_rr_set_in_named_rr(named_rr, rr->type_covered); - if (!signed_set) { - return moan(rr->rr.file_name, rr->rr.line, "%s RRSIG exists for non-existing type %s", named_rr->name, rdtype2str(rr->type_covered)); - } - if (signed_set->tail->ttl != rr->orig_ttl) { - return moan(rr->rr.file_name, rr->rr.line, "%s RRSIG's original TTL differs from corresponding record's", named_rr->name); - } - dnskey_rr_set = find_rr_set(T_DNSKEY, rr->signer); - if (!dnskey_rr_set) { - return moan(rr->rr.file_name, rr->rr.line, "%s RRSIG(%s): cannot find a signer key (%s)", named_rr->name, rdtype2str(rr->type_covered), rr->signer); - } - key = (struct rr_dnskey *)dnskey_rr_set->tail; - while (key) { - if (key->algorithm == rr->algorithm && key->key_tag == rr->key_tag) { - candidate_keys++; - dnskey_build_pkey(key); - } - key = (struct rr_dnskey *)key->rr.next; - } - if (candidate_keys == 0) - return moan(rr->rr.file_name, rr->rr.line, "%s RRSIG(%s): cannot find the right signer key (%s)", named_rr->name, rdtype2str(rr->type_covered), rr->signer); - - candidates = getmem(sizeof(struct keys_to_verify) + (candidate_keys-1) * sizeof(struct verification_data)); - candidates->next = all_keys_to_verify; - candidates->rr = rr; - candidates->signed_set = signed_set; - candidates->n_keys = candidate_keys; - all_keys_to_verify = candidates; - key = (struct rr_dnskey *)dnskey_rr_set->tail; - while (key) { - if (key->algorithm == rr->algorithm && key->key_tag == rr->key_tag) { - candidates->to_verify[i].key = key; - candidates->to_verify[i].rr = rr; - candidates->to_verify[i].ok = 0; - candidates->to_verify[i].openssl_error = 0; - candidates->to_verify[i].next = NULL; - i++; - } - key = (struct rr_dnskey *)key->rr.next; - } + RRCAST(rrsig); + struct named_rr *named_rr; + struct rr_set *signed_set; + struct rr_dnskey *key = NULL; + struct rr_set *dnskey_rr_set; + int candidate_keys = 0; + struct keys_to_verify *candidates; + int i = 0; + int t; + + named_rr = rr->rr.rr_set->named_rr; + for (t = 0; t < G.opt.n_times_to_check; t++) { + if (G.opt.times_to_check[t] < rr->sig_inception) { + return moan(rr->rr.file_name, rr->rr.line, "%s signature is too new", named_rr->name); + } + if (G.opt.times_to_check[t] > rr->sig_expiration) { + return moan(rr->rr.file_name, rr->rr.line, "%s signature is too old", named_rr->name); + } + } + signed_set = find_rr_set_in_named_rr(named_rr, rr->type_covered); + if (!signed_set) { + return moan(rr->rr.file_name, rr->rr.line, "%s RRSIG exists for non-existing type %s", named_rr->name, rdtype2str(rr->type_covered)); + } + if (signed_set->tail->ttl != rr->orig_ttl) { + return moan(rr->rr.file_name, rr->rr.line, "%s RRSIG's original TTL differs from corresponding record's", named_rr->name); + } + dnskey_rr_set = find_rr_set(T_DNSKEY, rr->signer); + if (!dnskey_rr_set) { + return moan(rr->rr.file_name, rr->rr.line, "%s RRSIG(%s): cannot find a signer key (%s)", named_rr->name, rdtype2str(rr->type_covered), rr->signer); + } + key = (struct rr_dnskey *)dnskey_rr_set->tail; + while (key) { + if (key->algorithm == rr->algorithm && key->key_tag == rr->key_tag) { + candidate_keys++; + dnskey_build_pkey(key); + } + key = (struct rr_dnskey *)key->rr.next; + } + if (candidate_keys == 0) + return moan(rr->rr.file_name, rr->rr.line, "%s RRSIG(%s): cannot find the right signer key (%s)", named_rr->name, rdtype2str(rr->type_covered), rr->signer); + + candidates = getmem(sizeof(struct keys_to_verify) + (candidate_keys-1) * sizeof(struct verification_data)); + candidates->next = all_keys_to_verify; + candidates->rr = rr; + candidates->signed_set = signed_set; + candidates->n_keys = candidate_keys; + all_keys_to_verify = candidates; + key = (struct rr_dnskey *)dnskey_rr_set->tail; + while (key) { + if (key->algorithm == rr->algorithm && key->key_tag == rr->key_tag) { + candidates->to_verify[i].key = key; + candidates->to_verify[i].rr = rr; + candidates->to_verify[i].ok = 0; + candidates->to_verify[i].openssl_error = 0; + candidates->to_verify[i].next = NULL; + i++; + } + key = (struct rr_dnskey *)key->rr.next; + } - return rr; + return rr; } static pthread_mutex_t *lock_cs; @@ -376,81 +404,87 @@ unsigned long pthreads_thread_id(void) { - unsigned long ret; + unsigned long ret; - ret=(unsigned long)pthread_self(); - return(ret); + ret=(unsigned long)pthread_self(); + return(ret); } void pthreads_locking_callback(int mode, int type, char *file, int line) { - if (mode & CRYPTO_LOCK) { - pthread_mutex_lock(&(lock_cs[type])); - lock_count[type]++; - } else { - pthread_mutex_unlock(&(lock_cs[type])); - } + if (mode & CRYPTO_LOCK) { + pthread_mutex_lock(&(lock_cs[type])); + lock_count[type]++; + } else { + pthread_mutex_unlock(&(lock_cs[type])); + } } void verify_all_keys(void) { - struct keys_to_verify *k = all_keys_to_verify; - int i; - struct timespec sleep_time; - - ERR_load_crypto_strings(); - if (G.opt.n_threads > 1) { - lock_cs = OPENSSL_malloc(CRYPTO_num_locks() * sizeof(pthread_mutex_t)); - lock_count = OPENSSL_malloc(CRYPTO_num_locks() * sizeof(long)); - for (i = 0; i < CRYPTO_num_locks(); i++) { - lock_count[i] = 0; - pthread_mutex_init(&lock_cs[i],NULL); - } - - CRYPTO_set_id_callback((unsigned long (*)())pthreads_thread_id); - CRYPTO_set_locking_callback((void (*)())pthreads_locking_callback); - - if (pthread_mutex_init(&queue_lock, NULL) != 0) - croak(1, "pthread_mutex_init"); - } - - while (k) { - freeall_temp(); - for (i = 0; i < k->n_keys; i++) { - if (dnskey_build_pkey(k->to_verify[i].key)) - verify_signature(&k->to_verify[i], k->signed_set); - } - k = k->next; - } - start_workers(); /* this is needed in case n_threads is greater than the number of signatures to verify */ - while (verification_queue_size > 0) { - sleep_time.tv_sec = 0; - sleep_time.tv_nsec = 10000000; - nanosleep(&sleep_time, NULL); - } - k = all_keys_to_verify; - while (k) { - int ok = 0; - unsigned long e = 0; - for (i = 0; i < k->n_keys; i++) { - if (k->to_verify[i].ok) { - ok = 1; - break; - } else { - if (k->to_verify[i].openssl_error != 0) - e = k->to_verify[i].openssl_error; - } + struct keys_to_verify *k = all_keys_to_verify; + int i; + struct timespec sleep_time; + + ERR_load_crypto_strings(); + if (G.opt.n_threads > 1) { + lock_cs = OPENSSL_malloc(CRYPTO_num_locks() * sizeof(pthread_mutex_t)); + lock_count = OPENSSL_malloc(CRYPTO_num_locks() * sizeof(long)); + for (i = 0; i < CRYPTO_num_locks(); i++) { + lock_count[i] = 0; + pthread_mutex_init(&lock_cs[i],NULL); + } + + CRYPTO_set_id_callback((unsigned long (*)())pthreads_thread_id); + CRYPTO_set_locking_callback((void (*)())pthreads_locking_callback); + + if (pthread_mutex_init(&queue_lock, NULL) != 0) + croak(1, "pthread_mutex_init"); + } + + while (k) { + freeall_temp(); + for (i = 0; i < k->n_keys; i++) { + if (dnskey_build_pkey(k->to_verify[i].key)) + verify_signature(&k->to_verify[i], k->signed_set); + } + k = k->next; + } + start_workers(); /* this is needed in case n_threads is greater than the number of signatures to verify */ + while (verification_queue_size > 0) { + sleep_time.tv_sec = 0; + sleep_time.tv_nsec = 10000000; + nanosleep(&sleep_time, NULL); + } + k = all_keys_to_verify; + while (k) { + int ok = 0; + unsigned long e = 0; + for (i = 0; i < k->n_keys; i++) { + if (k->to_verify[i].ok) { + if (k->to_verify[i].rr->rr.rr_set->named_rr->flags & NAME_FLAG_APEX) { + if (k->to_verify[i].key->key_type == KEY_TYPE_UNUSED) + k->to_verify[i].key->key_type = KEY_TYPE_KSK; + } else { + k->to_verify[i].key->key_type = KEY_TYPE_ZSK; + } + ok = 1; + break; + } else { + if (k->to_verify[i].openssl_error != 0) + e = k->to_verify[i].openssl_error; + } EVP_MD_CTX_free(k->to_verify[i].ctx); - } - if (!ok) { - struct named_rr *named_rr; - named_rr = k->rr->rr.rr_set->named_rr; - moan(k->rr->rr.file_name, k->rr->rr.line, "%s RRSIG(%s): %s", - named_rr->name, rdtype2str(k->rr->type_covered), - e ? ERR_reason_error_string(e) : "cannot verify signature, reason unknown"); - } - k = k->next; - } + } + if (!ok) { + struct named_rr *named_rr; + named_rr = k->rr->rr.rr_set->named_rr; + moan(k->rr->rr.file_name, k->rr->rr.line, "%s RRSIG(%s): %s", + named_rr->name, rdtype2str(k->rr->type_covered), + e ? ERR_reason_error_string(e) : "cannot verify signature, reason unknown"); + } + k = k->next; + } } struct rr_methods rrsig_methods = { rrsig_parse, rrsig_human, rrsig_wirerdata, NULL, rrsig_validate }; diff -Naur validns-0.8/rrsig.c.orig validns/rrsig.c.orig --- validns-0.8/rrsig.c.orig 2014-02-11 15:45:39.000000000 -0500 +++ validns/rrsig.c.orig 1969-12-31 19:00:00.000000000 -0500 @@ -1,455 +0,0 @@ -/* - * Part of DNS zone file validator `validns`. - * - * Copyright 2011-2014 Anton Berezin - * Modified BSD license. - * (See LICENSE file in the distribution.) - * - */ -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include - -#include "common.h" -#include "textparse.h" -#include "mempool.h" -#include "carp.h" -#include "rr.h" - -struct verification_data -{ - struct verification_data *next; - EVP_MD_CTX ctx; - struct rr_dnskey *key; - struct rr_rrsig *rr; - int ok; - unsigned long openssl_error; -}; - -struct keys_to_verify -{ - struct keys_to_verify *next; - struct rr_rrsig *rr; - struct rr_set *signed_set; - int n_keys; - struct verification_data to_verify[1]; -}; - -static struct keys_to_verify *all_keys_to_verify = NULL; - -static struct rr* rrsig_parse(char *name, long ttl, int type, char *s) -{ - struct rr_rrsig *rr = getmem(sizeof(*rr)); - int type_covered, key_tag; - char *str_type_covered; - struct binary_data sig; - long long ts; - - str_type_covered = extract_label(&s, "type covered", "temporary"); - if (!str_type_covered) return NULL; - type_covered = str2rdtype(str_type_covered, NULL); - if (type_covered <= 0 || type_covered > 65535) return NULL; - rr->type_covered = type_covered; - - rr->algorithm = extract_algorithm(&s, "algorithm"); - if (rr->algorithm == ALG_UNSUPPORTED) return NULL; - if (rr->algorithm == ALG_PRIVATEDNS || rr->algorithm == ALG_PRIVATEOID) { - return bitch("private algorithms are not supported in RRSIG"); - } - - rr->labels = extract_integer(&s, "labels"); - if (rr->labels < 0) return NULL; - /* TODO validate labels, see http://tools.ietf.org/html/rfc4034#section-3.1.3 */ - - rr->orig_ttl = extract_timevalue(&s, "original TTL"); - if (rr->orig_ttl < 0) return NULL; - - ts = extract_timestamp(&s, "signature expiration"); - if (ts < 0) return NULL; - rr->sig_expiration = ts; - - ts = extract_timestamp(&s, "signature inception"); - if (ts < 0) return NULL; - rr->sig_inception = ts; - - key_tag = extract_integer(&s, "key tag"); - if (key_tag < 0) return NULL; - rr->key_tag = key_tag; - - rr->signer = extract_name(&s, "signer name", 0); - if (!rr->signer) return NULL; - /* TODO validate signer name, http://tools.ietf.org/html/rfc4034#section-3.1.7 */ - - sig = extract_base64_binary_data(&s, "signature"); - if (sig.length < 0) return NULL; - /* TODO validate signature length based on algorithm */ - rr->signature = sig; - - if (*s) { - return bitch("garbage after valid RRSIG data"); - } - G.dnssec_active = 1; - return store_record(type, name, ttl, rr); -} - -static char* rrsig_human(struct rr *rrv) -{ - // RRCAST(rrsig); - // char s[1024]; - - //snprintf(s, 1024, "SOA %s %s %d %d %d %d %d", - // rr->mname, rr->rname, rr->serial, - // rr->refresh, rr->retry, rr->expire, rr->minimum); - //return quickstrdup_temp(s); - return NULL; -} - -static struct binary_data rrsig_wirerdata_ex(struct rr *rrv, int with_signature) -{ - RRCAST(rrsig); - struct binary_data bd; - - bd = compose_binary_data("2114442d", 1, - rr->type_covered, rr->algorithm, rr->labels, - rr->orig_ttl, rr->sig_expiration, rr->sig_inception, - rr->key_tag, name2wire_name(rr->signer)); - if (with_signature) { - return compose_binary_data("dd", 1, bd, rr->signature); - } - return bd; -} - -static struct binary_data rrsig_wirerdata(struct rr *rrv) -{ - return rrsig_wirerdata_ex(rrv, 1); -} - -struct rr_with_wired -{ - struct rr *rr; - struct binary_data wired; -}; - -static int compare_rr_with_wired(const void *va, const void *vb) -{ - const struct rr_with_wired *a = va; - const struct rr_with_wired *b = vb; - int r; - - if (a->wired.length == b->wired.length) { - return memcmp(a->wired.data, b->wired.data, a->wired.length); - } else if (a->wired.length < b->wired.length) { - r = memcmp(a->wired.data, b->wired.data, a->wired.length); - if (r != 0) return r; - return -1; - } else { - r = memcmp(a->wired.data, b->wired.data, b->wired.length); - if (r != 0) return r; - return 1; - } -} - -static struct verification_data *verification_queue = NULL; -static int verification_queue_size = 0; -static pthread_mutex_t queue_lock; -static int workers_started = 0; -static pthread_t *workers; - -void *verification_thread(void *dummy) -{ - struct verification_data *d; - struct timespec sleep_time; - - while (1) { - if (pthread_mutex_lock(&queue_lock) != 0) - croak(1, "pthread_mutex_lock"); - d = verification_queue; - if (d) { - verification_queue = d->next; - G.stats.signatures_verified++; - } - if (pthread_mutex_unlock(&queue_lock) != 0) - croak(1, "pthread_mutex_unlock"); - if (d) { - int r; - d->next = NULL; - r = EVP_VerifyFinal(&d->ctx, (unsigned char *)d->rr->signature.data, d->rr->signature.length, d->key->pkey); - if (r == 1) { - d->ok = 1; - } else { - d->openssl_error = ERR_peek_last_error(); - } - if (pthread_mutex_lock(&queue_lock) != 0) - croak(1, "pthread_mutex_lock"); - verification_queue_size--; - if (pthread_mutex_unlock(&queue_lock) != 0) - croak(1, "pthread_mutex_unlock"); - } else { - sleep_time.tv_sec = 0; - sleep_time.tv_nsec = 10000000; - nanosleep(&sleep_time, NULL); - } - } -} - -static void start_workers(void) -{ - int i; - - if (workers_started) - return; - if (G.opt.verbose) - fprintf(stderr, "starting workers for signature verification\n"); - workers = getmem(sizeof(*workers)*G.opt.n_threads); - for (i = 0; i < G.opt.n_threads; i++) { - if (pthread_create(&workers[i], NULL, verification_thread, NULL) != 0) - croak(1, "pthread_create"); - } - workers_started = 1; -} - -static void schedule_verification(struct verification_data *d) -{ - int cur_size; - if (G.opt.n_threads > 1) { - if (pthread_mutex_lock(&queue_lock) != 0) - croak(1, "pthread_mutex_lock"); - d->next = verification_queue; - verification_queue = d; - verification_queue_size++; - cur_size = verification_queue_size; - if (pthread_mutex_unlock(&queue_lock) != 0) - croak(1, "pthread_mutex_unlock"); - if (!workers_started && cur_size >= G.opt.n_threads) - start_workers(); - } else { - int r; - G.stats.signatures_verified++; - r = EVP_VerifyFinal(&d->ctx, (unsigned char *)d->rr->signature.data, d->rr->signature.length, d->key->pkey); - if (r == 1) { - d->ok = 1; - } else { - d->openssl_error = ERR_peek_last_error(); - } - } -} - -static int verify_signature(struct verification_data *d, struct rr_set *signed_set) -{ - uint16_t b2; - uint32_t b4; - struct binary_data chunk; - struct rr_with_wired *set; - struct rr *signed_rr; - int i; - - EVP_MD_CTX_init(&d->ctx); - switch (d->rr->algorithm) { - case ALG_DSA: - case ALG_RSASHA1: - case ALG_DSA_NSEC3_SHA1: - case ALG_RSASHA1_NSEC3_SHA1: - if (EVP_VerifyInit(&d->ctx, EVP_sha1()) != 1) - return 0; - break; - case ALG_RSASHA256: - if (EVP_VerifyInit(&d->ctx, EVP_sha256()) != 1) - return 0; - break; - case ALG_RSASHA512: - if (EVP_VerifyInit(&d->ctx, EVP_sha512()) != 1) - return 0; - break; - default: - return 0; - } - - chunk = rrsig_wirerdata_ex(&d->rr->rr, 0); - if (chunk.length < 0) - return 0; - EVP_VerifyUpdate(&d->ctx, chunk.data, chunk.length); - - set = getmem_temp(sizeof(*set) * signed_set->count); - - signed_rr = signed_set->tail; - i = 0; - while (signed_rr) { - set[i].rr = signed_rr; - set[i].wired = call_get_wired(signed_rr); - if (set[i].wired.length < 0) - return 0; - i++; - signed_rr = signed_rr->next; - } - qsort(set, signed_set->count, sizeof(*set), compare_rr_with_wired); - - for (i = 0; i < signed_set->count; i++) { - chunk = name2wire_name(signed_set->named_rr->name); - if (chunk.length < 0) - return 0; - EVP_VerifyUpdate(&d->ctx, chunk.data, chunk.length); - b2 = htons(set[i].rr->rdtype); EVP_VerifyUpdate(&d->ctx, &b2, 2); - b2 = htons(1); /* class IN */ EVP_VerifyUpdate(&d->ctx, &b2, 2); - b4 = htonl(set[i].rr->ttl); EVP_VerifyUpdate(&d->ctx, &b4, 4); - b2 = htons(set[i].wired.length); EVP_VerifyUpdate(&d->ctx, &b2, 2); - EVP_VerifyUpdate(&d->ctx, set[i].wired.data, set[i].wired.length); - } - - schedule_verification(d); - return 1; -} - -static void *rrsig_validate(struct rr *rrv) -{ - RRCAST(rrsig); - struct named_rr *named_rr; - struct rr_set *signed_set; - struct rr_dnskey *key = NULL; - struct rr_set *dnskey_rr_set; - int candidate_keys = 0; - struct keys_to_verify *candidates; - int i = 0; - int t; - - named_rr = rr->rr.rr_set->named_rr; - for (t = 0; t < G.opt.n_times_to_check; t++) { - if (G.opt.times_to_check[t] < rr->sig_inception) { - return moan(rr->rr.file_name, rr->rr.line, "%s signature is too new", named_rr->name); - } - if (G.opt.times_to_check[t] > rr->sig_expiration) { - return moan(rr->rr.file_name, rr->rr.line, "%s signature is too old", named_rr->name); - } - } - signed_set = find_rr_set_in_named_rr(named_rr, rr->type_covered); - if (!signed_set) { - return moan(rr->rr.file_name, rr->rr.line, "%s RRSIG exists for non-existing type %s", named_rr->name, rdtype2str(rr->type_covered)); - } - if (signed_set->tail->ttl != rr->orig_ttl) { - return moan(rr->rr.file_name, rr->rr.line, "%s RRSIG's original TTL differs from corresponding record's", named_rr->name); - } - dnskey_rr_set = find_rr_set(T_DNSKEY, rr->signer); - if (!dnskey_rr_set) { - return moan(rr->rr.file_name, rr->rr.line, "%s RRSIG(%s): cannot find a signer key (%s)", named_rr->name, rdtype2str(rr->type_covered), rr->signer); - } - key = (struct rr_dnskey *)dnskey_rr_set->tail; - while (key) { - if (key->algorithm == rr->algorithm && key->key_tag == rr->key_tag) { - candidate_keys++; - dnskey_build_pkey(key); - } - key = (struct rr_dnskey *)key->rr.next; - } - if (candidate_keys == 0) - return moan(rr->rr.file_name, rr->rr.line, "%s RRSIG(%s): cannot find the right signer key (%s)", named_rr->name, rdtype2str(rr->type_covered), rr->signer); - - candidates = getmem(sizeof(struct keys_to_verify) + (candidate_keys-1) * sizeof(struct verification_data)); - candidates->next = all_keys_to_verify; - candidates->rr = rr; - candidates->signed_set = signed_set; - candidates->n_keys = candidate_keys; - all_keys_to_verify = candidates; - key = (struct rr_dnskey *)dnskey_rr_set->tail; - while (key) { - if (key->algorithm == rr->algorithm && key->key_tag == rr->key_tag) { - candidates->to_verify[i].key = key; - candidates->to_verify[i].rr = rr; - candidates->to_verify[i].ok = 0; - candidates->to_verify[i].openssl_error = 0; - candidates->to_verify[i].next = NULL; - i++; - } - key = (struct rr_dnskey *)key->rr.next; - } - - return rr; -} - -static pthread_mutex_t *lock_cs; -static long *lock_count; - -static unsigned long pthreads_thread_id(void) -{ - unsigned long ret; - - ret=(unsigned long)pthread_self(); - return(ret); -} - -static void pthreads_locking_callback(int mode, int type, char *file, int line) -{ - if (mode & CRYPTO_LOCK) { - pthread_mutex_lock(&(lock_cs[type])); - lock_count[type]++; - } else { - pthread_mutex_unlock(&(lock_cs[type])); - } -} - -void verify_all_keys(void) -{ - struct keys_to_verify *k = all_keys_to_verify; - int i; - struct timespec sleep_time; - - ERR_load_crypto_strings(); - if (G.opt.n_threads > 1) { - lock_cs = OPENSSL_malloc(CRYPTO_num_locks() * sizeof(pthread_mutex_t)); - lock_count = OPENSSL_malloc(CRYPTO_num_locks() * sizeof(long)); - for (i = 0; i < CRYPTO_num_locks(); i++) { - lock_count[i] = 0; - pthread_mutex_init(&lock_cs[i],NULL); - } - - CRYPTO_set_id_callback((unsigned long (*)())pthreads_thread_id); - CRYPTO_set_locking_callback((void (*)())pthreads_locking_callback); - - if (pthread_mutex_init(&queue_lock, NULL) != 0) - croak(1, "pthread_mutex_init"); - } - - while (k) { - freeall_temp(); - for (i = 0; i < k->n_keys; i++) { - if (dnskey_build_pkey(k->to_verify[i].key)) - verify_signature(&k->to_verify[i], k->signed_set); - } - k = k->next; - } - start_workers(); /* this is needed in case n_threads is greater than the number of signatures to verify */ - while (verification_queue_size > 0) { - sleep_time.tv_sec = 0; - sleep_time.tv_nsec = 10000000; - nanosleep(&sleep_time, NULL); - } - k = all_keys_to_verify; - while (k) { - int ok = 0; - unsigned long e = 0; - for (i = 0; i < k->n_keys; i++) { - if (k->to_verify[i].ok) { - ok = 1; - break; - } else { - if (k->to_verify[i].openssl_error != 0) - e = k->to_verify[i].openssl_error; - } - } - if (!ok) { - struct named_rr *named_rr; - named_rr = k->rr->rr.rr_set->named_rr; - moan(k->rr->rr.file_name, k->rr->rr.line, "%s RRSIG(%s): %s", - named_rr->name, rdtype2str(k->rr->type_covered), - e ? ERR_reason_error_string(e) : "cannot verify signature, reason unknown"); - } - k = k->next; - } -} - -struct rr_methods rrsig_methods = { rrsig_parse, rrsig_human, rrsig_wirerdata, NULL, rrsig_validate }; diff -Naur validns-0.8/rrsig.c.rej validns/rrsig.c.rej --- validns-0.8/rrsig.c.rej 2020-10-05 16:57:07.219376944 -0400 +++ validns/rrsig.c.rej 1969-12-31 19:00:00.000000000 -0500 @@ -1,54 +0,0 @@ ---- rrsig.c -+++ rrsig.c -@@ -97,10 +97,13 @@ static struct rr* rrsig_parse(char *name, long ttl, int type, char *s) - * representation (r || s) into OpenSSL ASN.1 DER format - */ - ECDSA_SIG *ecdsa_sig = ECDSA_SIG_new(); -+ BIGNUM *r, *s; - int l = sig.length / 2; -- if ((BN_bin2bn((unsigned char *)sig.data, l, ecdsa_sig->r) == NULL) || -- (BN_bin2bn(((unsigned char *)sig.data) + l, l, ecdsa_sig->s) == NULL)) -+ r = BN_bin2bn((unsigned char *)sig.data, l, NULL); -+ s = BN_bin2bn((unsigned char *)sig.data + l, l, NULL); -+ if ((r == NULL) || (s == NULL)) - return NULL; -+ ECDSA_SIG_set0(ecdsa_sig, r, s); - sig.length = i2d_ECDSA_SIG(ecdsa_sig, NULL); - sig.data = getmem(sig.length); /* reallocate larger mempool chunk */ - unsigned char *sig_ptr = (unsigned char *)sig.data; -@@ -267,29 +270,29 @@ static int verify_signature(struct verification_data *d, struct rr_set *signed_s - struct rr *signed_rr; - int i; - -- EVP_MD_CTX_init(&d->ctx); -+ d->ctx = EVP_MD_CTX_new(); - switch (d->rr->algorithm) { - case ALG_DSA: - case ALG_RSASHA1: - case ALG_DSA_NSEC3_SHA1: - case ALG_RSASHA1_NSEC3_SHA1: -- if (EVP_VerifyInit(&d->ctx, EVP_sha1()) != 1) -+ if (EVP_VerifyInit(d->ctx, EVP_sha1()) != 1) - return 0; - break; - case ALG_RSASHA256: -- if (EVP_VerifyInit(&d->ctx, EVP_sha256()) != 1) -+ if (EVP_VerifyInit(d->ctx, EVP_sha256()) != 1) - return 0; - break; - case ALG_RSASHA512: -- if (EVP_VerifyInit(&d->ctx, EVP_sha512()) != 1) -+ if (EVP_VerifyInit(d->ctx, EVP_sha512()) != 1) - return 0; - break; - case ALG_ECDSAP256SHA256: -- if (EVP_VerifyInit(&d->ctx, EVP_sha256()) != 1) -+ if (EVP_VerifyInit(d->ctx, EVP_sha256()) != 1) - return 0; - break; - case ALG_ECDSAP384SHA384: -- if (EVP_VerifyInit(&d->ctx, EVP_sha384()) != 1) -+ if (EVP_VerifyInit(d->ctx, EVP_sha384()) != 1) - return 0; - break; - default: diff -Naur validns-0.8/rt.c validns/rt.c --- validns-0.8/rt.c 2014-02-11 15:46:53.000000000 -0500 +++ validns/rt.c 2020-10-05 16:59:29.356681378 -0400 @@ -19,38 +19,38 @@ static struct rr *rt_parse(char *name, long ttl, int type, char *s) { - struct rr_rt *rr = getmem(sizeof(*rr)); + struct rr_rt *rr = getmem(sizeof(*rr)); - rr->preference = extract_integer(&s, "RT preference"); - if (rr->preference < 0) - return NULL; - - rr->intermediate_host = extract_name(&s, "intermediate-host", 0); - if (!rr->intermediate_host) - return NULL; - if (*s) { - return bitch("garbage after valid RT data"); - } + rr->preference = extract_integer(&s, "RT preference", NULL); + if (rr->preference < 0) + return NULL; + + rr->intermediate_host = extract_name(&s, "intermediate-host", 0); + if (!rr->intermediate_host) + return NULL; + if (*s) { + return bitch("garbage after valid RT data"); + } - return store_record(type, name, ttl, rr); + return store_record(type, name, ttl, rr); } static char* rt_human(struct rr *rrv) { - RRCAST(rt); + RRCAST(rt); char s[1024]; snprintf(s, 1024, "%d %s", - rr->preference, rr->intermediate_host); + rr->preference, rr->intermediate_host); return quickstrdup_temp(s); } static struct binary_data rt_wirerdata(struct rr *rrv) { - RRCAST(rt); + RRCAST(rt); return compose_binary_data("2d", 1, - rr->preference, name2wire_name(rr->intermediate_host)); + rr->preference, name2wire_name(rr->intermediate_host)); } struct rr_methods rt_methods = { rt_parse, rt_human, rt_wirerdata, NULL, NULL }; diff -Naur validns-0.8/soa.c validns/soa.c --- validns-0.8/soa.c 2014-02-11 15:45:26.000000000 -0500 +++ validns/soa.c 2020-10-05 16:59:29.356681378 -0400 @@ -20,61 +20,64 @@ static struct rr* soa_parse(char *name, long ttl, int type, char *s) { - struct rr_soa *rr = getmem(sizeof(*rr)); - long long i; + struct rr_soa *rr = getmem(sizeof(*rr)); + long long i; - rr->mname = extract_name(&s, "mname", 0); - if (!rr->mname) return NULL; - rr->rname = extract_name(&s, "rname", 0); - if (!rr->rname) return NULL; - i = extract_integer(&s, "serial"); - if (i < 0) return NULL; - if (i > 4294967295UL) return bitch("serial is out of range"); - rr->serial = i; - rr->refresh = extract_timevalue(&s, "refresh"); - if (rr->refresh < 0) return NULL; - rr->retry = extract_timevalue(&s, "retry"); - if (rr->retry < 0) return NULL; - rr->expire = extract_timevalue(&s, "expire"); - if (rr->expire < 0) return NULL; - rr->minimum = extract_timevalue(&s, "minimum"); - if (rr->minimum < 0) return NULL; - if (*s) { - return bitch("garbage after valid SOA data"); - } - return store_record(type, name, ttl, rr); + rr->mname = extract_name(&s, "mname", 0); + if (!rr->mname) return NULL; + rr->rname = extract_name(&s, "rname", 0); + if (!rr->rname) return NULL; + i = extract_integer(&s, "serial", NULL); + if (i < 0) return NULL; + if (i > 4294967295UL) return bitch("serial is out of range"); + rr->serial = i; + rr->refresh = extract_timevalue(&s, "refresh"); + if (rr->refresh < 0) return NULL; + rr->retry = extract_timevalue(&s, "retry"); + if (rr->retry < 0) return NULL; + rr->expire = extract_timevalue(&s, "expire"); + if (rr->expire < 0) return NULL; + rr->minimum = extract_timevalue(&s, "minimum"); + if (rr->minimum < 0) return NULL; + if (ttl < 0 && G.opt.soa_minttl_as_default_ttl) { + ttl = rr->minimum; + } + if (*s) { + return bitch("garbage after valid SOA data"); + } + return store_record(type, name, ttl, rr); } static char* soa_human(struct rr *rrv) { - RRCAST(soa); + RRCAST(soa); char s[1024]; snprintf(s, 1024, "%s %s %u %d %d %d %d", - rr->mname, rr->rname, rr->serial, - rr->refresh, rr->retry, rr->expire, rr->minimum); + rr->mname, rr->rname, rr->serial, + rr->refresh, rr->retry, rr->expire, rr->minimum); return quickstrdup_temp(s); } static struct binary_data soa_wirerdata(struct rr *rrv) { - RRCAST(soa); + RRCAST(soa); - return compose_binary_data("dd44444", 1, - name2wire_name(rr->mname), name2wire_name(rr->rname), - rr->serial, rr->refresh, rr->retry, - rr->expire, rr->minimum); + return compose_binary_data("dd44444", 1, + name2wire_name(rr->mname), name2wire_name(rr->rname), + rr->serial, rr->refresh, rr->retry, + rr->expire, rr->minimum); } static void *soa_validate(struct rr *rrv) { - RRCAST(soa); + RRCAST(soa); - if (strchr(rr->mname, '/') != NULL) - return moan(rr->rr.file_name, rr->rr.line, "MNAME contains '/'"); - if (strchr(rr->rname, '/') != NULL) - return moan(rr->rr.file_name, rr->rr.line, "RNAME contains '/'"); - return NULL; + if (strchr(rr->mname, '/') != NULL) + return moan(rr->rr.file_name, rr->rr.line, "MNAME contains '/'"); + if (strchr(rr->rname, '/') != NULL) + return moan(rr->rr.file_name, rr->rr.line, "RNAME contains '/'"); + return NULL; } struct rr_methods soa_methods = { soa_parse, soa_human, soa_wirerdata, NULL, soa_validate }; diff -Naur validns-0.8/spf.c validns/spf.c --- validns-0.8/spf.c 2014-02-11 15:46:10.000000000 -0500 +++ validns/spf.c 2020-10-05 16:59:29.356681378 -0400 @@ -19,70 +19,70 @@ /* XXX * We need to add the following spf-specific policy checks: - * - record not too long (DNS name + length of SPF+TXT < 450) - rfc4408, 3.1.4 - * - record should match /^v=spf1( |$)/ - rfc4408, 4.5 - * - maybe check for other syntax features - * - there should be an identical TXT record - rfc4408, 3.1.1 - * - there should only be one SPF per DNS name - rfc4408, 4.5 + * - record not too long (DNS name + length of SPF+TXT < 450) - rfc4408, 3.1.4 + * - record should match /^v=spf1( |$)/ - rfc4408, 4.5 + * - maybe check for other syntax features + * - there should be an identical TXT record - rfc4408, 3.1.1 + * - there should only be one SPF per DNS name - rfc4408, 4.5 */ static struct rr *spf_parse(char *name, long ttl, int type, char *s) { - struct rr_spf *rr; - struct binary_data spf[20]; - int i; - - i = 0; - while (*s) { - if (i >= 20) - return bitch("program limit: too many SPF text segments"); - spf[i] = extract_text(&s, "SPF text segment"); - if (spf[i].length < 0) - return NULL; - if (spf[i].length > 255) - return bitch("SPF segment too long"); - i++; - } - if (i == 0) - return bitch("empty text record"); - - rr = getmem(sizeof(*rr) + sizeof(struct binary_data) * (i-1)); - rr->count = i; - for (i = 0; i < rr->count; i++) { - rr->spf[i] = spf[i]; - } + struct rr_spf *rr; + struct binary_data spf[20]; + int i; + + i = 0; + while (*s) { + if (i >= 20) + return bitch("program limit: too many SPF text segments"); + spf[i] = extract_text(&s, "SPF text segment"); + if (spf[i].length < 0) + return NULL; + if (spf[i].length > 255) + return bitch("SPF segment too long"); + i++; + } + if (i == 0) + return bitch("empty text record"); + + rr = getmem(sizeof(*rr) + sizeof(struct binary_data) * (i-1)); + rr->count = i; + for (i = 0; i < rr->count; i++) { + rr->spf[i] = spf[i]; + } - return store_record(type, name, ttl, rr); + return store_record(type, name, ttl, rr); } static char* spf_human(struct rr *rrv) { - RRCAST(spf); + RRCAST(spf); char ss[1024]; - int i; - char *s = ss; - int l; - - for (i = 0; i < rr->count; i++) { - l = snprintf(s, 1024-(s-ss), "\"%s\" ", rr->spf[i].data); - s += l; - } + int i; + char *s = ss; + int l; + + for (i = 0; i < rr->count; i++) { + l = snprintf(s, 1024-(s-ss), "\"%s\" ", rr->spf[i].data); + s += l; + } return quickstrdup_temp(ss); } static struct binary_data spf_wirerdata(struct rr *rrv) { - RRCAST(spf); - struct binary_data r, t; - int i; - - r = bad_binary_data(); - t.length = 0; - t.data = NULL; - for (i = 0; i < rr->count; i++) { - r = compose_binary_data("db", 1, t, rr->spf[i]); - t = r; - } + RRCAST(spf); + struct binary_data r, t; + int i; + + r = bad_binary_data(); + t.length = 0; + t.data = NULL; + for (i = 0; i < rr->count; i++) { + r = compose_binary_data("db", 1, t, rr->spf[i]); + t = r; + } return r; } diff -Naur validns-0.8/srv.c validns/srv.c --- validns-0.8/srv.c 2014-02-11 15:45:48.000000000 -0500 +++ validns/srv.c 2020-10-05 16:59:29.356681378 -0400 @@ -19,60 +19,60 @@ static struct rr *srv_parse(char *name, long ttl, int type, char *s) { - struct rr_srv *rr = getmem(sizeof(*rr)); - int i; + struct rr_srv *rr = getmem(sizeof(*rr)); + int i; - /* TODO validate `name` (underscores etc) http://tools.ietf.org/html/rfc2782 */ + /* TODO validate `name` (underscores etc) http://tools.ietf.org/html/rfc2782 */ - i = extract_integer(&s, "priority"); - if (i < 0) - return NULL; - if (i >= 65536) - return bitch("priority range is not valid"); - rr->priority = i; - - i = extract_integer(&s, "weight"); - if (i < 0) - return NULL; - if (i >= 65536) - return bitch("weight range is not valid"); - rr->weight = i; - - i = extract_integer(&s, "port"); - if (i < 0) - return NULL; - if (i >= 65536) - return bitch("port range is not valid"); - rr->port = i; - - rr->target = extract_name(&s, "target", 0); - if (!rr->target) - return NULL; - - if (*s) { - return bitch("garbage after valid SRV data"); - } + i = extract_integer(&s, "priority", NULL); + if (i < 0) + return NULL; + if (i >= 65536) + return bitch("priority range is not valid"); + rr->priority = i; + + i = extract_integer(&s, "weight", NULL); + if (i < 0) + return NULL; + if (i >= 65536) + return bitch("weight range is not valid"); + rr->weight = i; + + i = extract_integer(&s, "port", NULL); + if (i < 0) + return NULL; + if (i >= 65536) + return bitch("port range is not valid"); + rr->port = i; + + rr->target = extract_name(&s, "target", 0); + if (!rr->target) + return NULL; + + if (*s) { + return bitch("garbage after valid SRV data"); + } - return store_record(type, name, ttl, rr); + return store_record(type, name, ttl, rr); } static char* srv_human(struct rr *rrv) { - RRCAST(srv); + RRCAST(srv); char s[1024]; - snprintf(s, 1024, "%hu %hu %hu %s", - rr->priority, rr->weight, rr->port, rr->target); + snprintf(s, 1024, "%hu %hu %hu %s", + rr->priority, rr->weight, rr->port, rr->target); - return quickstrdup_temp(s); + return quickstrdup_temp(s); } static struct binary_data srv_wirerdata(struct rr *rrv) { - RRCAST(srv); + RRCAST(srv); return compose_binary_data("222d", 1, - rr->priority, rr->weight, rr->port, - name2wire_name(rr->target)); + rr->priority, rr->weight, rr->port, + name2wire_name(rr->target)); } struct rr_methods srv_methods = { srv_parse, srv_human, srv_wirerdata, NULL, NULL }; diff -Naur validns-0.8/sshfp.c validns/sshfp.c --- validns-0.8/sshfp.c 2014-02-11 15:45:51.000000000 -0500 +++ validns/sshfp.c 2020-10-05 16:59:29.356681378 -0400 @@ -19,63 +19,63 @@ static struct rr* sshfp_parse(char *name, long ttl, int type, char *s) { - struct rr_sshfp *rr = getmem(sizeof(*rr)); - int algorithm, fp_type; + struct rr_sshfp *rr = getmem(sizeof(*rr)); + int algorithm, fp_type; - algorithm = extract_integer(&s, "algorithm"); - if (algorithm < 0) return NULL; - if (algorithm != 1 && algorithm != 2 && algorithm != 3) - return bitch("unsupported algorithm"); - rr->algorithm = algorithm; - - fp_type = extract_integer(&s, "fp type"); - if (fp_type < 0) return NULL; - if (fp_type != 1 && fp_type != 2) - return bitch("unsupported fp_type"); - rr->fp_type = fp_type; - - rr->fingerprint = extract_hex_binary_data(&s, "fingerprint", EXTRACT_EAT_WHITESPACE); - if (rr->fingerprint.length < 0) return NULL; - - if (rr->fp_type == 1 && rr->fingerprint.length != SHA1_BYTES) { - return bitch("wrong SHA-1 fingerprint length: %d bytes found, %d bytes expected", - rr->fingerprint.length, SHA1_BYTES); - } - if (rr->fp_type == 2 && rr->fingerprint.length != SHA256_BYTES) { - return bitch("wrong SHA-256 fingerprint length: %d bytes found, %d bytes expected", - rr->fingerprint.length, SHA256_BYTES); - } - - if (*s) { - return bitch("garbage after valid SSHFP data"); - } - return store_record(type, name, ttl, rr); + algorithm = extract_integer(&s, "algorithm", NULL); + if (algorithm < 0) return NULL; + if (algorithm != 1 && algorithm != 2 && algorithm != 3 && algorithm != 4) + return bitch("unsupported algorithm"); + rr->algorithm = algorithm; + + fp_type = extract_integer(&s, "fp type", NULL); + if (fp_type < 0) return NULL; + if (fp_type != 1 && fp_type != 2) + return bitch("unsupported fp_type"); + rr->fp_type = fp_type; + + rr->fingerprint = extract_hex_binary_data(&s, "fingerprint", EXTRACT_EAT_WHITESPACE); + if (rr->fingerprint.length < 0) return NULL; + + if (rr->fp_type == 1 && rr->fingerprint.length != SHA1_BYTES) { + return bitch("wrong SHA-1 fingerprint length: %d bytes found, %d bytes expected", + rr->fingerprint.length, SHA1_BYTES); + } + if (rr->fp_type == 2 && rr->fingerprint.length != SHA256_BYTES) { + return bitch("wrong SHA-256 fingerprint length: %d bytes found, %d bytes expected", + rr->fingerprint.length, SHA256_BYTES); + } + + if (*s) { + return bitch("garbage after valid SSHFP data"); + } + return store_record(type, name, ttl, rr); } static char* sshfp_human(struct rr *rrv) { - RRCAST(sshfp); + RRCAST(sshfp); char ss[4096]; - char *s = ss; - int l; - int i; + char *s = ss; + int l; + int i; l = snprintf(s, 4096, "%u %u ", rr->algorithm, rr->fp_type); - s += l; - for (i = 0; i < rr->fingerprint.length; i++) { - l = snprintf(s, 4096-(s-ss), "%02X", (unsigned char)rr->fingerprint.data[i]); - s += l; - } + s += l; + for (i = 0; i < rr->fingerprint.length; i++) { + l = snprintf(s, 4096-(s-ss), "%02X", (unsigned char)rr->fingerprint.data[i]); + s += l; + } return quickstrdup_temp(ss); } static struct binary_data sshfp_wirerdata(struct rr *rrv) { - RRCAST(sshfp); + RRCAST(sshfp); - return compose_binary_data("11d", 1, - rr->algorithm, rr->fp_type, - rr->fingerprint); + return compose_binary_data("11d", 1, + rr->algorithm, rr->fp_type, + rr->fingerprint); } struct rr_methods sshfp_methods = { sshfp_parse, sshfp_human, sshfp_wirerdata, NULL, NULL }; diff -Naur validns-0.8/t/issues/36-include/empty-include.zone validns/t/issues/36-include/empty-include.zone --- validns-0.8/t/issues/36-include/empty-include.zone 1969-12-31 19:00:00.000000000 -0500 +++ validns/t/issues/36-include/empty-include.zone 2020-10-05 16:59:29.357681388 -0400 @@ -0,0 +1,4 @@ +$ORIGIN example.com. +@ IN 200 SOA ns hostmaster 1 10800 3600 2592000 1200 + IN NS ns +$INCLUDE ; there is no include, and it is wrong diff -Naur validns-0.8/t/issues/36-include/inc2.inc validns/t/issues/36-include/inc2.inc --- validns-0.8/t/issues/36-include/inc2.inc 1969-12-31 19:00:00.000000000 -0500 +++ validns/t/issues/36-include/inc2.inc 2020-10-05 16:59:29.357681388 -0400 @@ -0,0 +1,2 @@ +$ORIGIN inc2 ; i.e., inc2.inc1.example.com. +@ A 55.55.55.55 diff -Naur validns-0.8/t/issues/36-include/include.zone validns/t/issues/36-include/include.zone --- validns-0.8/t/issues/36-include/include.zone 1969-12-31 19:00:00.000000000 -0500 +++ validns/t/issues/36-include/include.zone 2020-10-05 16:59:29.357681388 -0400 @@ -0,0 +1,6 @@ +$ORIGIN example.com. +@ IN 200 SOA ns hostmaster 1 10800 3600 2592000 1200 + IN NS ns +$INCLUDE reldir/inc1.inc ; relative to the zone file +; here we should be back to our origin +@ IN A 99.99.99.99 diff -Naur validns-0.8/t/issues/36-include/missing-include.zone validns/t/issues/36-include/missing-include.zone --- validns-0.8/t/issues/36-include/missing-include.zone 1969-12-31 19:00:00.000000000 -0500 +++ validns/t/issues/36-include/missing-include.zone 2020-10-05 16:59:29.357681388 -0400 @@ -0,0 +1,4 @@ +$ORIGIN example.com. +@ IN 200 SOA ns hostmaster 1 10800 3600 2592000 1200 + IN NS ns +$INCLUDE nosuch.inc diff -Naur validns-0.8/t/issues/36-include/reldir/inc1.inc validns/t/issues/36-include/reldir/inc1.inc --- validns-0.8/t/issues/36-include/reldir/inc1.inc 1969-12-31 19:00:00.000000000 -0500 +++ validns/t/issues/36-include/reldir/inc1.inc 2020-10-05 16:59:29.357681388 -0400 @@ -0,0 +1,5 @@ +$ORIGIN inc1 ; i.e., inc1.example.com. +@ A 11.11.11.11 +$INCLUDE inc2.inc ; still relative to the zone file, not to this dir +; should be back to this origin +@ AAAA 1111::1111 diff -Naur validns-0.8/t/issues/41-ksk-policy-check/dsset-example.sec. validns/t/issues/41-ksk-policy-check/dsset-example.sec. --- validns-0.8/t/issues/41-ksk-policy-check/dsset-example.sec. 1969-12-31 19:00:00.000000000 -0500 +++ validns/t/issues/41-ksk-policy-check/dsset-example.sec. 2020-10-05 16:59:29.357681388 -0400 @@ -0,0 +1,2 @@ +example.sec. IN DS 7686 7 1 51B9CD8F901235705C6D353ADA23736AE954B4DE +example.sec. IN DS 7686 7 2 9EC80B8BAD67C66954B8FE726E06CA7840282C7F444BE51A916ED11C 36908A3F diff -Naur validns-0.8/t/issues/41-ksk-policy-check/example.sec validns/t/issues/41-ksk-policy-check/example.sec --- validns-0.8/t/issues/41-ksk-policy-check/example.sec 1969-12-31 19:00:00.000000000 -0500 +++ validns/t/issues/41-ksk-policy-check/example.sec 2020-10-05 16:59:29.357681388 -0400 @@ -0,0 +1,12 @@ +$TTL 1d +@ IN SOA ns.example.sec. hostmaster.example.sec. ( + 1 ; Serial + 604800 ; Refresh + 86400 ; Retry + 2419200 ; Expire + 604800 ) ; Negative Cache TTL + IN NS ns1.example.net. +subA IN NS ns1.example.net. +subb IN NS ns1.example.net. +subC IN NS ns1.example.net. +myMX IN MX 5 mx.example.net. diff -Naur validns-0.8/t/issues/41-ksk-policy-check/example.sec.signed validns/t/issues/41-ksk-policy-check/example.sec.signed --- validns-0.8/t/issues/41-ksk-policy-check/example.sec.signed 1969-12-31 19:00:00.000000000 -0500 +++ validns/t/issues/41-ksk-policy-check/example.sec.signed 2020-10-05 16:59:29.357681388 -0400 @@ -0,0 +1,131 @@ +; File written on Tue Jun 30 15:31:27 2015 +; dnssec_signzone version 9.9.7 +example.sec. 86400 IN SOA ns.example.sec. hostmaster.example.sec. ( + 1 ; serial + 604800 ; refresh (1 week) + 86400 ; retry (1 day) + 2419200 ; expire (4 weeks) + 604800 ; minimum (1 week) + ) + 86400 RRSIG SOA 7 2 86400 ( + 20150730123127 20150630123127 64232 example.sec. + b1Qs5d/0a4IDAvFPVvDKqWpir4189XoPOD4E + 804eiNXRLP2ShkEUBPil44+6Ikwup5Im24XU + PLnmStjUFHVniicvwbwT/IY4etXR4xNoBHUc + BU8LiADPpZGfJ1tC/s/IHLcPbX21OltyYzi0 + ++z9gxZGy4vCG5gYCH0vm+Q96fY= ) + 86400 NS ns1.example.net. + 86400 RRSIG NS 7 2 86400 ( + 20150730123127 20150630123127 64232 example.sec. + gyqsk3xSnKefnjTOVzJS4sdDFiJ5cPEupSkP + +LGXGRDGrclY6V9mkfddQz3MkeCCjujvQNAi + NpZllyzFj221se5bHLAVydkT0jhl2jgp8bsL + DBk15FGa7SXcwtpXn5rkDvR1/wmS7M/aYnrY + 3j5dTSSsOlZQLENWBEtct9QSNbU= ) + 86400 DNSKEY 256 3 7 ( + AwEAAaMBYu1QXBi6AII33FKwWpHhOkGMhcVc + IWJ73npEFjvDe0jJfLjkghnij4tMfDI8MPIZ + 6xwVLYsEshxsDNEJJGdZ1dUvfJDxSCv8Wp0a + 2IffxQ5NDRHSpUw27yJoQfI5gUqvor+wGTNC + UWx2OU0Y1BOy1whHtVbDl1gt1R6/8mOZ + ) ; ZSK; alg = NSEC3RSASHA1; key id = 64232 + 86400 DNSKEY 257 3 7 ( + AwEAAciLWglw17dt8EDAN88BrQYCIaGPifC4 + pxrizfz3S1cC4XbSyRW5loj5SSHVveUmmIV9 + 0MTEOhGCDUVq/qiYG7NgTNHn3YiqyRU3sirw + 4SACFiwln/ejxFDpQkeAbZMCzU8FQhTIB1K9 + y7QRiLacI6naULzgP3h4PsdQSQmw3/TWy973 + M+lHzwkgVq6ML42L18rGG0sn1KQDNSs/6sd9 + dcRjPo7uJ2OuUsnbu/5N3vWYLciSBUnY27FU + vbFLkVIq072wjUMIb0Xc2EgYGRFKyV2MMckL + voD7vPclBE0Krv9fO/B2/KXsbObTgz4m5iQN + F45QLU02kmvwB4iyIzIk9O0= + ) ; KSK; alg = NSEC3RSASHA1; key id = 7686 + 86400 RRSIG DNSKEY 7 2 86400 ( + 20150730123127 20150630123127 7686 example.sec. + YQ42WBCr7e4MR51W+d6Awkxdff7tTNiA1qfJ + wsst0UiNXKAv504YRcS6B34u4CfG59lWWtcd + +xBHU7Zuox5nehsLEkFAneD1YrJLkgVw03nZ + NzDNWFvlxfQ2/tJ7vGbjKG2cEwUnbJKl+Kcl + JTAc5JzZegfM75M0Z4Yi9NiDjicpHbaICtKJ + 5WZ6T5nVFo1nl2xCq2CiXiR1+jGKARUW+btO + NzHMApLQszDo7CMgvYJoHy0CHAV1Uc7Ka4zO + P3dVYkwu1Puk+gixhNUqo+UhKgLB2JUYdci7 + cQ1JR9RzqEXzyZgGpLmXCOEOc8KD2c2dDN5L + uvOV40OrWhST/bAQ+Q== ) + 86400 RRSIG DNSKEY 7 2 86400 ( + 20150730123127 20150630123127 64232 example.sec. + lKX35bocQ1iR4VTW0Es+2bZ2qX1ON7OGU1fO + Pb0ZqueG2GYgI63VE4Jv3WeOmGg/Tkjvsdb6 + bMHVuVpxHvQKRqqzfaQmY7nzoDe53LfSJewj + p2TvdhvpPRroEZGXXPmVl46R/p+jlYMJd47T + o0oqB/BvQPUS61a5NThagGq6vJM= ) + 0 NSEC3PARAM 1 0 10 - + 0 RRSIG NSEC3PARAM 7 2 0 ( + 20150730123127 20150630123127 64232 example.sec. + hNJlc3JuGYBpnYEZQrhqNwrIL2fBegnnR4ii + TOW+0Km2maqF5ZZMxBZ7x54gW4T0amXXz89+ + uE+l02eknf/FgM81FFOrQvJul0toOzKW9g67 + e2VwQAwcw7g6H06cSsypXM/h9wvsNQpoSdx0 + rq6qU2ruYM9NmJf+xUzUk38AFUw= ) +subA.example.sec. 86400 IN NS ns1.example.net. +subb.example.sec. 86400 IN NS ns1.example.net. +subC.example.sec. 86400 IN NS ns1.example.net. +93GL7KF6D2G7J2PSLEO2CIA70A3MM4KQ.example.sec. 604800 IN NSEC3 1 0 10 - ( + CSLD6RFNKVSKA73DGNI0EOM95Q8DKGBQ + NS ) + 604800 RRSIG NSEC3 7 3 604800 ( + 20150730123127 20150630123127 64232 example.sec. + JRhyC3PbmnvYBkXzV5GmIBnj5LJTnrVeC1t3 + v6t6o+3udfPZRecHw2cApf/Oed8H9jCeox77 + vA13/fLXui635CYAcqXYxVgO4g0au1d1S6lo + N2Pw96JXDNhIqyVBVj1Ii2ZOQLWXZ8YgZRQ6 + lxgww8m0QGC8FjEnzR8z2liSG88= ) +3ED4GMVJJ0FT4TCFDKNFQ5EPEFSDBPNM.example.sec. 604800 IN NSEC3 1 0 10 - ( + 93GL7KF6D2G7J2PSLEO2CIA70A3MM4KQ + NS ) + 604800 RRSIG NSEC3 7 3 604800 ( + 20150730123127 20150630123127 64232 example.sec. + B9L5NrHjO/J6FDmv7DjT1xq/f8jiB2WTEXSl + bFeUVcTivoyvdyfNNTH+YlzJesqTtQ9GaEPQ + ouzw7XbdyvtJ//GD+vrO/7XwfrVmkckQgEVl + zPm70TksAkwLzj0uY6WBIGIPq/KJMM14f6El + ct5w2KtgvF9sazFP+KMchU5Be3Q= ) +myMX.example.sec. 86400 IN MX 5 mx.example.net. + 86400 RRSIG MX 7 3 86400 ( + 20150730123127 20150630123127 64232 example.sec. + lh8vFwFg77gLtLyXbzqzYSlebkzn3yAlXHU2 + /hgiyUWYcuZa5E33Ul+ZrUJPCGLaUQs3X+yL + p/uk6LP2dnMaf/X1mow/tyYNtIdn0MhTYNqs + WmYV1Ga/NSoErtoHYoNgeqV1w0Q/nfhipMdX + RekpxVR6RUUt2d3LS8UIH+pEYd8= ) +CSLD6RFNKVSKA73DGNI0EOM95Q8DKGBQ.example.sec. 604800 IN NSEC3 1 0 10 - ( + JC1M8I9IPBEENK9RDGMN9LQKAMMSQEVV + MX RRSIG ) + 604800 RRSIG NSEC3 7 3 604800 ( + 20150730123127 20150630123127 64232 example.sec. + menCNV7RkbVWmfhuPfoYHfHCEtvQmVb3+p/x + WYVymu5hXUPQ2+K4Ns0jQ+om4GuTmXmm1DYY + IjIXv4jthJoD6jydqN6Hr+tr0ewxr6mHXj3I + RizTBuw4zcgPUrIRVQStkMtwyjN4Nlznhg7I + txZ14uH1G4U1DgkR2oC6YZsSqi8= ) +JC1M8I9IPBEENK9RDGMN9LQKAMMSQEVV.example.sec. 604800 IN NSEC3 1 0 10 - ( + NLF2NKFTCGVVRC4C941FOOCD00TPI9DV + NS SOA RRSIG DNSKEY NSEC3PARAM ) + 604800 RRSIG NSEC3 7 3 604800 ( + 20150730123127 20150630123127 64232 example.sec. + ggLIoKQYmI9GeBkSccVdE87G1QQwGGO0HlrN + dg9Ah5QiWWjZ5icSOU4vyEm0XiqkFCrGEAq0 + 9L4HMOFuELMa28dAhVxOvZldbXizXUSCbWCS + miYFLOIKcQ9IcmzeEgg+uJzHdAyYSSK2Jb+0 + YYuoXOhiZwzluj+u2i6kbf6wDY4= ) +NLF2NKFTCGVVRC4C941FOOCD00TPI9DV.example.sec. 604800 IN NSEC3 1 0 10 - ( + 3ED4GMVJJ0FT4TCFDKNFQ5EPEFSDBPNM + NS ) + 604800 RRSIG NSEC3 7 3 604800 ( + 20150730123127 20150630123127 64232 example.sec. + buRQJjfJDIbRFZFr8s7odGSxqnrSHXXN/AAu + tbG1k2L7WD+DGYFiRnR5Uia/C2oL186PqBtT + R8oDKf/4zr5qOsZz9xYabaBqG98JVXwPTiFk + JBoc7sFcwGJ16hj9Zey05aNs1h5RZm6BL8W0 + 9bRF3qIezckG0VA+U7ASTLNH4ME= ) diff -Naur validns-0.8/t/issues/41-ksk-policy-check/Kexample.sec.+007+07686.key validns/t/issues/41-ksk-policy-check/Kexample.sec.+007+07686.key --- validns-0.8/t/issues/41-ksk-policy-check/Kexample.sec.+007+07686.key 1969-12-31 19:00:00.000000000 -0500 +++ validns/t/issues/41-ksk-policy-check/Kexample.sec.+007+07686.key 2020-10-05 16:59:29.357681388 -0400 @@ -0,0 +1,5 @@ +; This is a key-signing key, keyid 7686, for example.sec. +; Created: 20150630133112 (Tue Jun 30 15:31:12 2015) +; Publish: 20150630133112 (Tue Jun 30 15:31:12 2015) +; Activate: 20150630133112 (Tue Jun 30 15:31:12 2015) +example.sec. IN DNSKEY 257 3 7 AwEAAciLWglw17dt8EDAN88BrQYCIaGPifC4pxrizfz3S1cC4XbSyRW5 loj5SSHVveUmmIV90MTEOhGCDUVq/qiYG7NgTNHn3YiqyRU3sirw4SAC Fiwln/ejxFDpQkeAbZMCzU8FQhTIB1K9y7QRiLacI6naULzgP3h4PsdQ SQmw3/TWy973M+lHzwkgVq6ML42L18rGG0sn1KQDNSs/6sd9dcRjPo7u J2OuUsnbu/5N3vWYLciSBUnY27FUvbFLkVIq072wjUMIb0Xc2EgYGRFK yV2MMckLvoD7vPclBE0Krv9fO/B2/KXsbObTgz4m5iQNF45QLU02kmvw B4iyIzIk9O0= diff -Naur validns-0.8/t/issues/41-ksk-policy-check/Kexample.sec.+007+07686.private validns/t/issues/41-ksk-policy-check/Kexample.sec.+007+07686.private --- validns-0.8/t/issues/41-ksk-policy-check/Kexample.sec.+007+07686.private 1969-12-31 19:00:00.000000000 -0500 +++ validns/t/issues/41-ksk-policy-check/Kexample.sec.+007+07686.private 2020-10-05 16:59:29.357681388 -0400 @@ -0,0 +1,13 @@ +Private-key-format: v1.3 +Algorithm: 7 (NSEC3RSASHA1) +Modulus: yItaCXDXt23wQMA3zwGtBgIhoY+J8LinGuLN/PdLVwLhdtLJFbmWiPlJIdW95SaYhX3QxMQ6EYINRWr+qJgbs2BM0efdiKrJFTeyKvDhIAIWLCWf96PEUOlCR4BtkwLNTwVCFMgHUr3LtBGItpwjqdpQvOA/eHg+x1BJCbDf9NbL3vcz6UfPCSBWrowvjYvXysYbSyfUpAM1Kz/qx311xGM+ju4nY65Sydu7/k3e9ZgtyJIFSdjbsVS9sUuRUirTvbCNQwhvRdzYSBgZEUrJXYwxyQu+gPu89yUETQqu/1878Hb8pexs5tODPibmJA0XjlAtTTaSa/AHiLIjMiT07Q== +PublicExponent: AQAB +PrivateExponent: d5kDfRXaz/20hikcH0v0j9y9icg8j17P6WzRQ8eHGsERDPfwDBC+AboJLzB1Ky+1TgcWdgJATyisGXYRoSH1gygvKA+LQnH3sbuheZJl79zOtE1L9TepYEd7y4B/2GiXYETWf+Y619Fwpla+nYjIjAcylzF1KLctWVg79peROEXC0zb+IxWQFIBpe7OzTZ1qxG8ymm6uiu9KXH6qQi3BLSarxj5rY+tO8oj0qQNOGkbSVsXFax0arZ0qMRFT5UooOm+2Yl8Q9Z/PC52qwNqkSDZ2QeoYTJx5tDFhuVJxXhioxGIueA4QuCRA4cRL2U5ZnCYcQa10JFE2O4N990eLUQ== +Prime1: 5LW1fl8ky4bBaIPg48Cq8bXQIvaK5syFTvzzMopuTeD6PGwOByuzc4u9KLVrDRebjeYfNVkqXIJAHMjolOr4jURWp2Q3FUrewqdgyY2ULSLMmQo0+dHkvjJIs2A/6vNme+MtFms6msJjyzj3EhLf32djvCH+jWStP3Vb/jopYWs= +Prime2: 4HlJJB25JSLygHd0GWi8yu0z3FaYhWXnIs8bwpT8er1lH+tsBeYI8ughuX9h19STMRnBhAh0ZlQaKHOrPTsdVOFQJWr6aUbWIAhv5m+ij1IFsQ58DKnsYP0DXiNkR7K4pXO8yzPTo9UfaMCJAKYipENTgpfb43sVBQnDIGr9oQc= +Exponent1: aJpK9g9h7swlLT4T31bBWGeFWFhWUxT7a5L5UAZMSMY67OOmztTH8HLbAwFmgshnVtEHOQkc/M59sCybY3DMWSAGWezV3KEvnOucstJUEQi3ds9aR2AeNHcfFRtSYI0ONF9EwdotJZb+uXXGWrfTOIQ681LA7746FqoAdxf20R0= +Exponent2: QlFS3Iqzglc60d14vXEGJeXCZpxm3zJmARCzIN+nYBPIZo/FEFEP38PZAtaxb3RsMBtt4rYkvX6nY8AYnTRzy/ntFcDvTl8RL9GOTcQ5gKI48EBZQdyJ63WUoyFNpSkWCDuTUW10X3i9mNMZJsnufh0t9O0sl55rbVue/Frfp80= +Coefficient: aLnGdfeRJ3nSjmbby8IDkJ+W+gFGOHd3XAMDSNP9D8kn6B3JyAfY6FDSg0+Bh+F80PFNGsESkYimXlWr3B6NlC0Gq99hPSV8yU2pYHq3TPVB0tWOAkNVIXM9icEH9wshCQH7wD7cPDWvhhgcgo64nYOGYeK6sjTL7XDtRanvbP8= +Created: 20150630133112 +Publish: 20150630133112 +Activate: 20150630133112 diff -Naur validns-0.8/t/issues/41-ksk-policy-check/Kexample.sec.+007+64232.key validns/t/issues/41-ksk-policy-check/Kexample.sec.+007+64232.key --- validns-0.8/t/issues/41-ksk-policy-check/Kexample.sec.+007+64232.key 1969-12-31 19:00:00.000000000 -0500 +++ validns/t/issues/41-ksk-policy-check/Kexample.sec.+007+64232.key 2020-10-05 16:59:29.357681388 -0400 @@ -0,0 +1,5 @@ +; This is a zone-signing key, keyid 64232, for example.sec. +; Created: 20150630133105 (Tue Jun 30 15:31:05 2015) +; Publish: 20150630133105 (Tue Jun 30 15:31:05 2015) +; Activate: 20150630133105 (Tue Jun 30 15:31:05 2015) +example.sec. IN DNSKEY 256 3 7 AwEAAaMBYu1QXBi6AII33FKwWpHhOkGMhcVcIWJ73npEFjvDe0jJfLjk ghnij4tMfDI8MPIZ6xwVLYsEshxsDNEJJGdZ1dUvfJDxSCv8Wp0a2Iff xQ5NDRHSpUw27yJoQfI5gUqvor+wGTNCUWx2OU0Y1BOy1whHtVbDl1gt 1R6/8mOZ diff -Naur validns-0.8/t/issues/41-ksk-policy-check/Kexample.sec.+007+64232.private validns/t/issues/41-ksk-policy-check/Kexample.sec.+007+64232.private --- validns-0.8/t/issues/41-ksk-policy-check/Kexample.sec.+007+64232.private 1969-12-31 19:00:00.000000000 -0500 +++ validns/t/issues/41-ksk-policy-check/Kexample.sec.+007+64232.private 2020-10-05 16:59:29.357681388 -0400 @@ -0,0 +1,13 @@ +Private-key-format: v1.3 +Algorithm: 7 (NSEC3RSASHA1) +Modulus: owFi7VBcGLoAgjfcUrBakeE6QYyFxVwhYnveekQWO8N7SMl8uOSCGeKPi0x8Mjww8hnrHBUtiwSyHGwM0QkkZ1nV1S98kPFIK/xanRrYh9/FDk0NEdKlTDbvImhB8jmBSq+iv7AZM0JRbHY5TRjUE7LXCEe1VsOXWC3VHr/yY5k= +PublicExponent: AQAB +PrivateExponent: ATf/b1rMdXreihq00QF0i+atMtREI8eekEfwz+U2bVf20gJ/pjo/JsZk4FvACfgdPZIoCdu2rXVph4DfT6jL1t7sDY/9mfcMd2Zge6eB8Kat3QpdDu4qClgkXFTYFLj2lQ5Bm/b+YbQ8fiPlZovp7YGFodmsjfnNvbT7UiOiSKE= +Prime1: 1wNWdr5FIrew1NTzpbeClZr5NIIoRBpEPsSDCBZpbRDZ944LcjWgrJpVlG1klkp/cR/zcSzrq+637rva30jglQ== +Prime2: whQSB4wqB87wyYrewJLU5qFY5Up/YiZ0iyD4m4OIQMk/K7eXtuqFuSOP4xTR4WAWHIyRixa1F85/eh7y6+9h9Q== +Exponent1: XjHZJEYw9Yex0VvFrdjaPX5aJJXM3CEButnOabGf2Cckxl4VR6CU1mj6iv7trSXP9RhBR1idmoIHVHA57832jQ== +Exponent2: dtzn9etoSoP5gNYmevbyoZWr5jJsNeardhJpcIVsS5F1uQamSob0A2G+XCuCJ3A72pxU/0SXAM+dz2NpEAr6iQ== +Coefficient: egVfeiBCmggrVDolCSvAIg+XEb+YmLcD1SLT5qFLuqCtPKWGDx9lGMbqbx5s2gzeeoAPL1r34pohHNLMCqCNdw== +Created: 20150630133105 +Publish: 20150630133105 +Activate: 20150630133105 diff -Naur validns-0.8/t/issues/51-support-curved-algorithms/13.example.com validns/t/issues/51-support-curved-algorithms/13.example.com --- validns-0.8/t/issues/51-support-curved-algorithms/13.example.com 1969-12-31 19:00:00.000000000 -0500 +++ validns/t/issues/51-support-curved-algorithms/13.example.com 2020-10-05 16:59:29.357681388 -0400 @@ -0,0 +1,16 @@ +$TTL 86400 ; (1 day) +$ORIGIN 13.example.com. +$INCLUDE K13.example.com.+013+18450.key; +@ IN SOA ns1.example.com. hostmaster.example.com. ( + 2014012401 ; serial YYYYMMDDnn + 14400 ; refresh (4 hours) + 1800 ; retry (30 minutes) + 1209600 ; expire (2 weeks) + 3600 ; minimum (1 hour) + ) + + 172800 IN NS ns1.example.org. + 172800 IN NS ns2.example.org. + + IN A 203.0.113.10 +www IN CNAME 13.example.com. diff -Naur validns-0.8/t/issues/51-support-curved-algorithms/13.example.com.signed validns/t/issues/51-support-curved-algorithms/13.example.com.signed --- validns-0.8/t/issues/51-support-curved-algorithms/13.example.com.signed 1969-12-31 19:00:00.000000000 -0500 +++ validns/t/issues/51-support-curved-algorithms/13.example.com.signed 2020-10-05 16:59:29.357681388 -0400 @@ -0,0 +1,55 @@ +; File written on Tue Mar 29 15:52:18 2016 +; dnssec_signzone version 9.9.8-P4-RedHat-9.9.8_P4-2.el7.0 +13.example.com. 86400 IN SOA ns1.example.com. hostmaster.example.com. ( + 2014012401 ; serial + 14400 ; refresh (4 hours) + 1800 ; retry (30 minutes) + 1209600 ; expire (2 weeks) + 3600 ; minimum (1 hour) + ) + 86400 RRSIG SOA 13 3 86400 ( + 20160428125218 20160329125218 18450 13.example.com. + 7LfQswmP8B9hr6Bg8nr9o8yd/fe6n86HDhs9 + pAByPITSjdqML6Rwb4NOHWvFDZJXVA4mz5Pe + TG4JVHiGYU7HCw== ) + 172800 NS ns1.example.org. + 172800 NS ns2.example.org. + 172800 RRSIG NS 13 3 172800 ( + 20160428125218 20160329125218 18450 13.example.com. + eses1PGFULOHDZbqPt+CMQHdYCIVNdxVMYba + YtW3iA9nN4mfvS6jls69J60bqSA4p3w4tD3k + v9dnDcFdS+tEUQ== ) + 86400 A 203.0.113.10 + 86400 RRSIG A 13 3 86400 ( + 20160428125218 20160329125218 18450 13.example.com. + 2QqqZ4i7yq1sCrK82aLm85pTSUgpWR0XsBzi + MVFyjcoW75f0ysZKZafO5lFJECKEP8ncJfEP + NEMXVuyAUJihSA== ) + 3600 NSEC www.13.example.com. A NS SOA RRSIG NSEC DNSKEY + 3600 RRSIG NSEC 13 3 3600 ( + 20160428125218 20160329125218 18450 13.example.com. + IV+0txuv6DNk7kRBUmkk4jorMjXoyi/klFC/ + 1g5ZK8/cZuFcKREuIW7bmpvhB4Mhj8yWpLJ9 + CVNy339z+Rt/6g== ) + 86400 DNSKEY 257 3 13 ( + SFycyLoVKBBL0re1qD6sezd/bOM9jwtT/mTT + 1KkW0yqIXixXN/szwzm49r6YzlIFHRDXry8a + 7aaIKWopkx8WBA== + ) ; KSK; alg = ECDSAP256SHA256; key id = 18450 + 86400 RRSIG DNSKEY 13 3 86400 ( + 20160428125218 20160329125218 18450 13.example.com. + OsKqN6fhvL4b0XK5TOEpZXrSoC/GcRMlCqIe + csfZem7xMmcBjUe333/fJdw0x1QKmA17BoX/ + Px88zz24dRW0Vg== ) +www.13.example.com. 86400 IN CNAME 13.example.com. + 86400 RRSIG CNAME 13 4 86400 ( + 20160428125218 20160329125218 18450 13.example.com. + CFfxilFg72g3rQerviVCO6jmf8kVodqusejq + WETSBiCAfMhcB2+uLsitmaH8LsAiNLNMY7nc + 533WnQjsJ4vsmQ== ) + 3600 NSEC 13.example.com. CNAME RRSIG NSEC + 3600 RRSIG NSEC 13 4 3600 ( + 20160428125218 20160329125218 18450 13.example.com. + IWqCg2pcOd9kX4waHb8Ij3kWeJxfXGKUBbpf + Fuc3bhOJ/rvQ2kPYO305TeZP5Rfcd7+efDEb + i8be+VqhOgf7Pg== ) diff -Naur validns-0.8/t/issues/51-support-curved-algorithms/14.example.com validns/t/issues/51-support-curved-algorithms/14.example.com --- validns-0.8/t/issues/51-support-curved-algorithms/14.example.com 1969-12-31 19:00:00.000000000 -0500 +++ validns/t/issues/51-support-curved-algorithms/14.example.com 2020-10-05 16:59:29.357681388 -0400 @@ -0,0 +1,16 @@ +$TTL 86400 ; (1 day) +$ORIGIN 14.example.com. +$INCLUDE K14.example.com.+014+01045.key; +@ IN SOA ns1.example.com. hostmaster.example.com. ( + 2014012401 ; serial YYYYMMDDnn + 14400 ; refresh (4 hours) + 1800 ; retry (30 minutes) + 1209600 ; expire (2 weeks) + 3600 ; minimum (1 hour) + ) + + 172800 IN NS ns1.example.org. + 172800 IN NS ns2.example.org. + + IN A 203.0.113.10 +www IN CNAME 14.example.com. diff -Naur validns-0.8/t/issues/51-support-curved-algorithms/14.example.com.signed validns/t/issues/51-support-curved-algorithms/14.example.com.signed --- validns-0.8/t/issues/51-support-curved-algorithms/14.example.com.signed 1969-12-31 19:00:00.000000000 -0500 +++ validns/t/issues/51-support-curved-algorithms/14.example.com.signed 2020-10-05 16:59:29.357681388 -0400 @@ -0,0 +1,63 @@ +; File written on Tue Mar 29 15:52:22 2016 +; dnssec_signzone version 9.9.8-P4-RedHat-9.9.8_P4-2.el7.0 +14.example.com. 86400 IN SOA ns1.example.com. hostmaster.example.com. ( + 2014012401 ; serial + 14400 ; refresh (4 hours) + 1800 ; retry (30 minutes) + 1209600 ; expire (2 weeks) + 3600 ; minimum (1 hour) + ) + 86400 RRSIG SOA 14 3 86400 ( + 20160428125222 20160329125222 1045 14.example.com. + 5FEzZuz1HrgRNTakg4D24h1RrO1Kx9IDzXN6 + S/00bsfO5AQ8hxVd2X7XzrYGdqs+gpecBpkl + WLG1MrEgzYvRVgPTVY0bL0U7GxmvqAp871WH + yuJKB8NFTkgQDA7cA2Do ) + 172800 NS ns1.example.org. + 172800 NS ns2.example.org. + 172800 RRSIG NS 14 3 172800 ( + 20160428125222 20160329125222 1045 14.example.com. + 9Yol4eoRhw52o7LJqCnTlDlQlFbaHFyTOGf4 + 3MAPNe5hx2NFCujCg9RxE66l+BE6otDMC+tb + hJKVPfb5U8+rpjDna3H1RSjV7MkS4crlzS0k + 0rximlQ9x7OIy2wkZ0bw ) + 86400 A 203.0.113.10 + 86400 RRSIG A 14 3 86400 ( + 20160428125222 20160329125222 1045 14.example.com. + DG685u5rAML7/ga7TnixPiLwBEHFzcGpQeRc + WZkPX2W/gJ8VyejkZbWDinYEZIVUeQaRTNW4 + RcXBSq7o5wDgTJUSih+fnoLh9Fuzlfch6voG + qGKMeWl4i+2eYF7QImB8 ) + 3600 NSEC www.14.example.com. A NS SOA RRSIG NSEC DNSKEY + 3600 RRSIG NSEC 14 3 3600 ( + 20160428125222 20160329125222 1045 14.example.com. + tPxJtlAhflaMsTI0zx0vt+R73cmU9zL9ly20 + xrhZlRWhScxZ4y8fAIs57rfbl4XCe1Rln6y/ + TZ3V0BcpXH2fl3vXxOJqcnsK/RHHxl57va7E + v704MwP3Je9qhirfLd6O ) + 86400 DNSKEY 257 3 14 ( + FWoMjTSsjInt9389me7cymDHNbntmNWejqPI + zSsifAs2CdBtfCoN98LvEU1eADIG4kkpKvVv + QTYnoiUP/jsFQa6Uz+PmfgKO+PpyNl1fNy+b + N7uEPJzIZhen3X6bIwYg + ) ; KSK; alg = ECDSAP384SHA384; key id = 1045 + 86400 RRSIG DNSKEY 14 3 86400 ( + 20160428125222 20160329125222 1045 14.example.com. + FD2AI0MGo8w5JRfVihohNNsgj1pVrCUxaehv + R7DH2eS7STiJFEBFr8e8UO1CiDGXuOGhgoPY + CyEay93XJfdHaWBA4iCPctZUkdyA5ZXrYrpT + iCkK6GK0MtbyH7W3H4Uu ) +www.14.example.com. 86400 IN CNAME 14.example.com. + 86400 RRSIG CNAME 14 4 86400 ( + 20160428125222 20160329125222 1045 14.example.com. + Y8knRqg1Hpta6KZ57zc+eY6XDgIgRLVYWZ0m + 7YESOgRTU0oEU8j8NQ+S1RPAZM8migNkHjB4 + NKdm9DCMnlD237546++VmZFUZgzGnKW3lQAQ + GpTe7MtqMUY40B+TxSIg ) + 3600 NSEC 14.example.com. CNAME RRSIG NSEC + 3600 RRSIG NSEC 14 4 3600 ( + 20160428125222 20160329125222 1045 14.example.com. + TnQB0LmuU2Z4WtQDOBslDrIWFguyh4rv17gZ + nV8GvUJnn1Wk8/djZv47chNeNK6Rxt+lUaDm + E9S6f7eSJiGTAP6N0Mgfg7BmFbmD+4ZOUez2 + t5FEl5KRUrPoiHQvOB8w ) diff -Naur validns-0.8/t/issues/51-support-curved-algorithms/K13.example.com.+013+18450.key validns/t/issues/51-support-curved-algorithms/K13.example.com.+013+18450.key --- validns-0.8/t/issues/51-support-curved-algorithms/K13.example.com.+013+18450.key 1969-12-31 19:00:00.000000000 -0500 +++ validns/t/issues/51-support-curved-algorithms/K13.example.com.+013+18450.key 2020-10-05 16:59:29.357681388 -0400 @@ -0,0 +1,5 @@ +; This is a key-signing key, keyid 18450, for 13.example.com. +; Created: 20160302102736 (Wed Mar 2 11:27:36 2016) +; Publish: 20160302102736 (Wed Mar 2 11:27:36 2016) +; Activate: 20160302102736 (Wed Mar 2 11:27:36 2016) +13.example.com. IN DNSKEY 257 3 13 SFycyLoVKBBL0re1qD6sezd/bOM9jwtT/mTT1KkW0yqIXixXN/szwzm4 9r6YzlIFHRDXry8a7aaIKWopkx8WBA== diff -Naur validns-0.8/t/issues/51-support-curved-algorithms/K13.example.com.+013+18450.private validns/t/issues/51-support-curved-algorithms/K13.example.com.+013+18450.private --- validns-0.8/t/issues/51-support-curved-algorithms/K13.example.com.+013+18450.private 1969-12-31 19:00:00.000000000 -0500 +++ validns/t/issues/51-support-curved-algorithms/K13.example.com.+013+18450.private 2020-10-05 16:59:29.358681397 -0400 @@ -0,0 +1,6 @@ +Private-key-format: v1.3 +Algorithm: 13 (ECDSAP256SHA256) +PrivateKey: X3Mr05PnOJKClnUa14y2CdCCHUjkUNFl6wh1knpRKg== +Created: 20160302102736 +Publish: 20160302102736 +Activate: 20160302102736 diff -Naur validns-0.8/t/issues/51-support-curved-algorithms/K14.example.com.+014+01045.key validns/t/issues/51-support-curved-algorithms/K14.example.com.+014+01045.key --- validns-0.8/t/issues/51-support-curved-algorithms/K14.example.com.+014+01045.key 1969-12-31 19:00:00.000000000 -0500 +++ validns/t/issues/51-support-curved-algorithms/K14.example.com.+014+01045.key 2020-10-05 16:59:29.358681397 -0400 @@ -0,0 +1,5 @@ +; This is a key-signing key, keyid 1045, for 14.example.com. +; Created: 20160302103027 (Wed Mar 2 11:30:27 2016) +; Publish: 20160302103027 (Wed Mar 2 11:30:27 2016) +; Activate: 20160302103027 (Wed Mar 2 11:30:27 2016) +14.example.com. IN DNSKEY 257 3 14 FWoMjTSsjInt9389me7cymDHNbntmNWejqPIzSsifAs2CdBtfCoN98Lv EU1eADIG4kkpKvVvQTYnoiUP/jsFQa6Uz+PmfgKO+PpyNl1fNy+bN7uE PJzIZhen3X6bIwYg diff -Naur validns-0.8/t/issues/51-support-curved-algorithms/K14.example.com.+014+01045.private validns/t/issues/51-support-curved-algorithms/K14.example.com.+014+01045.private --- validns-0.8/t/issues/51-support-curved-algorithms/K14.example.com.+014+01045.private 1969-12-31 19:00:00.000000000 -0500 +++ validns/t/issues/51-support-curved-algorithms/K14.example.com.+014+01045.private 2020-10-05 16:59:29.358681397 -0400 @@ -0,0 +1,6 @@ +Private-key-format: v1.3 +Algorithm: 14 (ECDSAP384SHA384) +PrivateKey: U2ji19bf3QQ3wqgNm1/PJUcD4Bp17Gb53UIcSCPe9yNd665GOvlRSCQaKbr+IXCY +Created: 20160302103027 +Publish: 20160302103027 +Activate: 20160302103027 diff -Naur validns-0.8/t/test.pl validns/t/test.pl --- validns-0.8/t/test.pl 2014-02-11 15:08:39.000000000 -0500 +++ validns/t/test.pl 2020-10-05 16:59:29.358681397 -0400 @@ -20,7 +20,7 @@ run('./validns', @threads, 't/zones/galaxyplus.org'); is(rc, 0, 'valid zone parses ok'); -run('./validns', @threads, '-t1381239017', 't/zones/example.sec.signed'); +run('./validns', @threads, '-t1501789043', 't/zones/example.sec.signed'); is(rc, 0, 'valid signed zone parses ok'); run('./validns', @threads, '-t1303720010', 't/zones/example.sec.signed'); @@ -28,7 +28,7 @@ @e = split /\n/, stderr; like(shift @e, qr/signature is too new/, "signature is too new"); -run('./validns', @threads, '-t1421410832', 't/zones/example.sec.signed'); +run('./validns', @threads, '-t1561789043', 't/zones/example.sec.signed'); isnt(rc, 0, 'valid signed zone with timestamps in the past'); @e = split /\n/, stderr; like(shift @e, qr/signature is too old/, "signature is too old"); @@ -113,11 +113,34 @@ like(shift @e, qr/name cannot start with a dot/, "dot-dot"); like(shift @e, qr/garbage after valid DNAME data/, "DNAME garbage"); +like(shift @e, qr/CAA flags expected/, "CAA without a flag"); +like(shift @e, qr/CAA tag expected/, "CAA without a tag"); +like(shift @e, qr/CAA unrecognized flags value/, "CAA with bad flags"); +like(shift @e, qr/CAA unrecognized tag name/, "CAA with bad tag"); +like(shift @e, qr/CAA tag is not valid/, "CAA with bad chars in tag"); +like(shift @e, qr/CAA reserved tag name/, "CAA with reserved tag 1"); +like(shift @e, qr/CAA reserved tag name/, "CAA with reserved tag 2"); +like(shift @e, qr/CAA reserved tag name/, "CAA with reserved tag 3"); +like(shift @e, qr/CAA missing tag value/, "CAA without a tag value"); +like(shift @e, qr/garbage after valid CAA/, "CAA + garbage"); +## these things are not validated but probably should be +#like(shift @e, qr/CAA invalid issue domain/, "CAA bad issue domain"); +#like(shift @e, qr/CAA missing issue parameter value/, "CAA missing issue parameter value"); +#like(shift @e, qr/CAA missing issue parameter tag/, "CAA missing issue parameter tag"); +#like(shift @e, qr/CAA invalid issuewild domain/, "CAA bad issuewild domain"); +#like(shift @e, qr/CAA missing issuewild parameter value/, "CAA missing issuewild parameter value"); +#like(shift @e, qr/CAA missing issuewild parameter tag/, "CAA missing issuewild parameter tag"); +#like(shift @e, qr/CAA iodef value not a URL/, "CAA iodef value is not a URL"); +#like(shift @e, qr/CAA iodef value unrecognized URL/, "CAA iodef value unrecognized URL"); + ## actual validations done after parsing like(shift @e, qr/CNAME and other data/, "CNAME+CNAME"); like(shift @e, qr/CNAME and other data/, "CNAME+something else"); like(shift @e, qr/there should be at least two NS records/, "NS limit"); +like(shift @e, qr/not a proper domain name for an SMIMEA record/, "SMIMEA host 1"); like(shift @e, qr/not a proper prefixed DNS domain name/, "TLSA host 1"); +like(shift @e, qr/not a proper domain name for an SMIMEA record/, "SMIMEA host 2"); +like(shift @e, qr/not a proper domain name for an SMIMEA record/, "SMIMEA host 3"); like(shift @e, qr/not a proper prefixed DNS domain name/, "TLSA host 2"); like(shift @e, qr/TTL values differ within an RR set/, "TTL conflict"); @@ -215,6 +238,35 @@ like(shift @e, qr/leading zero octets in public key exponent/, "leading zeroes in exponent 2"); is(+@e, 0, "no unaccounted errors for DNSKEY policy checks"); +# issue 36: https://github.com/tobez/validns/issues/36 - $include implementation +run('./validns', @threads, 't/issues/36-include/empty-include.zone'); +isnt(rc, 0, 'empty include detected'); +@e = split /\n/, stderr; +like(shift @e, qr/\bINCLUDE directive with empty file name\b/, "Expected error with empty INCLUDE"); +is(+@e, 0, "no unaccounted errors for empty include"); + +run('./validns', @threads, 't/issues/36-include/missing-include.zone'); +isnt(rc, 0, 'missing include detected'); +@e = split /\n/, stderr; +like(shift @e, qr/\bNo such file or directory\b/, "Expected error with missing INCLUDE file"); +is(+@e, 0, "no unaccounted errors for missing include"); + +run('./validns', @threads, '-v', 't/issues/36-include/include.zone'); +is(rc, 0, 'zone with nested includes parses ok'); +@e = split /\n/, stderr; +for my $rx ((qr/\d:\s+example\.com\.\s+IN\s+\d+\s+NS\s+ns\.example\.com\./, + qr/\d:\s+inc1\.example\.com\.\s+IN\s+\d+\s+A\s+11\.11\.11\.11/, + qr/\d:\s+inc2\.inc1\.example\.com\.\s+IN\s+\d+\s+A\s+55\.55\.55\.55/, + qr/\d:\s+inc1\.example\.com\.\s+IN\s+\d+\s+AAAA\s+1111::1111/, + qr/\d:\s+example\.com\.\s+IN\s+\d+\s+A\s+99\.99\.99\.99/)) +{ + my $ok = 0; + for my $e (@e) { + $ok = 1 if $e =~ $rx; + } + is($ok, 1, "found expected record with correct ORIGIN tracked across INCLUDEs"); +} + # issue 21: https://github.com/tobez/validns/issues/21 run('./validns', @threads, '-t1345815800', 't/issues/21-nsec3-without-corresponding/example.sec.signed'); is(rc, 0, 'issue 21 did not come back'); @@ -227,6 +279,19 @@ run('./validns', @threads, '-t1345815800', 't/issues/25-nsec/example.sec.signed'); is(rc, 0, 'issue 25 did not come back'); +# issue 41: https://github.com/tobez/validns/issues/41 +run('./validns', @threads, '-t1345815800', '-pksk-exists', 't/issues/25-nsec/example.sec.signed'); +isnt(rc, 0, 'KSK policy check fails'); +@e = split /\n/, stderr; +like(shift @e, qr/\bNo KSK found\b/, "KSK policy check produces expected error output"); +is(+@e, 0, "no unaccounted errors for KSK policy check"); + +run('./validns', @threads, '-t1435671103', '-pksk-exists', 't/issues/41-ksk-policy-check/example.sec.signed'); +is(rc, 0, 'signed zone with KSK parses ok when KSK policy check is active'); + +run('./validns', @threads, '-pksk-exists', 't/zones/galaxyplus.org'); +is(rc, 0, 'unsigned zone ignores KSK policy checks'); + # issue 26: https://github.com/tobez/validns/issues/26 run('./validns', @threads, '-t1349357570', 't/issues/26-spurios-glue/example.sec.signed.no-optout'); is(rc, 0, 'issue 26 did not come back (NSEC3 NO optout)'); @@ -296,24 +361,31 @@ is(rc, 0, 'issue 32: SSHFP supports ECDSA and SHA-256'); # issue 34: multiple time specifications -run('./validns', @threads, ('-t1381239017') x 32, 't/zones/example.sec.signed'); +run('./validns', @threads, ('-t1501789043') x 32, 't/zones/example.sec.signed'); is(rc, 0, 'valid signed zone parses ok'); -run('./validns', @threads, ('-t1421410832') x 33, 't/zones/example.sec.signed'); +run('./validns', @threads, ('-t1501789043') x 33, 't/zones/example.sec.signed'); isnt(rc, 0, 'too many time specs'); @e = split /\n/, stderr; like(shift @e, qr/too many -t/, "too many -t"); -run('./validns', @threads, '-t1381239017', '-t1303720010', 't/zones/example.sec.signed'); +run('./validns', @threads, '-t1501789043', '-t1303720010', 't/zones/example.sec.signed'); isnt(rc, 0, 'multitime: valid signed zone with timestamps in the future'); @e = split /\n/, stderr; like(shift @e, qr/signature is too new/, "multitime: signature is too new"); -run('./validns', @threads, '-t1381239017', '-t1421410832', 't/zones/example.sec.signed'); +run('./validns', @threads, '-t1501789043', '-t1561789043', 't/zones/example.sec.signed'); isnt(rc, 0, 'multitime: valid signed zone with timestamps in the past'); @e = split /\n/, stderr; like(shift @e, qr/signature is too old/, "multitime: signature is too old"); +# issue 51: support curved algorithms +run('./validns', @threads, '-t1459259658', 't/issues/51-support-curved-algorithms/13.example.com.signed'); +is(rc, 0, 'issue 51: support ECDSAP256SHA256'); + +run('./validns', @threads, '-t1459259658', 't/issues/51-support-curved-algorithms/14.example.com.signed'); +is(rc, 0, 'issue 51: support ECDSAP384SHA384'); + } done_testing; diff -Naur validns-0.8/t/zones/example.sec validns/t/zones/example.sec --- validns-0.8/t/zones/example.sec 2014-02-11 15:08:39.000000000 -0500 +++ validns/t/zones/example.sec 2020-10-05 16:59:29.359681406 -0400 @@ -14,7 +14,21 @@ A 3.4.5.6 RP some.mail.box @ TXT "Responsible person" + CAA 0 issue "example.sec" ; fine + CDS 50458 12 3 2e40b2a6ccd2760ec70af69d1c144064c8931e53a6b3eee78bdb9e0bafbb9c02 + CDNSKEY 256 3 8 ( + AwEAAdZOvnLtTdQjfdIqqH3stb7vI6bJlg27 + 3Tp4oRpnmnmgizDFtLQhnIv1Mr3AuwSWVIDe + avuiyWIAtfvwy0f3EYIv8Ys5kDiKs8PE1k90 + yQwfC53hxyH10GzGnAx4Sutrdkh1w4HM1nMB + dlTMa0g9yxjJ0vm/T7qHzj+3dTUi84s8Du2m + fMD6noy+leZ2IuX7lFca8SzDNmhUPTkXuFrB + /QUuoY2FyThfidT+nhOQpzftVtLcta0E0Uv3 + PcVDp1d7vBXsAEYGHr54r2vb3eXdOTmoFyh/ + byehUlPq1gDEH0mBRlWbUHqbGnKyolz0dR01 + u8SJYP6ULwx0mZ0p5BmoMH8= + ) ns1 A 1.2.3.4 ns2 A 5.6.7.8 mail A 2.3.4.5 @@ -33,6 +47,12 @@ _25._tcp.mail IN TLSA ( 3 0 0 30820307308201efa003020102020123 ) +c93f1e400f26708f98cb19d936620da35eec8f72e57f9eec01c1afd6._smimecert.example.com IN SMIMEA ( + 1 1 2 92003ba34942dc74152e2f2c408d29ec + a5a520e7f2e06bb944f4dca346baf63c + 1b177615d466f6c4b71c216a50292bd5 + 8c9ebdd2f74e38fe51ffd48c43326cbc ) + delegation NS ns1 delegation NS ns2 delegation DS 60485 5 1 ( 2BB183AF5F22588179A53B0A diff -Naur validns-0.8/t/zones/example.sec.signed validns/t/zones/example.sec.signed --- validns-0.8/t/zones/example.sec.signed 2014-02-11 15:08:39.000000000 -0500 +++ validns/t/zones/example.sec.signed 2020-10-05 16:59:29.360681415 -0400 @@ -1,5 +1,5 @@ -; File written on Tue Oct 8 15:28:55 2013 -; dnssec_signzone version 9.8.4-P2 +; File written on Fri Aug 4 16:23:33 2017 +; dnssec_signzone version 9.9.10-P3 example.sec. 300 IN SOA ns1.example.sec. hostmaster.example.sec. ( 42 ; serial 3600 ; refresh (1 hour) @@ -7,237 +7,321 @@ 604800 ; expire (1 week) 300 ; minimum (5 minutes) ) - 300 RRSIG SOA 5 2 300 20141212121212 ( - 20121010101010 516 example.sec. - L2S8qd2eLKNZZSLsCwPtfw6oDRyWSTTj9E7a - 7kt2uCnwCpNFFYuNSJp8NgEUkjWHO2XWbTSt - gpiz4jefzxG6wiLH7LjbDCNVhljKkwIlicP2 - srahJ9oUGM+MdYXHKKHqAUsgzeQQi87psTQL - KzDjN7dV9LfxBPXK1TybQg3ME6s= ) - 300 RRSIG SOA 5 2 300 20141212121212 ( - 20121010101010 44427 example.sec. - HYXfJCuz0aBt+Ye/+vnk4H4EOHvhTCBB6+BE - TJLzzSCuNtrOOdhftFi58IHBon10OSsbrp6W - SmiCAte+JuijZ0VNK+90foCnW5qVJy/KagrV - U8rhmUcL/vMsxEBHtKadu60UO0800FNi2PH2 - nS+VvXjM5kKA+F0HiPTaLcc9Z8Ez0sQslhmI - 9LHgV4kd/XvXJ5E7oJwnd0Ex5MCXUwnFjvgU - t1iL7s8Lfryfy0av0y9z9+yHqRgywoyHiaF5 - 4UtIpQeezu5MoqbLDh8w94tfiAMxGJH20JOZ - ObaYPtc887wpOlh+iDNvAl2xKqce5KbGbxuV - 21Pm9R6zjhEFlKlcvw== ) - 300 RRSIG SOA 8 2 300 20141212121212 ( - 20121010101010 48381 example.sec. - ICsoYt1gdoIS4d1VRon0e6DZ1c0nK3UDHlFr - +or12x+W7I63ZwFz2dOtV4nW2CN44ElhkxG3 - wpNzy2V5XKk5uHWrc0aMttwsOq7yguu3Ieee - YahgmGBzbsPmwBszuMXyIyGH21DOx3cqe38f - 6OT9RYiH8jYQtz7jhr/dR5eaLk3Tf54GrPQt - c9ltFgwgb/Z6nkKsOTu6OnjGxCsS++hfwLM2 - Dp25HeLxAfdwyDqvZn+tIBgqh7+SAtfrhZEU - 7wv0YKD7GCuxhc1ci+CQpDuHJOSBc/Se30Kv - EyPFRPCwIrH1IuVIU7SJ6UgNdDFcPGNiKmDF - Sl1aeg1YIGONZtlV4g== ) + 300 RRSIG SOA 5 2 300 ( + 20181212121212 20161010101010 516 example.sec. + ZUaelSGCJvMFzMaQy77tad0kbZp+dbTSPSrC + T3STmG8SlLx5XTU+gh9TC9gogFrBe5Yv51an + aMUSREyGWgjPeGQkC4nozxnvXsqC1THqjrZz + acHk96pKiUeLhCiqXXM3XLT7LS5dIwDQ6SUz + b6croHRgfwhbWakKO3Y2fjQjGxI= ) + 300 RRSIG SOA 5 2 300 ( + 20181212121212 20161010101010 44427 example.sec. + VhaLnLhWTPgDn9mxsaHekoDaoO2L2Y7nQ48/ + Qf+LphujRkprAUB5p/FP+FCpuC0ZFi+6DEeA + J9DB1CRxbrefursnTnM0HIGH8qv1pC5ugCWB + i7St+pPPUULdxbasdVlAzEAo9L8uMx+qDl/y + WEo/WCrV93FTM91rvLvd/6ZYDTHaIe4Q34xF + 5wgZ72UeYwh6yb4iCaY8BT7E85vpLnb3ljn8 + Sh7EyctWmJFUR6rHaMliVibGmPaYAjtl6NH9 + Lv8V0H8I++EntvLCzmrICcfr/ZHbZUUdvlyh + bYOhSCCbR3GEajLJ/isRJP9se5nNdmQKwOtj + gpjWyP5KqOZ0a+J9zw== ) + 300 RRSIG SOA 8 2 300 ( + 20181212121212 20161010101010 48381 example.sec. + JeQBLagZYcSSUcjMSKqDTitliweSc++0c/+c + MIbUjKIySJjFbCeDX6zaZ/R7xvCC5YR+nUVn + byghJZoNR7sATP5a6pT4+7u2oYOuEjryqKZm + Qo+KTsbcULnuyQDGMgyDtzQAoZMVSZF88AtC + bLKHHgQhsAPl+g+1zGgvFKyoqmzPHuCidSeq + y0pX8IITkES+PpqgO9VHC/orfwYiTRDdunoa + USPwiXUpRMXwuPH8F0/BHkf0wWnk0/9MkhZb + 5Xmltt9L8BU/wO9tFWMMlvVH/CQX4swNxRlX + UNDxNBboRczWb4mbnzjJRDm8V3RYlDVIh3fi + pcyDncf5QtpJvKCgiA== ) + 300 RRSIG SOA 10 2 300 ( + 20181212121212 20161010101010 1862 example.sec. + JwTWJEU0r+bSc1t5KXDRo+Ykd/EjTmpD25/O + 7X14X55IWELlUV1NKHUfGAE7JcK7HUFj4ADx + tKMYHU+FQRcbdzYhTLwtWLYy/kol1WHWP2Hn + 9iCzY6Lx1ZHkrM23204osCor9q3+DIuTF2rT + z6uDBeSF5SHCmft9SmJWFEgI9SH02Y1GDZB8 + FtA+EMe3pBG8o8yJOQY2soaTiKG03ZdW9Kl6 + De6Wdfg5nDeCN2idqN5l3AH+P773gnMfuaCk + kRhfZ2dK++J6H/5EJ1MHd5BZ1TN71r7GSqUh + +sLr/Qs68ZaSdNEF3HFLZ8Dt4gW2GvigoqTQ + 947r5ge941Cro4uP7w== ) 300 NS ns1.example.sec. 300 NS ns2.example.sec. - 300 RRSIG NS 5 2 300 20141212121212 ( - 20121010101010 516 example.sec. - Is2FN6iXMylX2qYT7PVbW3jzSwLV9egXRxN3 - Al8PGlBLZ55smhDdkDc64PiazFfK/u7FG6Qk - cx8SCA6MEVaDALtSU6qzYYZ89X/QBmdeQCUb - 5pb6A7rMuvxWKZ07NAZ+M+kNBrcasVSuX7m+ - 7+95oWQo0gnaGegpP7UTB25zpM0= ) - 300 RRSIG NS 5 2 300 20141212121212 ( - 20121010101010 44427 example.sec. - nTskckPf0Gaj3CFbzSZXRA6uBQ3hDGPXmJT8 - HahnznWdnMq2w/gg0I2VSmTb8PZ84To8bGu+ - 53hbxA1NBlAtydTFYrdh3H9qcAnP4ASJm8Pd - NrXWEl6N1iGiPXUHawBpWy44MGu5mqVqUHUn - tuO/ERBRNudhvp9zouLehgrtWcW5BMq2q8pK - R8OZxkd4YJtbVjv/1N1yVyRGkNg6XJLqbbf9 - pW/btCU+JPoOJ4g6G77T5v7m7PH3yYrk4rTz - 97KMrLMqh6Q4pzwr/BjjAV2vs742ieo8UKKn - tAL4GsBPOnd7EzFuadI37+EGrsSAHOMbnD09 - yp7Gnu33Ql5f4Zr63Q== ) - 300 RRSIG NS 8 2 300 20141212121212 ( - 20121010101010 48381 example.sec. - qifctVQsOnhFpUz+d0xcVK6nNu1F2IYwrUhM - H+kwNTFYJByMGmiZ8Q7ezWD/g40SOBw5T/TP - xwHyXHRMr8uqbMFQsEPhAM6Ly14bj4JygnIb - 8iuVfnTWzNhZAJficuuLFaX5u1aJY4N9MZCD - okYBI6AMIVuTI3GRQx857q1PxMdnUm5KmsAB - GqwplhjhIAhHuDygJ/2ZR6aQeL8GJTF9CdmW - 1av2rJzOdtRfgHmU056Fof8tvB73SbW9Mhb2 - dECJ4vYJpp/VfywREcLzcG4EcWDmgHvNgbzs - DhSEGXAj/ytIGRshPk8j8tIcHN//soqfV9dn - 3Xv42NZTk7xt/Q+bOw== ) + 300 RRSIG NS 5 2 300 ( + 20181212121212 20161010101010 516 example.sec. + l+fqpS+kssvC9xvQ06eiXo/j4UdAYdNDET6X + rL/UE5RLQMT1F+n4lqFawdGEFisSF9LszgRo + xS67wAHx5lrm6cfOwkVsRRL7isA/tM/RYaFS + 4M0LqTuoM3pPIUr9qbFfGFRPW0IW198q2KMd + pPveE8yc3AlJvaqh2/KzHNPrzUQ= ) + 300 RRSIG NS 5 2 300 ( + 20181212121212 20161010101010 44427 example.sec. + zU6ylvFVb7xbpUbGbCwgA0xRLt/J4iZ+qYSg + 93c1IN3tkNEJkcnbkJfTwxG2kpgAdOU782tY + lOyNMyT9sujFVSsdMxGz4MB5x2wefaznuJRc + ERGwfwxGY2Bdwe4z1/OGQhU/wppuukOR4n3P + WihMo2v04TqcY8lNahglBjvKYLPDWRiW1xJI + XfQg5A0pha09ykfjaDmMyvUZ1BtnWtk0r8N6 + gVXDuaSWc3fqS0lcRew4PW6D37Hr0Dk4uFnx + zNHY2QkejV1+FCRhZjVWzX4ycyIEHqXprWed + iXnIiNdR2oYfoP8uRaSpoIhYzaXtfSvtXLQ6 + KgHjjsi0LC1sb3N52g== ) + 300 RRSIG NS 8 2 300 ( + 20181212121212 20161010101010 48381 example.sec. + uHjuwG8FbPQqBkDSCaL5FIBq7tLnIPII7vGU + dLN07Fb8jrCqYKiYtBWXn44JSRnhr+lJsbrh + qTUkKmqL/jBSQwwv5nWs+Xq93/FHfzBLsM0b + 2YDVTCbFYY0ui0TU2BDmdkCeQbmcQXPI6Oer + l5GILqLmlsnW5ka/jBA3j3jUBRFtVM2uTKTZ + XUkzQAhA3F63UfnVaZUwA79ix53BvmnefD19 + V6yJ2fCs5Prw3jWtvQCz4qDOM+MnNmxeIYZQ + jL/iW62FadgScYPSq0pPYYCJbPTMJUnTlfsa + L2DRZ7D496e7XvgjP7yui+V9s5E+3/3fOZmw + 9hVp2SL65Esw48lmQg== ) + 300 RRSIG NS 10 2 300 ( + 20181212121212 20161010101010 1862 example.sec. + RqC1fn5PA7hDmsv8/ZywJWMGF5NJAsCHZbs/ + 0619xJe62kVDzky2pIT7C5XiDRwAdpvZeCh4 + 0CRYA6ejFqQLai3oVuvcZFSenQJNmRxzuH/Z + 2hq84kGz/3bsEL/GQd3zyL9mNO7xgm56dm7m + q+UIxNwx8FFOVVUBKSSDjsnCVNTZKYmwIZV3 + L2KdaKwOn6Jl4g4ZKuFlKyPadJM8tAO+Gjd6 + YJksXWWIiOoqpNwuh/S/9G9iveWxziHM35yu + 8Fs3Ty1oYSKnzWSDgfFfnKeGelcgNk/9KB8f + 8OHUWAApgWc2qbSxlhrs5McTKyhcdBAnqzbK + WjgUVosg4Jnjn6mkzg== ) 300 A 3.4.5.6 - 300 RRSIG A 5 2 300 20141212121212 ( - 20121010101010 516 example.sec. - REruNlWPhPdn0OwDISrhCIYEHLpL/9RrAAAl - JNlCRluGECUt4pKGBcNYsFl/BCu0ZSaGu0ol - c5gvD9CsP92HoiWhFjmJG8epEiblcUnQmYfK - cfqhRxb4Pwvaw5eP/p5ysBhhJhcklLs0eETu - UsqFT0LbnDHkLZL7SX0EvlMCNWY= ) - 300 RRSIG A 5 2 300 20141212121212 ( - 20121010101010 44427 example.sec. - Zs9ZU25qM+2tWswmMNbByYvJmFdC/x1Hzc0E - 5kdb5Z7x8Su7Qir+sINQtqZ/CmPextOV746c - bgH5Yax+G9sCJK7ssVQaCsNB4rcECELDpQRP - 6ca7+dOQ3pMGX5a6FGO+b3zucLdexkWf9VKo - zS0BTnjDl9R0sVr1FaN29YbjtRJpO65UVfKV - FkYFIaBQCS+E5/cLzTzI6iP8ZThhzgDd6Mux - cHxqGtb0fXKP5igpEcUHwh/+G5h5RthvSCn1 - nlo35njMb4UR7q5WPUSrHCv1LB2KdqxHBq5u - ckS96/q2X/grY4NnFr8f02+ZwhHy77VqPcpL - SKoobHQkkMSaY8F6ww== ) - 300 RRSIG A 8 2 300 20141212121212 ( - 20121010101010 48381 example.sec. - iYrO6bkdXX4d8SU6yay5yY1rm3RPcr6eQSbv - NIZSiP4T9oM96uEXTeVt52RNFSH5E3FPctBY - LJ4wgga8MemwCNi3N+SLtIKQztAFb1TxgrF4 - 1tJXnNEtsMSpJFxNSSDDWye1BgAMF6IE99Jb - dGWGm+n/GV/UOCZrHTJs7cI+LtDgxJq+3dys - ZD+ZO2uncAm0Z7o93HQqHpNzmZmhNOy6RTaC - D2RIPo4fwSfI8LmbvOpCOUhdU8cKv/ruhuaW - g9163lz3Nyxj30S2TX1Aj6QDAZbGYgi+t+Q8 - ad1dOqTam5DZx3ksjyjGDz4UEufJKFa7SG5E - UGLnRHbWGLZaMcGxcw== ) + 300 RRSIG A 5 2 300 ( + 20181212121212 20161010101010 516 example.sec. + q9IkSE8SR3e6sFKsFyHl82mKw1yDvlnHEUnH + T3dHAyymmteFobaCSQqLTf7yWu8yu65kam8c + g8vUm+VLDEeqAlXTXqDlNcUhPsIYQbHvdSr/ + 4toES5X9eWZL3Qrcjjn5qarpIcz3woiD6d2I + CHmeUgyU4ZCfgKp7kX2bmSj7a6c= ) + 300 RRSIG A 5 2 300 ( + 20181212121212 20161010101010 44427 example.sec. + ZKGRCTHYjDBFSHJ2tyeo0kUhJaUdKgpO3CPx + EYtOak3I4HBFUn20GvxV6gA04g6wqWUzJlmt + 1vzW/x954Fbz5Xz6N3JDFMmNRdXcqFqpGTXL + zuGyMA2yo3O3sFUXOl9Yp1P6/LDApHS6teJo + Kt8Cibn++ZrcgV9iF2cc8i3e0KJ/14LexPSw + d39iokwrc0K5FECT8BhQ1Tv8uuDjOOA5WOQr + 9cslS2bR96gcBXHCVF9IA2ZfgUvpbGvYX7gI + 93Ke5wWxfT7QQkhP7Ux0ulEsNVXTxbDkqgJV + 5CsyxBOKQDWCc5iQ/IgQY2N9BW8sd9lZ+lgl + XoFm3smgQQBd9lt4VQ== ) + 300 RRSIG A 8 2 300 ( + 20181212121212 20161010101010 48381 example.sec. + qfWdvC+YOs8XEdMzPOgk3QeWMH5pLTy6Emea + k53wChLO5J11ZVGRsILxP7ewn0VFmI+nzD5t + QTvhSeaJlotPkgGaL6UOZ1SKQ2TurGbU0zpO + /YkSTCGg9trliIPSafs6NEQrXCtyG889H8GZ + pCZJ5YhNz22/F9/0vOfGrVlA9ZCLYOOwlx0t + Um8cmyzWqOud7Et0AzF1t1D78iPxJ21/E0IE + T36lf14IsoJNkcSZcEEg8Rc27vSQsBSUfIFh + mjSmLmnHRwsAG26XqJ7enaGw2lq0XDDMzaFI + MvdTfsmmUmhXXLUyuLPtYURYkgCvygI4uZas + 2xs74kWMFcRY4UxTRw== ) + 300 RRSIG A 10 2 300 ( + 20181212121212 20161010101010 1862 example.sec. + dunBRK95/L3G4kIgV05yUMk4KeM1kuwpmtMe + DpMxGCt4sG7M43zmcTN4lvcBPVu+pJUPmiFb + 3DnF0+R/9wEpy06s4ldITPCxRZnfNpYZowUk + ThrnO6GK3CC7E3Z89l4p9waBb45Ej3igEZ0S + 8s4RNQhgKUdEnmx8uR9Qhzg0Ep48saui7vrv + gsmf6xLopwcyaIRYaKzhmI8aAeBSE22Dh3hd + x/Pp1W60r0ZHUcH9r+p8dpaesbSvRWbhKuBc + TUSEaL5adDUVLLfa17+waGlZOFRHX92P83zH + ChaLEKBDJt0RRversJ+fzFwRfxELYlOyYzD5 + qqVmnfrd+adA7SuQHg== ) 300 MX 5 mail.example.sec. - 300 RRSIG MX 5 2 300 20141212121212 ( - 20121010101010 516 example.sec. - gcagSolgEmDVIc5cU08Zt4K7abuJ5aXWxWbB - xe4F6fz2slHoG09n8WUxUz4duF4omLAtnuB+ - uW+79fdn7p+EwhzBZ8ds8WIlGSdtI5edU6cA - A5SL2msnLqv512puF1wXxrVoNYBdkcBgFjlR - VLpKMhBZR6dsYkr552R0qcJP0UQ= ) - 300 RRSIG MX 5 2 300 20141212121212 ( - 20121010101010 44427 example.sec. - XXsoPIEF4nldBqzujYDPNefWYdo2BO31uXli - nTd+bjPT5S5fhBcTGqWSSOW2/hTTdEjhd7sA - 9crpwCNex1BV4WySdsctwwwxSi/uQDbV4Ld4 - GBtef94RFwtAiDs4kE7J8LjDrM10DKmQxTTi - KCU6u8LRyQCTS8f2XcX0HnM9z41z0y7USNz/ - WTAJa0e4lVXv4wMPfQRel8TAgBc9RNUg9qyd - c8JFGlpxL09tXA7n6LvBoqHFDZSHf2eSBwDk - 2fwsqHw1FF1fcMkAvsv2R8P0yv+oJkbT5Dv8 - AKzyw2OVTBygImCZpREtz3OBs8R4vSN6RF1K - HTEnfuPVunKd89zctA== ) - 300 RRSIG MX 8 2 300 20141212121212 ( - 20121010101010 48381 example.sec. - qcDxTb50zfqGgiIsk8x+0pDm6AAFdCXy1+Oa - i3SfnVrUYKp+BUvvPPZasEj5+19O0Ih1jdPu - 2zB/Af7jS0pp2LwdN5dh2fJGvf4yId1sZfD+ - FjwRXli+F2MP+S9cEqiICk0aknEH8wEHNjJl - DkxtCWtYvfbNOJ15PhtgspolbDh+WKNgq0fA - JcCqkyaZIIQvV2YITqzXDHH0K+jZEqVIfa4m - SCbYidkbBkeX1JsaY/RX0u4mM/CcugGfrVdL - PxfeIZDJh9qJ+WxjR/tVSs1mhOBRTeBzlS3m - zNnlHJovqj1KRPFaNWu2Bg7V/9cQMr7HnoyB - hUkYh17aBRxZA50ttw== ) + 300 RRSIG MX 5 2 300 ( + 20181212121212 20161010101010 516 example.sec. + j6ABEspumt737VkKITDnM6TZ3hyGqUsKQDsb + yHl2FEoebBXr37+6e/0WvoH1NFovuM1PEDTL + lwJvv/YdNHgUmNphP581vUQter9/xMJXLwBR + 3BHcV3r1+djzRIJ1m4ZUXQ9Ph+B4hkL08/cy + QSiVR7FHEMLS63nVyo/YKhvMLWE= ) + 300 RRSIG MX 5 2 300 ( + 20181212121212 20161010101010 44427 example.sec. + qbcrNIqYGCAMB9+lVjpx+P8yAn43Y19uYbIa + YQza9Vf2d7p6cosbcONv0j2WjTTImXbvooot + RYyLHrwD9NwBMxhH4KD8am/tsgGouX6Bz7Nx + kglq9UbRSRDybtEXbbSRXHh5WqGdifzmvKMT + 036OX6FwLoKLOvgHcEx+CyiW9Ype10LIhkpY + VMedUPynLpXX8q3wqDOW3dK8XxEMQAr4/FYU + pVj4cySRQTygwOfFHpLI5yPsm5VuWNLQ1TKX + gLuDZfWLxrBQr/xK3RdVWTACo11JW1BDsRKQ + DNjHbcng7SOFzkYzgV+BnMXy8n0gXqnL+718 + PffuMjRCkljCibvklA== ) + 300 RRSIG MX 8 2 300 ( + 20181212121212 20161010101010 48381 example.sec. + yf1HatMaCU0CDEaCgtYKYzF4DlpnOBLQTHdX + tn3Lh6unhrn39WlHivLzDoWksGuE3HI/z831 + iRT7iG85aqRlgQpX8nldszwKQMC7KUh0R9nL + dsLZvHhEmUduo8dudHuGEcAjDUw2M0dT2ReR + wLZb0wiGowmDTT2u3RhHsSW3hDYf9KVsQBf2 + G4ax7Oa2jdc/1y/hFJJGuJ4RmADMKGBKwgU3 + LQyvr12onH+SomYv7Wufa+IKxwLVVHRcP1+X + yx9vTixTcTJc5iNKxa7bZwVwtK9HRYSxlbF/ + 6T4+JX6RFcY0pWwFfvkNl15NPqTZyiYJzdr3 + 5xcOWMMnvD7oVygz4g== ) + 300 RRSIG MX 10 2 300 ( + 20181212121212 20161010101010 1862 example.sec. + AgetqsB/CZ/UjSj06mTeO1WM1UzfUxmuKIe3 + Ls+P1yYJBwv7S03HO62uuuU3c2cvcv2S/vR4 + bAeU8cS80cz05xQHMOvyvU5qesJuSM7/x6n1 + MV2rnr68KxlFev/ihZTDxY/VNykr0Zh+abNq + aYrXROCjMak5XY7GJtxhhC/guZWTHKaYYMW7 + 7AyD/KJQy3t4horHs1qRMLYVaB/Hmg4wlNwh + HMvqfyQpPtKvq6fUX9DBo1WxAmkoJQ8C5VG8 + P84IlLD4raAPpmKeb1k+Y9uh3mU5CTNrYluX + mgVTyqQljzutS8efQLwU38turMxqgFdABEdT + 4Fov31RylTYYHCpq8A== ) 300 TXT "Responsible person" - 300 RRSIG TXT 5 2 300 20141212121212 ( - 20121010101010 516 example.sec. - W5OGt0M32rE9ap4wt0EOv2XYrHNL82jXfUHE - f/NlLZBTrsZgOtv/kUig/mfynYY9UT+Nabrk - GZ354v41yoMjRs8T8xYPW5d4U3CkeIGldzoj - ccJYgvbd0kfirTLnFozQmq/NZ6XPDeSUvmPI - zNzyu5MWG97toTkXWXwcoEcNOZw= ) - 300 RRSIG TXT 5 2 300 20141212121212 ( - 20121010101010 44427 example.sec. - inApW4wPqSfEMEHSrT+X9yJt/V9GJdSu4h8r - QvZurxth3xyqOezB1fdffF3Z37wd2tDdCwj4 - f9vuTNlFYjVaQe5Q8555tnEpVTOjXxwe7FfP - cPGJEj4ufh2R+k5PDLqLiom9HZuFMR7qO6+K - iSHbnThFCwN99hX70YtHxlv+tohZdHpRJ+4+ - 68bRfMkZ15gQLDRcaXG83zN4QBup/n73eSsw - zWPi6ZUuMbK7tKXqLNupXS00QsIqhe4AucP4 - 7bjlHLo6a0g4ds73l6LSHr6Mxow968mM0dQ/ - Uxhg6o4dFujGNjwEzv5bQ1LFnhgOyh2MG9ue - DgOl1BUANskW35uuoQ== ) - 300 RRSIG TXT 8 2 300 20141212121212 ( - 20121010101010 48381 example.sec. - QRfJNke6ca9HqkTzuIreT7bMmNbrEas3mArh - K84gox4s4Y0Ud7JPn4iusX7JyaIsY5Yzbmr6 - BtfHTM0DFC8WgCdO6i37l/illpJOJ1TEZ7Cs - CT/HUSOVxvpOS94T2hEoDXzDZbnBhm0mRERC - N7VWoio5zxzX7Gn/iyNeJiYOzyayKPQoOyrO - KgfvlWnbk8MsN4a/KVHYAZ7xEYDCbWNw17dE - zP49wVJTNK6mQ/inKXnzmdk2QVBoNhE+OPHo - owIUzavwBUI0MiFMFtD9OULrH9JU+t2wja/u - VNzHjz+i1Ka2u1Y879b1RHCTFcDaH725H6rN - kQSSwyiCC5yemHP9Jw== ) + 300 RRSIG TXT 5 2 300 ( + 20181212121212 20161010101010 516 example.sec. + hOqntsY0coi126BO7dw/eTlLhiVA1DDo7/cY + MHxaPAxvLpU2QPkvgie5T1eNwvJoezQPqieW + QA21Naq0hH4x4YAPSDVwhDmKQ7bZJm7HeWxE + EAA3TIr2tic5FI7kqhHeczvYX9CIB7lMA3Jv + kH7xUYJrBLO15f7vrEV7yifJX6Y= ) + 300 RRSIG TXT 5 2 300 ( + 20181212121212 20161010101010 44427 example.sec. + VoRm9hszby6JmfJ7rAhTTvsR3C78pkJVy63a + Xi+Bx6q78hXFE9bGKW6qBqKxG2f6j3S+z+Na + UL7QtlcYNLKVWgvaQK137pDFZMMWTp7tWYEm + Omgxn3+2f+JWT/unaPWcmphlfl7fCEYqSkOs + 1YYTnVuDXf91TNo+mOwMVKWu2gg7WR0jp+Ky + f1/2jm9jt8zv/0vlbOcMP5DqLU6ajF2Lqh0R + e2gr3812E3QigpG92E3Eq3H+mZUKdzuBqHec + B2j1iKEqfGpykLkzblvuzEUY1AL6nrOYvxkE + 4SnW7B09qh1A3opM0y3XZGm/DY+fjq32PC6A + DHTdTuz+ftk6tOMMKw== ) + 300 RRSIG TXT 8 2 300 ( + 20181212121212 20161010101010 48381 example.sec. + V6tkO6CFnsbBXhDYWuEnppbtLN62nD9q8LVw + fAv6/jRAfw9+gJw3rUNaFg9sFwjhK4wY7FZj + +JbUDX7izurv5udlORXkdMODC874kVdrbJ1q + sE0JMu6lrzmi6PopiYeb7AEduXFJzktFIaio + dCbhu9ZY3k0s7Z1Aox6cVzYH+KljAgvrsItJ + olPKJpPajjZGJeS7LMxIcuLs3+LMfVl27Ehj + Z8PBfomJ5AXShwdCJ8BzyD2ue3L0HKnMLG86 + +zTPVrjq+d+bxP4YfkYlpHQQ0cO1U0CkVlAz + 2yw006HbE5n9hjyLwNu+p51eDWBo57LHrxO/ + CkM5kIxNl7fyq2T7JQ== ) + 300 RRSIG TXT 10 2 300 ( + 20181212121212 20161010101010 1862 example.sec. + fC7OMWgo/mj4cPKb19Npao6fPdso8/9zhLjN + YAN8D3bTeAoioW3rJTCM6Jejx/KfPaXDyQ3u + JeBO5xC5rGuE/RpGphVmJOp/2kFvlamqoP1R + PgKfQC7lOcIQlr+LEE5FSUwLRgWsgeQS0waI + AiWbdH+X+lFPBl8Els99WWcG95VzzMqC9r5g + FB85E3LkLqLWoX+NJNGHVnA4c5M9m/OKBdF/ + 4BckVUbGYx0piazHcCEvPQC1vYoxvBw7U6ac + fz6vmYzNEBE+YAQi0bCSEjWxWDP/Qhl2UBBU + OuyKFo1TteeBnvPSkGU8YludcfYHOMyIlSCS + pgCM7uEM5PUAka1zmg== ) 300 RP some.mail.box.example.sec. example.sec. - 300 RRSIG RP 5 2 300 20141212121212 ( - 20121010101010 516 example.sec. - JuqZzfAFhs9gBrCGKSQPmq2cOzZSum4PzvfL - mCXjZg5zYXZUoW3HKboRpCIkQzuKKZWJC4PA - jWau/6mZCE1Fsk33AqkHB18mn+06fPtmFAZY - UyRjfWmbyoKzqewbfLrCzdwqjfAVQEhCjPfl - jarWyvCYn155l8dW/oW3/ib/d84= ) - 300 RRSIG RP 5 2 300 20141212121212 ( - 20121010101010 44427 example.sec. - HfYsVtUxudMxdmeRXfXpjoJx7700b938l0GC - rjHmH054yb7r/gwvQT/7ZSglHRiCeLINtu0u - K+3ejMaADM1SIUS2X0/K/Wv9wO8i826CHjp/ - EZ0X4GQLMKMqgvgpzVYldA1Vh2XUkPswu9Xi - /zvp/5SrjBPEAD7QlyO6M5odBvqIGUv4ZIJR - U6QaQakv0RB+gb1DLOwqwutpyPUZehMEGeIn - SnSZZwq1KUyS0Cma3KNC4aYUL/SboSeBEHPq - SXG8ueXAPNoa5fDP1DuiOB5haW4yomuRa0as - wBaFLcjw2tD5jDNwvLfUxB8QpslaUY+Js2M2 - F2m13hC8T8eZ6pC9zA== ) - 300 RRSIG RP 8 2 300 20141212121212 ( - 20121010101010 48381 example.sec. - BfTyse4P2G1V/6L6JNZlEKT4OpNEXw4zIIDf - xz1iMdFHyDCng53xlDrm4VLCcjkzMmllaPid - HtZ65SfHpdJncaLFsFSSmeiSg/UAe485LSmD - KGgTxCHBmFT+FFoFkimbn8L2Jr7V2FQQ2ILB - /CAuWpBSogX5N6vssiLEbVcfIQlWzqod1qV4 - TPC0xNinSmtD0eTep1L4ZVGJHq8ZI/+Mzzrp - RvUCyWEEAD2H9BBxhXY/D/qHeQsvpFVsJUwY - cahL/AIjdbksEMjkw/KDNTs6WZWRluskvVy9 - NfkzBioZk0xGzryV8xfiBNbdVkei708PZDyE - BfNPJodoCmqHS0w+Pw== ) - 300 NSEC alias.example.sec. A NS SOA MX TXT RP RRSIG NSEC DNSKEY SPF - 300 RRSIG NSEC 5 2 300 20141212121212 ( - 20121010101010 516 example.sec. - Q1MtdC/FeeI0yxUEuR2yE9LHjPdKttjFUPic - BpX7FaxE0YKgk3rlodPoL5dRz3rQWI7I1Wfl - EPQKOIZTWIFrRvjbDamwnsa25m8CCvIMUpbQ - CvuDHn5ycbpbEpaHfJi17sCylGoj3niCehwg - h/uOOigKQHLQK8DTgN0e0Ddxv9U= ) - 300 RRSIG NSEC 5 2 300 20141212121212 ( - 20121010101010 44427 example.sec. - bTXEqJah647l0EOnVO6SXO/XIJ3bQcFN/Ci1 - jFvtPipkyk2pQvkwuWlRUyt8ip4fjuHgCDPK - D7ODTzMEiHVZNuh7bSv7LoW7bpM11ie5qnO6 - TfyOYcHjR2lYHcDNjwGTUjadN8yiAFUBAXNq - 84h34yKA3slx5DQLaNoA5a7XWr0ODsslDll+ - Of9EwBGhjHvlyiJrXT3VMUg/SBGndxoIZrtN - CGON0mkNI1Pk/ZSqyib29N1U8POiP/wPAz1C - phG7IAlc6PUMiXegNDanaWQuPhOI4uV+f0tV - ZDFa/9mIAgF3rZC0mqHDk3h0GjJn/Ocbp4sg - RoGUCOcPuZnLlyJ9tw== ) - 300 RRSIG NSEC 8 2 300 20141212121212 ( - 20121010101010 48381 example.sec. - g9vjezK5ony2cpKX7v/ISk/XEW9VHFUd99pH - 4QV6SrX3J1OVQ5PzrKCyN/Ak1gWSVrETtIfv - fLpvxHxBR8EWZdunUUTi0ElrhVY0xW/UT+/s - GjaCTcuTHRhw/ee4bdcE8aH3S5FCFzZPa10E - w8K597UiFyzZUF/LqjXqSoI0fUvRTSwMQ/ZV - AoNtBi/3dP6ItrvIirJLMdI8QXR/X2segPyW - DnVfK4m6OzyNbcAV/9NaycsU2L6MiUpwPTNy - um5LdGwiUJXfVRMbD5+CI/UaXhozoNbAoy5K - 1Zr7mZzjl9l8a3WAkeAUWxT9H1xLWX9ux0FC - yO1REofyVJ0WPnGKJg== ) + 300 RRSIG RP 5 2 300 ( + 20181212121212 20161010101010 516 example.sec. + Po+c+7fuZHTa+aFAWg+6Jf7zkmr3qrISwh0n + 8sX+b0D1lS51TSH9ehLDSYjzVEJdGpkvun8L + CfapnT2cqFvRZ2KN+7UBEbRjCdIYSfLvDWaC + 9hqglmtxuKcH6mR3cbBFbB5x3qm3qQBh4CL3 + 5g/VH3btSpfLA5wq7DKJw4iEHB0= ) + 300 RRSIG RP 5 2 300 ( + 20181212121212 20161010101010 44427 example.sec. + KMiPSeGt1Go/WLm2Gzs3F9SNXtm2dndVRlfl + qvgNlyx/fpzNvW6DI0fLeTTTrZZy/nDsRgbr + AbEqO7aCV1wQbGb+dZLGyyNp+VUkN4fbzgt4 + yH0mYU5ba0e0Uktpnx7PZMdbzfcK6C1riNBi + M5B9hFphPcLZp7INI5JmfsZaWIKEOGrSCq6I + rKVrt9XA1m0lL3Wo7e3W8bz9xw9WKhObvdv7 + Txx3b/ofL/PQBFiM2DLq7aJq+7BzLQ37UxqI + mfbup3qpUPON6kKmMmY5PTTg5XdNcOqgTRzs + 3eXVJOkiXCaxnhMGZjPJJUOegRSpAguO5avE + 3qIoqGFSZy+WXuDzxg== ) + 300 RRSIG RP 8 2 300 ( + 20181212121212 20161010101010 48381 example.sec. + yGFkdmcp30W22O5x3rQ+mIBM0JUZUyAUKN8R + 9RK1RAqw4BWmUwH5ZY5srve7QGirPNQSU+sr + lUZ5dwOrqqd3wfqfhQsnovfsnXdrDOcpt2Nj + VJWnFY8uyUAfSPhhSPgOnzRJtV7WniV8G/vM + 6ctiwxQQZKigKEiPMAj61AO9nZgiR/Jp3Xav + yg8aeQvdPJ9TQF6xxlcRwfAINO1Ba3twvOp/ + t+nEETzM/KLyxy9QRh2WaosxdB8seDOoFvW2 + CU/z3ALKzwYtbNjxFNkJBfJqYl3GH+rf/V3X + rO0hqk/GptdPtQ0Vi0F9H3adMUYpCavAE9Dm + slXrCvKeq6b+16f+Xg== ) + 300 RRSIG RP 10 2 300 ( + 20181212121212 20161010101010 1862 example.sec. + DW/0qQc6HV/qEEjmi7c3blTZAUajQT8Wll45 + ASYH4rqfwwTgHt9zSujALbDLuvN4Hi5z6qu/ + 2xTGfnXj96YTvjYf7FHBWuCk/TH32bbo30zJ + SHK+tWJmeMvUg4WnIgutXlbH0veGw/dYXyn0 + UuTX2K1kJvDNl76AaaqfRjF5jMXLQdJ8/115 + jRRC2t/xcuPQfzzPmFlTWG8yzjYQ4v2q74T9 + 6W4r03tbvuLXlfC3+OBbyqQLCIIvgt2nmffW + IHuLZZm67TD/XdMbeZ4Skqlx/WjrIs6kOZGf + 1f4T+fUmq4SDzbTw7qZ/wpC7a/FMoewKshJz + CLI5G6UHTnuq098zvQ== ) + 300 NSEC alias.example.sec. A NS SOA MX TXT RP RRSIG NSEC DNSKEY CDS CDNSKEY SPF CAA + 300 RRSIG NSEC 5 2 300 ( + 20181212121212 20161010101010 516 example.sec. + A6DDPO48A6D8JjqHyvCPkPshwnEHzbfIQFtw + 2+U+JGmN/b2/73aCZfKoF7sOS/hTv1hOwFX3 + OJGMeDATZrQBdpuWEZmsxnJkOXTg+0cSrAsU + 9WfsJqPcP+9uy7vyUuNTjCodjqTblFlAugTB + r8BpDsXhD805y7/2pY9k1niJ7iU= ) + 300 RRSIG NSEC 5 2 300 ( + 20181212121212 20161010101010 44427 example.sec. + pKsw4iVWwNUEdboHCHS4yeatbMSHHJY+ZTp1 + 6lJUSVfaT5a0dnQul47LUCXJJ+E/pUl8G9ZA + O9XztxGh+4ixHpPDyro8QTkj8FQU/V5dZGFr + 56NwBTHGJTI5RgAtIPmPJaeuW6OCfQscGSwE + cfatGz+qCc7aK6ePVsFeT5yOD7+yutfmSgzr + gpRn+NJLR76NBTf3rzIIisICXens1A2GtKUZ + AuWmSRrp+wNBTpvKljRyyCZMd0rjTUCf7ZfM + QiEMFBTXUEDZskHWx2fjVi3BtRtIUHXONrNX + SAFQKqWDIQbegyQPhC9UWfqHaySU6Y7fj4C1 + u2e1kRAnAbeB3pmRhg== ) + 300 RRSIG NSEC 8 2 300 ( + 20181212121212 20161010101010 48381 example.sec. + VW+L1LdmUkZTXASOdkCS6536gjj2cy0aVYk2 + nMAJG409aub4yKuwEnZWQZ9w95+RClowHZAA + yjTW1vkANKbc/UYsIf3zZw5t6wcVDy31q/rm + 7juWmR7vQOmLYlsQfKjki5qBf6OuFwr/h5G0 + SNwcJjnAE0puBYzhhpTrcU9YIzkgxJFdnZii + 150z9V8EYr57R1HYRoSnVHx80KieBUilWT9V + EUkKAqrlKg0fXTYRlLmltWDt5BC8sg1MmbMJ + OwpNalmX761h7anEuIvWFSTtGHDDrwa5DDFq + fEfV4c1WeqtfIe+wLyqPHrN7X2X0jcZYWOjx + eyKHIEi3aUNDdzTVVA== ) + 300 RRSIG NSEC 10 2 300 ( + 20181212121212 20161010101010 1862 example.sec. + Hd8cbN+6kNpmQCAtjTIZC+hv8nqe7uh7bz8/ + BczipNlRYc5TQ8pdK0acwWTHZxNjmC9RlKzA + PTDGWmQHx2JmDSJ9aZxaA+xMfPZF5jc/Rn4G + 0Escxw4wCtITQn12adpm2EVJGp2uSQLm+W12 + o9ekxuVrJhKHpjqcYBNdcgDy7xD1pKVCJtKE + cTeTAfTb+scRdpFJhjs12DhUdwaAcHAKxnbf + EeW4yshT/UdvjD86Vb2BBySrLVtHqt2szk6o + 2ed/gMMvcFaaBQ7dVxv5dQcGqb3XjYV5RZ/t + RAqCGyo27eBkWdLVzu5WR2JIpgusUwULkNFl + vP/trHJpqbLnRUayVw== ) 300 DNSKEY 256 3 5 ( AwEAAbqjCxtmin71unORku1IrrQx2S49KTmw 45jnlNdreCH40YmhDZo26CMiVXbq29rvUDW+ ZEJqVT5fd5GrA1wEEGbrudd2LDr5AedBK7fY TsZf/LEm32/Bu//KzynrJqyB4HSN3GIPbp3K YyY/Hl7HawOvWAd+tUHgUtes4trE/4pr - ) ; key id = 516 + ) ; ZSK; alg = RSASHA1 ; key id = 516 300 DNSKEY 256 3 5 ( AwEAAeluubFtl7Qtw4TpuZl85abGI+HXO4ag qzv1kSLQ5tkYFGdpZyZwQcBU2znMrdw03o6d @@ -249,7 +333,7 @@ t8er3cZ1y62yOSbPK0SlouSRplbz+ezNyqD3 c5zvz6F2AcZ4NqaTZOMWZbOowujQj3FxElaZ S+/ughQZKq3OtMN8bqc0tZ0= - ) ; key id = 44427 + ) ; ZSK; alg = RSASHA1 ; key id = 44427 300 DNSKEY 256 3 8 ( AwEAAdZOvnLtTdQjfdIqqH3stb7vI6bJlg27 3Tp4oRpnmnmgizDFtLQhnIv1Mr3AuwSWVIDe @@ -261,7 +345,7 @@ PcVDp1d7vBXsAEYGHr54r2vb3eXdOTmoFyh/ byehUlPq1gDEH0mBRlWbUHqbGnKyolz0dR01 u8SJYP6ULwx0mZ0p5BmoMH8= - ) ; key id = 48381 + ) ; ZSK; alg = RSASHA256 ; key id = 48381 300 DNSKEY 256 3 10 ( AwEAAcZdPacjnWNuQKCF8CPmUW1/NUxI/G7x dbwrU9lOuAD3sw14rLw2NTzpbC/bubt2aHQ0 @@ -273,504 +357,824 @@ knECGC8L/9o/R1zfSzSN+ay+dI45t+jOOLgW p5gmjsI/mXhoO6GqX8rbZoV7/DQyAR5rATJH W1eausJhOgE2wBJgl6V0XbM= - ) ; key id = 1862 - 300 RRSIG DNSKEY 5 2 300 20141212121212 ( - 20121010101010 516 example.sec. - RK/yubKLU0d+bs9z+qzPSNA+mSn+7Q7zDff+ - uAzcd4tD0QvVO8jIQaVAxVWOfenQ0tovTzXH - 39VuRH52UW0i4a9ylxlq1HFv96f9wsV6wGEb - sNGGMebDESHUkfMLIiZzAx7hmjX+YjlrYLEY - chOaBsoYc4pEtmWLHSL3Qc7TCxU= ) - 300 RRSIG DNSKEY 5 2 300 20141212121212 ( - 20121010101010 44427 example.sec. - DM9TZSWvwPIKkg2oB7NDRqpDMYGvl3sX3/BZ - 2MALATpbDPQqJt+4b2837rjXPR7hP6cGTl0l - kjRc/wSqG8scYqQzhcUJ/j76jtFVwwggPycD - u0pgzl9h8lvR7pFAEKlQHUz+MXtVs51eq3GQ - NgqFVd2Nze717phEJJF0Vpw05jsZzqokl8Ep - /Dps27AslVY9vyg8ZNfJ3rgCl/zSsAcuBVfv - 22+t0Y/crI76AxhqHIgxjyoQ3Bd2pXKU/1Dn - PI9Igw+1TzeKXoGQEHkN3ij+J8dL62EUgR27 - RIFl3X4U2snEaznDXZdGd5x0Q1uv6V6+g1T+ - rx3gnmitBrDbrhnV4g== ) - 300 RRSIG DNSKEY 8 2 300 20141212121212 ( - 20121010101010 48381 example.sec. - lepL7TovQDjJN5c2g9jMnrOUqljp6qrVjmeG - nSTWiTbxItUMzx6nWx+I44u8j9bpUYcPnx9T - HZBjOtGTqzDx6eepB0mWoUbqkUsj2dk9r/F5 - uSx/I75XeT7vma52K3TLTua5AsYwaXYFOoX0 - rXWRS5rlCY4FeK5TZUgfjvLYQAFrvonRtVcW - Tk/BdmDkKgvWm2FbJmCBEhQj5q6V8dIXnGPn - d/7mRQ0OmnQtqKIMzWhdD9Lpkfda9B6vzmln - tvOAUcHMgG9PGrEDAW/pp42douc2u0nDdpaA - 0UkIFm60cDmMuDM8TOXZJQ2l6uLQGNiAWrsi - z3e/fFbUIkccz2LxVg== ) + ) ; ZSK; alg = RSASHA512 ; key id = 1862 + 300 RRSIG DNSKEY 5 2 300 ( + 20181212121212 20161010101010 516 example.sec. + P4ilLbwbloDRSZMw3dHOXE2Zg/dNB6VmDPRN + 8jppzAKtKWHnZ83fsPeF35PvK2paDN2kFib5 + R+tcXaLVi5h97QacHoPhoqEujX9KdHkLG9yg + vuJJvTgMDaKyzZPMTYUifKlzIGD4y4ChixO/ + d6HUDFMrh7/5/8kpVRxndGotgSI= ) + 300 RRSIG DNSKEY 5 2 300 ( + 20181212121212 20161010101010 44427 example.sec. + YxpolCqYSlVhnOl82FFEdaGDj9KEkfl3+x0z + gHhGZ8Sbaa3MTFE6C2tsYJF3f+wsvKE/q6mH + WrGalB7BAaDFOmwRmjfV0DNA0MpN5h42yHJE + 5y9GXJt+5V1VXj1LdXKLLWAkNPitnrpNoB0U + Ysk4X5tvcq1KrHrRH5FG6qhxaqs2TY5EFhJf + HFPnLfSSOoWEADIhwoTCDtQ1EimNA/PXp45f + Wh3Sb1TZZnJEXpvO55ZIMkeThZje5eQbhd5E + LBol46Olx9qnCenBMuQV4JNt8u5Q+/Kznwll + DVTeiRYfPEUYcEMtZrkTu5zbk19lgonPFI1h + dBUv5/WqV80cQCq9Kg== ) + 300 RRSIG DNSKEY 8 2 300 ( + 20181212121212 20161010101010 48381 example.sec. + 1TfsvBo16W3Lu9h07C0n1KmRu+tOiwzQYccB + hTUWq34DeYLM3gZ1GLRzh4agva7bo9XeNZ+2 + F5MoHgZE+DZbGxAVWbPcL1Eg6KB251PtEqFA + 4z/Dm8VOLRWohucVwAEQOOLqDoV6pPCTYSRF + TRwuUcvwENzfHRNWIergssL1CzybyCmbHZiL + x1NI5yZrkioHDFxO8XELJIOqJmBkXiCgEQoH + TuBOl43ulF7vu/ZCvHKHTVdNRKacxd2+YXno + tlGxXp/9GdJiLqwfNqXb2eYCi9RPwIt59ggW + 2v45h/QaiM3QwHo0b92jUusZEtszxTO2AQgy + Eq7CncYxzcU6oavH8w== ) + 300 RRSIG DNSKEY 10 2 300 ( + 20181212121212 20161010101010 1862 example.sec. + GJ3J1Iro3+XVgVa6by2QMOOkgrIKK2yaGM/M + a48WDa4kfP5GU9ukoScgNTgp4rSB9hcJ1KfN + eL+HUCA3/Dk0KrfjlN3TTWcxmB09jchuGQLE + mdaas4WLf4PW9kMZaqP3KAddzd/B2cFAkK3+ + pVcCinD27AuhjiMmhHa98cNfNowFao9dWp4d + GEO9m8y8lsQtinaGSk6TL6r1C8LQe2DOtNX+ + vufx3dH/MO7B5iqqENGHNuJFJIhAi1h8Gq3v + d4x81B+HwNWDSWYYSFrBYxsKR2EM4v0amywA + njeJPrvl/9GH/Pl2tNbyQBbwa/o3g/U+0TCt + rThbMAyzhhZ9zLHcmw== ) + 300 CDS 50458 12 3 ( + 2E40B2A6CCD2760EC70AF69D1C144064C893 + 1E53A6B3EEE78BDB9E0BAFBB9C02 ) + 300 RRSIG CDS 5 2 300 ( + 20181212121212 20161010101010 516 example.sec. + e+fYaOwAOKNB89dJKd8eKB3wB8zvnzerm6fU + zIoeMj3xBnNxsadFJY3IwSjFsA2LhN8G8Nfo + EUYyFA/D25gT/FPLjfFxv2227bpEV/sxfMs3 + ax6jNEHyuXSxoSQ0XNu2msJc5cdweJHbjcn5 + SaeNQCqYIv3K5IOyXrbYBMcD5OI= ) + 300 RRSIG CDS 5 2 300 ( + 20181212121212 20161010101010 44427 example.sec. + Y8Z8cMmZhnW6vLI6aylycsAfrhS4PT9SOvD8 + jeNjLdL0EDgQE7+KXnpzVgbEh/NLte4ewmUf + UbHsJxUgpmr0+ak5cgSqeII56a4hEHYoseC8 + RI/gtcy7BQFwtKZs9c9SjQsCN7j8+gbJASfa + PIEaWuciKu2wsJkq6/oOFhB0Gu3232Ty4U0f + 4/oeddmd+t9p4sFr1jhWEKajJN+951Ux6cDi + IbiCrFhBORncjuXu4fEpgt5wRozrlKWbKqzS + ipV7G6jdhgcMv5ejDT2JrcdRcwtvSRWXoNl6 + VzbQVw4bwqpEyV9hErN+XhcYEC/vCoSpDfmY + K4nkkXXs1XGJl+/Czg== ) + 300 RRSIG CDS 8 2 300 ( + 20181212121212 20161010101010 48381 example.sec. + dlGP8OjPHifuzuJ+VSlO4XSRaG/ZJZTV0sYs + uLm7G7bLGn+WPQRJWfQcggo5KBgN23/SoMfR + 2xA4+3l5e1RxAss/tCHosnh/EeVyTcUuTzxB + 3/h/pwu5x9MtnlJ3Ybuzpp3fFd251f6o9jxT + K1GXZ5sT9E45bV22Mss4xppLrNY++e6cYBwx + weUA/abG5emxO7N+Y0mV61IkoJnPtORbove7 + HxW0EY0fIe0zQviUi9sgxR3aj/+S1ZkAlonW + dhWAP4jEGYRP1PIwO0HiAadRdpx1wf9ns3le + PRcxl/jVvwVsJc46hgVGiMdasFVuqD2Lot1o + proWTh/W00CH5mhBiA== ) + 300 RRSIG CDS 10 2 300 ( + 20181212121212 20161010101010 1862 example.sec. + EhHaPji1zb/BBgFoCHHFKQgLzF+i6ErJYXh6 + cw2QLRIEHirWgQ/MmOvAxGti9on56Pwtn1oO + D27t84B525KLRj3TJ7CVtlMR6YcJX23pfIrO + 9TZV4DPHFKf4lFmHjEy9S3QtEaKJDg+zxpnU + 0np89RRFeEXY/2xeDyt1AmyAyEuy/bdZPK3S + IQrG8EdG18PAfx+fNlF9DxHgY8gmaeUc7b8S + i6WCaOap+W+RFfazMm0NeppxCztBBh3gZsuH + nqTCLlF8wxayKgJZgP+i440FwhtnbEZR92IE + UVGOiDgb7g6FsgBmquGzXmCpG1gycBK72uLZ + 4QrJt3IR6XYZ7Elclg== ) + 300 CDNSKEY 256 3 8 ( + AwEAAdZOvnLtTdQjfdIqqH3stb7vI6bJlg27 + 3Tp4oRpnmnmgizDFtLQhnIv1Mr3AuwSWVIDe + avuiyWIAtfvwy0f3EYIv8Ys5kDiKs8PE1k90 + yQwfC53hxyH10GzGnAx4Sutrdkh1w4HM1nMB + dlTMa0g9yxjJ0vm/T7qHzj+3dTUi84s8Du2m + fMD6noy+leZ2IuX7lFca8SzDNmhUPTkXuFrB + /QUuoY2FyThfidT+nhOQpzftVtLcta0E0Uv3 + PcVDp1d7vBXsAEYGHr54r2vb3eXdOTmoFyh/ + byehUlPq1gDEH0mBRlWbUHqbGnKyolz0dR01 + u8SJYP6ULwx0mZ0p5BmoMH8= + ) ; ZSK; alg = RSASHA256 ; key id = 48381 + 300 RRSIG CDNSKEY 5 2 300 ( + 20181212121212 20161010101010 516 example.sec. + Q/H66+MGtrftHL5uJrHk72G52YySeOsR55YF + iO6h9obTrFOHGAmfSQbpl9c6BtXYD4Q0ka4u + xN69mHKv3qpfx75lT8X4eAw8dEB7LMSHXSUG + VTpoILN/l/o25RZHD0SNTre7l38Y51ldNyyR + 0Ow/hPH3bflqakBZBHxhItz1chk= ) + 300 RRSIG CDNSKEY 5 2 300 ( + 20181212121212 20161010101010 44427 example.sec. + aM0wQ2jtoBT4iGTjH2jrhCQ7uND715dnybkj + GHkoVu5iq/MUOB+j5u9RlbhWnZhzD2QjG9wm + wKJiXeAkcMfP0GhxGiZleIQw5JbAAluiMKh3 + aefZ62GRt8cgx7UoF/G1QDhxLfNxtgWCNUo/ + d0vqcBfTDlmNKfHfmoRj4nIvYC2HSo0jwGwe + eXF0ROzqyVuRjqiSMixqp0HrMf0pzCMu2eSR + zpL4gRu2ja70oDWpWbkO9JwqppVmcCLKT4kB + bYZoJ4GUuryi5EyrsaL+v53wtd+/Y9Skxv/w + qjAz46S4OCGlz+Nueep13x1azQ2VXj9ztAit + AAik5G5DcQuxAAjYhg== ) + 300 RRSIG CDNSKEY 8 2 300 ( + 20181212121212 20161010101010 48381 example.sec. + zqO8HvhNJnQMcmfdq+2Xj9eR60eWLVaPn018 + ViP7SXl/EILd/T23u9gd6/mI3cL/tYUQMAlC + 6IGnVwtC/pe0Hirotkuq/qaTYtRtDw+d5cwJ + pnshJKtVbgpPUNsu9K9KyXxld3kkQGhh06XR + Pp3WEoJoXfJOsRSzVCarGXrE0UVU3ekpQf4D + ofLndCuqDbMzlgPli3xPXhDP9M85fqFdkLel + FNyDU25OlznZCbylUszJ9Aziijp+D5+FPV2t + Avkj7TngL6y8Ux88FjK8RYy3YqVrKV0G9Izw + f07LCR43sLGwUTzcsgLkq+F0MtC6VIbjWLAc + bgZrlpLaDd+c9D/7SA== ) + 300 RRSIG CDNSKEY 10 2 300 ( + 20181212121212 20161010101010 1862 example.sec. + awyvSG3Fgti6GD/VOBhWKU7ULLz8YTLimth/ + 0w41WpGMwnNYI0Zd4d8cqzjubtFUmxQS9JMU + ICxmZohryh7zJYDUHv0lJTKO7ZoACqfwz6Mv + /xw0lMvHIdxtx77SbxwOXeLOXehqH7fDo5fL + g0fWLZ7AcK/98a92sd/6YOqxnwQxpmg/17A6 + MZwNwC4e5os11OGrEkurBV3TJAbg/HeYYacH + N2K2dx9ldGeHzuK1js9zrMATaCzUkW66fRLY + lZVlVCAgezGCk8hz9+fDxSC29z0Q8qArpwH2 + q8PVlkoL9tisnony2JXBRkoAcZRVVC5gk4xe + gxlNWk3j+HCBifW3Xg== ) 300 SPF "v=spf1 a:mail.example.sec -all" - 300 RRSIG SPF 5 2 300 20141212121212 ( - 20121010101010 516 example.sec. - RWs0sDBYmiqAGzP2gfRP0p6BzzPh2XqDpCHZ - LsDaCmlZI+XIdJy/dV9jGNwJ7+YWLNA/gIIG - NcIj8HElceCzlv14z84hL+8gkvOU90RX/bH0 - wIXMQDqo68JwQ+A65V498Hf5ouzKbRitAFu9 - zEGiW3TXhWUilqfjFm3H+qoeS/M= ) - 300 RRSIG SPF 5 2 300 20141212121212 ( - 20121010101010 44427 example.sec. - cpiGOZZZsTeROsxC22DEBjuCFs+GZOXwY6Wh - le/jrshFrjjANERcA2TrQRFXS+GCxkXb7dI+ - ZxnmaSx4uh8PHcJSn3cIJt0rZgPPGX12S0qI - vj3iKPG73VHhBXiXC8tq5+mEi3/2u9+HJLCk - Lfc3fFJUamhtsElaLsGX76qgnr2brb5bf9D5 - avjPRA1mPQdxCb6Sh8iC28bfXQBWdLolNDNO - EefhmVLU6H399dMD57mXzuBKWRrC6L+i5vIr - KfNKRqodm8AVJybAZImBONQybIkpjMKWNC5z - MoNqfYxskZS/W3N1jHAXFush9+MltyevFvxm - VWQ14I31At06oQfong== ) - 300 RRSIG SPF 8 2 300 20141212121212 ( - 20121010101010 48381 example.sec. - GILnbrIqzGeuNVHG0GigYP/SKkPvW55L2QYo - /Jmd7/DauvShmxW3KWZu1QD2ibJi7evbpysL - 4ktJ67dzhfTpWHFsKBPrMTG965iqcckIfWMk - 5LPs6hqjvCyTS1qWcCxu7vYsNyp8Dyb1wWgO - 5Y4zR0X5MYFVaDOZ3m/td3SFVKTgawkOtiWh - 24paSPl+lzbknBaLtaG6TYFS4MTsdlwpApw2 - V6s2zSaoKIXQbethxFAqWNUOmxp/Gcyusff/ - UKi5NM6DAsrWfuLRkmGD09bWbtf0aPIzTVZT - CaQ3Ys71cUBnJbb73qUCO3c9MGxIpJ9SU0wu - UIBe5nLshMGnv4voEg== ) + 300 RRSIG SPF 5 2 300 ( + 20181212121212 20161010101010 516 example.sec. + J1CgUN17y4TVrVx2Px5NBViQnRwZZ1rif58h + xAWraY5kbgB7yw+zocCb1QnCbGTgCelQIh8T + buel4rpUeMBz98B/ddmYyuzORK6IAB5fLmlF + oNZhHWG48ugKZye7C8ufjmlskIQeRvNl5kd2 + fq7t/paVl/zEZ0h0r4uJ8iG6u+4= ) + 300 RRSIG SPF 5 2 300 ( + 20181212121212 20161010101010 44427 example.sec. + QPQCtQuiqPtrebdPeC8ESc9TBfF3zl0rjhFr + wlNdlK8r2Fp4L6X7idnbctf8XXDidxNxmGDT + /S7B+h8j3mg5oFcGzy3oH7jMp64D6xQnGeLB + l4yKn/+ivG/wp2XqZXMTdp0+GJ7wQ20GzGZQ + dvhBZd8hbOXLxQhkNBXbxBY08M6I94FJxH+k + kGlVUaRQ9GM0qxJ4nCNfyyv/NqtRW3W+m+Pg + Fe0xLO5I+imEsv0CIFqB+tqHbtVLUp7dKccE + xqSIIF4ygsyZoFdHaw4GWELh1T2IwDL+Nh1r + jwAxojherHL6mcWELjYndTVGiZKrbhLthkYM + qG7o6+f7IUf5jmzNBg== ) + 300 RRSIG SPF 8 2 300 ( + 20181212121212 20161010101010 48381 example.sec. + v53uhdO0bwgxTAhCJjZ42bUwqB2P9vwoU0m5 + 6Sj7FsK66ulyw2+vCXJsHcMM2KuuWViag/Wk + NfYqWObu0K2yZXgrhPtQ+VYKeiB1WHlI4mtR + oFSIlUM3VVwJeUkzeRRyRJkOM+oV59ZIRnVn + lQ5skC2Oy9n7xK/XjmxvSady7f1eyB+L9iFU + ZMVHTo11KNT5B4T4tb/S5fb6sw1Vcmwyo0FN + sCOc2LGwFRcIsqzPWn//HrT1SQSdC9k0wx1D + KAg2s4cYl9BVcVtAx++Aj6+ym5dEEmUCyM7Q + BSptcl/7fM7cIZv4WcZbbrKuPRQJtIUWHk9l + wPvhWuJoLblxN7sqdA== ) + 300 RRSIG SPF 10 2 300 ( + 20181212121212 20161010101010 1862 example.sec. + gRIEs+4ZWNO30DTdZecDsPO95HLIaWdqiqhU + moVflYcA80XkyETHzrPHp5VM405LSbGn0eSw + ZYD4b4DFpW32JTYKB4f/8VzEPZ+AvXePGp7/ + 3YkBu242xZEXBcaqNtsxXnPcgmFKbPb75hVd + IkY4nEezPgjcxeDY6Ajnnwrhv8/g1yTX59pz + QvCc+IB8V5IOf7jRA6axauQ2CjP0jOBxdJNE + qVF4OKnZfaWAv5amGD4uNBn9kRSH/2UpcXJm + J73in3qfoWfVaSeUBo+U8RKrUA/n3qBjqWXg + ezkT7moL6GrpZh+0OWNtXgL4z3gpmFDZ6Ruz + 7cTpzI7N57Qx1ZALdw== ) + 300 CAA 0 issue "example.sec" + 300 RRSIG CAA 5 2 300 ( + 20181212121212 20161010101010 516 example.sec. + Tg2gLgMkTTPnO9hug8P6TthqlZ6wnTiBq+Uf + 14qlfD5tV2N8MgxSoLtsTxFvTjeGyqUgEAER + /vhVAfPWsIuNSytedrfj2EEqeakpdX+b6De3 + ZK2jrV4qSl0XQB4qw0ysjmM7stASKavOqsOY + Iwf2+42Xcd+YkIbLoqrSDfko30g= ) + 300 RRSIG CAA 5 2 300 ( + 20181212121212 20161010101010 44427 example.sec. + gpg6iv7/pWHCzCF1YBKVzA7ShtvV8vnXNxxd + ojv1wlxkyI5LADHaKjdkzjtQq4CF2UIJkRsx + VY1y4KC4EW1ACUIDvBDMtN6i8wMLhySsdcjJ + kkUoiZc+h5VM664Nezhf1bU+1AT1hx0vC+ol + dXqs1w9EPj9i2iId4Pd9tQ3yiwH7KthYLXap + DVKxtGb5CzgkRfeZfJABdPs3eH8LWHc84sSk + YWD7/T1wjlR6MtAeZcTTrYeq8o1dBtBndqGx + gi8q8eCGdeUNAJ33fUWmcuF50IcCAmCm01lk + pNRxGOXjmEChnCk/diNW1bAo/11EVATR87Tm + LwgrQGG3zYsglEs6bw== ) + 300 RRSIG CAA 8 2 300 ( + 20181212121212 20161010101010 48381 example.sec. + Zdnsv+j/2VJ30qQ7jFzygrzbtiaSbJACPEwD + pojI7+IEGeYWQoUdTRiZjg8Tay4iql+b1dao + +HOlfIxvl/w+Vp4TgonTtydcYICCKZKZdrYB + Hf0GSMJrdaCU5HV/uCTdrww44dXDISYTph4l + KTmdeqIuDDk5ZZ28XaqGdCYJg76YorZxzS3e + 332BzPBKjcWpWhPzbKXYF1070AgXlvNsboGb + JlFdYBNBsMqwsl9PolxURfsEKsnrz99cTAmX + iV2xJGYHZjSY3+t7Uqt4VtD/8faeW0kgkMe/ + Rktevt+UQJGnqif6dDNgJOLFvtOvb/rZWXNi + 6kRM+l0MghRD2t4ldA== ) + 300 RRSIG CAA 10 2 300 ( + 20181212121212 20161010101010 1862 example.sec. + FnjAGBYlAWL7ggOc1aoaCIkF3VC1032MYoVn + 6MRBImO7EUnTn3K1Dx0n8AgIcgvMeg9yZh2q + tojGJa/mtZK4EOdAOhFu5uRxbnKJkLaNeezA + p3opWnDyzjGn7svDJyR3cQOqXK+cboNNhOso + xOvTJ0MHrvewpouObAcI0Mlz3mLeZ2G0vVF4 + 7Bkkd6vIj3yYLAf1Kg1HoDFwvlInz/2ivNhK + xULcE3F8UA3b22eXVZELVhHtXrO+c4svKAcN + 3OF8JxVNlerqnknf8yth9JA6InizyvkYWBHj + RAIdSn+7LzDfK2xHGxNNTZ5U1l0ILujJETx9 + ej96BYwhqb1uKmyV/A== ) a.ns.delegation2.example.sec. 300 IN A 8.8.1.1 +delegation2.example.sec. 300 IN NS a.ns.delegation2.example.sec. + 300 NSEC delegation3.example.sec. NS RRSIG NSEC + 300 RRSIG NSEC 5 3 300 ( + 20181212121212 20161010101010 516 example.sec. + N/dKyieQ9YnNG5ryp9kgvgZ4AfvdPQmNcSaO + FA3qougSU3JVYOQ4bxep5jTEetudM7fhgGwD + I7yRzgmc8oohiHZkG7yDIeC6CG98nuq1mWSw + xX1AtsxfMHsujDeXf6wNuOsspPXyVBlW2t8D + s5urv/DxCx/mG2uUMJCOa1mb8+4= ) + 300 RRSIG NSEC 5 3 300 ( + 20181212121212 20161010101010 44427 example.sec. + XJWlVH5VeNY08IT4AJVGBgTynQtXEfmXrXYx + qjE78snQZCvPeHMi1U200oRQm0Zmd2b5S3JZ + 8LhEl+4kyBuUQC/cldgf6/3s2PT+usLt2yxA + jek+W8y70jKsZDyCE77+o6vP5TNpSl6VyxKe + uvUReVYe/i/0elQ3kj1wZHTjt597j3ZIdpgU + phKgDpMnubf/oT4jvvJrbDqUwjZZVS8Q9ZNl + NLkqbNt3pri/tqt7iQkSeZBN8dZtLk3GrUPT + cEGqeqUPDan6N07uUU+/dkJZaCN4cF4a0foD + axqfzCZwqTw9cIr+1or0AncRm6571VU/CSuh + EejAYmuqnQtGWoLT5w== ) + 300 RRSIG NSEC 8 3 300 ( + 20181212121212 20161010101010 48381 example.sec. + MZN/l5ivOmOOhExQL79guD4yuF1LCMVJZ3PQ + RT7SLcldN2kS/NTb/0k0lHR9/1Yq5G4Vc8Lv + F5A2Gji1K8V+l1ZQ2m/033/ykTcNO1SO+ivH + 5IRStznBsusEGtfRb4FT9Y7mCQJgXyACCFeh + 7meti9nykB8ncGNC78QJtPxp+SF4DpUhmSVT + OVBxS8RsZJt2AB4iW1cRsv4DF6M1UuuJ1oUG + uOVXwkfITlhdLt745l2T8IRZeMrmv7oWS76r + UIJmQDevvc8/nCXVFVdfEwQ5j2aE5BEr0DVf + zhMJ5hGix+XI/s+kW4b04nyABcYnX3ZNdB0k + zg56eg+gdrZiXuMVMQ== ) + 300 RRSIG NSEC 10 3 300 ( + 20181212121212 20161010101010 1862 example.sec. + mgFMIU5xdIzb0jgvbbMeEmWbpLJN6Q3JZ+oG + bfAm4hJHf2kAyKJTRf2HEFfNCFb24JTVNAmm + jhpcVOxXSQgSD3ffrLEUt2k7qSNjXuCigI9E + OvRhoM2fP2F0GqcRVYbTI9Lykf5QrP01w4e1 + wG4Ho3FCF65As12coaPO61Uh0xBTnNf/mHfC + NAc9PMrhh3p9m0/7H61ZN1IYlNhegyIODuXu + fTdp8ajmcku01RQf92W/JacU1dx+1kvqj4dZ + aqykIHIOzqjxoe/m9eiVOHd7cegzT+jwB4Yh + svv70irBU1uZimJ88ES0PI4vfl+ALKMcf+jj + 6Q5apgo7p8DXVUafjA== ) +delegation4.example.sec. 300 IN NS delegation4.example.sec. + 300 AAAA 2001:2010:1::feef + 300 NSEC ghost.example.sec. NS RRSIG NSEC + 300 RRSIG NSEC 5 3 300 ( + 20181212121212 20161010101010 516 example.sec. + bNEy+yaf6tq+ZH3QnqILlmvI4ldeebL2mbqR + z85MyEaz6BTDkarnglIi1X1lBZQcHrdYJ4Zm + IMSqzR2Mk05r4uUOvDSosTExbp9HNB1C0SB/ + BeJ1uQ9HsJHNDAM4F3f+m3tGQZndW9yG+iAi + 5Zs5MJJWvQoFDHcH5GbRjCDogMg= ) + 300 RRSIG NSEC 5 3 300 ( + 20181212121212 20161010101010 44427 example.sec. + pzswCphGA9sNJ0h69aFI6KaTkcNZ51IN1t2q + aIR+EE+vjpcSKCVJPJq/UNWcqy3IUjDogL/H + T1ez18wmjK7MWmelQty2EXm827Z+CJy7Wbnl + OytU5grXG38bVS06wS90YtDLbIww+kfoyJsY + k/CqMg3mNA6HsTlmvD42M4tZIRHOUFQ2bQKd + nuERZcn0drH88OS7XCbiWkVWNmI0p6Ud432H + obKFUJf6U3+B90sPPiCOF3JckzBJ6yJPj18k + 8fLbEP9c9zkvb+SOa/SxxftI3E+BtD84Y6zY + SowCCa3xSNdgVKpasZAttESD9xLvEC2E1muy + GCCB2d1XvqANp2rgLw== ) + 300 RRSIG NSEC 8 3 300 ( + 20181212121212 20161010101010 48381 example.sec. + ZowFOEUjJl8qIdNa2VGuREBPDx2PtBEicdWF + giLk7tJNxOgwyf1waNdHiuGsAaE6M5UVDOA2 + GfOQ/ip0R62WE5uAifSxpiq0MmV8X1+UonIf + bWeNWYwtmq9Y3rAxzHK/3b4P44DxxicQyZSX + lDs2XbfhhGVWAUIFNVYNlA+2eDSEUsKfJ27J + 7s6AfdFdAAvWEGPolHKJ7glnldElabkxhLR3 + 5z0VVuJ+zQg8bWmZ+WkwE1Z0tcvtQzH1fH9K + VvMLjDnOVhFJtd4fuEpQA0pquEsEyUUvVlh1 + SKNk511c07lXNTOZcaVtU7ZTuMmtJdELerW+ + LX6+Owt4Cfi38f6Zfg== ) + 300 RRSIG NSEC 10 3 300 ( + 20181212121212 20161010101010 1862 example.sec. + VxyoGuLjUDV2f2ENKsLnFdoU5Gv7+xs3gkC8 + 6Vf73QLVIwFbVXfwZ/PocbotObAdgIpg9XTv + 0NTeKjwu4/3PdeVeHc/+AhNWpdIfi29Fxl5c + V3Fyl8IUbDOhaBxNStjddyKcuLCtE14t4Jss + SLGFP4oDt6NZlWVXSyOj6Tdhllj6B7ggtFQF + lePkeKkSRYsXQPx778roj08/7k7I3BED7irn + 4D+mG9cDfB1hK0CIPD3ROfh8ER8rBt1mBT3S + FBSmz9F5G9cz4YeWiAMso0zHTOZSt0pAsg6i + YUrh9mxA5uFILjI+4U4l+xi/CbC8mquemg8q + FaXnwHpcxf2yNqL9CQ== ) delegation3.example.sec. 300 IN NS delegation3.example.sec. 300 A 1.2.9.253 300 NSEC delegation4.example.sec. NS RRSIG NSEC - 300 RRSIG NSEC 5 3 300 20141212121212 ( - 20121010101010 516 example.sec. - CD0RsskZkRqESk9FFf6Xs6V05y34ogZVMQxb - xFTmXwGXFJujPot8Y+r524aHtZ/TMT+5jmZC - 272lf5THZa8L6GSmjOXEShEzE/NxK6QPi0A/ - 41hyTDLfTdMeS434vEArzjCte8vFi3Gs1lke - ALxfuXEPFlqShzRH049QIiKVb7E= ) - 300 RRSIG NSEC 5 3 300 20141212121212 ( - 20121010101010 44427 example.sec. - aA3RBcFysyza0jCN2bN4fRv/K+NTvsseUw1p - eM39ciePCxg20JhsGDWIMCqpSz5R3BLPemSg - ll+B8CuHMCQPLWcb3vg1WOTpSPjIZxgt97I8 - VRfGga9FWxyKk9qohvjVIBKOiROE15OKEnVl - 1T5dk2I32BaWKvOxQEbjxYUcnLwPPsostvWQ - L6e7vsDpFPh2boW/x7tc9oADCX770TPVtS7d - 0Tn6eAganiw2SzgDHsRcOv3Y3PvNCuBxxUla - dkOsPk0Aeho6Go50N6Pq5u9P0EXZQuMN9NMp - cuwn3kotN0XoYBX5fIXnsEsZceiyCDntsPdf - sOXRjg+PmWiM5L/nRw== ) - 300 RRSIG NSEC 8 3 300 20141212121212 ( - 20121010101010 48381 example.sec. - bnK6CJhATrnBj+HNVW55je0rBI2Xsvqfhv/C - IFNaesD3eRA5Sq23rZ+kRJuZb7JlndzPKfCt - axjm3m/9GGXf0YVUvMp/vRvxgemllQn9ANyh - d9KTnEK/L9Fn6KgeT+tti4RkIJB3ok2Yllv7 - uYg3IUDKKrDjETppQeoFKuiflHbAnN3s9wta - HgF5Q1/jI204i9Ausup4wBjFYpJTx1J2Z0ak - zg7zjw5H0fgnKXDGcmT+ErWWMsYYsHMUx6CO - qFrqpP1BnRdOBZ43Nt9OTgUQMTJ+fTJwC+pS - Qxa9+P87gbXCGoV7vyCiYcla3oB9bP7Hnztc - 3gxrjI1G4oUg2GdHbQ== ) -delegation2.example.sec. 300 IN NS a.ns.delegation2.example.sec. - 300 NSEC delegation3.example.sec. NS RRSIG NSEC - 300 RRSIG NSEC 5 3 300 20141212121212 ( - 20121010101010 516 example.sec. - fvrYyP2h+pG+7CEEE6CjzruLRi+9yentUTE+ - AOxJs41pEs11Uw7MR1wO+TGPxanzJlJwvJCs - 9xIBZE4PQta2AKqyAML/s1DeK4a392qPUHrQ - 8N7evTS2KoOKH6F7pdXOPv6xOIhm54ufg7tb - QSr2Ngn3jQFH+rqQqAQluTNXjys= ) - 300 RRSIG NSEC 5 3 300 20141212121212 ( - 20121010101010 44427 example.sec. - SUDQwaDyaGV0a554BvxUbJzFjh9Jhp6Xr98B - /pFXzUvJMcW9gvlAZiWh+Uu+h0w5449aFAFU - I3DByimfOIJJG+iPQ8A8I9u5W6goVeeB6WzT - QL24+e8vAjLrLCInHxlxAQGgkkX1hhFMceRW - +pZyxsS2uBt11jCVM8y8qzVkQE+3gU/DODO8 - 8a7zd2gNNNJ5RIdigzvPxvVq69FGfl70nRLZ - kMBnQQ1Ot/E5KysoprCbEeYSVF3wglFxCmcs - QAJQ9Fj9jsTrBO4M3cQFJcB5KjM0BE7+R57c - yxg7ZKMMMgqe/ubt9NvFJXQFQfQjSmB/3yR7 - Zczk4Z8FScb4NQlAPA== ) - 300 RRSIG NSEC 8 3 300 20141212121212 ( - 20121010101010 48381 example.sec. - ItHnrTkwSbhG9tYZQKAC9XCRmKkt4lSWrXjB - fn5Vwm4cf66uVFkj6gHNGapR5w/Vg+snvffp - gzAGUsgkLk6+xxbFcGGoeQ/VwflWsDWTtOau - XsChTTVnOiQ5vTRhUOmDOHXGk/LF60FaBMBG - R8p9kTtFe6sLtstuVvmMw/e7gfJrYMO8IZ1A - Wy4rnBTzf1MMKZBpJJM8CAyDq3dzinjgFkA8 - /cRwH0+7ODBbEo7r492VOLMzbMWXPBJjs0kR - yZeI9lxr1Ah52WIw99mOAWQ6TW/w4RxsP8J2 - Xj34MwPmIMR3Qy8sf+yeHeUD4cS0woHOlpyu - ButVE7zeuDPgS+Bojg== ) + 300 RRSIG NSEC 5 3 300 ( + 20181212121212 20161010101010 516 example.sec. + Sa8w0Gtmmmt/koUXa1jM+pR0blfDb8uQjZ5z + sWR+Qtm9pUeVi6Im7ZsLF0UvThhPB4M7Cssu + e8mZq8djWe24yfoROn/CM3Za+Zt+pN/CBStQ + wecdIEwY0NuUTqDpc8eqMiMfi+FQkMwyxO0X + SXi+6wfLZMPqa6E1Xko1mHO0VUE= ) + 300 RRSIG NSEC 5 3 300 ( + 20181212121212 20161010101010 44427 example.sec. + GxBmASFjw1z882KzO6qRQuClpk9VCSyJIljM + qCqfjKKdGKqLkvcn2DsfsYj3ZbJo5hgJKumR + 1DPrHFbRBmjAWrVZ7kXxTTvhZgqekSldo1wf + cT+ssNVmFTm+VTVY3Cz8msNjbtv5VLiE5RTI + fX370c0+cCK/6svDtnYgw0vj/3bayYxQ5sx/ + R/jE8CumJ2FNuGx+6+/kDO7MZsNHJ1glZqTW + FCS/2wybR/N8ErEihov35j6Z5NIKAZqG3oXJ + g4WjhuHc9fhfZLn3uRVd+USn3SNnjm35UODX + qS+kLeFvQvLiWYuiJQTiqPoYQuup3DpILMxo + vX9mMUHILutOYGYuFg== ) + 300 RRSIG NSEC 8 3 300 ( + 20181212121212 20161010101010 48381 example.sec. + w2KrHdEoyXYzPAg9cqx8vF1hhc4zdjSvEjIs + +sb+ZgrHKPRMrezf6zQKIjfeZ1DyeMN8nKsS + cmzUOuDUKoytvX8Xo9FB2nUqU+Y8RRao36FV + 4PXOqnmsyHdTAQYFAGaDXqYzQvt3Ev+KRa4I + CjGzwVhhuijSskv393NNJVeTKXIR51Etz0DO + kdk8SamYpitDoGSLr7oKX3nw6Fv//+faGdk6 + zQq+tcj4Gu09nrfe4I2RQDcsMXJODv0RwF9y + 64ilGuRZxsN81sM8849uzBUDdNQIxd9Tod+w + Gg8P7AFxWyFhhhfO4lTS/OiLCgG1yYT0L2l/ + pU5AWah3d8VT1PzULQ== ) + 300 RRSIG NSEC 10 3 300 ( + 20181212121212 20161010101010 1862 example.sec. + kMb4PgqThtSZSJUiBRUeSOJl9S4toailINo8 + Fs7wG0yqMzI4jZ3YiI6myWiw36m/y66X8P7d + 9eYomaEbO4/1QpUNDtbuBams4KzWVygStswe + 2AK0VrZV1o7RhaJfQ5PwWc6tYMyepE4NwqUe + 0t1JF/ktw7yXiG9vcy4copaYnqLSnfgotG02 + 3sc8f7YAMthm4/o9lAtYVCWGwd7YIiLz6CHR + kcbfRn61GqNKUOTJU98AEhIqaQ99iIrD9gtA + q2p6eP9YH+jR6GqXjKKo93hrcdev0rWPD+Bp + xHVStzs6Fu0frnAjzPJCNjxD4TZN9dqp6Ffk + CfAF8X41YLSdbVmSHw== ) +mail.example.sec. 300 IN A 2.3.4.5 + 300 RRSIG A 5 3 300 ( + 20181212121212 20161010101010 516 example.sec. + uBuhc3/9thGl1UkMMxLoI2y0Pck5siv2bm9y + 8ZZ+mj5n5CxMtY1dKg1Ie5AnWUklOceXespb + eImHlRcr05gVBSAYkH00hANMWgnoTSWp05G9 + 78/14rMVC9XfuHHYqL9rlqZfRpKTELPYuI4T + YReeJL4DG82WN46CGipmhSFI6rQ= ) + 300 RRSIG A 5 3 300 ( + 20181212121212 20161010101010 44427 example.sec. + vHfCAnnCsulD6AXdpDClBtnNThqRSxwC5Wxf + Pj8toyQqEvGV3I8bh3/jq6yWv+bjTHBLy6qQ + X8Vob50ezCFcdJ6qlwVlVHGjsPSL3wXvaxKs + tG3yClwy/UmI2Ey4UUy8KBRrPvOHhn5f+LAe + yOM7IfPPDDABkDoLXNJpXLIhUrTjhB01jhvn + wcdGmR77QBF5+I9eZsrQC2Dmr4xwOcOWYRwQ + 398LmCuZYh10X/A/IEcTm8SxnUwfAOw0Dg2J + TRnU6Es1ag0nEU2dOvwVVefqm4F4H3ZeEaZD + qZiKvmf8vTWaPF0X0RKwdJVu0sZnQdNFwliN + mhVCgnMLtRLm5f6QEA== ) + 300 RRSIG A 8 3 300 ( + 20181212121212 20161010101010 48381 example.sec. + etcmhIlYcyL/MJWcI1HWKYQRKlQN83SJglUw + tqMEDQYvC9aIl/EnWp9OMlkEytl8dIdpNMIH + +kttjnxmoyY/CFUXXbNKGxc42AZB8NCNeT15 + EI3YE2LNP4kG4dYDi/2K/05eel6U6JkuzByW + 0vC0DCRqvkI13r+igDp73hVta+Ee9JcfrokV + RLO6X0nK4P4a1RxI8OVklVOQ9Vu5fWlxLjd9 + ki8MI9V2kNiVvNVyQFb4IW1d9qjZQgsFQIco + uL6IMWxR9QCQd9cGRxOD9hodqObsm2E2YYPE + /CtMpE6hpAjVm6oSEyby1oHjFH+Mzzv5lfvY + AsBXgVPKeK14Q5P45Q== ) + 300 RRSIG A 10 3 300 ( + 20181212121212 20161010101010 1862 example.sec. + Iixa0xKHw5w70HJ7xYdvFk4iJLyMJ/4puisU + NQZKnEZqzFEND1HdtplcWI7/GW8QWG+D9Lhr + XPCbaPSIT6al1gHmLUpf/nCsI1fL9VY8Wyc1 + ZHhsyItDJHwErbXBFo5tWpqM0WDjeFAwJGI6 + ZjC1VeRX1FWDelXcVPMP8IZgQ4fbGrdC60Kz + Wew2YFEPdiHXmCZ2t6t1lfBdkVKlNqLEWwiD + Yjl0liXKOy3t031LLN9z5PJ+gpWePwFpdlgL + Od2kmXBTOKqB54J71py1NZagoTrEvXGNna+F + MDVkqdOv7ExXbv221atZOF92xIxuzrto7Grp + 3c21bdJDbX10e7+Q0g== ) + 300 NSEC _25._tcp.mail.example.sec. A RRSIG NSEC + 300 RRSIG NSEC 5 3 300 ( + 20181212121212 20161010101010 516 example.sec. + UydDK1ifmnSxlnDhmxEwiku23EYm1B6LEeUs + AOEFtlkFDCBtn8LUir1HwGsOwRNBTPi0ofN1 + VpUdcAF91RQoZdVogjJKKirldqci3CFH+Cop + YV6WTOLLSidi+O+lykt3ejflrrEBwuKUcu0M + UWfVKWQQcEE+1KIS6A8MGLCtxFs= ) + 300 RRSIG NSEC 5 3 300 ( + 20181212121212 20161010101010 44427 example.sec. + UYRGOZZaoYg0FnsImfKW3p7J0CEMIzYBHYpn + PSHvUKIuBVID44uQVNVqJ5KDaO4squ0FgrC4 + PKqMjExEcZAi3e57xuXWciHf0uQT60mvXqMT + LA94SOC9CYF13Qft+XY0TMB0ufI0BWTuBDK0 + qDpYKa9fdviwmLHJnXyrJxYI2kKFE0fOkoaE + vGa6B/fSzSzT4xpk1zrsWbfhWM2X6uY/Wv9d + KKnVw/S41EshBwsUWKLGqRigyn8/XOI+baoZ + We9+JbSu/mbIi5w2TqBndKkFwnb7mKUCDz0Y + SLkCeMywApytF3EgQggb68sDP/vApt0YVuy1 + oJphlerS+RsWUUSHXQ== ) + 300 RRSIG NSEC 8 3 300 ( + 20181212121212 20161010101010 48381 example.sec. + thTuKDb8SXg2IgbU0MKhtlU1109j9UGeo1OW + cJAqAGfNUC9vT0qzYQxmmZiCBDBzsBu95Gtk + 9k2cORB/Hvn/CY8Rso72t0Um3ergBfCcA/Dk + 57XAb+oDYV0sIBnXOvYpNAO1pIhFAgfMnqUB + pKuslPOMyHR+E3lrbGHplPYlDizLqJu89WhC + TVU1yHuCxFKte8G8ViRE8RyScNC8ESAQQ3bR + HA0Ido9+iy//ZnsLeDjnOicKNo22NS906s7+ + DAV1P1BaW2c990zO03dJa3mFAR9p8nbwsGLa + MOtXlTufHBjG7WcMq8sVpQSa4HGP85TAxHzP + SKalXVqikQeiV5P0Ww== ) + 300 RRSIG NSEC 10 3 300 ( + 20181212121212 20161010101010 1862 example.sec. + jGUL3AKnEao3XDQBPr2ZErCmowkDihF1kPB6 + SZfKAI1VisPEFn6kZrucHNAW9842HS3ihvB+ + KbIVa00iy70o0O9CHTeGherk9iNwiBI8YEFd + rkZotXFk+fxpQ0n8G+nkCSaHLSoXvp+i91Qi + /1Zi4hkldcfdblH3mprbZMyFsaxBIPjNma/4 + fzYZ0hVl9RA9mHtU2Ef+/uS7X1B4iu5OrRIv + 8n2WMz4F1KzLzoPglO2oEoprNMqpDfvxhQ9J + d+jEsiyciHPPT1us5hWnPzfQx9POSCUn6ZJz + Mzup6QnKCWT9eTJ39BNgUYPK/0I6vypmlb4M + eOsytBhJVquQqQl0Hw== ) delegation.example.sec. 300 IN NS ns1.example.sec. 300 IN NS ns2.example.sec. 300 DS 60485 5 1 ( 2BB183AF5F22588179A53B0A98631FAD1A29 2118 ) - 300 RRSIG DS 5 3 300 20141212121212 ( - 20121010101010 516 example.sec. - HBXFIbzthhFqFB7YUceWeSHsb3jlbWvhJaqa - xqhh4G58Ktbq/eD/ODKJWpTwDsrwK9neYp1P - En/ZfvmBZe8jS8SmdTAWt0Ov3yMMN/lk3rEQ - vE7xlsCFxk2MvJubUBaTGK8Ixf4mSJBKiew6 - 2lxjroBoK2AV84tScm2mxTS8GMg= ) - 300 RRSIG DS 5 3 300 20141212121212 ( - 20121010101010 44427 example.sec. - zf2WlfNwFRqt888jC5ORYqgHeMp0TLkO0bWP - tPcw/hgyCF+JdqIXuEDyubiqGZD7QQM0xEoO - jLprcOG8ZdTMjhW5JXBoyOY4B5MfD1Ucy8Of - 4onnUcP4Pfm91xuXr2Rb3RbTDyfqCyJ1fNsA - nAh7nOChJmxHJYz9oH0AfQvvClUWd16inwgn - XIOdQxDmKkEtdU2u42FwAk6pSiOzR6zbJ1yo - lXWeINVxL8TxWjVfq2XIzwXFEkWMftDQjTwH - /LX2aueermN2xa5uqOqDVhsLG3PHR3sQMFTL - heIY3Vietpxu0LMZgiL2IaNTLWEW+mhCvtmq - aaxKq7kSKxjg+VU9pA== ) - 300 RRSIG DS 8 3 300 20141212121212 ( - 20121010101010 48381 example.sec. - RLaaahYnGiGwt0y3MapNhZ1wrmaK4pxp4fMx - LgK60SNOGymW6JfnoLIEDLIYG3m8mLVhdEvA - nt/5739u2Nu5HN3LQLNeeF4Kcd795Ns+Lggz - bte1nVdvj79L4xd+5woTs4FgD+gO0iV/i93n - Qy0MlnkNDN1js7VU1ONSb6GZu2ggVO6lY6hl - +HeOX+9xIdD7lsJj2UDZWKV0SLLT5kBDxLvs - I9ZA/u9tce30uEEpmZIopF0UABHzqZqm4vNs - Qcr3jP85Kuw25E47Bpgg9RIirITAooac4jjs - qVh/ydgLMzoklcPB3tISSIh0x1iKvnWVevMm - aloA6DajwqBSlcA7nA== ) + 300 RRSIG DS 5 3 300 ( + 20181212121212 20161010101010 516 example.sec. + FFR1I0RCKnQAiZjnbYSa0IChopcJV6xwrejk + g2yhwUF55yLgmICr0qC8OyfcctHIzTl6At9Q + s6u6wG7mDqCxvD4wv90DbJb4VheGO2rHC3Ie + Ie5M6TKqHbcOxGKxPpJSFBiX+hnOwAjcOaez + +fT+MPZavgQWjfYgIORMjw4JULo= ) + 300 RRSIG DS 5 3 300 ( + 20181212121212 20161010101010 44427 example.sec. + qGi/8U4Z1lYF54aGwcxLdgZ7vm+14atpACBN + XGF1qFQjL1W4d/Vw/19KaPuXsjHJPOmK0Zce + 4qS1hosa5wPnJOJBUmUOkRW2tVojpnmkKaSS + jbjcQiTlKHcUNPMJrNVrwJHtOMyZjCwzdzFs + mnzLa7yW+CNoP6mHd25bErC4iZ6MDi7j6Q3Z + +MUi63BbUUNxL6tuCl62m+pr+0ShsCvwd0IN + l5+OI8VexQOydES2o8NxoRwR2yE7a0MELM6K + AurhtViy95nQ0kOYJ/0sJkTrVsbZ/RHnnlzK + czn/6D156tN9pL5O5YYwPWDQRC0Mq4DJMi0j + POol+ZTFys1OfnVfrA== ) + 300 RRSIG DS 8 3 300 ( + 20181212121212 20161010101010 48381 example.sec. + 0JohpJrNEFwcDbffWpOAU/L6O3e4zO0aK9aK + P5X8BQMj0NHvQGZXE5PMvB2pZLTyi5zq9udg + /4Vv10Qbn2AMV9NpIyj30nhsIZrG2ruDjaX6 + I6xW+Yp+LeS6ddDekBCFtvgvxP15H3T1kAmc + kpfHjCfTnKnoxgOBqaNjYe1YPwo7jXJ+qOVs + SZdEglCSJeVTMsj0W/YQdJmwOI+gbWNA78jn + TMAgWMbbsG2k7B2VDhYLwJQgZbm9vIhtfJLW + JxdEbMCgVB3d5O47Su2nPTXOv1a2QX91ahRn + BFxhhCn9/9SHGxe/OuK+XwzxefjfMyhBWI+3 + OecSui9MhQtAhwIaHg== ) + 300 RRSIG DS 10 3 300 ( + 20181212121212 20161010101010 1862 example.sec. + YkXhW2eX/F2Y2G4/eH2vJ4PEN24vLCFmbHho + RR048doWiquWN1qmVsvtrVxOs+akCqItazVO + KyoVAGc5Nc2OM57Rz+4kH2V0crWCrIRZb88I + +5/e0RFGe3+CDnhIl1V8U9JqlmFq2QYknjbP + gu6QcwUwJbxff2mFWO9RSmm2/ARFMfjMfk0j + VVA1o3/e9R18njNijmnDVtVd3fp1aUQCr4R0 + C7VbsG7+pEicPaY4B6AjWp19WZQLU56JyTyj + E52NU67U3QcED0gQhj3Bz2nivJDKnq2XelzH + 0/EC8vV9BdqDBLjMhnXq+Q9jREKBWSNjaPCc + ieTw0KM+YQIAtMjfag== ) 300 NSEC delegation2.example.sec. NS DS RRSIG NSEC - 300 RRSIG NSEC 5 3 300 20141212121212 ( - 20121010101010 516 example.sec. - syy7tcQTts42hPpDms1kF92e/4duPtn5wuuS - CXMw+C7aIIMEm2EJ5BHtjLfQ5Qh5QRieCgJC - S6aT6hr9DXCfmXa1x+Ing97VBoYll1GxNDup - xiRR4nXam9d8T9UM7I82L6pV4qF3NSVDGiVN - VqW1wTPWEwRtGrrRBOdUvn2KyXI= ) - 300 RRSIG NSEC 5 3 300 20141212121212 ( - 20121010101010 44427 example.sec. - EK6oHG96GEBKuirll3p35bCKrDylDYOj65gc - 9G4AwWaayurXBAu4iHZhA3ZjBZXixobktlJL - vK+B/KshG5zYwVeKDnqYNMuCxJ9+u2Py7u2x - 9uqcQyp5KBF63aPbvS7+Xg6alNsaEKQEwWjc - 7J3ZbvMgG4Q4fVR0LO7CeGcX/tlOc1WpBH1m - txhACsZk+Qmy78hC++X9EVc3CA/AwLoGvdhe - UMpclz6uk/C/ZklNyRH6aRZlJz834wBL1Ziz - EskVYIosekKpA0ZCYl/V258dnetBE7lvQ9Nh - qE5JngQyOQnM/SGPFwDQAfGcXIlOJWzhug43 - EhL6uVCHe05lN072Dg== ) - 300 RRSIG NSEC 8 3 300 20141212121212 ( - 20121010101010 48381 example.sec. - Mq68uAgzCUU9wD1ybPMBlyEFcICEkgLbS2iK - ZlvdlYfN2GQeiBznSdg7y+Ss2eXoNfZd8ouT - 9FIAEbWoKjg9k1B3/HXVtzW/QsdiLFSepgmL - nusgNfgcSIwNbN12g8YMgETNLFnNon8te2Ry - SWuSK6tJ8vKPGT9CA4AaF35qnouvAStYplKh - EaJ//UGoWLvKxFPCmTP+RAyLgqidOvJTAZmf - gLELI+A9SxWI1oB4tKd1Vc2Aq8NbNBx2Z19b - cvOQwBuAuiHRmqiRzHPP6jVBBE+pZ/wI4izT - c+1oSOo49QSpUUQlLIGGjnXgh3IRV229rSiF - 0nPycKu/3BOUo5cxjQ== ) -cert.example.sec. 300 IN CERT URI 0 0 ( - V2Ugc2hhbGwgbmVlZCBhIG51bWJlciBvZiBt - YXRoZW1hdGljYWwgaWRlYXMgYW5kIG5vdGF0 - aW9ucyBjb25jZXJuaW5nIGZ1bmN0aW9ucyBp - biBnZW5lcmFsLg== ) - 300 RRSIG CERT 5 3 300 20141212121212 ( - 20121010101010 516 example.sec. - PdA5ui/NfwgzxQhNBSwqyniuI9QpQedtQqOm - 7waMIAXEi4MWEeZurjJwA9ak6EZYHkR2V77Z - n6YoD1gXUp9iE2iX50VRLjDMawHVUmovD59P - /ArjKvm1msx+dtkgqLAXj4v2If3LLcyzO4s3 - 8mjrp8phLeGPISo17Fen+xUeaJ8= ) - 300 RRSIG CERT 5 3 300 20141212121212 ( - 20121010101010 44427 example.sec. - qFPPehUwkyZhjdJRqXk9ZMJ5ysPmR83af3hF - 91OGr9i2wnC46II2o1sxfgiL5F+jNhOYyUv7 - QnJWJn3+iqIomGnCHqSYy3JoGpG/fkZBSwek - icxxnvyzEN73tf/EOJ5v9akWPOy2PPyd0L8p - xQWJlqF6EZlAuC5a+OAbANZEF94/2YIGsoKg - wXy2cwTZ701ujeMzvivyuuJG/rhrOZUXDexs - FH/UvREmOLuqyKwelfB64BEJBuk+CuASeabt - PE1b86qzs+rU9nm0O2EtUaImRDVJSWXP3x9b - VflYJbj9rnzB/4edkLLNuMtcpLvViHb9FRVV - XU9PQ7/uGgPyPRdnlg== ) - 300 RRSIG CERT 8 3 300 20141212121212 ( - 20121010101010 48381 example.sec. - Rf95qrkQoPedfcRlD7NfdpGeti7JdKouptkP - YtLUrzwhsb4kEvcI0DC+Ua3jhpDhPKCPZfrN - VBBhmeAeAIZdn/MT7wMKtChGA4VtgI61jmir - 2/K2a2/HFqW1PRwWx8NqgFz77C0PbTpOesim - qxsjYCyGJF6HOpKhQ1DBWb1+twt2n3o6lj3d - wYBnveKohQBkK3Hl8LklRFjSkbAU0Qj6309h - OZI4p+WQrZ34+92ZcgcZ9JLYDv2qXcaj4bOq - E5lThX4NLRIjx44fTzrLxW10W7bEXPzgKZAH - vKoRC6GHp6hh/xsGdTCX9GPNf6S0YkVzDsaZ - ZrXvo2sNO9PmPNuBQg== ) - 300 NSEC delegation.example.sec. CERT RRSIG NSEC - 300 RRSIG NSEC 5 3 300 20141212121212 ( - 20121010101010 516 example.sec. - njMBdqH1BnBZyawcmbUHT5WDDroJDBAwc/S7 - YYUAUwoXwrPSRiW2aGYHdAKZCbH1M5wrynoz - L4xfEkZlRD+w8m9bN56ydnY2y34RgoRZUq7V - 2Pk0n/2P5f0wB/34J3KKkxH8ynxv1Jm8IA8g - XY5PuJebRYA8mxXF73/R+NyR25o= ) - 300 RRSIG NSEC 5 3 300 20141212121212 ( - 20121010101010 44427 example.sec. - lOgiQTRHuvOXU2k4XBQ50x693t6Tb5Hz18Lw - tjrlZKsXHb86IbqP7pgD9c7GS2ov2RpQBh1q - AYsmibLelbjFPppFh8EQz42WqjTL1PM7bunF - KQSgd6pea32ewp7RMYfss69A+nsVD8t0HFNP - JyzUkIAjM1knIYXGPeHfPBQu4XpOzVeF9783 - ADEQs1c2oFAA7R+xmuoQh8jX/JDQJuUKEwHa - u84k89GZukCr7pLssqLybZmAYvsH6ajR/NrA - Gv4pjGZWz4wy2s5h1mNMkEFqm/qf5RWqsfKw - kO40Yr2jfKOfTUrmsQjLdvjqBMzgzp+JnAqw - tOzTeEWGtkxb5JVWyg== ) - 300 RRSIG NSEC 8 3 300 20141212121212 ( - 20121010101010 48381 example.sec. - uRSh10E+hDBZH22j8jZqRoLvz/rzQQzcWR8Q - /ayzqu+xizpC08tLr7SGBjqlqkFCvhvGoYkT - X/C46ItvNtx5YDLMuZMeuxOd9RcaTPeVbhfe - TjfQ7Smw3bCEx2PzZvC3urA5Owvi0/JnFvBW - +lWGmDTnHxi632QrfEQ1DoL/dJCBkDUCcYRX - 4lYqzXXO2vdJo0GrghtIor86jBy7C6nVrLb6 - xe+oNfz7aBlXm8JGXTriXKa0LUbX/xu0Rox2 - ETgm1G1e3HwfjXxQ+NCrHLUOxHYeq/GDi9NM - 9r+jXTD1gNvMpMCTidufsGDpYMwuGEhCSXTr - 0q4c+Z8Vv5GyEEb/Gg== ) -alias.example.sec. 300 IN DNAME anotherone.sec. - 300 RRSIG DNAME 5 3 300 20141212121212 ( - 20121010101010 516 example.sec. - hN5znng+AmkGWTmle6Vm+xCIEgGtZHOX7wu1 - L5tQbdQygpRWAL3AEvI2B7zqOURAokvl9Dqp - 2O6JhxtxxH7hTW8wk0ZeL8SAWXGe+Dmw7OYi - lnDuO8DahBZmg3rMQHFo7jlWqRB2BYicSAmh - 78e9JVIwZE1zsdJBpvFjVgYWWPw= ) - 300 RRSIG DNAME 5 3 300 20141212121212 ( - 20121010101010 44427 example.sec. - lQRMT04a7jSKtyoPyhCoa9cEJU0Psria1SqB - fFq4pccSeBTjZcbiXs322ogGc3cmUO/4+YRC - 742YEd9/iAiCILrEZXPpCprgymCIqZ2uJxIK - Vk2QUNDHOaJOjbZ7U4/g9T9K6LlCqBwsUAuG - euur4wDsiuEQPln5T+9hIwjS8Jbhx8jPRs1J - QXe+G8zwg733I0GSU7F+IuNhzgt1N6O/8J5y - OzLPLdUwLs9ty9B2rbyU2zMySQgiWaD+wSnp - bZ5iJLrg192nxIZhaeOZ5Ig4mwk3UdF8baCq - UpxAUddSdSLtd402+F/6dQV38mEeez4FOdv8 - egjnfq59oLOSiQxA8Q== ) - 300 RRSIG DNAME 8 3 300 20141212121212 ( - 20121010101010 48381 example.sec. - nrFN+doVZOaYEk2HLbNCwBEreN2Z+nB86rfE - u5f8Xb99sppDFsSrc5dnsNBsOyzmg3OhjmeN - 5vXZ/dOTlaAD1AJwYPUEXZ+SPaF8nFusHib1 - kVfcbUSMKaGBIaQJmIBQELL0E5u6Vx85PwwP - gfujuUSs29VoDmXkRj2978PVihb7U1mX9fjw - az0ZYmbMDKzlKEYKYEz7PnDIvl1HBmYxSZlx - HLLLeImzszHMJMdzeH7wSmH+INj69bPpNREn - SO1F1AJvFW5vjHtoa692Ggk8kUyYJhRFMNDV - 1JDTQxNeEikvp5glE3ywPKRRVxVDWCXVFgJP - m67Q3r6pfzRQbP9obA== ) - 300 NSEC cert.example.sec. DNAME RRSIG NSEC - 300 RRSIG NSEC 5 3 300 20141212121212 ( - 20121010101010 516 example.sec. - arLwaxZ/s64IufkYQljXb1V49hgVY6aOA/4G - CrFOB4KO/eEaHiinFBuXznKlE9ePiKKtGsbm - ALz4gP/zeUEsYuDYbuFAYixWvhHG4wDMKF3y - V3Hfxeue3PYulOreyPuRriK24sZJDhy7LVN3 - Ps/z1TWJ+HWnMDeprU2qjj223YM= ) - 300 RRSIG NSEC 5 3 300 20141212121212 ( - 20121010101010 44427 example.sec. - ew74MRufBg6jYSbb/cDx3f6kVpPxD7lfzp0G - kPVIsgqaRARFbl4cLQIUCaAhRIIjwR0G56gl - 2EqrjXKWr2hBDIsvhX8Pgdom5j4vGC1TS0wI - 0YMrfuyuviNXnutdyxKqEPhgtnUa327/suTX - Z/aoQoe4Um+EI7AFBpVuHdAYxgYF3qiDCNqO - nzNxQCuW/Tx0NzocmRHxw3sl/MRknbQvKUgi - 1inJQizjxtncLdjNPxn4UoJcb+QUE55letYO - TuIDyaBc9kuPnT4l/1GsnbZuODDAiRI/f565 - h3dw18WeoaDk7sJKdiGZISt9hj99ARrGgpn9 - u1w4JRpoO6rXpgXopQ== ) - 300 RRSIG NSEC 8 3 300 20141212121212 ( - 20121010101010 48381 example.sec. - Xzl+kKu9k2pjKyeg9hz06MD5ItGIt9SkWHf4 - fXcNtSQ+GabNVNtSlCPbaIRycHSLf6/AluJe - SSijB/dEaSSnPogAATefm6NlgF6Tc9NjRM6S - dz0s1sFNP8pnGP89JSA6HTk/13hcAbIhkXUg - aWMUpmTn78+g7LnzGmnCPTsEKr65x0IETfsh - 06/0zjZJXLOmNr270cuj11SHNtEr5Y6qw0v+ - FzSeWn5GySsgShj+q0ZZY7OJmdQFjW3j5ic5 - YpHwaHGq8Fv/VoTiKUjE+Or7cZFW5nFkA2L9 - KYR9z2bXY4uteKxU+VfpIn8+BGtnTBR+LE2k - y8/ie58TOaga3W3yWQ== ) -ghost.example.sec. 300 IN NS ns1.example.sec. - 300 IN NS ns2.example.sec. - 300 DS 50458 12 3 ( - 2E40B2A6CCD2760EC70AF69D1C144064C893 - 1E53A6B3EEE78BDB9E0BAFBB9C02 ) - 300 RRSIG DS 5 3 300 20141212121212 ( - 20121010101010 516 example.sec. - dbS4zOt4yPFQz+tp6SmfVPSgWF1bSkJBVq5b - y13h2bZayms064FdTJmdGNErN29VVnZXiaFe - 1gf7kmSdR2YLYoI2U740DD01NUC+3eH/E3cu - IWmjQKkwhB9Iwe8UaX7jqaG00bxNaTJpb/Cq - +zMy2gjMcG7KvQvuQ6SPzdmCUC8= ) - 300 RRSIG DS 5 3 300 20141212121212 ( - 20121010101010 44427 example.sec. - DsjOIOocYhuHZJWNijzIj02FOxQPXFlaUhPM - u9hBsWEOA2CFyuAdpshG9EQJa4jISUT3Setz - 9RZA5UZAV7/ERHsLdDKAZez+j5v2d/MqwiNA - d6SdhSUWlZqPUMQluM81RfMCzqYbcNE5sw+N - 0MzzBQz2iHdO2+tJ8Tvg+4ek0aaCAIJ+IrRT - f7wiWgiUmiMkWTjjkuFxGtOKotTZp+W64KuW - yEbt0ApmpahDlwSUKruXs76FVZPk9OLRM9zQ - agLs4pVKpwP8OK3KUVUiR16W25JrycEd4TKU - IuDAuodR0SRrXatBj3X/Qm63CT4gjQf3F/Ga - nLDeZKDi7aL+86qPzw== ) - 300 RRSIG DS 8 3 300 20141212121212 ( - 20121010101010 48381 example.sec. - Ske9cNhh15n9cJxkozsENJtlTgnEPDIi/7Hx - Q3nj3UPSx24JTiTHdddQAcFwmnDj2qVuVyoG - sDq4GBdj20soTcP6+cGrQ8ELokXwZoQ8ddGy - uaJnkqh4JBcSXNCv3OoimAj/tVxse9zjpFgl - d9c/C2LF7/4rEtflLybmgLmlFwVVsDUCpQ9X - S+Btx+fgQNvpK6BbeVaDEr57X9ysLBy6UxJM - mXyV6/oDEcK/8enhqTIiExOi40yhx2woQRMy - X4szYS/jwLrS/yUrUrtbpcOHwpW/ISqDFCuC - LWqEfQtPAr6U/H3SXs73++cMAoBuEdbeRUcq - OSZMxNY8m4uZvC2EOg== ) - 300 NSEC jumphost.example.sec. NS DS RRSIG NSEC - 300 RRSIG NSEC 5 3 300 20141212121212 ( - 20121010101010 516 example.sec. - jcw7VqEW7YR70DJAV+oYAKxSHQ9H5vQBLve8 - zcW1dge1L/EQppk5I0zRj7yr8f7pTrm7IhNn - aPv0YbFGRGQJI6w0a/xVr965LyQt/LNyp56g - UwLO07msGUvxr9br2bsYb+lI5esjmUeI38K/ - GkO77+5iWuv4WcSfx3X0KtfKyRU= ) - 300 RRSIG NSEC 5 3 300 20141212121212 ( - 20121010101010 44427 example.sec. - KDx7V+aqRbzoDaY7QB7PTsuH4IrtBimwJsfx - Oth/fSUdmFfPpByVmY+Zln6HzAcCDMAapKEA - D9QV9f8qPssd8uQpAVKylqfSRcYHkZzeGvvA - ho4bmrNPz2wQEz9XFvB0hXJ8YI89a55HYN/s - TzdNmGtK0WVZO/6A6nALCB96r5FMLTEhdn7s - 8iLV1k1DojkWkD44Bojj3Vkq6r6o21h2FVHd - /lOjUQSjEwQvt/1ctI7bJMHnFvMewVCt/oQO - gu7oQijwsyFMGJZl7FDmIQXRLxywHhrTkysH - d05krTNL7A1K6y+GFdw7/Zv2kfqrrVSyRoxH - XF8zxi588nrfOuqcRA== ) - 300 RRSIG NSEC 8 3 300 20141212121212 ( - 20121010101010 48381 example.sec. - Cao7WSRgcLLlQRSTUCB+1AMcfTpkzLAVqs1U - zfz3o6xQHr4Eb6THmF29W4xEx5sYMC+9yLws - sppmbfTRVISRXZe5MoajC8DWBC0lqEbQjMPM - MG2xZ4kinEGPvzM7Xx5TFejV/n3yMRFm7QHp - LBIB3pIfgXWMvpLNINCChUVdwBMXJ8vopULk - rdTJ0ZMtnwO0iMo4W7YmgiWqCD4f8i8+6MWG - 4WUFvsitaogroKkvOJgj5hxEL6OXLyAWNgfX - lxF2jBpK+tLCJb8cTe91slIOkus83rCxVmAP - wjwt57GQrn8REiw2bbfeXc+kZzoPC8ud7Hlz - eOYtpW+EfZQhwqXyoQ== ) -delegation4.example.sec. 300 IN NS delegation4.example.sec. - 300 AAAA 2001:2010:1::feef - 300 NSEC ghost.example.sec. NS RRSIG NSEC - 300 RRSIG NSEC 5 3 300 20141212121212 ( - 20121010101010 516 example.sec. - ck530M3oNpf6MB6IOEKlAG31GUvfMGvrnmvL - mc3gFj4YkH4cr/Mue35C34JsOITZ4eCAr1qm - 90I1ZZFirtznpK+XSoJ2OmpljD7ukp1v4fkr - xcBi4DRVN33O9NvMGo5ByOq83y5Sr5DIZn5B - K1xnLIeGNYNiNabKbvYsL63GNBw= ) - 300 RRSIG NSEC 5 3 300 20141212121212 ( - 20121010101010 44427 example.sec. - KvynUaRjew0Llu0ir/Dae+y39m4n2hiFGEld - U9/ka9ebYwbULECDoZlppm+1VQ7aPfyEtm/1 - MulIQHWplHwjxGw10nk71XTLgeiSUsVYCdDN - qK0dC5mJ/xnkaNgR7Q//e4YSg8Z7aVGojkh5 - ewXCyVzqg+hLSWWe2TSQV5CeakjBkTmew8hS - Ugg0vRepRtZ+VdFa6A3RX3/35Kj5YE1x+QiO - RKpM6oIaeinSpNcJgOKAUIfsm0rMlGqYwun4 - GqDJi+X3rqKmg3ooVNXjq6FqQr8hxtPkO52f - mHQxeGyOczc6odQGMMrlpEEroTmcOLP+r25h - zFicoZjtVpMCk3Im/w== ) - 300 RRSIG NSEC 8 3 300 20141212121212 ( - 20121010101010 48381 example.sec. - u9kemCEEjLcWoyHLMgQiMESYDWJJosTnqbxR - p/0wjbjjtcDCxheIMq1QVzgiM1dlEJhyGgry - en4VD0ap+RAMP2LRTudtoTogAEGb6OuFYOM9 - IBV8tYkq8AXAKKQeQ0HDiveQFC2Af66XJbZu - ioTdNy9uJyPHSVQK1FPwyHrMpDkkMyc2pmJo - T0qUGMHTZCDX/JcRkA/tuKpftpkaZq70/edG - oK9ZRF3ke4YnrW8RiwUp64dSmzAWqth2ht0v - W1BmNAoR/oCdBMmMYzPJxNDjJ1BDaZiNUH49 - I19wMnvrFdYVz6VP5o/TfJ3wLyejKUMAQi0H - AJcNAWb7T6czVkIXIw== ) -sec-10.example.sec. 300 IN IPSECKEY ( 10 1 0 192.168.1.10 ) - 300 RRSIG IPSECKEY 5 3 300 20141212121212 ( - 20121010101010 516 example.sec. - JzUbP5RijuruLZs7gOepWRrnChCfEGad6nPE - np1kuc5cf1z1FpPDntbxYzgLeyc2sY3PDZ/j - 35OWKuE9zNR/M+uqA29ehZMqegYPcJZYIFD7 - bPOpacCiwnoB2OYa4y8FKhWIrrLMtUKoYHRA - yKuAiduwr/7ndJXLsW348vbyKRc= ) - 300 RRSIG IPSECKEY 5 3 300 20141212121212 ( - 20121010101010 44427 example.sec. - LbM/he+aYiOZUenKh0WA64OJaljec26uvxYf - PS+NCp3Oe01KlRTvl1odasz+BO7hs2qo/IzK - YezdKU6xyxnP20yqxmOaeQ52S7QNCQciKZm+ - YcFfmmrYMMylC8ca4RRzH/lhzM37PSOixCk+ - 3vUI0jfH/tnYpX0pWKTiU0cw1+yGqbY6yf6Z - KEdTVyLR/x84XFkvEHumDMPLfYwDk1qkpNhC - MqmSPqeRUHrui3DXUv2uhOn9McudB655IF0Q - gEbAKFRZW8/ey+rp1YByJKJp0jlbewBBwKf4 - LKTRk+1N0V0QYkObd5zkA0JnjYoLqjit7ckV - wi7HwkcgQzBJ3scTBA== ) - 300 RRSIG IPSECKEY 8 3 300 20141212121212 ( - 20121010101010 48381 example.sec. - WMRM2N9um8rfzVrZDZlZpv4KWRf1unIS/99G - WCyG2RjWGwMSEmOQ3BUaMKGIsd/2qyp8iUf/ - NMLxu4L4KnkCbsh0tIujdfh3Y4NhhTLsI/CQ - CbCJ3PBuAqEsQsBMtbQr6gPAVAqIdQRUGVf2 - PTQWOoQ9iQVdHDoVUDrfWQjhvv9f0gov5VPQ - M74urfDVM4IqSm6VInygAG1i8jNsZBHOLjgQ - Xt1e97mkSbs3ZAqKUcIdDSzwem+HYo8dH9fG - BiciNg1uR3gqis9mJ6mgYcWD1dielZ3113gx - qd+s4+ZTVKEk79MP41RupkCjC7/lVT7mtKWM - +3hnz+R7kkZVwuatFw== ) - 300 NSEC sec-11.example.sec. IPSECKEY RRSIG NSEC - 300 RRSIG NSEC 5 3 300 20141212121212 ( - 20121010101010 516 example.sec. - tW2EHpJUeVBFWDDrFkXykskPkxFOY4BQY4K1 - TKJKN7Q0b+Tkdfy7q7aQSfd1oISzZn0w5crz - 0HGaTJzZKx2iMYK9E6HVH/FysCRge/p5lfpo - +Y31X2ldA1al8TtjVCpXqh2hyJvkP5+gD0a5 - BXhB3s/q0FkdEmM23SfGK4XqPwM= ) - 300 RRSIG NSEC 5 3 300 20141212121212 ( - 20121010101010 44427 example.sec. - 0adnfzBJLo+kwjkPR9xFCAyY0J8EFzHgVYbg - bob4jNAZpKEBpCIWivxlTGzN6gb49eWLefgy - CdujmqzRwUCf2fXESYp4R0hLq8gVPbOF087/ - 4cwajOTeDLGVo9OlQA/MF5hrya4DCDNC/wiB - Mp1jFDDd3rPQIhVRW55UUAUcK67SazvxSSGB - Tnca4Y/q7mXOV224n6E/m6n7drmL17A/rr/3 - fJaMH9b9JOSK65k2eqSCbWBaLFt1uYqGJC4M - 0bs+QWc4oXV2985AsZNqShtGnNKgEJzKDZDq - h0zCspnlt1JgxzpQukXwrS9CbAYYlgRD4BvR - 1i1P6OSSAT6XoJfkew== ) - 300 RRSIG NSEC 8 3 300 20141212121212 ( - 20121010101010 48381 example.sec. - aIbGlRGSMBzpR3ZJDGHbbCjVFVUAoVSUjHLH - Tssbx4zGbRQ+V7agcRsRznYgDxgzuhgiWjOA - rYvjnXDXWGFx0HzWjQ+CbHouuF69eWJdHyUe - RFPzZ/dzKLlo4ucrX1awAf+3DcreTuWe0KcA - 33ptJSJGvYILxwOoKpnVk6iymlVpkw1jPQP6 - Q7hAD5A9W8z7hXn5tu4qknqU9BjwekkIqm8V - 1eoIkGqHogWQs86aFMgeNAHvmklBgSwzcLc+ - NHI96eqzfvqkS03MtdKyldUjq9WiCRlLIBbc - 2Ra5fHN4dEEaYIUCu6tMhUwNQSjgev+a3WU7 - DLivnEX79tIEEyS5bQ== ) + 300 RRSIG NSEC 5 3 300 ( + 20181212121212 20161010101010 516 example.sec. + rljjcD5SsIUxIvEB56UoMLkvV61h2C2x46tD + kGH48cphkaCQgZDxYnuYo0FLtMFy+JOnNJZE + AcGII1+mH1NgQ2hvPW07TY0DVChq5sbZ0uAf + 7jYIpKYC5N4xFM/SkzLtrMWAW8caA71teXq+ + /1ChI0L3V1aFLEGyslcw2nSPAPM= ) + 300 RRSIG NSEC 5 3 300 ( + 20181212121212 20161010101010 44427 example.sec. + s8FLFgQBXexonphsXRr+8gW+BY0WKJZx+qHr + 38fC9AC3bK3dD1w0jRVyKTE1Se2vwRu7FYbV + b1xV3HKuHLtCrgW28UYffKnJLHLeIXgeZlJV + 6YufW6iEPJUhl9db6IHnD0rtJCesu+Mcqxjg + uAIgq1YlWOGmJ3edYFyZzy3cfOGROmag6g2g + 4BlQ6kRtpeQujfl44bPmm30v5FZi+kIH9ba6 + RpXOmdbZAJqer3hoBohmD8JABpfT0PqnJSFf + fAlojw3WnNE44yUxhuMalER+BgK0u5bkwLYO + SvkIEawgYFht1BEG9G0xjI3KOzZZFtZloyaR + uiAa1K+46gGjMmPJWg== ) + 300 RRSIG NSEC 8 3 300 ( + 20181212121212 20161010101010 48381 example.sec. + g6N0eggix11si7ZI6TBgO3Pys7fxrsysAQmX + HK2Yw1kMAAsLe2kwW0ZmefNCrkkNNR0Ln/wc + NfMHBEf5iU8ceXfiF1+3xZdH1U46l4YX1gUD + gKL2TQI1A+xG3DHpHLQknhKqtwfPCKQThxsg + X3NYYfct3GLkdgbaMzLaTa1UHAaPvxSrfSzG + /eWSW6jWLU6VsLXOdNCzR6WTwMev8W1p+YG2 + 7dyRyfFfA3S9hBrXFINnzvglCGWBryVXnXAE + VYFI535zkjT+mSMEATERoRb6hm/XNgzy7Y3l + Fj4bIoZFNebYbCD9HmI6GZCuBBVxOSmhrdfC + fOL3mu1i2cK5U7vFgA== ) + 300 RRSIG NSEC 10 3 300 ( + 20181212121212 20161010101010 1862 example.sec. + QqcY0N+DmPDaREk+KMd6ivo2xBcUsTEiPVJB + gy/7Oq9x3Lzo9NvO2YKF+4HxzGk8GnkEVrmh + WU8jFr2R5wfZmDgBCLMitew+jYU7CkI9vYst + sNmsF4x0KZSVMlIF6NymdSZGW/2QkVzxZjmF + Vgh1cthUGkOl/M2EU0TJmt3GU6bZNw/wW8bh + Mjn2dJnR5MQrFHfoXjbQm/SXdcpl5IAiEK6A + m30OxVFijBINNJzfkHLhpNT6Bza8trKBnP1J + 93hDJz/debKkxxruIMH/409nN8hexlG8Zk4G + J9FWOMnSAvyitWAoKB2ykBa4obLyDaAt2NuQ + iUt4du7WLqn5dSUXMw== ) +sec-00.example.sec. 300 IN IPSECKEY ( 10 0 0 . ) + 300 RRSIG IPSECKEY 5 3 300 ( + 20181212121212 20161010101010 516 example.sec. + MluJokV2J5dK5n5hSqbmf5huLI77QYEnZd82 + 8JmiDlILat+xFkgGrZlKMIvpGJVLWCgU98cV + Z8rO13ZK7gr/ifFmocvgocchTrj+lw4J/aXW + b1IHHPkhGeCJy2etKc5H+cln4PEt8h7to7IH + +XSN4TNaQnQiUcTESdTAhuF3syw= ) + 300 RRSIG IPSECKEY 5 3 300 ( + 20181212121212 20161010101010 44427 example.sec. + dr7alfFGSizXT3Vbm+KM8/gD7GNsmxReRIg0 + zH0QrY9+kq9fKthsKrHhO3SkWmEACZzv23mA + qggE9OpNS7mbOTCP2p3lvNtkbFOTunkYWK4h + /EJqgs4J3QACtsU6h5uR5dALFjtODkegEo2v + aQ5dV7XPfLK9UOG5v/NKamI1rBPwvLoAFLxL + hx2QxLYKfsWjdNvK9YV2Bjw2Tvi9mk4M3EZG + bEsvuRVDeT3M6THyt/1vV2yJBPey98dZqiFi + Jzwrsufe8/PKT1fCGJVepkFqAzCPOYo8giTG + t5rG2R+pfiXwKKTBWZUHt0GOR1JDrh33FR8O + bH5mi/m4wh+6+6/lvg== ) + 300 RRSIG IPSECKEY 8 3 300 ( + 20181212121212 20161010101010 48381 example.sec. + BFyy/6BnJVa4IiTFkxiL9XjLHzEsdBp/vBSe + ozTHysTnxfcqe9n0eQ4r1HCofwUgmnDnA+TO + k0ojN3EK4QY0ksooBVAWSQDXGzhQc+rMeave + 92YyEglaNehWsBzM1wz2IXKS/2fLvA62KW4F + 87TBO6Ic6TZpNjNrKR/QRjKGXaxyLJ/9zD6x + xGWUhGIa5gXoaLx13Zh4VXwCsty6TzNsV7EW + elwSCSZmp0XrVz1+99qJ3Z2JjBCuXVA3uW8g + yy1POb3bBskf/k3imiMmKz1FvXv5DjloUAUp + ERYwByiFOOJXKgpiKoWb7RaAk0+etHrN6t5/ + tOHE/G6Qv4ewdwppvQ== ) + 300 RRSIG IPSECKEY 10 3 300 ( + 20181212121212 20161010101010 1862 example.sec. + Cf/VcD01yZOu6S3flMqW9ORT1v8g1NKIPKJ2 + Cat56avdz9g4HM9grub+K2he2svt68He4GVU + x4Yn6JgHKXHIqD847kwFuOgn+gsUckUK2c8V + vIoq2eQd2dwFfk5VAHtWXMEupBEixbBnbr6t + Jn84/FIxabYBm0ItZTFjjPUO/RlmT4+7sqif + AZl8pUit9cy1hR5tJCc8QGjUQi2m1E7tUhm0 + kd3VlbBJYZ7Gm8ky4vgeyQxxp7vbjvD50uCR + 0GS6O1CJUqdsk6xJW4O7vV5zbMEREZ2twHl3 + 9Xq+nD6A6ZDdtUQQ7WrLrjRHLiD98o8v2LN+ + VG4MJFijTZqOIn8Bqg== ) + 300 NSEC sec-01.example.sec. IPSECKEY RRSIG NSEC + 300 RRSIG NSEC 5 3 300 ( + 20181212121212 20161010101010 516 example.sec. + muTWQdST0SXHIiJGTAvdhxFOHTne1ti82RbM + DqXJynyYEgm5NlnmEZn+U+MyPAkjUdsciukW + UGo2640qt78WTL1G7WuIWS3KmRD3WTFo61gm + DdfMOcxBuyvDl84si6E/sMSjsM/GZJ8Z2BFn + hUZB5RlhNbCeC/9O5rP591a84D4= ) + 300 RRSIG NSEC 5 3 300 ( + 20181212121212 20161010101010 44427 example.sec. + W8RduB+y8pfSQ7343Pqa57PgfUqKMAylt13R + tsTvudxywnxclvafjl65sREgHuq5ujwfOn0N + qTKpmCCmeuUdWoeRLnl9agRdh6INv4u/lTXz + y0xcmJeLhaI27IqjYYcsHmhlOy6w0OaL91Gp + V4dTsr58H+jbxY6Z01NujZvaa3dC1ZjDDYMH + DpyIj1RqNN6gMK+Dfcsh23Ok3LGyQgYw7byo + bMmtOi8T6MZ7/kZ8F+iejAr9MiUGKIBQdNVu + m7IpwWGJmkOQ6T1fDHLRuhrpyZx/PDl9kwxL + XD7+sYke4TAlRiDokIreNR7zwLIqKY69JHx/ + GiX2a5hp9PRlYaQmRA== ) + 300 RRSIG NSEC 8 3 300 ( + 20181212121212 20161010101010 48381 example.sec. + YT2sKENrTnNOOGhnRaVcD3YZAGDf04z7y5P/ + WcitVjRKx3ow9gIpFiI62yLi7ZQ11Hugqreb + HDTY3F5PMuiDK0Fd4F9WkD5M8vJApfVfmrYQ + 2hDPbgzs88fHWtTHvReS3rNRk4RLFdvU/YoX + zzrdpLqZDJah44eQWprr8WctjBk66slNhGgy + T65l032BSi7Qh+fQe3R0IzgqLwxh9WAee2VU + 1nLRkszwzNygcfjE8trdf7pwtyauqZY9zqDj + sKNsFFabP9pYvHi7dfweR/C7cGcbMLFJVSIp + iEit3cMKHoJdU9nOC4AvUCxHXoXcpDByU8RL + x9/BWaVFGbGAZePlZw== ) + 300 RRSIG NSEC 10 3 300 ( + 20181212121212 20161010101010 1862 example.sec. + mHxAhUL2naUhz8gY2u68zZm0JDQAE0Nc8IPN + dlsMHBA8SdSmZ9M3TwWxoB7/EqylOiT8GDRf + QzbYqYgNChWdYc6Sc66czbdB5zPnwcYf4UT2 + YXkunPuTXSxWFAha9W78YeNutHIJwJ4Osuuy + h3pO8UfJc3oSyDM6SeknxH15RzHs/dr1S/VY + NlBByu33hC08VQ49MxJ22I7zQHjCEBcXoB6p + LQ0z7JlDpRJimZyHLx3QIoDXXH58TxSrUPwf + +faL6nMDGQfJGwYWpK6gThg/ZWFWbeUruZeZ + BXjtM4Du9GirSGujpHAG9NAkcBxIvmZ2Y37t + jsSwdr45U50mK6LLoA== ) +jumphost.example.sec. 300 IN SSHFP 2 1 ( + 123456789ABCDEF67890123456789ABCDEF6 + 7890 ) + 300 RRSIG SSHFP 5 3 300 ( + 20181212121212 20161010101010 516 example.sec. + isolD6Ge9KtgMdZMFeR6SD8eu8gie9LMIGjd + 4Hba7ebnUi8d83e9DRfURbOYtZTjPJqmwSrp + I0muhs3KaAmT8Sw5GxDp9dtBRYBexV7dDGvb + wyFqICy3OfhOTORdumW+pxEKfgdAfsNv9VYJ + EZIYm9vfX+qsIANXFH3D++7sNgg= ) + 300 RRSIG SSHFP 5 3 300 ( + 20181212121212 20161010101010 44427 example.sec. + 2D7q1ELbpNl9Ix4KrAizQSFPr7aG7F6OIc/W + D0R10gAjkHZhH+t/JpwvzcDqGkd3590cAWn8 + 9MV+zRkUnR/qj7+POaRb34oBFbYAA8f4mARl + BybDjTWxfbF0VTfMfixM1jz/PbJ0o0I3FBdB + zUx+g2nYmipcs7DYNAoWik5hfzalREH/fBW1 + gQg/BDbn1TvEQC1jVEfQ3YR7VMF/SMm4eoa2 + UcbjaBsDN/Mev/Nokv9+BaH34XBIh/lzSF0X + mX8MAJZEzzwzgrqwYk4Ocp7EBda5pO55Lc6Y + UQxVPNvgsrOpk8JkKlsrt7aD5nPnjWKy602j + aaZizMEvU+hpaUGQoA== ) + 300 RRSIG SSHFP 8 3 300 ( + 20181212121212 20161010101010 48381 example.sec. + k+jHq5IPvjzWCPmDKKfd4VWmE8GuvBcHENDU + bgMAUw9x6Q4630/KDOR/euZWUS65HPALZdqX + PibxJSI6xumkMIUxN2hh2IUrXlyLIVeY+DFg + //Jdwo9kC9NZrIcynxiIXYcEQpFE+ICk3qIZ + 3rp37ysrX7P8OCNYa3zXT7M305iTkRVTG4Br + 313e1OAvM1cWp0fIMo32+UM9yegMMXu2DL4C + +cD65Cd4BJtEu7dF4yUe7B2t78HzqZOxyWGK + wO+XYaSB/rSOuqTNl/0bL6NA89O7DDWCAJoR + mw0N2k+ujDF9gUOFhs9yzAgHbXppC4zocmwQ + imYF2t3Bf0u+RVaKwQ== ) + 300 RRSIG SSHFP 10 3 300 ( + 20181212121212 20161010101010 1862 example.sec. + Zjn8vpwvq7lAfqlM1SR474M+d3xffCkiEXaO + W+AxUEUAJ+yi9uAF6fsA1wpCbKjaIvPbrZgr + kvOczZlBiX0W/3cCL6KhGe7Lsd2YKqGO3TRe + cStF9Ylj/KnFFfXnLPDdODXLQChQEEnLTB86 + Jk+ZtV6psNwOjSCimSSgc2x26i3rR9VxYIf3 + 5s0K9XN/D8NR+T3NJx2ejsBzPoxQeJIb32iC + EaimzXrnSJqLuDSKezP6aqtz2Jrc/Q+E7XeL + 1PJpgG+xBmmIxIf4SijxRTCG2a656lS4hcY8 + yl36lzj6QbwQk/EE35SLuyXRjvbowwhALRK7 + PcNjz9yClFecgRXxbA== ) + 300 NSEC mail.example.sec. SSHFP RRSIG NSEC + 300 RRSIG NSEC 5 3 300 ( + 20181212121212 20161010101010 516 example.sec. + aMan7ISnjzaeoqSZNWc1qqnAHd/Uuw8Viqwq + 2AKYBv2aN8gWkpj5M+61I6RJKXEqoK8PXVMu + tzaROubJXbi1qC1gAo6H4sPqQWdJ2MuJ7G7A + +VBvKz+U4R5P90g3/mqpBjE4+BGHNkAZ+SKE + pZcgPBhzFOsKQlZQ6DWJyJVlG4A= ) + 300 RRSIG NSEC 5 3 300 ( + 20181212121212 20161010101010 44427 example.sec. + jx6Tr9aDQu1NWU+iArkQXSJu/dhsQ/+UuiKU + Q5JF83RlPjiqQhFhlyKtlARN3PepXbxOmzkI + W3T2Jnd9HDfzy5+b4tJgh6vVDDylDu72G3Ij + 7kQErZ0gSQd1FDZSU6LMDDNidUHryWMcQQXT + 9286y9ia/zey4ZawbgmdbC+YYVeKZRBkZNM4 + F9+vuOm8laYrJwj/waUAAuuvtlc9rGOxb+hE + LP4H2PkKVcMbO6jIR6qbXLl87vx7fsqzzPcK + RS7HSDAAZhmFKvvOPVMXfk1GZi0F7jxzoTIt + Gl4B1rvR941G6VxejaqvXmOA+sLs49drSCn4 + lyBW45ylAW/ZW/Uxlg== ) + 300 RRSIG NSEC 8 3 300 ( + 20181212121212 20161010101010 48381 example.sec. + r5wkR1XWQcuQ/bINl2pHKgWDkk64NJZe5N6o + EKODsgCysToooedN1kCkkaCNkjb7u7h9+tBG + YFJmHFv3Gek0PW2ldT80wMSyVn21HVPmpANX + daTkl0EE3NkjnAu7jCC8MZHAUJ1S24dEedGB + PJuDwjTlFBt/B6/dOUCVxDW5+xRbC+w6mF1v + VLsXhzq1VCb/udhbwoqfQXdztDbBNGRdkyBB + tc6F68ceUhRVWqjU2cLBl98wrxD+ZbdIXqyX + qwJJb6YtCy7swYb+8nOfVwZpAwcNkeHptDNB + zEoDFqn5Zl+vCDIgFozwj9Qp8cCioq1jZzlw + vSdWL609KjdlUbN9RQ== ) + 300 RRSIG NSEC 10 3 300 ( + 20181212121212 20161010101010 1862 example.sec. + FQEazIPqzHedFVbV2IVHLqfS538V1bNZr0S9 + h4i+jAnWSz8bhyGPcIwY4kw42wbD6J6sffoK + NlUS9F/DfoIgCpTwPLYRaq+2QD5lyUDA9uFX + 5L7JVgWkZI0dobp33sTelqvxZjcOl7rXO+z0 + MoJVJdAr0J5kPP3nz31+EWFL9g4Wu3h7ueFb + eF0zA0DYqsgD2G5DtycAwz8M2RUZNbi/Io2P + +DvjYLng9eiXJmmQ1HGBC7Vp/9D2OHm73ClM + Xa82lu6onm2ScyO5+0sUuNXCDZf+rVgtr3Ac + AsBUGjkVFgvLxKaRGZZ4ND/tuQZJrVLxwVfn + mwntrMBMVL3khHfldQ== ) +_25._tcp.mail.example.sec. 300 IN NSEC ns1.example.sec. RRSIG NSEC TLSA + 300 RRSIG NSEC 5 5 300 ( + 20181212121212 20161010101010 516 example.sec. + r+qJPmXLdfqfW/lGABbtRauhF1ivwtJYgYnL + JP6Z2UyGcaThmBnGCBh+ZVqsTF5ye6RqvfBc + pVzgLwclRHclZv3gawRptRdKRCC9cVAagAtz + oO+jt4Hz7ZmELS4HVUYd58bHYjHqGK3JCpUW + Rtzc1MzQXMerzT4kcV4te+0sem0= ) + 300 RRSIG NSEC 5 5 300 ( + 20181212121212 20161010101010 44427 example.sec. + FwiVZ84+pSDj4Ai5nM1IMg8FFMV5Rb9GbLP6 + 0oyEVx54dKBlc7aet+L/jLeptXdvf3RoU00i + C89BgPhXYBqi6IBevANrL4HnI0VLD7cKGQw8 + Bh53d5rTXKYlCgvQh5lSLdbTtnUAmhjz8Gbs + xob0zTpVuLfKBLfJdibdX3YD3k+jpyvAPfXq + 5ABOy8UJIerhxTIHvo2iPa/M/b7EtBD2xPje + +4hHq0kR5gdhg+RhNdSTlHE+LTHFy29l1gvQ + m32rYOhv+l9NnnzPbVPcpAp/UXIvZ5sSJuNv + UFk3bQ1bslh2Kb468PqnBd6uoTZXb6zmkpbP + x5BUhkWFBwL/LdvDSw== ) + 300 RRSIG NSEC 8 5 300 ( + 20181212121212 20161010101010 48381 example.sec. + n/Q1maoE9ygqDPu74PBnkZ8te2+yF2Rx099K + GUkf/s/bBD4gYYkzELdpF9+qrHcQlh0dpsDt + qtOAVwaU80VpYJCTrci3sEWZN+suwsfCVan2 + tTj8Q54FCQhbxkqcd9t7YbuyJi4ASVhGQW5n + MUdlop3M2nrvI1FadBWuiMe8RAYziiPsA3sb + X1vJpl49bgguOzp5d81LT3YrVQnIGuRSqZhH + xo+3zkGiBa4oBTf2SGKC1EO7ziul8JVbNmRv + EG5UhYBfQGmJ21a6bBftMOqvSKS1jmKIOivI + dzVJ7w+KyoUQsH6FHaxDHh8mKkKJJmDxXbGy + 3TkgwAq9Lw+qh2IjOQ== ) + 300 RRSIG NSEC 10 5 300 ( + 20181212121212 20161010101010 1862 example.sec. + VNERZktOVwpJwneQu5jisBU3ffMS2MoWqDIt + gtFzswwJA1WFr99WpCE8oKPnVY/QmHSZK3ol + rcl9nTjjbWx4aFO0UVooNR548Hi/G8nQE7s4 + WluaGEMJzmcClTJ1n6JLE0goXb4930Q+Ljmd + /TS0Y5+k0UclxSII0TErC8FllJ/N2uqGIx1a + aev+HYvwWdnr5tkYE+7ieqLeAjN5sU4zkwyW + Cj33djkBkguA9KqqEtVD2SaWBdh1rCRdAt8f + bwKK5bV2sU58wERVBKKupiUWPy8dMUeIAEky + 5cS0vDQIRTF8f+joTiXYjZeLwsbmTVSInTdz + zOjEvwKKAQMtVCVWlQ== ) + 300 TLSA 3 0 0 ( + 30820307308201EFA003020102020123 ) + 300 RRSIG TLSA 5 5 300 ( + 20181212121212 20161010101010 516 example.sec. + EUrc8WLvZmbuSRmymBPExTiotQIGn+zcIX68 + AiUWZKQ0wvltwKM2o6ilQLK8goxcZ5qZOmEb + 6hEivCKoRP0ov4yhJcndCJieQ0saa2+5DOZJ + mf6BTSyRmO65P6lVANTJpi/fSh/Bxt+qFerF + snrmHQSGVjzFBySCg5GhXB/oVP0= ) + 300 RRSIG TLSA 5 5 300 ( + 20181212121212 20161010101010 44427 example.sec. + vVF5lbC0wOSj2ISUul+4ss46jRZ3mmXbf9NY + XEQ+ArA+TThi0031cinFCbSU+4ELgDxRw0YT + T2AwhFCnEHVYxs9RoynIIiVPbnmNVtDKrGc+ + VNjDFcGQ9XikKqw6w1B1dUyRUi+I5rYa/V4C + mnDSrynMAgeZOADFbFI/JWo0p8JkPjsVakTi + RufzRg+S3ViSaAIheUxDggav2h+BbCa4MTbl + 0BIyNDrrGEwLETtDnYu51SQbJgfDam1o576W + eaEmSX3vf1hccFJem5ITVrCj+tWZY6MLGhwm + DfJSt8Umhwg+TWbQm2hXd0AdAbQVSkucY9Fy + TtYfK2gDmtZq6Fs1XQ== ) + 300 RRSIG TLSA 8 5 300 ( + 20181212121212 20161010101010 48381 example.sec. + GTsa2uIy2wS9syW/ErQ5YGemfacsG95datpp + CBeCplKsQw/Vh8oqgZRn2r39NaSroEY6rUMQ + AWtcl/LUeGsKGMAjJ3QLauiWNFXc5kqlptRL + iqlBhNSpMzROXEqpwu6o2C2MF2hFkUEtUnj/ + BZxGKbQmn+a3fA10iy9ADXAHQRXvVaX/V6S/ + yOtuAL53BC+yDGrLKKivSLW2w7y+iOf8yBA8 + Vmolq/p3+M8naHZl8LzmWReRcoBITOUMmIf0 + eq0BJ2ddwEAoneGg+168vCASDbTarXpUihDV + XlS/EWfpnG9eRSEEyFq+pj4pdb3lLNxLRY1G + RWvv8/A3n7H4rhtLMA== ) + 300 RRSIG TLSA 10 5 300 ( + 20181212121212 20161010101010 1862 example.sec. + kdBkuHzOk9CA9UIAvW00ghDCkNTqmpxjqk5E + 16e7RaCrKA3UY0Hi5iXAiBkOhwTyGCWgRuQq + AWgp2KwYnzs5ZuN5YWBqLVied0klCOWeWmAU + mb7IGK1f2veAlTM9db3WLDmSepvmbkdw3F+K + JrrqGn/sGYSj3LtXZ1oggHv/9cZWbHfipwZi + bY1NfA7matOb2aNhO70Jvym72LFtNVbwanlK + sesybPh+dHyRzMAyQLibm7tapJahko1d+KnR + L/O426UvkFEGeu3Gm7xhN+hx3TM+URDfc7zR + oWvs4rod6IZBIi++ZB/LuO+l3zMIntIy6etY + y4ZQr6lSwWqCZQIaFg== ) sec-11.example.sec. 300 IN IPSECKEY ( 10 1 1 192.168.1.11 AQO/C76MVA5WN743YYeE537SLNffRZvQ9yxo QqJP943gqs4QATtnJWHQ1SDWiRE2aXl7SJoy @@ -783,134 +1187,182 @@ br2pQnZ5ul5NCgkhhcr26IPPiZm2eww6ougs ogj6kPdSSQYZYayHzVnl8NFQ9uCwbRTryepP zZP5Vd2t ) - 300 RRSIG IPSECKEY 5 3 300 20141212121212 ( - 20121010101010 516 example.sec. - EnEg1ej/+kvQzICpJiLxQG8cQ9/cIR+6R1oB - aFIPxhIdoqWAvLGjAbZsgxajFsTK3nLrZ4V4 - AknNa72DRIBsQ6CvLK+UHQU4nGnHg4933/zD - OW7CAXg0dEUYUReiKxukUjJcGQvs7zL9tyq/ - 1vk7gGxrNaR5hHurD9kpmwQB9Xs= ) - 300 RRSIG IPSECKEY 5 3 300 20141212121212 ( - 20121010101010 44427 example.sec. - NTVi/tlizek1k2PbjlpU5aPI0U0c+zLsFHsM - Kce2FHauoGuItfoRXRDryYw6hJ1xAdqhh657 - SCsMYCXOfzmU6qsstKpTCMH+cM5TzuVzyIYL - gmiA+y7qq68LVdArrb0ht762RpQZ8RrU/4MI - YJKX4cqvqXvqHtenBXeqtsklZc9fuQCH2OKu - wUxLNoXuv08FVEXGQb5BV3Pp8JjoTD7z/SL+ - qicgqSQkyO+TdUOQjtQIC0yRaUw2evvh46cC - pXc5uXRMukdMU7neSI7MMFoeDYTLip5xas2D - oeecHXrqC3PWGgP8mrnOT7s8ztNZ3BtU42XP - hx+ZYqumRqu6+zVtVw== ) - 300 RRSIG IPSECKEY 8 3 300 20141212121212 ( - 20121010101010 48381 example.sec. - UKuKZlAvsrmOd2k9PdEwz5x3TlVazEmfZEts - iV4z7nhKECj0LFE0YjC9dVWXQrJ451ulpMhO - RPWd1lKpJkx3rPWxphsFrP96cx+MnUOSaCxE - FoeSNHc8ODtXBU8CR2oXQwMAHOABpfE0M7d+ - laGQBtEj/izMuNwSVGNd9TAHv+v/1zARaz6n - 0owOBRoXvszAvKkyEHvV/8LZMJ+aMZLvJmCj - vb0E6Szky2dBgBKO3JEk73Avb6GLtxo1s6WL - s8lYmQxpOlqY4pJi9jqCB5PeNa6BQbRbIyFh - 6nIPgi/QT64MTPRzI12wcvqLDJczgtD23K78 - hBDZRe5WoJHE7bnMbA== ) + 300 RRSIG IPSECKEY 5 3 300 ( + 20181212121212 20161010101010 516 example.sec. + D+MmZHKbVmQCIkTu8SchY0UjsB8y+UtTC50R + Sd/5DekXVogIw+f0QY3PEZXl4cJVBlKS+lRp + tHtS5/244I2N+cRSffdHwhBlZpt9iD7S7CL4 + yhPVw1oRqhSlNv9rPTiXVwiX6HmCeoxQCSD5 + G3vX0k3zSCGGdkqlk0qtO1QT694= ) + 300 RRSIG IPSECKEY 5 3 300 ( + 20181212121212 20161010101010 44427 example.sec. + xyMK4+VtzkwjdR8ikxuZ8WR5UMntcaS9vZ0J + dpMSTk6283PEtwurrITYxkPLNnrQPgp8R9Dt + JHUpU2HSMOgYMeCQ/Kn+0/bI3zAuv6RfPzaO + s5olCS6EYYn1+cCeowLETTiL/OV2zmtuCRx7 + Bbl82788cTEydVlLs+cFT+J4RzWE3f1DW+Gf + Jf1o2TQtQKQSZM+USCfLD+Ze0EHkQZkffWgF + 5RwLxeeI8AaXDDut/ZVQpEXqFvUMTVa5RlMq + QdITIJ3f2xKs0eeeef9xRS3IS6/fD0uEBg1+ + MRBMezzbYl//99R2MZVEOOLQ1XeY1m/akTBF + OIHxzGEjLuhXEhv9ew== ) + 300 RRSIG IPSECKEY 8 3 300 ( + 20181212121212 20161010101010 48381 example.sec. + DuOUhn590KHaanXsaZkjxlGLnconU8B8QlF3 + lmn8GBViqcpegxEMKvqkwIazJDLGsPoDZeaP + eSEFGxC13dLJiAeMpTnzzv24EjRTJS+NamJM + CKHQDSKqgJkOzmiyUOlPfA3vfZLaPZADrXGR + uGFwqPcEH5lkNKfWfr5QT2mjosIZtuAvjnpG + Siz6LnaTLiFffin2iWKXkgcjRCYr0cgTDUvt + 8bWBwxS4RD1yZIJmHx8UwOptUKrBZnPbbqXZ + 3Iqm4NeOzVIKlx19p3MXqUWl5dgPGBr7qUbG + r4y1zmnu0DbVKiCfezgM94Y03Rfff7T7dCga + dwjuEsRStvRKig2DBA== ) + 300 RRSIG IPSECKEY 10 3 300 ( + 20181212121212 20161010101010 1862 example.sec. + DRKBmqio3VJ+jnJ4F45B2Wf1ZXNRMUDKUwfB + ECFhRTBG4fAko58EVJDvNF2j+Hx+MRFjokgm + ZKeKZYleu/jo0SbwZjxsk+LZnUmRte7A8uQ/ + HVNR7CK070H7gYS4TE+F2IyMd9S5z1GH2e2f + VgsMwlA9TSZaqvb3VnvoPNw0IZiwbmw+T6Ie + DvMp6pVC91GRc472mbqmfg01GApuAYvGRvLz + 1tU+g+tOLQZzxjFw7cHkbd20a0eRBGxTSN9j + wmloooDznXy9aiSxBCQ+aYh11hvYMpzoIoMF + 1F2mnT3LT3FFgCnbLH2o0P0MpOYvKj55kdrB + o/fw2K2jN9bINLrhfA== ) 300 NSEC sec-12.example.sec. IPSECKEY RRSIG NSEC - 300 RRSIG NSEC 5 3 300 20141212121212 ( - 20121010101010 516 example.sec. - ehNmR/L+tbSda5bN5mTUfSqUMd/OL66QnwXO - v/m8msSR8bfEs2xVqkrWTVgXkw5C+UBBU+3b - 2hfcsvseeaKxeOSiaS0zNNDTNLmK5AHE7r0l - f4bo2QeCjcWr7BlToPUeqMCKoMNO0dQH374v - VEFH2EKCLM1g+CF7bFhM33//sTQ= ) - 300 RRSIG NSEC 5 3 300 20141212121212 ( - 20121010101010 44427 example.sec. - YuvKjeXvCexLL0JicGPIaKEo1PwTr+oS4p4w - LuqZ0neZosi5dpelpmT0Jn5ZXJNstCS72cRZ - 93DyIdvUNcgf10razoOsPPRnRMAMM0iGRN/7 - JQu53DGHV8xHoRleyddNcre9/XHK/HYGAEbo - w4cFlnzwxTtNLfx1tv3qEVjEIBSLxiZDDj1s - VnfP/YHYhTxSQliakrrnKKKWe6fx4NMptJrp - O6YMXD21vlajzqtt1aA4m8mIAMSNkNRcbTVf - Dw2DJEe31agigtBRFZPICiZrq8YcH69rn5V7 - rOy+InUYTozL8XOUTThiOvAE3gZqAB3J73PN - LSACnFRq1Ntt3mqdNw== ) - 300 RRSIG NSEC 8 3 300 20141212121212 ( - 20121010101010 48381 example.sec. - EJfIAFT8ihSZXxRlLLV/0vJ8S5P3ml/97dNW - Loy2ifAL3+r1qVFIf8ZOGomN6ZF98OK4M1Cu - Rk8TrXbplE4CiQFF7+vWwSes4NtcSMTJTA3Q - V9Ehk/zjiEgrvUl8o6IEbMo6Li9Neo+/SKCw - A+GmSmq8mr1QGbKmPuwgmpSkij6SDN//xuCw - x2AMDppwnKahVYeeA/fn5d2Ja2KhEwoxkM9X - GGVdPBKxdG6r25v5xImows4AWqDiJysBjT9P - XrhA+7IEzh1oujMimZ4nV/f0h7rknxaGgkjr - 9pweheUpI0xb2qGVf9+it36fHSJL7Y7BvFP/ - H72Cci1DGCXAaZ38uQ== ) -mail.example.sec. 300 IN A 2.3.4.5 - 300 RRSIG A 5 3 300 20141212121212 ( - 20121010101010 516 example.sec. - j3or3OPRZZcy93VY/A9mWcZkPxqi/NcPz52a - X5jPjXoHVcpwM6/SbQmnkjv8H3PdfVaWwW7/ - KOD2GOMEudZC/E1LiA09IGDtMR1Sz+7Ythq2 - uGQ3JPlWAmFq7sWegWVSpIDeOKRuJN91/Y5F - olyY0WTYk9LZu5Jhjp1YcD8FoxE= ) - 300 RRSIG A 5 3 300 20141212121212 ( - 20121010101010 44427 example.sec. - brufiALVyphNdDEA4NLWVi9iQUVEB63Af+Ro - 2uig2q22XPTUOBLg1hrNJDUkdczG8vCUBBC6 - ZKiCQ/z6d7cm2gBTrFBZZs+OzRKZjZDY5mfL - wz0JJ6pH9befaznow5RUGOA9qvf6k8Ob0yWM - /JWfN99n0e/RJxBqQeo82tYW23/O/RVinmZx - TmabPHJYybSzlNAd6yBFgzqz/Rm5Qqz03re/ - tghkgALM/H77NoWKzO79l4wChQqPrG5XNV29 - TKQ9+p6tR/9HxR2SPeMHhBCQSR9WHcaZp4Wk - jYXD1Bo8fnz0dka5D+R6nKCuT+TfuUezQmjK - sJKM6/tRBryilBBMRQ== ) - 300 RRSIG A 8 3 300 20141212121212 ( - 20121010101010 48381 example.sec. - AhsXyz+TztaueevZHV3V1YC8kMsz1VisZ8Ja - T4/LtB+ZaJYGgSqT66AovcGivXfhv73lM6cw - Kp1VnlvBhr4f30sPkXuOsC80KSLAvsLp6yCS - QnSMLT6XVCNgZwLc5WPpsOthAOjhNxiNbPz6 - O+odMa/rW/EooC504a83KJkcLvvX1okacSG7 - ljnVqtO1XCFozTi5aImXf3dO7+AzK/6Dl0Wi - Os3bme2jb9gPuyjwtIYbC3ej6IwDYJ0upV6l - G6ibkUWEPTQgoRPa5opBOod3vHd6sEEqr9V2 - 4pRuK9k17NujJrcgmPtI4Vhqmfy2eQmp29TY - dgftgmEdr810yDlAFg== ) - 300 NSEC _25._tcp.mail.example.sec. A RRSIG NSEC - 300 RRSIG NSEC 5 3 300 20141212121212 ( - 20121010101010 516 example.sec. - SFFAGKi+qM26llKMe4ePNYY7lXsqkbP2+pXd - 6jCc1ID9R7QOGQlV9LqO5rsEUkWSXUEUg8hZ - Z2R58go6jHpGIDltduVZ67ltG+jRqQM0VlAs - EGVBkqlF5k9PHVHg0O5OF/6pIi341EvOYodF - CF/9Ywwx+N9K6kquU2M4A1Hz+UU= ) - 300 RRSIG NSEC 5 3 300 20141212121212 ( - 20121010101010 44427 example.sec. - ESaQbBc7BRAfQS0eqqjo8GHZs+D3UuEiah7T - c24iuLvUODcZUCsabvxXReJBaVxX8eATuhdi - chpLnjJKbqDM6/00lmMtnJD989d620L0Zbcn - GhqEzOv/5sqCXZ1cdu3Og3Vm6UsN99xfEDcZ - /FVEjAQqraDo0Lj/pDgmkpHX5gPEHR5l1bal - JO6BWuHRmgr7t0HE6j+Sq3OFRnfGGlOAgMmJ - BYZHOGrHKNgo8d4ToeGKY+Liw2+3+n2iFwQ3 - u99v5E1jycps8gKWavQjfZ915LKkCmPljbSr - SwMU5UBNvw+q/Amu4GafHOpJjMwxnnvIROER - utFLORV0YcNBv2oKKg== ) - 300 RRSIG NSEC 8 3 300 20141212121212 ( - 20121010101010 48381 example.sec. - Cgv9JsUZJziHfWwMWuHkcUgDcNWj5zEZZoDZ - UbHZ5MGb/yRSaq9Ps2NT7yzWbTtKkHx4K/Kr - kzVOWyRshHyHbzzRwmbC7tr6sTKJEsxZCoTd - DtLf+V2xrQECP4oI012Pxcg27l4BnK/Hu2Or - WYoPsZIWKcmd3NfDgBZW1M2/plhex4dIzXR/ - 886+vjAjRCT2Its4ZD6IAexVhJsSQiej2SLm - 0D7O+LAFlAs/NWYV8uwHVGslSb0QzB0Y9Ui9 - O6UtL9ggc9Gz5I9S/mO4pbE+POqBInTk8kju - BsJxi0ZcdxEg4Mg9ZYIFBO5BkeQZ/9c4Oi6k - sg1GY4dE7xU6RB2eSw== ) -sec-02.example.sec. 300 IN IPSECKEY ( 10 0 2 . + 300 RRSIG NSEC 5 3 300 ( + 20181212121212 20161010101010 516 example.sec. + XzqRMTJMJ0oSPYwQt6RIOfScmhcQa0iHfbSs + Ix5TV/c8lPWuMpanbjWUvsMblw/GypZLiIm5 + DjKi2eMDlLNyYNN9DsflkwkPaBbKirWq4vgg + d18bhRwqL3Y96x2ks89aiP39AWrau2yZDzX0 + y5fJiN2jcSc49EWsdwk2i+Gr6y8= ) + 300 RRSIG NSEC 5 3 300 ( + 20181212121212 20161010101010 44427 example.sec. + N0FMEYPy/Za21InzmzSYAp9OnDF9IEhiCXaz + EhGlk3cBFsnuRvXZrtTScoDkUBXuuFncyJMW + Sj+WGg17L5UhsX6rwx/EjQF/XGyI/DOLZKB3 + c4ll4t6QodCo9Iz7kPXmra8qrdZTRPRgRqzV + 6HAk/so2iCidbEaG8gIBfz9YWBRn0VCKG2Wp + yqLqs3IlAdR5mJ3haOPM0JWr0kWywXA9YmWA + fvxXtq46gepNcVJv7/JXr2b3c6LQX4V3+6mc + NhxsDK8KrLZ4KOdgwUWYv0X5mXZ6EE8/rQJe + SVrViDzVWGshK2mS3+VJzbZuPkXaRXfxjkcN + led8XSLpIlzGhzJdTg== ) + 300 RRSIG NSEC 8 3 300 ( + 20181212121212 20161010101010 48381 example.sec. + MR7kag6aIIFa0Cjm2FaQ429gN3BNaXZOSFer + Lfop7SrNbBG1+K4beNuyX8oUUFuxaK/JyQnt + B8gZ3Sd4+X+gRQ53gf4AX3qNCsngR7OjucmU + 71r38xw37B7VaTmGYMR48byanpvlX2RkINoS + utxs2w+O/oKGZsK4VwNrQcQc6ZuvQ5DskIEH + lpKwkZejlg7GuLaosnZCRiHmTxehhl6tP3cu + hq5cal0gObUPDrZDnV/ii8E4o9alh3TWeUoN + 3pvBVlMTOEtjRA4LRw8b2AhDEne/GwNlo96l + dDvcMaUL7K6BBFEkauxvL3L1nqzirLqBUKQk + OeGbPbQtWjtChxhlyQ== ) + 300 RRSIG NSEC 10 3 300 ( + 20181212121212 20161010101010 1862 example.sec. + mzBFRnRJRVITpu2gG5Z88sxCRVtPxJUvII6+ + luYDKgZtmIflXHcpS4CC9zccaGJAuSjuBAgv + mDsbN2Wf9s1sC+T/YFQG53zwom7HSakr/A5P + LfYMgZTlp76W7/Bd+6AzdhV/LQ5lFUBOd4QU + GrTObiRlpTBidCP64780KeJuputoYPx5QOUT + zxaIRht1HYSvpHYv45tCraBK6ab/1bZKrcAO + qVFaKuWeYhgJQ4YNyyAzKke+Acjr3Vu5Uz6n + mMyvoiPx8saiDJZs+aonkrEVONYF1ZW31UtW + gIAbxJvWPwfoh7Dx79v+TEwtH2nEPknuQdso + pV1/AAwEJwMo9ypOlQ== ) +ns1.example.sec. 300 IN A 1.2.3.4 + 300 RRSIG A 5 3 300 ( + 20181212121212 20161010101010 516 example.sec. + VSulhGHN1NV7QH6uzJ55ApxAjZq+6Qn+DvT4 + Y/Kx5c4bw+ZiXErJmJJBmENScT+52Hh3Ki1k + x2O2hoIm7v7LSC/+3jlTjEXmPxV6+Cam3s2U + apmxZN+B6KlssH/1lgc7qzh6yBDfs+IZaakj + tMt+2gUSx3qdajLtXmAnCyiLJLg= ) + 300 RRSIG A 5 3 300 ( + 20181212121212 20161010101010 44427 example.sec. + o47UUbgcUSd9S8zOFs8h3vWTmcuP+cZRD684 + UOEtfOrWNGmX3kQZqB4UznyUxALz9gxRRWzX + zDK3huPkA0WupVEbYJhqx36EqLMEwryoGqE7 + L8upivTohovDeuJRcmz1xq1M+8nSNOr33N9T + yEbpiuN744WsnvGM2K/aja4tkMRImuk6Ed7n + sFMUBK8+SQxmIVMdGe4laJZLOxVKqXAkmIw+ + xs7yDjPs2JWzFD3XFpX5yiQdcGuwFIFbpc1G + kdxcs12H/XHvNoVUvMTf1soJTcvaBzv/UMFy + KnRSuhCk9JwQQmguULZ7jTgiKVSSpZ9+xr6e + xuxUMIuaR45XPUXV7w== ) + 300 RRSIG A 8 3 300 ( + 20181212121212 20161010101010 48381 example.sec. + Ce86aefdf0aMdoDxrkoP3cpUTeZRR6us25Vi + 6T/ShoY5st8+0z/gkjraK0/7huNZMkvixVeZ + rnsi+g2z1Kvlu9wjodDfiVWUymjrFdNtqscG + tsqNfBRnH3Hrzr9ul7txWZFlcnrLSKm5wtNK + XJZ5ChH02rFvIgOpyJGj/msvh50j1xmXENrq + xLevWMy9dQjqi/iJ2K0dQQCL6w9iKW/ixxh2 + Js7F9zYkWYoPp8A+UhrAZep8Q7jE88iymyko + EAKIbb7+/+QENqJw7WDx+fZ7eBJkvLNwisU7 + SwPT1vYRgDR4eHzRJGPEWWEIGCsRCj3PqOW0 + no3CMvdnYisET4I6TQ== ) + 300 RRSIG A 10 3 300 ( + 20181212121212 20161010101010 1862 example.sec. + XFdqOX0w3WgayGkDBihXDKD1zhCBVOeaW3yV + J5YJS2mJNgbGUY3QXz7OwSeQs8cD9cHxget1 + oIMR+op3H8VY6h3AzJP2EUNWw7Tuyh9wpdpU + NRAkRA3vsfT6eBccQIbTWSYFIypdDufT6PHA + hMJNvzSa7ljRPTuGiTZCersfvJ0cObNE5R55 + Y1qNNcmoFPysCHzZE7sdxmU1AO4IlhuXMA8A + /LCXGFiMb5MKzm/qlrukTnUn39t62yEkisuA + 9P0jMD5fWey7KyZVS1K2dKqJdfuhF0eUUf7D + 5i5wi0s1eOCZGRV7BU24Up91DkMUHCyWQ2y8 + LoXhow/oMgADtWMk3w== ) + 300 NSEC ns2.example.sec. A RRSIG NSEC + 300 RRSIG NSEC 5 3 300 ( + 20181212121212 20161010101010 516 example.sec. + kVV6hLZf14IQaAISR/uaacBi1VBjKH46BsYG + E9AoKqcBO7Kxu+KEj95yBdea08vzko36kOP/ + uWZ9cMXjXCigMojjqFWkv1RhJdMVkQ/IgDPx + MCDiHrA+LI4z2YexyDuW/dnDacDDBS8Zv0XG + gwMu5+86R/lPpBbC2KIfPXWZbnA= ) + 300 RRSIG NSEC 5 3 300 ( + 20181212121212 20161010101010 44427 example.sec. + VoYzCDJPSLHtbuhrKoX+po/RHHYU2oYly+pp + xhL4M3SNRxD7JZ9+dY/irqcGLheiMREuRjA3 + rCGp2NbPtLjmMfZkARzhoOTtYNri+p0ka53v + a73X8T1xYAOW588ziWLLruqKa4Mdi+Ru+9e3 + aNW6AzQC/MGhiP/Wjd1j9ZeGbzyIPq7rFXgI + 7keT6XhRkdsGI0jMZmm6YWPRqwJXr0I809Wj + GMdVfl3+Z5FHaMQyEXE2LN6pZnUY4817GfLY + dAynL077dRtcUOjG7MU9tQx57rx6aNw9I/Qd + SjWg5DGWcqAD6hVZB7OutY07HbODFwW2YBKK + SD4pO6+t3OUyTimNKw== ) + 300 RRSIG NSEC 8 3 300 ( + 20181212121212 20161010101010 48381 example.sec. + MuiOyDyiepK/LcssFA8yXDEeBQiw+O+45C5J + Jzae7DMDqkW/LtZR8BBrKmbp9H0rTs32Bnx+ + CD+UKc9IW4q7N6ReWp9/LAEK44SgYa7PEnkm + YGWBZqPeWqmzp2UTVipD2n9w87iFXu0lB6Iq + 7/nuBd76WBBXULjMq7HppkDyITEo1LowffkS + le/rNacTQYmoGjIhjZG6aCIbHSVdzsxT7Keh + apXowiGAJST7zzL05055Vfw0VaPx2XyPacGV + xlTwZD6og/fH0dphUIPy2Bsad+Im/ce1rmQ+ + H3XeUqzVIOWpYJqNzEcythfxfcfDTdPg35Hq + Fxo5vKGXe2FteolkQQ== ) + 300 RRSIG NSEC 10 3 300 ( + 20181212121212 20161010101010 1862 example.sec. + Sga51xsZS7XpV6Qgm6bL8HY7xsplIOwKyw6W + VTFtZk86lIysiGEOCPkZWJ9kkc6QpytyM/Lp + hUfSKU1Swto+laEKt4zGadVFALDb03XL3Mdc + RB3qrmZLIDv+8ox8mTrscv/mTjt1PPYS8/gn + IwMtuJkFb819ntuIgPoD3WL8ttCCIJkq2KHU + +Tv77wOGGoos5OUKtzXw07t3aQwbcNRkYJjr + 91YZqRxLL67FSBXKhTRZmpmvC3Mp848en07A + 4vgvij0JJ1YL8Zp3aIc24dyf/CZ8HzwzTQuF + he33AXb6xjgmADby130rM66bO1dSDo+/2GRU + 6p+CttcRRbjk2GParQ== ) +sec-01.example.sec. 300 IN IPSECKEY ( 10 0 1 . AQO/C76MVA5WN743YYeE537SLNffRZvQ9yxo QqJP943gqs4QATtnJWHQ1SDWiRE2aXl7SJoy JAu7jaUTGKWXzStD2wpkBIJ1IZ+avxf8zxRt @@ -922,295 +1374,270 @@ br2pQnZ5ul5NCgkhhcr26IPPiZm2eww6ougs ogj6kPdSSQYZYayHzVnl8NFQ9uCwbRTryepP zZP5Vd2t ) - 300 RRSIG IPSECKEY 5 3 300 20141212121212 ( - 20121010101010 516 example.sec. - srEElTd1pqezDk4QXaxCDonm3SDN2vSLfSV2 - 51LzIcLuWaAP8uLydQfk5j/EclOLq1RRpcNS - QqGpH6pibLFEP17dzqBbPj/lpu3FC62u9mLE - 3WIQm1rb//yX623M2pLmMLnXLdbXiDISwX/N - 27brQ8xtg09uLo9NbIYX9CtA6+I= ) - 300 RRSIG IPSECKEY 5 3 300 20141212121212 ( - 20121010101010 44427 example.sec. - SR/yF8wfPQwjqtzJF+XmZ+06sUz7drIUyCcJ - 03iBBq65kMEMlglSf8qVboaCY2H7X0E3cNfs - Jioc0uxmRbhMZrChMrPY4PR5eKQ+BP4GENLp - SnBUAWeBGmPhfK0vwXuj9Pp6AgHrCZcgYxM7 - AtZemWm07+BqiWwQWM1e9hy4BMjH8yCyTCAq - a1y7KtYXWcAvs6YRgrI8GPMwDtI4E1JDBUR6 - VN3aSFFfSXLGSO/Xt1ogVWeAMIifzm8at7xh - OmHkkOJmw58lMRceaKH4DiNwgMe3Wn7d0wgO - BHhh1awLYLXibzHDeH2WbfK83lMbPRPs6Ajh - EJigKAIYWDGebUi7mQ== ) - 300 RRSIG IPSECKEY 8 3 300 20141212121212 ( - 20121010101010 48381 example.sec. - TWykLOTIRHVZaU/h4nnrfHWBE11dbknXM5Jj - LWtXv1Eb6Z6r+b31uQCJDItjr+t6PotEDx3U - c5yNnD1L+4REoWsTxdGj1J6rS+QE7h25kyBn - FBD2y8X/c8NjqJy3zfYw7LOALrC11IaI03iH - SpS4P62+B9mQa/QG7WFc0N9Bjr7QrcW9QI3r - AGiu33yQ3BGx3sBXFFiGRxq+N4hGHx/LpUJU - DW85qFE7Omq2Zd7kaLUkuo45fiwV9P/54G3e - MvwHOmTjucJOZraKKoNibsyX0KtC9WROTgnf - OwaWBFjR3xILtHOphvgjcDDU8Jj4Cbgo9Br8 - USMYDy2MWtYapSuAuw== ) - 300 NSEC sec-10.example.sec. IPSECKEY RRSIG NSEC - 300 RRSIG NSEC 5 3 300 20141212121212 ( - 20121010101010 516 example.sec. - s1KV6YbHSHFljDxAM+N0yWIbqBc3bV2nBEEw - c7i3dLQgVALjyqItuthZNgI5AB8lBgcFstNR - uM1+Lp8lS02lv0lQRu5fXzaeieg8l7LM4Cdj - uRLhqdVZEzYuiCS4ZojnRjwzDTigF5ckXbMa - g3Z1/x/WFcGhlBhwktrOVJXaJpQ= ) - 300 RRSIG NSEC 5 3 300 20141212121212 ( - 20121010101010 44427 example.sec. - HD0pNArh0/sVcgLhfaJagHVPJ8+v7HMwmwE0 - KrzvDBrRBKmcQOfZ1KK7JaJfv6lHdkHYizxm - gkJFcSj0b+gHNZGi1S9la8M0967noVZoZjjX - rY1F+VcxTq5LUu+IQVyMoY6hd8twvNK5LSPN - zt51UKm9BB8yNrKwOQi0fYz0M4dYC3x/5Mij - QiBMZrdUj7DjNP/mYpse3TOMip8ISKeEFEZe - 7m6g01mjc3yPlsl+yNyRRdwXTv3HExGo0pGL - JRio9dt600BP23yI4d/QPiLPOAiQ8lpNMrVu - MsVqS/clsOg4fJMLLie2lqmGPjnJCkx9CUbS - AFaOKXHgPwfRWj3vNA== ) - 300 RRSIG NSEC 8 3 300 20141212121212 ( - 20121010101010 48381 example.sec. - ZOjgqUmmAgf+Q2dCVvoEhEGMOpQ6BYV9NkQg - kJTY/b7sk3lolOH4D2sPNeJPXEn9IwWx2HVH - 5ou9paYj9Bn3CffUPaEDBh5eX+1wiQKiv8SN - FTVOYFds38i85PplVu8liY05P9eic8kXNoC5 - clK3c8wWKZNtcewhJn+bH1YvSbJ+4qWgzSXi - NSKXo+wFElkh+IJDLJXjxPe4f0tKPGA55j0Q - 1/uTGoOW/1Igeb4zm2q3fLtsxn4bNwDdVbG6 - /mQRjNm8X280bzzaIofdF00nXxpigOHwFLll - Fh3OcZ/73IQlGUB/ZNljzjjI47aWWMilcEcZ - 1JfN6sYJMPWWLiFoxw== ) + 300 RRSIG IPSECKEY 5 3 300 ( + 20181212121212 20161010101010 516 example.sec. + tG9BDXttAhq/pvqvAtAnsUin46/z66T9yHLH + Pt3gzwnIa+r3F5hqGxqmWEhelWUUxvwGJcQh + NDscQmWvIY9acwKF58d+2sY4JUOj/wR1ZSWD + 9oYSMe1Jnt5smGcbVEEwvc+oyQ2POVYRO9wL + KKaodgZ8W5BGgyk4IHYqS6Fp7YI= ) + 300 RRSIG IPSECKEY 5 3 300 ( + 20181212121212 20161010101010 44427 example.sec. + E810x3vA/rvBht30WgCi7oBxxN6hPlJn8dKY + uy1jAC9vl2W3J5A8UhIt89sff8kTGCd3dN9L + yrx4PEzRNRKxbCXXF/ZCZdGiG8aA4BiLUTPw + tgtDzuqx2RAm6hxRlYw8iERDn5h9tdA625CR + 9cnROxhjx3x5F/Y9hcJf4mz4jMKti486DMQB + uKENyFFBbSx78ZUtFy0Zo17MXV0xM5GsMSgP + gcS3IRgiY72OR43eQ9HXpexGmt3mnQt5xQ6+ + QWELLmWNkKcOTZamkeMPnQmwVdh+NGJVLStM + xQJflq606f0e1YMj7FMGJnIG5yJZwrT2jrQD + 2N8DcDc9H8/wci8sZA== ) + 300 RRSIG IPSECKEY 8 3 300 ( + 20181212121212 20161010101010 48381 example.sec. + MRFDvSNaBDN0uXJHShWHAoe3163OlwKjh5Vv + bHPOGmMqChzJT56E2YN1LLNHNOCCePWUqWzI + 8KUpSEzHPn0T2v3NoX2D59ZpHWBY1S2CFqxE + nQf/qEh34C1N0ue9sDlj9lH0ze2+S5rKbI35 + UVjcO94kGKpEcBDPfRDEBcfgoni0qrE0FuFG + S0ycAv87e3wkWeF6ISkeuHph6hSyrtol59z+ + KdlMTNY3vRvAQPv6oBdmb2Ri6RgINkb6s5ze + gCR640JglKzjPDyysJkTOeAUK9TZzNuvlXVu + btZkqqSdKpug1ik5WfpQWI1u9RIeSYFu/+ai + usucxtivAa/mE1lsdQ== ) + 300 RRSIG IPSECKEY 10 3 300 ( + 20181212121212 20161010101010 1862 example.sec. + iydE1zSvkIyU3ogg44zbiyv8aMcs/o1peWKT + 49o38rb1cg5w1dU6Y6SuyHmGI7LThohOhZbI + gNewSLV1SOa+40a1sEeKuwyMdqDKMgTicH42 + t4P0FKdZIJmMtwbRqV4zW1uB+6FiGQbYwyAE + AWMKIbo6MGxKO9kXfYCpjewS3yIhI02WL0V4 + lUsw+rupSUbDfhykghy14qBlF4EUCUfIcwZ0 + ROm2V6oEF3f8dNYcuSDovgF93qCamn7q0MXe + U3lsmz1B3CspT1anuezpvR/kXIXJVpXSi2Ox + U35K404MZkLzl7wZNaGR1pwkW2oTsWqPJSQs + 79ph+sMC8vi9c+xguw== ) + 300 NSEC sec-02.example.sec. IPSECKEY RRSIG NSEC + 300 RRSIG NSEC 5 3 300 ( + 20181212121212 20161010101010 516 example.sec. + YCt3Cz/LoltgpW8xGEYNTIH1tHzuE3BWX057 + gEex4Ymi1vVQacfBYMaiDZWg9VeVonQ9kVNP + 0q2cpWCIbbwu5FhLqiDQhBE/eQg8eDlY0Gwk + CCSZqont4U94Q0NkuL8P2cVH6KMkTyifYa8I + 9/YYV8y3QbZvFVWyv0kvOXuUqP8= ) + 300 RRSIG NSEC 5 3 300 ( + 20181212121212 20161010101010 44427 example.sec. + UwuuJi4OO24/1H1+Tve5xkBiisXsvk8rnPac + 34/Wpx01PXiKKfSmkCUX7tREYQDqHeMbgNQF + OQYIjeLNPVEEKwrAzu6115+H2FKCk8DDnxRr + OOAVAQXflDXtZ7op7I7BwvAMsxA0N1r4e/lm + tpeStt8Ky4QVICZs/XJ/zqnMwoOa/QJwY/nG + Kfs+V5VbuZqQQDBEVLq73l1Zb1r8G/Wj+SNb + /d/WBDd8rf+u71OFZKlJgqSd73Q9fQyYtZea + cKiGtOpzkh1WT0SnATNhE8TEDDzN+K9ymoSW + 8/gggv+W6L8/cvvfFYkAvKhGgdhuzJS2SE6n + p16Gl/Yp7jQnmVgnoQ== ) + 300 RRSIG NSEC 8 3 300 ( + 20181212121212 20161010101010 48381 example.sec. + Yd9ttghL3MV3+45CbmglhbEDp9n1qH3lfLs2 + HKoNzSCh0AGHFwnNbdAjn0l99dk70v0aYZ7k + RVQkYVXqHkHVvQdqYs9FRtIXct4e9bHP2ZKB + xAAoRSgKpAiwjhr0MX/nq8j7UacsNB6ndU5R + wpAy9LVHJi260ofvyAumJazCYA3z/a1N+sTv + O2Wzgkm/qSlx8AKrnTdbOcTnD3Vq/bpRoY0w + RFcs4N3qdkILyTBK6X2I5eh8twHouBoeATWX + nIs+I3LGvp+H0gAntT2OQGqeMaDQwYaRjBJJ + akwoyc6dRN7rhD5Kp8Kpwm/HOJ+I0nW9UZH2 + jwrE5q3ghaCkAS24Gg== ) + 300 RRSIG NSEC 10 3 300 ( + 20181212121212 20161010101010 1862 example.sec. + hPq+o9oKOcu4lXZqKZljb5vqEgyXceKdZhSA + Cb9iTH9gQOAdl3xPLMebiiugPaQ9loJgZ7dl + 115RFqpykpbM62aMs4gL8qB5HXzeoT4tmxyC + HHJMiIGfBBAvUcbTUXqC4P50NiFaC7dmmW+E + ntAZDbBn6QcsH2La7pPgtoqTA3vANDzvxDfa + OSwqXKaTvaYuuMo5I8ITuwygymWup0DtE3PV + fc/c7K0vxWFFKV3uss3WV9f1kTD5AzSqh/Q+ + rxYyixdPi2LlLmZ4K/7NRBy0KLKxXGQZaBkl + rWF0rTpwnJYh2pnfhKJN0RuPBQxUEuMqg2Ul + VN8KhJEgxPg+2PzL6g== ) sec-20.example.sec. 300 IN IPSECKEY ( 10 2 0 2001:2010:1::20 ) - 300 RRSIG IPSECKEY 5 3 300 20141212121212 ( - 20121010101010 516 example.sec. - qJHEWMPK9AnL64sEGYj2CNF10HQWeTFdV4IU - hU6O1/z9U4PVOIKmJNE71avxoKOSRBIfAB1f - yR6BK3HBHcqsIB0GpGlsau9NQHHCYYDdypFX - KlkgH0GR/vEnhTlkEO1KPK06fpx6C68Gr0dL - 4B+vf+S0I6KbXnP10Cj6u0mO63I= ) - 300 RRSIG IPSECKEY 5 3 300 20141212121212 ( - 20121010101010 44427 example.sec. - t6PoSUCO18D6svanlBKJhl811aei9SkFRuND - RM+DV7hvdeWLIY7/qgZnlxIRD6m/Rzta41Is - 3H8NFLXkIUrB+V/CpXMMN8PWiSgrsoh6Ovb0 - K5EWOiEjZbh9TxMhgQzDBwwU7M7wXnUssWWY - IVpWiEKvqGqKj9SCdV+Guig3SSt6yR16kRJL - +63OJW59tA4/TSdyywTVfu3abQzZe1akZz7y - cRkgwb204NAJCSLnU0AG9Ss5ic5Zzc3+ps6a - Q4dv/7a1YLnvzTWf/WxeWy3V+naEVS9SOG83 - 3qqydc5VVI9dTM7dgUm+Gv0cf3JM+JXehYGK - OkQUj5A0OQYk9XizTA== ) - 300 RRSIG IPSECKEY 8 3 300 20141212121212 ( - 20121010101010 48381 example.sec. - Ts3gkpxjiQ4DT0TxAPaYjCWfVyVg5a2QErWP - YAd+8go4QDLmMz2hzg+ANapHzuht6LRNaaTU - gQlhbT5xKrgBSwcu6WRyWx5YHrR1FaMoH8DN - eq8xpzm+81A6TVpMWfzWYBd5YY2itftkiinq - ke+QFp8rRtnN9ORY5G6jn0FOIzV5fHBiaxg/ - oSVbR/Da2OP3XZlDxpzrijXJOCOkn8ROw1MM - o8o7V1XH0HpU9sFrT+gb8wp3fg02IgfBKxLW - WM7ytoZ8comdKy5HA5WzypVY7rRx49H0fVWb - 3Lokqe1tubWBQeeJBVytDIgKMwyOETX2kAW3 - SG2JJuT1qGSN5UAtog== ) + 300 RRSIG IPSECKEY 5 3 300 ( + 20181212121212 20161010101010 516 example.sec. + tjylwqmHqeA8Fd9Pfs73MTlpWZRfE0n+WYQP + Otr35nqTntkGdy09rAj5Brx1tEWn8DsMDu/h + iyLnbOePqYBXhFaCoBNVxR3/IgoTx8iz+exK + 8a+RFzJN8JTtZ2F66Bw4NKuywy3wQrUECUDm + aSdd48ut7s3venVkYsqWeOUv8YQ= ) + 300 RRSIG IPSECKEY 5 3 300 ( + 20181212121212 20161010101010 44427 example.sec. + 0zgPGp2mHOVlSqV1eSy1kMr634A/DktQ2O7j + 9rwhC8yYq/hfNvyEd/+q3j+femQ9r4KDFucT + xDalycVnQ1SVIaF398skn3YcJbUvezIvlG96 + +8hsTomnwvBul6dWQoTfeYcTjPch63XOQAz9 + lkrenfVdqrR/tD8sEe5fj8NysSPPGZYepXOm + lqTHzMRRLkecFKDIgcIGiMbaZID143t9ywek + Y7sBRR2e8V57MiKwA1n4K3cssYy8n4g3QoYs + scBGpKKYJLAoj8wSfMXxq8ne0vfWOrwkI2WD + TkyMpgyI0k0ZW2nwQa+VvSKu7VFDF+O3oKEd + 8nNAPLkm74o5Xz21bQ== ) + 300 RRSIG IPSECKEY 8 3 300 ( + 20181212121212 20161010101010 48381 example.sec. + Ggsal8D0dAgBvqf8i510LVt4FrWzK99/tf1E + IwJ1zFPGl5vdkDDUkBCDizhJ7suar1wKBae/ + 3okQQaS9oYy13BdikijxyyFiL9I3fiZ4YH50 + x/ZIDju8whbNxrExYV/xig4MrrkWLcVDBuKt + N7ZKYBpD9d1CigZ37YtRzWXL6XdRrPTkDEGp + Os4At1yjCsRisbpA35xGCHuy1Pznu7wyIe++ + +I9a2j/hJFTOsfeeTnRpNfWzQ2d7PMLglwDf + IXpmxsKQKwLgJAgCOZZgLzxUldAZuGIb5/dC + KzCcJVNai7IKpn32dOrRT/oTFXPlZBKzA7we + H3cXS39r/CtwAksnDg== ) + 300 RRSIG IPSECKEY 10 3 300 ( + 20181212121212 20161010101010 1862 example.sec. + eGibxPy14OhN6qywILDF6U2ZX0Nn6+LyxMgZ + E+GUTElgKZVj5MW4Fv/Sc9labsVFPh2jHbbM + vShcRFDeN9s2krI2xCUfwftmR3hYXnRoNCN3 + lr+ug75ePSXW7K7uo8JTyCc8IgpdrOMgQVMH + s9ap9WddvB6wcXUnSWr9PYmmtAkYGvs9VbpZ + 84lyxtXpXz/NahrToVmip7xjARVZydq+vTfh + WwZJz0NhaJKJdRUDA1kSRF99aqJqnLd21LTe + cLmCMEqtpXx17bxMXlaBUb3B7rq/BKJg4czn + UKvF78/9rEysIUpju7LxxmLSl6q8dd0dX6R4 + mHx+wJiNYMEz2tZ/PA== ) 300 NSEC sec-21.example.sec. IPSECKEY RRSIG NSEC - 300 RRSIG NSEC 5 3 300 20141212121212 ( - 20121010101010 516 example.sec. - oj0HO+ZcjJeWeNJkf4R9kYx570wwEW9BKOJj - Pf7lSydkpCusVfIlS69BBoBDEVKClw0Aofq0 - h0KEQclUX7gj5rR0lWHJISHAA/70a2DJqRvB - W3ItQ7RLen1q8zMGs7LyfNXPjrQjdrwZ80Zv - s+tDaKtZVOUMG8XIIv8thbWarWQ= ) - 300 RRSIG NSEC 5 3 300 20141212121212 ( - 20121010101010 44427 example.sec. - KJmUYgivZf5BE9CmPLcNAIfqRCkKhNbtUTuP - vnc7hgEK/ifUBwGSUIlvwg72UuTZcd2TSykZ - MUFfhWbBqcR4ejzye1IQaYEiNPW342zLnsaw - rqzYENZOMkXSAV2fJo9NrNfh9tTqijtKKqy1 - 5fEhpz4mxecFakCmnWnqXPfsCujQ9a5qvbeg - kUrBeto33SH5SG6SEnLqXlHNDc8VLLhETFzZ - Ym9LFz5m9zcd5hlETjou6xCFhoXSxg/vfqQd - joJmc7/YDGjaA+v2C6xIfPMgDke2BchoYN5V - 3ylTQP96cuPb9OdgvgdS5VVnXhHjoxRCWjHg - 7fjWU6QgASdP+1GkPw== ) - 300 RRSIG NSEC 8 3 300 20141212121212 ( - 20121010101010 48381 example.sec. - ZxY4LUFxLnczFLHPP805TWHIkwE8PREHMEBf - OAXV/F3LN5LRoG+m43ze+SelcuUkOa8JZWhO - 5SYdLyV8yzpchrmX/+/uKfX0cS8meg7DwOpv - s1vrfIxGhGGHagF/aSAlJx/chpTaS2iRLaUX - AMasPRKnFaF5Hyi6mCjbA55wMn53l2xT/KEs - dOqXqNr+oSE2BW1cnJv233K/J9kpS9mMeETV - T6KfgEUMhyYH6lbGFmplhUxFlS/7eSWh05SF - W7OMJv8oKMTZSp4EDqdEr/tc5dRwlV4RJk5C - IGf6Gmk/SCkLrLzouLOBQGks9J31Ci7wE4ja - mlcQ4CHD4osm+MCRDg== ) -_25._tcp.mail.example.sec. 300 IN NSEC ns1.example.sec. RRSIG NSEC TLSA - 300 RRSIG NSEC 5 5 300 20141212121212 ( - 20121010101010 516 example.sec. - GZUj441s800Vb4C0mUVvQfuEtkn6fhZ8+78Z - O+nVsn/EcKBhJ3+qLomFDopFGIedDMDN0bfw - 0DLFkZGlMJlYIOxhBDEmonbmmiFNiuotzlI7 - 7bBBWc881/qgSVVVP5BkZkZzCOgn/Er41aiO - AZOXRlgIeGYjZ9OZKIMqtPnVTbY= ) - 300 RRSIG NSEC 5 5 300 20141212121212 ( - 20121010101010 44427 example.sec. - T2KQtM2CUU8g1ylwdjMsIx7e2WI/j2qA/45o - DMDnSlqGNpFMFgn4l4/5wJQALE+cskBFPx2w - UTZC4W3qXBhrF/QJSW56HU0gYEq/bA7Yw3Bw - T6ClJho2693XTBZDwu3j/BP21LExqNK0nQZ9 - z074CiXUm1pTimc3K8wmrEBNT5G3dKOztd21 - ktretO7gOFDkLLCHpvweWox6zpsUdMXqC5vV - 0g4ibDzNOej28As13dtLc+7qrOphmIRYi0Gj - +4WsCtiT48ybKfM9Xq4UsspxQg8fE3ztGfJy - aKeIpW3GHehgu3Ja78udKUpGHKl9cIN8qL+8 - x5g1nx8TjwrCSp38jQ== ) - 300 RRSIG NSEC 8 5 300 20141212121212 ( - 20121010101010 48381 example.sec. - zK9ePGE0f6NcsUsrRWA73otHTWfD8uzY0yBY - vlmYoQtbc5FtnHLUYb6I4xoqYL3C2ILbpvcC - pUQxZ5daykW8mHd1iJXEsnPogqr0WBDyGOQf - ad44CCcNiJ1C0Wtk3Mn44Qe4rQE7zpZ42+MM - 1kBTMFF+dZ/1Ud+QbK9u1gAVagsutJZ2CmmE - s+heNr2TEaED+FpUUbNdCw/Fd9Mk+I3OWFVG - xrMr8Uh9g9W+d4iCVqgQ/iohGIwNBMTEsePe - +odNGQBDgl9GTv2PpgMXETtcy5wDkTwan2/j - 1DOqYiOdu4BPieVwPTfRWC1VrqI0XzQp91nV - DoWdbSntdVtQBt9yWg== ) - 300 TLSA 3 0 0 ( - 30820307308201EFA003020102020123 ) - 300 RRSIG TLSA 5 5 300 20141212121212 ( - 20121010101010 516 example.sec. - onpENNKVruacKg+VOesbEGIffNGUJlOyPqyI - gZ1F4A/qLhyYCMqnkNOQSOYXDeYTCqB/UCn7 - OzJIObaOmm5osmxlHlIALUzP2LQSnRr6qt1z - aipTHTzmVAefB39lBgSXmsEI1xvJ9/6tnwUM - EBz4oYroKxKkJjAGt/I24WOoSjg= ) - 300 RRSIG TLSA 5 5 300 20141212121212 ( - 20121010101010 44427 example.sec. - kZKszgG8KVjZNdhfWIITRr0Z7Q20RPTNrrBZ - b3Q1WXdRxAXK3w9UAcOmb7Yg6m+1y1arrmDQ - 1MuestqGpHmJntvH4rnEtz8F4BsdxX8q2Cr0 - fZ4ZzGNuH7F//0jkeSlNFPLZN9uHgQxQ0vaj - flGcgB0r3B36DomI6uj2vMGN0f8CS53o04+B - tJaqdbmR8BrRDP1KIWe968tq01yhPtrZqtYe - +WXy9bJv76fb6N0s4Ak6RZ9vH0vjik+BsblL - YIF8A1MV5kSDMzCqU4eoUvxHhc87XCUa/aC+ - sxA11oyPhMJhY8mZeqZ2xJ84myPSiNGSEEhq - OIsDfIdbQFHOCB4Qmg== ) - 300 RRSIG TLSA 8 5 300 20141212121212 ( - 20121010101010 48381 example.sec. - IH5582QvSgX9COm/HqiI1bUu8XNew1RMdjXE - leb05YrZIZ+eqoGbHOg41eCAjy830wu7qoXw - yXoXDDGt3bYxYAgKAGIQryYT0rNXDOuSeZam - /SFkd5EQmslbouQD1SMAQQ6ok331lgkIuUMq - vbWxUv3gl38c65dEeP/hqsSgvN6U6INDuzeR - tLLt5uvwC8XPBGI8O/0h39+x1GIaNpcR0mbq - Gvw9arZtvQmaGwu7TQyKyctyXNWhWUNEL+1R - TcIwbCxUbPQswgH8OZrazjs82WuPgSkdk8Vr - bfQNXl+4ZZWp35Ah3zxCeRbrt0RspF2Vh1tN - KhhMBu46kqIpDunK6Q== ) -public.example.sec. 300 IN HINFO "i386" "FreeBSD" - 300 RRSIG HINFO 5 3 300 20141212121212 ( - 20121010101010 516 example.sec. - uEfwWvVJN3COlaXZ4oM6PRnyLApSeLFyJOKf - 9t1+Ds9dTTWg/6THtVRLYwMwd6MJduAKXNFS - W8NgAv4el2gboXSGZSRFGkKDjZU/S6nLopvI - MkCeYYQuN9w3/bvR/xHB8UJcaPopzFl4t+IG - EKmKnFq6GEJOuq88Vr7VhRXxOpY= ) - 300 RRSIG HINFO 5 3 300 20141212121212 ( - 20121010101010 44427 example.sec. - p1RR/HJNu5mNCIDPE0JaJz8V6PgR3IGBF3mI - aq/FuMlFVEuJ/CQnk6lzpRjI35WAtZpfYUl/ - Vdj6WvTetDa49imIAn7zdM9pQ0LU1sZHKQ5z - m2JdU/r/fmK8QExPYCLhPEMPDTGqOFRrz6up - XiFGlmp3YA8pKxNbx69rfYELUsYbjA6+qwTQ - AaBNtcSb1l2AdS4w7bedmdzgy/rAcLljbj6f - hM2CLIoDmoIz3zO20PQ3g5l/ScSL+zZUW1NS - uOec9dzMhiNdNzdqV9fImpySkbfjdvydFu5Z - E5I3yrmNC+iTkB1ZeA4WgMSTQIOwuCo0tdup - eWp96pY5cRdo4LC1ww== ) - 300 RRSIG HINFO 8 3 300 20141212121212 ( - 20121010101010 48381 example.sec. - v4+OOdw/M4MIsBXhX32TjtQJBmB+32CDc2DC - LXqvd8g37QnMJHzEPIYAmvEsMRn1DRlB7nk6 - 7HSy2DwPNHtbu4swyYogCs7LGCbzk5aeEZbT - Mkcac/ONSZjl+kEiJUav32dp4/IySt1dG795 - nyjuzz3/4WSC/fv/QJrOWvU7eLqF/bbqQa0+ - VDZ87U2exA1gq7iIg1rKken3yAL8l1BHBfRj - oI+oozIBPInOm+wA3leZMmj2tcCzDvSGEgdf - VRB4IIx/zzdVPP4WG/DNoVJ+otM6h1APHDRj - PBKFDZhfQda8GT/R01fC8uxm8Tm5FyIgJnz7 - IQfkHNcMAXCsPo9lDw== ) - 300 LOC 55 40 15.258 N 12 41 56.378 E 9.57m 10m 10000m 10m - 300 RRSIG LOC 5 3 300 20141212121212 ( - 20121010101010 516 example.sec. - GHNspK9gS/zAz0cU8GZBU6P48xU5vOXYov+/ - STQsf4jGW4Ikbog2ns3/+4kvZQsDNIhbOAgZ - GdWMwRPGC1DWXzUw8PIpYe42Pql2O+wm0mTI - yxso4A6sV3EhSofqh07dmX9L94N/Q/X1vQyL - SPrncF+FMZCX1CnIee6iFUvDsls= ) - 300 RRSIG LOC 5 3 300 20141212121212 ( - 20121010101010 44427 example.sec. - Lb1zNgN/yVV2ziP/bXacrsBdqDNH+LS63IZF - t2R5SLbdLdSsrVlXcL+9jdNObCzqpC/H5qzQ - 3j51B0mQ5JSN1mQrIXoNsomDUSM164+Dgbpc - 76qHM4r7PNUeu5CAZ6zUGStgvfFleVC9M1Pg - Z2Zgqo9QJnN6rZcYgOjqOZX2U2i8JYrzdPnt - /e4/btWs5Im/j+4ZoAmCjjoFwsI2halDEdpZ - tS8XA+garId2+OuzW090dPJZpaR8ldB7czOd - QbPuwADNWYL98FlFA/+SOd+C5gD0Q08iBKdU - ddIzuoyKcsYwLpWLpM/6Klg3Y+7mwMn46+43 - wx5LzUkfIG97aAOk8A== ) - 300 RRSIG LOC 8 3 300 20141212121212 ( - 20121010101010 48381 example.sec. - HvUQYw8WP9/DdbJeICJFxhIpUj7VK8LMIa+C - ntxAO/1xGiq4ll449e7ylW3qdZMXo/5m8YZR - SayHpvSsAhRlfaqf6UO6CBWs3C39jr1+pB7K - dRL2RyzAs5I7kERvVR7OCqoWOXkBlqM/dSz5 - ClaWQE3md+ZMXBi//9Ico/yK6noSzyM7Lrjn - aBQUYwFJbS3xsT1rc0UtL4v4Pt5iHUjSdE/8 - 0kA9F1APb6LNZ/VTo/uGzKd5vaRFU1Z4zaN+ - zyWxrwyauKHXg+JVNbYjlbSXa3LnmKs/xlci - LzNvdXiUTHBQR+3w+s2GEMNQ7XDYtM2rYXIg - J9KF8v1CU/iQXqqy+w== ) - 300 NSEC sec-00.example.sec. HINFO LOC RRSIG NSEC - 300 RRSIG NSEC 5 3 300 20141212121212 ( - 20121010101010 516 example.sec. - qxNbV3M0mNEVBIWaQfMcf5jXPjsmKqC+bcLe - 2kM+j22RhkRYmhvhJPvw5hNSVjAZDJlkhgHo - Yu7hdpLC+xGFJ2TESRXBdiv+0+mxF0CnECJn - i0Xn3ftldu5+RFyZRPLmh//S/eSZqTTgiZ3l - nH1WrmGnM6U/ih2Z8RzdTzc97GY= ) - 300 RRSIG NSEC 5 3 300 20141212121212 ( - 20121010101010 44427 example.sec. - Tu2X+rtzL9YbC7q/TxxtxCGxslGAUXUD1eKU - +nhwSB1/p2A4ZTIVHxkKton+3OM/oCeuy/Mw - n6sEkSJRioJcWIm8J56YtMF/v+Q119WDOF94 - hf8YWuEDC0T+zB2XhLy8xcOye4K1K5wLv+UD - leifQ5jgNWtkDeC1rWHd7QH4/GNXya1OrQ4u - rMoIHn0uzuRFdP7t5KVIlqlr3I0HPdu6C5Fh - FsQC6egvKRGbpNhOw6XgT3JOvloSicX7nlER - 01roxOVY/mQGP223b6y9mgTqeekVwzrbr54Y - zceMskVpa7zamkDcjb6BdavSb0dd9fmCrtjT - xva8yelrjvIqtfYZcQ== ) - 300 RRSIG NSEC 8 3 300 20141212121212 ( - 20121010101010 48381 example.sec. - TrcPcHA41scU0PInaREU5/6/yOx7OAB8t0Ch - 96kMoEe2OXklnx8NTcX8mQs4QjEJ5ABijSoS - z2OdKI/XX5xhS6BO1DQvv0TCK1HZ/y/1pO1j - 50Q7YEUvtm3KsyABDL8ejwHgnHnJ3LE/gnrD - fHU8m58uyEIXRVz/m5yScIn+fUD44VpMuQCa - QMlUi/1yLiJfOjhUps0hcSSm/eAsa7A2wVZ1 - YWvYh74OeZgP7oDr0dzUhM7r4HETzY502h62 - 97geaIxgZiciqcfxWaziDD8X+jV7XDSOsJC3 - aSgYX8OzYibrA+F/MoumBu8sGK/Jok67qD2G - hiV7F3NQIXu+MZZEzg== ) -sec-01.example.sec. 300 IN IPSECKEY ( 10 0 1 . + 300 RRSIG NSEC 5 3 300 ( + 20181212121212 20161010101010 516 example.sec. + N+IOMKdgPX9Rr3i0bbe7pUWq0dck1PoIGnyg + FhGPQ5N9kN9SHAzJqiwyA8Wk1go/NrdRpara + UwuueTlZhOnWUFTeNZ3zHtBawrQpeVoTfdos + Ev666zh0UWfTbY7mXaF4Ypm1xSUmxC4Z/r7d + aatMwv60DefxPnsROwlx1HZocgw= ) + 300 RRSIG NSEC 5 3 300 ( + 20181212121212 20161010101010 44427 example.sec. + Ev/1PbSAmIrukwT1clYw49BaCTNH4CpUhA7L + jRNDsJ+R84lN57O/TPeB17k6YivRNh6TFNgD + SBBhtYnk6YZI4yG23h8E/PwFwSD/bXoYp8gC + NgqS7IogNgFsVyI9YorzC2ngWFHHku02CFvI + nMdA8jp+/pZwYiTB2QdBSnSCtmwoVhQo5uy6 + na4/GXeh78LEPVCdeHXHTLTdhzmqL8tNraIc + Esc0OG/548XJ7wzAxUC3AEql4iu7msFFLw0r + 5bnv9nLYNF2B1B4+fifOmleJSerlsB+qbXAP + ssV+BENJPKKtykXPv0laVw4fDOkkVL/cie+d + 8g4qmvKtu4tZesHkcw== ) + 300 RRSIG NSEC 8 3 300 ( + 20181212121212 20161010101010 48381 example.sec. + Kr8agywhkHOZGdA+1m9zYIGkKKwtGaz72FPk + l1yg9UMVgIDN2vAj9kYnexefsZ9L4jCopJMU + uGD64tXbOeVIWvxdOwwer3GtxSMxVgRhfFlc + AcS74bOXC1QNFTRsFBCAxauASH+sAml1CuKC + ysZPPWuxg3U28dHqbzalNILf8SwIy8AFsmdu + 7VYeSLqt5DslrO+xGTqZpb9L3S30MIz6TpX5 + TL20ILVOWno51Hzy3v73qLjpjeuwoXDm8V9M + 0tKP58Uh9TPW+XC7WnJ/W1NNJAd5LoZ2Rpc/ + xCY0BymxdDre6of2DOLmtwP6DqICJB6lSg/V + u8IBAJarrNfATWuPJA== ) + 300 RRSIG NSEC 10 3 300 ( + 20181212121212 20161010101010 1862 example.sec. + pbxReQlDMPgS8HZut3zOBhnpQYVc7aiT15Sl + C3mehzUrn5QvRSlQyZrnwLstg0nx423UaWqZ + uqIWXSTmkJEYGstT9B/EruBb9bc2PUSpp4vY + NcXIWHH8w6vsHUPWVOKPQHDtT5tYtK+6GC2w + dnPFtI9E1L3RyQrgPoqYz/5f/31VLyb4R65X + rMlSZX1oUO9pmHxwogfoiAyuA88hncerKkRD + CR6aVRG3DhEa7xjGn6Hxi7Wo/ZGKtaSNdYp0 + KIaiUVIxQhAFIOiuU/9nqDFgTcNw72Btpty2 + fREGSFq1bRSTk+CBJXw/UjvLnZdIwJvZ8BxK + GrkWE/rSnF+kmxGczQ== ) +sec-10.example.sec. 300 IN IPSECKEY ( 10 1 0 192.168.1.10 ) + 300 RRSIG IPSECKEY 5 3 300 ( + 20181212121212 20161010101010 516 example.sec. + AOvxiEY8HYQno1h41Kjg7P/U35XRa/EhJUYk + U/PnHwH7/aStPAn0npvZY6pOKGqzZXmGS8Le + B04NPpRU2j3/b2hlR81WvMvMU+BAdBtwct69 + gd1aG1+za4sgfiB9BQQELznuJVeo3/Zc15AP + Z/TVYG6cqZNfLw7JPORTCexavk0= ) + 300 RRSIG IPSECKEY 5 3 300 ( + 20181212121212 20161010101010 44427 example.sec. + WoLkHtWH5V2fxCwsSXli+Li1sQE8meKwDMCq + 6ZnS1r6INL68kWIsvgCOSmt360j2ZK9JvrsM + vdfOLy9+wVB75tlYWUS6aem8YwG8bSCvZwwY + OgG8BVbZNisutmmRjhUf0unGBRjiXRUWiYDj + nVnAO8rSDNWN/TXzqYMGep06pEEiBzKN2Ig0 + Mft/6Ar9vm5fAYtDcR0Jo79YByhA51Fr677a + 2p7IfVO+koTuK3MFoRLVSZGQrc7ALFu9UEaw + JbQkk5IDIlJnU8ae/Bsx+B0wgv+px4rK5i5/ + hAdk/1hECjNLI95F6hCPHTCR0Mx+lPOJPD0m + TV77HDLGqxBQ0jhIjA== ) + 300 RRSIG IPSECKEY 8 3 300 ( + 20181212121212 20161010101010 48381 example.sec. + GSBxoR9JRcThupcNlgjm/g6XTwyEAF/vHyoK + JmwH7DAgfVhwyHjVYw79PkaHGmN/sUwdenPV + Bd1GKgOUjvjHXvtO6BQ4+mSEOlCbWlHmOH2y + nFSal249NSm9eU4ab3PV7BMFPziGH6o6bhZf + Yfe756/4e0rwCKqiFIcD1wlNeGmwVnejPgz4 + i73nRVn55r+QgcC6Qby+jeZiNzLXgsLsLr9/ + q4G3Jkaa0AAXmOb7XaFpmEXuqROZzCnceGHB + 7biLR4U55rC9DgkJPTLSOzuqRn0NwfPs6e6t + R/7wClYjUt6XHjBwHqSvLiTLrlv4q65eQWq1 + ft/uhKP3iI3tXHa8cg== ) + 300 RRSIG IPSECKEY 10 3 300 ( + 20181212121212 20161010101010 1862 example.sec. + eO944SxxYuWjbMQ9XT7Yc/5C8KuphOPU/9xM + CvX0KsZMXIWMEdsjLVyyLTPFYmqpyhA82tWg + 3rOhofLSnyOo1ANoHsJ+9dwVAhw41RERhTTQ + Jzv38c/YuTyMgoPHfOafHzgLi55/3adxWsD5 + FD0CH56K4rBHKTKzpWtjyRqPqiaPCXejKQeT + Vk4XYYYpDCoEIx71Vo5TZanr6GKfSNeT89wl + wiztTRChDo7GiMQsli1YP48GQGyPm8jRU5JM + h6fJg1CaWuoxCTWX/v5+1rxcIjZQx227FVka + z9rD3n/xA2bv2DKbLlMBc2nouPIb7C3+3wrG + iNRVyhoGksoDY9F1RQ== ) + 300 NSEC sec-11.example.sec. IPSECKEY RRSIG NSEC + 300 RRSIG NSEC 5 3 300 ( + 20181212121212 20161010101010 516 example.sec. + XGhMtyCDdm4i3LcU6YgE+Cm9hVbEzUZY08Jb + 7wBByMAbO7k/x4PTrgA7Ig/cTKbS1YF+cDad + ZjIGhfljB476tAr42DiyXLbq9nYBgk5jLpIr + hk2nvvIKOThdhQRAH1FSA1XPWXt+8MRNqv2p + vqFUf0EThn2JobC61evB1FYJr2I= ) + 300 RRSIG NSEC 5 3 300 ( + 20181212121212 20161010101010 44427 example.sec. + oP5Ph4R9BnLVI3r3btH6NdWs2hznmWt/O5OG + qW2o5ttsVsjllzCV6RscxYrh/UmMCllXIhm8 + hMqFPNASCoBEorZ8AY90B3FS7zXw2pl/B628 + T1ItaRai837uBdbrv2RQ3JXYqBZEr9hLxlSj + PsDjKoy8mkVsDrI472wY+Ym301WrWl0wKDQR + 1JS7fGDtRdY0YCnx4n0K3P/04zle77Efmfij + dYALh0mlZ7JN71pfSwMapWB/JTNo7O2udWGm + rEM/zO3eJH8uXhyTe4CFzAWJM+pbdswWwxRk + 7NqHAohC/YkSf88C+aYXijCZlYJ0UdmA7nlE + SiJWqelz2nMww+zoVQ== ) + 300 RRSIG NSEC 8 3 300 ( + 20181212121212 20161010101010 48381 example.sec. + QRiKplqddN7ogKMh6qu16OSH371f6+5Cw6OD + 6A7kWvsP4s2ie8Fu9WfYyWl1qRNWd4gEYc5A + BkJa49zi7qmtDvOoZRD1KFSF6N3vKmwUbBVE + c32oxf3kQZxs0Dsp7B056Pv1BE0KaapP45Bb + 9jwsaJaO/x8muLsOjokbfsACfY/XlJ4kQGrY + z4hwJ7xm3b6SHY46Zv6XRw1TyW2CvHkx/2c+ + pg9gCCB6h2Zjn56FRQPHPcZqYMBroK/azY2B + 4+GbKTgfA/NqGdw2lf5bBi2fHziJhk6sWkh3 + RXRRYTQHMZatoehblQ1YR9Bo1F7U6qq/RI2x + Tdbe/4cHjVQCkO7t0Q== ) + 300 RRSIG NSEC 10 3 300 ( + 20181212121212 20161010101010 1862 example.sec. + VaOMaZWd4yo3vG8eFaeErZ1PjSpkKsRHNtqA + O4EKRe+0SbypAJzg7MiuXyqFoDh6wrMopq1h + MwGE0PrJUnMQYJmtAethsMpBkUtxgqZPaFaH + jHUTRhaBK87jZDKQ0R/P5gw/whPQK7DJnwkb + +4lj9ZT5bbJyJfvfX2jdl7zLEllK8ShboiqN + v7LrrQJECCsCe7PL4f4qyCKW5zY8DZyuu8Gl + ifE0+wY+8rFNnJWnRShPBivyy4evVsbgfMFw + XRqkW1yY0TGfJA4C6bloanBbREeQ0ENiR0KS + EfLjVCQqTn7UR+RMhphqYvNvCYKVIQKk7em9 + jb5HCsYAE3E5KB2hqA== ) +sec-32.example.sec. 300 IN IPSECKEY ( 10 3 2 some.name. AQO/C76MVA5WN743YYeE537SLNffRZvQ9yxo QqJP943gqs4QATtnJWHQ1SDWiRE2aXl7SJoy JAu7jaUTGKWXzStD2wpkBIJ1IZ+avxf8zxRt @@ -1222,70 +1649,94 @@ br2pQnZ5ul5NCgkhhcr26IPPiZm2eww6ougs ogj6kPdSSQYZYayHzVnl8NFQ9uCwbRTryepP zZP5Vd2t ) - 300 RRSIG IPSECKEY 5 3 300 20141212121212 ( - 20121010101010 516 example.sec. - dYRRx1AlyU8o0KvNvy0mAK3jU6x+BnioMJ69 - 0YtKQdcakpyFUzlswYxhB/7YIm7CfZSFOoJA - 3ae8CkzD4sSFthM3BZjvZZZX+nRvw4lju9oV - 5SzgrhPDPnpnL9ifCtGVTWA/8vVh5dPHAZVU - zh6vl8tnKQrwmiVApLRqZu5PFMw= ) - 300 RRSIG IPSECKEY 5 3 300 20141212121212 ( - 20121010101010 44427 example.sec. - cxhg/Zu4Y7Why4ftvdVWip4dmqIqi8/qACa+ - ZdalnAbGyRAGSWAEAG19tLBtYMFX2NFF6yM1 - Em9M8e37tHmwyNLpEnTi9QWGTOs6MCkUAIIW - teCAGiWu3MQMS5QiOCAiJBddLCrV5APi+Uwb - wWavFe5RqvIPxZ1GVG0WcgdI3GabVEavPtyd - 7zSeT34J7Bd4bJxpPgXQiRWZpJkgep1e7xDT - MtEmhrUU8y2Bbt5WT3k0ARNYOh00dNjEDvpx - e/pIThrE+xySXvmOUZrvuP8V8cT73IcsMw5I - W0k2WvueLUDZEOHQrd3Yn0BFMnsVAnG/ciQB - 92Ma1s0gM+SgZwOHRg== ) - 300 RRSIG IPSECKEY 8 3 300 20141212121212 ( - 20121010101010 48381 example.sec. - YdF5IyJaQVoYlRfuldCFW5CC1qICMS4Gjrve - H5GeqLHReuDhRVe5T7X27MexaC8u5O0Z89Ua - 4O5YV14rACPv2Atzk+4wlLmVtk4Oswu30yav - NkdNIKDmvv8voJnjUkYTlDng7I7m9vNqCUn5 - Nw1ciuawIzrL4JTdFUrKFWoOEYw/c8NHBhre - 7RqJGzSbjr0Qo/Wcur4Kb2LkcuQtN9LSx9c6 - wqNmOiX5WyKaS1DDNam2RuRXsdz1oTz1brV0 - 3LtIydp7F+AHrx2d5bhtjQK/v+tccNBsIpkO - BqXrXJM0hbo7cZ0uNGSnlzjbGKzF4jqaX4pR - xM/0wkKHe4MsnLg8hg== ) - 300 NSEC sec-02.example.sec. IPSECKEY RRSIG NSEC - 300 RRSIG NSEC 5 3 300 20141212121212 ( - 20121010101010 516 example.sec. - Ny1BBKgi9V9hPIQSHbLcmLBsglGjGFiBzrCc - tSaGM7UnbNjqiq9s1h7wBl9Y9CmnIUa0s3Hn - wsf8KQkMQrg3Obq44f8a+YEs3m0Mb6KsvrMj - 46QswOwr3bXm9DXzyCwYePQmeed/w5oaOhe4 - lTVwFW7fxug5PcfIe89MLMkqIsA= ) - 300 RRSIG NSEC 5 3 300 20141212121212 ( - 20121010101010 44427 example.sec. - jEHbUbVWirjrY1WkWHojuFXqw5Nhg8zax9jX - eSQ49yBlwSnmhnEAA02IIYHyfrdnXEMztz31 - r/bNqfHn5etXoPZvxxlj9hNxR1qBO/ZfR9Cq - pzQNeAxrVP1f9xuhcZwqMPjEqFnOnkbjlcWz - vLv9Ko1HOO/ifAhMQEwviR4yU3HEdca6r9uO - tBGo+BTuoYVzQqPhIYpA4QRStWNOKgIe/cgV - Fv+fvWnYzYXY21w4yRYv0AR4rxYXtSvX0/+u - fV+/9r+fz5O6ZX23fO9GrV/P2wi64m+B84Wg - AzdkstuI8eyNuLBymjlYcCgCDMJdE9W+E5ER - ABXyXzjWDvig6jkAyw== ) - 300 RRSIG NSEC 8 3 300 20141212121212 ( - 20121010101010 48381 example.sec. - P9DCOfUpee9rYTXyA1tLCYheQDSIN8FYPee1 - 9evOBiJooO56RXM1TOBz1NxpIyaarFFG43E/ - ZheazaUogq4wPBuG6exJiNnPA/cPV/7oLRGs - odaNXU3vKyTcX1EzhxGPvawZt33dxxGBdq7F - YaCg7wAvmV0LM1oa3RVzzicdNLtBfNgO2Zzc - ra+RE2mhtiiDjpFXeWP5kVd5ck7pVy4Y6yGT - MtL1EfiMQROQj7KNsuRMbE0bIEaYmwbcv8yy - PJcs5LAd/PYijHY7iat3eyjgGm+FTDnhsH3L - VjZspLQaK9jDDZ9bWnfC7pBrMODPxkFHBFQO - NWWQkJ5f96JrMutnPA== ) -sec-31.example.sec. 300 IN IPSECKEY ( 10 3 1 some.name. + 300 RRSIG IPSECKEY 5 3 300 ( + 20181212121212 20161010101010 516 example.sec. + WFKnw31YDWLiuNfHWYZnghyxu1m3supAa1u8 + BTroxFvmWai9zunHo0n6JtQD3mwwYxPo9Vgu + FXgXuOaB/vnRqIP1gbspgc8CJd2iBMlGeLa7 + zCsXe9t8OgGL+8sLCDZpeWJiLmQPEu9+rcgA + fNP5eINMWGzZFo0O7hmEcTQ1zWw= ) + 300 RRSIG IPSECKEY 5 3 300 ( + 20181212121212 20161010101010 44427 example.sec. + dD/tZ1ANTC6FYZcfJlXBC2V8I0pvqs9bkbYm + bicN2Tdcks+BlB8NWl/muWsr2/8r08KJpN+8 + mZnOpCbLVI3wGjYaHoH4wQHfEo/W//gUGUGb + He8R/YMCh3BOjtvzwiuoePRmyyDiWUOKn0or + bL3nf6cp/9exLHdNnXe+8NV/A14Y735qGvni + k4e6lGYyZ4wexmqzj+QQ3z0glPe/iu1wUHix + 9stdCHh28DQI0SxG0U849NurrWEsBkNwA3t2 + EHuIIPtPrTADGvOD68tVhxziBGd0SyqsHpWn + vbS2QWLzWeKwIN49ePqTYMFp3JNbgR64F+ty + 77NbquNRRlKIz9wT6w== ) + 300 RRSIG IPSECKEY 8 3 300 ( + 20181212121212 20161010101010 48381 example.sec. + lr5WSXh3JBrHFzpfHiNTITkFX+z+s36o/WOV + gYc3aT+BoWPkFPFGn550rYixJZUM1az7zuGS + sTGi7y10bT57dJfw3bNqxLRzCuLO3ppmI4AT + 0xfIrrTJqm3KAyXUiXQqJ/e02eR5k3A3ptfv + uraQQaMYVzXp6RYNKojysPNleNwwjjxoZQ0M + 9VSdU7Mwbu/USQQ/T8vQPOZ+pVAyadBEFB71 + 7IbyYkcttSIUEn2vNuY06Qo7dpS8xcEdkt3N + TP5sY4tOLDAm+Pov0iGCzf5XtxqdnhA/0k0W + yxTSwMMHE3gwmjVmw8F+pUfLhEayC6BoUdME + 36tzfs4MgRzT52kGjQ== ) + 300 RRSIG IPSECKEY 10 3 300 ( + 20181212121212 20161010101010 1862 example.sec. + psHHwUHzPaXdd73twQNarWkgvihwT4qaZk0H + JL36KwsMIXacL4gYhlv4k3Yo8fTk/xz1ea7R + ZQo6RbTjotpkwXl3JKL2lBbUQgisUgBNqrm4 + bV9xcxxoeJh70xSyNsPKNRlhIiQI7S59lESy + LnmLGfM2AxjAVWIvkyAPWkusuKkE29YjQx+h + OECKQO266Aln6XWpglT17tUHqwk1pMsrSmYS + 8rhP/g9s5euVuGYMh5KA3m8fQWQCs97CVofN + hJl4B8RE8ZSCQtYVKYTAcZ8Uxl43IZGajvc0 + aYlA/iDmsm1D8Z6N1e8mcsefjJnXYMaOunsd + uVoBjKxAnLf+ko4V7A== ) + 300 NSEC sec-mixed-30.example.sec. IPSECKEY RRSIG NSEC + 300 RRSIG NSEC 5 3 300 ( + 20181212121212 20161010101010 516 example.sec. + B2rLde15M3+mnWcVSgP536sFS6jp0w2m6C9Z + COpIAxg+hFuESbnqC4KTQsjiC6D+r26r9c/F + YNy7fPlKTpG3+BfmRKvx0M48XTB7kuMZFSv+ + 3bscm8rNon7QzCan7mMaBaK2iE+B7RHJ3yWQ + lclS4/ISJS6hOe0mJWQ7MZ5USZE= ) + 300 RRSIG NSEC 5 3 300 ( + 20181212121212 20161010101010 44427 example.sec. + ZRvKcFEP5Ewm4uKrLoE3Jl7hSAKQBPNSClJ5 + GKqdQIGEgFVY2wJ9oeWrpnrBeUNKxqAUfsEX + X/8WFfkYFuJWVabi8R6MQ6PpLV361jctMXhx + zbym0NP86yuOb8RLzzZLR8h1RXWdyKcbSRY5 + BJ/bRxHwno1AKvwgSd4bOsi5jypytjaXW08s + VeKzZiiqx9CabukMS4KOqLgLBrNzyE/Kjd+l + j6SkvSAK+9ABMNWPlv03lnbo3itK7HYUTNVQ + DoX1o0MePgvYxh8A24MGZxoZMcHmxNAeUYM1 + CZ1GxbkVZ398YkI1NnvscW3DOGjoA739i/ha + 4UPgBPBEv6WAdRwGfg== ) + 300 RRSIG NSEC 8 3 300 ( + 20181212121212 20161010101010 48381 example.sec. + 04pyV9O+WCy7anxAcybbvEcSFOQp00Pq49PV + 2EwfaZwmATg1BooKXSfHepppnSJJbUAc4pm3 + PUJImhSpPQI1Xthqu0N7IGaA48a+ltps0qUu + EeZqAWxK/Un6gDt6iguqlQZnMuCPs3vY+VaO + ObHw9j7LTmbrSOQ7/wbuZEq/J1/xSU6SkePK + pp3A6DXwfhETAx3xX9CfEVYdcicptqdqF+Ci + VjLvUoTfeb3UJn5Fw9UNSD6H5UaxD8k7WVNq + b9Wy5mfRrRlu0fuHNFmVFLnnM7p2UK0+qDyf + 60a9l9V9L04HD1ttW81Hj4eWX3xNEKYl1Tj6 + NA3UYQwNU8Nnc5FF3Q== ) + 300 RRSIG NSEC 10 3 300 ( + 20181212121212 20161010101010 1862 example.sec. + beTmIlSaUs2hWD7A+TLnflYGpSTO1f7k1RAK + 4b4I8VPQnoErHap5PvXovIqIjyJz7tZgb8ht + 6sWcASJmTCm5BO6PVROlf1ZHPmNGrKz7/sVh + WnA2WVCtsY+EzJo7sAiOl/zgmiGA+cKGyx4Z + 9cTDZnYcg3oQn//ZJOJPFC/FrauNM/rDsEV0 + nAaPTP8o3Td/Z/0jbdvSa/w4F8h2V5mVLWZu + ieaPH/+xc4hRRHy+ixDZ2U9SXDpQIBJZBFNq + PTYL+ywDNrcO+fig3fGNObjpL7bbIeSauBRO + d20xkERNHSthmdjnXDdReGxdp7I8NTRTj44T + 1EMikumdg7FKVNQUoA== ) +sec-22.example.sec. 300 IN IPSECKEY ( 10 2 2 2001:2010:1::22 AQO/C76MVA5WN743YYeE537SLNffRZvQ9yxo QqJP943gqs4QATtnJWHQ1SDWiRE2aXl7SJoy JAu7jaUTGKWXzStD2wpkBIJ1IZ+avxf8zxRt @@ -1297,70 +1748,270 @@ br2pQnZ5ul5NCgkhhcr26IPPiZm2eww6ougs ogj6kPdSSQYZYayHzVnl8NFQ9uCwbRTryepP zZP5Vd2t ) - 300 RRSIG IPSECKEY 5 3 300 20141212121212 ( - 20121010101010 516 example.sec. - ZAqqDBfAVkm5GAkLn0I+fY1Yh3q1P7c3953w - DHdglMo5DnBal5ezQH7c0vrI8GvJJO8fG3T5 - MUZMhTaG648LQJ1oGQdky9PREi4yrFvSQlta - 6NQgsPuAcDgtEGrKsL2IC0dMV3lkBV8OOqpz - JaI9HlxvLorGmLEEaBCNFLi4sk8= ) - 300 RRSIG IPSECKEY 5 3 300 20141212121212 ( - 20121010101010 44427 example.sec. - UZMDwvoYhyTLYr6PATsXcuZCeuBkeRXmfH2X - ishLwWnnYQ5ghMwkl4qtmn9/n5FDLwDkRtGv - iLpBEo1VNxGU2G/PAYTNaUGcULQFeGVbbAsq - v9427G8fNzGAPhqpBHRd8JRQ/eeoEA74/uKS - phs8FNUO18hEKmzol4JqchzSSIFSW9/bBaKz - Y6TkCYZtIutiBEHFRTlavgbyWqMxdXEji+Nn - Xze2v+sRi2kyaQFS7zSWBHH6VFMh0KygxCND - x5n00Sdl6aljlpuklNn75o/8iEkFdN2DsRI0 - tkVQomX6js3SgTlQ2C2FUAo05jxlxzrIfcdO - /DcAG9FRlPvHoEhOPQ== ) - 300 RRSIG IPSECKEY 8 3 300 20141212121212 ( - 20121010101010 48381 example.sec. - tnQ2kFyCF7LHz3BpVO0OVVQVkyjwq+POLBl9 - 2d7WjjkIOnpaXMQRl3PxloQ5+eaTrPejynKU - Ck5BENCxzG7RyRMi4I5ewPBgrbVL+xEpVOJ7 - 9WsL2xKhkcFpIPcqWzPzo89szXreI++xEDex - WuBWBQ5t6K0+RJROl/yoq7v/AGiIsQ0QvESH - 19YnNaXmhjBQVnU+Z7+edwMbBCZzbrq72Qp1 - PH+a4wUOeQqp0AvSm9iWrsmK0k4iKq14fHPy - 17TlC3PanW3PnG8DcRA79rBxDf2UWOcj6C+S - MVvDuJHjKHDXogWZHF4k3Np0lddMta5uTlfT - i/sXL0nKu1Ld0FWtvQ== ) - 300 NSEC sec-32.example.sec. IPSECKEY RRSIG NSEC - 300 RRSIG NSEC 5 3 300 20141212121212 ( - 20121010101010 516 example.sec. - YtGwkJFT45E5qfMwpUiGyqclXQTdgaANlprv - c11f0o6hy2U8I9bbeji2sD35xRB/gJxbeKUU - ASe5cdjJn7BuBRVpob3UItRDJMqTp1jihWEt - Z+ZUp5s0BC7gwC4C+879+I0828Y+X06NwE4L - PKt4eyZdl1EQLj1lyBKpKHxrMys= ) - 300 RRSIG NSEC 5 3 300 20141212121212 ( - 20121010101010 44427 example.sec. - 5bW1ijtao7NmBEWHKgoUg7JXjKcpz53S+LRk - vm2VG7Eo36H/3J+HZPPAwCSOLDJjh+CAa+E3 - IZyuq+GIA+0EG7otHJVtc0dN/iQs1lPjdqFj - 3qAtHIuftfcobQ5LDbFHh2r3VH0FLoaKvQYK - 8nb4Uk43FRvK3MfUvUGX0VtkUggLSktYLdJN - tqvJCKnR4ydhMwBudqiTnR61dJkTjJS+hhcs - MqGNiAFFcbNF7WZZT88hXS3we3vyyAjfPUQi - QKi2BHK6IhthQ8tDyDu0hwX7wpuTNp9++6z7 - MTRc2HsPjSyHc/1xmNFIFC3jJwjJlfZDMl8Z - 5FvTr3nq3OI4XwtKqg== ) - 300 RRSIG NSEC 8 3 300 20141212121212 ( - 20121010101010 48381 example.sec. - nEZGkAFPbQFS6bLUu4O3SzHAe/DtJs4wTFRe - LFN8SSp11JRcyPu5VdPjQ6EWNbHvmB3CWs3o - dKmsmSWtpT+fPsLPDuYjijjwXe5fefr/wRC8 - VRr3rGqC3aoXm+NuaXMEKHHOf4MeIGVCDK6D - NEjPhagr96bv04SwrL4/LqclUlXrnMbHQe/f - xvULs6IyvLMTdCgEMRQ64eJLZDIerZkEPEqb - WYqy11ViCw+ASdN5lg/cwaXOAQ/Ao6S8Lsqm - DLy1rXe4kRHgMsei7c8/X3Pre0ZU80Bv55/s - vioJUwD1wihD41+dBCU8aPaxjuyRK2uqnyun - MKn/jYFoyNLMy9+nOw== ) -sec-32.example.sec. 300 IN IPSECKEY ( 10 3 2 some.name. + 300 RRSIG IPSECKEY 5 3 300 ( + 20181212121212 20161010101010 516 example.sec. + iWhWTw7iJntB+YHQzcTxoQ+6lzzXXAS6T/w1 + JZG3YDQSfh0kHpJfaNGmZH3bA2iHbU/phU/F + DSjUCt5zu2aMaCRM4Gol8Au6BqEY3DDKfI50 + IaAy3Uw58J8f8pM+PNI49yHrVDc2ldoe1aaR + nczvy3ifuq21ZMUQJMzd+l2Sr2I= ) + 300 RRSIG IPSECKEY 5 3 300 ( + 20181212121212 20161010101010 44427 example.sec. + PNqqrfsn3yiz2jzf8Gf988KbXIQC8szY2KFY + LcYgf2+Hy+04TgSglJ5YPGUvotvfgH0n/oeZ + W/TRlj3W18zbTko63oFYw56pOVVz6SwRrz0x + swo7TP63OmgBrefaSbLW2u7hLsB4oB1MH9zN + C72vx+fDX3Pz+VolB4AP11bLZjKILgLydU5p + IMJUSWf/DVP/LictbcQkRb8bvZq2LeDZEvyE + l0sGfxrgn/0lwtRRx3VOAunOnmV4KrTSwC/8 + XJWpqFsEPftILsqscglUK8RuWMsw7ivMClAb + GbQbp1m/vfjJAT4RZQ1yU3/Q4qTSe6HX+pKx + 15TOhBSlil3I4P6xAw== ) + 300 RRSIG IPSECKEY 8 3 300 ( + 20181212121212 20161010101010 48381 example.sec. + MMoNOaud6z87L6uapJ0VfB3/R/SE1Bkp50qP + NQ2TWas4vWgB4woubS0pomneuIyVABpuYvHR + es57hgh3XK12OfYZ4c8nh/KmoJXfSNvWSBXq + 9orJHkmfDLES3djWR5zdrOSS1xIElYj4QL2S + eeV7aKR1MrkyNIUqgqK6Lqdj8oXjREpTq/C+ + H7vdw9XgQeWZn5I86cUEhjf1Ugj+w8+hQNSI + eoFnQCScI7lLO0Zn5uJg+X74/6JpguluwfAU + 8TLTdFISo89fvDkAzZQ5/WWW+XseV8doY4uf + uWL/EfOkgSVb4rJuhN4LjaDpNNwKVupXUCgC + animCObiB4dhlAfMTw== ) + 300 RRSIG IPSECKEY 10 3 300 ( + 20181212121212 20161010101010 1862 example.sec. + whhkXRVK2O3u1oR1Fvb2m3MIsZNi+6MtMjuK + +h+r5RsLVcqhiFDUZrMiqaQomt42NQJNFn5A + W0tOTudijAm7EwJyYg+m39LSJ8WJpH3Ek+po + P/PcV3nkmDCHWVzYzRixP/QIF9hTjo9SiUAy + ++jP3S6LMnfHkGFIxemxqUwO4eotrvhNgVOA + A0NA3UYMmbz5zyJcyD+Bsi5IQozB6GfaPtgi + SBrmoNm5kBKM2qW2vmCYpKTqK17kwEaVgE6R + tawaUy4lZK1Uj9O2vpWwnkJTPoeIYdducoAp + Xet/azFBTh3n3DGOuYlk8xzrtYys+/lrgl1F + 9D8eBgSO8oRB6i1jrQ== ) + 300 NSEC sec-30.example.sec. IPSECKEY RRSIG NSEC + 300 RRSIG NSEC 5 3 300 ( + 20181212121212 20161010101010 516 example.sec. + h6dh0L2hnMjLbqHnfBW7zVcux6WgU+Htbt9i + /s1xH3PYPNSB4YkqddSVkBEtFTkgZimOseEM + nPGSPPqONAluT7gIAksWCqqUltbck5xLHbww + Xv35SLvc2gVtxv3iFpxyid62D4mucIByYdvd + l+6WpWU/As4COnT7HqCwTV8y1kA= ) + 300 RRSIG NSEC 5 3 300 ( + 20181212121212 20161010101010 44427 example.sec. + u+WKYXFuvlOUudgJeALAAPscGsRZUM9+O2Z2 + XkuEAzxvZPiNxAGUg/sMOP2gVgfCrdMsKPd2 + /gWfvNyqwGF6jZHfklOJfnoy4apAa4qVrvYj + KyCBKuigzeXjSpGMgohP86e5WbqVFkeV74zz + fTYum+1VVrHAMyC1n+96A1Ssr1T8ApOx6Jwt + T+3Z2VdxxPBOyNmQLKNzVBcuM6WP/5dlypPk + BdyrqJlfZXhqTM8yG3MMOybmhYDLvz7Hmo5l + I7rNrib3k3VLg2Pg0r5X3Yoci1LXQLo36N1U + fvfApdgkP8XraiBSGIFBBq+Ouy7tDyll1HHa + S1IlxGI7+j6g0gxTEA== ) + 300 RRSIG NSEC 8 3 300 ( + 20181212121212 20161010101010 48381 example.sec. + Y+pNKoL+y01pqsQk/R3ofhx8YGTt+PkomQNk + 9NRVhI+sJH1opj8mDxSHdiw6UOHyU680eDhU + i5jcOZSFvzyk9F08EfC4+Ko9Uyl4QFK/0OtV + 0rZ+xoRwOfB3xLlkffOc80dCc2WZQit2u3+R + EYguqgNGbzuaN1BNXG42K97xeLiIU0eGv8rl + mpHs39Fzcl8JiISeaQ5rkmkvKfpABq0jxbmp + IIAJvSkxcuBtHmS54zzyUt+EVTxIRrytZNCq + 9rqdOV9C8FTfpMV2iVN2GBpH2jPClq+j8L2N + DlDg7FRdR0ydTsudKEqUWhr9562LPL5/kIcZ + 4+IdhPjndoN9zuWgRQ== ) + 300 RRSIG NSEC 10 3 300 ( + 20181212121212 20161010101010 1862 example.sec. + LNQxYEE1M3w/XlXaYlh+6TYj0tBmfAYrBAAf + Fy+H2k4RX4gn7ep/MJgYOEzYJr9kNaWWADbt + 1321oKf+FjQTe6qwYmaRz6Cynp/d6vVSliA4 + pRhr8tIsZp8vCtHLgBILFBNFgu8HUtdYL1r8 + souiajW0zNsGd6sMCpde1PAjGsJjTM2/O0ry + Ddu0QImJmbjsEWWaVx1C51ZOJgbt7zVHtfTN + mbpYEf0NKxGID+aM6t3Ih7Ab8yw5GSyYS5c5 + uBPn1IEc/JAiEjXDpjhJ2TwKbAi9w9gYny6o + 6R+bCy9ogSgtE8WfLcmbX7nqQICM+c5B+YgK + prqxsvSaDfi9Ntrjtw== ) +sec-30.example.sec. 300 IN IPSECKEY ( 10 3 0 some.name. ) + 300 RRSIG IPSECKEY 5 3 300 ( + 20181212121212 20161010101010 516 example.sec. + n1/3YCfqAJhwmG/+X907lQTAdwoc2m7S+HWY + SCB29a4Kum2jTyJ2TP5f67jAEbY+JAnUB2HL + xGQ4096yXhXORKlZQ4jbGPZ5TL7AcKzDdaIt + EoyMhB5IxYRfoSodaqHxw79CR38PzCWwcMsW + spJD3yLzAxAGRN1g3q9unxBLtDM= ) + 300 RRSIG IPSECKEY 5 3 300 ( + 20181212121212 20161010101010 44427 example.sec. + kHFdQVysC8wtp8X4Vn94KaogvEzjBoxOB/fa + NiklxzLxLFtwC4uwTvaZebNv4RLfuwtW1n+T + pfIFxMDJ7fog890mD8BKPVZwKREohTPyjuTA + tO57EyL64A9Ergqvjb2BxlXEo8q/hqn1PQ2p + 53T8wY4Bgd1BWFoB4PcvxNKU+SCcxSt85fyx + RsUOnJbY0v1aGkOJYSXFHjr3VeWsc1o8lzxN + mMO8qMwLsxbLr1kEq03FNNlFwTmpIKUojIwV + 78hI0APghgVxDrHNhKeRppuQlApkcyhDIjJd + PEmaIoZ9azP4Otmi03C+duaheiIW3fv9UKzw + 7zoZ3Wa+HXM/joa0Kw== ) + 300 RRSIG IPSECKEY 8 3 300 ( + 20181212121212 20161010101010 48381 example.sec. + dQCgAn79u7gPzfdWGaASCzI4A9lsQbeT/wFs + io+TFnqtDlhgaBH8OBjsLT9waEAuJYUbG+XM + j//s7Qkc8gUwkbWGmSWMRBdXOcLv1yJPqb77 + 6sGwNhWLyJ+wI442Ng3r6OyJw6oWm/HDwzus + aEKwTDip2qPVmP2X14CQuOhri1pNc51vOTg0 + m8M2UsOBlmGQ3mHwPgU/zxWHjwJDxf/tYQRP + 5w2uMcTdY4kdydmLjaj1vBSln1ig8d5PaXiv + eZCYPJj3+ToXtQbR1SCGksnwYTjwehfl4dq+ + 60fiEytN8jAhZBqXcd5JWuhsDe+78J55yyzt + z+tr0kBa+ClqpOvdDw== ) + 300 RRSIG IPSECKEY 10 3 300 ( + 20181212121212 20161010101010 1862 example.sec. + EV2YvMX367otPE5fj/NlAZdVU+jnKPvEG9np + FUxtF9RzEoPTffdGIALsvGTzvQ1MRQrPT1xT + dKp5sJ2yd+oAj0wMDVEHnDqcqkATFu9rV2zT + V6Ec2ACsGKCzsIvynI1cm3FyaZkRa4IUa/4o + iqdYWQbB6lvFNxlyxLsMjX1gkPE0bHYE02xF + XArlqnCmbtaXx/EWTFLiOx528p8x8ZD5MN2w + K985CA/oxOOhQc1DZ1R47ELad4a3F1/g+2hM + V5FvA3bjQ7XJyAgjYFufJSyP0N6HLINIDdj/ + xB537dxxShUB11XFzKBtafrCRLFhrQ1Ksauq + om5sY0Pm8ZtdTGfm4g== ) + 300 NSEC sec-31.example.sec. IPSECKEY RRSIG NSEC + 300 RRSIG NSEC 5 3 300 ( + 20181212121212 20161010101010 516 example.sec. + LwLKdvbnWMZOdQGkhOYN5UmFYO1jv6sCemUt + TSVg/ekhh598VJog/uPpkkyc8Z5fWDNXU7qa + qodH9o4ybxEKPTQMvNZhHGqEBO1zrFb+82YQ + 5YFBbmyHqtXZEoZsUBz83pVqenBJPvhk4fHu + I2KzloN1mll+PxwP6ITX609QfLk= ) + 300 RRSIG NSEC 5 3 300 ( + 20181212121212 20161010101010 44427 example.sec. + IiRrrSBHzcSODDc8rl99LDQ9+X42WqVLOTbs + aaECCylMz7/d3Md423p7ZbZocZuso0fbC7RS + PVPLfZGzAiiPddeb743XoH4oPTrXVShQoTpG + NZX8+9hXmaI9VRVjtelRLvR1uq6MFkUQxBR/ + FJdVv8Ms7yYgX81DAZ5X7jHJ8g46zfR5vAaY + BieizGl0POVYvgO63JI5S6Wes4C4tchMC68k + y/FXtQZ+7uOhgpJmr9gpgkHDOa17Bfshu97i + eHvaMhUbeL4V9mkGX0lnc7Fs8i9gi4p6rfx2 + cuCl/hcgFweMDRRoV9yTOnARECy2eOFeM3Yz + bDKUzBWlp67bL4HFTA== ) + 300 RRSIG NSEC 8 3 300 ( + 20181212121212 20161010101010 48381 example.sec. + t4As9gdV+R85vaKPjUKFrHfDNwe5kqREgeoM + xWqEo/jVkGBDa60UqzUutLGT7O3zjwZa0Kl1 + g4yqCuiW9VhICtUd5Q7gGnWnSGBFqfvQVrae + Fww+Pbn9xqmmeTntYtMq/OgUxrk1mdlLxY1B + p5RFleFA1OAnTn4ZDGEUWkBuMP4TillZwsKI + 4W3qMzLfieOB/gknJn9JLPKj4+hIOzUY/r7t + uNEzdpTiGP6/0YlzSjEwxzO3TuN1nrdgmnIk + oW0GTuQCfZOah7xAdYe4oZemC2u10wK84PMV + X8a8F8xWtUO90if8JEYD9o/BWBeoEUE3+5I1 + 51VUfzXGG7kVeoaW2w== ) + 300 RRSIG NSEC 10 3 300 ( + 20181212121212 20161010101010 1862 example.sec. + qSr0muO+ZSs1QIC68tsr+U4UlUtYGJ4Ygx/1 + PxoHzBTa5U642csRN4SDBL+5J0fl5tTkDYep + piPmI/wgy6wnQs8hhCkdPPaeJZZ+YjOtcTr+ + 72skfVX1z2aRRg4tWnhhRGNW1hPxYBawCZhQ + Ktg7XDCALip1trc9mns2607rKhqCjv8PoHdI + O5TQFmr4Xz1RW5Pau5bo/rZr+Qwn7mxPR1M1 + NPAuWpLJvQuaMcGq1A8IJstj3JyFLhgbwidz + hsu+WeGio80Defl9VVE1COQ3ahlgZuv4iTlT + EfQzSv68OKrn0MDRIAcE/ojVdYI7XY6HmCAm + bez0AQJM300Jxrr4Pw== ) +sec-mixed-30.example.sec. 300 IN IPSECKEY ( 10 3 0 sOme.naMe. ) + 300 RRSIG IPSECKEY 5 3 300 ( + 20181212121212 20161010101010 516 example.sec. + ENm4Dd0+Dx1N/BOYIoqlq1AbugLTxHLeNDyg + HXO8zpgL8yTaa1U7dtE04wB4vYx0v4SYpJF7 + rFafGsKaPEvRxCbbPJ1K6/cWReYq1droXdPg + YmYn2qKB+2rNqMhJsIGLhsFxJys69UJmoLoW + +5djG08e62r+UK4EzoE8oz3iGVA= ) + 300 RRSIG IPSECKEY 5 3 300 ( + 20181212121212 20161010101010 44427 example.sec. + kkk49jmaU9PcciLS1yAK93kLIVXoXrdm0MP8 + q0BKwm48RAwia+E0p8HuSNAgMrHWYkSJJHYG + QoTwBsMqBaL+6dE9+1woGa77Yu48+orUSC5L + 3Asx2tCc0A3ulYS9c9Sh5L3Uu4S8tau98FPG + VcijrWzMGN4qIh4BNVxJ+ct7AqSPdsOqK8aj + IfCZ4kUaUOYXWQeDPTfowhhk0YXBzf7P/v72 + navtsoeiAHCh7BOl502kQZ34XGkWNXnI4Kq2 + HmZ5+YdBVVQT87aVSDdZDvErWn8I6VLTaQQ0 + 8VAog0jCL5DHXpB0ESbdxlWr8PlElTe3eZgr + OFlX0SSAwEB21esr9Q== ) + 300 RRSIG IPSECKEY 8 3 300 ( + 20181212121212 20161010101010 48381 example.sec. + OLfBWi8gku1GmuWBRiMYWaH85HxHTfhbx+OB + tmzJ6k2cICoyqmJ7Uxrvbl21/Qy2evrQrq90 + X+ZS3XbcrAUN6vw6OU9cG88JeinMexRADRjX + WzaJx0JN32+9ummvyf+f3G8NtxjYQd5KLR5P + lOUv/rm7jHgcslEsTlYE49r+xrr9upoZdJ84 + 45Qy8mqjy3hcErT0X9jXV+5qscQ4Z9j679rB + eLQcLjQ3bW8IeRqgYB2+2PDUb6gcdAkAR83V + KBGbIwZeO7k82BIUSNDQIFq1IPP7+cFWdmFR + uaZlFWFgZOpSwiy3VIkC+lzktjzWsYUEymQW + 6f72cdXioDqTX2Tcyw== ) + 300 RRSIG IPSECKEY 10 3 300 ( + 20181212121212 20161010101010 1862 example.sec. + xj4OSCDJKYoJrSmmtJPj9Gcan9iXkliNoYFt + uKA+nBOIRGPq7V1ohNSksdW6fMIKEmrR0MwW + mVxxRuKPseU//i2QBCBzQBz9YbmS9/nXx6PP + UT8IOG592j8LojLxxp61oH0MB5t/cJUQ4ymd + JvVT1NjdpEj268TdaevjnQ+c0uHJVc6XLHxq + 1K4FaufpqFI4KDncMJ7EzONGLw0pSP0NZbtw + aWP9w2MVBv/pggNpS9ihNVMuEX5KjLsLVKez + eMaOdtS2kSt5vNLpwbGwtCRmQSSbb0lTos9o + opHrKzFEpULHqCTQ9CHoohJ63XlCU7nojX6s + 1gxQHC3ZQXSFhQCpSQ== ) + 300 NSEC sec-mixed-31.example.sec. IPSECKEY RRSIG NSEC + 300 RRSIG NSEC 5 3 300 ( + 20181212121212 20161010101010 516 example.sec. + KGljdH6WD8gODIrIGmNRHGdOlReJ5+aK2pxh + ACdNe/nb+uJpRflPywuYGA4q11I+6ufcLmB7 + FKjRcmbI1Mnh/5DqLNhKu7aszdjUx84/r4Xq + szLV8NDmjIyrYmNEiYjl4Z39Az91IFKblqOC + e8GTMkAeaVJRmozUpXHE0/3gd1k= ) + 300 RRSIG NSEC 5 3 300 ( + 20181212121212 20161010101010 44427 example.sec. + m09tl6HuH7v4fUkxtw8jCFRFzyVbBLkk0LvP + pVZPT/8g7HsLX3wwcD2h9dRkAdYDuJ3VSOM+ + tusDIHlKIcPfIK1fjSKv+aHQu3/dn3huRkwb + i+rp+ieNrTo66xHds7KzgR3kHtzQp5RUHoqh + K1ppHrN4yMm3KZZv7U1g5D/ED2qXxCupoYAk + UwRNgpocc3z9fjeaawtaRvUF+Qd+y6eCPU44 + f7sjbppSw4+Z6zQKPrsSCuIvs9lYaDHTf4NV + +/Ec8CbH7uKrAA8qN1dJ1gUQye9dFnES2VkH + tkAyReBxJ0EBTcdiLxf+MYHgE7JTlVILn22S + E61hzZPlZzdbHra2vg== ) + 300 RRSIG NSEC 8 3 300 ( + 20181212121212 20161010101010 48381 example.sec. + P40fI/B+2QZe63yXmyj1DiBjMixs2qTzFQsd + X+rlEvc4B2xqKjJyTQLSqqKxECXF469z1RaM + noQ0nWOXPOiQS+ITy1Nj0RwcwKBnCf4RZGyw + +0WUufZqnNfnptSUTxdp1Jh+F6AUAC+EBsTE + 6BvnBjXvpvowdF4X/izJ6DvbQfuPMtAHGVZM + d3e9DpSrDW7sh0AfB5Qc9XmNBnx5LhskBtJk + ZmoNLt0QpnsYyTfGW3zc3e+1o8CKRrxP5KR+ + nTIlH16IhLNGQYMi2URRSZcLgCROkvY0U5Jt + 7URlDL7dcu74EO6n6YyfszHLXEi4TBW5Rj6p + rH6XCaqJuB11JpDRkw== ) + 300 RRSIG NSEC 10 3 300 ( + 20181212121212 20161010101010 1862 example.sec. + MdeBeBKykG4JHZtN/pVHBM4v84pkRcTjByvU + egrKgl646PpGE9+sVjagR8DBIh12tjmQCVif + wzMmqWLAcwWVPceYOPSFn5A+rRTV1xUmDs5Q + 6CT84fUYF2tfr12eMkpwX0A3mEv1np4wMA6x + dG6QH80+7dJBisI09dwXWYnPFsJPSn54Ejnx + gZxVZ5tQPgDP9O1JsDIwfyVia4Yd+ZyqrC1z + H3W2/oraVZ8Kd+0oTzuP7U+J451WGwuQAyi2 + 616ddcs8PUDth4oFcdIowU6Xrv7AJkgYudEP + lFC0F2sFUQL/5gs1bCcseJcEar/gkYm3D6h/ + PLn0VINZFSnTYki6WA== ) +sec-mixed-31.example.sec. 300 IN IPSECKEY ( 10 3 1 Some.namE. AQO/C76MVA5WN743YYeE537SLNffRZvQ9yxo QqJP943gqs4QATtnJWHQ1SDWiRE2aXl7SJoy JAu7jaUTGKWXzStD2wpkBIJ1IZ+avxf8zxRt @@ -1372,134 +2023,94 @@ br2pQnZ5ul5NCgkhhcr26IPPiZm2eww6ougs ogj6kPdSSQYZYayHzVnl8NFQ9uCwbRTryepP zZP5Vd2t ) - 300 RRSIG IPSECKEY 5 3 300 20141212121212 ( - 20121010101010 516 example.sec. - CZJn5AslpFHB5i82KpADbin+ahFv+WkS04+x - ghMl+/iKWel63pNkn6ROWFEiLYiRRcpI1R8x - pkVHgoCocBQKioGtNRicqFzaiHWmcNwVLX6R - W6mFdErpEzP67m2+dg9hrpsQ0E8dlAj29FGp - LT5agAWqb+GL39advZ7+XeFYPhk= ) - 300 RRSIG IPSECKEY 5 3 300 20141212121212 ( - 20121010101010 44427 example.sec. - JTi78vBkBuGJH+i6gjjq/7aVH0V7Lo1y/1nT - OwJOaaQGvTszXtNEgnuaZWKRP7mmMMj/EDXw - 4pY5t7uetwQsnoyBfNINevwgBvEv4xPNGly3 - bazXmlPC9WL2pHIhH5OW5ktHs0n0C/oFxCcO - IVtqBSvylx3cwN7unAFF5jSF1zgMHSubRjZL - RzAwGQbpbPi3BXg3zT970wr1XIMsMnoU129K - Ii4+mgYdxitLeLw7/eIxTYYrUMPBOpDkSQ2u - k6GU+eqTXIzZCNhXWcXKnRe1CrrLkRtRwraQ - JlCXh408v0lLo6Em0b3gjYpWxRWyAmMz+wVA - CKoQo721i+2WURHytg== ) - 300 RRSIG IPSECKEY 8 3 300 20141212121212 ( - 20121010101010 48381 example.sec. - zvwNflQYyZDVLSjAGPb/NtE4D0vB48V17Pm2 - nz2Snh63bllu4iCZwvO87DEl33L7me446rxH - /G21XZoGz8cwN7ecF40SQUv/grdpqdMPhqCu - 15+irjwTF0vthMxKJIuMRUr8xqHis/1KKxLG - Wa6Rm28BFLfMKOti+o5wRyD7iB42UfK7dWlC - SRAJxB3kk42LchLGydC12FehBE7rJl8z/O3l - cULmW5UTB/4+AsNNQM7GrhGA/zvhrxGOGksV - 0ncFq1I6na9XDYq7zZZQUAbTbaRWt/MhVcsV - W8d1Vqa9XvfC3FLlyUZq2jjAv4VSupTE2CSZ - OCx9JAqD7fMWUJU7dg== ) - 300 NSEC sec-mixed-30.example.sec. IPSECKEY RRSIG NSEC - 300 RRSIG NSEC 5 3 300 20141212121212 ( - 20121010101010 516 example.sec. - p4fImnEiq0raswfRFbjM7d8CA6WhMtdIn7RR - AmGcesf5xwgXlNcY4Uu8ac0UxxlqeNcf5+5A - AIrRraMEOPZOAC7daWoRLFgsgdKqrmZYHMpO - VxWcuyIc+5XXIFvfA5tHKUv47xq9wjJD+3+P - mVaeY7/tyBAu4OYBAaw5WfW8020= ) - 300 RRSIG NSEC 5 3 300 20141212121212 ( - 20121010101010 44427 example.sec. - HXA5QfVNaSkandKCqFcvBg0TYwdnAywDzAS4 - McM11MXxI2AUnYnRmBg0+ambJRt67P2VYw4/ - 3JlQftbTLd0r8b1Rb3yydEv0uUcfOe+AXn9f - kd8kgwutMCNYg99TDPUAAjBk4cbMXsNqu+Qv - xRPboSmONUiJ8TaHSLzLnNAOTIKbdnmq+p38 - Dh3Xtfy2o9ZtxuHlqoldQmNHTN3opt3GJOO5 - Ia/8mLJurOe9J5lDMjhSZQb/HYLRCM/1CRt0 - C3TZnqP1RkOnSDqRP7petZcTWSsENjOFIBAL - V7uCzYIQWdeRQu81V9MYFp9c4lQ6FTGElKWJ - V7DQxTRpgjS5GkHu0g== ) - 300 RRSIG NSEC 8 3 300 20141212121212 ( - 20121010101010 48381 example.sec. - dbdl0cBXuuV0G3mX7P1aMCGrJY+JXVVTVmBh - P4k8hWEp0RDWPsNV2YV002L4vz1HYIJWysDr - 58IWpQPqy+MafcippdH49we4zLIWkstE0vEA - S3qWmymBnk/ZuhucDXF/HLGs6PXj0nw0h7Qx - /6Fwnyys+pAe77k3E35Zb/+EaZ5hwFgueswm - AwE5i94SUYATd0wljjzCcEB5ougB8epWmssY - azJ608EPu6wZ3rxkgvj+bZm9oj9jpujbWzls - 95fgDTJPn7FUoXySCwa+lB/2S4GfzoWsgjF0 - ho9zhNrG1hnbjWw4GEp8rVJwsTiBxrxIcMdm - DHHX0i9yF7DkxsDWXw== ) -sec-mixed-30.example.sec. 300 IN IPSECKEY ( 10 3 0 sOme.naMe. ) - 300 RRSIG IPSECKEY 5 3 300 20141212121212 ( - 20121010101010 516 example.sec. - Yn3qB+wu6No6XErby8iIjeIUWYG79xb28NWO - v7hveY+Z6/sKErALFM5pJCJ44ih3hINUdYep - HPcLh7ePz2iwdUVGvRD54fI48HTWMtj/dn1E - qp8SsHB90wHXmIeUaTPndDhHbTtLrs6+SJWL - ZyojgMongSZvbHNWisq2MOZMujM= ) - 300 RRSIG IPSECKEY 5 3 300 20141212121212 ( - 20121010101010 44427 example.sec. - qk0vQIuCA2+o9nLprjIyyUtVOZ8Pu8UDRBYK - e9/0s6VDQIFP1n81hM9ii8gdj1ETcYYEVUXw - g4STWkNiRGtOF9x2AiZwGumgf31169sFk/jc - 654gRUQDdxQnB+qHLX9HugTGZrSvsIR5WrFm - eLe264dsniLc589N5JXWHV7iE9zEMj9zljDu - rXwj/7FptwoxDyUt/QzG8RhVjGwRduFOHbd6 - fJf/tqQ/QI4yZiYoG0S1GkkaFERX7fJSpqxd - yI/B78KW31jWevGCdt7NsuifG0f2zJ5kkmUh - jCHvKi/yiji39sGm0kSlqtaw7Q47Rx0Ihegf - mylJPYx1cnzlibGVvA== ) - 300 RRSIG IPSECKEY 8 3 300 20141212121212 ( - 20121010101010 48381 example.sec. - wrzoKA22gia0sNq83CCag0ZjaraCbvE6Vi/J - 7qeUXAuKhS0ekuYZx7SWp/hLgyUARrtQvoRM - VQmuHON4rSbmsL4ds48IpeQqcP5QqSdhAXAU - fDZSln9hvWpZpJC2dFBgE4H6tjPmZUe+116I - De/67cYRpqF6Y1VDxVjkLPmN7Tzuyjf8FF5z - prvaq21OTMBu3sBRnfAhFPwNZHf4q7+t+Lnl - rfe+koj3SdLgwNkxAA62Dj4mMCdmUT6nfC/4 - wdi2NiJzlIyzVstprwiL/ZjueOHPyKJcdeDK - jR2f2P/6AF8//pCqTH2nmKGnX/nOHeKm7eBS - h1c0ZvFhooU9N+2DJA== ) - 300 NSEC sec-mixed-31.example.sec. IPSECKEY RRSIG NSEC - 300 RRSIG NSEC 5 3 300 20141212121212 ( - 20121010101010 516 example.sec. - AC8/yz3J6AdTfTvEy+VEyV1rH5fNfz1uxBs2 - m+OHMBUZf6LpUmqf3HMRt4ymUEzZ4TXUFun+ - BCRfuVl67ryfvU7Du1VIXaIjgq1NccJFPamX - cy5bvn7VfB/XgTYCOhkirPAo4bUEN5UyP90I - JZgfxjpy7/iSB7+Gn6rbefjRTJ0= ) - 300 RRSIG NSEC 5 3 300 20141212121212 ( - 20121010101010 44427 example.sec. - lewi9S8lGbimRUFnQDXb0SG01qcbNbDbkSb+ - zjyC/CcVBEYwwtl9+z4NDXp/tR/sgGZSHkeB - bnfJD+LcQ5/GFOC2xAhbebtFZbtuhMbI2N/W - oanScK2gH43sFgihjtE8L2c301cAIPjaLzyU - p4FIMeEowVVu8louVwACKr8kMQ2txCIjMJVo - 4GblPUhx7lSIQnyF+AiKBW7qiAmlqvchtqr4 - djaCWoXIjPA9Se1Qb5V/zdrjAav0x7nSoJvI - KaslX211RgodE7zlCb30bOk3KMmQ2jU2//se - 6VhQO/qx6jKFkK4nSV4jXYpEACIhY/KrU115 - qGNs9dnFv3q2ucCLtA== ) - 300 RRSIG NSEC 8 3 300 20141212121212 ( - 20121010101010 48381 example.sec. - WW29gBQhuzzVjOwPWCwXIeewzcop7BMtMjzQ - vA5lMYTta4EAemgUksP9aBoP9jZfFhbCIhjk - WuAEE72t74236wxg3vAOfBCVVL7WrhjcXmiK - euT2D0I5EfeWzOy/izl/NbBgYwDCfiYcJGpC - 61V3XFkKR+vF//LeXQdQqf5Lhz49AeOqW5yW - VSyWXi30DomFVM9m+94RUeefNq3MuZXa026r - ON3Sui6Jfy7P2L5Nm/k3ITnYd8oz5H8UYJHp - YwPc7uSC+Cu/sNpIow+eAneJt5TUj97KVxrk - x0eDIqLmwW47vLw0kLFZ1+69vWoO06xcNDbC - 4RWHAwI/K1A35QK0Qw== ) -sec-21.example.sec. 300 IN IPSECKEY ( 10 2 1 2001:2010:1::21 + 300 RRSIG IPSECKEY 5 3 300 ( + 20181212121212 20161010101010 516 example.sec. + UZyvsV9lD3KguJJfmvxJypmy+h6VqKOoLBGQ + 3pWpY4YOSZM618hSq1M87Um8W+hzA7HYK0bw + 1UDJrtTz7V6ohTe7Rp3q4ec1fGKLLHYM8OM1 + KoAwTSMWafZukf6NmNojHMGJ+auSMhB5xOsU + DySe1nmno7NuU45sakWGvg5L+zI= ) + 300 RRSIG IPSECKEY 5 3 300 ( + 20181212121212 20161010101010 44427 example.sec. + 0iXY8/u0b+OpgoxpGTbVtHmcF6ihlqs3IZXz + O5uIozJHxJABSjKKjGZF7f0BY1Ax1VZKvxJ7 + x4wSs5hyZ68XOUCD3Zc6Ec8VdUOPA9hZa7AH + U0U6/IkEcenLjCl3rPizpQIlfzmO0tbjGM9B + zCT4l5C7VfVw46O4ybmdXKm0cL0DTo1v2x3d + b3UWDeQlkYEGSCRXS0+GFE56w9EoH8/uS+Ir + cBfvULf/Deta4UOd2el2jX6izvkedgtWdI6t + qF3yhT65zXQgxmFtLNhgRgu3JHE8rNnTzmpj + unto2AYjwDxH9IjhWvOEQCa2w4GiwKq+tT3t + tFyCjHw4eq3tZSk3bg== ) + 300 RRSIG IPSECKEY 8 3 300 ( + 20181212121212 20161010101010 48381 example.sec. + I2VIZNkZ3u+CqOu1Pr3Yh3PQH/ODvbD9RS+A + +A8TAvl2ULfcXAKq7tcmr5WTL7k+PrMC4+OK + ojdROtqsPWtMi82iAkxkCULD9Xm9pVgVJ882 + NUkHgoHe+tKijf2RFV3hCGgpxqLjEvoVNB3k + mEH283iRRxbQYDIBVTaVtHZgLDs2LzeK96ha + NMS67/+hIVCJoXZar7HCR6TeurGytCG//Tnd + VuWerWQQLo7sjB2MRtmdjarFt4ZOeQmiS/Hh + O2gvsf74MSGSb8K9FJ32GvCT+VIT3iv2Dlad + 3l+i8iAiNyPhY3f3UvxvUQVBiHyTP0IU1sv5 + EcGJCXZqP/ssqvjRHw== ) + 300 RRSIG IPSECKEY 10 3 300 ( + 20181212121212 20161010101010 1862 example.sec. + KWizoHwBtTqYSl7U2z3BlcpS2Gvb6A0ivojA + OaVwhsiZ+v7/2agZyrAaHKCvgl2yq89dC0Hf + REprexspi9z1Ru37g8B4p/3MdUsK9JP6Gn7X + 8ajHQaqaLNHS9k8LsU0Cf05a0vaH/q8MmKxy + XW8cxRqsh/1IGvN8SUaDjlBr+OyRr4YqxPsj + JBp6HKkjrLQ1M0St2JBh2IXh8jqyrii6NCM3 + H+gCzSDlREqx+nT7oSGcLpw+uAeq1OJ/L24y + E+coI82NKozyXv69uDpgr0AMirApmyoeVJCg + zSK4RxOvYSv3isKlpqzIRWTA4F6Am3lTIw9J + jKmMqt3KjMs19t7pbw== ) + 300 NSEC sec-mixed-32.example.sec. IPSECKEY RRSIG NSEC + 300 RRSIG NSEC 5 3 300 ( + 20181212121212 20161010101010 516 example.sec. + ipQjEsGLS43Fv0UrNVpJU6G3kQdY38W8PKuh + VgBEPXoyHXuIcOrLhTATdnX9MC/2LfqQJooH + G3dwa3Jh5PFN2JcUYATP9NQ1IflqxgjSq2gn + WrCKbQI5yUCXRI7WLTXu7wihKM9ptBb6i5zY + rYU35dDKPFd3Xnu0LtrrrNX7kQo= ) + 300 RRSIG NSEC 5 3 300 ( + 20181212121212 20161010101010 44427 example.sec. + xC1thQOyAPxxYdZDoiko6pb41+RWZ0TZy4YB + zeY49op+rU0q1Q2R+jnlH6Tgbudn2NQpw98V + qvE1POZ9yo2YXOIQoaOaWkCTJT2AJQNNyiHq + R3kM7uer6dyqGwXn9l3Y4RcCzqdG5+aJlgNC + r9Vb3E/tMU/AyV+mz0O3W0fNPN/zZ7VcgyGf + TrD8V799AGx2sA/xa3h9cYBxGuGpSJi73ZpI + Ear1sUHcBYMWP9HEsJsV672ntIrXSwYkhraN + W/9nTHYFgsZvyz4K2TTxLy4etd+PS0+TndLM + Q12d6TuAXU3KLDmO8RQ1SXF84LshfDPV92f6 + JbckfOa8zKPsAklprw== ) + 300 RRSIG NSEC 8 3 300 ( + 20181212121212 20161010101010 48381 example.sec. + JLD2RhURqgRnBqnNw/W0qobtvg28M4qoaIKZ + VJcsKAtw2+tvAiGbFEgN6E7nAlSd6ei0Cj1S + tGefXx9B8p1hYHnC9eE/XTzjr97YW8D3DJ/3 + F2+PL/PSYENeNzd+otcHKZFUdV1+g9rKgXjZ + +N4vX3BXvABuVOQdYwdwXrejz9u/23Qhu9zL + jiuigqafYXygE317KgVwga7VVCMgTmPsDQwc + ri9V8Sm3jeklaUm/ISx9AQt0FwylPl1qNVHH + ZZhoyvKK7Wqr3Hnl+i0tlhoL6k15I7RER9Ht + 7CzM6WOEYKUAFwsfJ8govxpeCx1fe5ZxLv88 + g+h8Ud1P5zRIdkcGCQ== ) + 300 RRSIG NSEC 10 3 300 ( + 20181212121212 20161010101010 1862 example.sec. + I5ZgJ6QGF3H6T4GJtqCxIZVmOyCEz3dw28pe + Aiuay4yVo2rEDEgAVEc1j5jAHWqasI5kNPpY + BuIEEFfcEl/1j1wCYbpivh7a691MoWgWAbsP + bT8KM/PrRKiV95axgScCT3fsDQedtuJV7XH5 + 9nPbtf72v8t650ExblZWaZV7fZ4xUi+KINfn + Wn2px6hvmEIjlm0h8m/YRBu/ujzw9q5EMW/l + kfXp/5t7d20hflEPE3FyYOjc9elrSqBTvYgZ + nbFnHy6UG1p3w1eksjot25i8XGElHlvRYXOs + x7KG8l62142tPqUrv/i2BgkLSKN3DO0CtdzB + KrvBo73gvsVNsLghHw== ) +sec-mixed-32.example.sec. 300 IN IPSECKEY ( 10 3 2 soMe.NAme. AQO/C76MVA5WN743YYeE537SLNffRZvQ9yxo QqJP943gqs4QATtnJWHQ1SDWiRE2aXl7SJoy JAu7jaUTGKWXzStD2wpkBIJ1IZ+avxf8zxRt @@ -1511,197 +2122,93 @@ br2pQnZ5ul5NCgkhhcr26IPPiZm2eww6ougs ogj6kPdSSQYZYayHzVnl8NFQ9uCwbRTryepP zZP5Vd2t ) - 300 RRSIG IPSECKEY 5 3 300 20141212121212 ( - 20121010101010 516 example.sec. - h0+HIceO4TyqQTpyxId6XNOUib32igcXidZl - 7UIiHygAtYQyofUkMoYwjOuCTd5pQJe6jXyF - rcIslo9C1JDAyqcEewgLRi4/A2CEUhhmknxP - 2qJBlQJ9GiWAzK05zS5g1+Q2y++Sp0gPYJFj - VY8MXOH4C2i09/HKPb7AmGQHTMQ= ) - 300 RRSIG IPSECKEY 5 3 300 20141212121212 ( - 20121010101010 44427 example.sec. - ccAqjClDisTOEK5baQDYScY87iFiQlQtbWjc - VoI3EhQ/TUqNLwK0fIdJijxBoQtfDwhiYDHx - Ban7hV/LWOBTC93AeJDM6aF2zIODDvGeSqWz - a1z95di1mNcMLd+m/0wAc5VwscyaCSgID39v - Az6ZoawlXo7LZ9JLeekx2UXcMS65ngUM78WT - co42xwz7EC5YSR74roPBWb5Xcu6RjBa1YWrD - 5RCwwEyAJUiD/+1GlokbmWXNJOQbC/Y5b7Em - 2/DfFmYo3GvmN9mZEUSkPcXz88sazuPeMojM - JJH5A0iM7FnZtEAMho7+UGvjbOdZEUr5GpKZ - elwJ1748pZZSzeQUwg== ) - 300 RRSIG IPSECKEY 8 3 300 20141212121212 ( - 20121010101010 48381 example.sec. - dc9l4nstQkI6gbn9u78X4DfpJsvTqiswhR42 - VLckznSlTYn5UNv+pFfcAWx9cQM5HGx899xM - rzeEfXUegTZOQwCYmJWZrZsSrr4Lthigl8IW - kJ4BGEVbast5W33BjlwNACX03o4ysKn28JYQ - dhGB06g4Zfo7PNDKWMFh0Pbs2WjsvdTpk2ey - OazJ0FPAlGc3r2Xq7OVt27zc+iTZutgG8yFt - dYDuY8E525q7nlLwHAbx4zrZWyBRdg7Sw/l/ - EsPBDv2wOo+0XIpnc0lipOICAhwzUoKf37rh - Nb0TAyviQwWkhFJ6MRl7jxYivFHJQAWCU5Dq - E4zy9dwoF3zHP1pj1g== ) - 300 NSEC sec-22.example.sec. IPSECKEY RRSIG NSEC - 300 RRSIG NSEC 5 3 300 20141212121212 ( - 20121010101010 516 example.sec. - K0DNo+HfGohkx6Q2HJh6kLNEG+NW9rqVq1qy - 5i4NyR7yU9PCn8BJDWyhoG/t3EKHPGjc47n9 - ChyJi/XSywK05PiWptIb1ByL1NtocO9b64EV - 0fvi2peCm/f3njyOvDlPSJO7HP+vPZMKITb3 - heoiHXv0tX5wrV4VtJBhZcgxy6o= ) - 300 RRSIG NSEC 5 3 300 20141212121212 ( - 20121010101010 44427 example.sec. - SXlyw5BASyyMehGz6QUMAkvfExmoPQLHt/w2 - wgJ1fHXTI+SFZEV/8xeII+DjOvkUBoebEyxZ - 6PalHCEv6K6GnPbpJGNGhNwuuOucHx6FVoc/ - xmU7ArMwiZORhyoTec3izKavKG2T6mJk+rvG - Xy9xi4K2g2CE7w1anGdA8oRPag1SIwhhB3AX - Trxch8RptYk3Z19jDaHZUxCSZWrfh/oISNWn - ycdERmHrQw8BMl87Hc2cICMLYWLSgvmor19z - 4DYaqVa/IgDnS8kKwK2heUjNhhBrqOqxp3cO - 7M3bCbSadHYH1yVuv2+7rYfhfAl6clkWftvX - dqu8/+1eU3MHZw+6bQ== ) - 300 RRSIG NSEC 8 3 300 20141212121212 ( - 20121010101010 48381 example.sec. - gBq4IJtDynwz9Lx25Uu+BP0CNlKgUpDvIHvs - CYSVa8M2HvLury63U0YW6j1NP/5MMlr7Feky - jPEzMmlyXhn8WsiJiyy9pvpK4vVtVX429DJe - KwAtFjP29vpPZmjH0ZJqGTC7ojaBIE3GYiDw - 7kGqGyxLFHC64kl8xJx7CFQtA3eicKAkwB5R - uIu1d8lG3BBnjrx1i8xkdlRj2vp0YU8zjcSY - K27gYKX3uZkY5R9Y/zbwyV5PhNb5DBfLNzFg - 7lE28oevdOrlHQ/S2Tn5vEfja5bjo0Fmf1hC - ekt4+sOtUsob1hCOeaRxkYcVb+hWB9jQITNI - AibednFJmQEMr2Hn1w== ) -ns1.example.sec. 300 IN A 1.2.3.4 - 300 RRSIG A 5 3 300 20141212121212 ( - 20121010101010 516 example.sec. - Hd5lXR86upb7H8fuiGZ0kcoO5h9s4R9Y98iL - StU1pnXxG5KV/AxMlz5p3s4/u0gte7japaiN - TFyASUxbTc8w6t79jyYMLlPauutggLPgPx5b - 1DS3aFzrA/XKdTD9jJyKLkEgiYmHm1yRq9oW - U3gl2lF9kq/JTC6vHTJ6VdfR3GE= ) - 300 RRSIG A 5 3 300 20141212121212 ( - 20121010101010 44427 example.sec. - IpzshcLIMj4iWcq6jPh9fRUdHpciA2KsRhDz - 6F0SYMg9Baauc55pNMihqq5mhQvpJqGnKVHS - GEgJbEUNAxI8OBwewVyMgDdTt8R1NK3ZjFGE - 0VmtluwrEdKT9HyR45yVH0/SpFZeQTMKH9Ck - yPAuD5s53nEGHALkFFadEalyLOCSvrU1+j++ - tHCfa22+QYbh1nSQAdvzzx5jhX/mrl0Blj0t - v91hb28yoClOzGzJIQisdfn6xPAdEGW9FP9M - wENWiSO2bhIMZQNxiCpBCmAeMRdlQVPwP6BP - SsH64WQJCIGVPrL+xiJQXaIXx6aZTBeLQKB9 - RJQRDywk2cHNdji2Wg== ) - 300 RRSIG A 8 3 300 20141212121212 ( - 20121010101010 48381 example.sec. - vusjtNWhFBkOD/uIqtPS0tIByS/9SNIGDw+R - +SxcvJ5ovwZrNe0083ZOZ9nkt2+k7nWdsAw8 - MBF2Sb2EP966f4fxCI0HE/oygHvZJ6oqtF70 - IyS1CrwU8QJqoYsLFXBtprulN0fYvJk1KYff - RDfHtoae1Nmfn0tb375TBf01e+/ijpHdzlYL - rRF6eduUMgXOjstdzZb4mQIQ/UPZ18Ij86Q8 - CTSZ5BAv8EQNKPkblEUzB7IPiYlTTLIENx1p - 1lWIeZvrfufCubg1uVQZ30g2yOyexNaMT2Le - LVj00WsCuVcLRHEcxn5nQzBXZp8wZeVm9G0e - wFAsrFzRnQz+ttQXaw== ) - 300 NSEC ns2.example.sec. A RRSIG NSEC - 300 RRSIG NSEC 5 3 300 20141212121212 ( - 20121010101010 516 example.sec. - AzygrAd/tnGAb5LOZFZxs84u3VRBrHAN/z59 - e5uy/OBSa/3P7dFwlwfFHkCA02NFV+2oLO6B - WbwuK4hPwACrYZuJvw9rKa3rfYNZM1MF6fUx - FQ2p17NkSKetFR25G1dzXMzM1MlbK87EfBWb - ZXcw5e81JAvba8q6ZXCcXZz7DTk= ) - 300 RRSIG NSEC 5 3 300 20141212121212 ( - 20121010101010 44427 example.sec. - zx0VjSCfOb9ajlaLpLD8gGahBk/GYwT3J2AT - D8KZwlpCFN28TQRlPCIaqCBDlb35sTBiYU0S - 3rcJMWUGrUaDON4jmeMZZbGSASNVd+D5hcEp - hQpqN6Su8mFitflVMKIKdLnqACCXJUicb6g7 - 7SElAiesy1DuWEWMKwyyXV/X3bEHzmvdjIsB - 9T4wsCcElDQbVItnPyms0No9xrgZmpNR3UTN - yoA882da5Wi4TubusiYryzncZZQKzZzCGKZ9 - HSl+5STjx+nBvHL9ud8rLkimlzLHO5BEHrN9 - hvkzqEQkmOer+15f3iQtFoovDZhR0Qp1Ag34 - agn/nh19LtgqBFT6pg== ) - 300 RRSIG NSEC 8 3 300 20141212121212 ( - 20121010101010 48381 example.sec. - x7P+aGsZoDroKh/AaVkBzmXLIy+TC7iUzUAS - M54UOWoGjlpU5gfyo6kL41dxRk2A77yYKxN7 - HHSB/z+1u2IK0uXL/0teTgcUJ/yu+wTC21Z+ - nKc4lPNr5koIsEMgdags9Coa90rMbLp8Nk1R - mv07wjykShruY5o7q9sf+EV/slSFcUmCXfsb - zmzfor0kUrwliqzgNPpwnI3eNIGkjUF4wW+u - t1c/9Yyv25a2ViFF1V6I1BvNKFtVAkRff96p - i2LPWjaH3/ISi+8T3Um1d63ALW+M6hvKdbh/ - nrjG098f97DWL2+VrI+/bBVi1GPmzR9bdK+p - Lptct6Fg11LSqj5QJw== ) -ns2.example.sec. 300 IN A 5.6.7.8 - 300 RRSIG A 5 3 300 20141212121212 ( - 20121010101010 516 example.sec. - E99YjCcD6e1mGnx+Gxj6pFw5/ISt2SGlGoOb - XHVaa0EWF4L8jZJGgzs1P+shE5miZqvhgGMo - aUZ1RPywjUBZ4NOxZrXOIutPMi4DTcH649rx - HWhbjgBJptfYVGI3fvnL/JustEQxchOCamdi - ohnkMS8K/+9LdNcVoBbXmd2xSWw= ) - 300 RRSIG A 5 3 300 20141212121212 ( - 20121010101010 44427 example.sec. - f+xyLGM0FkJuvIsBsiOpD4S54PC78wJRGHlJ - HGeOO9Rt0ZcuFP0zqqza+8J9ddYXxzAt74ut - QhYxhoWp0Cwv/Ah2ekgX1c2SHXB7gaWiS1jm - QInH+34hG/YOfDzdBmEvcghr0SA99mfSJPcM - iTdlP6ripnqhjiaILF69P86Wp8DJgGQXeAzT - bN26F+3YePj14TdO4d1W98nMolx3ASpE7Yzk - L+v5TV86OdwnLB0qOsHEwch+NvglXLS7mDn2 - XljFd8FX4DVElTTGaWW9cwLBwwhZpz6VMx4G - mQw/nAEJ7Kp/2JYE9ma2H1dPoH7Yj/z/zRTY - +4bgonvmTaVyg8MFVA== ) - 300 RRSIG A 8 3 300 20141212121212 ( - 20121010101010 48381 example.sec. - uTBym8cXJHSj7GxGFNzqX+NL/Ys49a36kWLw - lEhjWH+z+CdEBuHRIfCQdPHe4XrUNsP9eWg9 - TspzM+g4Fd/dh8Jz7WRQ9IEnEU0qnt7HagQW - qfOsxve4ny1Pjm2oc/RICfsGTBJpqL5UwVNw - u+4bCr2ZdJwz1VZeCaFQIG+iuaAWE/zQ+xJW - e8mGvPM/VTCb3l7ZXePvE6ej3XFHfGIXqr1Q - sB/c36gw4bkFajA9/U/Ni8Su4MjxkkvZnG8n - aT7YrHXocZI0GyoQJMk3IVERc/khN00P6NO4 - 5FQR6X6U32tBn7ijOHmdd+ldt4ckdcqZB/oH - 4yjM5N+K/gt2/E4puw== ) - 300 NSEC public.example.sec. A RRSIG NSEC - 300 RRSIG NSEC 5 3 300 20141212121212 ( - 20121010101010 516 example.sec. - ldRLarLBSF8qLKnXpiWUK03lLnJ+OaDnWK1c - 60K5LY98IJSuHHuMeVw3t/NMJMUjSMBz29Ih - AJMViXc4BNr8U5kUryi3ryRtfc23PbPLGLK7 - s7GDA2Mjd2dxx87MZwP0ER8l+o3dFjwqUBC5 - jWfupB+Z12AkZtINb/BR9lAaOWg= ) - 300 RRSIG NSEC 5 3 300 20141212121212 ( - 20121010101010 44427 example.sec. - fuH2T2IDBQ+QG1zc7cPrIVSm8Wk+phIDUhUn - rT6yYtpYeAfzsDzKlAC2iqLLXIT3C4ydda7P - vNlqS0W5Xl4SkVp3M796q1rOskBK3CqM/GvT - zRcFg35bXA0GgclMKfT/N3hp4ksWA1nQokIN - oeYNY9ChZVjEitJvxW2XdjxS8gWFvHpSJvr8 - Qtk8/w0ghYl2WwmhwswDfQ6z//dgFrew9JXD - to0UEMkloBOFpmTJY7rtv5+52nRMw5wBnrgd - 4cIAeZ9Fy0QNZvXvk50DLBS+KpSzpHIs55n2 - jSLGLP6iTYSYJp3EbprqgqHrcGqno66Kb2SJ - fbtPtQo01WJn7FnWbw== ) - 300 RRSIG NSEC 8 3 300 20141212121212 ( - 20121010101010 48381 example.sec. - imdOqDzfX3ecLJahnF8nCpHIAvL95A403DFb - ccKYOYG1cdJzyYyINOcWx1WluUxQRT5PQ1Dp - 00vM5SGPwVljomtJEfxYi1uuGlGN/arwiL/L - 7bdC0TtVBBuRsxp7XWUeakJqIZNfKdA8NabR - W9+16sdD1qQKrHZtmfyA8NRd9WuT0XuUqp9i - KsMH7CvKY9X3fiym9bUz2otu1ZT/hvm22ny4 - cGQSHyZ318HoTVmzuS0HUAtT4SjInHdZOrf/ - 2HF+AMcF67HAGSQnmFVXJmpoZDowGt3HzPQ4 - ztt7F4k6C+h4kMqeamrWmt/588OdfL1E+rAM - AzXmWlHrVgaMQVw12g== ) + 300 RRSIG IPSECKEY 5 3 300 ( + 20181212121212 20161010101010 516 example.sec. + ucuaYq3+riPlg50nnHLhNfopzI3q9bPyu/Hp + OVxsp+Krmzjfxqnzr+XDVLquFQJoOFw/D9nJ + /shPPjd81rHiHVZxLpPX9tzV2FMBv+vBcX6C + /3K6WrL1qEejArcogPHrM6hdNdwEORueWq4W + T+QOTHIagvn2E5gvgu5QJpX5TJ0= ) + 300 RRSIG IPSECKEY 5 3 300 ( + 20181212121212 20161010101010 44427 example.sec. + P/gQrVcBfPomBi4TtMOPgj++Z9rBza90vAxO + 57PYV72687WO+WOz60sxs5QH+NwfSYb9ABjV + 5Kv9W1Av4EMMBSXKM/Gw8FiPV5baB21MaHjz + Qrf0LFmUWoDzEvaG8tQuwwJbBxvU4vIPzcO8 + ngwdY+C1UYOf4qGyMeZ055wKyk+ZA9xLO7Ag + sEBtDMe28H4zq3T7WI24wwz7nj/TNf44DEpG + +KJNVt76i3YHGtZKmtdEJ19zHMdkPpsGWZBN + 6FO66GXJrYtZtdssmNHb8dEMm/JhXt+0jz9Q + lh4B3Ywmi9cyj4AsqMwFdNhXM61xTsokahe5 + 0tJ20+Ig8aOWGwCUwQ== ) + 300 RRSIG IPSECKEY 8 3 300 ( + 20181212121212 20161010101010 48381 example.sec. + DewU0DqTaoYReXPJ1S+/EYaPyxyZFj7+hId1 + lhDtLSInAut0p9KaJZQSIJ3RBpZVJMoozoO4 + 3HmA4CMgBbwIJeGJ3AhaGEPLwpTDVk+PWe4U + SZoCdkK7snkyABe72NQ8sNO6FXnsU189WOln + eQzRKU00u02qOFX8yRuQGaMtk4KV+Mw9FA0K + r8RFTiwTn7V7+8r16uekK7jUcxYhCDvp6K21 + jOiFxPblSl7GlcIFAKOWEzh86KbcnvYOovNA + P6Izq0NmEDspCCiUoKT/1+TSIqn6coOivMMw + wI4/xXTLc8u6CK4XfMM8ch+OlKpewRfXneSY + VyMGz/F9huAhpg+HUg== ) + 300 RRSIG IPSECKEY 10 3 300 ( + 20181212121212 20161010101010 1862 example.sec. + cXIFojsz8lrfCktQv9cxZZbPXULytrRYyN5L + A912WJz98UCrneLxgcqw7/rTpuBqra77AoUx + lz6+qPqxQ6DWPTGcyXzfgw9XQzUtHrqsRd0f + 8E+2y5+5+8Jjc45+7lkNa1LzAWCAikZwJii/ + OhU3iE5nZeXtUPcrztbLHg/pkKE2Y4NgE8uZ + VkK8OfGHDve2gENhD+asBOBR+h9VRaicGo+u + B5TA9G/SNSEHbkJGCp6e7XFVaCg8tf/z3o6V + Yj46qtjhgwdCof9ajXQ5mM/za/JqQmmWIZDO + ysFrEDtrXBYFfJkVz1YhvbPkodDdJkW5zOMJ + epBdq0qS1tsN1pvK2w== ) + 300 NSEC sha384.example.sec. IPSECKEY RRSIG NSEC + 300 RRSIG NSEC 5 3 300 ( + 20181212121212 20161010101010 516 example.sec. + Xs1Px23rT5bBoLza06WFUJZkRkElWHQXVr+l + 2JnIlobHOLhT7cjAIvQmSbwxtF7bW9b96FVY + ZoRgBJjvn//nRbs3X6YANeWBEfVeBQxrffWp + 6puGiXbCe2RiFPNJ4YXzltcuaNbDi4jYb3KW + YTIkjeGmi6AMQmHwGMsebOnZlU8= ) + 300 RRSIG NSEC 5 3 300 ( + 20181212121212 20161010101010 44427 example.sec. + Q6N4jEM6yO7skZ5rt5KnDhmMzcck+5EYu6mr + 2kEiicgbeWFnzTg3wcCrnW9KPXLGu5fH34Ol + kIj4Ke6P7ev//k/ygscI8KQAmEKH/hV1cOhL + 5vMamczhrVp0Z/V5rHc5kIWOJMRo0tQ//ORV + alrHTS+itAdAQzF9yR1rC1f6nbRXQofIO2K5 + TEWnV6Nwb55ZZ8QZVbJbDxWOJz/bIRquMlJJ + JUfB1b5TRLqTj2jvqJaiSBVXV643ZucAfOa5 + B1UQnoxWzakMFKEkBRirxr8bw8PXujGu3P5D + wNi6aquMAj16nhUow8T7AHJBWvMo8X+pNXTL + Yf7RRYjYTSr8a8Z1vg== ) + 300 RRSIG NSEC 8 3 300 ( + 20181212121212 20161010101010 48381 example.sec. + ltspdDOlwncTQ+Gtr4OPq43xdCSnrkGlNvnE + vNpgNCI5QXYdythuOFnVvdhOTJJsoo3dVoV9 + N98FHLqgCJ2gjtHqPCe/ZfqsVKZ9BF+DHuUU + OY5xNooQrWkLxFcKbSwfl3fJgFVqy+eyw0Ii + VppS+1WEZhmhI/ib9+kBpd6/eYJkAuoVAzpJ + eXbCK9SUMEATx5+ELQtCNyS1qTMVJ+I4+I/4 + hpkiCWizgmx0miZhWpWMmffkq8RyUF7NEa0C + w9tj+Ls67bFJkzFjPXZa1YWBZcfYCWiGRsdo + EzqPW5i78B+h1NECW8tVIHPA8MPZz1dTQUNM + wPE76HikvyRfYMewSw== ) + 300 RRSIG NSEC 10 3 300 ( + 20181212121212 20161010101010 1862 example.sec. + uardZlGiJG0zPdms/JRd0M20177k5W2Crf3K + zVFlOT0//TjgJY7H3eA4rW7jQXcovVxaELFp + NovHObB7mWyNgCsQGbY+RT1eVGXgf0CuFtVN + kSjecmt5vIsJJmEzcBCR9M1hpUOj4k6NERuI + ott4o8l6FKqk9yu230fj07HAOfpfaRXTaSes + Q/rGzNOj393KEWTDZFjUDMz7nkYM1Vhrg0W6 + ooGvJIqdvgB2gWQ4j9ehdBAqsepGixFUn2oi + Gn23iozFGgtEOlvAs+2Vc5UgsMyu2ekuh5kS + NqhYo7U0X2aHiyEcGRCc1y0/X5l9KiTYIeP2 + 1RgtaE5XClR/mPxTMA== ) sec-12.example.sec. 300 IN IPSECKEY ( 10 1 2 192.168.1.12 AQO/C76MVA5WN743YYeE537SLNffRZvQ9yxo QqJP943gqs4QATtnJWHQ1SDWiRE2aXl7SJoy @@ -1714,70 +2221,186 @@ br2pQnZ5ul5NCgkhhcr26IPPiZm2eww6ougs ogj6kPdSSQYZYayHzVnl8NFQ9uCwbRTryepP zZP5Vd2t ) - 300 RRSIG IPSECKEY 5 3 300 20141212121212 ( - 20121010101010 516 example.sec. - Bp3Y98+B6Rgsy39TcRw3TPRmbXBGGBQTaXvi - oSywo/qBfkfoJgRYSxq0SffMHq9AstMAaoqT - VY1dSGloMJeF4J/VV9m5XWTtLoSB9fPLLOM+ - JFYHtpYGQBLrkDvlLR0mMyiHLMB58YJ4qgVY - /swU//Bmf+ivf3OZAC9PAFJmh6k= ) - 300 RRSIG IPSECKEY 5 3 300 20141212121212 ( - 20121010101010 44427 example.sec. - TEoklx8wcff5wNwRdU49/WvfLb6V/NiVbJuE - 7oWtSL2Djp1w4/Mo+p/mLk/UzcbQLxBU3TUO - jOWKsBxUrfhIn4O+6L27/7fKXlK4RbTsvWBI - RhSlj9/bVzpJzHZY86BNWQLJ2XJg13foQkLh - k2rm/s4lLvsdCJBhhf8yqhl9YpabrvvVKs8B - riGfZtfJRq817quPoG3bEHj+FS3SlrSP+wVX - aDlGrLJgMs2Jdo8koRnmq2bC14o7fB3Sb3C1 - NqTyoVv4y4ORrfIUVfPHto5U4BJm1KNx7/6e - qlP4BGkfYIseNRRAc0YHwTmY/qEh5OXh1VT+ - hHzexvbXkSdaNvsFDA== ) - 300 RRSIG IPSECKEY 8 3 300 20141212121212 ( - 20121010101010 48381 example.sec. - oKaq8JJMlTF6r9L9UypicA5tJ1FZ6lgEKXVg - yRjHyngziDDwetCumeu0spZ2gIYhlZ6+iO9e - bzLyaisD2/cX1TTwtHpOXdnLBmazdDK0N2Nc - thodwl/rn3Iw2IWUvArb7NFiM7G7H9XEy9Dc - KPXYj3NwXlbx45dzlaWcfeOcrphFdQfjqch7 - WiCpeGoF4iWYCdwPOUXkLmETwzn16x8f7t+A - 5yr0ou8EuNquAvPFZ7238w7g0K+jJAkiPq9u - PDzPEqf1XcFqhJtHgfOWSYtVY0BVF8gKmmdJ - iDmEoHE/u1cuaUaXw8u1e0f+mqahIykFVXLN - Hw1SuDZ692Rzej0JkA== ) + 300 RRSIG IPSECKEY 5 3 300 ( + 20181212121212 20161010101010 516 example.sec. + sp9cM4vtiPCYR/q/zjEFQMvp4Lae8VwcFoBS + zVP1vbXrfLGjECmS29PS9w2EuSgG65ufsjsH + ewjCQxXtbhS3GbkqW6T+BczchuTbxVPoeiwJ + SpA1Nka3LhheDRznREFNi67LFe7T6WgqX9ji + Fay7JIEKjO+dQcZyeFbPDn3GvSw= ) + 300 RRSIG IPSECKEY 5 3 300 ( + 20181212121212 20161010101010 44427 example.sec. + HH0l3riJtHnVsJ7e5mlYEP2K7gvsHo8H55qb + k0itDJkpeCwnIPuXB4iOnoZYtcwecOTES3ir + 71J2wcdZFXp/ZDpM+u5ZxRhutSKU6kDk25ug + k/yl/nNg8ea++Bzmf6OB+tTZ4yaCySIy5X3R + 7uIDisCQ5LJ3wkYCAP8z1h6gMdkJjITHa1+P + hsGi2x9QuDOUcxxOPTvmLZyVdgnMN3K0ViUb + PTqVqvj5dn7pOLreyQve4/iwaBfxlUtsXO+i + wtzsyhb5Bd7y+1vHVbxvKGGY0gIF7cKovgkp + NDh75Thkrg4oMJtTrqDRO9A+S0OtxQcN/osK + FRxby5ILfQAKeN8oSw== ) + 300 RRSIG IPSECKEY 8 3 300 ( + 20181212121212 20161010101010 48381 example.sec. + flRzj3hURIHk9DLH1t7hTsOmyY4DIlTBP8qF + rRGpDnjsbyFBw2+FQfxWaoqAc3hbaYZXyZ87 + r1QnZczUZoceroe9Y+45dMhy37xgtI0fNMC8 + sKCAX8Ph79yVdhekiBYcWp7XZPjKI3rP2I8M + OrOMhBc0OYKk+Eo+RWPdv3TI3Fhbi70phUPV + nFJAkDOVdusNwXwPJDVFBXVxT5yvtkgCdlc4 + nf/LYKHHnafWNxEhnnnuCR8o8y0PnnL/sc5D + U1JFg9+nZRcgIhqffjZ4xOhCkjYYFnQ/1SCR + K9u2F6XChf0sZlSrl8BYw3VjGyYRxM5X5R1W + VunDRGfcKEVeJbtJug== ) + 300 RRSIG IPSECKEY 10 3 300 ( + 20181212121212 20161010101010 1862 example.sec. + F8yPUuB27JKYxQS9NOMLHulFa9BUPUXfVzum + paCTXKJWp2YjOhoOwYj5+oNzelYqhiB5Cn6w + oG6eYA3MiD4ZdEHpnw4ogWTN/MNVRIMoMOKx + XE/iwM3QRSM7I++0eaIV16VuAKqLukJs3X7O + ETsL9snQuMl+qFGkchJ/kGh5+Zgk6t3shsPi + LnPIBM16Ts8xyIThJUrJ/mpA05fYx+ZdMyby + aJCRAPhUzEcxe0c2scMyHTE0clrMGDdpmLcE + ensARJyNuLIT+ikbkGudHTxNqgwxQ+16fZav + ERlPx9Q1pSMFKtDFfyaqnSHeYBrB5PLijy7d + rt40jwVeWtlVOGr27g== ) 300 NSEC sec-20.example.sec. IPSECKEY RRSIG NSEC - 300 RRSIG NSEC 5 3 300 20141212121212 ( - 20121010101010 516 example.sec. - AkRa3kAjknF3xBG0FiCOWdgvKUXTsjJQYZ3w - vH6hKtIw6iJLIHXBuw8ip09IXWvaYxYZboNV - r4M4bsg7dOArDvwWvKxXVzY1qLv/l+CzpWLF - H97Uhdv8oOvgfB50Va6zdwnm8NYWpSyZR8Sp - sUNRN42iDIx68g4DC0iXY73l3kM= ) - 300 RRSIG NSEC 5 3 300 20141212121212 ( - 20121010101010 44427 example.sec. - z9SmmJ/i05AcUl2tl/kWmOFrScWGIErE3xyP - K6PJs/oFSH3qGsgS14Cx3nqARFkQujuxIVkX - H1mtu3uWnMa5q35cVgBym3ud9BLPtQDx4sGI - 1bmkl5xh3Bi90xfx5fz4e8ziV7BGn7mvEKSl - l/ea7Gfa5yc3LmPUUbRHrHYJujuyX+d46hS7 - KQ/haDf9shBoXt+/IWcQBT3azgwEZuiM+Csf - uyn2YyXxDJZpmzfOCL5dO/Hjh7yBAi+rc4jL - UdDrfplO2L3JDSXnY5abOwADAqbnUS7wUt9S - 3EuGrQkmwDapvcph6dx5LXZRbsMMcJ3FwSJR - /rTeK+ifClOZqxqbvQ== ) - 300 RRSIG NSEC 8 3 300 20141212121212 ( - 20121010101010 48381 example.sec. - GIjekPGJYOhERvkHNWc9eHrhjjyZccZe29Hw - MEgxNRnoGXrPEscbrR2L3JX0BqGdwp4DzoTn - ho1sbUQ77W0TaI12r+h0/jQjVlIvBgFUNMgT - 4myQiUK2ubBg1mMjNkq/QYbZmgfuLahPXor6 - UmefhMkR8tfzPJT9kBTxtWiEgbuJhwMGydPZ - zRoc9x+iH9xDu/nY8HFKAKmzoDtR/e6/AlPF - SBeF4nJe/YdglvNKeDUl4QKtE2spGnQlhvaY - eR9saXai7ErBF6q8oU7Bn0qDz0gI6qMFzBg2 - IoJDqOe2PMg6OiNIm18Dwab80SiPggUxPhH1 - XFwi/+vLRM+P30Lszg== ) -sec-mixed-32.example.sec. 300 IN IPSECKEY ( 10 3 2 soMe.NAme. + 300 RRSIG NSEC 5 3 300 ( + 20181212121212 20161010101010 516 example.sec. + P4JeTGEPJ0b/373X144T/ZU1TzwnnLrUvsEL + l9sR9gT86yKszFKMwIvjBtY3zMvYwTzVR5KF + DTEf0xTXK1SGbXzHc4vLtz6/qRtwr7efaa+7 + kkeEt/FZ6r++YCUYF3pJ62VRYmyjJp1aWIn3 + 64qXmpCbXLCTTtugcSmcjK1eGn8= ) + 300 RRSIG NSEC 5 3 300 ( + 20181212121212 20161010101010 44427 example.sec. + s6+Evh5RDlAvlfTNNe9++eRiqH4G8F59coJu + vFxHznIuDOBguVPmvVF62ESw+xgi40zw/QCL + /Qn6y3tWEVrIvvmzNno97ZZ2r0hafRYxug0Z + GDweMrck7Ax0a/mfYyrKII0A5xUZP0BNpNGo + KOq9DKeO9M9h3rOkzUt8/K5U1GUjpb0trpWC + mwyHpP93vFS6BVzvtwVjxOm4XvX7Chzw7W9S + SHN1QLOJCEOAdc3+EA0h/aqIo7Hah7DXWBOX + esGcKCEJQfMwuiHQG4u9bLUvyd9tTsiA1J0S + iFuvppcsaBgAPw3f8mIvMXGT8L9XXppUl3MC + CUvkRDk+GcmXUOvMqQ== ) + 300 RRSIG NSEC 8 3 300 ( + 20181212121212 20161010101010 48381 example.sec. + vcAtprqLVI83SUYywC/qG+ZGOXbif+uIti6K + 3Nr5NzTRo9ZrkwrmnWMQPirkSFki6abodNhQ + LNIWKjqpssw47wwjJ2HZPLpjGd2VWk0D+Iiq + fteggBTkVEfw/mJZ02MUejOzBSVt4pW0y9BU + Gwr1461niz+v7WUtYcLUV3DWUwZ2nmXE9qWd + tC5zzfYBJYEnkTm7WRYSrOG2GKLZIxS/2D+i + SRrY+KaL9hBUcWusK+vFJ3OFEaq3RHOVCBpG + +ZyDAVSZAgsn7ObuEiLswuFD753b5ieteBfV + 2U5inlw6bHGRSctaq95TMiqKtgbgKyWaDyAN + DKaBMdRGg098GH+zZA== ) + 300 RRSIG NSEC 10 3 300 ( + 20181212121212 20161010101010 1862 example.sec. + L4jH5AxKcqyy8U7Di0m7MmmosO9e05fN37ZJ + Bwkmg1Gf6k3Nv3nK+oaQyPgusHLnZAO8/V8m + LY392PAo6mn5c8Jq2wxZFRV4splx+N6dGt5m + bdaWZbUNqtTKgvfJhdPJFIxsJrm/c/iFit1A + LFyQnRXFtZJXlH8+akFlYMwNxiY9tL9vbNhg + MkjB8kKj38mfZ2cZB4/CN+bFyObjoIriF7jh + MAWl62M1TA60zdmCSRGq70ACFZ1ttJxE47mh + 35OjlitMeW+9q5s8J7mIq+z8i7Bt+zYAivVx + saaJvKaKpXDMit1pnJ0W7UuAGGD5YCixFKXm + esrszfQpnoX8JqWTow== ) +c93f1e400f26708f98cb19d936620da35eec8f72e57f9eec01c1afd6._smimecert.example.com.example.sec. 300 IN NSEC delegation.example.sec. RRSIG NSEC SMIMEA + 300 RRSIG NSEC 5 6 300 ( + 20181212121212 20161010101010 516 example.sec. + jC5HX6U+DvUztGWPsCcqzRPGCx7618IEcZnZ + AXNH3Bs1HgTnP71z7+H5d8Oy7l500MOEA6+M + aJ31XH9xYUfrcE8l03i1Fs5qynB0NW22Knm6 + I9mipv1L3Z52OPRQdgQGNzOEml81fopAm9u8 + B6DZs141OOirem0et1qfozSnCXI= ) + 300 RRSIG NSEC 5 6 300 ( + 20181212121212 20161010101010 44427 example.sec. + w6ukkiN/1Z9sH+8stG6WDsem+0oF/Vd8aD2y + QYyP1uX4ICjgYNDMwUDc48v5zJU4zsT/IGXJ + zSnys7VqjawHb9j6TouvtaW3lFTC9/Lfez/2 + SeeKqbyWCJKQzMIo3YoUG1V8nHbOb7zDqGsk + 6QFjPpy/uArLudiIezdc4azqud+JUpDhh80T + t7fHRBB3mGTn1HVziwEJiQ6N0YiZEzEEuU4q + ltgsQUhwOgbM+ZzKc0wyYeI2rUteO9IGOPgk + PBMFTZolO08FA1z9/8ZtGlKvel6eHg5HuXn8 + WjfEcj3HPNpE4XFN/aKh/P5inuNocuTZeiUQ + BzRwmiwjfRafwMddpQ== ) + 300 RRSIG NSEC 8 6 300 ( + 20181212121212 20161010101010 48381 example.sec. + Ro2XNWTeWt8KuDq6UMwWkcQU+NdboYP5VoG0 + ldzWcRyMPGj1EOOT/vhDaehi9wp843nty4bt + jIGReezourFpjHBG1TkGXexqLgx+1H74Bl4j + XMs9DIKzFlXOkk8W554NG1bdQDOlrbtlM8pL + zBO7sI91WbhKpJSABJR3rksNhDlwt+HzbN0G + 58+tiH3YLDdEgzs6yBPtkJTVp8N22EtEmesr + RppiFOSPlubRZF90c1S44Kw2fBSpYZJ1hdGL + NCx2fYO0e+oOF6scvS9DRrxnHyd4PwYfQDyH + R4UcoVchhIbh3n0bi8T4F7teUT1LAYQadjpW + KrfRqL8aB4nzyUT0sQ== ) + 300 RRSIG NSEC 10 6 300 ( + 20181212121212 20161010101010 1862 example.sec. + Zr1faE3PrEg+05hjB0Rrkbgg4TNuR40PSBIc + 7iK8h7ItSP1hhAdUuaKvLAscHHlxfu5OR2AW + GpsKIa3LSwdD8eOaSBgzmTCS0tBXrhtoEPn3 + e/sFB4uuOyo6NTBHLcbW1d8Fzg4JbvFHDNkw + P1sUVUcy5qmaJeKLDWAEwYyksaigvJXDYOqf + KEIYBecpm6Yw3Cld4weJBtulA2zS0i5mN1DL + SqR/ML1etHNJxOJzRE3ps9IVaIlQye4YGFl2 + MaXmI+yS4fvqyc15fqnduo9ZO/Bo4Qb/rHF0 + rdCz+sasUPqOvkEG1mWxDiWtMwQH/l5qXPvV + 5qjTYcLhRFGHPRaOUQ== ) + 300 SMIMEA 1 1 2 ( + 92003BA34942DC74152E2F2C408D29ECA5A5 + 20E7F2E06BB944F4DCA346BAF63C1B177615 + D466F6C4B71C216A50292BD58C9EBDD2F74E + 38FE51FFD48C43326CBC ) + 300 RRSIG SMIMEA 5 6 300 ( + 20181212121212 20161010101010 516 example.sec. + rgcYP4gQoJrfpOnvqi/eJ8BZwFy7UHQhoptr + j8lf0hnxSPAytI84DHpse5o5E3kqJzfemhzV + H7B/JZcR2/ELkaBM0HlVLZ2Hj5B9sUtoZo05 + W0019NkcsSW42KX4g3XXyniwM61Ibr/NtLvp + xxZkGpnECcSxdKvjYc0Qbkbjwrs= ) + 300 RRSIG SMIMEA 5 6 300 ( + 20181212121212 20161010101010 44427 example.sec. + nJQgbeNHvf1819+EGoOqapsmoPdB+rKscTp1 + pT260UL4EdvWGeZKuowKUwRHGktKkbk8yjwu + eZWH3VedfFUYSAP75IR/jZFQy7bSRK0/u+iV + uuwL0Rgbl8n5mGWGJk7/lyiSosfeYklKeBu+ + 4JcO8wIjMSpb2+IgY3VEO5ykw66En/YfcM/O + OXYpOAiHL8l5kYzTxQYhtquAZtw+TZ89CLiY + B7Al2KvM7M6fh7jk84Q3sjMQbUNF3MI2mkzn + xfTzZ+gE5D5FrKtMSE2kauVOvjerDsUUz8Y4 + O3cp6gldUOwSezlYWA+T84w6Phh9vMUjEBW5 + 536uxZaQslhKqXWGGQ== ) + 300 RRSIG SMIMEA 8 6 300 ( + 20181212121212 20161010101010 48381 example.sec. + S5Cs6tXyQ/3d53vtCxPuVi8b8w2wKjK4ZFNS + ttOHnIDk1hV7xdAIqcbjyRBQjowFdp2huIBP + ZWtdNoEFvUEqWTzl9jU4eapLmyAr3HzLvJsY + Ajajx0BcRyT+gf04UOe+lnHbsbh3/zPCmqs4 + 3aYQBnHZNnR+hIvtWYE3sUHQw8jFB9zcR/0a + K0MGO4uamGKMI9ixq6bO5YIZ86hROnk9T8Mg + r++C2ZI6e7vQrjqSuU/0c+3k1f+YucX/b8N4 + 0rX7rdsuA97Yw4717y7srrG2eyuc+sBlfHD3 + fUS5ZNAF7hCqlgR0PaPJyhrx0VSDW5L8hp8y + Yv5jse1Pj6t4zJrQlA== ) + 300 RRSIG SMIMEA 10 6 300 ( + 20181212121212 20161010101010 1862 example.sec. + juY0ypbmPM0AU056OcCLf9TVzKC20tlEE9oo + RMDh2qsq4yYccb8kO/H0GerBDgO7PNUV7dV2 + ryw6EFvzj0Tg9BWUYymnk1OV2gwRjFNRLCJI + mc1akWOUYsZL1NJvkX967bPoDDCZMphO1R0G + 7Z47JnYwPjGRAHBVUdZSk33+ENVrpXtFbDJW + K5yALboYV4/XJ0/4KNOrteOdNwe+yRVJcxBm + GJzI/lsIEZ3ujqDWgqtPCIJfEMU+n1/jAiuX + v0vefSuHBlr0oryuUIgT5lkh+oKauzibYeHV + mNfYj+VbDFn8RjqtBlyBiUOLWQWooxAhr2Ej + h8uTAWMWRp3o5XOnnQ== ) +sec-31.example.sec. 300 IN IPSECKEY ( 10 3 1 some.name. AQO/C76MVA5WN743YYeE537SLNffRZvQ9yxo QqJP943gqs4QATtnJWHQ1SDWiRE2aXl7SJoy JAu7jaUTGKWXzStD2wpkBIJ1IZ+avxf8zxRt @@ -1789,269 +2412,584 @@ br2pQnZ5ul5NCgkhhcr26IPPiZm2eww6ougs ogj6kPdSSQYZYayHzVnl8NFQ9uCwbRTryepP zZP5Vd2t ) - 300 RRSIG IPSECKEY 5 3 300 20141212121212 ( - 20121010101010 516 example.sec. - Q98uLQa4yiNx20mu2+eKuoDUIp1trGYoPIfh - 2xjpF3LdJPKf7IWHRrKg/83mS/ZIUYMpubTc - UReFmBU+H8m2cNT52dgy5J2HDzsi32oj+0c5 - rryu8ukq4w3WVCNfMB40HryiJfpo0xyxOlcY - pxA8T0H3pzxxF00PLsD6qEpzXLg= ) - 300 RRSIG IPSECKEY 5 3 300 20141212121212 ( - 20121010101010 44427 example.sec. - huDnVbUefzBpcL2koVKRLUDwoT1xGgkNCCyC - yreQ+VQyJPUOUPYmW76xSugebDPTus0l0dkO - 6hzK2qH8WpTz48toCPndNLojiF2cIxZwAbDh - h9A2icNe9ho3Hr30WlzRCqtTOPkOW9AOcGHZ - wRANW/DQhwE4ibCUWx6BuXxlljcujJPfQqbr - pzG+jLg9Dw6ZygpjpHXv71cbEEWWNnoJgbfm - ijyE1R6mXBZWY6S2TPDfd4qyhWbnzH5caqfc - 5TD5eAoDnnE1NmPKFg3+gQua/BTYaZeGksxr - tmbNOo2QndPX60eeR1Kn4ujxBf0nKa7GfAse - D7sX00LaW7kx/rXdaQ== ) - 300 RRSIG IPSECKEY 8 3 300 20141212121212 ( - 20121010101010 48381 example.sec. - xQIef/xGr81KqkEpNwIBHGKKg7c8Rup2Z116 - 60nevwq1tvbTSZCj7i88gVtgVAbdiDC21Tbb - 4Kd7gTsvX2s9oDV5xYTxL/UHP8xbDjiTaAFz - 201G5nCx+VLywFvUgjKr1Yu4YT9/aJ2XUkgj - tLKXobQX9lNytKCBThPYrIxTdQmYaPzUy3D0 - hxboqhEgJ2AiKD5qZLhWw0o2CrhoAwsdZIjJ - rXsV68psRR7inaHQ3OdPtdwCIMx7MyZKECEZ - JEGveLqrR+NU0RqgltL6tSfPSZin2suDX/sd - otLdkc2RrLyAM/eYP8x9TS3hvhKy3pJKJiKB - bLDYyfw0AFdS/Vfq4A== ) - 300 NSEC sha384.example.sec. IPSECKEY RRSIG NSEC - 300 RRSIG NSEC 5 3 300 20141212121212 ( - 20121010101010 516 example.sec. - ZBIHK5XwJUX6lZIbqgOQWklBK9mls54IJ9T/ - 2q295urzRl/qT9mJk+7NXNMpu97K6DttQu74 - 7g43pAvQNVORxsP0AfM7c/DeB41IZwXAJ+oy - 3VjtID+jSd+6HUJhvOEbvrB36kCxXTMk/Kdv - 5Zl+fiHzWLazPtJPtKTjyi6FZn4= ) - 300 RRSIG NSEC 5 3 300 20141212121212 ( - 20121010101010 44427 example.sec. - vnAbysWbBoMXN/4Iy8KSlLHxhXRRbzHkZA9m - q8VlXoyVjbz3xgmGsK87/ztkaAl8mHnYc2kS - qUZ21JpX8vFgY8exGU4GszPK+AdfUfdVcxsk - x2oNVtkpOqte0SVNtHd3IaatHywBdNE5571z - /DhHJytQKOd8AbSOW1B277/mu6c9jKHZdYwu - VEgboqW46QhKwyso7CjQYzUqi/9T2m8zN4iE - z7qcSHac8Ro2F+FpcGxtIyu2Z41W7Czk37ck - 4IE9psNkgb4rEyY2YbWTHKIcnuscmlhqT+vg - g3boKmOV15rKH2NvJzgrAaWJsxcjW0p7zNzu - oHvx1TH44vAXzXJZoA== ) - 300 RRSIG NSEC 8 3 300 20141212121212 ( - 20121010101010 48381 example.sec. - dgFnpZutgO50gp4PhC0a5rHQyjPQorrKpMT2 - bHElABlUdLlSZL2dyn8iQrDhT75M1c9iuGmO - rnlq9jAEB4he88v3HPRW1EHNJFl3MFWBoSIH - xYZHDrrq2DT1LFFwJrjCgiH7yg61L7FoV+T3 - PpIPN8yUaM2zXmuOup0XT/oRFuB7T5liwvtG - /M5v0G8ge4dbmRavN8mQSEwFDyE/ZQlGINXt - llQVyw2GkXf8eMERQyGeNVvV+lRo/w2zWyQI - XHE/3iA6atYJzk/YJooVTDskfbRjU/GaVgju - DpzoA/gm8m2LRJk1F3FWYO86JG66XXCjcq0n - 0kzyTrKi8iTNjaGbgQ== ) -lets.introduce.some.empty.terminals.example.sec. 300 IN CNAME example.sec. - 300 RRSIG CNAME 5 7 300 20141212121212 ( - 20121010101010 516 example.sec. - nKij8bJe39EFqF17wJ675A/Ez7cBoT6hHUW2 - L6xdmeXOwyDsGI9e7PbVD54j8N3saCScDXz4 - ItQqJIeAd0q22tGXFXQ+kQQRgLVPOTNS7IdH - 957LABHKO21kZkzwVGF3/GL99RJqCYSfFZmz - LX7DQ9Za4nBS4d9AUiMhXRyIgeE= ) - 300 RRSIG CNAME 5 7 300 20141212121212 ( - 20121010101010 44427 example.sec. - Fp/KiTvkjNtPQh/qaR5EOvjKIc12ozI6sfg8 - r4nPTi6JUFILNkfUTU9+47O0zk/0a7MmTrHZ - iZY+6urd8H+nr8RVBgW6b768z0oYUCuJV41q - GVuPooxRG5qfQLkNdUMehWIeGHPNFCKXGuYB - VqZnzR1JYktVmk/X+IduNCVUdkikgjpCfz6y - 7m2J41uauMjWDlynA5G7PZYUBFt+WwXv9Ck4 - /t3+BJwdJZzAxHX1tM3U/vnkEFzNIxWu2dng - U/A4F8YyPNff5Gfdbun4zq25Ex5mG20hCJDp - TCWlcpCJfd5ROil4VWDNrirdklsVj9frkBc1 - EOA4dQ7nb2FFz5ysTw== ) - 300 RRSIG CNAME 8 7 300 20141212121212 ( - 20121010101010 48381 example.sec. - k6ck+Rrg0dFu8Z3TeskkbTbdLTTL8ByI6qhJ - bRA8XimCd1qCO6Q8fUod2q2cq9KGfHc8z6S2 - c/+5TFWjzHOxfZbLEnGrQj7HMXtcAK31YHWp - SpZ9ucDWPbBU3NEfh4BQZmrB8NOkkCnZ/xDB - mjIlWc0Y9tTa5gRePaC3IegPPTQENNhUuEOF - DMvZKQsA+2pXSwrNtNvSXlRxGKLCPOvTF/al - iEnxnYuLjCl0EdYmgbKoG2wuTdZcCqyamqL3 - EYqJjr9OmTI0LPTy5oBGPrUxFyaYHhvGa4rC - wXiLjK3KxpcYZfsDjr+nkrZXldHaCPX/KQ6w - ANsJ7JyBxUXR4GJyYw== ) - 300 NSEC www.example.sec. CNAME RRSIG NSEC - 300 RRSIG NSEC 5 7 300 20141212121212 ( - 20121010101010 516 example.sec. - lYo1pIcvD8vscR0PVPNW45w6uOPEQGBrjr6N - rKyygzb5h+dJiiZuUdQL03oxI0dl11Ezh/G3 - ocF81ndZMHrEnG5ERuKftI9vvAvkYr+DnFDc - D0N0tIfHzB35qp2AQnhNQY/RQ+i1ZSflOw9D - /8rOkoBQSlPAnCpIyGbmddEVcFA= ) - 300 RRSIG NSEC 5 7 300 20141212121212 ( - 20121010101010 44427 example.sec. - XmqQZjep1qmAHIYIQTnzVk4PTeKoqT2ih0yS - O32LiLcnGTpJZ+y+cdlvLUs6LqZaThePOqtw - foOCOYdMWSKWCCKXwonpwKEPocjt/C8v7tep - so7KOdEX0suWxbDOJP8TMzdNht147RwMXP07 - N/TedkKA9Hs14fEYEoiK/y73KKDz2ckxTRIX - rxqeZ7ZJfGTXuK/PxAfAtgJS5nBkGJSDKM6f - ykym+QKrBe0ANqVZdbykaP3I0WR21d29Wg9p - qA+sh7SA2g/waj29e7Qd5NfbMis9AfU7lQrk - me4g7N3u5U9e+FsDRsNItwASl8c/5e7CrA5A - 5mkKaTua5ovvwkonxg== ) - 300 RRSIG NSEC 8 7 300 20141212121212 ( - 20121010101010 48381 example.sec. - wtjR2qaqRvPjQBaTH2JgjhjWsnEZfN8qcPq2 - Afjx1LqD3f1purYgNXtZhlqyHWs87qksqPbO - rykcGMB8TZ2VpByJS6yXB7LtRaM6SO9yGfPy - 8b3Ki9bDsRuXRC2Ie0HStJW2rDuELlBJj1Mp - gKYUUCLrWJ4OCaF8/Xm72zmJDkzN3rMzThTZ - /6XY8tYBnXwKgnrWn9J+VT720pDwFy7pok2B - os2HTAO5WY3Zvl+20B/jkE/ebfkhTsWGHFob - ENUAukxaaDbPtXuyg4MKreaje2wh+Iu3PWqb - efFTG/pnsfLYTG+pXAnb4uzt75K50Ze0TUB3 - +Y3ZTANyeYApZkXo1g== ) -jumphost.example.sec. 300 IN SSHFP 2 1 ( - 123456789ABCDEF67890123456789ABCDEF6 - 7890 ) - 300 RRSIG SSHFP 5 3 300 20141212121212 ( - 20121010101010 516 example.sec. - WtF4ZiPXqdAu94QyYts0GKM31E2y8xOJg4wa - jPpkZI7WEyQOx4uwILRnpmkSjC6cS+ksRBC5 - lgnLtsR+ZsZNCcOIZMZrsMQcGm21/DI93HxR - J+i2jCVQwiYws8hguupSahtrwGYlnwF0fn8l - D5RJryJFZQGHQKii316GQWIJ5fc= ) - 300 RRSIG SSHFP 5 3 300 20141212121212 ( - 20121010101010 44427 example.sec. - PzecZqU6DRFSEWJ1dfx/CGlIlRFdgu+Wjgo+ - s7SedJVgGCLrCxhx/lbBbcnExjTiCHDi6/Wt - q0R8OtyUVXvqyKMUwr1f59AEBzWO9GbXs5fr - eqRD2h229Y3o6aVMKHl8hsJUYjxyFCBqNuvR - kFSPQuAJaUF+uQefB4pDiVl1aSJnZDCi6T5G - +pTUyF6Ttr6b9VVsR2EUdwzqF01JyqRNgzZM - hkmfwCQsBfJd9rGh3qCm/9iYVaCVEkNVX1T8 - jVVhLm3UOhUEJwmi8IjRyCA7RJsLQmXkRrmw - AX7nROqRienYjw0Ztm0/VGbJPw1HOm3zAuHu - QtxtWTABc3j/C5hLdw== ) - 300 RRSIG SSHFP 8 3 300 20141212121212 ( - 20121010101010 48381 example.sec. - zhh18mu+feoq55Ddkkg03SIJQ/gbqN32ppia - +WKE3jBbBaEaWLJ/wP65WHqIyDu25zctg5g0 - m87Z1BbDaaH4WQK4Joh5tLd1bZzvMAUOPip+ - X66G3vwE1PXBLJNzjB2c2WZhOXbsghdBXmm8 - RJbysUS/vH7JMNRZUTF/tSRSGOtlJkDbqAeh - KS7dd+m5StDlxP3Etv9zPW9tA+n0VxUhkCox - 9kags6TtEPf6j8acS3HhYUhEJRqVjH3vEBy4 - xhYhkX8Es1K1md5HY0RoKL3z5NSkVj32yMTk - vaFYtg/yhKLlSQsX/Hn75rOjgCDoxTBCj9EH - q/hHLW7UmO77w5RFvg== ) - 300 NSEC mail.example.sec. SSHFP RRSIG NSEC - 300 RRSIG NSEC 5 3 300 20141212121212 ( - 20121010101010 516 example.sec. - L3vgFTbZOLeRq1I+RVhl5jOAPHTgKlKkr8Lk - ChyFcsWnYoaNdNSkotTSKoWW85T0SRwktH4d - BCexiVcc+pzODo9/SkCpFKgkZ+3Q3aC82mo8 - rt3qjmgLOeeobCLj3X+lgLZRHqw96d+aRpq7 - Jna2ZA963cUv5CGkRW1vUNDWwqo= ) - 300 RRSIG NSEC 5 3 300 20141212121212 ( - 20121010101010 44427 example.sec. - Y07ocMMI0+fY8gCwsPEbdzDtwKdma7+JRKXT - 9DMUx1hmcS7YxW53TrIMCW8gA9snXnSJjG0h - /aP0OuFrJvZ2xUUAmpYAsdyw+HoeZtwFb3rg - YJRL94Up6MVzNX89UsNYPvtvP7vEpebnYxzc - gzbOcjnV9F9NPHj86Gr1hT1A8dOarbKVFLTs - J3yXWalgG+qy51qhzThgimMUci3sNpFuKfG2 - 4SGCGIOt2rW8OulNuAFQzTg3zmR/mkVm+vip - 2KVIZ6kre+Ka+fR0A7tZP+4U5xSaZXMh5h3K - YiuDaxUmWZSc6sCU0nJHtsB/HIxTi958T0Am - Scq72LK4IqpAfqSazQ== ) - 300 RRSIG NSEC 8 3 300 20141212121212 ( - 20121010101010 48381 example.sec. - CbV2wVqT7r81G8rqWPnda5iHqPaUwVAqoDyW - zKQhbAj8ydnufTHODju4PV98alGuQCC50yQ5 - KBHZu5enOTQ/MKiAcL4O0QQ76/OQ1Lw8HIa4 - FtkArpipm9h3AFnFoYfq9wS6xmweX21SrNmG - phgrqYtR7pvjBXlh0O1kZG1h3fRaiF0nA8jt - 1ZzkMhMCgiFubEDQCVhygbkucFmSSo31HSCC - ChwGnjLXj40HKvpNg4TUE/f7eUnQDeq95A9N - O8YoVcNkcVTxx0hbSlW6Q8O06Dryf6c/NEVj - lXgHRwxIsLEC2AqPbNuXVCN7A1z0aVLfTFxF - hNFwOEnZfExmu5BOsA== ) -sha384.example.sec. 300 IN NS ns1.example.sec. - 300 IN NS ns2.example.sec. - 3600 DS 10771 14 4 ( - 72D7B62976CE06438E9C0BF319013CF801F0 - 9ECC84B8D7E9495F27E305C6A9B0563A9B5F - 4D288405C3008A946DF983D6 ) - 3600 RRSIG DS 5 3 3600 20141212121212 ( - 20121010101010 516 example.sec. - RlSITzGdbUeiO/X6i7jPSTliXXzr/zw0l9MJ - rc4VzGC0dcGGeDYG1ZWodAL+pM/VZmS1O1hJ - 8qqgmih6wk/6J1Mo1xFHNOsdQydLPbhb6ziD - aWc/yVfCUWH3bs972JM3VLCKRutNEu+aVrqH - D4GBx6a1ydJtsbAzKmwZ6UntJTo= ) - 3600 RRSIG DS 5 3 3600 20141212121212 ( - 20121010101010 44427 example.sec. - 5zkHCXkdljvaiL0IbpLxipLO/bs7qKegn4aS - 3XY95f7aCH9jsuKh2uDBDveJkyU5TCLLjwq6 - RxqPpYxykXvt9x7ezi2ErTxeJ+BPg6t7kBQ4 - LkORMTBcZeGX8i8GDD3ENR5VcdyrTueDiWBx - Pgcs8l1N8yXs9o9Z2e6yiWCP3dGpzUsjcTWF - iIBuMdSROEoB4lTI5+uLPoYu13odCisP7f2n - uZcCJyIrnmsUAO/3gYaP+Rn4tJ4f3rYyIFa+ - 1dqimIVAlkPM48NWFLT+mQ9G0yJG2qApvjni - xjjR7H8iZjfkokn7v8oYD+s659sZ1p+ZtQEa - V/KtryLRnftxfi486A== ) - 3600 RRSIG DS 8 3 3600 20141212121212 ( - 20121010101010 48381 example.sec. - oXm3VWAtTniky4PqghkkVdndrSxviZ9vWIeg - k/bjcAKeMyFViCuYZNwtKyq/GiDPKTjK+43x - iH5hFzBiMZ4xLfSZULvh6koONQN5UP/UyjGo - oAqayihsnpAd3jNt9vDRwHvkD3Nj7eg/JTU2 - kQIIIYzsmCbAj34mnglaSep0Ms/Az37lzPs5 - hYWFeW4k9fvD5QNkIWM5lJ1BsdNwVBpgLJw8 - r+oXjy+d217hTSU5BzsWrUH+GQT731pk1neN - k3JWQ7zh3YgydJLjk5ajhj+hxfCgoCgE6Bc9 - xlBKNJ6Rh1JfIRBt5IfHkheMTRD+xZO4hZVw - +QDVTvnhNjmV2sQnFA== ) - 300 NSEC lets.introduce.some.empty.terminals.example.sec. NS DS RRSIG NSEC - 300 RRSIG NSEC 5 3 300 20141212121212 ( - 20121010101010 516 example.sec. - rC7wuuLqhJ6l+bW/sKlAHte1NWIb/JwiNHAB - wrGHvEIeEXH/qG1rKuMYK3QjeUkIC2oiMXjj - xodTvxPHsSMxqwSavndf5bJeMdJjJ7UaY8KV - EmcuUlXP5Mbb0TyxER07MVIbJW54X5DpM0bl - 03Bgsnw7SpG+W2AlvwIWZqJ8Xwk= ) - 300 RRSIG NSEC 5 3 300 20141212121212 ( - 20121010101010 44427 example.sec. - 57QM/Ng2WsIIgVJ9f8FMCB99pw2Q2zP8NBcl - GWycLFxgEEIrpQ5+MZo6oORsChrvORQU7rlv - xEaLgEkfO6vS9aqXxBP60TSOL5k5XXtQb1Kf - dCvZTU6CHWjGy4ofynCMjEJWTaKAXe6lhaHn - HBnKhnTw6Kd/CzimHJAhFOISyiBwN/bjjwcJ - mzXZaYS7mZqw+syBbUmInFrxgfvmKMZvOjPm - mEUPq23UdpDgL6NEHPsGEr6dt1ae//xCu7Y7 - Nq/q4ZiB+eQ0A6u/FSo5NZo5b8+ndZfgsTTL - dF3T5VUzvZ9LY1mMmda5+QtVMF3l+uM51Y3N - oMCURZ8o9y1kRgOe8g== ) - 300 RRSIG NSEC 8 3 300 20141212121212 ( - 20121010101010 48381 example.sec. - rkUcLynqN37zmLl+S5Yu47n4OAHo0NKRFLUW - VIODdVqV+HNl2wimJpmkusOmZielq+O9xjWp - erdffAJ24MYAXObqaFSHizIRoMZVW0HwGVV9 - zhuAjqVFGESd5Leen7sJ/B2Ari9Q1SPFyejT - YvLVeFNcqqYK4AZi64q56waNfA7kWKgyCx6a - crsYPNIYzcZHVtmuv11PWH7xKsZwqpU2wFMR - h8rtjJb8qEYo4MmNNtXCmdj80Cq0haTuqv7n - ESJH17445IDjvrs49q3ibTqzDTh68IwpJhca - G2VPTAWdtpdx/q/CIAuSHRLxU93OrMTUHPqi - gPFvVeDTxcPucgzQIA== ) -sec-mixed-31.example.sec. 300 IN IPSECKEY ( 10 3 1 Some.namE. + 300 RRSIG IPSECKEY 5 3 300 ( + 20181212121212 20161010101010 516 example.sec. + o1OyseVi+rnXv5XphFpoyn1S9RA/oBLaMDz1 + j6EtIxKzPc9hoECBQh/7FjSTweGkdhMbkaTJ + AH//72vBj9kpWbBlU/A+cRkbookTsPJNW84t + hfQaZEeVDK6tGxFuLjfu95kJKcncDZsEyhaS + JUua7gyEBDy4sfyrLojVCT6jIdE= ) + 300 RRSIG IPSECKEY 5 3 300 ( + 20181212121212 20161010101010 44427 example.sec. + pK4pQ2/wxYAm2h//CXEp1otFBem3RsL2MOAs + 1mMVT4JOKwg/LML0GwrNddfPUEjO7k9Nau6M + 1B+Av2iir5zCdYaqi0o1JLKYX9atUEm0wXo8 + ZMZ2X8BqoFcfThvnZt6vd3nGc50wDj82tLJv + 7YlZm4iNz5qVD1AgWPXcy81U77eT4D14vhUX + OpMq6lWzHA9TCXQLtPthLNawJGY6lGYlYGh0 + pwWrYhddfNhiKyWOzjnfLrt6axJbqGJ4LJ85 + 7e5y22AablBRqPCLR28czCWeNgx4hVpPbiIX + dcepLQiOUY2WFBsoFzwXWyt/VE68aR7wLRUZ + X0nNt/m2XkruNu8X1g== ) + 300 RRSIG IPSECKEY 8 3 300 ( + 20181212121212 20161010101010 48381 example.sec. + vaoSbgs4NxC7/obO43g0MeMpYYoISPjhIH6t + WS2u/k4h+Wwpa+dZB3QGGqtl5zAy5A8xd/ph + veyY3ElY/CiRwbDcnZIIqVIrhmN8OiQyWl4P + +lIlmCWwq7aw1Mp+PtyVdmRx0tKLRVVUGr76 + cxXtPYoHBZM9iGDuR/sBp9ne7Qx5xoqy5COY + PYZ99ks/6y3ZnHl5QfKEKuLUGIUuop2LLiOs + vNHJXORcW2gBsbtIbj29px74u4ZA7vcD9f+d + LR1+4PW5PcPuA8dr+r4BX28VhSmhdizqlC6k + gO2KbVplKfrmo1dC2ttQoDAYhko+AARt9g9t + iEzQnveDN75dlK+VNg== ) + 300 RRSIG IPSECKEY 10 3 300 ( + 20181212121212 20161010101010 1862 example.sec. + oThQbYNemKxbcxmw1LBjlqLe3bZdpe4fd2ho + AQBRN9QUpvrOP1eLrDSH6lp0OHXz7nHE26tI + biFbLByyCfh/Bi/6VYwdGh9Q1s2g7YbU8Nru + +eLuwbgPe0xpyM9TlLN/uRIkCYeQOEdcLrit + 7j+vUTCcp6B/o0swUhemn6lxkZLQwouY1A4j + zXVUp+9Qqa0ffNtRnPR7Ho+aBY6hx8pBbg2J + 89wyQ0tu1a8teHTDIQRnnfy3gwObHFYSGBn6 + avIHcxPmlFwMERx0tNJAHIkhp96cliSFGgqt + BDdiVvKXmTxxtGNtFPfAyORs8l2h2KE63rTZ + UQHwlF1iELN138njUw== ) + 300 NSEC sec-32.example.sec. IPSECKEY RRSIG NSEC + 300 RRSIG NSEC 5 3 300 ( + 20181212121212 20161010101010 516 example.sec. + cvjaA3Qs8UpY6JPG5FbfaZX0j5RWXo5jaJiZ + wU8Cz2hPpA9L/GvAT5ww+esIlU6oDej4TeH+ + gnTcsJ+nZg/+dSAMIuF8G6EEDEHTwdiY6/zX + WQqgfA8wMfpnZ+8rpBprseoNH5MDhVxVQ7k2 + U4w9u5xXgNhhOtTBM+gKi1B9qyo= ) + 300 RRSIG NSEC 5 3 300 ( + 20181212121212 20161010101010 44427 example.sec. + re9WL+24ilv6l7mqsL6U4stMfiIOjB3YxECL + mIfroRgqskpuz1E3/amZm2MrSqilm4Ejdg01 + DLypB/3piihQDew/IggKbYvR6fHfPacHt1J2 + Mhe57xoFWixS7tWTM2FrWJNq8/LJTdEpOhsR + rWk0Dk1jBR6qFljcu8QZoHHt44Hn7h4aEXv5 + WdXfKO+1fRMW15QOhbWyU8YvCORfrtXQ32BI + 2D35FgEpWI6gLZcs9iW97H1zx8XeMXeLzRBg + sLv4fLJ5gJOc9Reoa9uaSOyefHH462Bq7Y4q + Fy8zz7lwU59Hruqy050vJ55So5Fb8KY7MMDZ + jV7OIJBfupbEvmGDTw== ) + 300 RRSIG NSEC 8 3 300 ( + 20181212121212 20161010101010 48381 example.sec. + wtVkLK9GQZfFEzUGK1sq7o0q/HbxY+nOt9F4 + gm+5o41jCQup3t5dkLkfBhsGqbrIAR+xymUo + pjIoseU1hKKDRM7pWTd+b51gMyKgmhenKyWS + 9RrOt1Q0fChEoVr+XgWE9/HhWRpPRp9dTLVx + k6FDiKR/5GxPfJIFQSXXRff6TyBVTdkXYdNQ + dZAT6s5p6VkaJPgpvnnHBsNs2new9/v7KuXu + jAHPIkhdZDvq8NV5/K166txQLE759/6PVnhH + D05wQZFoLa+2WBNKL3jdCiiodmyw9khdxvhl + 4f4pG4A6txIptb7QdOc0czbDzOiEqCx99cMl + shOZ5LLz4n8vVLOiAQ== ) + 300 RRSIG NSEC 10 3 300 ( + 20181212121212 20161010101010 1862 example.sec. + Cy3wrexPHDOGUJa8ogxhOfvqwUKSshpHVwG/ + DkHA/TPDr9pR/MVY2tQU3tsTKMKXgxxkagbh + 4fhdimu3dUcAHOTf6OcfFM2D1GPqxBhHgVJJ + H6Z6KdGIwMpCap1fgvMkarPaVe484s5owwwG + sqbq1/4XtGCCmlDK4KE9zBgYm0zPMZd2ZZOm + cV46n9oYoUR97pLO64PrM+dZ1Y+zW1R9QIyg + WTo9afOZ/IC64eun5dMw52ZbS6513WX/72Vl + AwqMTmfYmwlC29JSgSQVQtZtVs4QMlFcdmQH + uiY7lI42K0tn6autonajT94rIT7xbN6t/yF+ + fnRPfoMIJ5T5NONFiA== ) +public.example.sec. 300 IN HINFO "i386" "FreeBSD" + 300 RRSIG HINFO 5 3 300 ( + 20181212121212 20161010101010 516 example.sec. + HYDUN0tUGAuzK5EPKkYI1dKQ9xu5isKcKIYp + bGgrn1M5XLh+jx7oNzGlJxtl3wrfoNNH1Wbx + A0qKHanznYIeIiEAdEVy+e5VMRl74D32ant4 + guuFPJTVV3lGu6D1RDy+5EzUGEQoTEhKVA40 + g22QkfKE6n4sSlmQyxxd6rUUAiQ= ) + 300 RRSIG HINFO 5 3 300 ( + 20181212121212 20161010101010 44427 example.sec. + OQBSWTqQk7yo7xGQEzTEXYqwPNziSwDiWRQk + L111w9lAGjLqJmvcI7WhIIjzbtArXWHiCv+b + jM8eKLRpsiwpfA2SF9lv9JF9aUMBHxIH9zFI + xpW+i7x/xZ8Qa7okflF7woGZeDYoo/Py46o2 + PY5XKK/e+sWfW/cN4eNb1heEkR78BcEUQo15 + tv84iuEb/L+UuMS3c3U32/jgt9GSpXoX1vdl + DQw4X4VJGjRV4XWQVlOTbX6aGFEwGE6VQRj/ + i4wyfakpdKML8rnlp/FA2XW/5rEED7qWCK+7 + DbLTuuYPBxqLQvMA63KQqsfBiTJ0ZKMR3VTi + XFrkYahoAlLv+cIo6g== ) + 300 RRSIG HINFO 8 3 300 ( + 20181212121212 20161010101010 48381 example.sec. + yg668jHohtmU/dhqNYteS4MmACOo1ErZmAzm + eR7yP4mX9cBV4s7l+0ro8cFDKGCowr6IoHCA + emS6vfHFDmHx3NdIqeJWBDsovCNVCX0RAHcn + DNOfTWy2gp0P3kClzegSXl5RVK6F8n+1uzfs + GnZGjA5OyNsMByr0DtGfAHvBvcbNC+tGyoxO + VVh3hNEzWuu1HbEEpKHVla2SHGEUUCHvGbBh + c7NcIc2WZNzIgjqah5vUhgj2fccImxzQfxvC + hQaHNcOGQ41GKS1QW42lKiertl6ivqZuhjH5 + CYQdyA4Mj9VyvF8tLRXIfDyl4Et7NXLKxTT9 + l0OemRyGnWw+BTdHNw== ) + 300 RRSIG HINFO 10 3 300 ( + 20181212121212 20161010101010 1862 example.sec. + bzKDbXyrkazWFhXhWhfsMcWtY6wTcg035fZU + 18rgZ1fAHQsfgRmtD5BiFOa+JVW3snT+eLJK + 9U9m+vHeSUyQkNbnxrl0s7RSny2oXbNRes8P + y+cknM3g2mmr4JNXOlAe+kwm6TdzdH4DuUm2 + mK3KfFgtagnWHu/j6wE4tHYEuGAgrX7uYVpO + ffalQ1AFO0pyhFmnErk2E072JYSrpAfi/8Fk + lE33sBAr4SmFr1KHnJTrO/WVaAAZhRJqUgbx + eWkzBXwiWwJPkZ0PDY7aYJeHXLLuNz6gECZz + DpY55ofOEFYLNpSo/qZH0DACfZW0cf5MyyHR + zMlkokhK/XcmmEv+LA== ) + 300 LOC 55 40 15.258 N 12 41 56.378 E 9.57m 10m 10000m 10m + 300 RRSIG LOC 5 3 300 ( + 20181212121212 20161010101010 516 example.sec. + U1RcS2POfW/akAGCD9RNOSr9MtqE8ZL646mQ + xFUNJWsgOCnc+w47XqB0ohbTMIDL+JSxiZYk + bgcX/9y5OwCR7eyy6drWE8J8Wqs0hbYQXVHk + AVb+4hrXY0XwFBc+outY4dxbagT05S33ki4R + OlDjwoe6NbGV+jvtSlDzKMWN/oE= ) + 300 RRSIG LOC 5 3 300 ( + 20181212121212 20161010101010 44427 example.sec. + dywJbQdmETg/tdyYGELZFrNYPATirURA4JvV + d8u+Ejce5X9a2StTHFG8AO5oHVHBob1z/SNp + JKFYBECnGxnTTb5MjZ43n0D/hcbX089HArFN + pT5MMCNlKlU01W2VrlYyMkMu6/KsyFQK6Mcb + Y/7UOu78DWbbePxwijigZmdhPFJM6PYYWLeA + 8mJaqX0MmB51o3FtkBEp834s1bxsktFKLI+o + QqSgbreLDF272tDleo9LkM8RwqTNBItHf92c + 99y+VRg8+cmP5hAADV0ANoFWmZ8LIKum6tJd + 48/kUnHjzSTMRbAPt7lGcw9ItgC074mku4WU + FywoK4EGwQJ7uH49yg== ) + 300 RRSIG LOC 8 3 300 ( + 20181212121212 20161010101010 48381 example.sec. + EdCsT05INrfXrxH7OJu9ZYVOerbeluKqTymi + tdatnHH6M85TT4djWnspHnVNsjNSPFy0+56G + N2CHHgXsqMW8p1OYAOzwZ+Ba0t2L3tIkeZ0y + Fo58ROSBwQFl5nNSX5fZR+VOg1nuAhZR88Zf + DM4clTLtCn7zV9TtuBINhqrI0vfXhYBHo5Rh + e97ZBVVcJzNMT8b0ehJ9GjTQ/Zy/XW6UVTF4 + RinWj4b9nZtxZMDCJD1fqpkQnAu356ja1Q7B + VgLLRuSi1rAULkISMJipYNowW0uCSdQK9vCH + KIDRskLR5d3DJkmjLSgDbaw3Lqya30/rGSgp + y2tgRWdgS2aEpjAv9w== ) + 300 RRSIG LOC 10 3 300 ( + 20181212121212 20161010101010 1862 example.sec. + MGe1S9ZySCoiyDHXhtEuRBFqgFfh6d9j1+8V + QSzpVZZt/D23ykb0kNovytKFnznYSq2mm5i9 + 1jGIbRkkTCJUmuKEF6o5BKeG5iIe006tDG+n + /2hr81FY58+p3qgY4uaFVcwMAGN5ixuL7J52 + QeX8qMrGwnLeS6/USfxyfWtu50nmpgPF7a+J + KaeV7Xy9E35eBtp/LZUzubxEsx78ejlBYb5A + XCLFT1FmxtRktRyQ4RNSOX54sI9XpUs8xqMr + YF3IY0C8atFhXJ42M0pr31SOVJjvF9KAax9Y + I5QucFL+ovQLRYgxVrj+o3OM0akoyd6ea3M6 + SxLo0XnQrhTkjr8Q1g== ) + 300 NSEC sec-00.example.sec. HINFO LOC RRSIG NSEC + 300 RRSIG NSEC 5 3 300 ( + 20181212121212 20161010101010 516 example.sec. + i6dgTc+9Y4X+JGSuE9o65dgxKLexkwcsLp99 + x/h1iHgEkck0Y0i+d7MDGNg6ZeMA3uuaxnGr + vSntLNBywTMDGQG43aRjn6jZ/OwL/9e/0YNC + wU0PoIsKqg3FKgaPFXGk17dPz5U56Px/nymo + zSero2AS1cAXyihClqKZ7EjeAdI= ) + 300 RRSIG NSEC 5 3 300 ( + 20181212121212 20161010101010 44427 example.sec. + WKK7b9fLcJRs/xI74VSpnCf6sVr4gPG43TUu + etxbTga8TGGHchOzrLhR+l3LVtHkos2Y1p27 + bZtYxApqZThMUZ/3fsHwwjhLU3dVNjVtymcy + Au8g2+Km7htzHPJfEsFtlBV1DEjiTnPxx9iS + Ayi6Ib4p1Bp2h1AaltgEM/EbzRtqnBkVq2+j + JF+DRN74dB1ZSWltzNXhZaWNuHi6C+ccXd+Q + A2EVSg5f2O6GzVS+RjueuE6SH/AifFjcU+Wu + p6QyQUe2umElIk4kTmE8RWxFOO8JbDBdX4Hx + CyLcvGFk9XKGmtVpC8oLilxTNXC0pgLI+/Cx + uNvtYbpYweguxAUduw== ) + 300 RRSIG NSEC 8 3 300 ( + 20181212121212 20161010101010 48381 example.sec. + 03EHsunl3E31Z3leZefzCfpwXIw5ZSjvwITg + DQJNsSFQ/7xCAozjkuaSbzi26t93/L5ggDdN + zK3qAyxslqbCQhc+ILItcsu8YS1AYHce7ATr + 6lg5QUij7eZp6mvCAde+0N1kun2pvgHXakBr + YM+u1ifjJNBwtMFU6DkDYVMvaWGcq+Y48zT6 + p7Wdt02EZFrUWAu4ZOSjksRxpsQrTc9AfEch + xMmOEVGuFP2xpVDRYbYE25gSy5qvyoVqgQWm + BgHbCDHzR+9BhInrI9yzhUV64ZGq/wZEOtz6 + tj2OAh9f5bp3N0rn/BAqh5c6mDfd3S8K5yix + MXKlpr8ojAhJNXF17g== ) + 300 RRSIG NSEC 10 3 300 ( + 20181212121212 20161010101010 1862 example.sec. + oNhHACRQ6raBdFx4fpCx+UW6OHPUGGyRd2LN + AliBFGKXCXdAED66EJlwjnTTYduegY07zhXu + 39DVCsTfNWu3nurjLel1J9LIIGwkspnLnQ3z + tZftNUfVr/PjQNoA7q29TY7B/LxHcGDniBZI + 0JfOATi2J4iWRd3UJMMOUAY54FGj+dVzPiCU + cKEt7WSlHDSq98EEsoPYkZTWrTpM46LvC5KI + hgFwpWKbIIzwFNV2C9ykMfLLFRLi3JO4MQbd + qbtxkUV+j2T7NbTWml9OY96Vs9oMQjSlKN/v + CpPPoRqwXyzpsMt6NfznBYNFWV2VGknXIsXu + TDTjFhCaXd5uDEKOwQ== ) +alias.example.sec. 300 IN DNAME anotherone.sec. + 300 RRSIG DNAME 5 3 300 ( + 20181212121212 20161010101010 516 example.sec. + IuMBiJ2cfyjxV1O+K18LbL5OuVk6fG4iAogl + KxuKZi9biDB7UaH6Fd0ShEcM0rUL6MzcmEbg + FovFTTyBL8+O/LhzElse+dGV0hOz/FilEE3m + LZzjb+WB6sh64zSRQTV3vzMgJxs/I60JbVtE + eKJ5ktnNmcCS0T+0Vdw55dX+j+Q= ) + 300 RRSIG DNAME 5 3 300 ( + 20181212121212 20161010101010 44427 example.sec. + WQTSaB4LddH6Y/sQuvqAawmY7bdhTeY7vZD8 + YNUvtgx798+DZWKQHmoWD4KDhvqMO3D3rFbM + AvjtZJsamVgHFDVnblBfi1oGKL892nRquFa9 + d40XUtKW5d6I6MaYyO6Cnxs0DFNOKC5NUuUE + dKWOx7fuuVaXliZqsGzDESKU6mwiOwrvuSqx + wf20bNXy+NgWHom36L4dOkBdiOWgcJ7fmI0N + XCmVLTRRrzw5E4kIIX1nIysGSW5WyWC6gxz8 + 9EYBBK5N38eqIHmxwUO9a/8tQcn2PWNqBNMD + LFYiuhweentelGwe8E8yajaLfjBZjmr48Jb4 + HNI7A+9xbiCjBseGOQ== ) + 300 RRSIG DNAME 8 3 300 ( + 20181212121212 20161010101010 48381 example.sec. + 010KT3MX1e3al35LdCNFqsZT7+TbZerO9AQB + DdaiVgmyQw7+UELxrTEyxPS3V0bMzUc3g5jz + 2XHzCo/ch5tFN8zlV7KUzQSqKO9+vt15JSNk + 2sSW4jJVK3S7KXH5+YRj0EOPL6O21K2KHwef + VZItT0jxk2COVl58qYa1PQ9DoFZ/mzWwC/ko + jRFwQc6LXFW+kDDzbHoj8JMeRhJOOFUQhRfL + QS5P6CruFekgMJRyeIZabQnqfzgk7yw0YAdR + 06X7LlxBwsVeS+un4VHs7+kL4TvaFHTfOgpC + /d1A5ZEeBSlRF3WrwrcqBNlm/DHb7rkn/w/n + osE3j9hC78lfgnm1Lg== ) + 300 RRSIG DNAME 10 3 300 ( + 20181212121212 20161010101010 1862 example.sec. + SIK086vGT9CP6NHhDUzNvbF5e+2Wf3tngnBz + wOXyU78O5HqY6c3urVCwJqnZa6FfgKigfRui + uc6nvCtIIx5/iQvjxKi+3oGGvLiYKJQlJmbe + XOocOddpBKkJ2QEx0VWK6M/1MqrHFtOh5l2A + D4R5j5Ximl/8K/P24Ek7WFnCBqlpBSS5s0SQ + l0oZo2gvZd+GNkiIxIBt20U400p3suKhglEQ + MwdOR/8+XHT2KsqUssmsIYlEPBCBiZsLn0aj + /tu6brATslv/qmsqc+HQMJRbJ5YHCRpbMOAl + rEWgYFEkxachPaRRIVuQwkcTJM3eTjn+D0uK + hdlOiQrBACuchImlBg== ) + 300 NSEC cert.example.sec. DNAME RRSIG NSEC + 300 RRSIG NSEC 5 3 300 ( + 20181212121212 20161010101010 516 example.sec. + SG2SiQMpOH6rJ6ZhQ3EK9bnnGiKL/7LQILSi + D4/agyclVc+vMnfVY9waoA+Jt70MFJEBd32p + GScUcRu9MkpdcZ0MiCCWwsGG+nrufdq+rxFr + +FOX85LZf4v7qp7s0xL1kf6Uol5G6J7rZIcT + yZgWGZfl4WuFSAouPQRnHV/eoqU= ) + 300 RRSIG NSEC 5 3 300 ( + 20181212121212 20161010101010 44427 example.sec. + uIRc9Iio/aaMx8R6vVIuIqMq92y/1iS/mYch + wupYiy4A2oz9AjQNZbtGNFu8gInyWPdZVfRM + gwSVk5Y6xFI303UWSCDSaFpd3VhkcPFToioi + scgtUVI7/v72JOBkhxFrB6nukU923E55ya7L + DCZ0lWnLh6VMvSe3MtDLPyUDQKfCZQVAlmNn + du4S7uWN6vh5CU8aTNwn6A/bOodtOAx3aDjU + m/oFGpn46FGuoYTcnjp3NGUFYOTdLlyWb5wa + V2pS39lJgUHBs69+93RP3Lgkhc6ZmsBP/J5j + vddRQ2kr8sBQ1g768buWyqeE2566mnGi6PoY + lqAEpXO9ReqdPgXqYg== ) + 300 RRSIG NSEC 8 3 300 ( + 20181212121212 20161010101010 48381 example.sec. + xw3R+vgGkofS8s1ihzSnMLoKrEEXxWB60hxL + cl3uJpaXSzayoXwco2dZaUzq/Wa9xFBPE06b + USSpn00JVhPA5UpAWBx1W7aD6pgyXN4Lfpk2 + VpjJ/1jjsQEWGZfhvaFnHF2uuPddNaQfWHMX + kZDjjpyWC9wLOusy9/7n67vie+SMI68vwqcU + pOKlrlTgumJ/HxbTvCEDM2jU5+umyaP4ZvIA + mtXSr3r5FUiF5cA5CkrYW0cd5CVivfkHJ9bJ + 3wEbUZ4NfImKxHCCgzS37ICNl+yB2ldHTfXy + 6Ho3jmteFbvNVRE5IVNrSozcPaGU9xBLZFVg + sle3rAROarz3lLDiBg== ) + 300 RRSIG NSEC 10 3 300 ( + 20181212121212 20161010101010 1862 example.sec. + mF729lkzA2S/Yif4OEuROLkcrLzhValIq/Vs + ahpCu8/LQOZrexKLlC/d9SFaSlQaB8KjLQeF + L0+s+3OvBk+AGcOxDSIlwm08P5lTRM4kvzdY + auZpiNS5rIgLEMM62Yla5mMhvvt+Np/lQ4yA + ISpdjAWaCjuV1xBs8099uIX49YNKBLloknSe + K4MWHIbEagDbxY8qnF2ao89msx7yQQeCun2k + ep4OGnZOWOBMJON0x0InrjUOpQC2XjJPgvIE + XTkl041j3leC8nvzpcTDvD5IDlVswExmFZ3a + inFdWQq97blgbbDItF82MPdrXUSWTAy/qmjR + oUdhgjyO878jx8aicg== ) +_443._tcp.www.example.sec. 300 IN NSEC _8443._tcp.www.example.sec. RRSIG NSEC TLSA + 300 RRSIG NSEC 5 5 300 ( + 20181212121212 20161010101010 516 example.sec. + c9om8Z+YcSMHdl9Y9JyXsKtmd4s5dJwnWWBI + XC32Gr2gbo2myvNacNo0EOzlnDndF23he+57 + 41VeKKE+jCuHPMzZvieq/INcNXu+wuGytWiQ + XTrYQSt3TiejxQdE6OxoxR69RqCyySRBLjDP + WT9fXekxVMbSogR0oLjWsuoCREs= ) + 300 RRSIG NSEC 5 5 300 ( + 20181212121212 20161010101010 44427 example.sec. + yQC7jAIX7VS4SSN76lt7Tu0meff3EKGD2RKb + hSo0hu9xfRMXlAkxx9W13bnmbg3o5rDD31Wd + 1x4xjd408l5eswm8G5IZorNvvlmBJHXE0BSu + dOHrmC5WmfyqlqRx8kEMsoUrMqQTqct+QmtP + rKAKrXdIoSx1kd/76R2YOrzbHWD3ydChvoLy + sfHQEJIPd4tvfuMokWzU/CpMpeyqTzebgGN5 + dSB2B++boFu0sfgTTjt/TGlXsgaU1mHBuknz + k0MUvaq+f1oDuw85RGo0/sDAKpkqQVUxW/j4 + bLv2BhAFhQGaSsv621WDziYWn02wxEccTP/t + uc8lah+VM9YF/6NjqA== ) + 300 RRSIG NSEC 8 5 300 ( + 20181212121212 20161010101010 48381 example.sec. + x8TxyxXW/d1su2ijhe449HrUYcjXCLDDlh+/ + MwZhh+6O3fdZX/bim/q53XtNCOkoTXl6DMus + Lei/xwbIQYo8f1J7rEe7bvv44U7z9XR5cpoY + bPIXof3EZiEwsqHSb93/UstNpRsDufUeyv4l + cdhJxVM2YLmQJ6v0UjwC452NYg3tTfM8vpMU + YAfgBn3ajsSpek2TEkW5nt2kktNkoydpnbuj + jZk7Pxmw8KbEPt1PO7n9LI80OA8DRkykhoio + 8SaXh/OI4sS4Mt+wG5+lJixMDUIT7m4jDW9n + W2skYvPYyaW4fS8Cfp4gwoIJuKpopHpy10oK + f/5s380ql82LvP4uTw== ) + 300 RRSIG NSEC 10 5 300 ( + 20181212121212 20161010101010 1862 example.sec. + mU1SJISNmam1aeKgThUF/ejRdU3Ltet3NgDy + 50W5MaqpPOSXrR7Ag42R3OziFaxjcbuY4MY6 + iOIuQQeXh/PcCORCP81+GWI62DxB5ga7hdcd + k2zZHSp1FYgtAWoZ4SflxjOBTkFb79irVLpQ + 3a5Z5CyBZka8zZcFr1Y4EgsAvm/4JRB2616E + GJgUbcWxZeL6XHlWHIz+bV3lwv4xctFcmBsh + SsGvtn/2av1Sq0Bl+PlbvAYrPhm/2sY8Rtbj + 5JWCI2Shbr2QUFbp6GlSBbS3oOkeLFz+0L2j + dY/CnmRpUHagML3xdd0nhHlMwClFkEEFo5Bm + hXIQvYzFz6SpJhaoGw== ) + 300 TLSA 0 0 1 ( + D2ABDE240D7CD3EE6B4B28C54DF034B97983 + A1D16E8A410E4561CB106618E971 ) + 300 RRSIG TLSA 5 5 300 ( + 20181212121212 20161010101010 516 example.sec. + m9FBBhkcIdh9DYhNur12tjTfoz5Qtvq11Kwl + oYPz8TiUK9P4wqGa3Ufhf/z5ciaASeMueQaR + 8nrGI0y7WD94mHm9Jg2u5BtuZ1z0hJOUuTRk + vETishONzRxv8K9N2W3Jv1ygLMwC7Di1o9D8 + S0qxYrzkTHmu8bLJj8oPD04+DIQ= ) + 300 RRSIG TLSA 5 5 300 ( + 20181212121212 20161010101010 44427 example.sec. + wVp5u5xaoOntqexU/0tiNrAvPD0KxN5Lq1RG + 7PkpEMFgR4uf91jgneoIBiUVpTE4agwTO//q + 0Qt1JAnTwPAo2GrHcTDut3ZkvIbK6SQERC5b + c+9l1IR6Lt7PBtDW9NqcSiVTh9SzU3plGEtu + KqhAPUzIIAm+kKEDpoOI1JTGsTdJwId0ttSi + Qt4QA6OFkYfdjWxm4qSsregIrTdhNuDtHTA+ + dk9XOmlHlCtlpUnxkTE2uqUors2tk811xkWb + aGM+VhFATKRBgNiUt43LkwgCH/Gfordas1fK + UsEXIZzAwp7Z3AdY/4PdhO3OAA8uojqHqTp2 + QO0xKJ7UnHueEnXR9g== ) + 300 RRSIG TLSA 8 5 300 ( + 20181212121212 20161010101010 48381 example.sec. + C6Y2zTg8SKAQBlW5bqGel+4LbcgHjitoxtH1 + gUv5h07NWCuS97gKv7H0jtQu9vyKE0szSMkZ + 88tHvFfpVOMfsWxkMiRATJaNP0j4bqlhW5z+ + 48hSfMa0X1jljYVhtxEsXrDqTEUhIv8kZuvM + 0IpsMDwSWljCFSmf0rspXeCcnpPPJL64I3IX + j/EZ52MsBoN3ifSTqodpMxs57xtGfi0lGDJP + yvWq2/9Z8BFmzDxvVEPZLvYUCl8w6FbELhgN + QD7fpKqM6TmI2xXmsQaEefvl4um5Va+t+e+U + mW5T6A+GNYRCNyk4VhBV9bKKPukInMJNolPJ + qMbgJ6Gc56V7l3tf5A== ) + 300 RRSIG TLSA 10 5 300 ( + 20181212121212 20161010101010 1862 example.sec. + EC8RLTAf2ga+FZQVmKQmN7gJxHYFXwQ3FUIQ + fGYQEiF5O7Nwpl5WPmT4062SEw66EW0mw0Rc + Jpq9fXaA2uyf0gWpiuwAlKiLNo/PJNor43Xg + JyIO+XqDIpzW0SQGe6sTmCuNciQvwdORR/yA + iipYsQW402lR1w8mNF+9MzCJa4w9dHuZQdN1 + 3WvkatYKhplmXxOEdpZ5FlvV5NYEuJi29Mkr + 2J05Zr7HLGZErDerRjcQRtZ2Y5NgDTXsgC26 + HB9ODan7Zop0bErddBqXAyTU1p6iS7Mm3eWa + 5GwVrB94jFBO502HIMIyZbUrVAq7K1PXMRlu + /WzABsxYiy4rXER29Q== ) +cert.example.sec. 300 IN CERT URI 0 0 ( + V2Ugc2hhbGwgbmVlZCBhIG51bWJlciBvZiBt + YXRoZW1hdGljYWwgaWRlYXMgYW5kIG5vdGF0 + aW9ucyBjb25jZXJuaW5nIGZ1bmN0aW9ucyBp + biBnZW5lcmFsLg== ) + 300 RRSIG CERT 5 3 300 ( + 20181212121212 20161010101010 516 example.sec. + RsaoHrajGSkKePvJDvBsaLjVCJO5Mk2VsTZA + XfNAWUSi7703MqkMlO13RWdQdEmCx56NxG1x + qiS2arILR0fPMo1emt5J0CnZV2FrRk7kbXYG + 0kDPmhddvIlvTvF4H2WVd1Nysu2SPH5Ve34F + luIsEWYv2B/XmCqY8QFLJXutqNw= ) + 300 RRSIG CERT 5 3 300 ( + 20181212121212 20161010101010 44427 example.sec. + dEOANGqMChlT1sRhgajcl5XbWFT+cPJbITHa + V4ekQxaKRT5/PZOQCYtSX5iOF6lorg95bkQb + ztIV1IUckp62dBljoQ8123vhZOpSgClDXZqm + YsVinJUx3qKO+XvTEGH+vf/b54f8aywQL3Pv + ojw10OHBm9b2vDfww/lZRvtB+RygnoGz1prX + jt3AKnKhST77NZktFg77aWbbO/WtuWLsxgZf + pckBqB12GSES2r6+6JVST6DE4dTOarCeL14z + Z/eygkwFOvXBSG8RzakMIDM4JRUrWC5XQvoF + WVmZ1CQM4TGKJylgc6UosC+/kEGyYIZeuLd0 + iTGYakdsLw++k2XC1g== ) + 300 RRSIG CERT 8 3 300 ( + 20181212121212 20161010101010 48381 example.sec. + ifn21DSpcORCBrZPARt8sL++XfPYx74Ay4Cw + nWqm2tARJex/oE6Frm3iR0BZ0EYvhVjOjP+/ + IGlA8LXn95iad5/lk6fY20YA3MVfovN8qt6w + uSbQDewWIVgfjR31NhPK96YFruTq3p/KwSCQ + ekAobJfx9idiN8B0AdhzdvxLdboeABaUmpkm + 5e9cC3u3pP0fSAS4GV0ibfSAUNnoMvrTXfmB + Bf5nrzx4Weq+AVEa1yltF6UK/P1VWnGAG/Jf + PcCYh/XFoTcZfGjso9BGln24vEpkrKd3kklx + Hmgw0Ypn0SCM5yhaVRgX2UQtCYFD70BvWrdq + p4PfYBm0TZfUnEbQjw== ) + 300 RRSIG CERT 10 3 300 ( + 20181212121212 20161010101010 1862 example.sec. + IFwmeo5tNfQ95J8yoi4gpJJQJ+IUF9G4wjou + Be4bQYLqP5Or2y3bDzIJ3rRjFxF5Wst5Ovyk + zXwEBShFPuQjBXUDoKtCKICR9/pi3eK1FVff + 2xn40PXk8TrfV/xNA9Izfd2T2BmK0m2HBsSW + y4SwyF1sQPPFZC3Z3LpR0yeP5Xo8xD/GUn5C + FbncyR3ex7XYNpBytb25Eyy8+eImzM2D7ZZW + tXucCN1timxMGP1A34zoa63fsT2y3XlD1Ax4 + 14Vf/Leqmot3h5+85cLbrYbNRAj5SGn2MTO0 + dbnGpmbAQrTl5mXQRYXY1VEss+eLb2Wq6Jtb + mF1MJKJHgLzEYI0GBg== ) + 300 NSEC c93f1e400f26708f98cb19d936620da35eec8f72e57f9eec01c1afd6._smimecert.example.com.example.sec. CERT RRSIG NSEC + 300 RRSIG NSEC 5 3 300 ( + 20181212121212 20161010101010 516 example.sec. + YTeprqPKiHtg/ynH/YEPVYktL2Ca2/ZErO41 + NVUSnK74tUFC6X9CYdnslXOewT9HLmDthr2E + 7jBUlu9XdJKbXuoRdx7WDbuGl/Nxcjh3EIDK + Qi+sVxLE94YQH7gAeYSj0t/HneLhwoRdPf+t + pf7O3SHbb7FuBj+cRjCQZMpHWXs= ) + 300 RRSIG NSEC 5 3 300 ( + 20181212121212 20161010101010 44427 example.sec. + qUEKyNbyf5rnPyUEYv5RU9Piglqs3cdkz/yc + by3B+W+bvPa/bUMHXnQE5uaSmQ4eSIhBcDQW + z+/TKR7zBOIb/wda1wzjjlI3tL2O65UE5s67 + fAJrDByQ0zEreXM2RiP8eIdYnea3TENoMrUQ + c/j+Wj1+nEsbesBbfEXVeE730HXMqqCZPRHT + Y8XooxSqBlvY6J/RSS7c/sLYBAc6iHNxni34 + y5vj5D/mV+yd9hkZiPe5SHuYwsz9wjhbOY84 + ndtakY7DfG3txgI9W47+HA4qWZESGm4bvdnF + OKYZudwMBP2KS74clPqjPoradLRR3EOf7SLH + Y/tgBy62TMYXaNDd/A== ) + 300 RRSIG NSEC 8 3 300 ( + 20181212121212 20161010101010 48381 example.sec. + rwPUoJ+kph5rb8FseqpipqwywBvfyfEGT7JA + FMAF5R4tWePjo8O+6b8WPydJv0eck5JYkPX3 + DwJcGBbKiFi8OYt/mdBpxrzhyK2RafMPP0Da + t/swWv1NplkpCztJVjHb2aNAITdofe++Hm11 + NHJE20g4wb47rIzOAaf0fPwb2dsEJhGWGy4W + Kb5mpimb26JaKUUy6mmcwfLGo9eLJc5PHA73 + iQ3cQ/t5/ffQhIXgS+GvgkSF4NKGCuXfoCf8 + 4h+brT3IUv8RRQnWrldFEj8n4a309/nomaMg + iZNx3UAebt8DUHl3URtXh/eQ69+enMDIniUs + bn+t9OXBFl8WOWc5TA== ) + 300 RRSIG NSEC 10 3 300 ( + 20181212121212 20161010101010 1862 example.sec. + acAM4O4hfy0zz348eNtTs/eb/Pjq+loT7iZM + XgyRz0dugP8VRSz4vQmHGYY3JvAvpfGQN3GX + aAPDc+Gz0bwM53+4QmOfei4OczpZoi8dSID+ + fIBS5TnntB0PpCF72pSMR4yyA9D3QY8PFUXg + d6rPTE4DGYw5w1vTIZBJjW/wMbF7MsVG+7Wu + NGLMFqkX4OSXgeubuWipyL6QkSjMseld3dKM + 1IQWDgJeBBhPKOsf1IE/7jVl26/6zISGOOM0 + 2u8g+DbnmF1uvUXdbmsrCviCary1KJ8h0G6P + 8Lh199dYNDdXZat/Vh6xyYgqsov7scSK0yCO + P1FRAWUtLq5SEJls1g== ) +ns2.example.sec. 300 IN A 5.6.7.8 + 300 RRSIG A 5 3 300 ( + 20181212121212 20161010101010 516 example.sec. + oSyWhdoAFyep3WDMhrXyH0m8rvVrdmE9hn60 + tbC1Jo860HcyrnCzIx8KqC0HsmTmlZmTuhOh + ATOMeUREaloT8ShrhMNJKzgxLJ2FY1kCRS/i + CfwFteHCEXCJ198rExdW4yFVQT94IiyFKoXf + FYe2Zc8yZFHoIBwhklXBJuiYur8= ) + 300 RRSIG A 5 3 300 ( + 20181212121212 20161010101010 44427 example.sec. + 20kC0SNVgkIOAfd8S0EBlezuw+Lye/EAX7QB + 0G7WPlJXOlDnMxqvTsyjaoETbxLSqo2lZ5zV + Tz92cULBzIra7F61eXnaaB9jVDk51crpOV2P + rU01sYrYpQlPqoC6gXa+o814lglX5ez3nvT+ + IzIISSU44yhUIyqSCCVzR5wC69A7QrBzumsf + ZI6YvYjqB/s79nPsqzOqxvtpg7GWRYb1OE1m + cd9zRQPi9+uVrTDF5WLI/UAA5NzPuY8U20L1 + /K08/uqKP3K5rdGRgos8hwmXBmSxwnBSS96I + NJaCeIGf96b4cvYDyZ2HQmtS8c1U1iUhPk1d + S5+S5TDnLGwL/XCOYA== ) + 300 RRSIG A 8 3 300 ( + 20181212121212 20161010101010 48381 example.sec. + m9Uk+u+ZJZzPph6KNf5vnyfNWrIByvwQRPg4 + Qs8veUo7XDiQUxhbZ0282eprW0TVVFtD1q9i + QTC68cjnsqHCTKd9+QingWdBr0RwuHSxiPpX + 8Zbv4LXnskjEbND15gDJ0GRy9W8UgtWoUyuF + 3MSK/PCxFuWVftNGnGWCl4iuDZM+Q9C/o8hQ + YI8YK18zgqlOaqSKPqzMiOK1Yobv6direlf0 + iYSlWFBHUkm6sgeTihwSPCrLrjVwGqR4Ux3m + 4bs+SSy1xIOS2nrGNiu809Lhg9arAzkKg9FB + DusYCJHQ5VyP1kGcpWbQNpT7ur1D52rtNO6C + PudRbNk47qsanIbRcw== ) + 300 RRSIG A 10 3 300 ( + 20181212121212 20161010101010 1862 example.sec. + Z/yfD2G/sWFbFsDqZC20BIoKSjniE89aiSKl + n/hqmwzzx1GgoK/uTDs9LlIdp7zESPifZ5n4 + t03pvFxMQgPw5bG5eklQ4Zf/am84DKmIZixz + xaUP+SAMjB0IhdpCRBSnC55knBdHlsMC5ryA + SdBHOcZ5Df6iX57cpon24fXkI8fqWQ7m1MLR + sYXEXs88mFAElh/ARcGIm93T9vwUnk04cxrw + QodpUam47Pjp7C7GY1XExtSSdW+h8KijJarR + tiYYE1dkOPdT0OjzBybRjbuhjaCa7CPPzGm9 + tNMph25m6D3Zv9Eay0cvJHYWnbwOZDxO8w9r + QpkYgVpLnMvYRQ4iow== ) + 300 NSEC public.example.sec. A RRSIG NSEC + 300 RRSIG NSEC 5 3 300 ( + 20181212121212 20161010101010 516 example.sec. + QBDT5kIi+hdEXsZ7b7y/ovk5lGRpKiYStdeK + 9sKrQvNCC1MLhG8DiT+ssX/66jQEEwZWOBsG + R9f+pkm/Y7jImE2KqXfcI2XTaZvmh7bU1wKF + 17PpytMMqj7bvmomvTJwaIZvyzBX7x65Vm0j + B3M1dfQc8AsXruIGlPMyNDJwExM= ) + 300 RRSIG NSEC 5 3 300 ( + 20181212121212 20161010101010 44427 example.sec. + T5wLuqX6ohtXSEIXifG4Yui0TTkNXRkDnaIV + 9yJrRjFk/GqgYhWzwj0e89yAup9eZNKoftVA + bdXOCtEhPHL9lPVK2b5NsQ3+E/TSKvjgxbyy + OWAZRkucKKJeQWhzPBbTach3bkEvaWC8fSCH + K3X4/R0GFQ39qY6bgxIH1KtamqypTp77EkE/ + B736JUPhGRX96kgEu+bumR0Z5Nqi5m24pg/5 + 6k+8OL0o4k+SFMP8va1+lryqtpG7eInWRPQ7 + F4X8DNAoqttpsmf5v6tOpkpgoB+0gt4tNTaw + 6DQDRX0YCCnCBZEVNQbs04qC8Ij1MhyJSPqO + ZOyNSBBNJzdYebkrUw== ) + 300 RRSIG NSEC 8 3 300 ( + 20181212121212 20161010101010 48381 example.sec. + IMXgJDl9M8F6xgSzzFU1GxSpjz6sJ39xRYDj + M9ZRXqmIGtZUbVLYiuGksy9oMX3+mXkRdgGc + COys/CFeVeJ0slUfT1L3I1ZEpCqi0GpPtcNh + muGdvVN0msrbVG3Mfz98vSMg08BJb7r1plPA + D0X1bcO+3NGwx09zHGmrZSlhyGfH+rui4nCK + U6PAlXNHlany8yfzp/t0IWFS/Ryl2Y6nPxiZ + /opY3TJKSIRoXTFgLkxNdiIpyAd8zsbuzq+o + hQ0/joZ8cc6Yrs5zpxksSRvdsKAlqj+BWEvC + 8zGYKygQcv73OmOizw8SSZH1Nhs9Bdv+DNra + ka7jzpkOZeE0bA1Jfw== ) + 300 RRSIG NSEC 10 3 300 ( + 20181212121212 20161010101010 1862 example.sec. + HpKVsDx5dLGlLQEKBKAoMrjHhmjccYQepTsK + CDILuW8b/Zpx5wajf95xlcutNHp/nuntr5Eq + U4ou8jqCmhV6qPXnMnPDoQsmEN7S/Gmwe9oh + X6JdmUOX1UimNalp8BycyBwbc9qhCJyadv+d + sKds15udRnbqBDmmPGur51k/1k3cSCMAKzqu + I3QytXqThwqRlWlOWb032LfnVYNEz5Abwck1 + XeX5LVc54JBKF1R22yofR9YnDAVBHbVjYt0V + ZHtWBtqUTlY5W0ehffEHOBf8r+N4aCA7LfmC + BQj8tG0xx1zFMPxRvlQh/bC1uRtuH1lChoK1 + /ugjjkqZdXRLE9h31g== ) +sec-02.example.sec. 300 IN IPSECKEY ( 10 0 2 . AQO/C76MVA5WN743YYeE537SLNffRZvQ9yxo QqJP943gqs4QATtnJWHQ1SDWiRE2aXl7SJoy JAu7jaUTGKWXzStD2wpkBIJ1IZ+avxf8zxRt @@ -2063,332 +3001,94 @@ br2pQnZ5ul5NCgkhhcr26IPPiZm2eww6ougs ogj6kPdSSQYZYayHzVnl8NFQ9uCwbRTryepP zZP5Vd2t ) - 300 RRSIG IPSECKEY 5 3 300 20141212121212 ( - 20121010101010 516 example.sec. - l5GfjmKbBuz+kN5Zt6vXuI79OxxgUqd+CKMg - HjuzrizNLaLgaI4zV/986SrnxiNn1Q7f6b/v - IHKTfJCt0Cz7oZrz6e1feeAFeZJLDF4AWmhY - nJmnAouu2bWXpRvGvEC20Jk8to3DaPKb+yvM - pCXt1Pv8xZDIJEmUDx/aNpJGJNE= ) - 300 RRSIG IPSECKEY 5 3 300 20141212121212 ( - 20121010101010 44427 example.sec. - yY6veWwWxEb5X1w0LSomZjGKsGegq3jpuAvy - FNl29cLzk3O6FKCEQ61vb8st4661tCuFeYkw - Llx8VN34VHVHZnE8Bf3AXURjJPAw1exTWM66 - fd9/htwG2TcaTDp2Jb05HSkmI1fQwKsUpYwH - cXDGmVe0ClD4oOJ4OsTnUMsP/DjvP+p8fb/b - jFlpUxMUBzybbmSsfog1H0J63l5jL266sB+b - 8eCofztUfcX9omPZycT1p6qJ/ZaLYe0GnWeL - JeMVHLVkP+iwIge5LcfNIZMXeeEtZ3YrnSAf - WxKdWNh88OLO7vC9XTgnxDXRKyxPXSH4BwmR - Rb1IsKIqtFvDli76Ug== ) - 300 RRSIG IPSECKEY 8 3 300 20141212121212 ( - 20121010101010 48381 example.sec. - yfAMmCbwB2JXh6PAjJxPIWVloV90O4VaJTiy - DeVrY7QAI4iTHFFxPlPD0L//UY1Xf86X+ZT2 - lD3X15tlOEbyZ72OhA/+miQNd3rHxVAip37q - Hrkrmi6CtDNRHbxdExjE+NUNTUZH+zn7B/Za - kZP+iT/eeV9lhbaExwk6+ACCxD8w1Achdo92 - tLzH6cA6dVzFPKu0+IeD40gN4d8t2ghJgjJS - D0g4xHhYmzwtHA6m5TJHJ2e4P4YuIgp/DCKK - FARapMyEjBUQxS8q8Mn7D+ezGjnA6y07rmLx - Ov2WoqgdmdI/Xbhpo/U0SrL0lghXARe6PucV - cq5x9fCOuT8lSsc9Kw== ) - 300 NSEC sec-mixed-32.example.sec. IPSECKEY RRSIG NSEC - 300 RRSIG NSEC 5 3 300 20141212121212 ( - 20121010101010 516 example.sec. - l0YvQfuMnpBx9CSQd50J/SFIky8BoS/Xpl9a - dCV8GF79Etl6S4/fY7k2VCr2CqB0bR3+Qj02 - BtTJCqHMrPUjZHL4ug1AUOfPLlsWoE5k0NDm - TJi6Fb8f0kPcdpLOSA8ig60b+zMVsyp2GK9i - d3d/imAL1SUWNkob2B0g3CoIRM4= ) - 300 RRSIG NSEC 5 3 300 20141212121212 ( - 20121010101010 44427 example.sec. - RnNJWYZ4RSDCxNkn2HgcT3/rIjaZZ/2ZkKRp - 6tX+ZeWxqk+sRaCvL/mgM8eFCTifi053609l - c6OASaUGfcJJwF5amQoU4icYOZV7UJdnz83Y - ZVEnUD0ndY2Ix++UOeRCjk2I8H5GfhkL+Kaa - Acf7Eg1CXN6PthcSDb2S1ver2QlOm0yuM6A6 - kJ4CMMWoEtjRAigUGldTQG5Y3ZLoDjhbSQ3v - T3e7nncVkLib7NdTHmkpA8uiV9WIIC7fchpA - KjIkNC2OHFQaF7f1EbyzbLQ0oJuXEYwcANWX - WP9b+nkXhlIXmVEtpHMtoM+L5enYwfqNs8WC - NfzISWHmX+GO966T6w== ) - 300 RRSIG NSEC 8 3 300 20141212121212 ( - 20121010101010 48381 example.sec. - wLPBkQlHUAzWgeLiU0w2fe4eCJBJOU32KCPN - +7Dnvv6ulBgcuABIZPNg3QSB/RoMt8RqIOSF - DOJ4sWB9Q632AXVLQ0zjfWRxj9oNvlFtKI02 - n0zK3t7azjjAYNDiB2nHwT5HPaBrOnT8Ucel - whayIs6iArpERLbk3IuLgux0VRjIfiC8eYG9 - CyYQZL/lPtaJOe8bmXpoJTPGj/jJLFDwSIU9 - pID+nedbWSkS0O8fVYHLj8evvNLQqAGhXJLI - UKrlGw+siO6VrNp4iFo3k84XJm0ZBDon6Nbf - 8q/6wN4xrJmZkRH6Ljvn4HVAamFUXvG62apQ - EV3rjNRYeQNSbWa0gg== ) -sec-30.example.sec. 300 IN IPSECKEY ( 10 3 0 some.name. ) - 300 RRSIG IPSECKEY 5 3 300 20141212121212 ( - 20121010101010 516 example.sec. - rAqWyT3TmNObsQxO0Q2FnG3ZlGAwYkZRCYMv - EYuVBhlaaYA7ZDD4RprckK43l/MGPcJkT5h9 - U4vtJQXnNztWRMpH4Z8jb2LOU1tZzsBiHNjs - mQcYlCGmBRXAZ5yi8DsXZTXsjo3iSKUxYNQF - GoxS17+zY7P2GrGdVxDZz3K6kXw= ) - 300 RRSIG IPSECKEY 5 3 300 20141212121212 ( - 20121010101010 44427 example.sec. - AfB4UY/rL+H/dMztnW9/Ajhv7e0DTQ+f6hAk - PiA0CphU2yQL1Lv6R3X4p4iKWz9CDs/sa37C - QlEAoBiUGMqVpHO8vKHREcfn7v8RJCtvzhOz - ZmuMiqWsCOhVkS/EJJtxIAyeYVeD2fABWwV3 - DfmG1sAslzN1SrGj9DY2LiZch3FbyXJRzvTt - s5wO/8lnGSj4ws5DaiNMWKt5vvkZneU2otiw - 9EXGBJGIAyUpGblzvlsasMQ8j6ixrXiva/yX - 4KSUCa5fNWJfgYllNIzTaEBZkXwcdUYbWvJe - bA0ZN6J8ObsnHd2hBLDV2QBl+tV63J4d4EP5 - tMw/XynRxYFKW1cMRg== ) - 300 RRSIG IPSECKEY 8 3 300 20141212121212 ( - 20121010101010 48381 example.sec. - tMBxGjqgyirIdIZidMt74conTmA1ZmTDZKKP - 9m5HxBTOG3+oMHsi4KOETVUujTlRFMQruL01 - Ii4enuob2MJuZQ8Uw7I0q100KaZzBzcAdSaK - IIcNWGEThNw5fE9VTOMLMnVxJoJZFwlpDnZP - MF26aP+apom2VLMx6t0TYpKAkKYjln+TW0Xb - TaKf5lTW9CnOEVLEa9YOUojGFt5HWyz4X0cc - LrjH5f1OV3H/TCIpNENr7u+iMBUqt0gfF8l/ - V3Xa8sm+R4YDII8Zkmj4rIbPzAKmqO5uDFMx - shYjiTxued2fAw2a+4dqWMgCbOm1utqEDE2Q - dp70f7dYLTy4scQy9g== ) - 300 NSEC sec-31.example.sec. IPSECKEY RRSIG NSEC - 300 RRSIG NSEC 5 3 300 20141212121212 ( - 20121010101010 516 example.sec. - IM5xqIiOsST2LlMPAdvfmwhXiM4xBsVEOMnK - z7W6bYj/R22EzvC1P87j1RlleeHX/rzd1jvR - FaDTOWu3vbRO+Z4tfY/TGZOJaocIVqidsPsO - M2yWDhRdWhhgq49D0RlfHeSQb7VCIM+Sao0R - tQcOqb0HoXsCd1JXdaVmLL7MRG8= ) - 300 RRSIG NSEC 5 3 300 20141212121212 ( - 20121010101010 44427 example.sec. - r+pgljSgBNKaECIwN+MfiquQ557TXPfsYxUA - 1efqX2cbAlYTFVZPuPsTXSb1frWtdCHzCUeh - QhU0oJlDqmgT4nvPyXBnpmvgM691TnZz8Zmw - qZP/kE/m4bjgs3KwKXlUsDcW7iTmI2XPfZmX - f7BxuBrvV87DS2x4YbHhfshXhLiDdV5od/nC - aNLHrbQlYKaV9uWMcdggcMuaGxHn6Q6VgFMX - IAXhA6Bl7jnogVjtbE4rCE/E2OaPNoxJMIJ2 - TnNEvroZxtW8ctZURG9Q8H4riIfaqerPb6hg - x9wFi/eujNlQpE/L1RF+EMmyRn38mlm4W1z0 - 10kjKRjbQOWUphDG4Q== ) - 300 RRSIG NSEC 8 3 300 20141212121212 ( - 20121010101010 48381 example.sec. - lFP+AFHKPP4KOaZXDM6yiQp/OYodqhojrTkA - ZBdLSGoAZQAGMbb3uzcQUQwFuua9mBPANnsw - kHYeyKa67i8CXiVfWFN1bGQ7KCxcCJrRYm5o - ePKAf2zoI8aoTtnjROS6CpG6lS2XK7zuc/FB - 7oBiAG/QPl1gyAWwvk2kRTjxpVoDwyAQnSqe - hVxQtdOt7ahOmW+xl9xUQcrLURbv0lanjjyO - L0PCnr/LbWi5q7a0VO27QgvOReGJCzm8sCdb - 3aZOIz8c6rpahqy9WR/u3mA2WkN9OxMsrxHi - oETHOaKPzg0ZojW68LAoh2YxSjWaiw6P41RQ - 5qL9Hh4i9iU5rUrLag== ) -www.example.sec. 300 IN CNAME example.sec. - 300 RRSIG CNAME 5 3 300 20141212121212 ( - 20121010101010 516 example.sec. - M4e9BUzl1pzv5jJ7jrIxpIgU6UhUnyFJOGs7 - 5LNW93WKd4Edqh5eeStwAdpKzLUN7eVQaYcD - +wCaQ7MfazDqC8TaVGRRVGmhmsZkBpZXgQ7I - 2eETGSY57rMqQqmDYs1dYHIi0AVDDA0/yhFj - BlaXl0aqceouM61vU2ovtYI3EIA= ) - 300 RRSIG CNAME 5 3 300 20141212121212 ( - 20121010101010 44427 example.sec. - cLYw1vhsQYUI6NSqvwTT8s2CV3atwm/rhekg - nUc1MVFZFYGYrxgPT2KAZ0LHg9onbays2kZL - wrn2X5VW94eOwhDaA4Kd2wpO0hbuKSbLWn+D - HxUtAjdLDjQyXH0s1nfjYSMrjY6BeQWsOIWi - 2Jt6SCEEt3oZhDWmNflKk30wejR/03eRAdqn - BE3X7eZPw6koEKQQV+djGv5dK5d6D9ywcAnA - tdiE1cCQt1n8daOuVNB8G2ab3NrlPGQ+yzHF - 8rdLiNS4OCiopSrk4x5m3mQykzJcExbR3Gb9 - VSP5wEWkl+GP9a6eEcY6AHWb0ZAL6bnyvUFS - XbIX82ewQvjLzbahbw== ) - 300 RRSIG CNAME 8 3 300 20141212121212 ( - 20121010101010 48381 example.sec. - U84nYJ9iha0zulQtgH79h4BZy4vRQL57Y13P - e+yGYb29AAwJTR3euJWwtKtWRxyXbssyGiBM - KaLEEjd29VXLai2ZnWPVDJ48TWHMORj8G4uJ - Li0oEZMuBBhIUgYXXEZTQ+u9hw46hiIGGzhF - A3QEDOfxXPzi5gqgVtULXbTaaxRptHoSToX+ - 6eANmce7lN5O/bjGWANG2ngf2qbhOBAjFVSW - UjFQJyZOME9/VVfqoLXmlvP7sBWSwJCIdVkl - CkrYUgcLYT6gF3Ym1FgHqVnYOiNHL24PeI09 - 1kg+SOG5gU24RIBWG14zSpuztU1XCSsje/D3 - OW1jEQO9VvTQ79pK/w== ) - 300 NSEC _443._tcp.www.example.sec. CNAME RRSIG NSEC - 300 RRSIG NSEC 5 3 300 20141212121212 ( - 20121010101010 516 example.sec. - SFkcGKNRIqjuOPIyR7rPoEmNj/1FmJ1KISfL - zFVnW4zFsGMRAimqX7H3WhVj3JRqtglEA2M8 - 4RCU2gr2Moqk29Ef0Ab/t8lxCocR0VTtd/ui - 5f6ZPCoNls/cVc0F2shAFy9uACtg/vOQ0JOQ - 7pL3DVLCBEeFwaUwohlgMEdyg7c= ) - 300 RRSIG NSEC 5 3 300 20141212121212 ( - 20121010101010 44427 example.sec. - uCFXDUkjfk1oFOep8G8zz3Gzcy9ERqRH8Y59 - syns+HIL3BvcTE1/Ay53hojkljKeQljnvIZQ - dzluDtJEj+BlMNjWgfem08VSHQ54eaGEWZvT - yFSAPp0SuXbXPeDrIxNzg0kjAKinkVv9rWef - p6WEukS6exUJfWkIcFhYI8/tFT+YQUxxQE6s - 7xi0IPOldV2re3pJnH0xsptQlTaVZzeVgbCB - j+hbATX4vv6arYcRbJf5RMmpqU6Hx439VQyg - i7bxwElezV07BmHPG4D5wcKW80NYnONQRfBU - xVCx4bmeE5aLnTJB4PitOVH/t+FCrCywboMC - FkcNbOeM0uBvx9xePg== ) - 300 RRSIG NSEC 8 3 300 20141212121212 ( - 20121010101010 48381 example.sec. - eclin/1XUGbVezE0CIM3sNn2pESSAonyfnyi - EosJopPabPNoucHsW1mXa391ErLx5ua7nxL6 - 2cLdZwxCamGiBWxj9p3ulM9tweJ+BRkEQTNu - YjwkphZlCo278m2ZSbVz3wA456AUNyid6tqc - jzXUG7xkKcLIqNGJGuPR3Gc+M1ouLZ/6MsNn - 2VnbsRJg+bqFrccd3F0TUul02td5OBI4FlMn - xB77ltqZo3mkIUgwskgoTrNRb0otJoxlYGVq - 8V1qO0g9Gi4LCzanK+s8CYaE+ImIOV4oJz7G - UXS0LAuqIEJJNRWdpeLvRMipYNLzAppAZN4j - IaCXa9pE7/iStJGRjw== ) -_8443._tcp.www.example.sec. 300 IN NSEC example.sec. RRSIG NSEC TLSA - 300 RRSIG NSEC 5 5 300 20141212121212 ( - 20121010101010 516 example.sec. - rT7/LuOh9UQtWIl1QJ5d/Qcy/YJH+kFRI2rF - nEII1DR3yEuAuz/IQBwAbN/Q9RUXdt98Zza0 - KobvN8o3QVPUkXouJiS5D0GJbmnhU9YUvJoP - gxU/ONagplm4eLB8Ehqn0U2z3sOPFuf9nrKH - MnadGiVdYMSeqwM8IzWDhluk0GA= ) - 300 RRSIG NSEC 5 5 300 20141212121212 ( - 20121010101010 44427 example.sec. - vZ9JMfyjj1tPn8z1y+87J93N5ZfJIxl2ULyl - huGe3agDcbcvCoqW1G3g5j1Rpno2WYF8O40w - KVySTltRQtf7EuiEVsvYw2NqgfUaYXbv+xLx - wQ3XX0iqBQslY/5GmptTTqKoYyQ0ooWseN1u - prLpoNucpKu0k+muBU9tRk6v0NGU/FZz4lwp - ozQNVakLHeZlXQZvyZWerg63/dxhmJgaTMeX - TGorae+9X8DSEvLxk/CWbEaFHWXlLyPYnat0 - njeN5leMB15JJfA4Hfa6IrMuRyVkO4GPL8CX - DB7YcwELt3A8PCGds6FT6l2Oe8GIcdb4qRQa - 4aSgi6kwgAXvnHPnZA== ) - 300 RRSIG NSEC 8 5 300 20141212121212 ( - 20121010101010 48381 example.sec. - aeVnnhP5UQu0xtDzs0uq/2kcvsAo2lXiBsqV - 4dAmwnsdTQFkWQxa1JyqZar6AxRpPEJOTSOB - rmuOApn9YbsTbfHhG1/Seh+kKyJdoEQT/oiZ - xb6x1tZPPtoyzD5cjIlEVK/mp6e+C8l5sXIi - EnonJxeKmtPpC6L+V3wFpTnpNG0OQ8dmcwZF - mm/8yKZoT2P3fTmwgQ7IIO3hJ2hmAJJh88aj - IxORQd3UK3A1lPcXLXBFKmi2hPCWPLR2oTF5 - zG0sc5yGmqDtAA8Y9U5Gjfh88fbdiQu0ZGLz - MtyaK9PrwLJUoY3+KX8YXQC1WrYOjmYZYgGI - LEgtHHbWKUZuzdAihw== ) - 300 TLSA 1 1 2 ( - 92003BA34942DC74152E2F2C408D29ECA5A5 - 20E7F2E06BB944F4DCA346BAF63C1B177615 - D466F6C4B71C216A50292BD58C9EBDD2F74E - 38FE51FFD48C43326CBC ) - 300 RRSIG TLSA 5 5 300 20141212121212 ( - 20121010101010 516 example.sec. - a6fW+/Hv5PA5jluWFZTSn66JYhM/cKlfWcrB - ZtSqAVvqYrMxbARcqMkVkQN8W0eFiZ+6Pqpz - cm2jpDLPn9MafMBsM3rc0VxhHPssxghDXAO6 - eYcyf6HOkw5tNimo7GNXfxsVy0W69994+m6z - wWKMTm4gLS8ABjpndjxQpPDSkdM= ) - 300 RRSIG TLSA 5 5 300 20141212121212 ( - 20121010101010 44427 example.sec. - CqUhSqFjikCArbLTOacgjB+RK9d1p20eu7ni - kiQx/P0evcYvvLwePeMJZntWcaDx+slpqf1G - YoCpNGfV1T61JALjrwyjz10hdEmFNQJ3H7yf - Xp29pkK7AqUaDDhk9gvZ7vGyaYUOhLUcdb6O - zr4ZFn/T2W1vN9Qj+KklxGTJg9jIIdxeUJOo - lAx6UiKE4xDD0bS8sQqG4Ec8+P07/oKyjZR4 - Wemsrh0TzysiOWW8l944GX3oNQVHA0Cl1RaN - HWDp/OhMY9+dsPVtP0kQ3tivyFV/ZgDJGyQi - nZWgeLtDhdUo6fHDTWTgz4tOtNnhPC0GgLwB - S1IOHv28cPRkn4Mc9A== ) - 300 RRSIG TLSA 8 5 300 20141212121212 ( - 20121010101010 48381 example.sec. - OJTlC1aiTM9UwKHbSFe3q3a1oYdRRMW10lT8 - gD4boY8aP2dgWDtaMG3khRjSmSessmvHGw7x - wUnOnk0M3sY4HnXwK3mioWRNdyPC8jYuZJJ5 - w9QBEDVvpXwYISm1hi+WD+Q62VeEQ+9Du0uB - qKSQKiFi5FE51mYNKmnjQUkoJ25aZ8ykGjk9 - LStfwcxX/uE1oYpsW1eo73ry2YSxAcUQNMli - 3BiKHnWV9uLz7Z+YBlSkBylQposQfKCVVv9W - Ipq3wyL67dGXRNJ/zdOFVT4FYX5k6Aw8QOkl - QLhF1yPx+fVsuM1Ae7Cmq2Bjkr+JAVvRVSBE - sxWTVdJmkaTv2lK3Jg== ) -_443._tcp.www.example.sec. 300 IN NSEC _8443._tcp.www.example.sec. RRSIG NSEC TLSA - 300 RRSIG NSEC 5 5 300 20141212121212 ( - 20121010101010 516 example.sec. - oKnCz9oWOO9OcUxeeOOPe1pxPnLVRq8k4UKz - M5utgsqU687xWJBRtzRwDz4agyT1TPtDMdvm - Df2v1pXvx8GgdDYTJZmZTv3lDJ9Nbwrr80AO - lGQZgajAbKrMUiwoE9kI5vkPogx/Pnh2JAgu - q8hpapOMtMdKdidkshH7RlW2lDY= ) - 300 RRSIG NSEC 5 5 300 20141212121212 ( - 20121010101010 44427 example.sec. - kNbqHCDsVwRs+7jMZ9Q5XwbeDr9xmEg5VZxU - 9NViIHZHqVd/JJQGCwWGkY5jcToQuLTJ06js - 2nBsPzzAWNDJGv3HU8Zp4ktYu9HZ0OooE4Fa - zN3j1uuqqHqPQGzb8neeKzEcqbV8m3KIWtBI - viSSQuoXK/c2zERyed56rGJb2J+TCKIlMa82 - ZLJpzVVrBFPWuKVtpG2lN6ffs5/HqE4+7JiI - UmEhqukUPMeXFcYoXDFx95VyzuIUf3mvhLDN - 5iXsYTrbcXEN1rybnrfO6esraV983hxvx65S - TuEiC+4us9O73NzQQGQVg/FnziSBIPayU5eB - 9Qj010JsT8TuBImc4A== ) - 300 RRSIG NSEC 8 5 300 20141212121212 ( - 20121010101010 48381 example.sec. - sY1MZuqEvrzYlOCuw8GKrupB1W+E2djH+hYF - b8NWkS4deq21EEXNF6KM66npXaALn+e6Jt5p - DCTWdxmJzg1V7QXD3++zLREp5L8ICH5OUdgX - Xl5YNwxWYj94UcO64oATbLdJ1Y2OM9TMDRvO - pVa5OOAh58On24zJqm9BowvGGo13nJN1ibIV - lCQc4VThk32kYcn3o9/urzIF02iovp+UPb9e - 1GYLuCiOgqYqq1te9UAHv965Dz7VKOSG3MuE - Ni1lZdOQnZ5LBe2VyVCq9+oV3Zw74S1hevWk - Fq8ixFLR+fc+mylEeIVbKEhpGfWvvJE93lk6 - Vg9n5kpwhkeM1Edbzg== ) - 300 TLSA 0 0 1 ( - D2ABDE240D7CD3EE6B4B28C54DF034B97983 - A1D16E8A410E4561CB106618E971 ) - 300 RRSIG TLSA 5 5 300 20141212121212 ( - 20121010101010 516 example.sec. - Q1nMaEHS/5pGGOmds2suU9kHpm5oInEQU29Z - JNZ20BWMq2hb1C7GMGJCmB/18IvnxTTCPzLV - m0T+9lQo7UPdmNatQlBRFLM1YjPw5KT8CP6m - 4uWbSbVZWtGN+rx3gon8OFnTcgh667OBOkQg - kPBd0yTQY+rTjaMfTcP9EunJm8c= ) - 300 RRSIG TLSA 5 5 300 20141212121212 ( - 20121010101010 44427 example.sec. - d9kmVufd0Y+v0RQ2zAOffwc3kzfcHoh/ejYn - NobWJB+jrGM+VyG76BiTd862+Ij67kKOVYY2 - w4ToTGDvRqCw4ZaGfRt6vcCnfrg9FlCOjwEZ - tpJsuf3BtzQXa1bSwJwNC5UBHiGhpD7LN7W0 - G4YHussYcu4w2iFZTif0TvXN/gSYSDMliTHA - 5759FTb+MfKb84Ccp/YSKKebHataTXQAYWd4 - 6dr3IeYfjVyqQg6VYEA2qHCIJfsRxN9gDR5K - oCzN1bDfatwSO5eV1KVuRgV/adHiPApxpfpR - 8wPf1Z6Z3RnplVJdT/jnY3SVA/PLzsS8mfOF - BF37wLnLKc+Rp9qjbA== ) - 300 RRSIG TLSA 8 5 300 20141212121212 ( - 20121010101010 48381 example.sec. - FTCh6C5jbvXb67BRf3nJgL8iStbsNMe+It0K - 2v0GKePaE5gzsrJToZpzWhytVA+OpgBdWkAP - IYWubejwoGXYp/EDU1FH3SAA3zV5N2W25lfn - XULsEWLAr7gCpdeamG6Zg10qOVnfWYB6iSaq - xisMO90+luZz61i0J0/wy6aVtraTrn7s+Kpo - KHuZdV9hWZzNl+1Uuw+hEzBiWxEQK+0VAh5X - 3mMqD6f9LgfqaD2L9pmyZI3Un1UBFn6qbbfu - zl0Ff149O/9dfRHFrmtrNJBnHindLFh1sRMZ - yNXbUcoNrzwfQ/Q9Uzq/ZCGKntrWLB5mHWBx - bJj+v7003y9raae4vQ== ) -sec-22.example.sec. 300 IN IPSECKEY ( 10 2 2 2001:2010:1::22 + 300 RRSIG IPSECKEY 5 3 300 ( + 20181212121212 20161010101010 516 example.sec. + KFMeLm5jSyJuu1dYPNjwtFd4Ojx8/o6Rf0BL + P0dRMWwSjAs7ncbP3uMOUdTEnVko6EsjWTHT + dakYr+D/RHiEgH7r95BidEHI5FXFD5tzCKNY + 3Jxo1eLw/TSHF5VPMty0/Q8QgwKs3B2lGiFV + 5EMy1Gy7sBki9ZTmkts1anW8tA8= ) + 300 RRSIG IPSECKEY 5 3 300 ( + 20181212121212 20161010101010 44427 example.sec. + rFbj5Kieh1vU2CxD/xy7bl/xOasrPpapBXsn + mMijzocDzvrNbxfB0+sKUxdYGgW60oE0t3ds + B8tud5HqfW0XuDeZ2WjpuamefUifeEpU6x8Q + oO3Tecgg2NDSn9A1mlBrgfWybrkLNa5jWuW2 + wFKyzHTUOSzqnYsC9MHZz09OszWshcy8Rlds + hKBnMaXRUOzerwtrRZ0zWpllMfQ104F9hTmS + 2O31UAUDzsv2TjQ5/Fj/15F1FBWGYMRjP0/W + wdJ7h2d+Fv3XJTzYvH3V/qx3lpEEymfXGirP + Jm9IZLMZiVXeqYKS0MIpbJ8SVp7lBW3rTYt5 + aCrivAZ9Gt/oGAVGgw== ) + 300 RRSIG IPSECKEY 8 3 300 ( + 20181212121212 20161010101010 48381 example.sec. + ble1OK51ZiXuHX3RfWNBpt5RbG5yM7wWbIu5 + yHe5oD56Fagowo+flqjQ/xQXZ/n8UG7Mbd9L + 0jq+gg4SETDl752pw3257a+AvZYtQw+e2iyC + lKLQEofIMwrfJlqRXk/1HO176pqc+h7XDThQ + 4gH/RkH5MSWubmG9z6Zli/hM8ndIxebQ7Wgf + 3Gqe2+JVzaG1RBgrtxJ7DOmHWOI5+8WOIdTQ + W7XHzjYOY5fqXCSs5Qkr8v6++KKgJgy8Emsr + ttnKTP+yUL23M/UDMmYTM6MhetsyRF10rEUS + CNCOfSYXyBvEeBxUsSWV01/LRcL8XP1fBt24 + YdfTDsfKtfUxYu04WQ== ) + 300 RRSIG IPSECKEY 10 3 300 ( + 20181212121212 20161010101010 1862 example.sec. + U9SWYQdm78OqWlARa9Js+gltOM39ndb12Fw2 + 3OpXe3J4CKXypDVcJ21pPp/u3eH+ju1BKLOE + 53/UUUcwXFBmzpQBzfK1g2n6hF3CeHx6PX3i + 1Lq5YPDePqBz4XHRCllgOnB4fkISle0uhRlt + MLALW+BAilqVs2JHsi7ooOR5RHbDEadUDJrB + tMaIsqRUEkAtvRRB1VDBgyTiU5k4nrXdeSNY + 2rcXYkK7DsRh0mhBX5CYHQJyVKtqlqK7WFCF + SqrMsWUeQlXkLCt7rhsHbsiP9hkEhm0t+Vnf + LCGYQMp5N4TC/UewMq1XBmV7oj4/BdeSIz18 + E67MiHX8skvb+NBd/Q== ) + 300 NSEC sec-10.example.sec. IPSECKEY RRSIG NSEC + 300 RRSIG NSEC 5 3 300 ( + 20181212121212 20161010101010 516 example.sec. + WfrxxSuFA4fUfSkH7MPqYBLR5Gu0ciFsIaxc + 4RvwDP9RemntRt8q8KfAxpngjd+gDpsWFNpl + HErdcb9Gim/x9jFyu3yb0cHu8/SAxL1HFZiZ + RzG9geX9gQSEgzQVdsDwMxesd4m/5uTdxnm+ + hstyplQHPbWzS4hmw3jfBD6qTvQ= ) + 300 RRSIG NSEC 5 3 300 ( + 20181212121212 20161010101010 44427 example.sec. + xtuCY84o2p7fEXud9TFbWA+idFgiKH7EfVZQ + JbPxgxCr6K97EcCDaVz3h6p/buhGPzOkjZIy + fOkwTD/DHpkcRow7ZzoYOHrFL3fPZTLAg98T + E+NxlQkrZQqpfIh3eLM5tuSvJq5kgG4eOc7B + 8z0jDArk5CQ0+R+WTD2XhxdYvhBi6qy4SIzv + M1ja6Vel4WoEysx7nzEju+SyVG1SYgx28amR + Db2q+9HO8G6R2aqUmSMKef/Nn2Ci6nMWjgfb + zxGwdMpwNLsSD8zOqni38rUpclrKLYZ6c2Hi + 0nED+xlwcZZ30XoWMSKlvuaBP56/s9B3LICY + ev8Gv7693c/7s6YEVw== ) + 300 RRSIG NSEC 8 3 300 ( + 20181212121212 20161010101010 48381 example.sec. + QIW+9Mz6a3qTOQ5q1XgSK++F0BM6LExejjzN + AUsY1Nhdhak6fmk8eNs6OunhVP4JVnFgaREn + jhzjYaQduSnj7kMCcjcu+2s07FjFhO8tUxYa + Yk6gNFhjulbySURFna69mBAH8ZG+WZay1oUa + uBdcJLD57WkuYhg0jZB4W4BCHU9gjzrQyyG5 + nu2CTz4v1efVgY1Dt8/fQHs+jMEipwiuZLdO + Nz6bu/orwMfcPWY1HffxB8Nc0exMuDxsdzs4 + UiB1D/GTrUjZz0dfwtXqGv2672sDS2PC2d6w + Rt1QVl0W7paa57JUy8t+eGL7c8INMybCUlw6 + FlG90wVdfSHTff+uWg== ) + 300 RRSIG NSEC 10 3 300 ( + 20181212121212 20161010101010 1862 example.sec. + OtbnEwYt1s9dhM/rkAgWVl3WRPoNYUXJiRr2 + IGkTgZK+YABHNf3XX6Y49AB/S1SxAQQEJLme + suFsUnxGgxbwC60sgKJP1247NRi5R3XpkY6a + 3azOYw7qCE2joQvRmf+nEqzWwd5iRRPQixAk + oykADq/LLt+grsoNnNdkqybZvMLJoPY2ViIy + 2lJ9E8ArMMfD3dPf5tUR0TTIyBzrvUIi6cx1 + gW7gHdvC17aDNPYBMwZgG7umuv2u0CIRqvDo + pHdl8WJKJC8xtRCrVjptVmCPeYnx1e2rYfW8 + z5T2AqtX3P7+RxB6+si+r4f4/L1zH7JJDp+h + aqh3e0PJOUmxXtoPHQ== ) +sec-21.example.sec. 300 IN IPSECKEY ( 10 2 1 2001:2010:1::21 AQO/C76MVA5WN743YYeE537SLNffRZvQ9yxo QqJP943gqs4QATtnJWHQ1SDWiRE2aXl7SJoy JAu7jaUTGKWXzStD2wpkBIJ1IZ+avxf8zxRt @@ -2400,130 +3100,543 @@ br2pQnZ5ul5NCgkhhcr26IPPiZm2eww6ougs ogj6kPdSSQYZYayHzVnl8NFQ9uCwbRTryepP zZP5Vd2t ) - 300 RRSIG IPSECKEY 5 3 300 20141212121212 ( - 20121010101010 516 example.sec. - LVpb6IWrv/fkkbRP+/U/4i3za41GlD4BKBgc - U8Q272YAusl5Kq0qvRoOvjFqRwbz0BVgtdj2 - C+BkaKiPs75iw8+pGct96WQHHPCitNxtWod8 - ZtV39PgnRO2XqkeUDxXjih179ax8Po8LFMyP - aqUkkXHUaOyCVA6pmukDDN0JaGo= ) - 300 RRSIG IPSECKEY 5 3 300 20141212121212 ( - 20121010101010 44427 example.sec. - 4UrsGwZictKFk5BcOJTTMtg6VADhPm6v9CHl - S3czYvvqFxAmV38go7uWorWhgQJhAYSF1p08 - Rc2M21ou5JQK2M1ifJU7CoT3iyMicRyYgMJl - qpa2O4s8wjf4Ikp5n3E7ir34F7uOkLHGDj6P - Ll04UNf+5sZnMTqXErJPkxFDG6OBeR8PWQvF - DXlbeqlPRL2P1+AmA++tr912JZPTNTsykWtv - 7pcsv++MB6MZ0c1bMzqza7HAh9zXiKFyS0tL - FpWIUN88zdau7QimsIDXSr5rYJ2qRS2UP/JJ - RHdCGsjNPkw/wEhGTnvkh7XW5c7c+pG3pt5E - ytiqkkeoM7XLUCSj/w== ) - 300 RRSIG IPSECKEY 8 3 300 20141212121212 ( - 20121010101010 48381 example.sec. - qXvlXC9E4JCVNKb40BfrvSW1DYkb5MaqQ6o7 - ds41koCGdmRSPsFp9W3Ut8/mOGZDLQvU+0sM - mRGDuz5CJBHFCUuIy0RqrTcd1Hvb27aptkhr - 0t40iaRQr3nTZpYFwV+3dp47ux4qhbIg0s09 - 8GB0VZSfmdqvdy4Y5d5p/QzSka/F7it05nWJ - IewpgrKf3aa3O0srNwwVUi2ZXzPelibx1J6r - o73nxNmNYp8uWkY2tXTvYAfbqvq0+rdUv8H/ - LxNzKDElvOcat4mX7Wp+Uftp7jgizblFtqHg - cASPgfKyNZYGPx5pjVPKbffz8o8XtXZHbtOf - 3rftFlPcw8fnCSMCLw== ) - 300 NSEC sec-30.example.sec. IPSECKEY RRSIG NSEC - 300 RRSIG NSEC 5 3 300 20141212121212 ( - 20121010101010 516 example.sec. - IevfxPqRcQEP4aKs8xesSnChDAE/33+a7v9x - Uh7eb5CzHJ1PGqwcjDAeJyO6Y2dU5BzwAXv8 - gNm9MsxRYz2PQxy1rmqYB0aBt+vWHbRUpksP - FWOHeDN7KNpszF3r9DO4d593gbckjfC4a9t6 - wpkvsxy8bv654YWQAlzSe4X1UN8= ) - 300 RRSIG NSEC 5 3 300 20141212121212 ( - 20121010101010 44427 example.sec. - FDC0BlhPEF+0WO1Ft3C+cnUSn0Hl5P7Uc+Ar - ukmVZgYVY9ChaujthxcFwwJ+fuNIfk6fuu2L - Lr0ya+iuuOpUrMxF/xWxSnMNTOhrysjA6DrQ - svSGZGHJPfRcTR1hPZQBiz6wl3oxwwUE9uTR - O1J7IDHsL2sZ10jGVIj9YPFhPtcAFUHGMEIt - qeauxyZYOP/IZ0AxpXClQ5+zYepHnbcigebE - cn3FDSgxDDYHJDz3C9ebuXYzmO4+X6s3wmbQ - JDgSFSz2hHdYTv/vPkIkBYBJ4fOMSV+LgltC - LnyE9u7m4pR8Q+kijkOD8LU2Bh9++SR4uC2+ - Et80y6CO/wAbDGJR6Q== ) - 300 RRSIG NSEC 8 3 300 20141212121212 ( - 20121010101010 48381 example.sec. - S1mlTix9jV3mDmRk795AWNBC+ylzCsWXkArn - CK6wW7xXdi6vtSnvvhXzov+zVHZNAMwwBkhJ - 8YLHZcjANtrYHxgre59bAYahwpTUR8lqjJYA - RnKvVjGcGZFZPV8CUcY42A4iGCgvl1UiO7Z8 - m9VzxPJ7LjaLBLhYzdXBqC+SFSyjpz4fAJDf - J7juj1rPhb5OnH4Ca2nEWlwQGn7enesNWkU1 - Yd8QslOMrvbfzmlzB6JKrDecO1aMz+soYbmr - TeW7A0VxVvFNdudFtU0fjRgM7lf+IbGEPf5z - oQT8kYhBG60XHITDaEcqTQFVN2wPayYUcPji - JoTeGda5m0g35bZPjw== ) -sec-00.example.sec. 300 IN IPSECKEY ( 10 0 0 . ) - 300 RRSIG IPSECKEY 5 3 300 20141212121212 ( - 20121010101010 516 example.sec. - enZEx05BNsmnCvan+Bhirxn9/GJel5bTDM42 - eQV7dH0VV11kD/QM3JdhpCmJASFOo1P7puXN - WWvRkCnSyokSMwDkOiBBHqzA+XBVKCZMoLNV - M9M5OJbXCaOByzHPlJEfEOisNsXHNqgFJzXb - 8NuNuTLUOHd+z7vAt2/y2rsvmCk= ) - 300 RRSIG IPSECKEY 5 3 300 20141212121212 ( - 20121010101010 44427 example.sec. - Q/uFwU74dwroyXluozzM/VZfPm5YIslvHYJ6 - IPoVOVWkaM8hiYHlN+IxZMuaCtRK9SWyHGZ6 - ++/hqeBW6KezUcpBeOpE49tqNS1lFa2TQCIN - o602Z+Uq1ZaNsxNRzCen8nh6aPk+Ma3VMQeZ - pjifEf3LKrPNOqcocr+vBrb/yTP4Ns9aMywK - Whj18XkkUvZ3Qwc5dmkY24Tr//YlOKieyqNv - k2k1HtU7i1igtIa8/EZ1LSID3P1l6MhnSoAc - vHmqcEo50kZiHPEBRuP9vMxeLo03C5ogetcA - 4qSlUsz3PyDKSNXLTn5Oy6WzdnrlZsaQZml5 - tqE5oOqMAn14NWkZYA== ) - 300 RRSIG IPSECKEY 8 3 300 20141212121212 ( - 20121010101010 48381 example.sec. - sWztwS0jdkc+wToR+bYvyH46tiotZ3W/YdsD - b30HDNZovIjbKXNLofxglzpvg6EeRnuZi4qD - xlC38uoE7Poud7N4l0d7hQbQkz5gdSbHlcII - 1TmOAmNNyYiE/7kQHYyfpHPPC48p90bSjPOJ - S9bHdKKW925Vp3RN3MfI4dhNNH+o4xqPIiLY - ZB8jwUHh7zbs0EgWbFiBCtiPsaAq01pAwWp7 - RCKfJ9w8wE6dq505icDTLhBrWf15QYPNDgXC - zjLn9pmT+YGWhs6hgPiW5/y28nbiwID2771P - qXy56JjbqSgGBsgHTxE7iBnXr1nyOFrOEyUH - V+YrBe5waLIpgn3MxQ== ) - 300 NSEC sec-01.example.sec. IPSECKEY RRSIG NSEC - 300 RRSIG NSEC 5 3 300 20141212121212 ( - 20121010101010 516 example.sec. - L/At1YRILr1Obw284RFZlWU5m1MCYtjJNg/B - XUOlcATRaiCPCA4ugZSJz5EWO3j0VFcgMIHN - ynyXm9Ng3SoSO67r5KI/DrjhqdXQDWZ5JNBM - VrJixQpE3Q6pV3CXvHd9e5z5WZnwB1Ns4p1e - S1K/FdSp8uLotwOpedUPS8TEb5o= ) - 300 RRSIG NSEC 5 3 300 20141212121212 ( - 20121010101010 44427 example.sec. - zkP9awQpTKHAzBEAY61Lvbhnn2gEtk4EPYkm - 4qxVfs9Hcf12X6qRtyK2j1Hb/WuynyhLaZ9O - 71Zp6isKaG7+gTBGSz1RF+oEcRJRl6r3iRPz - 0xzL90PcGtREtbUUz/N9BXDbYT2/w3kB89up - KewS0/Eb8zV/63YcJqRdurzk4FgJdo5kUb+I - Rs4XdZMHMIF5UEvNuKocsevLn1ldP1hpN3a9 - SFhUL7nsA2XdKRcEPA63MUS6VYYv8OWCKPds - z1c+/wvBHksDiGe2+0peC2f7rS6XMoULl1hL - czlYssdSkiQveN/K4pQQmUssBhtldKIRq/63 - adQouGFFSMuEdPL9yg== ) - 300 RRSIG NSEC 8 3 300 20141212121212 ( - 20121010101010 48381 example.sec. - Lt4gdhFZgltCfgukt7w00G/Cg//MJBLSAKSd - gxtXMP20hvZ4QvSCQ9KSGwLq5ntnRMzQFYSv - Ew28bIl7SGW4fAPALl9WrXMyQ+WG4Bja6E7U - 99iYx39j8ZqmTZO/Z2OsH6xM5TPJFO0x/uRY - QEBeLl7mFVljPh1wA5NmMw9fRJxSsR27t0ne - oelM7uZGYPFaPYis1fWLeH+xheLOXeV5QvHr - MZ8H6xsrSXFhdr09q9+SRuWIFI7LG8DLeiAV - UaeiJwd5HTbFOEL/x3KcMH5dUISseyYZmr4+ - RdE8KbTgv/c0xG97k3q5bne9tiBnaYsI+0Z8 - hBy+OVaiQ83HIRpMZA== ) + 300 RRSIG IPSECKEY 5 3 300 ( + 20181212121212 20161010101010 516 example.sec. + goJhatdkze7WqFGplnO28uBT9AHjrsrK54Sb + I13110ffVWk/6DaQhNX3GanFXDcbhi1m0N7B + MbYFIWZX7y3u24Wyuvak180hUqUdcyuA3G+Q + SP9WALt1+7aghjPLWhJ9/igHxC785Cq/Tgf5 + +KVMN1RT4pi5l/uZQ5jcKdw6J2o= ) + 300 RRSIG IPSECKEY 5 3 300 ( + 20181212121212 20161010101010 44427 example.sec. + rXrTeN01xY+uebYRE/bhpy2GThFjdfePR+ll + vLe9PzN9GauBsaHCIMl3rr+c4pB0FwVtrGzD + DGodUkbqikHmkzw6gAhx9nAcEGl7jCJpP3Zy + eirRuNTb4HPsXNSniwXSXryMXeBnHanpERsl + 4n3bfwvOQlytAqC+X1L0HfvGkSi7DMRGBKK0 + yZCHuI11dZehOEVUoBGlWV1o/sBr6YwwLhIG + ImwHzEzunvRRC7e9SiY41nIpm3zGwnbsVVj8 + kDGQq9YxOgR5ymFbLhCYAOcM7jSBBQRm4Pcv + WKMijHXzFO2e0fXf1nOsJH5VnQEQTxBWiyRc + D0SCwpkMKHNIK/D3cA== ) + 300 RRSIG IPSECKEY 8 3 300 ( + 20181212121212 20161010101010 48381 example.sec. + T6OZoyEvW0es+JEYsHoM45PIUYcjZjhS8jwy + mCDfL04m7fmyjzfUvK8hR2VVxT+2QR6jg1vp + DnPFUpVrr0jJnuicU2lCdptTSb2/7jQzlpYa + M5b1aaqmlGxCKnSfjWfdeaW4PC/+Oj4yBdPF + DXdKHWgFxWPDOuVIkVtKuD2MgG7G/PVOPYw6 + S2qMn6BSesM1UM274wiAWC4+n86aY3rkH3Ly + fgwMP4q6DktOhygDOK082NANVkoGztcVNaH0 + pqL/5UoUtgN/4wndeLh8Lb2LrRz818+uZuad + hSyJKB4pN+u1fs/Z1BQfaw5til/PAVh49KNr + IWL3nkNOlCb1pXPuQw== ) + 300 RRSIG IPSECKEY 10 3 300 ( + 20181212121212 20161010101010 1862 example.sec. + v1TyfkvJIwEJ76lle7anDNWl1V/l8m0oHlut + eihGwNdar6EGmH1uyxNDH9RhGvgUVx29to3p + +lWtg1VwYzxXqj+e9TnWOlCfV2MRD856UQ6T + htHk16GVJvzfAwx9rX6KMu2lvCxigz+xePwY + XJALDOlddHif2fk0CgAlOyH2QSc0K7A99rTr + sDaOLYk6qetqRDwe+7XiscNePIc2YFqbbkq5 + Isl9qUTYZD8Rli8JiJGIP3Iotywqo21lVTv5 + niIgLU955vWfO7QAYbSMubXpyJtTT/wpPXL6 + 0mjuoJmeKOrTXei+k96gnj0akD6FrRfkzzQr + bADlicW9RVcCNxvOPw== ) + 300 NSEC sec-22.example.sec. IPSECKEY RRSIG NSEC + 300 RRSIG NSEC 5 3 300 ( + 20181212121212 20161010101010 516 example.sec. + OHE2OH6FGv4SzBbJAWGFfmrtxr/0BhA2xU+s + aYg5idShv1LYS+YL/1VRXgNneOsSgF2iDZpM + RAp7liIaKN5ZCZHY09chlwjWFvGUDVqT5J3y + GJ7oolFFw8xB4raX2H6nGuwkq4PTEZcl5OoC + 42wat+/Dq8kbSEFtL9Bd3ztcGAk= ) + 300 RRSIG NSEC 5 3 300 ( + 20181212121212 20161010101010 44427 example.sec. + C9oAxEQWQLV1BtoUxvPo/ofqPiFVSKObG7Qu + 7Dtb/WgmnkhYztsQtXQYw0a9VJ8/VuDKxvW1 + Bky41/VgioLz1iQk2/+4aMeyVBpfLVp/+Iz4 + lAldSRUkBQt41XGkWLG3a4msXfGxc0wlOhPe + fd5RV/R36T7tXCFWKw9C+b63we3G73gCJytj + ZWLD2wVP1f7oaWPJWatLiWsfomqnmp5DDUu6 + 7f8qJ5sNgdRoXIKWXbXX2SBaY8Xm9ot/Nyfb + 0jXZGMHhw3rl2LQz3rvR5IGCYTtTWF7yyOQ0 + 2cyyPkp2/qZNrQF8Cdq5ymSvntSwC5yMx9DC + g5jBBZRK5RlrcNnCjA== ) + 300 RRSIG NSEC 8 3 300 ( + 20181212121212 20161010101010 48381 example.sec. + INMHa0l28dAXSr/0Dk4cKSBWQY8ONmDFWbn0 + VyoXVPXCrjFtAPu4C1bBdmhgx9poKz4DRN2j + WQLepltrq+6+rf+lIEMXj3NkLaoSRv3VTEwT + hAKnLv4erWvGAvcWdkzE6FNNOT0T73nwS6Aa + o1M5mdg2DRwqx6Nmvz9heBIbgso4ULzi/KIW + lI6RjZcIIlQPrYBWBtxB2mQ1PYJMjJGMo99f + sq7+LHezKyF0BRktYN0zEUKeV4AYwQmP1o35 + o3jDlUlCdusrelEXPykBfNGgtFTTlTo9d+hW + OGWVsQhJzYAU+Hm+VslAP5eF7LhYCX56ddJO + b3/tyfGjTTyZ1Kaztw== ) + 300 RRSIG NSEC 10 3 300 ( + 20181212121212 20161010101010 1862 example.sec. + ZgP1+3VHbAc4NsPSQqS3Sl81SF5AKHFq0A71 + 0gH/OoNCNvHQHbtmFH922IQsEPJNQA8cXPx7 + yFNfE2zgG00v2/Ua91Qj8WxJgfXePtJhZ8Lg + d4bHaGW+tbx7qM53CWrd9vtg9reWVb5/4Xqc + +iUbWHN8zEOIbVeSyOK0Z/94Q683urO23C3E + vj5coGlSHsFu5NyAl/B02mNZusHJ1UZ59sGj + 71nJgRw9Vg75QGDr8XTP/AINRNYq7pvlWdrb + pHAEDKVkP7ZwNFzbf75VVY1UAV/sk2Za2sTB + qyMBMRzi/svqhnSqYVfN20Glkv+Snq6YZuTT + Z21Nnpdk58SsOxxFJw== ) +_8443._tcp.www.example.sec. 300 IN NSEC example.sec. RRSIG NSEC TLSA + 300 RRSIG NSEC 5 5 300 ( + 20181212121212 20161010101010 516 example.sec. + bB/mN5odg2j9RXrzTyFdm/IIVLNT2JkHsyUQ + gziMnpv3vt5TZryVrkEmInIs/PegcSZFbD+A + Q3m4ww0Yoz7f7a6rkqFbm6iUs/khaISrLF2X + YwPqlPq2MOCfp2P6LaEgoIvmz8QWLmSk4clv + /NbCjL/NgBJqe8RPC7zRymwa9IE= ) + 300 RRSIG NSEC 5 5 300 ( + 20181212121212 20161010101010 44427 example.sec. + d84Fcjnygh05Ll4LdYC14XYZFiXbaZlLEAOg + SbwGq+kAGohtW2MfKYSMHOt6ynPLNasaAKTN + c3XCL1MuozEIQ9I/+2RyelxYSSMIA7XSHjPS + vw9tQr4JHX8xZDoUCzZRht1VBYnPRadiZx0M + /Dv+iaDM68bEggsu1PhBDvksx+86Uz6Kbk9C + fB5GReS7qpS2jHXgS4xksK3UhUp4zUIql3Xp + E1uf5NF231sw3HXIEIBox1BAZyUBj7ShaNOu + MQg3eg6moAteUxAjubApS3P4UyHaXISOHnzY + fVNEUzpP7ym549S79BG22vhlF6/rxfdFS8hp + +ijBTtHpoKUmy9IYIQ== ) + 300 RRSIG NSEC 8 5 300 ( + 20181212121212 20161010101010 48381 example.sec. + mn64tEag097G73PBv6nLmaxqjTmSxYUcK7im + niJsDArHlxg7xyP4Bi2jQ7KN644aDc5Ck4PW + SvmnuVNfISX7HIOmxT/oc6gHRmfJ15CiBx3y + xTLmfrfv5nAk9fLErkEdX1+ET39/7hgu5sC9 + qOkVvIDBqF0PuuYcF/lXz95gWjhaQ8PSG7WJ + 24PejLukdvCaEp7XuQLiJguoUfIkxDdYPnnI + AlNuKyiONntzJuPI96zvQSYQJig69pbHr9k6 + 7BkuCSbfimYP1g5bveGngxZ+tUQpx1UaHfEV + YPH4ve2JQhhRT/4awhD9VoPdMAp+abdDRqRK + v85EmPPcLz+6NnlqHg== ) + 300 RRSIG NSEC 10 5 300 ( + 20181212121212 20161010101010 1862 example.sec. + nY6RmMUxCpkOsHMerlf+btKjBbSYCwsfNW9c + 7v8zh95f5iFGf1XTRF9TqAugQg7sCAuAPg/t + GfMWw8jFAIZnx/SbRxC80EXDs1wcrfWwk8gF + HgWq4d7g3p94pTDhAtIovHeIdZBDMb2f2k2a + /3Rbrll8RV/QlOBsXlO+lE+T/RNzO6C/Xl0a + wwfALpJPHRpDHwK3+0SRVf6Tlg7oAUHWAhsJ + +XNrixGalx+DCeB6k6KHvw46hAX1j9EzwM8f + 8pAYaJfhsfLAvg2qQPN/14SKx0npeRLvq9t2 + RS13BTNWUrHoUJ0FID5JaVIwFS+TLFX5XcaM + u1dhgLgOQPN7ZAbLsA== ) + 300 TLSA 1 1 2 ( + 92003BA34942DC74152E2F2C408D29ECA5A5 + 20E7F2E06BB944F4DCA346BAF63C1B177615 + D466F6C4B71C216A50292BD58C9EBDD2F74E + 38FE51FFD48C43326CBC ) + 300 RRSIG TLSA 5 5 300 ( + 20181212121212 20161010101010 516 example.sec. + TS+4QDNXNzLiEd59Gu0osqODeilrR0ewk+4K + J76FS/MWdTby5FRuZoO7dlWknyGcJF8mwsKV + PLR/N6PCmlLmPhOeN+LNxkYCH8xMWNckHIwM + 5rY0Y9zWy1n2oG9c4iObczcA7skeoV7xv4if + W71kBgDKeLURupwuXFJs0JEGOkw= ) + 300 RRSIG TLSA 5 5 300 ( + 20181212121212 20161010101010 44427 example.sec. + CBo+fTtF1ypKVYQKHBlv+Z5lSvpFKkGHdP5G + cjTWyIZKiWANKJWGK8VhEzvDuOTd3oTPK5L7 + OABpgyTlypwrTfzMxtz+0sb3dGKAdGAvFWiF + 20KSv5iYcYo8tABNvxcJQUVe2iEoQaNtKZAm + Nw6e9Mvzgj6DjhhrpbAOIOQbq8geKfM9mYTQ + dCwDiFdK0PKNHeQquJwbTLofDn2ah7AbOX+9 + +9OSiORH0drMMbiAvOx1JSRQGgCXYYEXMg1n + S3EycAH7uyWyauVNBblPnSAA5wQ6SAzRcpKH + C3iYXb70P+1Qwy1AEB3aDdyLKBbi2g4j9bFq + pK/pHwt4kVatWUfvZg== ) + 300 RRSIG TLSA 8 5 300 ( + 20181212121212 20161010101010 48381 example.sec. + aEqQxblSO8hE1p5DhgwIcuy3Rmm+yzxwGnUf + QQx0RBEzWiIYUoR7BY8hT4q+MRMCjtHkAr7Z + g+Yswjgx2/jaPxgxmKSsmQN9ADamEmuIIIFc + 42THiAzdwKdd3MTHDQJ9PrBkjIYike3Nc+xC + jVxnYH0Hk0MlzfDi9pYn035EXINF3Nda2BfS + 7c6xLV/SJpaIPE00p9EIKIdYtNYpczzoImVM + YbmIi6B0xoBhfScMi9q3Tarcwrb9B2KIP60K + 9n8yVRBVwu6mSsoWw/mGpwiZtwoFZt8tmX0O + 5V/sQMkhvP9wWPxGI+NWYeO8Yt+DE3VFnPZM + qmO6t8FbVma6nFgp7w== ) + 300 RRSIG TLSA 10 5 300 ( + 20181212121212 20161010101010 1862 example.sec. + HpGtSiqI9HWZZPFPkNCgjxteGZ4p+XrL+9Q1 + PZBi9BX4GjSNhQ8kXDzNBjhc9OCMfePxXf9g + VukFekCU7n+HSdDVEFnGizSYBmyG0KSktRg4 + jG+BrKxmKLLqLN7VpnADQnbzjcRvFILsTrsE + 422K2cNlAidZrKiEydOauaoV8Y5XrtHOhckj + 7BdpJBTcJhG97AxKm+tRXVAuhwHIvpXf277V + t32b/stuRVaY1mixrDhsyTdqOUui5SA6uxHN + kMWVjx3QSeFpn7BSSQ1/UBjP3CglE0U2dKwI + eCTZpjpS11dkiR/7Hp2juu3FYamF/Yj4nciX + /DxrYrURdHXUkyYYcQ== ) +www.example.sec. 300 IN CNAME example.sec. + 300 RRSIG CNAME 5 3 300 ( + 20181212121212 20161010101010 516 example.sec. + FZ0ONSWPkz+5Aomi5/TA+T1eVEgF/0UJCraG + ZgVCjxw3jO/v3w1ByrR9BpoXPIwf5CA2TkJk + gtGvphzFRrYNF3MEhgOdTRbiLfqpcC1L0pDE + 6IAvRU1rSoXZRo3W2Uzmr6I+KGm55Un8pF5X + v1uFVPw7ziaeHnYAZ0b3TXSRX0s= ) + 300 RRSIG CNAME 5 3 300 ( + 20181212121212 20161010101010 44427 example.sec. + DNnNbCbJQz/+9ExNHu+M6nnVmytMbLLgHlXM + w5UjfIbG3EijYDWenUo4ai7K23l3HHCJRZbz + jJITPJZdNUVvN3+bB+RSGeoFwCPCfHkkb/yy + VeXJIQslaSmcBIpwrnlIu4mztwrSzce7WI6c + iKL+K51a8KaqzQX0H9PaEtw7z8KUhSNhO2lV + kbiva/NwDlfsWULjo+r2izTXmMgKU4cgdeG3 + 8RqmpeMSRLP6H/P9B38pfBpvnrBbEpYiK4BV + 5GlLdiETYtQWV3iHsLizYCNCkYhs4b55UNWI + 02eVy2jpmeYnNVBx00wqiHBjHy5gkTAn2vNc + LPagUqrpq9PI1xiY5w== ) + 300 RRSIG CNAME 8 3 300 ( + 20181212121212 20161010101010 48381 example.sec. + BbLte7BZWvbNdj+tYuA4kk+u72ckzBxnBcM/ + owhFOtB7IZWKd/696MOq2w0MuD2OSqSm7mq3 + A3Wnm/3RN0+OQImy464IpKSmXwfHHI7ruxFD + jX79azCcpY6p/BaIzdusSPtIzN/gjpxJnZU2 + jTjL2Xx2V3RWoUw+nO3CNJSeH8ltND8hJX8N + V+cH1Mu7eRC3oO5cLZeRuS4QILAVFGgf8ZF+ + kWkruQzwc4e4eosgNFOg5WC4VXnPfW3cqWk0 + sZTs+q2P21YC9cSBTOIgIxCoczMVQW7GhPLQ + 8LIea0faxJ6VjB0qHcaKyd+xpR5Jhe8cRLUS + +40ORu5rOyJMa6386g== ) + 300 RRSIG CNAME 10 3 300 ( + 20181212121212 20161010101010 1862 example.sec. + HoXdx2zby92ALr23GyTVvTZ2sdaJJQH5TeZd + ubz1toQEESDns+8WvS8gkaOWhPaLKLmKIq5E + fdWaacrscexINxk6NlMjNRBiu5dkAuVfYA9a + xOWo/344pACrqKIoboHt2spQvTdIKAmhFuLY + JWV9x3uzXon69k6jcedC+rLumGfJGgodkRim + mxn/LNU1NHdaCoD2Bo7q0nGbJwDIq+Re0WFp + bMLSYJqFHKyYJVhQhhVPHmYtMAgvCFBwulgj + lHU7uUl/+yltjxgkoKnXFS+Bfhe/G84rXBRw + UX9AzTSnt1tCo4ItiSSja/kHjkcGlJJ3Vs4S + h8KDXRRj/FVau4flxw== ) + 300 NSEC _443._tcp.www.example.sec. CNAME RRSIG NSEC + 300 RRSIG NSEC 5 3 300 ( + 20181212121212 20161010101010 516 example.sec. + oaIvvXFtkyugmxcLgpeo7tNMhTidHaI61vHy + qHCZdzZ6L+7vp5sNbZPQevTbAPXhOSPkr5wZ + LcoWtRMZtS9NpFvRJkMiV6aJL/rc/o0hQGBh + TkCnpViK3vPsXiH8kvJSvtQy28hDHoW1nS+V + BjciCsfcXBFqBuJdbz+msoY+B2E= ) + 300 RRSIG NSEC 5 3 300 ( + 20181212121212 20161010101010 44427 example.sec. + iQtijIDg9MYpZaQdctLPcAdUfUHYgS8v9y4M + GlpPwfSg/lyns4vY9HF9jhHO/yhVYriiPAX0 + INxdKq0D/9te1BgNOKeWRVkV5hJtj282fAfW + 7z8P48eTvOZi4vWPrhYU/UzcEw4qKS15Nep0 + U++yhyagqPdV0g8GS6q5hobOvZ+lSNkCL/2l + GcAWLq9QDK/urxNdpYQx2PB85SmAjGaD6tMD + NjToXfttE9MiUUjAscziJ5lcww0WObBDl+6u + mEp/F00wchU7mIbbipzpkURSSL0wxQzhgJ49 + 30aM3Nlw/P2ItyCL6FbcYiEVhJpQB3jCnjKu + JptAgu3NkCpLdVJnjQ== ) + 300 RRSIG NSEC 8 3 300 ( + 20181212121212 20161010101010 48381 example.sec. + yJ07XSzPqaco0u/ZfUeYRuVKSrG/nuTxpP2e + 4gR2eIE8IXcVOp8J9XACvJ85dnqabRkKDea3 + 04ZA083dXvhn7JRtOnPbG/4TyTsmahl13/fd + 4WL+s+nTMBqqk084BuTClr/spKCgLzRF358X + SaQZHtUD+6e8SbOKwDOhUPWp4jn4b7tirgkP + ZJ72Y3k1OwMV8JL3eLwhRbGH5iNDZMDfs4gD + mLGPSQLaleN/Qekcqzo7Hh1wNBfh3eyTy65I + 1WhhHCe/L29cqAWAhw+3Fz/zqwyTSepjkwcQ + v2G0jvEJEEYA1bRDqQmKMN586ZbHRVgL2/Mx + GSqdZCWmG3xoxn+Tuw== ) + 300 RRSIG NSEC 10 3 300 ( + 20181212121212 20161010101010 1862 example.sec. + rnsv561ekllNQ3HeYnHvQPFzZBnMEpKt2Maa + 2lumqNgrYINBhsAWRjCY+O2PQK0PDf+7r61i + ijKRb8bJDfvjy9G3YZyo3A6ybQ0tq7iLfDfL + H0zLoWyD220CXI5foZDQJJccJrcroFU8t/jN + 9oBFAN8xd1mPC7Otd6nEd70fyqH5AM16eih3 + K6+EeaB4GKK37kHf8VABMddaDoU9WbwVdrr5 + r8NBB78c4jXF3SdyfOqjWhv/Z5ONiuSZQpCa + G3w0y1S987knZpghphycTvQtc0cekgvdxR5B + 88vBuEoItgAS7uKWJ6bvHxXic7M4N1XzG07D + mBIdn4oHHDmqJV37rQ== ) +lets.introduce.some.empty.terminals.example.sec. 300 IN CNAME example.sec. + 300 RRSIG CNAME 5 7 300 ( + 20181212121212 20161010101010 516 example.sec. + i96ICBMEwhjWsLMqRNNygtCZwba1Gn/r7wrR + ZvMrYzr/HPWRMQwon7/RbEU4kXuQSMpbU+6v + vhcm9QN2K0k/lq67efN1JXNGo6P+L8AsY830 + 0FwqiW4q/ufnyexoQ1i9cJe3pZ4QO56f9Umq + Qg+m6JBgVHKn6TCVIp6rVJ16y4E= ) + 300 RRSIG CNAME 5 7 300 ( + 20181212121212 20161010101010 44427 example.sec. + PNhMqeo4gJ1emZy/sNwdkJezO3dORiEvPWC3 + EhfIzK1ZagVYQAlo7yfAJ56/Qhsq8+VEcJp8 + 2tt8J20waiDTbES/FY92Y0i+kSLM11fnZZ9a + plG54D4gQnrv1J0BOjMXnYW573kw88aAciaa + /XX5mP7JtHdItcTiK3hozmq9cTTsfisChitW + S+CqJfiWTRaL0vLDhbfAK/lu5zaCFsTRHXtI + 3oQdWjxJANE24OjG83JWWWHc2HBfBdMH0+d9 + 6kRbUSAoFXxK4uLZDgsXOvDspRhMhZJsq2+z + OB3QPZ6g/n6tbFtMx759a4ZZlR7+k9hleHd7 + oo377OcIV1iIerIWpg== ) + 300 RRSIG CNAME 8 7 300 ( + 20181212121212 20161010101010 48381 example.sec. + EKWV63NnX9sGZGXPdahDUsw4jcrLDWXJDMiN + 3D+UTOH3nUPgm2mA7MbGGXPa5emnpaEnJN8Y + NFXTKU+SENXN/fYol03Pm1PKRGbmdbpY8Obi + KrYIHEazypviyTSPmmZjcHd8NOxcX0pDdybC + 2mrK3v6K0lOinIeOO/fdHc7/IkS6FmU78/r8 + 49l9+0oI6yenzOYVz9qHGWUGP040eR8h25uo + tSNxqvoiNmfz/9hsWKLuwaW0v8mNzeuK4o8J + 5wkbjc1hemSLUm05ryA75hx5/U+Jt09lLvxP + BhwU7iH+WPTCRO/cxavp/k/H2V9vQynPB9kd + Pt/VwXnM/hbJlbjqZQ== ) + 300 RRSIG CNAME 10 7 300 ( + 20181212121212 20161010101010 1862 example.sec. + HZBPL0Wqk8WCcTBsMLdefVVsS2aywUC9wgwE + SlDx2kP3+Kuw8udz+s5cPRRj74kiKwholxHK + 68/qH3Z+yiLKHXOrlK9gbDROr/w8hyRqgylT + QPvVoPtvffRms/kYck9t1ZtgYpYsUF/VToYX + pY/WvLyb7HH2xDeaiOW0XMQzMgaLdCOFXz6h + rvRbrWG+8LTvPO483RkzkYjgWVbcjaviMm2M + Livb6R6hDcDdUAhq7wyHJOmIOmsoho0prbGO + o2uMVHhvQSELDSFkweP1iu4C7h57ZYQv+bFZ + ZYBgh45wWPj0DazDhqit7X1sgu2qHMPBlhjs + LWpRTSFkPO6T/GXoMg== ) + 300 NSEC www.example.sec. CNAME RRSIG NSEC + 300 RRSIG NSEC 5 7 300 ( + 20181212121212 20161010101010 516 example.sec. + ByFYkS41yP8gBlLSknKz3pLdIhYnzXFWsI4u + Y+U12xBy9+l6MCWwgj/RcSGIB5+1FKFeQ/SX + KfXDK7Bnr+DxK7ymPCmNzZBJLdJm8bCLA/S3 + YpM9ABg80VbcYW9s5vqXyst8Uf8fvMtal7Zb + a6Z5Q+cC9WQO7wrYtWnSS0WRUok= ) + 300 RRSIG NSEC 5 7 300 ( + 20181212121212 20161010101010 44427 example.sec. + kJGdpompkai/KaP9fpyplXN0vqsBqsqig57j + fkqKIWhERB2EABBrZF9nAPtdV7axwJEJrViI + iLcHU7lN1YQRO4eYUcxAbcLjXFbr9L75MjpL + POnvcmaB8eG/aW0H6mjvecacU+DN+ykb5Ef2 + C5I64PFluL3iXVN6o1xonKpXIdmnj38HMkG2 + zFwlQnhRAfFKlih0hBCL8dtzr8OaHHq20aH/ + pOm29fuOyLWUliBTZkyg/q43WMKKbiyLVVNL + PXNsicKTYXrQ05oH/EjDkNUtElc+OqJcsRQm + FnQgF60rzOfleNBaLDnZTNO5zMJQ2uwVuD2Z + II8k8l68zj4p7n6zKQ== ) + 300 RRSIG NSEC 8 7 300 ( + 20181212121212 20161010101010 48381 example.sec. + fblA2SxSL+ZL2oVqUTlbKt4DVZwEbFbxS9U0 + s/5QvVmiROWviIRZ7hPXqOTh6uRJYiii+4zz + mMBhjFuw1EJovHMabEvYRdYqBhihR8KhRK36 + TYi+tP2r6ByP+O6rBJB2BehyYXqKsFceQpv3 + LJY7pxBI2RWDsRQdPSU1WDmYVjBX0YoES8IS + y4l6Lr0Jdlzk1whzgballdu+ZMlq97g+JvsO + arWq7DQBtcgiWs4S7f3fO3PNzE1ltKgsvc2f + mtaCD+g+MpjaDLSRXdxmNw0B3MgYQm3Xj1YB + gL8SYkzvuj4jK9F35AhvLNGeY0h1UyuQIEKP + RmsDN/xIo1C/NY2Xvg== ) + 300 RRSIG NSEC 10 7 300 ( + 20181212121212 20161010101010 1862 example.sec. + c+G1yL4nXJyEfrwW6wewKSi4RzH8PR/LbiXz + Xdw3l4s4f8bJI7F5SJ/mdAl8qEoQY23euq/u + 8lXTok65b70T/n1y1wSj7WBvhEFOLAlh8RcC + kEQ0GHP/qjTM7MPJsDjPjFRXHDwp/2xJcWpE + T970VWXOKd6S01/BQj06yk056L3GvRW9hswE + Oi31T0VLYFcBZacfX12lxRhxwrKRaRAMLuu3 + uyZOf9FK3xO6Rit+5HOFRX3YDgI4+RKL9Fjv + +wC/cXGL8nYzUXG4TmtT5kwsheXd5KzphGkW + Knl5KyFJ5tCegS01dx1Qiqox4ujHin5kS8K3 + bkgejnhECTn7dZMmPg== ) +ghost.example.sec. 300 IN NS ns1.example.sec. + 300 IN NS ns2.example.sec. + 300 DS 50458 12 3 ( + 2E40B2A6CCD2760EC70AF69D1C144064C893 + 1E53A6B3EEE78BDB9E0BAFBB9C02 ) + 300 RRSIG DS 5 3 300 ( + 20181212121212 20161010101010 516 example.sec. + iclGupmUkGsPDWdWkuEDKTkYMqD6kCvpAyqS + fZBuDZD4vrpOciINX+iSWzVO4iFNUhzjZRW9 + cEbwhA3JDJXcXjDOFQheVWU+2l2+wgsI4LvF + ebykSWuJ/bcXZP17uaulK/XUyXZf08iFOBNQ + 6MOQK7LtilTg4x7hD5KHsepvm0M= ) + 300 RRSIG DS 5 3 300 ( + 20181212121212 20161010101010 44427 example.sec. + yC8hYQPjoYu1NY0MSWVvsF+ME/+9Qk+CwUkC + JbdrnGR/BCQn9c+vOjJyVp8JVFqvTR+/MYrF + l/8qNUwPf8ZjWie2MEBb03pTtscY2dZxM4N5 + gzWJNeD0BLv9k+z5gIZGchC6P9E0gGiRdGFS + L2IayJ6kPl0UQz98VaJH+hdtgH8Lw+K5EATH + 9ZIccq6Ea+VOK+51GB4ttvQuIBKqfh4y2nox + dJdHZH9iGnXoB8BeQoZsh4xMUdpNMjL+JHRc + ZCDazd8EeiDz7x1opJG9LHT4IZ41O7UL3vOP + vejFmXoLbQ8s/d+wOhpJbTTEqmaFm3hAJi5I + dfru4JX94JRntdguaw== ) + 300 RRSIG DS 8 3 300 ( + 20181212121212 20161010101010 48381 example.sec. + ch+jJnF6K4wSqfo0Rg8kNedNkumPgNL96ULu + nqN7R6JA4aZx7wLxFejYWN6ss6aHPFyDMEkT + U8TheY6pBpzD88P7iFhPSjIDI+odzAqsUJGk + CabrMijcDyX6ednOu3JnFUvLr3SS7s2Qvylb + rGVaDLrQDdLJ6oZLMVpGvIIkVFQ5+IP4dhmj + Jb9NvhkEomLQVlWynHVvYCjrR8naPmptKVok + Lymc6BNeYqNJLS7huwcKWrl1B4rJTQL5BeP7 + mRwWxJJoZf4XL7nqO1xiJ5onVTYjunseCBiQ + jPmjCV/8c7/arUYrvL8yaFwi6UaRZ5V2MkuV + qfJhlSQv8Q8CpBUIKw== ) + 300 RRSIG DS 10 3 300 ( + 20181212121212 20161010101010 1862 example.sec. + RfhRZ5IfOTfltrfRj5WG9YZA9V+nbcUdYRLy + Kx+fVPXLQde5rWlATNS8bdxh17H2aWAfbG/q + sF+AePm7aSCXSVHRCCgDe5STbsZCumZPU341 + 0DEx5LEP03YGGMXxu47OjDwFeXmBNY68R1pJ + XZqvTBgcofLFW5lIuzgHOvqAfcfoYfdVMZXN + 5bHGbPOYTxRLzOozvHs+CPrxVAgfkAbisPxh + 9kKT+Y7gzPFEeHv0gn45eyNZYEz0/3u4mL7K + dHN7HWzo40SOjwwfjMaqnBlaFWZr13GWinpQ + tWqhp4cGIQGyhOexh+nw7oZH1fvpEAuMM/Iv + 1EwmI62OiEuAey+onQ== ) + 300 NSEC jumphost.example.sec. NS DS RRSIG NSEC + 300 RRSIG NSEC 5 3 300 ( + 20181212121212 20161010101010 516 example.sec. + B387vqwneeYj2vq2NgMyz7RqY+osCm1GRn9R + dg6ucSC+2siErQ5CHZVw6huRCE3GJrIZeHsB + fehIs0i4Fn3zCHJbn41nbsvCv9lnWvb+x0Zt + RdgcOCaXsZwufczgTCvuzBWv1ujZCoJj4AJm + FFETfNSVwNFoXbr2rljhomm90Hk= ) + 300 RRSIG NSEC 5 3 300 ( + 20181212121212 20161010101010 44427 example.sec. + keFijgNnTGMdfPcoBgTfpklCGxi8kIPvi6z3 + NrLEP5QKq5EXUzN//M+1NlzaczzIHBjPLRcK + vdhMnwU6jwhE9U+/209IolARCahz5C2S7CUc + Uv8nugElFvQkHfZN4zOnMWiTJ/l4MFs9lxt6 + JCBeNOVt1hoETDKgiphHH1lC1sXCcFaeA4su + JCcHy89n1cuR+iirm6yWuclAIvjYsxyJRJTQ + CHDvsKDSt1qlaslstw0jrI3guqxmiUKol7PD + 7+L9MV+VnNwsR6aHu3DuLWRXaMizg+6lTtp4 + ahg4LrhywC41KRCDczMK1ON2emH8uTsJIIc7 + ONkHvohOex/H3C1D8A== ) + 300 RRSIG NSEC 8 3 300 ( + 20181212121212 20161010101010 48381 example.sec. + p3djDh0TA5LBwzPvtBmJZsjlAs6DPdlmBTk5 + ighk6mxU8WuocwwkqbHS686mdrIlaUEMo/oO + RIO4WC+P9jWrkDAFzpYpjqw+zlF/YooKhP3K + qXDUxXHcrPdV1UtEv6iz1ps/1YEbTVwACPZt + Htpzemt+/C2/ZlFr+fuvJqvTkSjA1EuQufX5 + Rjp+gG9iUh3Vw33PutCYaLvSN4ksAWcGb7qv + 9P9xExBSLGPvtDtCOK9Wheu2whVigh0s+m9s + nbDxbUmbK3AuhnETES+tT+JdnI5fz6UzTik7 + e/qHQ4hL2ntopbjdUuxk9K8umzTzSWhf6l17 + CfOBN4w9blpdg+7gtA== ) + 300 RRSIG NSEC 10 3 300 ( + 20181212121212 20161010101010 1862 example.sec. + nFdtbKA6VF4Ong9P6CNqLy7KXtfPkJqlaVHK + 3ANEcVkKqbcYl6oBJY442RHqHpxUdtn8dvKg + xnwePylEozcaY/GI0Oy3bDIcWjFnlIzW04XW + NuellO0OC9vQ+o3AX0wgNZ3lboKNkHHEUTdF + KOD3gX4z0r1A/D9Lh50e1sVgCGwQj7Bp/Nhb + 8m4OU3Kc5UrBOhlS7oC1QWvL2r5HjEcXVCK+ + 7HSPSwM3h88f3DHvN2BpPZJpuro6ZRRitenM + GG9gZwAt5UxiTFFG4DnriPIxhn2SbqRF0vNJ + kwoejT4rTX+/M1Ht4u4e4p3ad/7Vx6rEvlEJ + bvU12qtqXIFOQdAtRw== ) +sha384.example.sec. 300 IN NS ns1.example.sec. + 300 IN NS ns2.example.sec. + 3600 DS 10771 14 4 ( + 72D7B62976CE06438E9C0BF319013CF801F0 + 9ECC84B8D7E9495F27E305C6A9B0563A9B5F + 4D288405C3008A946DF983D6 ) + 3600 RRSIG DS 5 3 3600 ( + 20181212121212 20161010101010 516 example.sec. + pA1orlZuEjb+1rxkN7qvO6gFFg3ebxgM4CqM + TxFhijcBNbdtQ9jR0zOgNgIpb5UsFe0kj//b + +VSKaLT+OtS1bwf5cHvRcgIXGpsTRaGOSEle + bbaw1Wk9h6oALjbZ9vaoYGFas8NeIddklabr + GAcPeJuWdUTlZOPftHhvcKip29s= ) + 3600 RRSIG DS 5 3 3600 ( + 20181212121212 20161010101010 44427 example.sec. + AxvWrRmB91L3EBQaq3IMiAwS1SxB30bbgM+3 + xFL1mb0zNUSwV96VlpHGgw5TX3oEXFl3eUp5 + KYrxzzkxjZEPwNABysgzaju3ovCJ+w4d5mU6 + S0x8mf8HZUOZB0OXqYAeC6Z3B7/cmCfrOCIG + 6i3eKZ2vbBJBhGVUDAeEcHblIgeoutbKTHTW + YM5+zCSHA2FcIBYxyp+aPQiLBnZrKsOAL3bS + hcMiOug8tyBL+qGALIA5BUEViwIYWmDGwRAE + SNmsxFTKFNzov9inzZk7THF1iJfCIFBNSoyg + Wd0V1DDm3IwH2XWeQfGcQjIMpkvvENHeYcXX + 6WeSgcFwCmLysuARAg== ) + 3600 RRSIG DS 8 3 3600 ( + 20181212121212 20161010101010 48381 example.sec. + KDoVg8SMwz86zyQLZY2KzLkFLWPJvni/2BAt + jTRpL93pDxHoOl8jLs8eI8zjmkoNbquKlpNe + +QHFcspLkLUoiNO/PiJej84Ou2H4rykXUOcM + qzk6B7Svy4Iv4eSi6hUUzcWAy3L6jm+fM/Hq + k5SCBMH+mQ4BYmmY0VnRbOefj1kd89S1foSl + NYH+2U9RRmSf0D4eqIO11aq3RUVcQYFMIlWK + r+BjsRcRn1MQhrAKWG/WMkEDWibIYGjMp/Ub + dMRCGA5hIzVrBqy22756enNdRsoYmmiidpTW + yRCk8APk3cPbR6lPtHdpsjS23lV5fzcsUdXB + rwGeYyOe0MNusvJPuw== ) + 3600 RRSIG DS 10 3 3600 ( + 20181212121212 20161010101010 1862 example.sec. + Jgc6PlkpSUz1I2Fj0GRFW3VH19gl7upEMQf8 + 32hoT0X770oyo6NbvmovwMiBibUQAVRkR4vY + R7WlTcCTBn+WS/nueu9/Rdu5BFAT2P5uyDCp + OxPS8aFk3PPYvIJs6T/Q+xkM5lgN7qweljwY + EBRPgOznpUypN1PIMj1k76lLFhDqgjAoTpVd + whnE3mo9sEQRnZtHkGY+5ZcVEjrJzp37/Iie + 0UfoRYTUxtK/Odm7Nks9HmNWo8VxASizLafY + I1ij2YTLjJiEj6a4V5gd89C+gq9y/dfhats4 + /IjF5ImtFpBUGAvQ90+DKCGba1dqKo7+Ub60 + 8bCo75+TZJYiMWzjkw== ) + 300 NSEC lets.introduce.some.empty.terminals.example.sec. NS DS RRSIG NSEC + 300 RRSIG NSEC 5 3 300 ( + 20181212121212 20161010101010 516 example.sec. + qtp/vJ/rxl11yZtvFB1AeRt98JPoEiB7iUo8 + //o1B4DNTdRjUQoUlWXo6qCppHiT6X+X0jBn + QF2SQpvUBuvOu3ycWy3v0nBgVp5ZwdTYb2f9 + hko4c/sxmcFlRTQ6pWEfiCoSUxsuWWucWtiQ + THEZbUy9AInu/nRAfqC/Nke7/eE= ) + 300 RRSIG NSEC 5 3 300 ( + 20181212121212 20161010101010 44427 example.sec. + afbTauPUX2myihkQu0XMw4bUPe67MGI60HGA + ulUmQMgAJTUMdvzsQTj5u+ywfSzJKK2xz+Rn + euiGXw16/O/BbEoNC3O2rsyzRa1d+x467U1r + X4SZx5QhbRSi7BwmRiaUFJH8e5ZQTwMMws7u + fWx5mGFCDTAp+G+lrnDnGB/QD84AS5UqYLi2 + Se+ZQyWH69chcTQEFEyqFXtf90T6sGXiKBG1 + 908uOXbc7bDP6kSSIfbFUebsgut2tOTI3h8r + YkDwCwgDfqSSkc3bqRHqEqiEtuucdBcdtZ4G + V3bo6rVNGGz4b7Ltrij/lsyergKSLxmn6RGw + wDKSoxIN6OBjj1ThhA== ) + 300 RRSIG NSEC 8 3 300 ( + 20181212121212 20161010101010 48381 example.sec. + pam09BNhE3P0spzFLYYr2Cm1vHZ5DXtVQ1cH + fdc09RER//D9pzZjkJFZN1XArmUyyaL2epps + Zi0mIhroiP+98JdhyjLthpgvyl/3pa8ARVjr + /R08qknRfjkyjUBh2/kopZXZ+hEtnuv78dKa + 49lbViT6jbL0giz/uaCdFZo4w8sCCb+FBKW8 + tlDlKTciKiZlmScNDeFNZxk0C07OwJ3zRwkU + F87MgvZ9inslXV4qbbKL92VmF9lK485XLxx1 + LlDTCvDRkWf8m9f4uRI3DHk7cVjJRhu9P9HR + Sihc3gdVqZIt276vlN0DtVnfFLt97s7QNkHa + srPp3F/Q+3pysTfL2Q== ) + 300 RRSIG NSEC 10 3 300 ( + 20181212121212 20161010101010 1862 example.sec. + GtKFam1EVbVXETNxw36NHJLG4czkGlqHbSMz + 6/sGtV1XblNJVFMUXTy5WW31QX5rsYpXHIWZ + XcTsBLAZqLjhxjYKjnXXGgkOQe/ci7EsNG78 + pDO8fDb5CqORIEhcocsoCWXOkHCmopQyXlIv + 4Hk/3SwKxMhJXt0Ox3DFhuduaPT/NHXTUD+u + vxXpZuc6YrxrpDA28slByf5lAJrpgq6s2Q7E + kPcDOAsXmGDmRQvVR1xn0XN+5Pheysxr/zIQ + 9XtN/YUrLn7loSmjS9+3oiDIi1Y6eHnCvQJP + o0pkkTNnEsmUSfVaXdXXkZ47dwuUIw93V/mD + nxxGe2Hc9+F8fRtsaQ== ) diff -Naur validns-0.8/t/zones/galaxyplus.org validns/t/zones/galaxyplus.org --- validns-0.8/t/zones/galaxyplus.org 2011-05-16 15:42:03.000000000 -0400 +++ validns/t/zones/galaxyplus.org 2020-10-05 16:59:29.360681415 -0400 @@ -18,4 +18,5 @@ cvs A 194.28.255.11 v6 AAAA 2001:2010:1::feef text TXT "text1" "Another text" "One more" +bigtext TXT "1" "2" "3" "4" "5" "6" "7" "8" "9" "10" "11" "12" "13" "14" "15" "16" "17" "18" "19" "20" "21" "22" "what is the meaning of this" *.meow CNAME www diff -Naur validns-0.8/t/zones/manyerrors.zone validns/t/zones/manyerrors.zone --- validns-0.8/t/zones/manyerrors.zone 2012-08-13 05:37:10.000000000 -0400 +++ validns/t/zones/manyerrors.zone 2020-10-05 16:59:29.360681415 -0400 @@ -112,6 +112,17 @@ 0 0 1 d2abde240d7cd3ee6b4b28c54df034b9 7983a1d16e8a410e4561cb106618e9aa ) +; policy bad domain name for SMIMEA +smimea IN SMIMEA ( + 0 0 1 d2abde240d7cd3ee6b4b28c54df034b9 + 7983a1d16e8a410e4561cb106618e9aa ) +93f1e400f26708f98cb19d936620da35eec8f72e57f9eec01c1afd6._smimecert.www IN SMIMEA ( + 0 0 1 d2abde240d7cd3ee6b4b28c54df034b9 + 7983a1d16e8a410e4561cb106618e9aa ) +c93f1e400f26708f98cb19d936620da35eec8f72e57f9eec01c1afd6._xmimecert.www IN SMIMEA ( + 0 0 1 d2abde240d7cd3ee6b4b28c54df034b9 + 7983a1d16e8a410e4561cb106618e9aa ) + outside.org. A 194.28.255.11 long.outside.org. A 194.28.255.11 outsidegalaxyplus.org. A 194.28.255.11 @@ -156,6 +167,37 @@ x.y.z.zzzz5 A 5.6.7.8 ; DNAME must not have any children (but z.zzzz5.galaxyplus.org exists) - yuck zzzz6 DNAME x.y.dk. ; fine, no induced error +@ CAA ; CAA flag expected + CAA 0 ; CAA tag expected + CAA 45 ; CAA unrecognized flags value + CAA 0 meow ; CAA unrecognized tag name + CAA 0 x-y ; CAA tag is not valid + CAA 0 auth ; CAA reserved tag name + CAA 0 path ; CAA reserved tag name + CAA 0 policy ; CAA reserved tag name + CAA 0 issue ; CAA missing tag value + CAA 0 issue ";" ; fine + CAA 0 issue ";" blah ; garbage after valid CAA +; commented out things are not validated but probably should be +; CAA 0 issue "hello/world" ; CAA invalid issue domain + CAA 0 issue "example.net" ; fine + CAA 0 issue "example.net ;" ; fine +; CAA 0 issue "example.net ; sometag" ; CAA missing issue parameter value +; CAA 0 issue "example.net ; =sometag" ; CAA missing issue parameter tag +; CAA 0 issue "example.net ; sometag=somevalue othertag=othervalue" ; fine + CAA 0 issuewild ";" ; fine +; CAA 0 issuewild "hello/world" ; CAA invalid issuewild domain + CAA 0 issuewild "example.net" ; fine + CAA 0 issuewild "example.net ;" ; fine +; CAA 0 issuewild "example.net ; sometag" ; CAA missing issuewild parameter value +; CAA 0 issuewild "example.net ; =sometag" ; CAA missing issuewild parameter tag + CAA 0 issuewild "example.net ; sometag=somevalue othertag=othervalue" ; fine +; CAA 0 iodef "hello-world" ; CAA iodef value not a URL +; CAA 0 iodef "hello:world" ; CAA iodef value unrecognized URL + CAA 0 iodef "mailto:tobez@tobez.org" ; fine + CAA 0 iodef "http://example.net" ; fine + CAA 128 iodef "https://example.net" ; fine + @ SOA ns1.catpipe.net. hostmaster.catpipe.net. ( ; skipped again 2011011400 ; Serial 1H ; Refresh diff -Naur validns-0.8/textparse.c validns/textparse.c --- validns-0.8/textparse.c 2014-02-11 15:44:53.000000000 -0500 +++ validns/textparse.c 2020-10-05 16:59:29.360681415 -0400 @@ -26,975 +26,1060 @@ int empty_line_or_comment(char *s) { - while (isspace(*s)) s++; - if (!*s) return 1; - if (*s == ';') return 1; - return 0; + while (isspace(*s)) s++; + if (!*s) return 1; + if (*s == ';') return 1; + return 0; } char *skip_white_space(char *s) { - while (isspace(*s)) s++; - if (*s == ';') { - while (*s) s++; - } - if (*s == 0) { - if (file_info->paren_mode) { - if (fgets(file_info->buf, 2048, file_info->file)) { - file_info->line++; - return skip_white_space(file_info->buf); - } else { - return bitch("unexpected end of file"); - } - } - } - if (*s == '(') { - if (file_info->paren_mode) { - return bitch("unexpected opening parenthesis"); - } else { - file_info->paren_mode = 1; - s++; - return skip_white_space(s); - } - } - if (*s == ')') { - if (file_info->paren_mode) { - file_info->paren_mode = 0; - s++; - return skip_white_space(s); - } else { - return bitch("unexpected closing parenthesis"); - } - } - return s; + while (isspace(*s)) s++; + if (*s == ';') { + while (*s) s++; + } + if (*s == 0) { + if (file_info->paren_mode) { + if (read_zone_line()) { + return skip_white_space(file_info->buf); + } else { + return bitch("unexpected end of file"); + } + } + } + if (*s == '(') { + if (file_info->paren_mode) { + return bitch("unexpected opening parenthesis"); + } else { + file_info->paren_mode = 1; + s++; + return skip_white_space(s); + } + } + if (*s == ')') { + if (file_info->paren_mode) { + file_info->paren_mode = 0; + s++; + return skip_white_space(s); + } else { + return bitch("unexpected closing parenthesis"); + } + } + return s; } static char *extract_name_slow(char **input, char *what, int options) { - char buf[1024]; - char *t = buf; - char *s = *input; - int d, l, ol; - - while (1) { - if (isalnum(*s) || *s == '_' || *s == '.' || *s == '-' || *s == '/') { - if (t-buf >= 1022) - return bitch("name too long"); - *t++ = *s++; - } else if (*s == '\\') { - s++; - if (isdigit(*s)) { - d = *s - '0'; - s++; - if (!isdigit(*s)) - return bitch("bad escape sequence"); - d = d*10 + *s - '0'; - s++; - if (!isdigit(*s)) - return bitch("bad escape sequence"); - d = d*10 + *s - '0'; - s++; - if (d > 255) - return bitch("bad escape sequence"); - if (d == '.') - return bitch("a dot within a label is not currently supported"); - *((unsigned char *)t) = (unsigned char)d; - if (t-buf >= 1022) - return bitch("name too long"); - t++; - } else if (*s == '.') { - return bitch("a dot within a label is not currently supported"); - } else if (*s) { - if (t-buf >= 1022) - return bitch("name too long"); - *t++ = *s++; - } else { - return bitch("backslash in the end of the line not parsable"); - } - } else { - break; - } - } - if (*s && !isspace(*s) && *s != ';' && *s != ')') { - return bitch("%s is not valid", what); - } - *t = '\0'; - - l = strlen(buf); - if (!l) - return bitch("%s should not be empty", what); - - if (buf[l-1] != '.') { - if (!G.opt.current_origin) { - return bitch("do not know origin to determine %s", what); - } - ol = strlen(G.opt.current_origin); - if (G.opt.current_origin[0] == '.') { - if (l + ol >= 1023) - return bitch("name too long"); - strcat(buf, G.opt.current_origin); - } else { - if (l + ol >= 1022) - return bitch("name too long"); - strcat(buf, "."); - strcat(buf, G.opt.current_origin); - } - } - - t = strchr(buf, '*'); - if (t && (t != buf || t[1] != '.')) - return bitch("%s: bad wildcard", what); - if (buf[0] == '.' && buf[1] != '\0') - return bitch("%s: name cannot start with a dot", what); - if (strstr(buf, "..")) - return bitch("%s: empty label in a name", what); - - *input = skip_white_space(s); - if (!*input) - return NULL; /* bitching's done elsewhere */ - if (!(options & KEEP_CAPITALIZATION)) { - t = buf; - while (*t) { - *t = tolower(*t); - t++; - } - } + char buf[1024]; + char *t = buf; + char *s = *input; + int d, l, ol; + + while (1) { + if (isalnum(*s) || *s == '_' || *s == '.' || *s == '-' || *s == '/' || ((options & DOLLAR_OK_IN_NAMES) && *s == '$')) { + if (t-buf >= 1022) + return bitch("name too long"); + *t++ = *s++; + } else if (*s == '\\') { + s++; + if (isdigit(*s)) { + d = *s - '0'; + s++; + if (!isdigit(*s)) + return bitch("bad escape sequence"); + d = d*10 + *s - '0'; + s++; + if (!isdigit(*s)) + return bitch("bad escape sequence"); + d = d*10 + *s - '0'; + s++; + if (d > 255) + return bitch("bad escape sequence"); + if (d == '.') + return bitch("a dot within a label is not currently supported"); + *((unsigned char *)t) = (unsigned char)d; + if (t-buf >= 1022) + return bitch("name too long"); + t++; + } else if (*s == '.') { + return bitch("a dot within a label is not currently supported"); + } else if (*s) { + if (t-buf >= 1022) + return bitch("name too long"); + *t++ = *s++; + } else { + return bitch("backslash in the end of the line not parsable"); + } + } else { + break; + } + } + if (*s && !isspace(*s) && *s != ';' && *s != ')') { + return bitch("%s is not valid", what); + } + *t = '\0'; + + l = strlen(buf); + if (!l) + return bitch("%s should not be empty", what); + + if (buf[l-1] != '.') { + if (!file_info->current_origin) { + return bitch("do not know origin to determine %s", what); + } + ol = strlen(file_info->current_origin); + if (file_info->current_origin[0] == '.') { + if (l + ol >= 1023) + return bitch("name too long"); + strcat(buf, file_info->current_origin); + } else { + if (l + ol >= 1022) + return bitch("name too long"); + strcat(buf, "."); + strcat(buf, file_info->current_origin); + } + } + + t = strchr(buf, '*'); + if (t && (t != buf || t[1] != '.')) + return bitch("%s: bad wildcard", what); + if (buf[0] == '.' && buf[1] != '\0') + return bitch("%s: name cannot start with a dot", what); + if (strstr(buf, "..")) + return bitch("%s: empty label in a name", what); + + *input = skip_white_space(s); + if (!*input) + return NULL; /* bitching's done elsewhere */ + if (!(options & KEEP_CAPITALIZATION)) { + t = buf; + while (*t) { + *t = tolower(*t); + t++; + } + } - t = quickstrdup(buf); - return t; + t = quickstrdup(buf); + return t; } char *extract_name(char **input, char *what, int options) { - char *s = *input; - char *r = NULL; - char *end = NULL; - char c; - int wildcard = 0; - - if (*s == '@') { - s++; - if (*s && !isspace(*s) && *s != ';' && *s != ')') { - return bitch("literal @ in %s is not all by itself", what); - } - if (!G.opt.current_origin) { - return bitch("do not know origin to expand @ in %s", what); - } - r = quickstrdup(G.opt.current_origin); - } else { - if (!(isalnum(*s) || *s == '_' || *s == '.' || *s == '/')) { - if (*s == '*') { - wildcard = 1; - } else { - if (*s == '\\') - return extract_name_slow(input, what, options); - return bitch("%s expected", what); - } - } - s++; - while (isalnum(*s) || *s == '.' || *s == '-' || *s == '_' || *s == '/') - s++; - if (*s && !isspace(*s) && *s != ';' && *s != ')') { - if (*s == '\\') - return extract_name_slow(input, what, options); - return bitch("%s is not valid", what); - } - if (!*s) end = s; - c = *s; - *s = '\0'; - if (*(s-1) == '.') { - r = quickstrdup(*input); - } else { - if (!G.opt.current_origin) { - return bitch("do not know origin to determine %s", what); - } - r = getmem(strlen(*input) + 1 + strlen(G.opt.current_origin) + 1); - if (G.opt.current_origin[0] == '.') { - strcpy(mystpcpy(r, *input), G.opt.current_origin); - } else { - strcpy(mystpcpy(mystpcpy(r, *input), "."), G.opt.current_origin); - } - } - *s = c; - } - if (end) { - *input = end; - } else { - *input = skip_white_space(s); - if (!*input) - return NULL; /* bitching's done elsewhere */ - } - if (!(options & KEEP_CAPITALIZATION)) { - s = r; - while (*s) { - *s = tolower(*s); - s++; - } - } - if (wildcard && r[1] != '.') { - return bitch("%s: bad wildcard", what); - } else if (r[0] == '.' && r[1] != '\0') { - return bitch("%s: name cannot start with a dot", what); - } - return r; + char *s = *input; + char *r = NULL; + char *end = NULL; + char c; + int wildcard = 0; + + if (*s == '@') { + s++; + if (*s && !isspace(*s) && *s != ';' && *s != ')') { + return bitch("literal @ in %s is not all by itself", what); + } + if (!file_info->current_origin) { + return bitch("do not know origin to expand @ in %s", what); + } + r = quickstrdup(file_info->current_origin); + } else { + if (!(isalnum(*s) || *s == '_' || *s == '.' || *s == '/' || ((options & DOLLAR_OK_IN_NAMES) && *s == '$'))) { + if (*s == '*') { + wildcard = 1; + } else { + if (*s == '\\') + return extract_name_slow(input, what, options); + return bitch("%s expected", what); + } + } + s++; + while (isalnum(*s) || *s == '.' || *s == '-' || *s == '_' || *s == '/' || ((options & DOLLAR_OK_IN_NAMES) && *s == '$')) + s++; + if (*s && !isspace(*s) && *s != ';' && *s != ')') { + if (*s == '\\') + return extract_name_slow(input, what, options); + return bitch("%s is not valid", what); + } + if (!*s) end = s; + c = *s; + *s = '\0'; + if (*(s-1) == '.') { + r = quickstrdup(*input); + } else { + if (!file_info->current_origin) { + return bitch("do not know origin to determine %s", what); + } + r = getmem(strlen(*input) + 1 + strlen(file_info->current_origin) + 1); + if (file_info->current_origin[0] == '.') { + strcpy(mystpcpy(r, *input), file_info->current_origin); + } else { + strcpy(mystpcpy(mystpcpy(r, *input), "."), file_info->current_origin); + } + } + *s = c; + } + if (end) { + *input = end; + } else { + *input = skip_white_space(s); + if (!*input) + return NULL; /* bitching's done elsewhere */ + } + if (!(options & KEEP_CAPITALIZATION)) { + s = r; + while (*s) { + *s = tolower(*s); + s++; + } + } + if (wildcard && r[1] != '.') { + return bitch("%s: bad wildcard", what); + } else if (r[0] == '.' && r[1] != '\0') { + return bitch("%s: name cannot start with a dot", what); + } + return r; } char *extract_label(char **input, char *what, void *is_temporary) { - char *s = *input; - char *r = NULL; - char *end = NULL; - - if (!isalpha(*s)) { - return bitch("%s expected", what); - } - s++; - while (isalnum(*s)) - s++; - if (*s && !isspace(*s)) { - return bitch("%s is not valid", what); - } - if (!*s) end = s; - *s++ = '\0'; - if (is_temporary) { - r = quickstrdup_temp(*input); - } else { - r = quickstrdup(*input); - } - - if (end) { - *input = end; - } else { - *input = skip_white_space(s); - if (!*input) - return NULL; /* bitching's done elsewhere */ - } - s = r; - while (*s) { - *s = tolower(*s); - s++; - } - return r; -} - -long long extract_integer(char **input, char *what) -{ - char *s = *input; - long long r = -1; - char *end = NULL; - char c; - - if (!isdigit(*s)) { - bitch("%s expected", what); - return -1; - } - s++; - while (isdigit(*s)) - s++; - if (*s && !isspace(*s) && *s != ';' && *s != ')') { - bitch("%s is not valid", what); - return -1; - } - if (!*s) end = s; - c = *s; - *s = '\0'; - r = strtoll(*input, NULL, 10); - *s = c; - - if (end) { - *input = end; - } else { - *input = skip_white_space(s); - if (!*input) - return -1; /* bitching's done elsewhere */ - } - return r; + char *s = *input; + char *r = NULL; + char *end = NULL; + + if (!isalpha(*s)) { + return bitch("%s expected", what); + } + s++; + while (isalnum(*s)) + s++; + if (*s && !isspace(*s)) { + return bitch("%s is not valid", what); + } + if (!*s) end = s; + *s++ = '\0'; + if (is_temporary) { + r = quickstrdup_temp(*input); + } else { + r = quickstrdup(*input); + } + + if (end) { + *input = end; + } else { + *input = skip_white_space(s); + if (!*input) + return NULL; /* bitching's done elsewhere */ + } + s = r; + while (*s) { + *s = tolower(*s); + s++; + } + return r; +} + +long long extract_integer(char **input, char *what, const char *extra_delimiters) +{ + char *s = *input; + long long r = -1; + char *end = NULL; + char c; + + if (!isdigit(*s)) { + bitch("%s expected", what); + return -1; + } + s++; + while (isdigit(*s)) + s++; + if (*s && !isspace(*s) && *s != ';' && *s != ')') { + if (!extra_delimiters || strchr(extra_delimiters, *s) == NULL) { + bitch("%s is not valid", what); + return -1; + } + } + if (!*s) end = s; + c = *s; + *s = '\0'; + r = strtoll(*input, NULL, 10); + *s = c; + + if (end) { + *input = end; + } else { + *input = skip_white_space(s); + if (!*input) + return -1; /* bitching's done elsewhere */ + } + return r; } int extract_double(char **input, char *what, double *val, int skip_m) { - char *s = *input; - char *end = NULL; - char *stop; - char c; - int saw_m = 0; - - while (isdigit(*s) || *s == '+' || *s == '-' || *s == '.') - s++; - if (*s && !isspace(*s) && *s != ';' && *s != ')') { - if (skip_m && (*s == 'm' || *s == 'M')) { - saw_m = 1; - } else { - bitch("%s is not valid", what); - return -1; - } - } - if (!*s) end = s; - c = *s; - *s = '\0'; - *val = strtod(*input, &stop); - if (*stop != '\0') { - *s = c; - bitch("%s is not valid", what); - return -1; - } - *s = c; - - if (saw_m) { - s++; - if (*s && !isspace(*s) && *s != ';' && *s != ')') { - bitch("%s is not valid", what); - return -1; - } - } - - if (end) { - *input = end; - } else { - *input = skip_white_space(s); - if (!*input) - return -1; /* bitching's done elsewhere */ - } - return 1; + char *s = *input; + char *end = NULL; + char *stop; + char c; + int saw_m = 0; + + while (isdigit(*s) || *s == '+' || *s == '-' || *s == '.') + s++; + if (*s && !isspace(*s) && *s != ';' && *s != ')') { + if (skip_m && (*s == 'm' || *s == 'M')) { + saw_m = 1; + } else { + bitch("%s is not valid", what); + return -1; + } + } + if (!*s) end = s; + c = *s; + *s = '\0'; + *val = strtod(*input, &stop); + if (*stop != '\0') { + *s = c; + bitch("%s is not valid", what); + return -1; + } + *s = c; + + if (saw_m) { + s++; + if (*s && !isspace(*s) && *s != ';' && *s != ')') { + bitch("%s is not valid", what); + return -1; + } + } + + if (end) { + *input = end; + } else { + *input = skip_white_space(s); + if (!*input) + return -1; /* bitching's done elsewhere */ + } + return 1; } long extract_timevalue(char **input, char *what) { - char *s = *input; - int r = 0, acc = 0; + char *s = *input; + int r = 0, acc = 0; - if (!isdigit(*s)) { - bitch("%s expected", what); - return -1; - } + if (!isdigit(*s)) { + bitch("%s expected", what); + return -1; + } next_component: - r = 0; - while (isdigit(*s)) { - r *= 10; - r += *s - '0'; - s++; - } - if (tolower(*s) == 's') { - s++; - } else if (tolower(*s) == 'm') { - r *= 60; - s++; - } else if (tolower(*s) == 'h') { - r *= 3600; - s++; - } else if (tolower(*s) == 'd') { - r *= 86400; - s++; - } else if (tolower(*s) == 'w') { - r *= 604800; - s++; - } - acc += r; - if (isdigit(*s)) goto next_component; - - if (*s && !isspace(*s) && *s != ';' && *s != ')') { - bitch("%s is not valid", what); - return -1; - } - *input = skip_white_space(s); - if (!*input) - return -1; /* bitching's done elsewhere */ - return acc; + r = 0; + while (isdigit(*s)) { + r *= 10; + r += *s - '0'; + s++; + } + if (tolower(*s) == 's') { + s++; + } else if (tolower(*s) == 'm') { + r *= 60; + s++; + } else if (tolower(*s) == 'h') { + r *= 3600; + s++; + } else if (tolower(*s) == 'd') { + r *= 86400; + s++; + } else if (tolower(*s) == 'w') { + r *= 604800; + s++; + } + acc += r; + if (isdigit(*s)) goto next_component; + + if (*s && !isspace(*s) && *s != ';' && *s != ')') { + bitch("%s is not valid", what); + return -1; + } + *input = skip_white_space(s); + if (!*input) + return -1; /* bitching's done elsewhere */ + return acc; } long long extract_timestamp(char **input, char *what) { - char *s = *input; - int year = 0; - int month = 0; - int day = 0; - int hour = 0; - int minute = 0; - int second = 0; - long long epoch = 0; - struct tm tm; - - if (!isdigit(*s)) { - bitch("%s expected", what); - return -1; - } - year = year*10 + *s - '0'; - epoch = epoch*10 + *s - '0'; - s++; - if (!isdigit(*s)) goto looks_like_epoch; - year = year*10 + *s - '0'; - epoch = epoch*10 + *s - '0'; - s++; - if (!isdigit(*s)) goto looks_like_epoch; - year = year*10 + *s - '0'; - epoch = epoch*10 + *s - '0'; - s++; - if (!isdigit(*s)) goto looks_like_epoch; - year = year*10 + *s - '0'; - epoch = epoch*10 + *s - '0'; - s++; - if (!isdigit(*s)) goto looks_like_epoch; - month = month*10 + *s - '0'; - epoch = epoch*10 + *s - '0'; - s++; - if (!isdigit(*s)) goto looks_like_epoch; - month = month*10 + *s - '0'; - epoch = epoch*10 + *s - '0'; - s++; - if (!isdigit(*s)) goto looks_like_epoch; - day = day*10 + *s - '0'; - epoch = epoch*10 + *s - '0'; - s++; - if (!isdigit(*s)) goto looks_like_epoch; - day = day*10 + *s - '0'; - epoch = epoch*10 + *s - '0'; - s++; - if (!isdigit(*s)) goto looks_like_epoch; - hour = hour*10 + *s - '0'; - epoch = epoch*10 + *s - '0'; - s++; - if (!isdigit(*s)) goto looks_like_epoch; - hour = hour*10 + *s - '0'; - epoch = epoch*10 + *s - '0'; - s++; - if (!isdigit(*s)) goto looks_like_epoch; - minute = minute*10 + *s - '0'; - epoch = epoch*10 + *s - '0'; - s++; - if (!isdigit(*s)) goto looks_like_epoch; - minute = minute*10 + *s - '0'; - epoch = epoch*10 + *s - '0'; - s++; - if (!isdigit(*s)) goto looks_like_epoch; - second = second*10 + *s - '0'; - epoch = epoch*10 + *s - '0'; - s++; - if (!isdigit(*s)) goto looks_like_epoch; - second = second*10 + *s - '0'; - epoch = epoch*10 + *s - '0'; - s++; - if (*s && !isspace(*s) && *s != ';' && *s != ')') { - bitch("%s is not valid", what); - return -1; - } - if (second > 60 || minute > 59 || hour > 23 || day < 1 || day > 31 || - month > 12 || year < 1900 || year > 2037) - { - bitch("%s is not valid", what); - return -1; - } - memset(&tm, 0, sizeof(tm)); - tm.tm_sec = second; - tm.tm_min = minute; - tm.tm_hour = hour; - tm.tm_mday = day; - tm.tm_mon = month - 1; - tm.tm_year = year - 1900; - epoch = mktime(&tm); - if (epoch < 0) { - bitch("%s is not valid", what); - return -1; - } + char *s = *input; + int year = 0; + int month = 0; + int day = 0; + int hour = 0; + int minute = 0; + int second = 0; + long long epoch = 0; + struct tm tm; + + if (!isdigit(*s)) { + bitch("%s expected", what); + return -1; + } + year = year*10 + *s - '0'; + epoch = epoch*10 + *s - '0'; + s++; + if (!isdigit(*s)) goto looks_like_epoch; + year = year*10 + *s - '0'; + epoch = epoch*10 + *s - '0'; + s++; + if (!isdigit(*s)) goto looks_like_epoch; + year = year*10 + *s - '0'; + epoch = epoch*10 + *s - '0'; + s++; + if (!isdigit(*s)) goto looks_like_epoch; + year = year*10 + *s - '0'; + epoch = epoch*10 + *s - '0'; + s++; + if (!isdigit(*s)) goto looks_like_epoch; + month = month*10 + *s - '0'; + epoch = epoch*10 + *s - '0'; + s++; + if (!isdigit(*s)) goto looks_like_epoch; + month = month*10 + *s - '0'; + epoch = epoch*10 + *s - '0'; + s++; + if (!isdigit(*s)) goto looks_like_epoch; + day = day*10 + *s - '0'; + epoch = epoch*10 + *s - '0'; + s++; + if (!isdigit(*s)) goto looks_like_epoch; + day = day*10 + *s - '0'; + epoch = epoch*10 + *s - '0'; + s++; + if (!isdigit(*s)) goto looks_like_epoch; + hour = hour*10 + *s - '0'; + epoch = epoch*10 + *s - '0'; + s++; + if (!isdigit(*s)) goto looks_like_epoch; + hour = hour*10 + *s - '0'; + epoch = epoch*10 + *s - '0'; + s++; + if (!isdigit(*s)) goto looks_like_epoch; + minute = minute*10 + *s - '0'; + epoch = epoch*10 + *s - '0'; + s++; + if (!isdigit(*s)) goto looks_like_epoch; + minute = minute*10 + *s - '0'; + epoch = epoch*10 + *s - '0'; + s++; + if (!isdigit(*s)) goto looks_like_epoch; + second = second*10 + *s - '0'; + epoch = epoch*10 + *s - '0'; + s++; + if (!isdigit(*s)) goto looks_like_epoch; + second = second*10 + *s - '0'; + epoch = epoch*10 + *s - '0'; + s++; + if (*s && !isspace(*s) && *s != ';' && *s != ')') { + bitch("%s is not valid", what); + return -1; + } + if (second > 60 || minute > 59 || hour > 23 || day < 1 || day > 31 || + month > 12 || year < 1900 || year > 2037) + { + bitch("%s is not valid", what); + return -1; + } + memset(&tm, 0, sizeof(tm)); + tm.tm_sec = second; + tm.tm_min = minute; + tm.tm_hour = hour; + tm.tm_mday = day; + tm.tm_mon = month - 1; + tm.tm_year = year - 1900; + epoch = mktime(&tm); + if (epoch < 0) { + bitch("%s is not valid", what); + return -1; + } - goto done; + goto done; looks_like_epoch: - if (*s && !isspace(*s) && *s != ';' && *s != ')') { - bitch("%s is not valid", what); - return -1; - } + if (*s && !isspace(*s) && *s != ';' && *s != ')') { + bitch("%s is not valid", what); + return -1; + } done: - *input = skip_white_space(s); - if (!*input) - return -1; /* bitching's done elsewhere */ - return epoch; + *input = skip_white_space(s); + if (!*input) + return -1; /* bitching's done elsewhere */ + return epoch; } int extract_ipv4(char **input, char *what, struct in_addr *addr) { - char *s = *input; - char c; + char *s = *input; + char c; - while (isdigit(*s) || *s == '.') { - s++; - } - if (s == *input) { - bitch("%s is not valid", what); - return -1; - } - if (*s && !isspace(*s) && *s != ';' && *s != ')') { - bitch("%s is not valid", what); - return -1; - } - c = *s; - *s = 0; - if (inet_pton(AF_INET, *input, addr) != 1) { - *s = c; - bitch("cannot parse %s", what); - return -1; - } - *s = c; - *input = skip_white_space(s); - if (!*input) { - return -1; /* bitching's done elsewhere */ - } - return 1; + while (isdigit(*s) || *s == '.') { + s++; + } + if (s == *input) { + bitch("%s is not valid", what); + return -1; + } + if (*s && !isspace(*s) && *s != ';' && *s != ')') { + bitch("%s is not valid", what); + return -1; + } + c = *s; + *s = 0; + if (inet_pton(AF_INET, *input, addr) != 1) { + *s = c; + bitch("cannot parse %s", what); + return -1; + } + *s = c; + *input = skip_white_space(s); + if (!*input) { + return -1; /* bitching's done elsewhere */ + } + return 1; } int extract_ipv6(char **input, char *what, struct in6_addr *addr) { - char *s = *input; - char c; + char *s = *input; + char c; - while (isdigit(*s) || *s == ':' || *s == '.' || - (*s >= 'a' && *s <= 'f') || (*s >= 'A' && *s <= 'F')) - { - s++; - } - if (s == *input) { - bitch("%s is not valid", what); - return -1; - } - if (*s && !isspace(*s) && *s != ';' && *s != ')') { - bitch("%s is not valid", what); - return -1; - } - c = *s; - *s = 0; - if (inet_pton(AF_INET6, *input, addr) != 1) { - *s = c; - bitch("cannot parse %s", what); - return -1; - } - *s = c; - *input = skip_white_space(s); - if (!*input) { - return -1; /* bitching's done elsewhere */ - } - return 1; + while (isdigit(*s) || *s == ':' || *s == '.' || + (*s >= 'a' && *s <= 'f') || (*s >= 'A' && *s <= 'F')) + { + s++; + } + if (s == *input) { + bitch("%s is not valid", what); + return -1; + } + if (*s && !isspace(*s) && *s != ';' && *s != ')') { + bitch("%s is not valid", what); + return -1; + } + c = *s; + *s = 0; + if (inet_pton(AF_INET6, *input, addr) != 1) { + *s = c; + bitch("cannot parse %s", what); + return -1; + } + *s = c; + *input = skip_white_space(s); + if (!*input) { + return -1; /* bitching's done elsewhere */ + } + return 1; } int extract_u64(char **input, char *what, uint64_t *r) { - char *s = *input; - uint8_t result = 0; - unsigned u; - - #define GETHEXBLOCK if (!isxdigit(*s)) { bitch("%s is not valid", what); return -1; } \ - u = 0; \ - while (isxdigit(*s)) { \ - if (isdigit(*s)) { \ - u = (u << 4) | (*s - '0'); \ - } else if (*s >= 'a' && *s <= 'f') { \ - u = (u << 4) | (*s - 'a' + 10); \ - } else { \ - u = (u << 4) | (*s - 'A' + 10); \ - } \ - s++; \ - } \ - if (u > 0xffff) { bitch("%s is not valid, hex out of range", what); return -1; } \ - result = (result << 16) | u; - #define SKIPCOLON if (*s != ':') { bitch("%s is not valid", what); return -1; } s++; - - GETHEXBLOCK; SKIPCOLON; - GETHEXBLOCK; SKIPCOLON; - GETHEXBLOCK; SKIPCOLON; - GETHEXBLOCK; - *r = result; - - #undef GETHEXBLOCK - #undef SKIPCOLON - - if (*s && !isspace(*s) && *s != ';' && *s != ')') { - bitch("%s is not valid", what); - return -1; - } - *input = skip_white_space(s); - if (!*input) { - return -1; /* bitching's done elsewhere */ - } - return 1; + char *s = *input; + uint8_t result = 0; + unsigned u; + + #define GETHEXBLOCK if (!isxdigit(*s)) { bitch("%s is not valid", what); return -1; } \ + u = 0; \ + while (isxdigit(*s)) { \ + if (isdigit(*s)) { \ + u = (u << 4) | (*s - '0'); \ + } else if (*s >= 'a' && *s <= 'f') { \ + u = (u << 4) | (*s - 'a' + 10); \ + } else { \ + u = (u << 4) | (*s - 'A' + 10); \ + } \ + s++; \ + } \ + if (u > 0xffff) { bitch("%s is not valid, hex out of range", what); return -1; } \ + result = (result << 16) | u; + #define SKIPCOLON if (*s != ':') { bitch("%s is not valid", what); return -1; } s++; + + GETHEXBLOCK; SKIPCOLON; + GETHEXBLOCK; SKIPCOLON; + GETHEXBLOCK; SKIPCOLON; + GETHEXBLOCK; + *r = result; + + #undef GETHEXBLOCK + #undef SKIPCOLON + + if (*s && !isspace(*s) && *s != ';' && *s != ')') { + bitch("%s is not valid", what); + return -1; + } + *input = skip_white_space(s); + if (!*input) { + return -1; /* bitching's done elsewhere */ + } + return 1; } struct binary_data bad_binary_data(void) { - struct binary_data r; - r.length = -1; - r.data = NULL; - return r; + struct binary_data r; + r.length = -1; + r.data = NULL; + return r; +} + +void +dump_binary_data(FILE *f, struct binary_data d) +{ + char *s = d.data; + int mem_len = d.length; + int i; + char o[69]; + int pos[] = { 0,3,6,9,12,15,18,21,25,28,31,34,37,40,43,46 }; + char hex[] = "0123456789abcdef"; + + if (mem_len < 0) { + fprintf(f, "\n"); + return; + } + + while (mem_len) { + memset(o, ' ', 67); + o[67] = '\n'; + o[68] = 0; + for (i = 0; i < 16 && mem_len > 0; i++, mem_len--, s++) { + o[pos[i]] = hex[*s >> 4]; + o[pos[i]+1] = hex[*s & 0x0f]; + o[51+i] = isprint(*s) ? *s : '.'; + } + fprintf(f, "%s", o); + } } struct binary_data extract_base64_binary_data(char **input, char *what) { - char b64[4096]; - int l64 = 0; - char *s = *input; - struct binary_data r = bad_binary_data(); - int bl; - - while (s && *s) { - if (!isalnum(*s) && *s != '=' && *s != '+' && *s != '/') { - bitch("%s expected", what); - return r; - } - while (isalnum(*s) || *s == '=' || *s == '+' || *s == '/') { - if (l64 >= 4095) { - bitch("%s is too long", what); - return r; - } - b64[l64++] = *s++; - } - s = skip_white_space(s); - } - *input = s; - if (!s) return r; - b64[l64] = 0; - bl = (l64 * 3 + 3)/4; - r.data = getmem(bl); - r.length = decode_base64(r.data, b64, bl); - if (r.length < 0) { - bitch("error decoding base64 %s", what); - return r; - } - return r; + char b64[4096]; + int l64 = 0; + char *s = *input; + struct binary_data r = bad_binary_data(); + int bl; + + while (s && *s) { + if (!isalnum(*s) && *s != '=' && *s != '+' && *s != '/') { + bitch("%s expected", what); + return r; + } + while (isalnum(*s) || *s == '=' || *s == '+' || *s == '/') { + if (l64 >= 4095) { + bitch("%s is too long", what); + return r; + } + b64[l64++] = *s++; + } + s = skip_white_space(s); + } + *input = s; + if (!s) return r; + b64[l64] = 0; + bl = (l64 * 3 + 3)/4; + r.data = getmem(bl); + r.length = decode_base64(r.data, b64, bl); + if (r.length < 0) { + bitch("error decoding base64 %s", what); + return r; + } + return r; } struct binary_data extract_base32hex_binary_data(char **input, char *what) { - char b32[4096]; - int l32 = 0; - char *s = *input; - struct binary_data r = bad_binary_data(); - int bl; - - while ( - (*s >= 'A' && *s <= 'V') || - (*s >= 'a' && *s <= 'v') || - (*s >= '0' && *s <= '9') || - *s == '=') - { - if (l32 >= 4095) { - bitch("%s is too long", what); - return r; - } - b32[l32++] = *s++; - } - if (l32 <= 0) { - bitch("%s expected", what); - return r; - } - - s = skip_white_space(s); - *input = s; - if (!s) return r; - - b32[l32] = 0; - bl = (l32 * 5 + 7)/8; - r.data = getmem(bl); - r.length = decode_base32hex(r.data, b32, bl); - if (r.length < 0) { - bitch("error decoding base32hex %s", what); - return r; - } - return r; + char b32[4096]; + int l32 = 0; + char *s = *input; + struct binary_data r = bad_binary_data(); + int bl; + + while ( + (*s >= 'A' && *s <= 'V') || + (*s >= 'a' && *s <= 'v') || + (*s >= '0' && *s <= '9') || + *s == '=') + { + if (l32 >= 4095) { + bitch("%s is too long", what); + return r; + } + b32[l32++] = *s++; + } + if (l32 <= 0) { + bitch("%s expected", what); + return r; + } + + s = skip_white_space(s); + *input = s; + if (!s) return r; + + b32[l32] = 0; + bl = (l32 * 5 + 7)/8; + r.data = getmem(bl); + r.length = decode_base32hex(r.data, b32, bl); + if (r.length < 0) { + bitch("error decoding base32hex %s", what); + return r; + } + return r; } struct binary_data extract_text(char **input, char *what) { - char *s = *input; - struct binary_data r = bad_binary_data(); - char *o = getmem_temp(65536); - int l = 0; - int c; - - if (*s != '"') { - bitch("for now, %s must be put in double quotes", what); - return r; - } - s++; + char *s = *input; + struct binary_data r = bad_binary_data(); + char *o = getmem_temp(65536); + int l = 0; + int c; + + if (*s != '"') { + while (*s && !isspace(*s)) { + o[l++] = *s++; + } + *input = skip_white_space(s); + if (!*input) + return r; /* bitching's done elsewhere */ + + o[l] = 0; + r.data = getmem(l+1); + r.length = l; + memcpy(r.data, o, l+1); + return r; + } + s++; more_text: - while (*s && *s != '"') { - if (*s == '\\') { - s++; - if (*s == 0) { - bitch("bad backslash quoting of %s", what); - return r; - } else if (isdigit(*s)) { - c = 0; - while (isdigit(*s)) { - c = c*10 + *s - '0'; - s++; - } - o[l++] = (unsigned char)c; - } else { - o[l] = *s; - goto new_char; - } - } else { - o[l] = *s; + while (*s && *s != '"') { + if (*s == '\\') { + s++; + if (*s == 0) { + bitch("bad backslash quoting of %s", what); + return r; + } else if (isdigit(*s)) { + c = 0; + while (isdigit(*s)) { + c = c*10 + *s - '0'; + s++; + } + o[l++] = (unsigned char)c; + } else { + o[l] = *s; + goto new_char; + } + } else { + o[l] = *s; new_char: - if (l >= 65534) { - bitch("%s string too long", what); - return r; - } - l++; - s++; - } - } - if (!*s) { - if (fgets(file_info->buf, 2048, file_info->file)) { - file_info->line++; - s = file_info->buf; - goto more_text; - } else { - bitch("closing quote not found while parsing %s", what); - return r; - } - } - s++; - *input = skip_white_space(s); - if (!*input) - return r; /* bitching's done elsewhere */ - - o[l] = 0; - r.data = getmem(l+1); - r.length = l; - memcpy(r.data, o, l+1); - return r; + if (l >= 65534) { + bitch("%s string too long", what); + return r; + } + l++; + s++; + } + } + if (!*s) { + if (read_zone_line()) { + s = file_info->buf; + goto more_text; + } else { + bitch("closing quote not found while parsing %s", what); + return r; + } + } + s++; + *input = skip_white_space(s); + if (!*input) + return r; /* bitching's done elsewhere */ + + o[l] = 0; + r.data = getmem(l+1); + r.length = l; + memcpy(r.data, o, l+1); + return r; } struct binary_data extract_hex_binary_data(char **input, char *what, int eat_whitespace) { - char hex[4096]; - char *s = *input; - struct binary_data r = bad_binary_data(); - int hl, hi, hb; - - hex[0] = '0'; - hl = 1; - - if (s[0] == '0' && (s[1] == 'x' || s[1] == 'X')) - s += 2; - if (eat_whitespace == EXTRACT_DONT_EAT_WHITESPACE) { - while (isxdigit(*s)) { - if (hl >= 4095) { - bitch("%s is too long", what); - return r; - } - hex[hl] = *s; - s++; - hl++; - } - if (*s && !isspace(*s) && *s != ';' && *s != ')') { - bitch("%s is not valid", what); - return r; - } - *input = skip_white_space(s); - } else if (eat_whitespace == EXTRACT_EAT_WHITESPACE) { - while (s && *s) { - if (!isxdigit(*s)) { - bitch("%s expected", what); - return r; - } - while (isxdigit(*s)) { - if (hl >= 4095) { - bitch("%s is too long", what); - return r; - } - hex[hl++] = *s++; - } - s = skip_white_space(s); - } - *input = s; - } else { - bitch("%s: internal: invalid eat_whitespace", what); - } - - if (!*input) - return r; /* bitching's done elsewhere */ - - hb = hl % 2 ? 1 : 0; - if (hb == 0) - bitch("%s: hex data does not represent whole number of bytes", what); - r.data = getmem(hl/2); - r.length = hl/2; - memset(r.data, 0, r.length); - for (hi = 0; hi < hl-hb; hi++) { - r.data[hi/2] <<= 4; - r.data[hi/2] |= 0x0f & (isdigit(hex[hi+hb]) ? hex[hi+hb] - '0' : tolower(hex[hi+hb]) - 'a' + 10); - } - return r; + char hex[4096]; + char *s = *input; + struct binary_data r = bad_binary_data(); + int hl, hi, hb; + + hex[0] = '0'; + hl = 1; + + if (s[0] == '0' && (s[1] == 'x' || s[1] == 'X')) + s += 2; + if (eat_whitespace == EXTRACT_DONT_EAT_WHITESPACE) { + while (isxdigit(*s)) { + if (hl >= 4095) { + bitch("%s is too long", what); + return r; + } + hex[hl] = *s; + s++; + hl++; + } + if (*s && !isspace(*s) && *s != ';' && *s != ')') { + bitch("%s is not valid", what); + return r; + } + *input = skip_white_space(s); + } else if (eat_whitespace == EXTRACT_EAT_WHITESPACE) { + while (s && *s) { + if (!isxdigit(*s)) { + bitch("%s expected", what); + return r; + } + while (isxdigit(*s)) { + if (hl >= 4095) { + bitch("%s is too long", what); + return r; + } + hex[hl++] = *s++; + } + s = skip_white_space(s); + } + *input = s; + } else { + bitch("%s: internal: invalid eat_whitespace", what); + } + + if (!*input) + return r; /* bitching's done elsewhere */ + + hb = hl % 2 ? 1 : 0; + if (hb == 0) + bitch("%s: hex data does not represent whole number of bytes", what); + r.data = getmem(hl/2); + r.length = hl/2; + memset(r.data, 0, r.length); + for (hi = 0; hi < hl-hb; hi++) { + r.data[hi/2] <<= 4; + r.data[hi/2] |= 0x0f & (isdigit(hex[hi+hb]) ? hex[hi+hb] - '0' : tolower(hex[hi+hb]) - 'a' + 10); + } + return r; } struct binary_data new_set(void) { - struct binary_data set; - set.length = 256*(1+1+32); - set.data = getmem_temp(set.length); - memset(set.data, 0, set.length); - return set; + struct binary_data set; + set.length = 256*(1+1+32); + set.data = getmem_temp(set.length); + memset(set.data, 0, set.length); + return set; } void add_bit_to_set(struct binary_data *set, int bit) { - int map; - int map_base; - int byte; - - if (bit < 0 || bit > 65535) - croakx(1, "bitmap index out of range"); - map = bit / 256; - map_base = map*(1+1+32); - set->data[map_base] = map; - bit = bit & 0xff; - byte = bit / 8; - if (set->data[map_base + 1] <= byte) - set->data[map_base + 1] = byte+1; - set->data[map_base + 2 + byte] |= 0x80 >> (bit & 0x07); + int map; + int map_base; + int byte; + + if (bit < 0 || bit > 65535) + croakx(1, "bitmap index out of range"); + map = bit / 256; + map_base = map*(1+1+32); + set->data[map_base] = map; + bit = bit & 0xff; + byte = bit / 8; + if (set->data[map_base + 1] <= byte) + set->data[map_base + 1] = byte+1; + set->data[map_base + 2 + byte] |= 0x80 >> (bit & 0x07); } struct binary_data compressed_set(struct binary_data *set) { - int len = 0; - int map; - int map_base; - struct binary_data r; - - for (map = 0; map <= 255; map++) { - map_base = map*(1+1+32); - if (set->data[map_base+1]) { - len += 2 + set->data[map_base+1]; - } - } - r.length = len; - r.data = getmem(r.length); - len = 0; - for (map = 0; map <= 255; map++) { - map_base = map*(1+1+32); - if (set->data[map_base+1]) { - memcpy(&r.data[len], &set->data[map_base], 2 + set->data[map_base+1]); - len += 2 + set->data[map_base+1]; - } - } - return r; + int len = 0; + int map; + int map_base; + struct binary_data r; + + for (map = 0; map <= 255; map++) { + map_base = map*(1+1+32); + if (set->data[map_base+1]) { + len += 2 + set->data[map_base+1]; + } + } + r.length = len; + r.data = getmem(r.length); + len = 0; + for (map = 0; map <= 255; map++) { + map_base = map*(1+1+32); + if (set->data[map_base+1]) { + memcpy(&r.data[len], &set->data[map_base], 2 + set->data[map_base+1]); + len += 2 + set->data[map_base+1]; + } + } + return r; } struct binary_data compose_binary_data(const char *fmt, int tmp, ...) { - va_list ap; - const char *args; - int sz; - struct binary_data bd; - struct binary_data r; - char *t; - uint8_t b1; - uint16_t b2; - uint32_t b4; - uint64_t b8; - - va_start(ap, tmp); - args = fmt; - sz = 0; - while (*args) { - switch (*args++) { - case '1': - va_arg(ap, unsigned int); - sz += 1; - break; - case '2': - va_arg(ap, unsigned int); - sz += 2; - break; - case '4': - va_arg(ap, unsigned int); - sz += 4; - break; - case '8': - va_arg(ap, uint64_t); - sz += 8; - break; - case 'd': - bd = va_arg(ap, struct binary_data); - sz += bd.length; - break; - case 'b': - bd = va_arg(ap, struct binary_data); - if (bd.length > 255) - croak(5, "compose_binary_data: 'b' data too long"); - sz += bd.length + 1; - break; - case 'B': - bd = va_arg(ap, struct binary_data); - if (bd.length > 65535) - croak(5, "compose_binary_data: 'B' data too long"); - sz += bd.length + 2; - break; - default: - croak(5, "compose_binary_data: bad format"); - } - } - va_end(ap); - - r.length = sz; - r.data = tmp ? getmem_temp(sz) : getmem(sz); - t = r.data; - va_start(ap, tmp); - args = fmt; - while (*args) { - switch (*args++) { - case '1': - b1 = (uint8_t)va_arg(ap, unsigned int); - memcpy(t, &b1, 1); - t += 1; - break; - case '2': - b2 = htons(va_arg(ap, unsigned int)); - memcpy(t, &b2, 2); - t += 2; - break; - case '4': - b4 = htonl(va_arg(ap, unsigned int)); - memcpy(t, &b4, 4); - t += 4; - break; - case '8': - b8 = htonl(va_arg(ap, uint64_t)); - memcpy(t, &b8, 8); - t += 8; - break; - case 'd': - bd = va_arg(ap, struct binary_data); - memcpy(t, bd.data, bd.length); - t += bd.length; - break; - case 'b': - bd = va_arg(ap, struct binary_data); - b1 = (uint8_t)bd.length; - memcpy(t, &b1, 1); - t += 1; - memcpy(t, bd.data, bd.length); - t += bd.length; - break; - case 'B': - bd = va_arg(ap, struct binary_data); - b2 = htons(bd.length); - memcpy(t, &b2, 2); - t += 2; - memcpy(t, bd.data, bd.length); - t += bd.length; - break; - default: - croak(5, "compose_binary_data: bad format"); - } - } - va_end(ap); - return r; + va_list ap; + const char *args; + int sz; + struct binary_data bd; + struct binary_data r; + char *t; + uint8_t b1; + uint16_t b2; + uint32_t b4; + uint64_t b8; + char *bs; + int bsl; + + va_start(ap, tmp); + args = fmt; + sz = 0; + while (*args) { + switch (*args++) { + case '1': + va_arg(ap, unsigned int); + sz += 1; + break; + case '2': + va_arg(ap, unsigned int); + sz += 2; + break; + case '4': + va_arg(ap, unsigned int); + sz += 4; + break; + case '8': + va_arg(ap, uint64_t); + sz += 8; + break; + case 'd': + bd = va_arg(ap, struct binary_data); + sz += bd.length; + break; + case 'b': + bd = va_arg(ap, struct binary_data); + if (bd.length > 255) + croak(5, "compose_binary_data: 'b' data too long"); + sz += bd.length + 1; + break; + case 'B': + bd = va_arg(ap, struct binary_data); + if (bd.length > 65535) + croak(5, "compose_binary_data: 'B' data too long"); + sz += bd.length + 2; + break; + case 's': + bs = va_arg(ap, char *); + bsl = strlen(bs); + if (bsl > 255) + croak(5, "compose_binary_data: 's' string too long"); + sz += bsl + 1; + break; + default: + croak(5, "compose_binary_data: bad format"); + } + } + va_end(ap); + + r.length = sz; + r.data = tmp ? getmem_temp(sz) : getmem(sz); + t = r.data; + va_start(ap, tmp); + args = fmt; + while (*args) { + switch (*args++) { + case '1': + b1 = (uint8_t)va_arg(ap, unsigned int); + memcpy(t, &b1, 1); + t += 1; + break; + case '2': + b2 = htons(va_arg(ap, unsigned int)); + memcpy(t, &b2, 2); + t += 2; + break; + case '4': + b4 = htonl(va_arg(ap, unsigned int)); + memcpy(t, &b4, 4); + t += 4; + break; + case '8': + b8 = htonl(va_arg(ap, uint64_t)); + memcpy(t, &b8, 8); + t += 8; + break; + case 'd': + bd = va_arg(ap, struct binary_data); + memcpy(t, bd.data, bd.length); + t += bd.length; + break; + case 'b': + bd = va_arg(ap, struct binary_data); + b1 = (uint8_t)bd.length; + memcpy(t, &b1, 1); + t += 1; + memcpy(t, bd.data, bd.length); + t += bd.length; + break; + case 'B': + bd = va_arg(ap, struct binary_data); + b2 = htons(bd.length); + memcpy(t, &b2, 2); + t += 2; + memcpy(t, bd.data, bd.length); + t += bd.length; + break; + case 's': + bs = va_arg(ap, char *); + bsl = strlen(bs); + b1 = (uint8_t)bsl; + memcpy(t, &b1, 1); + t += 1; + memcpy(t, bs, bsl); + t += bsl; + break; + default: + croak(5, "compose_binary_data: bad format"); + } + } + va_end(ap); + return r; } /* implementation taken from FreeBSD's libc (minus the __restrict keyword) */ char * mystpcpy(char *to, const char *from) { - for (; (*to = *from); ++from, ++to); - return(to); + for (; (*to = *from); ++from, ++to); + return(to); } + +size_t +mystrlcat(char *dst, const char *src, size_t siz) +{ + char *d = dst; + const char *s = src; + size_t n = siz; + size_t dlen; + + /* Find the end of dst and adjust bytes left but don't go past end */ + while (n-- != 0 && *d != '\0') + d++; + dlen = d - dst; + n = siz - dlen; + + if (n == 0) + return(dlen + strlen(s)); + while (*s != '\0') { + if (n != 1) { + *d++ = *s; + n--; + } + s++; + } + *d = '\0'; + + return(dlen + (s - src)); /* count does not include NUL */ +} + diff -Naur validns-0.8/textparse.h validns/textparse.h --- validns-0.8/textparse.h 2014-02-11 15:45:46.000000000 -0500 +++ validns/textparse.h 2020-10-05 16:59:29.361681424 -0400 @@ -12,10 +12,12 @@ #include struct binary_data { - int length; - char *data; + int length; + char *data; }; +void dump_binary_data(FILE *f, struct binary_data d); + struct binary_data compose_binary_data(const char *fmt, int tmp, ...); /* * Format: @@ -28,17 +30,21 @@ * B - another binary structure, will incorporate its data, * and prepend the length as a 16-bit word in NBO, * fatal error on overflow + * s - a NULL-terminated string, will incorporate the string + * without the NULL byte, and prepend the string length as a byte + * (fatal error on overflow) * tmp : allocate temp storage if true, permanent if false * */ #define KEEP_CAPITALIZATION 32 +#define DOLLAR_OK_IN_NAMES 64 int empty_line_or_comment(char *s); char *skip_white_space(char *s); char *extract_name(char **input, char *what, int options); char *extract_label(char **input, char *what, void *is_temporary); -long long extract_integer(char **input, char *what); +long long extract_integer(char **input, char *what, const char *extra_delimiters); long extract_timevalue(char **input, char *what); long long extract_timestamp(char **input, char *what); int extract_ipv4(char **input, char *what, struct in_addr *addr); @@ -59,7 +65,9 @@ void add_bit_to_set(struct binary_data *set, int bit); struct binary_data compressed_set(struct binary_data *set); -/* stpcpy(3) is not available everywhere */ -char *mystpcpy(char *to, const char *from); +char *mystpcpy(char *to, const char *from); /* stpcpy(3) is not available everywhere */ +size_t mystrlcat(char *dst, const char *src, size_t siz); /* so is strlcat */ + +char *read_zone_line(void); #endif diff -Naur validns-0.8/threads.c validns/threads.c --- validns-0.8/threads.c 2011-10-31 16:46:21.000000000 -0400 +++ validns/threads.c 2020-10-05 16:59:29.361681424 -0400 @@ -7,10 +7,10 @@ #include #endif -/* supposedly, - #if defined(PTW32_VERSION) || defined(__hpux) - return pthread_num_processors_np(); - but I cannot verify that at the moment +/* supposedly, + #if defined(PTW32_VERSION) || defined(__hpux) + return pthread_num_processors_np(); + but I cannot verify that at the moment */ #if defined(__GLIBC__) @@ -18,16 +18,16 @@ #elif defined(__APPLE__) || defined(__FreeBSD__) int ncpus(void) { - int count; - size_t size=sizeof(count); - return sysctlbyname("hw.ncpu",&count,&size,NULL,0) ? 0 : count; + int count; + size_t size=sizeof(count); + return sysctlbyname("hw.ncpu",&count,&size,NULL,0) ? 0 : count; } #else int ncpus(void) { return 0; } /* "Don't know */ #endif -/* Supposedly, sysconf() can also be used in some cases: - #include - int const count=sysconf(_SC_NPROCESSORS_ONLN); - return (count>0)?count:0; +/* Supposedly, sysconf() can also be used in some cases: + #include + int const count=sysconf(_SC_NPROCESSORS_ONLN); + return (count>0)?count:0; */ diff -Naur validns-0.8/tlsa.c validns/tlsa.c --- validns-0.8/tlsa.c 2014-02-11 15:46:23.000000000 -0500 +++ validns/tlsa.c 2020-10-05 16:59:29.361681424 -0400 @@ -21,101 +21,133 @@ /* See http://www.rfc-editor.org/internet-drafts/draft-ietf-dane-protocol-23.txt * for TLSA description. + * See https://tools.ietf.org/html/draft-ietf-dane-smime-16 + * for SMIMEA description. */ -static struct rr* tlsa_parse(char *name, long ttl, int type, char *s) +static struct rr* tlsa_smimea_parse(char *name, long ttl, int type, char *s) { - struct rr_tlsa *rr = getmem(sizeof(*rr)); - int cert_usage, selector, matching_type; + struct rr_tlsa_smimea *rr = getmem(sizeof(*rr)); + int cert_usage, selector, matching_type; - cert_usage = extract_integer(&s, "certificate usage field"); - if (cert_usage < 0) return NULL; - if (cert_usage > 3) - return bitch("bad certificate usage field"); - rr->cert_usage = cert_usage; - - selector = extract_integer(&s, "selector field"); - if (selector < 0) return NULL; - if (selector > 1) - return bitch("bad selector field"); - rr->selector = selector; - - matching_type = extract_integer(&s, "matching type field"); - if (matching_type < 0) return NULL; - if (matching_type > 2) - return bitch("bad matching type field"); - rr->matching_type = matching_type; - - rr->association_data = extract_hex_binary_data(&s, "certificate association data", EXTRACT_EAT_WHITESPACE); - if (rr->association_data.length < 0) return NULL; - switch (rr->matching_type) { - case 1: - if (rr->association_data.length != SHA256_BYTES) - return bitch("bad SHA-256 hash length"); - break; - case 2: - if (rr->association_data.length != SHA512_BYTES) - return bitch("bad SHA-512 hash length"); - break; - } - - if (*s) { - return bitch("garbage after valid TLSA data"); - } - return store_record(type, name, ttl, rr); + cert_usage = extract_integer(&s, "certificate usage field", NULL); + if (cert_usage < 0) return NULL; + if (cert_usage > 3) + return bitch("bad certificate usage field"); + rr->cert_usage = cert_usage; + + selector = extract_integer(&s, "selector field", NULL); + if (selector < 0) return NULL; + if (selector > 1) + return bitch("bad selector field"); + rr->selector = selector; + + matching_type = extract_integer(&s, "matching type field", NULL); + if (matching_type < 0) return NULL; + if (matching_type > 2) + return bitch("bad matching type field"); + rr->matching_type = matching_type; + + rr->association_data = extract_hex_binary_data(&s, "certificate association data", EXTRACT_EAT_WHITESPACE); + if (rr->association_data.length < 0) return NULL; + switch (rr->matching_type) { + case 1: + if (rr->association_data.length != SHA256_BYTES) + return bitch("bad SHA-256 hash length"); + break; + case 2: + if (rr->association_data.length != SHA512_BYTES) + return bitch("bad SHA-512 hash length"); + break; + } + + if (*s) { + return bitch("garbage after valid %s data", type == T_TLSA ? "TLSA" : "SMIMEA"); + } + return store_record(type, name, ttl, rr); } -static char* tlsa_human(struct rr *rrv) +static char* tlsa_smimea_human(struct rr *rrv) { - RRCAST(tlsa); + RRCAST(tlsa_smimea); char s[1024]; snprintf(s, 1024, "%d %d %d ...", - rr->cert_usage, rr->selector, rr->matching_type); + rr->cert_usage, rr->selector, rr->matching_type); return quickstrdup_temp(s); } -static struct binary_data tlsa_wirerdata(struct rr *rrv) +static struct binary_data tlsa_smimea_wirerdata(struct rr *rrv) { - RRCAST(tlsa); + RRCAST(tlsa_smimea); - return compose_binary_data("111d", 1, - rr->cert_usage, rr->selector, rr->matching_type, - rr->association_data); + return compose_binary_data("111d", 1, + rr->cert_usage, rr->selector, rr->matching_type, + rr->association_data); } static void* tlsa_validate_set(struct rr_set *rr_set) { - struct rr *rr; - struct named_rr *named_rr; - char *s; - int port = 0; - int len; - - if (G.opt.policy_checks[POLICY_TLSA_HOST]) { - rr = rr_set->tail; - named_rr = rr_set->named_rr; - - /* _25._tcp.mail.example.com. */ - s = named_rr->name; - if (*s != '_') { + struct rr *rr; + struct named_rr *named_rr; + char *s; + int port = 0; + int len; + + if (G.opt.policy_checks[POLICY_TLSA_HOST]) { + rr = rr_set->tail; + named_rr = rr_set->named_rr; + + /* _25._tcp.mail.example.com. */ + s = named_rr->name; + if (*s != '_') { not_a_prefixed_domain_name: - return moan(rr->file_name, rr->line, "not a proper prefixed DNS domain name"); - } - s++; - while (isdigit(*s)) { - port = port * 10 + *s - '0'; - s++; - } - if (port <= 0 || port > 65535) goto not_a_prefixed_domain_name; - if (*s++ != '.') goto not_a_prefixed_domain_name; - len = strlen(s); - if (len < 6) goto not_a_prefixed_domain_name; - if (memcmp(s, "_tcp.", 5) != 0 && - memcmp(s, "_udp.", 5) != 0 && - memcmp(s, "_sctp.", 6) != 0) goto not_a_prefixed_domain_name; - } - return NULL; + return moan(rr->file_name, rr->line, "not a proper prefixed DNS domain name"); + } + s++; + while (isdigit(*s)) { + port = port * 10 + *s - '0'; + s++; + } + if (port <= 0 || port > 65535) goto not_a_prefixed_domain_name; + if (*s++ != '.') goto not_a_prefixed_domain_name; + len = strlen(s); + if (len < 6) goto not_a_prefixed_domain_name; + if (memcmp(s, "_tcp.", 5) != 0 && + memcmp(s, "_udp.", 5) != 0 && + memcmp(s, "_sctp.", 6) != 0) goto not_a_prefixed_domain_name; + } + return NULL; } -struct rr_methods tlsa_methods = { tlsa_parse, tlsa_human, tlsa_wirerdata, tlsa_validate_set, NULL }; +static void* smimea_validate_set(struct rr_set *rr_set) +{ + struct rr *rr; + struct named_rr *named_rr; + char *s; + int hash_len = 0; + int len; + + if (G.opt.policy_checks[POLICY_SMIMEA_HOST]) { + rr = rr_set->tail; + named_rr = rr_set->named_rr; + + /* c93f1e400f26708f98cb19d936620da35eec8f72e57f9eec01c1afd6._smimecert.example.com. */ + s = named_rr->name; + while (isxdigit(*s)) { + hash_len++; + s++; + } + if (*s++ != '.' || hash_len != 56) { +not_a_proper_smimea_domainname: + return moan(rr->file_name, rr->line, "not a proper domain name for an SMIMEA record"); + } + len = strlen(s); + if (len < 11) goto not_a_proper_smimea_domainname; + if (memcmp(s, "_smimecert.", 11) != 0) goto not_a_proper_smimea_domainname; + } + return NULL; +} + +struct rr_methods tlsa_methods = { tlsa_smimea_parse, tlsa_smimea_human, tlsa_smimea_wirerdata, tlsa_validate_set, NULL }; +struct rr_methods smimea_methods = { tlsa_smimea_parse, tlsa_smimea_human, tlsa_smimea_wirerdata, smimea_validate_set, NULL }; diff -Naur validns-0.8/txt.c validns/txt.c --- validns-0.8/txt.c 2014-02-11 15:45:53.000000000 -0500 +++ validns/txt.c 2020-10-05 16:59:29.361681424 -0400 @@ -22,62 +22,72 @@ static struct rr *txt_parse(char *name, long ttl, int type, char *s) { - struct rr_txt *rr; - struct binary_data txt[20]; - int i; - - i = 0; - while (*s) { - if (i >= 20) - return bitch("program limit: too many text segments"); - txt[i] = extract_text(&s, "text segment"); - if (txt[i].length < 0) - return NULL; - if (txt[i].length > 255) - return bitch("TXT segment too long"); - i++; - } - if (i == 0) - return bitch("empty text record"); - - rr = getmem(sizeof(*rr) + sizeof(struct binary_data) * (i-1)); - rr->count = i; - for (i = 0; i < rr->count; i++) { - rr->txt[i] = txt[i]; - } + struct rr_txt *rr; + struct binary_data txt; + struct rr_txt_segment *first = NULL; + struct rr_txt_segment *last = NULL; + struct rr_txt_segment *cur = NULL; + int i; + + i = 0; + while (*s) { + freeall_temp(); + txt = extract_text(&s, "text segment"); + if (txt.length < 0) + return NULL; + if (txt.length > 255) + return bitch("TXT segment too long"); + i++; + cur = getmem(sizeof(*cur)); + cur->txt = txt; + cur->next = NULL; + if (!first) + first = cur; + if (last) + last->next = cur; + last = cur; + } + if (i == 0) + return bitch("empty text record"); + + rr = getmem(sizeof(*rr)); + rr->count = i; + rr->txt = first; - return store_record(type, name, ttl, rr); + return store_record(type, name, ttl, rr); } static char* txt_human(struct rr *rrv) { - RRCAST(txt); + RRCAST(txt); char ss[1024]; - int i; - char *s = ss; - int l; - - for (i = 0; i < rr->count; i++) { - /* XXX would be nice to escape " with \ in strings */ - l = snprintf(s, 1024-(s-ss), "\"%s\" ", rr->txt[i].data); - s += l; - } + char *s = ss; + int l; + struct rr_txt_segment *seg = rr->txt; + + while (seg) { + /* XXX would be nice to escape " with \ in strings */ + l = snprintf(s, 1024-(s-ss), "\"%s\" ", seg->txt.data); + s += l; + seg = seg->next; + } return quickstrdup_temp(ss); } static struct binary_data txt_wirerdata(struct rr *rrv) { - RRCAST(txt); - struct binary_data r, t; - int i; - - r = bad_binary_data(); - t.length = 0; - t.data = NULL; - for (i = 0; i < rr->count; i++) { - r = compose_binary_data("db", 1, t, rr->txt[i]); - t = r; - } + RRCAST(txt); + struct binary_data r, t; + struct rr_txt_segment *seg = rr->txt; + + r = bad_binary_data(); + t.length = 0; + t.data = NULL; + while (seg) { + r = compose_binary_data("db", 1, t, seg->txt); + t = r; + seg = seg->next; + } return r; } diff -Naur validns-0.8/usage.mdwn validns/usage.mdwn --- validns-0.8/usage.mdwn 2020-10-05 16:54:14.347790456 -0400 +++ validns/usage.mdwn 2020-10-05 16:59:29.361681424 -0400 @@ -48,6 +48,8 @@ - ns-alias - rp-txt-exists - tlsa-host + - ksk-exists + - smimea-host - all -n *N* @@ -59,14 +61,15 @@ : quiet - do not produce any output -s -: print validation summary/stats - --x -: skip printing 'time taken' in summary/stats +: Print validation summary/stats. + If specified twice, also print record counts by type. -v : be extra verbose +-M +: use SOA MINTTL as the default TTL when no TTL specified + -I *path* : use this path for $INCLUDE files @@ -133,12 +136,12 @@ - TXT domain name mentioned in RP record must have a corresponding TXT record if it is within the zone - domain name of a TLSA record must be a proper prefixed DNS name +- a KSK key must exist in a signed zone +- domain name must have the form which is proper for an SMIMEA record # BUGS - textual segments in *TXT* and *HINFO* must be enclosed in double quotes; -- there cannot be more than 20 textual segments in a *TXT* record; -- *$INCLUDE* directive is not implemented; - a dot within a label is not currently supported; If at least one NSEC3 record uses opt-out flag, diff -Naur validns-0.8/validns.1 validns/validns.1 --- validns-0.8/validns.1 2020-10-05 16:54:14.347790456 -0400 +++ validns/validns.1 2020-10-05 16:59:29.361681424 -0400 @@ -1,4 +1,4 @@ -.TH VALIDNS 1 "April 2011" +.TH "VALIDNS" "1" "April 2011" "" "" .SH NAME .PP validns \- DNS and DSNSEC zone file validator @@ -53,6 +53,10 @@ .IP \[bu] 2 tlsa\-host .IP \[bu] 2 +ksk\-exists +.IP \[bu] 2 +smimea\-host +.IP \[bu] 2 all .RE .TP @@ -69,17 +73,18 @@ .RE .TP .B \-s -print validation summary/stats +Print validation summary/stats. +If specified twice, also print record counts by type. .RS .RE .TP -.B -x -skip printing timing summary/stats +.B \-v +be extra verbose .RS .RE .TP -.B \-v -be extra verbose +.B \-M +use SOA MINTTL as the default TTL when no TTL specified .RS .RE .TP @@ -183,15 +188,15 @@ record if it is within the zone .IP \[bu] 2 domain name of a TLSA record must be a proper prefixed DNS name +.IP \[bu] 2 +a KSK key must exist in a signed zone +.IP \[bu] 2 +domain name must have the form which is proper for an SMIMEA record .SH BUGS .IP \[bu] 2 textual segments in \f[I]TXT\f[] and \f[I]HINFO\f[] must be enclosed in double quotes; .IP \[bu] 2 -there cannot be more than 20 textual segments in a \f[I]TXT\f[] record; -.IP \[bu] 2 -\f[I]$INCLUDE\f[] directive is not implemented; -.IP \[bu] 2 a dot within a label is not currently supported; .PP If at least one NSEC3 record uses opt\-out flag, \f[C]validns\f[] diff -Naur validns-0.8/x25.c validns/x25.c --- validns-0.8/x25.c 2014-02-11 15:46:55.000000000 -0500 +++ validns/x25.c 2020-10-05 16:59:29.361681424 -0400 @@ -23,40 +23,40 @@ static struct rr *x25_parse(char *name, long ttl, int type, char *s) { - struct rr_x25 *rr = getmem(sizeof(*rr)); - int i; + struct rr_x25 *rr = getmem(sizeof(*rr)); + int i; - rr->psdn_address = extract_text(&s, "PSDN-address"); - if (rr->psdn_address.length < 0) - return NULL; - if (rr->psdn_address.length > 255) - return bitch("PSDN-address too long"); - if (rr->psdn_address.length < 4) - return bitch("PSDN-address too short"); - for (i = 0; i < rr->psdn_address.length; i++) { - if (!isdigit(rr->psdn_address.data[i])) - return bitch("PSDN-address contains non-digits"); - } - - if (*s) { - return bitch("garbage after valid X25 data"); - } + rr->psdn_address = extract_text(&s, "PSDN-address"); + if (rr->psdn_address.length < 0) + return NULL; + if (rr->psdn_address.length > 255) + return bitch("PSDN-address too long"); + if (rr->psdn_address.length < 4) + return bitch("PSDN-address too short"); + for (i = 0; i < rr->psdn_address.length; i++) { + if (!isdigit(rr->psdn_address.data[i])) + return bitch("PSDN-address contains non-digits"); + } + + if (*s) { + return bitch("garbage after valid X25 data"); + } - return store_record(type, name, ttl, rr); + return store_record(type, name, ttl, rr); } static char* x25_human(struct rr *rrv) { - RRCAST(x25); + RRCAST(x25); return rr->psdn_address.data; } static struct binary_data x25_wirerdata(struct rr *rrv) { - RRCAST(x25); + RRCAST(x25); - return compose_binary_data("b", 1, rr->psdn_address); + return compose_binary_data("b", 1, rr->psdn_address); } struct rr_methods x25_methods = { x25_parse, x25_human, x25_wirerdata, NULL, NULL };