]> git.ipfire.org Git - thirdparty/bind9.git/commitdiff
1589. [func] DNSSEC lookaside validation.
authorMark Andrews <marka@isc.org>
Wed, 10 Mar 2004 02:19:58 +0000 (02:19 +0000)
committerMark Andrews <marka@isc.org>
Wed, 10 Mar 2004 02:19:58 +0000 (02:19 +0000)
enable-dnssec -> dnssec-enable

33 files changed:
CHANGES
bin/dnssec/dnssec-keygen.c
bin/dnssec/dnssec-signzone.c
bin/dnssec/dnssec-signzone.docbook
bin/named/config.c
bin/named/query.c
bin/named/server.c
bin/tests/system/dnssec/ns1/named.conf
bin/tests/system/dnssec/ns1/root.db.in
bin/tests/system/dnssec/ns1/sign.sh
bin/tests/system/dnssec/ns2/named.conf
bin/tests/system/dnssec/ns2/sign.sh
bin/tests/system/dnssec/ns3/named.conf
bin/tests/system/dnssec/ns4/named.conf
bin/tests/system/dnssec/ns5/named.conf
bin/tests/system/dnssec/ns6/named.conf
bin/tests/system/dnssec/tests.sh
bin/tests/system/ifconfig.sh
bin/tests/system/lwresd/ns1/named.conf
bin/tests/system/start.pl
configure.in
doc/arm/Bv9ARM-book.xml
lib/bind9/check.c
lib/dns/adb.c
lib/dns/include/dns/validator.h
lib/dns/include/dns/view.h
lib/dns/rdata/generic/dlv_65323.c [new file with mode: 0644]
lib/dns/rdata/generic/dlv_65323.h [new file with mode: 0644]
lib/dns/sec/dst/dst_api.c
lib/dns/sec/dst/include/dst/dst.h
lib/dns/validator.c
lib/dns/view.c
lib/isccfg/namedconf.c

diff --git a/CHANGES b/CHANGES
index b6ac5eeb3eb03d2ebc17f8225090a2d2dbe7ec58..935a857f6b1e116563af2d672a097178d7cf05e9 100644 (file)
--- a/CHANGES
+++ b/CHANGES
@@ -1,3 +1,5 @@
+1589.  [func]          DNSSEC lookaside validation.
+
 1588.  [bug]           win32: TCP sockets could become blocked. [RT #10115]
 
 1587.  [bug]           dns_message_settsigkey() failed to clear existing key.
@@ -17,7 +19,7 @@
                        than 32 elements. [RT #10381]
 
 1581.  [func]          Disable DNSSEC support by default.  To enable
-                       DNSSEC specify "enable-dnssec yes;" in named.conf.
+                       DNSSEC specify "dnssec-enable yes;" in named.conf.
 
 1580.  [bug]           Zone destuction on final detach takes a long time.
                        [RT #3746]
index 2493cdd253c694b0c87b6c7ee8cce22d2152d4dc..bc097a9dd2c13b9efbe712f50d8dc0e738900487 100644 (file)
@@ -16,7 +16,7 @@
  * IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
  */
 
-/* $Id: dnssec-keygen.c,v 1.65 2004/03/05 05:48:18 marka Exp $ */
+/* $Id: dnssec-keygen.c,v 1.66 2004/03/10 02:19:51 marka Exp $ */
 
 #include <config.h>
 
@@ -85,6 +85,7 @@ usage(void) {
                "records with (default: 0)\n");
        fprintf(stderr, "    -r <randomdev>: a file containing random data\n");
        fprintf(stderr, "    -v <verbose level>\n");
+       fprintf(stderr, "    -k : generate a TYPE=KEY key\n");
        fprintf(stderr, "Output:\n");
        fprintf(stderr, "     K<name>+<alg>+<id>.key, "
                "K<name>+<alg>+<id>.private\n");
@@ -113,6 +114,7 @@ main(int argc, char **argv) {
        isc_log_t       *log = NULL;
        isc_entropy_t   *ectx = NULL;
        dns_rdataclass_t rdclass;
+       int             options = DST_TYPE_PRIVATE | DST_TYPE_PUBLIC;
 
        if (argc == 1)
                usage();
@@ -122,7 +124,7 @@ main(int argc, char **argv) {
        dns_result_register();
 
        while ((ch = isc_commandline_parse(argc, argv,
-                                          "a:b:c:ef:g:n:t:p:s:r:v:h")) != -1)
+                                          "a:b:c:ef:g:kn:t:p:s:r:v:h")) != -1)
        {
            switch (ch) {
                case 'a':
@@ -152,6 +154,9 @@ main(int argc, char **argv) {
                        if (*endp != '\0' || generator <= 0)
                                fatal("-g requires a positive number");
                        break;
+               case 'k':
+                       options |= DST_TYPE_KEY;
+                       break;
                case 'n':
                        nametype = isc_commandline_argument;
                        break;
@@ -374,7 +379,7 @@ main(int argc, char **argv) {
                fatal("cannot generate a null key when a key with id 0 "
                      "already exists");
 
-       ret = dst_key_tofile(key, DST_TYPE_PUBLIC | DST_TYPE_PRIVATE, NULL);
+       ret = dst_key_tofile(key, options, NULL);
        if (ret != ISC_R_SUCCESS) {
                char keystr[KEY_FORMATSIZE];
                key_format(key, keystr, sizeof(keystr));
index 7a3c81d1ff474b94eb8cb51e1ff23cc26c87c100..1c735a2024470da7c3d470b29fe940baf89918dc 100644 (file)
@@ -16,7 +16,7 @@
  * IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
  */
 
-/* $Id: dnssec-signzone.c,v 1.176 2004/03/05 05:48:19 marka Exp $ */
+/* $Id: dnssec-signzone.c,v 1.177 2004/03/10 02:19:51 marka Exp $ */
 
 #include <config.h>
 
@@ -120,6 +120,9 @@ static isc_boolean_t nokeys = ISC_FALSE;
 static isc_boolean_t removefile = ISC_FALSE;
 static isc_boolean_t generateds = ISC_FALSE;
 static isc_boolean_t ignoreksk = ISC_FALSE;
+static dns_name_t *dlv = NULL;
+static dns_fixedname_t dlv_fixed;
+static dns_master_style_t *dsstyle = NULL;
 
 #define INCSTAT(counter)               \
        if (printstats) {               \
@@ -868,11 +871,18 @@ signname(dns_dbnode_t *node, dns_name_t *name) {
                        if (rdataset.type != dns_rdatatype_nsec &&
                            rdataset.type != dns_rdatatype_ds)
                                goto skip;
+#if 0
+               /*
+                * The current draft allows DS not at a zone cut.
+                * This is a bad idea.  Update once the RFC is published.
+                * XXXMPA.
+                */
                } else if (rdataset.type == dns_rdatatype_ds) {
                        char namebuf[DNS_NAME_FORMATSIZE];
                        dns_name_format(name, namebuf, sizeof(namebuf));
                        fatal("'%s': found DS RRset without NS RRset\n",
                              namebuf);
+#endif
                }
 
                signset(&diff, node, name, &rdataset);
@@ -1407,40 +1417,45 @@ warnifallksk(dns_db_t *db) {
 }
 
 static void
-writekeyset(void) {
+writeset(const char *prefix, dns_rdatatype_t type) {
+       char *filename;
        char namestr[DNS_NAME_FORMATSIZE];
-       isc_buffer_t namebuf;
-       unsigned int filenamelen;
-       char *keyfile;
-       signer_key_t *key;
-       unsigned char keybuf[DST_KEY_MAXSIZE];
-       dns_diff_t diff;
-       dns_difftuple_t *tuple = NULL;
        dns_db_t *db = NULL;
        dns_dbversion_t *version = NULL;
-       dns_rdata_t rdata;
+       dns_diff_t diff;
+       dns_difftuple_t *tuple = NULL;
+       dns_fixedname_t fixed;
+       dns_name_t *name;
+       dns_rdata_t rdata, ds;
+       isc_boolean_t have_ksk = ISC_FALSE;
+       isc_boolean_t have_non_ksk = ISC_FALSE;
        isc_buffer_t b;
+       isc_buffer_t namebuf;
        isc_region_t r;
        isc_result_t result;
-       isc_boolean_t have_non_ksk = ISC_FALSE;
-       isc_boolean_t have_ksk = ISC_FALSE;
+       signer_key_t *key;
+       unsigned char dsbuf[DNS_DS_BUFFERSIZE];
+       unsigned char keybuf[DST_KEY_MAXSIZE];
+       unsigned int filenamelen;
+       const dns_master_style_t *style = 
+               (type == dns_rdatatype_dnskey) ? masterstyle : dsstyle;
 
        isc_buffer_init(&namebuf, namestr, sizeof(namestr));
        result = dns_name_tofilenametext(gorigin, ISC_FALSE, &namebuf);
        check_result(result, "dns_name_tofilenametext");
        isc_buffer_putuint8(&namebuf, 0);
-       filenamelen = strlen("keyset-") + strlen(namestr);
+       filenamelen = strlen(prefix) + strlen(namestr);
        if (directory != NULL)
                filenamelen += strlen(directory) + 1;
-       keyfile = isc_mem_get(mctx, filenamelen + 1);
-       if (keyfile == NULL)
+       filename = isc_mem_get(mctx, filenamelen + 1);
+       if (filename == NULL)
                fatal("out of memory");
        if (directory != NULL)
-               sprintf(keyfile, "%s/", directory);
+               sprintf(filename, "%s/", directory);
        else
-               keyfile[0] = 0;
-       strcat(keyfile, "keyset-");
-       strcat(keyfile, namestr);
+               filename[0] = 0;
+       strcat(filename, prefix);
+       strcat(filename, namestr);
 
        dns_diff_init(mctx, &diff);
 
@@ -1460,6 +1475,20 @@ writekeyset(void) {
                        break;
                }
 
+       if (type == dns_rdatatype_dlv) {
+               dns_name_t tname;
+               unsigned int labels;
+
+               dns_name_init(&tname, NULL);
+               dns_fixedname_init(&fixed);
+               name = dns_fixedname_name(&fixed);
+               labels = dns_name_countlabels(gorigin);
+               dns_name_getlabelsequence(gorigin, 0, labels - 1, &tname);
+               result = dns_name_concatenate(&tname, dlv, name, NULL);
+               check_result(result, "dns_name_concatenate");
+       } else
+               name = gorigin;
+
        for (key = ISC_LIST_HEAD(keylist);
             key != NULL;
             key = ISC_LIST_NEXT(key, link))
@@ -1467,13 +1496,25 @@ writekeyset(void) {
                if (have_ksk && have_non_ksk && !key->isksk)
                        continue;
                dns_rdata_init(&rdata);
+               dns_rdata_init(&ds);
                isc_buffer_init(&b, keybuf, sizeof(keybuf));
                result = dst_key_todns(key->key, &b);
                check_result(result, "dst_key_todns");
                isc_buffer_usedregion(&b, &r);
                dns_rdata_fromregion(&rdata, gclass, dns_rdatatype_dnskey, &r);
-               result = dns_difftuple_create(mctx, DNS_DIFFOP_ADD, gorigin,
-                                             zonettl, &rdata, &tuple);
+               if (type != dns_rdatatype_dnskey) {
+                       result = dns_ds_buildrdata(gorigin, &rdata,
+                                                  DNS_DSDIGEST_SHA1,
+                                                  dsbuf, &ds);
+                       check_result(result, "dns_ds_buildrdata");
+                       if (type == dns_rdatatype_dlv)
+                               ds.type = dns_rdatatype_dlv;
+                       result = dns_difftuple_create(mctx, DNS_DIFFOP_ADD,
+                                                     name, 0, &ds, &tuple);
+               } else
+                       result = dns_difftuple_create(mctx, DNS_DIFFOP_ADD,
+                                                     gorigin, zonettl,
+                                                     &rdata, &tuple);
                check_result(result, "dns_difftuple_create");
                dns_diff_append(&diff, &tuple);
        }
@@ -1489,10 +1530,10 @@ writekeyset(void) {
        check_result(result, "dns_diff_apply");
        dns_diff_clear(&diff);
 
-       result = dns_master_dump(mctx, db, version, masterstyle, keyfile);
+       result = dns_master_dump(mctx, db, version, style, filename);
        check_result(result, "dns_master_dump");
 
-       isc_mem_put(mctx, keyfile, filenamelen + 1);
+       isc_mem_put(mctx, filename, filenamelen + 1);
 
        dns_db_closeversion(db, &version, ISC_FALSE);
        dns_db_detach(&db);
@@ -1550,6 +1591,7 @@ usage(void) {
        fprintf(stderr, "print statistics\n");
        fprintf(stderr, "\t-n ncpus (number of cpus present)\n");
        fprintf(stderr, "\t-k key_signing_key\n");
+       fprintf(stderr, "\t-l lookasidezone\n");
 
        fprintf(stderr, "\n");
 
@@ -1609,6 +1651,9 @@ main(int argc, char *argv[]) {
        dns_rdataclass_t rdclass;
        dns_db_t *udb = NULL;
        isc_task_t **tasks = NULL;
+       isc_buffer_t b;
+       int len;
+
        masterstyle = &dns_master_style_explicitttl;
 
        check_result(isc_app_start(), "isc_app_start");
@@ -1620,7 +1665,7 @@ main(int argc, char *argv[]) {
        dns_result_register();
 
        while ((ch = isc_commandline_parse(argc, argv,
-                                          "ac:d:e:f:ghi:k:n:o:pr:s:Stv:z"))
+                                          "ac:d:e:f:ghi:k:l:n:o:pr:s:Stv:z"))
               != -1) {
                switch (ch) {
                case 'a':
@@ -1660,6 +1705,19 @@ main(int argc, char *argv[]) {
                                      "positive");
                        break;
 
+               case 'l': 
+                       dns_fixedname_init(&dlv_fixed);
+                       len = strlen(isc_commandline_argument);
+                       isc_buffer_init(&b, isc_commandline_argument, len);
+                       isc_buffer_add(&b, len);
+
+                       dns_fixedname_init(&dlv_fixed);
+                       dlv = dns_fixedname_name(&dlv_fixed);
+                       result = dns_name_fromtext(dlv, &b, dns_rootname,
+                                                  ISC_FALSE, NULL);
+                       check_result(result, "dns_name_fromtext(dlv)");
+                       break;
+
                case 'k':
                        if (ndskeys == MAXDSKEYS)
                                fatal("too many key-signing keys specified");
@@ -1767,6 +1825,11 @@ main(int argc, char *argv[]) {
                sprintf(output, "%s.signed", file);
        }
 
+       result = dns_master_stylecreate(&dsstyle,  DNS_STYLEFLAG_NO_TTL,
+                                       0, 24, 0, 0, 0, 8, mctx);
+       check_result(result, "dns_master_stylecreate");
+                                       
+
        gdb = NULL;
        TIME_NOW(&timer_start);
        loadzone(file, origin, rdclass, &gdb);
@@ -1868,8 +1931,13 @@ main(int argc, char *argv[]) {
 
        nsecify();
 
-       if (!nokeys)
-               writekeyset();
+       if (!nokeys) {
+               writeset("keyset-", dns_rdatatype_dnskey);
+               writeset("dsset-", dns_rdatatype_ds);
+               if (dlv != NULL) {
+                       writeset("dlvset-", dns_rdatatype_dlv);
+               }
+       }
 
        tempfilelen = strlen(output) + 20;
        tempfile = isc_mem_get(mctx, tempfilelen);
@@ -1965,6 +2033,8 @@ main(int argc, char *argv[]) {
        if (free_output)
                isc_mem_free(mctx, output);
 
+       dns_master_styledestroy(&dsstyle, mctx);
+
        cleanup_logging(&log);
        dst_lib_destroy();
        cleanup_entropy(&ectx);
index edbdae16a9d49db7a1e296f1a988c4c67a5fce21..095e16687a5b20e7a9dec1d8d7037b43f445f9c7 100644 (file)
@@ -16,7 +16,7 @@
  - PERFORMANCE OF THIS SOFTWARE.
 -->
 
-<!-- $Id: dnssec-signzone.docbook,v 1.9 2004/03/05 04:57:41 marka Exp $ -->
+<!-- $Id: dnssec-signzone.docbook,v 1.10 2004/03/10 02:19:51 marka Exp $ -->
 
 <refentry>
   <refentryinfo>
@@ -45,6 +45,7 @@
       <arg><option>-g</option></arg>
       <arg><option>-h</option></arg>
       <arg><option>-k <replaceable class="parameter">key</replaceable></option></arg>
+      <arg><option>-l <replaceable class="parameter">domain</replaceable></option></arg>
       <arg><option>-i <replaceable class="parameter">interval</replaceable></option></arg>
       <arg><option>-n <replaceable class="parameter">nthreads</replaceable></option></arg>
       <arg><option>-o <replaceable class="parameter">origin</replaceable></option></arg>
        </listitem>
       </varlistentry>
 
+      <varlistentry>
+        <term>-l <replaceable class="parameter">domain</replaceable></term>
+       <listitem>
+         <para>
+               Generate a DLV set in addition to the key (DNSKEY) and DS sets.
+               The domain is appended to the name of the records.
+         </para>
+       </listitem>
+      </varlistentry>
+
       <varlistentry>
         <term>-d <replaceable class="parameter">directory</replaceable></term>
        <listitem>
index ca3ca4eb037dd9c44eb8590453856b69249ba758..4c737e26749be42686cedba954459dc1b24f5dbd 100644 (file)
@@ -15,7 +15,7 @@
  * PERFORMANCE OF THIS SOFTWARE.
  */
 
-/* $Id: config.c,v 1.45 2004/03/05 04:57:46 marka Exp $ */
+/* $Id: config.c,v 1.46 2004/03/10 02:19:52 marka Exp $ */
 
 #include <config.h>
 
@@ -123,7 +123,7 @@ options {\n\
        check-names master fail;\n\
        check-names slave warn;\n\
        check-names response ignore;\n\
-       enable-dnssec no; /* Make yes for 9.4. */ \n\
+       dnssec-enable no; /* Make yes for 9.4. */ \n\
 \n\
        /* zone */\n\
        allow-query {any;};\n\
index a5c9e28b6cb0f3f8e50512e48180fd8085f86947..c37e728d816e9a37d93ca43a996fa21893f97d56 100644 (file)
@@ -15,7 +15,7 @@
  * PERFORMANCE OF THIS SOFTWARE.
  */
 
-/* $Id: query.c,v 1.256 2004/03/05 04:57:48 marka Exp $ */
+/* $Id: query.c,v 1.257 2004/03/10 02:19:52 marka Exp $ */
 
 #include <config.h>
 
@@ -1547,7 +1547,7 @@ query_addns(ns_client_t *client, dns_db_t *db) {
 
 static inline isc_result_t
 query_addcnamelike(ns_client_t *client, dns_name_t *qname, dns_name_t *tname,
-                  dns_ttl_t ttl, dns_name_t **anamep, dns_rdatatype_t type)
+                  dns_trust_t trust, dns_name_t **anamep, dns_rdatatype_t type)
 {
        dns_rdataset_t *rdataset;
        dns_rdatalist_t *rdatalist;
@@ -1583,7 +1583,7 @@ query_addcnamelike(ns_client_t *client, dns_name_t *qname, dns_name_t *tname,
        rdatalist->type = type;
        rdatalist->covers = 0;
        rdatalist->rdclass = client->message->rdclass;
-       rdatalist->ttl = ttl;
+       rdatalist->ttl = 0;
 
        dns_name_toregion(tname, &r);
        rdata->data = r.base;
@@ -1595,6 +1595,7 @@ query_addcnamelike(ns_client_t *client, dns_name_t *qname, dns_name_t *tname,
        ISC_LIST_APPEND(rdatalist->rdata, rdata, link);
        RUNTIME_CHECK(dns_rdatalist_tordataset(rdatalist, rdataset)
                      == ISC_R_SUCCESS);
+       rdataset->trust = trust;
 
        query_addrrset(client, anamep, &rdataset, NULL, NULL,
                       DNS_SECTION_ANSWER);
@@ -3076,7 +3077,8 @@ query_find(ns_client_t *client, dns_fetchevent_t *event, dns_rdatatype_t qtype)
                 */
                dns_name_init(tname, NULL);
                (void)query_addcnamelike(client, client->query.qname, fname,
-                                        0, &tname, dns_rdatatype_cname);
+                                        trdataset->trust, &tname,
+                                        dns_rdatatype_cname);
                if (tname != NULL)
                        dns_message_puttempname(client->message, &tname);
                /*
index 02743451c93a9d5d17b81f63cfc80edd58a9ed2d..ed6e0b4915780755b71aa144b32d17ddb55837e7 100644 (file)
@@ -15,7 +15,7 @@
  * PERFORMANCE OF THIS SOFTWARE.
  */
 
-/* $Id: server.c,v 1.416 2004/03/05 04:57:48 marka Exp $ */
+/* $Id: server.c,v 1.417 2004/03/10 02:19:52 marka Exp $ */
 
 #include <config.h>
 
@@ -1118,10 +1118,24 @@ configure_view(dns_view_t *view, cfg_obj_t *config, cfg_obj_t *vconfig,
        view->provideixfr = cfg_obj_asboolean(obj);
                        
        obj = NULL;
-       result = ns_config_get(maps, "enable-dnssec", &obj);
+       result = ns_config_get(maps, "dnssec-enable", &obj);
        INSIST(result == ISC_R_SUCCESS);
        view->enablednssec = cfg_obj_asboolean(obj);
 
+       obj = NULL;
+       result = ns_config_get(maps, "dnssec-lookaside", &obj);
+       if (result == ISC_R_SUCCESS) {
+               const char *dlv;
+               isc_buffer_t b;
+               dlv = cfg_obj_asstring(obj);
+               isc_buffer_init(&b, dlv, strlen(dlv));
+               isc_buffer_add(&b, strlen(dlv));
+               CHECK(dns_name_fromtext(dns_fixedname_name(&view->dlv_fixed),
+                                       &b, dns_rootname, ISC_TRUE, NULL));
+               view->dlv = dns_fixedname_name(&view->dlv_fixed);
+       } else
+               view->dlv = NULL;
+
        /*
         * For now, there is only one kind of trusted keys, the
         * "security roots".
index 65c9169568106aa6017c3e2add7b2444f75f0c0a..833e9375d73c3c81c7798be76df22e780005379c 100644 (file)
@@ -15,7 +15,7 @@
  * PERFORMANCE OF THIS SOFTWARE.
  */
 
-/* $Id: named.conf,v 1.19 2004/03/05 05:00:12 marka Exp $ */
+/* $Id: named.conf,v 1.20 2004/03/10 02:19:53 marka Exp $ */
 
 // NS1
 
@@ -31,7 +31,7 @@ options {
        listen-on-v6 { none; };
        recursion no;
        notify yes;
-       enable-dnssec yes;
+       dnssec-enable yes;
 };
 
 zone "." {
index 82c405a2bcda43280ee4e1e0c5252a032136fe0e..a7b7b311510ac4b3324a095a9fe61723252bb13a 100644 (file)
@@ -13,7 +13,7 @@
 ; OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
 ; PERFORMANCE OF THIS SOFTWARE.
 
-; $Id: root.db.in,v 1.7 2004/03/05 05:00:12 marka Exp $
+; $Id: root.db.in,v 1.8 2004/03/10 02:19:53 marka Exp $
 
 $TTL 300
 .                      IN SOA  gson.nominum.com. a.root.servers.nil. (
@@ -28,3 +28,5 @@ a.root-servers.nil.   A       10.53.0.1
 
 example.               NS      ns2.example.
 ns2.example.           A       10.53.0.2
+dlv.                   NS      ns2.dlv.
+ns2.dlv.               A       10.53.0.2
index 32195597bc9a21b9194f1cb2947365df69546ce7..2745a32c857e4e17e7742c9cb6e3e54ca5c129c3 100644 (file)
@@ -15,7 +15,7 @@
 # OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
 # PERFORMANCE OF THIS SOFTWARE.
 
-# $Id: sign.sh,v 1.18 2004/03/05 05:00:12 marka Exp $
+# $Id: sign.sh,v 1.19 2004/03/10 02:19:53 marka Exp $
 
 SYSTEMTESTTOP=../..
 . $SYSTEMTESTTOP/conf.sh
@@ -29,6 +29,7 @@ zonefile=root.db
 (cd ../ns2 && sh sign.sh )
 
 cp ../ns2/keyset-example. .
+cp ../ns2/keyset-dlv. .
 
 keyname=`$KEYGEN -r $RANDFILE -a RSA -b 768 -n zone $zone`
 
index c579feba3840119f235b380d49c890a819c4693a..ce2501f7f97db1bb92035349098df20b5a06efec 100644 (file)
@@ -15,7 +15,7 @@
  * PERFORMANCE OF THIS SOFTWARE.
  */
 
-/* $Id: named.conf,v 1.22 2004/03/05 05:00:16 marka Exp $ */
+/* $Id: named.conf,v 1.23 2004/03/10 02:19:53 marka Exp $ */
 
 // NS2
 
@@ -31,7 +31,7 @@ options {
        listen-on-v6 { none; };
        recursion no;
        notify yes;
-       enable-dnssec yes;
+       dnssec-enable yes;
 };
 
 zone "." {
@@ -39,6 +39,11 @@ zone "." {
        file "../../common/root.hint";
 };
 
+zone "dlv" {
+       type master;
+       file "dlv.db.signed";
+};
+
 zone "example" {
        type master;
        file "example.db.signed";
index f61548306ae56e25f4eebfe8fc715507fe942d26..3b54d38b505b0ca74c0ca4091c339d78b439084d 100644 (file)
@@ -15,7 +15,7 @@
 # OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
 # PERFORMANCE OF THIS SOFTWARE.
 
-# $Id: sign.sh,v 1.23 2004/03/05 05:00:16 marka Exp $
+# $Id: sign.sh,v 1.24 2004/03/10 02:19:53 marka Exp $
 
 SYSTEMTESTTOP=../..
 . $SYSTEMTESTTOP/conf.sh
@@ -52,4 +52,17 @@ privkeyname=`$KEYGEN -r $RANDFILE -a RSA -b 768 -n zone $privzone`
 
 cat $privinfile $privkeyname.key >$privzonefile
 
-$SIGNER -g -r $RANDFILE -o $privzone $privzonefile > /dev/null
+$SIGNER -g -r $RANDFILE -o $privzone -l dlv $privzonefile > /dev/null
+
+# Sign the DLV secure zone.
+
+
+dlvzone=dlv.
+dlvinfile=dlv.db.in
+dlvzonefile=dlv.db
+
+dlvkeyname=`$KEYGEN -r $RANDFILE -a RSA -b 768 -n zone $dlvzone`
+
+cat $dlvinfile $dlvkeyname.key dlvset-$privzone > $dlvzonefile
+
+$SIGNER -g -r $RANDFILE -o $dlvzone $dlvzonefile > /dev/null
index 424ad5801accfcee858d6f053f563f9ec5799d26..5af6fb02d31d135ded07824963a96cbe04283b90 100644 (file)
@@ -15,7 +15,7 @@
  * PERFORMANCE OF THIS SOFTWARE.
  */
 
-/* $Id: named.conf,v 1.24 2004/03/05 05:00:20 marka Exp $ */
+/* $Id: named.conf,v 1.25 2004/03/10 02:19:54 marka Exp $ */
 
 // NS3
 
@@ -31,7 +31,7 @@ options {
        listen-on-v6 { none; };
        recursion no;
        notify yes;
-       enable-dnssec yes;
+       dnssec-enable yes;
 };
 
 zone "." {
index 0fc8833629ba332b496b0775b7019a32ea07df30..4f908e47b2a52ab3d2141236d8b859055dac65a5 100644 (file)
@@ -15,7 +15,7 @@
  * PERFORMANCE OF THIS SOFTWARE.
  */
 
-/* $Id: named.conf,v 1.21 2004/03/05 05:00:24 marka Exp $ */
+/* $Id: named.conf,v 1.22 2004/03/10 02:19:54 marka Exp $ */
 
 // NS4
 
@@ -30,7 +30,7 @@ options {
        listen-on { 10.53.0.4; };
        listen-on-v6 { none; };
        recursion yes;
-       enable-dnssec yes;
+       dnssec-enable yes;
 };
 
 zone "." {
index 8d99a8cf6cf5b1daffcce3f42a0f2e9355a10536..29191295a3e6e61d2e51e9b0a9c39ad4e773b285 100644 (file)
@@ -15,7 +15,7 @@
  * PERFORMANCE OF THIS SOFTWARE.
  */
 
-/* $Id: named.conf,v 1.19 2004/03/05 05:00:31 marka Exp $ */
+/* $Id: named.conf,v 1.20 2004/03/10 02:19:54 marka Exp $ */
 
 // NS5
 
@@ -30,7 +30,7 @@ options {
        listen-on { 10.53.0.5; };
        listen-on-v6 { none; };
        recursion yes;
-       enable-dnssec yes;
+       dnssec-enable yes;
 };
 
 zone "." {
index 0988fb10c55d1939296bf7ae4ee47edf9f5ce39d..b5eca59ee70a905a799bcc809aba120ca9698097 100644 (file)
@@ -14,7 +14,7 @@
  * PERFORMANCE OF THIS SOFTWARE.
  */
 
-/* $Id: named.conf,v 1.5 2004/03/05 05:00:35 marka Exp $ */
+/* $Id: named.conf,v 1.6 2004/03/10 02:19:54 marka Exp $ */
 
 // NS6
 
@@ -31,7 +31,8 @@ options {
        recursion yes;
        notify yes;
        disable-algorithms . { DSA; };
-       enable-dnssec yes;
+       dnssec-enable yes;
+       dnssec-lookaside dlv;
 };
 
 zone "." {
index 5cd53840c6abc9454f94ee5635e54f7ed800529c..24a1f7ac61b041a7a5c56458a2a417c7d5fd6f6e 100644 (file)
@@ -15,7 +15,7 @@
 # OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
 # PERFORMANCE OF THIS SOFTWARE.
 
-# $Id: tests.sh,v 1.43 2004/03/05 05:00:09 marka Exp $
+# $Id: tests.sh,v 1.44 2004/03/10 02:19:53 marka Exp $
 
 SYSTEMTESTTOP=..
 . $SYSTEMTESTTOP/conf.sh
@@ -441,6 +441,12 @@ n=`expr $n + 1`
 if [ $ret != 0 ]; then echo "I:failed"; fi
 status=`expr $status + $ret`
 
+echo "I:checking dnssec-lookaside-validation works ($n)"
+ret=0
+$DIG $DIGOPTS private.secure.example. SOA @10.53.0.6 \
+       > dig.out.ns6.test$n || ret=1
+grep "flags:.*ad.*QUERY" dig.out.ns6.test$n > /dev/null || ret=1
+
 # Run a minimal update test if possible.  This is really just
 # a regression test for RT #2399; more tests should be added.
 
index d6a55d91c97096645b7d36f1cab9ab3542a7c4f8..725902d658ef2ff6c8c8ee7e0e0f3481ec1d45e4 100644 (file)
@@ -15,7 +15,7 @@
 # OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
 # PERFORMANCE OF THIS SOFTWARE.
 
-# $Id: ifconfig.sh,v 1.44 2004/03/05 04:59:12 marka Exp $
+# $Id: ifconfig.sh,v 1.45 2004/03/10 02:19:52 marka Exp $
 
 #
 # Set up interface aliases for bind9 system tests.
@@ -46,7 +46,7 @@ fi
 
 case `uname -a` in
   *HP-UX*) sys=hpux ;;
-  *) sys=`$config_guess` ;;
+  *) sys=`sh $config_guess` ;;
 esac
 
 case "$2" in
index 57901378fc893dbdc62b4075b7e08fb903f6766f..f04aa97c4fd0d9a9c12f180fe1cd500e2ad38a13 100644 (file)
@@ -15,7 +15,7 @@
  * PERFORMANCE OF THIS SOFTWARE.
  */
 
-/* $Id: named.conf,v 1.14 2004/03/05 05:01:27 marka Exp $ */
+/* $Id: named.conf,v 1.15 2004/03/10 02:19:54 marka Exp $ */
 
 controls { /* empty */ };
 
@@ -29,7 +29,7 @@ options {
        listen-on-v6 { none; };
        recursion no;
        notify no;
-       enable-dnssec yes;
+       dnssec-enable yes;
 };
 
 zone "." {
index 778f2d62615f383b3b2b2e19cd793640c6d6fa87..8e8bc82f963a604dc2ee4d3ac46fb7e230295ac0 100644 (file)
@@ -15,7 +15,7 @@
 # OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
 # PERFORMANCE OF THIS SOFTWARE.
 
-# $Id: start.pl,v 1.4 2004/03/05 04:59:13 marka Exp $
+# $Id: start.pl,v 1.5 2004/03/10 02:19:52 marka Exp $
 
 # Framework for starting test servers.
 # Based on the type of server specified, check for port availability, remove
@@ -129,7 +129,7 @@ sub start_server {
                if ($options) {
                        $command .= "$options";
                } else {
-                       $command .= "-c named.conf -d 99 -g";
+                       $command .= "-m record -c named.conf -d 99 -g";
                }
                $command .= " >named.run 2>&1 &";
                $pid_file = "named.pid";
@@ -139,7 +139,7 @@ sub start_server {
                if ($options) {
                        $command .= "$options";
                } else {
-                       $command .= "-C resolv.conf -d 99 -g -i lwresd.pid -P 9210 -p 5300";
+                       $command .= "-m record -C resolv.conf -d 99 -g -i lwresd.pid -P 9210 -p 5300";
                }
                $command .= " >lwresd.run 2>&1 &";
                $pid_file = "lwresd.pid";
index 8e10c544063b26e525f31f3590d13b3d5c504ae3..e7956b301deaf2174ccd7c4267a847bf466332f0 100644 (file)
@@ -18,7 +18,7 @@ AC_DIVERT_PUSH(1)dnl
 esyscmd([sed "s/^/# /" COPYRIGHT])dnl
 AC_DIVERT_POP()dnl
 
-AC_REVISION($Revision: 1.353 $)
+AC_REVISION($Revision: 1.354 $)
 
 AC_INIT(lib/dns/name.c)
 AC_PREREQ(2.13)
@@ -597,9 +597,14 @@ case $host in
         # UnixWare
        use_threads=true ;;
 *-netbsd*)
-       # Socket I/O optimizations introduced in 9.2 expose a
-       # bug in unproven-pthreads; see PR #12650
-       use_threads=false ;;
+       if test -r /usr/lib/libpthread.so ; then
+           use_threads=true
+       else
+           # Socket I/O optimizations introduced in 9.2 expose a
+           # bug in unproven-pthreads; see PR #12650
+           use_threads=false
+       fi
+       ;;
 *-openbsd*)
        # OpenBSD users have reported that named dumps core on
        # startup when built with threads.
@@ -674,21 +679,27 @@ then
 [linking with PTL2 is highly experimental and not expected to work])
                        CC=ptlgcc
                else
-                       if test ! -d $LOCALBASE/pthreads
+                       if test -r /usr/lib/libpthread.so
                        then
-                               AC_MSG_RESULT(none)
-                               AC_MSG_ERROR("could not find thread libraries")
-                       fi
+                               AC_MSG_RESULT(native)
+                               LIBS="-lpthread $LIBS"
+                       else
+                               if test ! -d $LOCALBASE/pthreads
+                               then
+                                       AC_MSG_RESULT(none)
+                                       AC_MSG_ERROR("could not find thread libraries")
+                               fi
 
-                       if $use_threads
-                       then
-                               AC_MSG_RESULT(mit-pthreads/unproven-pthreads)
-                               pkg="$LOCALBASE/pthreads"
-                               lib1="-L$pkg/lib -Wl,-R$pkg/lib"
-                               lib2="-lpthread -lm -lgcc -lpthread"
-                               LIBS="$lib1 $lib2 $LIBS"
-                               CPPFLAGS="$CPPFLAGS -I$pkg/include"
-                               STD_CINCLUDES="$STD_CINCLUDES -I$pkg/include"
+                               if $use_threads
+                               then
+                                       AC_MSG_RESULT(mit-pthreads/unproven-pthreads)
+                                       pkg="$LOCALBASE/pthreads"
+                                       lib1="-L$pkg/lib -Wl,-R$pkg/lib"
+                                       lib2="-lpthread -lm -lgcc -lpthread"
+                                       LIBS="$lib1 $lib2 $LIBS"
+                                       CPPFLAGS="$CPPFLAGS -I$pkg/include"
+                                       STD_CINCLUDES="$STD_CINCLUDES -I$pkg/include"
+                               fi
                        fi
                fi
                ;;
index fbc043fb396b5bd6c9c278fd75c3b637d2fa38a8..5a5459b87f554d651ce03f2f8f0046ea40d7bbb5 100644 (file)
@@ -2,7 +2,7 @@
 <!DOCTYPE book PUBLIC "-//OASIS//DTD DocBook XML V4.0//EN"
                "http://www.oasis-open.org/docbook/xml/4.0/docbookx.dtd">
 
-<!-- File: $Id: Bv9ARM-book.xml,v 1.239 2004/03/05 10:53:24 marka Exp $ -->
+<!-- File: $Id: Bv9ARM-book.xml,v 1.240 2004/03/10 02:19:55 marka Exp $ -->
 
 <book>
 <title>BIND 9 Administrator Reference Manual</title>
@@ -2757,7 +2757,8 @@ statement in the <filename>named.conf</filename> file:</para>
     <optional> rfc2308-type1 <replaceable>yes_or_no</replaceable>; </optional>
     <optional> use-id-pool <replaceable>yes_or_no</replaceable>; </optional>
     <optional> maintain-ixfr-base <replaceable>yes_or_no</replaceable>; </optional>
-    <optional> enable-dnssec <replaceable>yes_or_no</replaceable>; </optional>
+    <optional> dnssec-enable <replaceable>yes_or_no</replaceable>; </optional>
+    <optional> dnssec-lookaside <replaceable>domain</replaceable>; </optional>
     <optional> forward ( <replaceable>only</replaceable> | <replaceable>first</replaceable> ); </optional>
     <optional> forwarders { <replaceable>ip_addr</replaceable> <optional>port <replaceable>ip_port</replaceable></optional> ; <optional> <replaceable>ip_addr</replaceable> <optional>port <replaceable>ip_port</replaceable></optional> ; ... </optional> }; </optional>
     <optional> dual-stack-servers <optional>port <replaceable>ip_port</replaceable></optional> { ( <replaceable>domain_name</replaceable> <optional>port <replaceable>ip_port</replaceable></optional> | <replaceable>ip_addr</replaceable> <optional>port <replaceable>ip_port</replaceable></optional> ) ; ... }; </optional>
@@ -2978,6 +2979,17 @@ Disable the specified DNSSEC algorithms at and below the specified name.
 Multiple <command>disable-algorithms</command> statements are allowed.
 Only the most specific will be applied.
 </para></listitem></varlistentry>
+
+<varlistentry><term><command>dnssec-lookaside</command></term>
+<listitem><para>
+When set <command>dnssec-lookaside</command> provides the
+validator with an alternate method to validate DNSKEY records at the
+top of a zone.  When set the domain specified by
+<command>dnssec-lookaside</command> is appended to DNSKEY's
+name and a DLV record is looked up.  If the DLV record validates
+a DNSKEY (similarly to the way a DS record does) the DNSKEY RRset is deemed to be trusted.
+</para></listitem></varlistentry>
+
 </variablelist>
 
 <sect3 id="boolean_options"><title>Boolean Options</title>
@@ -3339,7 +3351,7 @@ when the serial number on the master is less than what named currently
 has.  The default is <userinput>no</userinput>.
 </para></listitem></varlistentry>
 
-<varlistentry><term><command>enable-dnssec</command></term>
+<varlistentry><term><command>dnssec-enable</command></term>
 <listitem>
 <para>
 Enable DNSSEC support in named.  Unless set to <userinput>yes</userinput>
index 8b8dec481b5efe56ae1ba1a7ac2869f335702d78..fb8ea2a9dfb4038ec936facc366d99407ce8344f 100644 (file)
@@ -15,7 +15,7 @@
  * PERFORMANCE OF THIS SOFTWARE.
  */
 
-/* $Id: check.c,v 1.43 2004/03/05 05:09:04 marka Exp $ */
+/* $Id: check.c,v 1.44 2004/03/10 02:19:55 marka Exp $ */
 
 #include <config.h>
 
@@ -384,6 +384,28 @@ check_options(cfg_obj_t *options, isc_log_t *logctx) {
                }
        }
 
+       /*
+        * Check the DLV zone name.
+        */
+       obj = NULL;
+       (void)cfg_map_get(options, "dnssec-lookaside", &obj);
+       if (obj != NULL) {
+               dns_fixedname_t fixedname;
+               const char *dlv;
+               isc_buffer_t b;
+
+               dlv = cfg_obj_asstring(obj);
+               dns_fixedname_init(&fixedname);
+               isc_buffer_init(&b, dlv, strlen(dlv));
+               isc_buffer_add(&b, strlen(dlv));
+               tresult = dns_name_fromtext(dns_fixedname_name(&fixedname), &b,
+                                          dns_rootname, ISC_TRUE, NULL);
+               if (tresult != ISC_R_SUCCESS) {
+                       cfg_obj_log(obj, logctx, ISC_LOG_ERROR,
+                                   "bad domain name '%s'", dlv);
+                       result = tresult;
+               }
+       }
        return (result);
 }
 
index 7e51c7a7b67b8f015f6804e36d4a53fad70f2321..ae941cb374a9b2dfab14371b1e2a6270b1b60090 100644 (file)
@@ -15,7 +15,7 @@
  * PERFORMANCE OF THIS SOFTWARE.
  */
 
-/* $Id: adb.c,v 1.214 2004/03/05 05:09:17 marka Exp $ */
+/* $Id: adb.c,v 1.215 2004/03/10 02:19:55 marka Exp $ */
 
 /*
  * Implementation notes
@@ -3259,7 +3259,7 @@ fetch_name(dns_adbname_t *adbname,
        nameservers = NULL;
        dns_rdataset_init(&rdataset);
 
-       options = 0;
+       options = DNS_FETCHOPT_NOVALIDATE;
        if (start_at_zone) {
                DP(ENTER_LEVEL,
                   "fetch_name: starting at zone for name %p",
index e24ce589dbe1563e95acb482755332c8235352c0..02c492db45c6b3474a41b41d9c84699758d2aa9e 100644 (file)
@@ -15,7 +15,7 @@
  * PERFORMANCE OF THIS SOFTWARE.
  */
 
-/* $Id: validator.h,v 1.26 2004/03/05 05:09:47 marka Exp $ */
+/* $Id: validator.h,v 1.27 2004/03/10 02:19:56 marka Exp $ */
 
 #ifndef DNS_VALIDATOR_H
 #define DNS_VALIDATOR_H 1
@@ -120,6 +120,7 @@ struct dns_validator {
        dns_fixedname_t                 fname;
        dns_fixedname_t                 wild;
        ISC_LINK(dns_validator_t)       link;
+       dns_rdataset_t *                dlv;
 };
 
 ISC_LANG_BEGINDECLS
index bc4ef6fdcf90c1ec9d317770390ed61746b5b941..e46085b6174d07023d82cb2b6fa4f5a4e0738f8d 100644 (file)
@@ -15,7 +15,7 @@
  * PERFORMANCE OF THIS SOFTWARE.
  */
 
-/* $Id: view.h,v 1.90 2004/03/05 05:09:47 marka Exp $ */
+/* $Id: view.h,v 1.91 2004/03/10 02:19:56 marka Exp $ */
 
 #ifndef DNS_VIEW_H
 #define DNS_VIEW_H 1
@@ -71,6 +71,7 @@
 #include <isc/stdtime.h>
 
 #include <dns/acl.h>
+#include <dns/fixedname.h>
 #include <dns/types.h>
 
 ISC_LANG_BEGINDECLS
@@ -124,6 +125,8 @@ struct dns_view {
        isc_boolean_t                   rootdelonly;
        dns_namelist_t *                rootexclude;
        isc_boolean_t                   checknames;
+       dns_name_t *                    dlv;
+       dns_fixedname_t                 dlv_fixed;
 
        /*
         * Configurable data for server use only,
diff --git a/lib/dns/rdata/generic/dlv_65323.c b/lib/dns/rdata/generic/dlv_65323.c
new file mode 100644 (file)
index 0000000..dba117d
--- /dev/null
@@ -0,0 +1,282 @@
+/*
+ * Copyright (C) 1999-2001  Internet Software Consortium.
+ *
+ * Permission to use, copy, modify, and distribute this software for any
+ * purpose with or without fee is hereby granted, provided that the above
+ * copyright notice and this permission notice appear in all copies.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS" AND INTERNET SOFTWARE CONSORTIUM
+ * DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL
+ * INTERNET SOFTWARE CONSORTIUM BE LIABLE FOR ANY SPECIAL, DIRECT,
+ * INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING
+ * FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT,
+ * NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION
+ * WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
+ */
+
+/* $Id: dlv_65323.c,v 1.2 2004/03/10 02:19:56 marka Exp $ */
+
+/* draft-ietf-dnsext-delegation-signer-05.txt */
+
+#ifndef RDATA_GENERIC_DLV_65323_C
+#define RDATA_GENERIC_DLV_65323_C
+
+#define RRTYPE_DLV_ATTRIBUTES 0
+
+static inline isc_result_t
+fromtext_dlv(ARGS_FROMTEXT) {
+       isc_token_t token;
+
+       REQUIRE(type == 65323);
+
+       UNUSED(type);
+       UNUSED(rdclass);
+       UNUSED(origin);
+       UNUSED(options);
+       UNUSED(callbacks);
+
+       /*
+        * Key tag.
+        */
+       RETERR(isc_lex_getmastertoken(lexer, &token, isc_tokentype_number,
+                                     ISC_FALSE));
+       if (token.value.as_ulong > 0xffff)
+               RETTOK(ISC_R_RANGE);
+       RETERR(uint16_tobuffer(token.value.as_ulong, target));
+
+       /*
+        * Algorithm.
+        */
+       RETERR(isc_lex_getmastertoken(lexer, &token, isc_tokentype_number,
+                                     ISC_FALSE));
+       if (token.value.as_ulong > 0xff)
+               RETTOK(ISC_R_RANGE);
+       RETERR(uint8_tobuffer(token.value.as_ulong, target));
+
+       /*
+        * Digest type.
+        */
+       RETERR(isc_lex_getmastertoken(lexer, &token, isc_tokentype_number,
+                                     ISC_FALSE));
+       if (token.value.as_ulong > 0xff)
+               RETTOK(ISC_R_RANGE);
+       RETERR(uint8_tobuffer(token.value.as_ulong, target));
+       type = (isc_uint16_t) token.value.as_ulong;
+
+       /*
+        * Digest.
+        */
+       return (isc_hex_tobuffer(lexer, target, -1));
+}
+
+static inline isc_result_t
+totext_dlv(ARGS_TOTEXT) {
+       isc_region_t sr;
+       char buf[sizeof("64000 ")];
+       unsigned int n;
+
+       REQUIRE(rdata->type == 65323);
+       REQUIRE(rdata->length != 0);
+
+       UNUSED(tctx);
+
+       dns_rdata_toregion(rdata, &sr);
+
+       /*
+        * Key tag.
+        */
+       n = uint16_fromregion(&sr);
+       isc_region_consume(&sr, 2);
+       sprintf(buf, "%u ", n);
+       RETERR(str_totext(buf, target));
+
+       /*
+        * Algorithm.
+        */
+       n = uint8_fromregion(&sr);
+       isc_region_consume(&sr, 1);
+       sprintf(buf, "%u ", n);
+       RETERR(str_totext(buf, target));
+
+       /*
+        * Digest type.
+        */
+       n = uint8_fromregion(&sr);
+       isc_region_consume(&sr, 1);
+       sprintf(buf, "%u", n);
+       RETERR(str_totext(buf, target));
+
+       /*
+        * Digest.
+        */
+       if ((tctx->flags & DNS_STYLEFLAG_MULTILINE) != 0)
+               RETERR(str_totext(" (", target));
+       RETERR(str_totext(tctx->linebreak, target));
+       RETERR(isc_hex_totext(&sr, tctx->width - 2, tctx->linebreak, target));
+       if ((tctx->flags & DNS_STYLEFLAG_MULTILINE) != 0)
+               RETERR(str_totext(" )", target));
+       return (ISC_R_SUCCESS);
+}
+
+static inline isc_result_t
+fromwire_dlv(ARGS_FROMWIRE) {
+       isc_region_t sr;
+
+       REQUIRE(type == 65323);
+
+       UNUSED(type);
+       UNUSED(rdclass);
+       UNUSED(dctx);
+       UNUSED(options);
+
+       isc_buffer_activeregion(source, &sr);
+       if (sr.length < 4)
+               return (ISC_R_UNEXPECTEDEND);
+
+       isc_buffer_forward(source, sr.length);
+       return (mem_tobuffer(target, sr.base, sr.length));
+}
+
+static inline isc_result_t
+towire_dlv(ARGS_TOWIRE) {
+       isc_region_t sr;
+
+       REQUIRE(rdata->type == 65323);
+       REQUIRE(rdata->length != 0);
+
+       UNUSED(cctx);
+
+       dns_rdata_toregion(rdata, &sr);
+       return (mem_tobuffer(target, sr.base, sr.length));
+}
+
+static inline int
+compare_dlv(ARGS_COMPARE) {
+       isc_region_t r1;
+       isc_region_t r2;
+
+       REQUIRE(rdata1->type == rdata2->type);
+       REQUIRE(rdata1->rdclass == rdata2->rdclass);
+       REQUIRE(rdata1->type == 65323);
+       REQUIRE(rdata1->length != 0);
+       REQUIRE(rdata2->length != 0);
+
+       dns_rdata_toregion(rdata1, &r1);
+       dns_rdata_toregion(rdata2, &r2);
+       return (isc_region_compare(&r1, &r2));
+}
+
+static inline isc_result_t
+fromstruct_dlv(ARGS_FROMSTRUCT) {
+       dns_rdata_dlv_t *dlv = source;
+
+       REQUIRE(type == 65323);
+       REQUIRE(source != NULL);
+       REQUIRE(dlv->common.rdtype == type);
+       REQUIRE(dlv->common.rdclass == rdclass);
+
+       UNUSED(type);
+       UNUSED(rdclass);
+
+       RETERR(uint16_tobuffer(dlv->key_tag, target));
+       RETERR(uint8_tobuffer(dlv->algorithm, target));
+       RETERR(uint8_tobuffer(dlv->digest_type, target));
+
+       return (mem_tobuffer(target, dlv->digest, dlv->length));
+}
+
+static inline isc_result_t
+tostruct_dlv(ARGS_TOSTRUCT) {
+       dns_rdata_dlv_t *dlv = target;
+       isc_region_t region;
+
+       REQUIRE(rdata->type == 65323);
+       REQUIRE(target != NULL);
+       REQUIRE(rdata->length != 0);
+
+       dlv->common.rdclass = rdata->rdclass;
+       dlv->common.rdtype = rdata->type;
+       ISC_LINK_INIT(&dlv->common, link);
+
+       dns_rdata_toregion(rdata, &region);
+
+       dlv->key_tag = uint16_fromregion(&region);
+       isc_region_consume(&region, 2);
+       dlv->algorithm = uint8_fromregion(&region);
+       isc_region_consume(&region, 1);
+       dlv->digest_type = uint8_fromregion(&region);
+       isc_region_consume(&region, 1);
+       dlv->length = region.length;
+
+       dlv->digest = mem_maybedup(mctx, region.base, region.length);
+       if (dlv->digest == NULL)
+               return (ISC_R_NOMEMORY);
+
+       dlv->mctx = mctx;
+       return (ISC_R_SUCCESS);
+}
+
+static inline void
+freestruct_dlv(ARGS_FREESTRUCT) {
+       dns_rdata_dlv_t *dlv = source;
+
+       REQUIRE(dlv != NULL);
+       REQUIRE(dlv->common.rdtype == 65323);
+
+       if (dlv->mctx == NULL)
+               return;
+
+       if (dlv->digest != NULL)
+               isc_mem_free(dlv->mctx, dlv->digest);
+       dlv->mctx = NULL;
+}
+
+static inline isc_result_t
+additionaldata_dlv(ARGS_ADDLDATA) {
+       REQUIRE(rdata->type == 65323);
+
+       UNUSED(rdata);
+       UNUSED(add);
+       UNUSED(arg);
+
+       return (ISC_R_SUCCESS);
+}
+
+static inline isc_result_t
+digest_dlv(ARGS_DIGEST) {
+       isc_region_t r;
+
+       REQUIRE(rdata->type == 65323);
+
+       dns_rdata_toregion(rdata, &r);
+
+       return ((digest)(arg, &r));
+}
+
+static inline isc_boolean_t
+checkowner_dlv(ARGS_CHECKOWNER) {
+
+       REQUIRE(type == 65323);
+
+       UNUSED(name);
+       UNUSED(type);
+       UNUSED(rdclass);
+       UNUSED(wildcard);
+
+       return (ISC_TRUE);
+}
+
+static inline isc_boolean_t
+checknames_dlv(ARGS_CHECKNAMES) {
+
+       REQUIRE(rdata->type == 65323);
+
+       UNUSED(rdata);
+       UNUSED(owner);
+       UNUSED(bad);
+
+       return (ISC_TRUE);
+}
+
+#endif /* RDATA_GENERIC_DLV_65323_C */
diff --git a/lib/dns/rdata/generic/dlv_65323.h b/lib/dns/rdata/generic/dlv_65323.h
new file mode 100644 (file)
index 0000000..1702afb
--- /dev/null
@@ -0,0 +1,34 @@
+/*
+ * Copyright (C) 1999-2001  Internet Software Consortium.
+ *
+ * Permission to use, copy, modify, and distribute this software for any
+ * purpose with or without fee is hereby granted, provided that the above
+ * copyright notice and this permission notice appear in all copies.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS" AND INTERNET SOFTWARE CONSORTIUM
+ * DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL
+ * INTERNET SOFTWARE CONSORTIUM BE LIABLE FOR ANY SPECIAL, DIRECT,
+ * INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING
+ * FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT,
+ * NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION
+ * WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
+ */
+
+/* $Id: dlv_65323.h,v 1.2 2004/03/10 02:19:57 marka Exp $ */
+
+/* draft-ietf-dnsext-delegation-signer-05.txt */
+#ifndef GENERIC_DLV_65323_H
+#define GENERIC_DLV_65323_H 1
+
+typedef struct dns_rdata_dlv {
+       dns_rdatacommon_t       common;
+       isc_mem_t               *mctx;
+       isc_uint16_t            key_tag;
+       isc_uint8_t             algorithm;
+       isc_uint8_t             digest_type;
+       isc_uint16_t            length;
+       unsigned char           *digest;
+} dns_rdata_dlv_t;
+
+#endif /* GENERIC_DLV_65323_H */
index 28892d2ef9003687c326669b595af0d939b27e28..ff861f3607c1d521321c68014ac02d8e9f7bf9e2 100644 (file)
@@ -18,7 +18,7 @@
 
 /*
  * Principal Author: Brian Wellington
- * $Id: dst_api.c,v 1.112 2004/03/05 05:48:23 marka Exp $
+ * $Id: dst_api.c,v 1.113 2004/03/10 02:19:58 marka Exp $
  */
 
 #include <config.h>
@@ -72,7 +72,7 @@ static dst_key_t *    get_key_struct(dns_name_t *name,
 static isc_result_t    read_public_key(const char *filename,
                                        isc_mem_t *mctx,
                                        dst_key_t **keyp);
-static isc_result_t    write_public_key(const dst_key_t *key,
+static isc_result_t    write_public_key(const dst_key_t *key, int type,
                                         const char *directory);
 static isc_result_t    buildfilename(dns_name_t *name,
                                      dns_keytag_t id,
@@ -313,7 +313,7 @@ dst_key_tofile(const dst_key_t *key, int type, const char *directory) {
                return (DST_R_UNSUPPORTEDALG);
 
        if (type & DST_TYPE_PUBLIC) {
-               ret = write_public_key(key, directory);
+               ret = write_public_key(key, type, directory);
                if (ret != ISC_R_SUCCESS)
                        return (ret);
        }
@@ -960,7 +960,7 @@ issymmetric(const dst_key_t *key) {
  * Writes a public key to disk in DNS format.
  */
 static isc_result_t
-write_public_key(const dst_key_t *key, const char *directory) {
+write_public_key(const dst_key_t *key, int type, const char *directory) {
        FILE *fp;
        isc_buffer_t keyb, textb, fileb, classb;
        isc_region_t r;
@@ -1024,7 +1024,10 @@ write_public_key(const dst_key_t *key, const char *directory) {
        isc_buffer_usedregion(&classb, &r);
        fwrite(r.base, 1, r.length, fp);
 
-       fprintf(fp, " DNSKEY ");
+       if ((type & DST_TYPE_KEY) != 0)
+               fprintf(fp, " KEY ");
+       else
+               fprintf(fp, " DNSKEY ");
 
        isc_buffer_usedregion(&textb, &r);
        fwrite(r.base, 1, r.length, fp);
index 3f466c2e449b458173ddb9f933092aa94a41f536..64bd0ea4ec581566ffbdf8fed734594dc8b4cec7 100644 (file)
@@ -15,7 +15,7 @@
  * PERFORMANCE OF THIS SOFTWARE.
  */
 
-/* $Id: dst.h,v 1.46 2004/03/05 05:10:38 marka Exp $ */
+/* $Id: dst.h,v 1.47 2004/03/10 02:19:58 marka Exp $ */
 
 #ifndef DST_DST_H
 #define DST_DST_H 1
@@ -63,6 +63,7 @@ typedef struct dst_context    dst_context_t;
 #define DST_KEY_MAXTEXTSIZE    2048
 
 /* 'Type' for dst_read_key() */
+#define DST_TYPE_KEY           0x1000000       /* KEY key */
 #define DST_TYPE_PRIVATE       0x2000000
 #define DST_TYPE_PUBLIC                0x4000000
 
index eefe95bb3d8b283587c40b28595624213fc4fd86..fbcec39c5e8092a187d6fccb5675c8d510d3f062 100644 (file)
@@ -15,7 +15,7 @@
  * PERFORMANCE OF THIS SOFTWARE.
  */
 
-/* $Id: validator.c,v 1.118 2004/03/05 05:09:26 marka Exp $ */
+/* $Id: validator.c,v 1.119 2004/03/10 02:19:56 marka Exp $ */
 
 #include <config.h>
 
@@ -51,6 +51,8 @@
 #define VALATTR_TRIEDVERIFY            0x0004
 #define VALATTR_NEGATIVE               0x0008
 #define VALATTR_INSECURITY             0x0010
+#define VALATTR_DLV                    0x0020
+#define VALATTR_DLVTRIED               0x0040
 
 #define VALATTR_NEEDNOQNAME            0x0100
 #define VALATTR_NEEDNOWILDCARD         0x0200
 #define VALATTR_FOUNDNOWILDCARD                0x2000
 #define VALATTR_FOUNDNODATA            0x4000
 
+
 #define NEEDNODATA(val) ((val->attributes & VALATTR_NEEDNODATA) != 0)
 #define NEEDNOQNAME(val) ((val->attributes & VALATTR_NEEDNOQNAME) != 0)
 #define NEEDNOWILDCARD(val) ((val->attributes & VALATTR_NEEDNOWILDCARD) != 0)
+#define DLV(val) ((val->attributes & VALATTR_DLV) != 0)
+#define DLVTRIED(val) ((val->attributes & VALATTR_DLVTRIED) != 0)
 
 #define SHUTDOWN(v)            (((v)->attributes & VALATTR_SHUTDOWN) != 0)
 
@@ -77,7 +82,7 @@ static isc_result_t
 validate(dns_validator_t *val, isc_boolean_t resume);
 
 static isc_result_t
-validatezonekey(dns_validator_t *val, isc_boolean_t resume);
+validatezonekey(dns_validator_t *val);
 
 static isc_result_t
 nsecvalidate(dns_validator_t *val, isc_boolean_t resume);
@@ -99,6 +104,9 @@ validator_logcreate(dns_validator_t *val,
                    dns_name_t *name, dns_rdatatype_t type,
                    const char *caller, const char *operation);
 
+static isc_result_t
+dlv_validatezonekey(dns_validator_t *val);
+
 static void
 validator_done(dns_validator_t *val, isc_result_t result) {
        isc_task_t *task;
@@ -269,7 +277,19 @@ dsfetched(isc_task_t *task, isc_event_t *event) {
                validator_log(val, ISC_LOG_DEBUG(3),
                              "dsset with trust %d", rdataset->trust);
                val->dsset = &val->frdataset;
-               result = validatezonekey(val, ISC_TRUE);
+               result = validatezonekey(val);
+               if (result != DNS_R_WAIT)
+                       validator_done(val, result);
+       } else if (val->view->dlv != NULL && !DLVTRIED(val) &&
+                  (eresult == DNS_R_NXRRSET ||
+                   eresult == DNS_R_NCACHENXRRSET) &&
+                  !dns_name_issubdomain(val->event->name,
+                                        val->view->dlv))
+       {
+               validator_log(val, ISC_LOG_DEBUG(2),
+                             "no DS record: looking for DLV");
+
+               result = dlv_validatezonekey(val);
                if (result != DNS_R_WAIT)
                        validator_done(val, result);
        } else if (eresult == DNS_R_NXRRSET ||
@@ -431,7 +451,7 @@ dsvalidated(isc_task_t *task, isc_event_t *event) {
                if ((val->attributes & VALATTR_INSECURITY) != 0)
                        result = proveunsecure(val, ISC_TRUE);
                else
-                       result = validatezonekey(val, ISC_TRUE);
+                       result = validatezonekey(val);
                if (result != DNS_R_WAIT)
                        validator_done(val, result);
        } else {
@@ -1199,6 +1219,304 @@ validate(dns_validator_t *val, isc_boolean_t resume) {
        return (DNS_R_NOVALIDSIG);
 }
 
+
+static void
+dlv_validated(isc_task_t *task, isc_event_t *event) {
+       dns_validatorevent_t *devent;
+       dns_validator_t *val;
+       isc_boolean_t want_destroy;
+       isc_result_t result;
+       isc_result_t eresult;
+
+       UNUSED(task);
+       INSIST(event->ev_type == DNS_EVENT_VALIDATORDONE);
+
+       devent = (dns_validatorevent_t *)event;
+       val = devent->ev_arg;
+       eresult = devent->result;
+
+       isc_event_free(&event);
+       dns_validator_destroy(&val->subvalidator);
+
+       INSIST(val->event != NULL);
+
+       validator_log(val, ISC_LOG_DEBUG(3), "in dsvalidated");
+       LOCK(&val->lock);
+       if (eresult == ISC_R_SUCCESS) {
+               validator_log(val, ISC_LOG_DEBUG(3),
+                             "dlv with trust %d", val->frdataset.trust);
+               if ((val->attributes & VALATTR_INSECURITY) != 0)
+                       result = proveunsecure(val, ISC_TRUE);
+               else
+                       result = validatezonekey(val);
+               if (result != DNS_R_WAIT)
+                       validator_done(val, result);
+       } else {
+               validator_log(val, ISC_LOG_DEBUG(3),
+                             "dlv_validated: got %s",
+                             isc_result_totext(eresult));
+               validator_done(val, eresult);
+       }
+       want_destroy = exit_check(val);
+       UNLOCK(&val->lock);
+       if (want_destroy)
+               destroy(val);
+}
+
+static void
+dlv_fetched(isc_task_t *task, isc_event_t *event) {
+       dns_fetchevent_t *devent;
+       dns_validator_t *val;
+       dns_rdataset_t *rdataset;
+       isc_boolean_t want_destroy;
+       isc_result_t result;
+       isc_result_t eresult;
+
+       UNUSED(task);
+       INSIST(event->ev_type == DNS_EVENT_FETCHDONE);
+       devent = (dns_fetchevent_t *)event;
+       val = devent->ev_arg;
+       rdataset = &val->frdataset;
+       eresult = devent->result;
+
+       isc_event_free(&event);
+       dns_resolver_destroyfetch(&val->fetch);
+
+       INSIST(val->event != NULL);
+
+       validator_log(val, ISC_LOG_DEBUG(3), "in dlv_fetched");
+       LOCK(&val->lock);
+       if (eresult == ISC_R_SUCCESS) {
+               validator_log(val, ISC_LOG_DEBUG(3),
+                             "dlv set with trust %d", rdataset->trust);
+               val->dlv = &val->frdataset;
+               result = dlv_validatezonekey(val);
+               if (result != DNS_R_WAIT)
+                       validator_done(val, result);
+       } else if (eresult == DNS_R_NXRRSET ||
+                  eresult == DNS_R_NCACHENXRRSET)
+       {
+               validator_log(val, ISC_LOG_DEBUG(3),
+                             "falling back to insecurity proof");
+               val->attributes |= VALATTR_INSECURITY;
+               result = proveunsecure(val, ISC_FALSE);
+               if (result != DNS_R_WAIT)
+                       validator_done(val, result);
+       } else {
+               validator_log(val, ISC_LOG_DEBUG(3),
+                             "dlv_fetched: got %s",
+                             isc_result_totext(eresult));
+               if (eresult == ISC_R_CANCELED)
+                       validator_done(val, eresult);
+               else
+                       validator_done(val, DNS_R_NOVALIDDS);
+       }
+       want_destroy = exit_check(val);
+       UNLOCK(&val->lock);
+       if (want_destroy)
+               destroy(val);
+}
+
+static isc_result_t
+dlv_validatezonekey(dns_validator_t *val) {
+       dns_fixedname_t fixed;
+       dns_keytag_t keytag;
+       dns_name_t *name;
+       dns_name_t tname;
+       dns_rdata_dlv_t dlv;
+       dns_rdata_dnskey_t key;
+       dns_rdata_rrsig_t sig;
+       dns_rdata_t dlvrdata = DNS_RDATA_INIT;
+       dns_rdata_t keyrdata = DNS_RDATA_INIT;
+       dns_rdata_t newdsrdata = DNS_RDATA_INIT;
+       dns_rdata_t sigrdata = DNS_RDATA_INIT;
+       dns_rdataset_t trdataset;
+       dst_key_t *dstkey;
+       isc_boolean_t supported_algorithm;
+       isc_result_t result;
+       unsigned char dsbuf[DNS_DS_BUFFERSIZE];
+       unsigned int labels;
+
+       val->attributes |= VALATTR_DLVTRIED;
+
+       dns_name_init(&tname, NULL);
+       dns_fixedname_init(&fixed);
+       name = dns_fixedname_name(&fixed);
+       labels = dns_name_countlabels(val->event->name);
+       dns_name_getlabelsequence(val->event->name, 0, labels - 1, &tname);
+       result = dns_name_concatenate(&tname, val->view->dlv, name, NULL);
+       if (result != ISC_R_SUCCESS) {
+               validator_log(val, ISC_LOG_DEBUG(2),
+                             "DLV concatenate failed");
+               return (DNS_R_NOVALIDSIG);
+       }
+       if (val->dlv == NULL) {
+               result = view_find(val, name, dns_rdatatype_dlv);
+               if (result == ISC_R_SUCCESS) {
+                       /*
+                        * We have DLV records.
+                        */
+                       val->dsset = &val->frdataset;
+                       if (val->frdataset.trust == dns_trust_pending &&
+                           dns_rdataset_isassociated(&val->fsigrdataset))
+                       {
+                               result = create_validator(val,
+                                                         val->event->name,
+                                                         dns_rdatatype_ds,
+                                                         &val->frdataset,
+                                                         &val->fsigrdataset,
+                                                         dlv_validated,
+                                                         "dlv_validatezonekey");
+                               if (result != ISC_R_SUCCESS)
+                                       return (result);
+                               return (DNS_R_WAIT);
+                       } else if (val->frdataset.trust == dns_trust_pending) {
+                               /*
+                                * There should never be an unsigned DLV.
+                                */
+                               dns_rdataset_disassociate(&val->frdataset);
+                               validator_log(val, ISC_LOG_DEBUG(2),
+                                             "unsigned DLV record");
+                               return (DNS_R_NOVALIDSIG);
+                       } else
+                               result = ISC_R_SUCCESS;
+               } else if (result == ISC_R_NOTFOUND) {
+                       result = create_fetch(val, name, dns_rdatatype_dlv,
+                                             dlv_fetched,
+                                             "dlv_validatezonekey");
+                       if (result != ISC_R_SUCCESS)
+                               return (result);
+                       return (DNS_R_WAIT);
+               } else if (result ==  DNS_R_NCACHENXDOMAIN ||
+                  result == DNS_R_NCACHENXRRSET ||
+                  result == DNS_R_NXDOMAIN ||
+                  result == DNS_R_NXRRSET)
+               {
+                       /*
+                        * The DS does not exist.
+                        */
+                       if (dns_rdataset_isassociated(&val->frdataset))
+                               dns_rdataset_disassociate(&val->frdataset);
+                       if (dns_rdataset_isassociated(&val->fsigrdataset))
+                               dns_rdataset_disassociate(&val->fsigrdataset);
+                       validator_log(val, ISC_LOG_DEBUG(2), "no DLV record");
+                       return (DNS_R_NOVALIDSIG);
+               }
+       }
+
+       /*
+        * We have a DLV set.
+        */
+       INSIST(val->dlv != NULL);
+
+       if (val->dlv->trust < dns_trust_secure) {
+               val->event->rdataset->trust = dns_trust_answer;
+               val->event->sigrdataset->trust = dns_trust_answer;
+               return (ISC_R_SUCCESS);
+       }
+
+       /*
+        * Look through the DLV record and find the keys that can sign the
+        * key set and the matching signature.  For each such key, attempt
+        * verification.
+        */
+
+       supported_algorithm = ISC_FALSE;
+
+       for (result = dns_rdataset_first(val->dlv);
+            result == ISC_R_SUCCESS;
+            result = dns_rdataset_next(val->dlv))
+       {
+               dns_rdata_reset(&dlvrdata);
+               dns_rdataset_current(val->dlv, &dlvrdata);
+               (void)dns_rdata_tostruct(&dlvrdata, &dlv, NULL);
+
+               if (!dns_resolver_algorithm_supported(val->view->resolver,
+                                                     val->event->name,
+                                                     dlv.algorithm))
+                       continue;
+
+               supported_algorithm = ISC_TRUE;
+
+               dns_rdataset_init(&trdataset);
+               dns_rdataset_clone(val->event->rdataset, &trdataset);
+
+               for (result = dns_rdataset_first(&trdataset);
+                    result == ISC_R_SUCCESS;
+                    result = dns_rdataset_next(&trdataset))
+               {
+                       dns_rdata_reset(&keyrdata);
+                       dns_rdataset_current(&trdataset, &keyrdata);
+                       (void)dns_rdata_tostruct(&keyrdata, &key, NULL);
+                       keytag = compute_keytag(&keyrdata, &key);
+                       if (dlv.key_tag != keytag ||
+                           dlv.algorithm != key.algorithm)
+                               continue;
+                       dns_rdata_reset(&newdsrdata);
+                       result = dns_ds_buildrdata(val->event->name,
+                                                  &keyrdata, dlv.digest_type,
+                                                  dsbuf, &newdsrdata);
+                       if (result != ISC_R_SUCCESS)
+                               continue;
+                       /* Covert to DLV */
+                       newdsrdata.type = dns_rdatatype_dlv;
+                       if (dns_rdata_compare(&dlvrdata, &newdsrdata) == 0)
+                               break;
+               }
+               if (result != ISC_R_SUCCESS) {
+                       validator_log(val, ISC_LOG_DEBUG(3),
+                                     "no KEY matching DLV");
+                       continue;
+               }
+               
+               for (result = dns_rdataset_first(val->event->sigrdataset);
+                    result == ISC_R_SUCCESS;
+                    result = dns_rdataset_next(val->event->sigrdataset))
+               {
+                       dns_rdata_reset(&sigrdata);
+                       dns_rdataset_current(val->event->sigrdataset,
+                                            &sigrdata);
+                       (void)dns_rdata_tostruct(&sigrdata, &sig, NULL);
+                       if (dlv.key_tag != sig.keyid &&
+                           dlv.algorithm != sig.algorithm)
+                               continue;
+
+                       dstkey = NULL;
+                       result = dns_dnssec_keyfromrdata(val->event->name,
+                                                        &keyrdata,
+                                                        val->view->mctx,
+                                                        &dstkey);
+                       if (result != ISC_R_SUCCESS)
+                               /*
+                                * This really shouldn't happen, but...
+                                */
+                               continue;
+
+                       result = verify(val, dstkey, &sigrdata);
+                       dst_key_free(&dstkey);
+                       if (result == ISC_R_SUCCESS)
+                               break;
+               }
+               dns_rdataset_disassociate(&trdataset);
+               if (result == ISC_R_SUCCESS)
+                       break;
+               validator_log(val, ISC_LOG_DEBUG(3), "no SIG matching DLV key");
+       }
+       if (result == ISC_R_SUCCESS) {
+               val->event->rdataset->trust = dns_trust_secure;
+               val->event->sigrdataset->trust = dns_trust_secure;
+               validator_log(val, ISC_LOG_DEBUG(3), "marking as secure");
+               return (result);
+       } else if (result == ISC_R_NOMORE && !supported_algorithm) {
+               val->event->rdataset->trust = dns_trust_answer;
+               val->event->sigrdataset->trust = dns_trust_answer;
+               validator_log(val, ISC_LOG_DEBUG(3),
+                             "no supported algorithm (dlv)");
+               return (ISC_R_SUCCESS);
+       } else
+               return (DNS_R_NOVALIDSIG);
+}
+
 /*
  * Attempts positive response validation of an RRset containing zone keys.
  *
@@ -1209,7 +1527,7 @@ validate(dns_validator_t *val, isc_boolean_t resume) {
  *     Other return codes are possible and all indicate failure.
  */
 static isc_result_t
-validatezonekey(dns_validator_t *val, isc_boolean_t resume) {
+validatezonekey(dns_validator_t *val) {
        isc_result_t result;
        dns_validatorevent_t *event;
        dns_rdataset_t trdataset;
@@ -1225,8 +1543,6 @@ validatezonekey(dns_validator_t *val, isc_boolean_t resume) {
        dst_key_t *dstkey;
        isc_boolean_t supported_algorithm;
 
-       UNUSED(resume);
-
        /*
         * Caller must be holding the validator lock.
         */
@@ -1331,7 +1647,23 @@ validatezonekey(dns_validator_t *val, isc_boolean_t resume) {
                        if (result != ISC_R_SUCCESS)
                                return (result);
                        return (DNS_R_WAIT);
-               } else if (result ==  DNS_R_NCACHENXDOMAIN ||
+               } else if (val->view->dlv != NULL && !DLVTRIED(val) &&
+                          (result == DNS_R_NCACHENXRRSET ||
+                           result == DNS_R_NXRRSET) &&
+                          !dns_name_issubdomain(val->event->name,
+                                                val->view->dlv))
+               {
+
+                       if (dns_rdataset_isassociated(&val->frdataset))
+                               dns_rdataset_disassociate(&val->frdataset);
+                       if (dns_rdataset_isassociated(&val->fsigrdataset))
+                               dns_rdataset_disassociate(&val->fsigrdataset);
+
+                       validator_log(val, ISC_LOG_DEBUG(2),
+                                     "no DS record: looking for DLV");
+
+                       return (dlv_validatezonekey(val));
+                } else if (result ==  DNS_R_NCACHENXDOMAIN ||
                           result == DNS_R_NCACHENXRRSET ||
                           result == DNS_R_NXDOMAIN ||
                           result == DNS_R_NXRRSET)
@@ -1449,6 +1781,14 @@ validatezonekey(dns_validator_t *val, isc_boolean_t resume) {
                event->sigrdataset->trust = dns_trust_secure;
                validator_log(val, ISC_LOG_DEBUG(3), "marking as secure");
                return (result);
+       } else if (result == ISC_R_NOMORE && val->view->dlv != NULL &&
+                  !DLVTRIED(val) && !dns_name_issubdomain(val->event->name,
+                                                          val->view->dlv))
+       {
+               validator_log(val, ISC_LOG_DEBUG(2),
+                             "no DS/DNSKEY pair: looking for DLV");
+
+               return (dlv_validatezonekey(val));
        } else if (result == ISC_R_NOMORE && !supported_algorithm) {
                val->event->rdataset->trust = dns_trust_answer;
                val->event->sigrdataset->trust = dns_trust_answer;
@@ -1476,7 +1816,7 @@ start_positive_validation(dns_validator_t *val) {
        if (val->event->type != dns_rdatatype_dnskey || !isselfsigned(val))
                return (validate(val, ISC_FALSE));
 
-       return (validatezonekey(val, ISC_FALSE));
+       return (validatezonekey(val));
 }
 
 static isc_result_t
@@ -2033,6 +2373,7 @@ dns_validator_create(dns_view_t *view, dns_name_t *name, dns_rdatatype_t type,
        val->currentset = NULL;
        val->keyset = NULL;
        val->dsset = NULL;
+       val->dlv = NULL;
        val->soaset = NULL;
        val->nsecset = NULL;
        val->soaname = NULL;
index a5e2b36eb5653700d69813721d93355e4f215f29..b3848c1cc36f91efc4aeba8fb8c6f379eb01e7ab 100644 (file)
@@ -15,7 +15,7 @@
  * PERFORMANCE OF THIS SOFTWARE.
  */
 
-/* $Id: view.c,v 1.125 2004/03/05 05:09:26 marka Exp $ */
+/* $Id: view.c,v 1.126 2004/03/10 02:19:56 marka Exp $ */
 
 #include <config.h>
 
@@ -168,6 +168,8 @@ dns_view_create(isc_mem_t *mctx, dns_rdataclass_t rdclass,
        view->dstport = 53;
        view->preferred_glue = 0;
        view->flush = ISC_FALSE;
+       view->dlv = NULL;
+       dns_fixedname_init(&view->dlv_fixed);
 
        result = dns_order_create(view->mctx, &view->order);
        if (result != ISC_R_SUCCESS)
index 2584748fd540888c7c9ff7208ef163c228b1f3ae..291893f939dc1cc0e14c40792e96ce4086a8f33c 100644 (file)
@@ -15,7 +15,7 @@
  * PERFORMANCE OF THIS SOFTWARE.
  */
 
-/* $Id: namedconf.c,v 1.29 2004/03/05 05:12:22 marka Exp $ */
+/* $Id: namedconf.c,v 1.30 2004/03/10 02:19:58 marka Exp $ */
 
 #include <config.h>
 
@@ -691,7 +691,8 @@ view_clauses[] = {
        { "root-delegation-only",  &cfg_type_optional_exclude, 0 },
        { "disable-algorithms", &cfg_type_disablealgorithm,
          CFG_CLAUSEFLAG_MULTI },
-       { "enable-dnssec", &cfg_type_boolean, 0 },
+       { "dnssec-enable", &cfg_type_boolean, 0 },
+       { "dnssec-lookaside", &cfg_type_astring, 0 },
        { NULL, NULL, 0 }
 };