]> git.ipfire.org Git - thirdparty/unbound.git/commitdiff
zonemd, unit test, succeeds at verifying examples of zonemd draft-12.
authorW.C.A. Wijngaards <wouter@nlnetlabs.nl>
Fri, 9 Oct 2020 10:18:25 +0000 (12:18 +0200)
committerW.C.A. Wijngaards <wouter@nlnetlabs.nl>
Fri, 9 Oct 2020 10:18:25 +0000 (12:18 +0200)
services/authzone.c
services/authzone.h
testcode/unitmain.c
testdata/zonemd.example_a1.zone [new file with mode: 0644]
testdata/zonemd.example_a2.zone [new file with mode: 0644]
testdata/zonemd.example_a3.zone [new file with mode: 0644]
testdata/zonemd.example_a4.zone [new file with mode: 0644]
testdata/zonemd.example_a5.zone [new file with mode: 0644]

index 208c0b82549b46b8395092421f052e4f56965fb6..7ba273b5254ab2f22641d3f579d0bddb8407d7a5 100644 (file)
@@ -6967,16 +6967,14 @@ compare_serial(uint32_t a, uint32_t b)
        }
 }
 
-/** returns true if a zonemd hash algo is supported */
-static int zonemd_hashalgo_supported(int hashalgo)
+int zonemd_hashalgo_supported(int hashalgo)
 {
        if(hashalgo == 1) return 1;
        if(hashalgo == 2) return 1;
        return 0;
 }
 
-/** returns true if a zonemd scheme is supported */
-static int zonemd_scheme_supported(int scheme)
+int zonemd_scheme_supported(int scheme)
 {
        if(scheme == 1) return 1;
        return 0;
index 813fc0e8746eff92950e039ac1b7107736603275..6dd9c30b31864f241236f1e88642ddda32e43df2 100644 (file)
@@ -704,6 +704,12 @@ int auth_zone_generate_zonemd_hash(struct auth_zone* z, int scheme,
        int hashalgo, uint8_t* hash, size_t buflen, size_t* resultlen,
        struct regional* region, struct sldns_buffer* buf, char** reason);
 
+
+/** returns true if a zonemd hash algo is supported */
+int zonemd_hashalgo_supported(int hashalgo);
+/** returns true if a zonemd scheme is supported */
+int zonemd_scheme_supported(int scheme);
+
 /**
  * Check ZONEMD digest for the auth zone.
  * @param z: auth zone to digest.
index df560a466391e107e44633d6bd82db02a9bfa035..8762bc169bc2c84bca231e4ddff1577f4bf3ebf8 100644 (file)
@@ -839,52 +839,109 @@ static void respip_test(void)
        respip_conf_actions_test();
 }
 
+#include <ctype.h>
 #include "services/authzone.h"
 #include "util/data/dname.h"
 #include "util/regional.h"
 /** Add zone from file for testing */
 struct auth_zone* authtest_addzone(struct auth_zones* az, const char* name,
        char* fname);
-/** zonemd unit tests */
-static void zonemd_test(void)
+
+/** zonemd unit test, generate a zonemd digest and check if correct */
+static void zonemd_generate_test(const char* zname, char* zfile,
+       int scheme, int hashalgo, const char* digest)
 {
        uint8_t zonemd_hash[512];
+       size_t hashlen = 0;
+       char output[1024+1];
+       size_t i;
        struct auth_zones* az;
        struct auth_zone* z;
-       int scheme = 1, hashalgo = 2;
-       size_t hashlen = 0;
        int result;
        char* reason = NULL;
        struct regional* region = NULL;
        struct sldns_buffer* buf = NULL;
-       unit_show_feature("zonemd");
+       char* digestdup;
+
+       if(!zonemd_hashalgo_supported(hashalgo))
+               return; /* cannot test unsupported algo */
+
+       /* setup environment */
+       az = auth_zones_create();
+       unit_assert(az);
        region = regional_create();
        unit_assert(region);
        buf = sldns_buffer_new(65535);
        unit_assert(buf);
-       az = auth_zones_create();
-       unit_assert(az);
-       z = authtest_addzone(az, "example.org", "testdata/zonemd.example1.zone");
+
+       /* read file */
+       z = authtest_addzone(az, zname, zfile);
        unit_assert(z);
 
-       /* zonemd test on zone */
+       /* create zonemd digest */
        result = auth_zone_generate_zonemd_hash(z, scheme, hashalgo,
                zonemd_hash, sizeof(zonemd_hash), &hashlen, region, buf,
                &reason);
        if(reason) printf("zonemd failure reason: %s\n", reason);
        unit_assert(result);
-       if(1) {
+
+       /* check digest */
+       unit_assert(hashlen*2+1 <= sizeof(output));
+       for(i=0; i<hashlen; i++) {
+               const char* hexl = "0123456789ABCDEF";
+               output[i*2] = hexl[(zonemd_hash[i]&0xf0)>>4];
+               output[i*2+1] = hexl[zonemd_hash[i]&0xf];
+       }
+       output[hashlen*2] = 0;
+       digestdup = strdup(digest);
+       unit_assert(digestdup);
+       for(i=0; i<strlen(digestdup); i++) {
+               digestdup[i] = toupper(digestdup[i]);
+       }
+       if(0) {
                char zname[255+1];
                dname_str(z->name, zname);
-               printf("zonemd generated for %s in %s with scheme=%d, hashalgo=%d\n", zname, z->zonefile, scheme, hashalgo);
-               log_hex("digest", zonemd_hash, hashlen);
+               printf("zonemd generated for %s in %s with "
+                       "scheme=%d hashalgo=%d\n", zname, z->zonefile,
+                       scheme, hashalgo);
+               printf("digest %s\n", output);
+               printf("wanted %s\n", digestdup);
        }
+       unit_assert(strcmp(output, digestdup) == 0);
 
+       /* delete environment */
+       free(digestdup);
        auth_zones_delete(az);
        regional_destroy(region);
        sldns_buffer_free(buf);
 }
 
+/** loop over files and test generated zonemd digest */
+static void zonemd_generate_tests(void)
+{
+       zonemd_generate_test("example.org", "testdata/zonemd.example1.zone",
+               1, 2, "20564D10F50A0CEBEC856C64032B7DFB53D3C449A421A5BC7A21F7627B4ACEA4DF29F2C6FE82ED9C23ADF6F4D420D5DD63EF6E6349D60FDAB910B65DF8D481B7");
+       zonemd_generate_test("example", "testdata/zonemd.example_a1.zone",
+               1, 1, "c68090d90a7aed716bc459f9340e3d7c1370d4d24b7e2fc3a1ddc0b9a87153b9a9713b3c9ae5cc27777f98b8e730044c");
+       zonemd_generate_test("example", "testdata/zonemd.example_a2.zone",
+               1, 1, "31cefb03814f5062ad12fa951ba0ef5f8da6ae354a415767246f7dc932ceb1e742a2108f529db6a33a11c01493de358d");
+       zonemd_generate_test("example", "testdata/zonemd.example_a3.zone",
+               1, 1, "62e6cf51b02e54b9b5f967d547ce43136792901f9f88e637493daaf401c92c279dd10f0edb1c56f8080211f8480ee306");
+       zonemd_generate_test("example", "testdata/zonemd.example_a3.zone",
+               1, 2, "08cfa1115c7b948c4163a901270395ea226a930cd2cbcf2fa9a5e6eb85f37c8a4e114d884e66f176eab121cb02db7d652e0cc4827e7a3204f166b47e5613fd27");
+       zonemd_generate_test("uri.arpa", "testdata/zonemd.example_a4.zone",
+               1, 1, "1291b78ddf7669b1a39d014d87626b709b55774c5d7d58fadc556439889a10eaf6f11d615900a4f996bd46279514e473");
+       zonemd_generate_test("root-servers.net", "testdata/zonemd.example_a5.zone",
+               1, 1, "f1ca0ccd91bd5573d9f431c00ee0101b2545c97602be0a978a3b11dbfc1c776d5b3e86ae3d973d6b5349ba7f04340f79");
+}
+
+/** zonemd unit tests */
+static void zonemd_test(void)
+{
+       unit_show_feature("zonemd");
+       zonemd_generate_tests();
+}
+
 void unit_show_func(const char* file, const char* func)
 {
        printf("test %s:%s\n", file, func);
diff --git a/testdata/zonemd.example_a1.zone b/testdata/zonemd.example_a1.zone
new file mode 100644 (file)
index 0000000..331b45a
--- /dev/null
@@ -0,0 +1,6 @@
+example.      86400   IN  SOA     ns1 admin 2018031900 ( 1800 900 604800 86400 )
+              86400   IN  NS      ns1
+              86400   IN  NS      ns2
+              86400   IN  ZONEMD  2018031900 1 1 ( c68090d90a7aed71 6bc459f9340e3d7c 1370d4d24b7e2fc3 a1ddc0b9a87153b9 a9713b3c9ae5cc27 777f98b8e730044c )
+ns1           3600    IN  A       203.0.113.63
+ns2           3600    IN  AAAA    2001:db8::63
diff --git a/testdata/zonemd.example_a2.zone b/testdata/zonemd.example_a2.zone
new file mode 100644 (file)
index 0000000..56d06ae
--- /dev/null
@@ -0,0 +1,25 @@
+example.      86400   IN  SOA     ns1 admin 2018031900 (
+                            1800 900 604800 86400 )
+             86400   IN  NS      ns1
+             86400   IN  NS      ns2
+             86400   IN  ZONEMD  2018031900 1 1 (
+                                 31cefb03814f5062
+                                 ad12fa951ba0ef5f
+                                 8da6ae354a415767
+                                 246f7dc932ceb1e7
+                                 42a2108f529db6a3
+                                 3a11c01493de358d )
+ns1           3600    IN  A       203.0.113.63
+ns2           3600    IN  AAAA    2001:db8::63
+occluded.sub  7200    IN  TXT     "I'm occluded but must be digested"
+sub           7200    IN  NS      ns1
+duplicate     300     IN  TXT     "I must be digested just once"
+duplicate     300     IN  TXT     "I must be digested just once"
+foo.test.     555     IN  TXT     "out-of-zone data must be excluded"
+non-apex      900     IN  ZONEMD  2018031900 1 1 (
+                                 616c6c6f77656420
+                                 6275742069676e6f
+                                 7265642e20616c6c
+                                 6f77656420627574
+                                 2069676e6f726564
+                                 2e20616c6c6f7765 )
diff --git a/testdata/zonemd.example_a3.zone b/testdata/zonemd.example_a3.zone
new file mode 100644 (file)
index 0000000..45c47ad
--- /dev/null
@@ -0,0 +1,30 @@
+example.      86400   IN  SOA     ns1 admin 2018031900 (
+                                  1800 900 604800 86400 )
+example.      86400   IN  NS      ns1.example.
+example.      86400   IN  NS      ns2.example.
+example.      86400   IN  ZONEMD  2018031900 1 1 (
+                                  62e6cf51b02e54b9
+                                  b5f967d547ce4313
+                                  6792901f9f88e637
+                                  493daaf401c92c27
+                                  9dd10f0edb1c56f8
+                                  080211f8480ee306 )
+example.      86400   IN  ZONEMD  2018031900 1 2 (
+                                  08cfa1115c7b948c
+                                  4163a901270395ea
+                                  226a930cd2cbcf2f
+                                  a9a5e6eb85f37c8a
+                                  4e114d884e66f176
+                                  eab121cb02db7d65
+                                  2e0cc4827e7a3204
+                                  f166b47e5613fd27 )
+example.      86400   IN  ZONEMD  2018031900 1 240 (
+                                  e2d523f654b9422a
+                                  96c5a8f44607bbee )
+example.      86400   IN  ZONEMD  2018031900 241 1 (
+                                  e1846540e33a9e41
+                                  89792d18d5d131f6
+                                  05fc283e )
+ns1.example.  3600    IN  A       203.0.113.63
+ns2.example.  86400   IN  TXT     "This example has multiple digests"
+ns2.example.  3600    IN  AAAA    2001:db8::63
diff --git a/testdata/zonemd.example_a4.zone b/testdata/zonemd.example_a4.zone
new file mode 100644 (file)
index 0000000..74b913c
--- /dev/null
@@ -0,0 +1,127 @@
+uri.arpa.         3600    IN      SOA     sns.dns.icann.org. (
+    noc.dns.icann.org. 2018100702 10800 3600 1209600 3600 )
+uri.arpa.         3600    IN      RRSIG   NSEC 8 2 3600 (
+    20181028142623 20181007205525 47155 uri.arpa.
+    eEC4w/oXLR1Epwgv4MBiDtSBsXhqrJVvJWUpbX8XpetAvD35bxwNCUTi
+    /pAJVUXefegWeiriD2rkTgCBCMmn7YQIm3gdR+HjY/+o3BXNQnz97f+e
+    HAE9EDDzoNVfL1PyV/2fde9tDeUuAGVVwmD399NGq9jWYMRpyri2kysr q/g= )
+uri.arpa.         86400   IN      RRSIG   NS 8 2 86400 (
+    20181028172020 20181007175821 47155 uri.arpa.
+    ATyV2A2A8ZoggC+68u4GuP5MOUuR+2rr3eWOkEU55zAHld/7FiBxl4ln
+    4byJYy7NudUwlMOEXajqFZE7DVl8PpcvrP3HeeGaVzKqaWj+aus0jbKF
+    Bsvs2b1qDZemBfkz/IfAhUTJKnto0vSUicJKfItu0GjyYNJCz2CqEuGD Wxc= )
+uri.arpa.         600     IN      RRSIG   MX 8 2 600 (
+    20181028170556 20181007175821 47155 uri.arpa.
+    e7/r3KXDohX1lyVavetFFObp8fB8aXT76HnN9KCQDxSnSghNM83UQV0t
+    lTtD8JVeN1mCvcNFZpagwIgB7XhTtm6Beur/m5ES+4uSnVeS6Q66HBZK
+    A3mR95IpevuVIZvvJ+GcCAQpBo6KRODYvJ/c/ZG6sfYWkZ7qg/Em5/+3 4UI= )
+uri.arpa.         3600    IN      RRSIG   DNSKEY 8 2 3600 (
+    20181028152832 20181007175821 15796 uri.arpa.
+    nzpbnh0OqsgBBP8St28pLvPEQ3wZAUdEBuUwil+rtjjWlYYiqjPxZ286
+    XF4Rq1usfV5x71jZz5IqswOaQgia91ylodFpLuXD6FTGs2nXGhNKkg1V
+    chHgtwj70mXU72GefVgo8TxrFYzxuEFP5ZTP92t97FVWVVyyFd86sbbR
+    6DZj3uA2wEvqBVLECgJLrMQ9Yy7MueJl3UA4h4E6zO2JY9Yp0W9woq0B
+    dqkkwYTwzogyYffPmGAJG91RJ2h6cHtFjEZe2MnaY2glqniZ0WT9vXXd
+    uFPm0KD9U77Ac+ZtctAF9tsZwSdAoL365E2L1usZbA+K0BnPPqGFJRJk
+    5R0A1w== )
+uri.arpa.         3600    IN      RRSIG   DNSKEY 8 2 3600 (
+    20181028152832 20181007175821 55480 uri.arpa.
+    lWtQV/5szQjkXmbcD47/+rOW8kJPksRFHlzxxmzt906+DBYyfrH6uq5X
+    nHvrUlQO6M12uhqDeL+bDFVgqSpNy+42/OaZvaK3J8EzPZVBHPJykKMV
+    63T83aAiJrAyHzOaEdmzLCpalqcEE2ImzlLHSafManRfJL8Yuv+JDZFj
+    2WDWfEcUuwkmIZWX11zxp+DxwzyUlRl7x4+ok5iKZWIg5UnBAf6B8T75
+    WnXzlhCw3F2pXI0a5LYg71L3Tp/xhjN6Yy9jGlIRf5BjB59X2zra3a2R
+    PkI09SSnuEwHyF1mDaV5BmQrLGRnCjvwXA7ho2m+vv4SP5dUdXf+GTeA
+    1HeBfw== )
+uri.arpa.         3600    IN      RRSIG   SOA 8 2 3600 (
+    20181029114753 20181008222815 47155 uri.arpa.
+    qn8yBNoHDjGdT79U2Wu9IIahoS0YPOgYP8lG+qwPcrZ1BwGiHywuoUa2
+    Mx6BWZlg+HDyaxj2iOmox+IIqoUHhXUbO7IUkJFlgrOKCgAR2twDHrXu
+    9BUQHy9SoV16wYm3kBTEPyxW5FFm8vcdnKAF7sxSY8BbaYNpRIEjDx4A JUc= )
+uri.arpa.         3600    IN      NSEC    ftp.uri.arpa. NS SOA (
+    MX RRSIG NSEC DNSKEY )
+uri.arpa.         86400   IN      NS      a.iana-servers.net.
+uri.arpa.         86400   IN      NS      b.iana-servers.net.
+uri.arpa.         86400   IN      NS      c.iana-servers.net.
+uri.arpa.         86400   IN      NS      ns2.lacnic.net.
+uri.arpa.         86400   IN      NS      sec3.apnic.net.
+uri.arpa.         600     IN      MX      10 pechora.icann.org.
+uri.arpa.         3600    IN      DNSKEY  256 3 8 (
+    AwEAAcBi7tSart2J599zbYWspMNGN70IBWb4ziqyQYH9MTB/VCz6WyUK
+    uXunwiJJbbQ3bcLqTLWEw134B6cTMHrZpjTAb5WAwg4XcWUu8mdcPTiL
+    Bl6qVRlRD0WiFCTzuYUfkwsh1Rbr7rvrxSQhF5rh71zSpwV5jjjp65Wx
+    SdJjlH0B )
+uri.arpa.         3600    IN      DNSKEY  257 3 8 (
+    AwEAAbNVv6ulgRdO31MtAehz7j3ALRjwZglWesnzvllQl/+hBRZr9QoY
+    cO2I+DkO4Q1NKxox4DUIxj8SxPO3GwDuOFR9q2/CFi2O0mZjafbdYtWc
+    3zSdBbi3q0cwCIx7GuG9eqlL+pg7mdk9dgdNZfHwB0LnqTD8ebLPsrO/
+    Id7kBaiqYOfMlZnh2fp+2h6OOJZHtY0DK1UlssyB5PKsE0tVzo5s6zo9
+    iXKe5u+8WTMaGDY49vG80JPAKE7ezMiH/NZcUMiE0PRZ8D3foq2dYuS5
+    ym+vA83Z7v8A+Rwh4UGnjxKB8zmr803V0ASAmHz/gwH5Vb0nH+LObwFt
+    l3wpbp+Wpm8= )
+uri.arpa.         3600    IN      DNSKEY  257 3 8 (
+    AwEAAbwnFTakCvaUKsXji4mgmxZUJi1IygbnGahbkmFEa0L16J+TchKR
+    wcgzVfsxUGa2MmeA4hgkAooC3uy+tTmoMsgy8uq/JAj24DjiHzd46LfD
+    FK/qMidVqFpYSHeq2Vv5ojkuIsx4oe4KsafGWYNOczKZgH5loGjN2aJG
+    mrIm++XCphOskgCsQYl65MIzuXffzJyxlAuts+ecAIiVeqRaqQfr8LRU
+    7wIsLxinXirprtQrbor+EtvlHp9qXE6ARTZDzf4jvsNpKvLFZtmxzFf3
+    e/UJz5eHjpwDSiZL7xE8aE1o1nGfPtJx9ZnB3bapltaJ5wY+5XOCKgY0
+    xmJVvNQlwdE= )
+ftp.uri.arpa.     3600    IN      RRSIG   NSEC 8 3 3600 (
+    20181028080856 20181007175821 47155 uri.arpa.
+    HClGAqPxzkYkAT7Q/QNtQeB6YrkP6EPOef+9Qo5/2zngwAewXEAQiyF9
+    jD1USJiroM11QqBS3v3aIdW/LXORs4Ez3hLcKNO1cKHsOuWAqzmE+BPP
+    Arfh8N95jqh/q6vpaB9UtMkQ53tM2fYU1GszOLN0knxbHgDHAh2axMGH lqM= )
+ftp.uri.arpa.     604800  IN      RRSIG   NAPTR 8 3 604800 (
+    20181028103644 20181007205525 47155 uri.arpa.
+    WoLi+vZzkxaoLr2IGZnwkRvcDf6KxiWQd1WZP/U+AWnV+7MiqsWPZaf0
+    9toRErerGoFOiOASNxZjBGJrRgjmavOM9U+LZSconP9zrNFd4dIu6kp5
+    YxlQJ0uHOvx1ZHFCj6lAt1ACUIw04ZhMydTmi27c8MzEOMepvn7iH7r7 k7k= )
+ftp.uri.arpa.     3600    IN      NSEC    http.uri.arpa. NAPTR (
+    RRSIG NSEC )
+ftp.uri.arpa.     604800  IN      NAPTR   0 0 "" "" (
+    "!^ftp://([^:/?#]*).*$!\\1!i" . )
+http.uri.arpa.    3600    IN      RRSIG   NSEC 8 3 3600 (
+    20181029010647 20181007175821 47155 uri.arpa.
+    U03NntQ73LHWpfLmUK8nMsqkwVsOGW2KdsyuHYAjqQSZvKbtmbv7HBmE
+    H1+Ii3Z+wtfdMZBy5aC/6sHdx69BfZJs16xumycMlAy6325DKTQbIMN+
+    ift9GrKBC7cgCd2msF/uzSrYxxg4MJQzBPvlkwXnY3b7eJSlIXisBIn7 3b8= )
+http.uri.arpa.    604800  IN      RRSIG   NAPTR 8 3 604800 (
+    20181029011815 20181007205525 47155 uri.arpa.
+    T7mRrdag+WSmG+n22mtBSQ/0Y3v+rdDnfQV90LN5Fq32N5K2iYFajF7F
+    Tp56oOznytfcL4fHrqOE0wRc9NWOCCUec9C7Wa1gJQcllEvgoAM+L6f0
+    RsEjWq6+9jvlLKMXQv0xQuMX17338uoD/xiAFQSnDbiQKxwWMqVAimv5 7Zs= )
+http.uri.arpa.    3600    IN      NSEC    mailto.uri.arpa. NAPTR (
+    RRSIG NSEC )
+http.uri.arpa.    604800  IN      NAPTR   0 0 "" "" (
+    "!^http://([^:/?#]*).*$!\\1!i" . )
+mailto.uri.arpa.  3600    IN      RRSIG   NSEC 8 3 3600 (
+    20181028110727 20181007175821 47155 uri.arpa.
+    GvxzVL85rEukwGqtuLxek9ipwjBMfTOFIEyJ7afC8HxVMs6mfFa/nEM/
+    IdFvvFg+lcYoJSQYuSAVYFl3xPbgrxVSLK125QutCFMdC/YjuZEnq5cl
+    fQciMRD7R3+znZfm8d8u/snLV9w4D+lTBZrJJUBe1Efc8vum5vvV7819 ZoY= )
+mailto.uri.arpa.  604800  IN      RRSIG   NAPTR 8 3 604800 (
+    20181028141825 20181007205525 47155 uri.arpa.
+    MaADUgc3fc5v++M0YmqjGk3jBdfIA5RuP62hUSlPsFZO4k37erjIGCfF
+    j+g84yc+QgbSde0PQHszl9fE/+SU5ZXiS9YdcbzSZxp2erFpZOTchrpg
+    916T4vx6i59scodjb0l6bDyZ+mtIPrc1w6b4hUyOUTsDQoAJYxdfEuMg Vy4= )
+mailto.uri.arpa.  3600    IN      NSEC    urn.uri.arpa. NAPTR (
+    RRSIG NSEC )
+mailto.uri.arpa.  604800  IN      NAPTR   0 0 "" "" (
+    "!^mailto:(.*)@(.*)$!\\2!i" . )
+urn.uri.arpa.     3600    IN      RRSIG   NSEC 8 3 3600 (
+    20181028123243 20181007175821 47155 uri.arpa.
+    Hgsw4Deops1O8uWyELGe6hpR/OEqCnTHvahlwiQkHhO5CSEQrbhmFAWe
+    UOkmGAdTEYrSz+skLRQuITRMwzyFf4oUkZihGyhZyzHbcxWfuDc/Pd/9
+    DSl56gdeBwy1evn5wBTms8yWQVkNtphbJH395gRqZuaJs3LD/qTyJ5Dp LvA= )
+urn.uri.arpa.     604800  IN      RRSIG   NAPTR 8 3 604800 (
+    20181029071816 20181007205525 47155 uri.arpa.
+    ALIZD0vBqAQQt40GQ0Efaj8OCyE9xSRJRdyvyn/H/wZVXFRFKrQYrLAS
+    D/K7q6CMTOxTRCu2J8yes63WJiaJEdnh+dscXzZkmOg4n5PsgZbkvUSW
+    BiGtxvz5jNncM0xVbkjbtByrvJQAO1cU1mnlDKe1FmVB1uLpVdA9Ib4J hMU= )
+urn.uri.arpa.     3600    IN      NSEC    uri.arpa. NAPTR RRSIG (
+    NSEC )
+urn.uri.arpa.     604800  IN      NAPTR   0 0 "" "" (
+    "/urn:([^:]+)/\\1/i" . )
+uri.arpa.         3600    IN      SOA     sns.dns.icann.org. (
+    noc.dns.icann.org. 2018100702 10800 3600 1209600 3600 )
diff --git a/testdata/zonemd.example_a5.zone b/testdata/zonemd.example_a5.zone
new file mode 100644 (file)
index 0000000..246f5e2
--- /dev/null
@@ -0,0 +1,48 @@
+root-servers.net.     3600000 IN  SOA     a.root-servers.net. (
+    nstld.verisign-grs.com. 2018091100 14400 7200 1209600 3600000 )
+root-servers.net.     3600000 IN  NS      a.root-servers.net.
+root-servers.net.     3600000 IN  NS      b.root-servers.net.
+root-servers.net.     3600000 IN  NS      c.root-servers.net.
+root-servers.net.     3600000 IN  NS      d.root-servers.net.
+root-servers.net.     3600000 IN  NS      e.root-servers.net.
+root-servers.net.     3600000 IN  NS      f.root-servers.net.
+root-servers.net.     3600000 IN  NS      g.root-servers.net.
+root-servers.net.     3600000 IN  NS      h.root-servers.net.
+root-servers.net.     3600000 IN  NS      i.root-servers.net.
+root-servers.net.     3600000 IN  NS      j.root-servers.net.
+root-servers.net.     3600000 IN  NS      k.root-servers.net.
+root-servers.net.     3600000 IN  NS      l.root-servers.net.
+root-servers.net.     3600000 IN  NS      m.root-servers.net.
+a.root-servers.net.   3600000 IN  AAAA    2001:503:ba3e::2:30
+a.root-servers.net.   3600000 IN  A       198.41.0.4
+b.root-servers.net.   3600000 IN  MX      20 mail.isi.edu.
+b.root-servers.net.   3600000 IN  AAAA    2001:500:200::b
+b.root-servers.net.   3600000 IN  A       199.9.14.201
+c.root-servers.net.   3600000 IN  AAAA    2001:500:2::c
+c.root-servers.net.   3600000 IN  A       192.33.4.12
+d.root-servers.net.   3600000 IN  AAAA    2001:500:2d::d
+d.root-servers.net.   3600000 IN  A       199.7.91.13
+e.root-servers.net.   3600000 IN  AAAA    2001:500:a8::e
+e.root-servers.net.   3600000 IN  A       192.203.230.10
+f.root-servers.net.   3600000 IN  AAAA    2001:500:2f::f
+f.root-servers.net.   3600000 IN  A       192.5.5.241
+g.root-servers.net.   3600000 IN  AAAA    2001:500:12::d0d
+g.root-servers.net.   3600000 IN  A       192.112.36.4
+h.root-servers.net.   3600000 IN  AAAA    2001:500:1::53
+h.root-servers.net.   3600000 IN  A       198.97.190.53
+i.root-servers.net.   3600000 IN  MX      10 mx.i.root-servers.org.
+i.root-servers.net.   3600000 IN  AAAA    2001:7fe::53
+i.root-servers.net.   3600000 IN  A       192.36.148.17
+j.root-servers.net.   3600000 IN  AAAA    2001:503:c27::2:30
+j.root-servers.net.   3600000 IN  A       192.58.128.30
+k.root-servers.net.   3600000 IN  AAAA    2001:7fd::1
+k.root-servers.net.   3600000 IN  A       193.0.14.129
+l.root-servers.net.   3600000 IN  AAAA    2001:500:9f::42
+l.root-servers.net.   3600000 IN  A       199.7.83.42
+m.root-servers.net.   3600000 IN  AAAA    2001:dc3::35
+m.root-servers.net.   3600000 IN  A       202.12.27.33
+root-servers.net.     3600000 IN  SOA     a.root-servers.net. (
+    nstld.verisign-grs.com. 2018091100 14400 7200 1209600 3600000 )
+root-servers.net.     3600000 IN  ZONEMD  2018091100 1 1 (
+    f1ca0ccd91bd5573d9f431c00ee0101b2545c97602be0a97
+    8a3b11dbfc1c776d5b3e86ae3d973d6b5349ba7f04340f79 )