]> git.ipfire.org Git - thirdparty/bind9.git/commitdiff
3177. [func] 'rndc keydone', remove the indicator record that
authorMark Andrews <marka@isc.org>
Tue, 25 Oct 2011 01:54:22 +0000 (01:54 +0000)
committerMark Andrews <marka@isc.org>
Tue, 25 Oct 2011 01:54:22 +0000 (01:54 +0000)
                        named has finished signing the zone with the
                        corresponding key.  [RT #26206]

21 files changed:
CHANGES
bin/dnssec/dnssec-dsfromkey.c
bin/dnssec/dnssec-dsfromkey.docbook
bin/named/control.c
bin/named/include/named/control.h
bin/named/include/named/server.h
bin/named/server.c
bin/rndc/rndc.c
bin/tests/system/inline/clean.sh
bin/tests/system/inline/ns1/named.conf
bin/tests/system/inline/ns1/root.db.in [new file with mode: 0644]
bin/tests/system/inline/ns1/sign.sh [new file with mode: 0644]
bin/tests/system/inline/ns3/named.conf
bin/tests/system/inline/ns3/sign.sh
bin/tests/system/inline/ns6/named.conf [new file with mode: 0644]
bin/tests/system/inline/setup.sh
bin/tests/system/inline/tests.sh
doc/arm/Bv9ARM-book.xml
lib/dns/include/dns/events.h
lib/dns/include/dns/zone.h
lib/dns/zone.c

diff --git a/CHANGES b/CHANGES
index aeefe843f0f480e9d67aa7d310b10d904a835e12..f844d749d2c884201d941ab0d6dfd7ab6a225db0 100644 (file)
--- a/CHANGES
+++ b/CHANGES
@@ -1,3 +1,7 @@
+3177.  [func]          'rndc keydone', remove the indicator record that
+                       named has finished signing the zone with the
+                       corresponding key.  [RT #26206]
+
 3176.  [doc]           Corrected example code and added a README to the
                        sample external DLZ module in contrib/dlz/example.
                        [RT #26215]
index 118f869338379e3f084c47079c40c2615b1d688c..3d6be2905f05f467c62b1a0f705157bca80812eb 100644 (file)
@@ -14,7 +14,7 @@
  * PERFORMANCE OF THIS SOFTWARE.
  */
 
-/* $Id: dnssec-dsfromkey.c,v 1.23 2011/09/03 05:51:29 each Exp $ */
+/* $Id: dnssec-dsfromkey.c,v 1.24 2011/10/25 01:54:18 marka Exp $ */
 
 /*! \file */
 
@@ -62,6 +62,7 @@ static dns_rdataclass_t rdclass;
 static dns_fixedname_t fixed;
 static dns_name_t      *name = NULL;
 static isc_mem_t       *mctx = NULL;
+static isc_uint32_t    ttl;
 
 static isc_result_t
 initname(char *setname) {
@@ -294,6 +295,9 @@ emit(unsigned int dtype, isc_boolean_t showall, char *lookaside,
        isc_buffer_usedregion(&nameb, &r);
        printf("%.*s ", (int)r.length, r.base);
 
+       if (ttl != 0U)
+               printf("%u ", ttl);
+
        isc_buffer_usedregion(&classb, &r);
        printf("%.*s", (int)r.length, r.base);
 
@@ -329,6 +333,7 @@ usage(void) {
        fprintf(stderr, "    -l: add lookaside zone and print DLV records\n");
        fprintf(stderr, "    -s: read keyset from keyset-<dnsname> file\n");
        fprintf(stderr, "    -c class: rdata class for DS set (default: IN)\n");
+       fprintf(stderr, "    -T TTL\n");
        fprintf(stderr, "    -f file: read keyset from zone file\n");
        fprintf(stderr, "    -A: when used with -f, "
                        "include all keys in DS set, not just KSKs\n");
@@ -368,7 +373,7 @@ main(int argc, char **argv) {
        isc_commandline_errprint = ISC_FALSE;
 
        while ((ch = isc_commandline_parse(argc, argv,
-                                          "12Aa:c:d:Ff:K:l:sv:h")) != -1) {
+                                          "12Aa:c:d:Ff:K:l:sT:v:h")) != -1) {
                switch (ch) {
                case '1':
                        dtype = DNS_DSDIGEST_SHA1;
@@ -408,6 +413,9 @@ main(int argc, char **argv) {
                case 's':
                        usekeyset = ISC_TRUE;
                        break;
+               case 'T':
+                       ttl = atol(isc_commandline_argument);
+                       break;
                case 'v':
                        verbose = strtol(isc_commandline_argument, &endp, 0);
                        if (*endp != '\0')
index 4e3b9b65680fec9b976dbebcd4bb26940da2e503..a43eadc9f473ebee3d1ded95456073aceae75b94 100644 (file)
@@ -17,7 +17,7 @@
  - PERFORMANCE OF THIS SOFTWARE.
 -->
 
-<!-- $Id: dnssec-dsfromkey.docbook,v 1.16 2011/03/27 06:39:59 marka Exp $ -->
+<!-- $Id: dnssec-dsfromkey.docbook,v 1.17 2011/10/25 01:54:18 marka Exp $ -->
 <refentry id="man.dnssec-dsfromkey">
   <refentryinfo>
     <date>August 26, 2009</date>
@@ -52,6 +52,7 @@
       <arg><option>-2</option></arg>
       <arg><option>-a <replaceable class="parameter">alg</replaceable></option></arg>
       <arg><option>-l <replaceable class="parameter">domain</replaceable></option></arg>
+      <arg><option>-T <replaceable class="parameter">TTL</replaceable></option></arg>
       <arg choice="req">keyfile</arg>
     </cmdsynopsis>
     <cmdsynopsis>
@@ -64,6 +65,7 @@
       <arg><option>-l <replaceable class="parameter">domain</replaceable></option></arg>
       <arg><option>-s</option></arg>
       <arg><option>-c <replaceable class="parameter">class</replaceable></option></arg>
+      <arg><option>-T <replaceable class="parameter">TTL</replaceable></option></arg>
       <arg><option>-f <replaceable class="parameter">file</replaceable></option></arg>
       <arg><option>-A</option></arg>
       <arg><option>-v <replaceable class="parameter">level</replaceable></option></arg>
         </listitem>
       </varlistentry>
 
+      <varlistentry>
+        <term>-T <replaceable class="parameter">TTL</replaceable></term>
+        <listitem>
+          <para>
+            Specifies the TTL of the DS records.
+          </para>
+         </listitem>
+      </varlistentry>
+
       <varlistentry>
         <term>-K <replaceable class="parameter">directory</replaceable></term>
         <listitem>
index 3e5de3e7b46330177e90768e08fd7824a9a44f15..006aba2115601ba7e6661536bcfdd02c9cdbcf3d 100644 (file)
@@ -15,7 +15,7 @@
  * PERFORMANCE OF THIS SOFTWARE.
  */
 
-/* $Id: control.c,v 1.44 2011/08/02 20:36:11 each Exp $ */
+/* $Id: control.c,v 1.45 2011/10/25 01:54:18 marka Exp $ */
 
 /*! \file */
 
@@ -205,6 +205,8 @@ ns_control_docommand(isccc_sexpr_t *message, isc_buffer_t *text) {
                result = ns_server_add_zone(ns_g_server, command);
        } else if (command_compare(command, NS_COMMAND_DELZONE)) {
                result = ns_server_del_zone(ns_g_server, command);
+       } else if (command_compare(command, NS_COMMAND_KEYDONE)) {
+               result = ns_server_keydone(ns_g_server, command);
        } else {
                isc_log_write(ns_g_lctx, NS_LOGCATEGORY_GENERAL,
                              NS_LOGMODULE_CONTROL, ISC_LOG_WARNING,
index 3d451e95f7703cf22fb48bf47d9785d1b2aad55d..31ca427de5cbd5227a515e0f30b7b5f4f3856f55 100644 (file)
@@ -15,7 +15,7 @@
  * PERFORMANCE OF THIS SOFTWARE.
  */
 
-/* $Id: control.h,v 1.34 2011/08/02 20:36:12 each Exp $ */
+/* $Id: control.h,v 1.35 2011/10/25 01:54:19 marka Exp $ */
 
 #ifndef NAMED_CONTROL_H
 #define NAMED_CONTROL_H 1
@@ -64,6 +64,7 @@
 #define NS_COMMAND_ADDZONE     "addzone"
 #define NS_COMMAND_DELZONE     "delzone"
 #define NS_COMMAND_SYNC                "sync"
+#define NS_COMMAND_KEYDONE     "keydone"
 
 isc_result_t
 ns_controls_create(ns_server_t *server, ns_controls_t **ctrlsp);
index 92e6d22422d075ef1bad6a05d60066687592c274..332bef738ca7ca154a34952c53c3bf30efa70f2f 100644 (file)
@@ -15,7 +15,7 @@
  * PERFORMANCE OF THIS SOFTWARE.
  */
 
-/* $Id: server.h,v 1.113 2011/08/02 20:36:12 each Exp $ */
+/* $Id: server.h,v 1.114 2011/10/25 01:54:19 marka Exp $ */
 
 #ifndef NAMED_SERVER_H
 #define NAMED_SERVER_H 1
@@ -342,4 +342,10 @@ ns_server_add_zone(ns_server_t *server, char *args);
 isc_result_t
 ns_server_del_zone(ns_server_t *server, char *args);
 
+/*%
+ * Deletes the matching key done private record from the zone.
+ */
+isc_result_t
+ns_server_keydone(ns_server_t *server, char *args);
+
 #endif /* NAMED_SERVER_H */
index c46d4ee3151d3507c0d1f477407b71862f663167..18fa5317b367fe67b93d429ded21d2aa8b455181 100644 (file)
@@ -15,7 +15,7 @@
  * PERFORMANCE OF THIS SOFTWARE.
  */
 
-/* $Id: server.c,v 1.622 2011/10/14 05:38:49 marka Exp $ */
+/* $Id: server.c,v 1.623 2011/10/25 01:54:19 marka Exp $ */
 
 /*! \file */
 
@@ -5912,7 +5912,7 @@ next_token(char **stringp, const char *delim) {
  */
 static isc_result_t
 zone_from_args(ns_server_t *server, char *args, dns_zone_t **zonep,
-              const char **zonename)
+              const char **zonename, isc_boolean_t skip)
 {
        char *input, *ptr;
        const char *zonetxt;
@@ -5928,10 +5928,12 @@ zone_from_args(ns_server_t *server, char *args, dns_zone_t **zonep,
 
        input = args;
 
-       /* Skip the command name. */
-       ptr = next_token(&input, " \t");
-       if (ptr == NULL)
-               return (ISC_R_UNEXPECTEDEND);
+       if (skip) {
+               /* Skip the command name. */
+               ptr = next_token(&input, " \t");
+               if (ptr == NULL)
+                       return (ISC_R_UNEXPECTEDEND);
+       }
 
        /* Look for the zone name. */
        zonetxt = next_token(&input, " \t");
@@ -5999,7 +6001,7 @@ ns_server_retransfercommand(ns_server_t *server, char *args) {
        dns_zone_t *zone = NULL;
        dns_zonetype_t type;
 
-       result = zone_from_args(server, args, &zone, NULL);
+       result = zone_from_args(server, args, &zone, NULL, ISC_TRUE);
        if (result != ISC_R_SUCCESS)
                return (result);
        if (zone == NULL)
@@ -6023,7 +6025,7 @@ ns_server_reloadcommand(ns_server_t *server, char *args, isc_buffer_t *text) {
        dns_zonetype_t type;
        const char *msg = NULL;
 
-       result = zone_from_args(server, args, &zone, NULL);
+       result = zone_from_args(server, args, &zone, NULL, ISC_TRUE);
        if (result != ISC_R_SUCCESS)
                return (result);
        if (zone == NULL) {
@@ -6083,7 +6085,7 @@ ns_server_notifycommand(ns_server_t *server, char *args, isc_buffer_t *text) {
        dns_zone_t *zone = NULL;
        const unsigned char msg[] = "zone notify queued";
 
-       result = zone_from_args(server, args, &zone, NULL);
+       result = zone_from_args(server, args, &zone, NULL, ISC_TRUE);
        if (result != ISC_R_SUCCESS)
                return (result);
        if (zone == NULL)
@@ -6108,7 +6110,7 @@ ns_server_refreshcommand(ns_server_t *server, char *args, isc_buffer_t *text) {
        const unsigned char msg2[] = "not a slave or stub zone";
        dns_zonetype_t type;
 
-       result = zone_from_args(server, args, &zone, NULL);
+       result = zone_from_args(server, args, &zone, NULL, ISC_TRUE);
        if (result != ISC_R_SUCCESS)
                return (result);
        if (zone == NULL)
@@ -7216,7 +7218,7 @@ ns_server_rekey(ns_server_t *server, char *args) {
        if (strncasecmp(args, NS_COMMAND_SIGN, strlen(NS_COMMAND_SIGN)) == 0)
            fullsign = ISC_TRUE;
 
-       result = zone_from_args(server, args, &zone, NULL);
+       result = zone_from_args(server, args, &zone, NULL, ISC_TRUE);
        if (result != ISC_R_SUCCESS)
                return (result);
        if (zone == NULL)
@@ -7283,7 +7285,7 @@ ns_server_sync(ns_server_t *server, char *args, isc_buffer_t *text) {
                (void) next_token(&args, " \t");
        }
 
-       result = zone_from_args(server, args, &zone, NULL);
+       result = zone_from_args(server, args, &zone, NULL, ISC_TRUE);
        if (result != ISC_R_SUCCESS)
                return (result);
 
@@ -7359,7 +7361,7 @@ ns_server_freeze(ns_server_t *server, isc_boolean_t freeze, char *args,
        isc_boolean_t frozen;
        const char *msg = NULL;
 
-       result = zone_from_args(server, args, &zone, NULL);
+       result = zone_from_args(server, args, &zone, NULL, ISC_TRUE);
        if (result != ISC_R_SUCCESS)
                return (result);
        if (zone == NULL) {
@@ -7687,7 +7689,7 @@ ns_server_del_zone(ns_server_t *server, char *args) {
        FILE                  *ifp = NULL, *ofp = NULL;
 
        /* Parse parameters */
-       CHECK(zone_from_args(server, args, &zone, &zonename));
+       CHECK(zone_from_args(server, args, &zone, &zonename, ISC_TRUE));
        if (result != ISC_R_SUCCESS)
                return (result);
        if (zone == NULL) {
@@ -7855,3 +7857,47 @@ newzone_cfgctx_destroy(void **cfgp) {
        isc_mem_putanddetach(&cfg->mctx, cfg, sizeof(*cfg));
        *cfgp = NULL;
 }
+
+/*
+ * Act on a "keydone" command from the command channel.
+ */
+isc_result_t
+ns_server_keydone(ns_server_t *server, char *args) {
+       isc_result_t result;
+       dns_zone_t *zone = NULL;
+       const char *ptr = NULL;
+
+       ptr = next_token(&args, " \t");
+       if (ptr == NULL)
+               return (ISC_R_UNEXPECTEDEND);
+
+       ptr = next_token(&args, " \t");
+       if (ptr == NULL)
+               return (ISC_R_UNEXPECTEDEND);
+       /*
+        * Is the rdata sane?
+        */
+       if (strspn(ptr, "0123456789ABCDEFabcdef") != 10U ||
+           strncmp(ptr, "00", 2) == 0 || strcmp(ptr + 6, "0001") != 0)
+               return (DNS_R_SYNTAX);
+
+       /*
+        * Find the zone.
+        */
+       result = zone_from_args(server, args, &zone, NULL, ISC_FALSE);
+       if (result != ISC_R_SUCCESS)
+               return (result);
+       if (zone == NULL)
+               return(ISC_R_NOTFOUND);
+
+       if (dns_zone_gettype(zone) != dns_zone_master) {
+               result = DNS_R_NOTMASTER;
+               goto cleanup;
+       }
+
+       result = dns_zone_keydone(zone, ptr);
+
+ cleanup:
+       dns_zone_detach(&zone);
+       return (result);
+}
index 668d2ca801b76bcf14fc2898c6dec3fabd30572f..b39c5fbb3b6e2140d2a1bbc0abe5444f3aa3a044 100644 (file)
@@ -15,7 +15,7 @@
  * PERFORMANCE OF THIS SOFTWARE.
  */
 
-/* $Id: rndc.c,v 1.134 2011/03/21 15:39:05 each Exp $ */
+/* $Id: rndc.c,v 1.135 2011/10/25 01:54:19 marka Exp $ */
 
 /*! \file */
 
@@ -154,6 +154,9 @@ command is one of the following:\n\
                Add zone to given view. Requires new-zone-file option.\n\
   delzone [\"file\"] zone [class [view]]\n\
                Removes zone from given view. Requires new-zone-file option.\n\
+  keydone rdata zone [class [view]]\n\
+               Remove the private record with the corresponding rdata from\n\
+               the given zone.\n\
 \n\
 * == not yet implemented\n\
 Version: %s\n",
index f0374c9831316abb8906bbd4d0f15219a6186df0..bca624b4a01de5553bcd8a4025806da9175596d2 100644 (file)
 # OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
 # PERFORMANCE OF THIS SOFTWARE.
 
-# $Id: clean.sh,v 1.3 2011/10/12 00:10:19 marka Exp $
+# $Id: clean.sh,v 1.4 2011/10/25 01:54:19 marka Exp $
 
 rm -f */named.memstats
 rm -f */named.run
 rm -f */trusted.conf
+rm -f ns1/K*
+rm -f ns1/dsset-*
+rm -f ns1/root.db
+rm -f ns1/root.db.signed
 rm -f ns2/bits.db
 rm -f ns2/bits.db.jnl
 rm -f ns3/K*
index 6f379b36d67e348bf2dae3a03b7715cc9c481283..b86396239d1ffc6696e96c2f0f0ce7038c4f101c 100644 (file)
@@ -14,7 +14,7 @@
  * PERFORMANCE OF THIS SOFTWARE.
  */
 
-/* $Id: named.conf,v 1.2 2011/08/30 23:46:52 tbox Exp $ */
+/* $Id: named.conf,v 1.3 2011/10/25 01:54:20 marka Exp $ */
 
 // NS1
 
@@ -39,4 +39,4 @@ zone "." {
        file "root.db.signed";
 };
 
-// include "trusted.conf";
+include "trusted.conf";
diff --git a/bin/tests/system/inline/ns1/root.db.in b/bin/tests/system/inline/ns1/root.db.in
new file mode 100644 (file)
index 0000000..cb62f42
--- /dev/null
@@ -0,0 +1,35 @@
+; Copyright (C) 2004, 2007  Internet Systems Consortium, Inc. ("ISC")
+; Copyright (C) 2000, 2001  Internet Software Consortium.
+;
+; Permission to use, copy, modify, and/or 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 ISC DISCLAIMS ALL WARRANTIES WITH
+; REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY
+; AND FITNESS.  IN NO EVENT SHALL ISC 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: root.db.in,v 1.2 2011/10/25 01:54:20 marka Exp $
+
+$TTL 300
+.                      IN SOA  gson.nominum.com. a.root.servers.nil. (
+                               2000042100      ; serial
+                               600             ; refresh
+                               600             ; retry
+                               1200            ; expire
+                               600             ; minimum
+                               )
+.                      NS      a.root-servers.nil.
+a.root-servers.nil.    A       10.53.0.1
+
+bits.                  NS      ns3.bits.
+ns3.bits.              A       10.53.0.3
+bits.                  NS      ns4.bits.
+ns4.bits.              A       10.53.0.4
+
+noixfr.                        NS      ns3.noixfr.
+ns3.noixfr.            A       10.53.0.3
diff --git a/bin/tests/system/inline/ns1/sign.sh b/bin/tests/system/inline/ns1/sign.sh
new file mode 100644 (file)
index 0000000..3f25d61
--- /dev/null
@@ -0,0 +1,41 @@
+#!/bin/sh -e
+#
+# Copyright (C) 2011  Internet Systems Consortium, Inc. ("ISC")
+#
+# Permission to use, copy, modify, and/or 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 ISC DISCLAIMS ALL WARRANTIES WITH
+# REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY
+# AND FITNESS.  IN NO EVENT SHALL ISC 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: sign.sh,v 1.2 2011/10/25 01:54:20 marka Exp $
+
+SYSTEMTESTTOP=../..
+. $SYSTEMTESTTOP/conf.sh
+
+RANDFILE=../random.data
+
+zone=.
+rm -f K.+*+*.key
+rm -f K.+*+*.private
+keyname=`$KEYGEN -q -r $RANDFILE -a RSASHA1 -b 768 -n zone $zone`
+keyname=`$KEYGEN -q -r $RANDFILE -a RSASHA1 -b 1024 -n zone -f KSK $zone`
+$SIGNER -S -x -T 1200 -o ${zone} root.db
+
+cat ${keyname}.key | grep -v '^; ' | $PERL -n -e '
+local ($dn, $class, $type, $flags, $proto, $alg, @rest) = split;
+local $key = join("", @rest);
+print <<EOF
+trusted-keys {
+    "$dn" $flags $proto $alg "$key";
+};
+EOF
+' > trusted.conf
+
+cp trusted.conf ../ns6/trusted.conf
index a17c07e17d8a3be09531b252cdaf2b7495c03991..dbf747f4fffcfa3498c4f02aef6fb0de1e80e112 100644 (file)
  * PERFORMANCE OF THIS SOFTWARE.
  */
 
-/* $Id: named.conf,v 1.2 2011/08/30 23:46:52 tbox Exp $ */
+/* $Id: named.conf,v 1.3 2011/10/25 01:54:20 marka Exp $ */
 
-// NS2
+// NS3
 
-controls { /* empty */ };
+include "../../common/rndc.key";
+
+controls { inet 10.53.0.3 port 9953 allow { any; } keys { rndc_key; }; };
 
 options {
        query-source address 10.53.0.3;
index cf0095c6265ef87dbb1b01d8877ecc3487719e44..7625cd094f86213fd80946c30ff1080ccdc42a7e 100644 (file)
@@ -14,7 +14,7 @@
 # OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
 # PERFORMANCE OF THIS SOFTWARE.
 
-# $Id: sign.sh,v 1.2 2011/08/30 23:46:52 tbox Exp $
+# $Id: sign.sh,v 1.3 2011/10/25 01:54:20 marka Exp $
 
 SYSTEMTESTTOP=../..
 . $SYSTEMTESTTOP/conf.sh
@@ -26,9 +26,11 @@ rm -f K${zone}.+*+*.key
 rm -f K${zone}.+*+*.private
 keyname=`$KEYGEN -q -r $RANDFILE -a RSASHA1 -b 768 -n zone $zone`
 keyname=`$KEYGEN -q -r $RANDFILE -a RSASHA1 -b 1024 -n zone -f KSK $zone`
+$DSFROMKEY -T 1200 $keyname >> ../ns1/root.db
 
 zone=noixfr
 rm -f K${zone}.+*+*.key
 rm -f K${zone}.+*+*.private
 keyname=`$KEYGEN -q -r $RANDFILE -a RSASHA1 -b 768 -n zone $zone`
 keyname=`$KEYGEN -q -r $RANDFILE -a RSASHA1 -b 1024 -n zone -f KSK $zone`
+$DSFROMKEY -T 1200 $keyname >> ../ns1/root.db
diff --git a/bin/tests/system/inline/ns6/named.conf b/bin/tests/system/inline/ns6/named.conf
new file mode 100644 (file)
index 0000000..b7108ad
--- /dev/null
@@ -0,0 +1,43 @@
+/*
+ * Copyright (C) 2011  Internet Systems Consortium, Inc. ("ISC")
+ *
+ * Permission to use, copy, modify, and/or 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 ISC DISCLAIMS ALL WARRANTIES WITH
+ * REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY
+ * AND FITNESS.  IN NO EVENT SHALL ISC 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: named.conf,v 1.2 2011/10/25 01:54:21 marka Exp $ */
+
+// NS6
+
+include "../../common/rndc.key";
+
+controls { inet 10.53.0.6 port 9953 allow { any; } keys { rndc_key; }; };
+
+options {
+       query-source address 10.53.0.6;
+       notify-source 10.53.0.6;
+       transfer-source 10.53.0.6;
+       port 5300;
+       pid-file "named.pid";
+       listen-on { 10.53.0.6; };
+       listen-on-v6 { none; };
+       recursion yes;
+       notify yes;
+       notify-delay 0;
+};
+
+zone "." {
+       type hint;
+       file "../../common/root.hint";
+};
+
+include "trusted.conf";
index 83ade8cea5c3221f5275018ffa6b6ed1222bce67..5dd3285ee3794301b8399f263c6b1f5ad78bed6d 100644 (file)
 # OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
 # PERFORMANCE OF THIS SOFTWARE.
 
-# $Id: setup.sh,v 1.3 2011/10/12 00:10:19 marka Exp $
+# $Id: setup.sh,v 1.4 2011/10/25 01:54:19 marka Exp $
 
 sh clean.sh
 
+cp ns1/root.db.in ns1/root.db
+rm -f ns1/root.db.signed
+
 touch ns2/trusted.conf
 cp ns2/bits.db.in ns2/bits.db
 rm -f ns2/bits.db.jnl
@@ -39,3 +42,4 @@ cp ns5/named.conf.pre ns5/named.conf
 ../../../tools/genrandom 400 random.data
 
 (cd ns3; sh -e sign.sh)
+(cd ns1; sh -e sign.sh)
index 72ba25e53f41022deca9ee159ed0119ea4370237..24d21449a5547b7a5fcf8163985477cbddd325d6 100644 (file)
@@ -14,7 +14,7 @@
 # OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
 # PERFORMANCE OF THIS SOFTWARE.
 
-# $Id: tests.sh,v 1.3 2011/10/12 00:10:19 marka Exp $
+# $Id: tests.sh,v 1.4 2011/10/25 01:54:20 marka Exp $
 
 SYSTEMTESTTOP=..
 . $SYSTEMTESTTOP/conf.sh
@@ -34,7 +34,7 @@ do
        $DIG $DIGOPTS @10.53.0.3 -p 5300 bits TYPE65534 > dig.out.ns3.test$n
        grep "status: NOERROR" dig.out.ns3.test$n > /dev/null || ret=1
        grep "ANSWER: 3," dig.out.ns3.test$n > /dev/null || ret=1
-       records=`grep "TYPE65534.*05[0-9A-F][0-9A-F][0-9A-F][0-9A-F]0001" dig.out.ns3.test$n | wc -l`
+       records=`grep 'TYPE65534.*05[0-9A-F][0-9A-F][0-9A-F][0-9A-F]0001$' dig.out.ns3.test$n | wc -l`
        [ $records = 2 ] || ret=1
        if [ $ret = 0 ]; then break; fi
        sleep 1
@@ -42,6 +42,75 @@ done
 if [ $ret != 0 ]; then echo "I:failed"; fi
 status=`expr $status + $ret`
 
+n=`expr $n + 1`
+echo "I:checking removal of private type record via 'rndc keydone' ($n)"
+ret=0
+$DIG $DIGOPTS @10.53.0.3 -p 5300 bits TYPE65534 > dig.out.ns3.test$n
+records=`sed -n -e 's/.*TYPE65534.*\(05[0-9A-F][0-9A-F][0-9A-F][0-9A-F]0001\)$/\1/p' dig.out.ns3.test$n`
+for record in $records
+do
+       $RNDC -c ../common/rndc.conf -s 10.53.0.3 -p 9953 keydone "${record}" bits || ret=1
+       break;  # We only want to remove 1 record for now.
+done 2>&1 |sed 's/^/I:ns3 /'
+
+for i in 1 2 3 4 5 6 7 8 9 10
+do
+       ans=0
+       $DIG $DIGOPTS @10.53.0.3 -p 5300 bits TYPE65534 > dig.out.ns3.test$n
+       grep "ANSWER: 2," dig.out.ns3.test$n > /dev/null || ans=1
+       [ $ans = 1 ] || break
+       sleep 1
+done
+[ $ans = 0 ] || ret=1
+
+if [ $ret != 0 ]; then echo "I:failed"; fi
+status=`expr $status + $ret`
+
+n=`expr $n + 1`
+echo "I:checking private type was properly signed ($n)"
+ret=0
+$DIG $DIGOPTS @10.53.0.6 -p 5300 bits TYPE65534 > dig.out.ns6.test$n
+grep "ANSWER: 2," dig.out.ns6.test$n > /dev/null || ret=1
+grep "flags:.* ad[ ;]" dig.out.ns6.test$n > /dev/null || ret=1
+
+if [ $ret != 0 ]; then echo "I:failed"; fi
+status=`expr $status + $ret`
+
+n=`expr $n + 1`
+echo "I:checking removal of remaining private type record via 'rndc keydone' ($n)"
+ret=0
+$DIG $DIGOPTS @10.53.0.3 -p 5300 bits TYPE65534 > dig.out.ns3.test$n
+records=`sed -n -e 's/.*TYPE65534.*\(05[0-9A-F][0-9A-F][0-9A-F][0-9A-F]0001\)$/\1/p' dig.out.ns3.test$n`
+for record in $records
+do
+       $RNDC -c ../common/rndc.conf -s 10.53.0.3 -p 9953 keydone "${record}" bits || ret=1
+done 2>&1 |sed 's/^/I:ns3 /'
+
+for i in 1 2 3 4 5 6 7 8 9 10
+do
+       ans=0
+       $DIG $DIGOPTS @10.53.0.3 -p 5300 bits TYPE65534 > dig.out.ns3.test$n
+       grep "ANSWER: 0," dig.out.ns3.test$n > /dev/null || ans=1
+       grep "status: NOERROR" dig.out.ns3.test$n > /dev/null || ans=1
+       [ $ans = 1 ] || break
+       sleep 1
+done
+[ $ans = 0 ] || ret=1
+
+if [ $ret != 0 ]; then echo "I:failed"; fi
+status=`expr $status + $ret`
+
+n=`expr $n + 1`
+echo "I:checking negative private type response was properly signed ($n)"
+ret=0
+$DIG $DIGOPTS @10.53.0.6 -p 5300 bits TYPE65534 > dig.out.ns6.test$n
+grep "status: NOERROR" dig.out.ns6.test$n > /dev/null || ret=1
+grep "ANSWER: 0," dig.out.ns6.test$n > /dev/null || ret=1
+grep "flags:.* ad[ ;]" dig.out.ns6.test$n > /dev/null || ret=1
+
+if [ $ret != 0 ]; then echo "I:failed"; fi
+status=`expr $status + $ret`
+
 $NSUPDATE << EOF
 zone bits
 server 10.53.0.2 5300
@@ -195,7 +264,7 @@ status=`expr $status + $ret`
 n=`expr $n + 1`
 echo "I:restart bump in the wire signer server ($n)"
 ret=0
-$PERL ../start.pl --noclean . ns3 || ret=1
+$PERL ../start.pl --noclean --restart . ns3 || ret=1
 if [ $ret != 0 ]; then echo "I:failed"; fi
 status=`expr $status + $ret`
 
index 218abcfc36408033f26ca94fb010183de3ca3615..a77f99d10caa4b248733ba547a044e6bc2569aa4 100644 (file)
@@ -18,7 +18,7 @@
  - PERFORMANCE OF THIS SOFTWARE.
 -->
 
-<!-- File: $Id: Bv9ARM-book.xml,v 1.506 2011/10/13 23:44:47 tbox Exp $ -->
+<!-- File: $Id: Bv9ARM-book.xml,v 1.507 2011/10/25 01:54:21 marka Exp $ -->
 <book xmlns:xi="http://www.w3.org/2001/XInclude">
   <title>BIND 9 Administrator Reference Manual</title>
 
@@ -1555,6 +1555,28 @@ zone "eng.example.com" {
                     </listitem>
                   </varlistentry>
 
+                  <varlistentry>
+                    <term><userinput>keydone
+                        <replaceable>rdata</replaceable>
+                        <replaceable>zone</replaceable>
+                        <optional><replaceable>class</replaceable>
+                        <optional><replaceable>view</replaceable></optional></optional>
+                    </userinput></term>
+                    <listitem>
+                      <para>
+                       Remove the <command>sig-signing-type</command> record
+                       which matches the <replaceable>rdata</replaceable>
+                       (in hexadecimal) from the specified zone.  Only
+                       <replaceable>rdata</replaceable> that
+                       indicate that named has finished signing the zone
+                       with the corresponding key will be removed. (i.e.
+                       the first two characters are not "00", the
+                       last four characters are "0001" and the total
+                       length is 10 hexadecimal characters.
+                      </para>
+                    </listitem>
+                  </varlistentry>
+
                 </variablelist>
 
                 <para>
@@ -8704,6 +8726,15 @@ avoid-v6-udp-ports { 40000; range 50000 60000; };
                  It is expected that this parameter may be removed
                  in a future version once there is a standard type.
                </para>
+               <para>
+                 These records can be removed from the zone once named
+                 has completed signing the zone with the matching key
+                 using <command>nsupdate</command> or
+                 <command>rndc keydone</command>.
+                 <command>rndc keydone</command> is the only supported
+                 way to remove these records from
+                 <command>inline-signing</command> zones.
+               </para>
              </listitem>
            </varlistentry>
 
index 723f9ca275292d906637b3fcd8ab7c9135bf553c..3ff3576f1a547c41a11fdc85d2456e140102b861 100644 (file)
@@ -15,7 +15,7 @@
  * PERFORMANCE OF THIS SOFTWARE.
  */
 
-/* $Id: events.h,v 1.59 2011/09/02 21:15:36 each Exp $ */
+/* $Id: events.h,v 1.60 2011/10/25 01:54:22 marka Exp $ */
 
 #ifndef DNS_EVENTS_H
 #define DNS_EVENTS_H 1
@@ -77,6 +77,7 @@
 #define DNS_EVENT_ZONESECURESERIAL             (ISC_EVENTCLASS_DNS + 47)
 #define DNS_EVENT_ZONESECUREDB                 (ISC_EVENTCLASS_DNS + 48)
 #define DNS_EVENT_ZONELOAD                     (ISC_EVENTCLASS_DNS + 49)
+#define DNS_EVENT_KEYDONE                      (ISC_EVENTCLASS_DNS + 50)
 
 #define DNS_EVENT_FIRSTEVENT                   (ISC_EVENTCLASS_DNS + 0)
 #define DNS_EVENT_LASTEVENT                    (ISC_EVENTCLASS_DNS + 65535)
index 714b88bedb7ef97ae9045bdf729c115a8c1ba9ac..c4efe075fd0fed82394310d1c3225f238965257a 100644 (file)
@@ -15,7 +15,7 @@
  * PERFORMANCE OF THIS SOFTWARE.
  */
 
-/* $Id: zone.h,v 1.194 2011/09/06 22:29:33 smann Exp $ */
+/* $Id: zone.h,v 1.195 2011/10/25 01:54:22 marka Exp $ */
 
 #ifndef DNS_ZONE_H
 #define DNS_ZONE_H 1
@@ -1978,6 +1978,9 @@ dns_zone_link(dns_zone_t *zone, dns_zone_t *raw);
 void
 dns_zone_getraw(dns_zone_t *zone, dns_zone_t **raw);
 
+isc_result_t
+dns_zone_keydone(dns_zone_t *zone, const char *data);
+
 ISC_LANG_ENDDECLS
 
 #endif /* DNS_ZONE_H */
index c53bb6d65dfa7b8a55747524ced3714793327da7..4a326d1617863b02ae08b4427538ef069c3c78cc 100644 (file)
@@ -15,7 +15,7 @@
  * PERFORMANCE OF THIS SOFTWARE.
  */
 
-/* $Id: zone.c,v 1.636 2011/10/20 21:20:02 marka Exp $ */
+/* $Id: zone.c,v 1.637 2011/10/25 01:54:22 marka Exp $ */
 
 /*! \file */
 
@@ -23,6 +23,7 @@
 #include <errno.h>
 
 #include <isc/file.h>
+#include <isc/hex.h>
 #include <isc/mutex.h>
 #include <isc/print.h>
 #include <isc/random.h>
@@ -30,9 +31,9 @@
 #include <isc/refcount.h>
 #include <isc/rwlock.h>
 #include <isc/serial.h>
-#include <isc/strerror.h>
 #include <isc/stats.h>
 #include <isc/stdtime.h>
+#include <isc/strerror.h>
 #include <isc/string.h>
 #include <isc/taskpool.h>
 #include <isc/timer.h>
@@ -15319,3 +15320,144 @@ dns_zone_getraw(dns_zone_t *zone, dns_zone_t **raw) {
                dns_zone_attach(zone->raw, raw);
        UNLOCK(&zone->lock);
 }
+
+struct keydone {
+       isc_event_t event;
+       unsigned int data[5];
+};
+
+static void
+keydone(isc_task_t *task, isc_event_t *event) {
+       const char *me = "keydone";
+       isc_boolean_t commit = ISC_FALSE;
+       isc_result_t result;
+       dns_rdata_t rdata = DNS_RDATA_INIT;
+       dns_dbversion_t *oldver = NULL, *newver = NULL;
+       dns_zone_t *zone;
+       dns_db_t *db = NULL;
+       dns_dbnode_t *node = NULL;
+       dns_rdataset_t rdataset;
+       dns_diff_t diff;
+       isc_boolean_t have_rr = ISC_FALSE;
+       struct keydone *keydone = (struct keydone *)event;
+       dns_update_log_t log = { update_log_cb, NULL };
+
+       UNUSED(task);
+
+       zone = event->ev_arg;
+       INSIST(DNS_ZONE_VALID(zone));
+
+       ENTER;
+
+       dns_rdataset_init(&rdataset);
+       dns_diff_init(zone->mctx, &diff);
+
+       ZONEDB_LOCK(&zone->dblock, isc_rwlocktype_read);
+       if (zone->db != NULL) {
+               dns_db_attach(zone->db, &db);
+               dns_db_currentversion(db, &oldver);
+               result = dns_db_newversion(db, &newver);
+               if (result != ISC_R_SUCCESS) {
+                       dns_zone_log(zone, ISC_LOG_ERROR,
+                                    "keydone:dns_db_newversion -> %s\n",
+                                    dns_result_totext(result));
+                       goto failure;
+               }
+       } 
+       ZONEDB_UNLOCK(&zone->dblock, isc_rwlocktype_read);
+       if (db == NULL)
+               goto failure;
+
+       result = dns_db_getoriginnode(db, &node);
+       if (result != ISC_R_SUCCESS)
+               goto failure;
+
+       result = dns_db_findrdataset(db, node, newver, zone->privatetype,
+                                    dns_rdatatype_none, 0, &rdataset, NULL);
+       if (result == ISC_R_NOTFOUND) {
+               INSIST(!dns_rdataset_isassociated(&rdataset));
+               goto failure;
+       }
+       if (result != ISC_R_SUCCESS) {
+               INSIST(!dns_rdataset_isassociated(&rdataset));
+               goto failure;
+       }
+       for (result = dns_rdataset_first(&rdataset);
+            result == ISC_R_SUCCESS;
+            result = dns_rdataset_next(&rdataset)) {
+               dns_rdataset_current(&rdataset, &rdata);
+               if (rdata.length != 5 ||
+                   memcmp(rdata.data, keydone->data, 5) != 0) {
+                       dns_rdata_reset(&rdata);
+                       continue;
+               }
+               CHECK(update_one_rr(db, newver, &diff, DNS_DIFFOP_DEL,
+                                   &zone->origin, rdataset.ttl, &rdata));
+               dns_rdata_reset(&rdata);
+       }
+       
+       if (!ISC_LIST_EMPTY(diff.tuples)) {
+               /* Write changes to journal file. */
+               CHECK(update_soa_serial(db, newver, &diff, zone->mctx,
+                                       zone->updatemethod));
+               CHECK(dns_update_signatures(&log, zone, db, oldver, newver,
+                                           &diff, zone->sigvalidityinterval));
+               CHECK(zone_journal(zone, &diff, NULL, "keydone"));
+               commit = ISC_TRUE;
+
+               LOCK_ZONE(zone);
+               DNS_ZONE_SETFLAG(zone, DNS_ZONEFLG_LOADED);
+               zone_needdump(zone, 30);
+               UNLOCK_ZONE(zone);
+       }
+
+ failure:
+       if (dns_rdataset_isassociated(&rdataset))
+               dns_rdataset_disassociate(&rdataset);
+       if (db != NULL) {
+               if (node != NULL)
+                       dns_db_detachnode(db, &node);
+               if (oldver != NULL)
+                       dns_db_closeversion(db, &oldver, ISC_FALSE);
+               if (newver != NULL)
+                       dns_db_closeversion(db, &newver, commit);
+               dns_db_detach(&db);
+       }
+       dns_diff_clear(&diff);
+       isc_event_free(&event);
+       dns_zone_idetach(&zone);
+}
+
+isc_result_t
+dns_zone_keydone(dns_zone_t *zone, const char *data) {
+       isc_result_t result;
+       isc_event_t *e;
+       isc_buffer_t b;
+       dns_zone_t *dummy = NULL;
+
+       REQUIRE(DNS_ZONE_VALID(zone));
+
+       LOCK_ZONE(zone);
+
+       e = isc_event_allocate(zone->mctx, zone, DNS_EVENT_KEYDONE, keydone,
+                              zone, sizeof(struct keydone));
+       if (e == NULL) {
+               result = ISC_R_NOMEMORY;
+               goto failure;
+       }
+
+       isc_buffer_init(&b, ((struct keydone*)e)->data,
+                       sizeof(((struct keydone*)e)->data));
+       result = isc_hex_decodestring(data, &b);
+       if (result != ISC_R_SUCCESS)
+               goto failure;
+
+       zone_iattach(zone, &dummy);
+       isc_task_send(zone->task, &e);
+
+ failure:
+       if (e != NULL)
+               isc_event_free(&e);
+       UNLOCK_ZONE(zone);
+       return (result);
+}