302b22
From c705a3eac69286b47a70b851aa5dd9119d04512f Mon Sep 17 00:00:00 2001
302b22
From: Petr Mensik <pemensik@redhat.com>
302b22
Date: Tue, 23 Jul 2019 16:43:55 +0200
302b22
Subject: [PATCH] Fix CVE-2018-5745
302b22
302b22
Squashed commit of the following:
302b22
302b22
commit c38e1dd10567e246bb802d889c3b2d2d286c7616
302b22
Author: Evan Hunt <each@isc.org>
302b22
Date:   Fri Dec 21 17:24:47 2018 -0800
302b22
302b22
    use algorithm 255 for both unsupported keys
302b22
302b22
    (cherry picked from commit de8b2d4a6a97bb2ddf19024918581e70512ebc41)
302b22
302b22
commit caf8a62270c850fbc59cfa6bb9dcedb2ef7228c2
302b22
Author: Matthijs Mekking <matthijs@isc.org>
302b22
Date:   Wed Dec 19 18:45:43 2018 +0100
302b22
302b22
    Add tests for mkeys with unsupported algorithm
302b22
302b22
    These tests check if a key with an unsupported algorithm in
302b22
    managed-keys is ignored and when seeing an algorithm rollover to
302b22
    an unsupported algorithm, the new key will be ignored too.
302b22
302b22
    (cherry picked from commit 144cb53d0ae3aa5e6e3123720b603f9ab2bd1fa9)
302b22
    (cherry picked from commit 8c2a8ca50946449bf26a7e0843cc5e54e36071ae)
302b22
302b22
commit 634655f38385595fb9a35e93ec3a72ed4c48bda6
302b22
Author: Matthijs Mekking <matthijs@isc.org>
302b22
Date:   Wed Dec 19 18:47:43 2018 +0100
302b22
302b22
    Update keyfetch_done compute_tag check
302b22
302b22
    If in keyfetch_done the compute_tag fails (because for example the
302b22
    algorithm is not supported), don't crash, but instead ignore the
302b22
    key.
302b22
302b22
    (cherry picked from commit b1d5411569ae10830b63f07560091193646cc739)
302b22
    (cherry picked from commit 8f64928e2eb9395d8cdcd62183a1eaec3b1c5256)
302b22
302b22
commit e5cb28c3f3df4c37d528665e67fb460cc1662259
302b22
Author: Matthijs Mekking <github@pletterpet.nl>
302b22
Date:   Wed Dec 12 14:06:10 2018 +0100
302b22
302b22
    Don't free key in compute_tag in case of failure
302b22
302b22
    If `dns_dnssec_keyfromrdata` failed we don't need to call
302b22
    `dst_key_free` because no `dstkey` was created.  Doing so
302b22
    nevertheless will result in an assertion failure.
302b22
302b22
    This can happen if the key uses an unsupported algorithm.
302b22
302b22
    (cherry picked from commit 7a1ca39b950b7d5230b605ac60f15a1cb94e3d69)
302b22
    (cherry picked from commit acae423ef4274c5535da324da78ce1441628d5f6)
302b22
---
302b22
 bin/tests/system/mkeys/README                 |  3 +
302b22
 bin/tests/system/mkeys/clean.sh               |  2 +
302b22
 bin/tests/system/mkeys/ns1/root.db            | 20 +++----
302b22
 bin/tests/system/mkeys/ns1/sign.sh            |  7 ++-
302b22
 bin/tests/system/mkeys/ns1/unsupported.key    |  1 +
302b22
 bin/tests/system/mkeys/ns6/named.args         |  1 +
302b22
 bin/tests/system/mkeys/ns6/named.conf.in      | 43 +++++++++++++++
302b22
 bin/tests/system/mkeys/ns6/setup.sh           | 30 ++++++++++
302b22
 .../system/mkeys/ns6/unsupported-managed.key  |  1 +
302b22
 bin/tests/system/mkeys/ns7/named.conf.in      | 50 +++++++++++++++++
302b22
 bin/tests/system/mkeys/setup.sh               |  1 +
302b22
 bin/tests/system/mkeys/tests.sh               | 55 +++++++++++++++++++
302b22
 lib/dns/include/dst/dst.h                     |  3 +-
302b22
 lib/dns/zone.c                                | 27 ++++++++-
302b22
 14 files changed, 229 insertions(+), 15 deletions(-)
302b22
 create mode 100644 bin/tests/system/mkeys/ns1/unsupported.key
302b22
 create mode 100644 bin/tests/system/mkeys/ns6/named.args
302b22
 create mode 100644 bin/tests/system/mkeys/ns6/named.conf.in
302b22
 create mode 100644 bin/tests/system/mkeys/ns6/setup.sh
302b22
 create mode 100644 bin/tests/system/mkeys/ns6/unsupported-managed.key
302b22
 create mode 100644 bin/tests/system/mkeys/ns7/named.conf.in
302b22
302b22
diff --git a/bin/tests/system/mkeys/README b/bin/tests/system/mkeys/README
302b22
index 700e6c21ca..257ef5406f 100644
302b22
--- a/bin/tests/system/mkeys/README
302b22
+++ b/bin/tests/system/mkeys/README
302b22
@@ -16,3 +16,6 @@ ns3 is a validator with a broken key in managed-keys.
302b22
 
302b22
 ns5 is a validator which is prevented from getting a response from the
302b22
 root server, causing key refresh queries to fail.
302b22
+
302b22
+ns6 is a validator which has unsupported algorithms, one at start up,
302b22
+one because of an algorithm rollover.
302b22
diff --git a/bin/tests/system/mkeys/clean.sh b/bin/tests/system/mkeys/clean.sh
302b22
index 17bd50f273..844d813eb4 100644
302b22
--- a/bin/tests/system/mkeys/clean.sh
302b22
+++ b/bin/tests/system/mkeys/clean.sh
302b22
@@ -11,6 +11,7 @@
302b22
 
302b22
 rm -f */K* */*.signed */trusted.conf */*.jnl */*.bk
302b22
 rm -f dsset-. ns1/dsset-.
302b22
+rm -f ns1/zone.key
302b22
 rm -f ns*/named.lock
302b22
 rm -f */managed-keys.bind* */named.secroots
302b22
 rm -f */managed.conf ns1/managed.key ns1/managed.key.id
302b22
@@ -19,3 +20,4 @@ rm -f dig.out* delv.out* rndc.out* signer.out*
302b22
 rm -f ns1/named.secroots ns1/root.db.signed* ns1/root.db.tmp
302b22
 rm -f */named.conf
302b22
 rm -f ns5/named.args
302b22
+rm -f ns7/view1.mkeys ns7/view2.mkeys
302b22
diff --git a/bin/tests/system/mkeys/ns1/root.db b/bin/tests/system/mkeys/ns1/root.db
302b22
index 6ba922af09..0070f13942 100644
302b22
--- a/bin/tests/system/mkeys/ns1/root.db
302b22
+++ b/bin/tests/system/mkeys/ns1/root.db
302b22
@@ -8,16 +8,16 @@
302b22
 ; information regarding copyright ownership.
302b22
 
302b22
 $TTL 20
302b22
-. 			IN SOA	gson.nominum.com. a.root.servers.nil. (
302b22
-				2000042100   	; serial
302b22
-				600         	; refresh
302b22
-				600         	; retry
302b22
-				1200    	; expire
302b22
-				2       	; minimum
302b22
-				)
302b22
-.			NS	a.root-servers.nil.
302b22
-a.root-servers.nil.	A	10.53.0.1
302b22
+.                      IN SOA  gson.nominum.com. a.root.servers.nil. (
302b22
+                               2000042100      ; serial
302b22
+                               600             ; refresh
302b22
+                               600             ; retry
302b22
+                               1200            ; expire
302b22
+                               2               ; minimum
302b22
+                               )
302b22
+.                      NS      a.root-servers.nil.
302b22
+a.root-servers.nil.    A       10.53.0.1
302b22
 
302b22
 ; no delegation
302b22
 
302b22
-example.		TXT	"This is a test."
302b22
+example.               TXT     "This is a test."
302b22
diff --git a/bin/tests/system/mkeys/ns1/sign.sh b/bin/tests/system/mkeys/ns1/sign.sh
302b22
index ccc7889ad9..e5e7ec05d6 100644
302b22
--- a/bin/tests/system/mkeys/ns1/sign.sh
302b22
+++ b/bin/tests/system/mkeys/ns1/sign.sh
302b22
@@ -25,13 +25,18 @@ keyfile_to_managed_keys $keyname > managed.conf
302b22
 cp managed.conf ../ns2/managed.conf
302b22
 cp managed.conf ../ns5/managed.conf
302b22
 
302b22
-# Configure a trusted key statement (used by delv)
302b22
+# Configure a trusted key statement (used by delv).
302b22
 keyfile_to_trusted_keys $keyname > trusted.conf
302b22
 
302b22
+# Prepare an unsupported algorithm key.
302b22
+unsupportedkey=Kunknown.+255+00000
302b22
+cp unsupported.key "${unsupportedkey}.key"
302b22
+
302b22
 #
302b22
 #  Save keyname and keyid for managed key id test.
302b22
 #
302b22
 echo "$keyname" > managed.key
302b22
+echo "$zskkeyname" > zone.key
302b22
 keyid=`expr $keyname : 'K\.+00.+\([0-9]*\)'`
302b22
 keyid=`expr $keyid + 0`
302b22
 echo "$keyid" > managed.key.id
302b22
diff --git a/bin/tests/system/mkeys/ns1/unsupported.key b/bin/tests/system/mkeys/ns1/unsupported.key
302b22
new file mode 100644
302b22
index 0000000000..7435d03b63
302b22
--- /dev/null
302b22
+++ b/bin/tests/system/mkeys/ns1/unsupported.key
302b22
@@ -0,0 +1 @@
302b22
+.	IN	DNSKEY	257 3 255 BJiXuidPHuGIne8GlCBLG+Oq/FZruQd2s3uBo+SxY16NUP/Vwl8MctMK62KsblDU1gIJAdEMVep2tsOkuSm0bIbJ8NBex+N9rSvzH2YJlDCT9QnNfv4q5RRTcVA3lk9nkmWHo6zcAT33yuS+THOCSznOMCJRq8JGZ6xqMJLv9FucuK6CCe6QBAZ5e98dpyGTWQLu7AERKKFqda9YCk3KQfdzx/HZ4SpQpRLncIXvGm1PIMT8Ar95NB/BsFJGwr5ZTaQtRYOXf2DD7wD3pfMsTJCdZyC0J0EtGBG109I+Oou1cswUfqZLXip/aV3eaBAUqLcZpg8P8vAbrvEq4uMS4OMZeXL6nu0irrdS1Pqmax8RsC+x3fg9EBH3QmHroJZtiU5h+0x4qApp7HE4Z5zFRuxIp9iB
302b22
diff --git a/bin/tests/system/mkeys/ns6/named.args b/bin/tests/system/mkeys/ns6/named.args
302b22
new file mode 100644
302b22
index 0000000000..02f8f670f6
302b22
--- /dev/null
302b22
+++ b/bin/tests/system/mkeys/ns6/named.args
302b22
@@ -0,0 +1 @@
302b22
+-m record,size,mctx -T clienttest -c named.conf -d 99 -X named.lock -g -T mkeytimers=5/10/20
302b22
diff --git a/bin/tests/system/mkeys/ns6/named.conf.in b/bin/tests/system/mkeys/ns6/named.conf.in
302b22
new file mode 100644
302b22
index 0000000000..8d76f7f2e7
302b22
--- /dev/null
302b22
+++ b/bin/tests/system/mkeys/ns6/named.conf.in
302b22
@@ -0,0 +1,43 @@
302b22
+/*
302b22
+ * Copyright (C) Internet Systems Consortium, Inc. ("ISC")
302b22
+ *
302b22
+ * This Source Code Form is subject to the terms of the Mozilla Public
302b22
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
302b22
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/.
302b22
+ *
302b22
+ * See the COPYRIGHT file distributed with this work for additional
302b22
+ * information regarding copyright ownership.
302b22
+ */
302b22
+
302b22
+// NS6
302b22
+
302b22
+options {
302b22
+	query-source address 10.53.0.6;
302b22
+	notify-source 10.53.0.6;
302b22
+	transfer-source 10.53.0.6;
302b22
+	port @PORT@;
302b22
+	pid-file "named.pid";
302b22
+	listen-on { 10.53.0.6; };
302b22
+	listen-on-v6 { none; };
302b22
+	recursion yes;
302b22
+	notify no;
302b22
+	dnssec-enable yes;
302b22
+	dnssec-validation yes;
302b22
+	trust-anchor-telemetry no;
302b22
+};
302b22
+
302b22
+key rndc_key {
302b22
+	secret "1234abcd8765";
302b22
+	algorithm hmac-sha256;
302b22
+};
302b22
+
302b22
+controls {
302b22
+	inet 10.53.0.6 port @CONTROLPORT@ allow { any; } keys { rndc_key; };
302b22
+};
302b22
+
302b22
+zone "." {
302b22
+	type hint;
302b22
+	file "../../common/root.hint";
302b22
+};
302b22
+
302b22
+include "managed.conf";
302b22
diff --git a/bin/tests/system/mkeys/ns6/setup.sh b/bin/tests/system/mkeys/ns6/setup.sh
302b22
new file mode 100644
302b22
index 0000000000..5ba1647da5
302b22
--- /dev/null
302b22
+++ b/bin/tests/system/mkeys/ns6/setup.sh
302b22
@@ -0,0 +1,30 @@
302b22
+#!/bin/sh -e
302b22
+#
302b22
+# Copyright (C) Internet Systems Consortium, Inc. ("ISC")
302b22
+#
302b22
+# This Source Code Form is subject to the terms of the Mozilla Public
302b22
+# License, v. 2.0. If a copy of the MPL was not distributed with this
302b22
+# file, You can obtain one at http://mozilla.org/MPL/2.0/.
302b22
+#
302b22
+# See the COPYRIGHT file distributed with this work for additional
302b22
+# information regarding copyright ownership.
302b22
+
302b22
+SYSTEMTESTTOP=../..
302b22
+. $SYSTEMTESTTOP/conf.sh
302b22
+
302b22
+zone=.
302b22
+zonefile=root.db
302b22
+
302b22
+# an RSA key
302b22
+rsakey=`$KEYGEN -a rsasha256 -qfk rsasha256.`
302b22
+
302b22
+# a key with unsupported algorithm
302b22
+unsupportedkey=Kunknown.+255+00000
302b22
+cp unsupported-managed.key "${unsupportedkey}.key"
302b22
+
302b22
+# root key
302b22
+rootkey=`cat ../ns1/managed.key`
302b22
+cp "../ns1/${rootkey}.key" .
302b22
+
302b22
+# Configure the resolving server with a managed trusted key.
302b22
+keyfile_to_managed_keys $unsupportedkey $rsakey $rootkey > managed.conf
302b22
diff --git a/bin/tests/system/mkeys/ns6/unsupported-managed.key b/bin/tests/system/mkeys/ns6/unsupported-managed.key
302b22
new file mode 100644
302b22
index 0000000000..be872a00f0
302b22
--- /dev/null
302b22
+++ b/bin/tests/system/mkeys/ns6/unsupported-managed.key
302b22
@@ -0,0 +1 @@
302b22
+unsupported.	IN	DNSKEY	257 3 255 BOOVAhiJDPqhfU7+yGXjhetrtC/rtjmwO1yo52BUHUd8R4hQ/ZPdYCVvQlvNkRxDblPkFM5YRXkesS30pJSoNYrg+djbMNumJrLG+lbhFIc/ahTjlYOxb1zm2z00ubHju/1uGBifiRvKWSK0Vr0u6NtS4PKZfsnXt+piSHiRAHSfkjGHwqPYYKh9EUW12kJmIzlMaM6WYl+gJOvL+f8VqNLtvsMPT6OPK/3h/Dnfnxyeudp/jzAnNDDiTgX2XfzIXB4UwxtzIOGaHLnprpNf3zoBm0kyaEdSQQ/qKkpCOqjBasYEHRjVz3RncPUkdLr7PQuPBfFDr3SUMMJqufJrO4IJjtD4cCBT7K1i39Jg471nEzU1vkPzxF+Rw1QHT4nZaXbltf3BEZGS4Knoe9XPwi5KjGW6
302b22
diff --git a/bin/tests/system/mkeys/ns7/named.conf.in b/bin/tests/system/mkeys/ns7/named.conf.in
302b22
new file mode 100644
302b22
index 0000000000..a9aba00733
302b22
--- /dev/null
302b22
+++ b/bin/tests/system/mkeys/ns7/named.conf.in
302b22
@@ -0,0 +1,50 @@
302b22
+/*
302b22
+ * Copyright (C) Internet Systems Consortium, Inc. ("ISC")
302b22
+ *
302b22
+ * This Source Code Form is subject to the terms of the Mozilla Public
302b22
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
302b22
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/.
302b22
+ *
302b22
+ * See the COPYRIGHT file distributed with this work for additional
302b22
+ * information regarding copyright ownership.
302b22
+ */
302b22
+
302b22
+// NS7
302b22
+
302b22
+options {
302b22
+	query-source address 10.53.0.7;
302b22
+	notify-source 10.53.0.7;
302b22
+	transfer-source 10.53.0.7;
302b22
+	port @PORT@;
302b22
+	pid-file "named.pid";
302b22
+	listen-on { 10.53.0.7; };
302b22
+	listen-on-v6 { none; };
302b22
+	recursion yes;
302b22
+	notify no;
302b22
+	dnssec-enable yes;
302b22
+	dnssec-validation auto;
302b22
+	bindkeys-file "managed.conf";
302b22
+};
302b22
+
302b22
+key rndc_key {
302b22
+	secret "1234abcd8765";
302b22
+	algorithm hmac-sha256;
302b22
+};
302b22
+
302b22
+controls {
302b22
+	inet 10.53.0.7 port @CONTROLPORT@ allow { any; } keys { rndc_key; };
302b22
+};
302b22
+
302b22
+view view1 {
302b22
+	zone "." {
302b22
+		type hint;
302b22
+		file "../../common/root.hint";
302b22
+	};
302b22
+};
302b22
+
302b22
+view view2 {
302b22
+	zone "." {
302b22
+		type hint;
302b22
+		file "../../common/root.hint";
302b22
+	};
302b22
+};
302b22
diff --git a/bin/tests/system/mkeys/setup.sh b/bin/tests/system/mkeys/setup.sh
302b22
index bd3169f9b6..100a86959b 100644
302b22
--- a/bin/tests/system/mkeys/setup.sh
302b22
+++ b/bin/tests/system/mkeys/setup.sh
302b22
@@ -25,3 +25,4 @@ copy_setports ns5/named.conf.in ns5/named.conf
302b22
 cp ns5/named1.args ns5/named.args
302b22
 
302b22
 ( cd ns1 && $SHELL sign.sh )
302b22
+( cd ns6 && $SHELL setup.sh )
302b22
diff --git a/bin/tests/system/mkeys/tests.sh b/bin/tests/system/mkeys/tests.sh
302b22
index f65f49e98d..b8410902d7 100644
302b22
--- a/bin/tests/system/mkeys/tests.sh
302b22
+++ b/bin/tests/system/mkeys/tests.sh
302b22
@@ -701,6 +701,8 @@ rm -f ns1/root.db.signed.jnl
302b22
 nextpart ns5/named.run > /dev/null
302b22
 mkeys_reconfig_on 1
302b22
 wait_for_log "Returned from key fetch in keyfetch_done() for '.': success" ns5/named.run
302b22
+#mkeys_secroots_on 5
302b22
+#grep '; managed' ns5/named.secroots > /dev/null || ret=1
302b22
 # ns1 should not longer REFUSE queries from ns5, so managed keys should be
302b22
 # correctly refreshed and resolving should succeed
302b22
 $DIG $DIGOPTS +noauth example. @10.53.0.5 txt > dig.out.ns5.b.test$n || ret=1
302b22
@@ -710,5 +712,58 @@ grep "status: NOERROR" dig.out.ns5.b.test$n > /dev/null || ret=1
302b22
 if [ $ret != 0 ]; then echo_i "failed"; fi
302b22
 status=`expr $status + $ret`
302b22
 
302b22
+echo_i "reinitialize trust anchors, add unsupported algorithm ($n)"
302b22
+ret=0
302b22
+$PERL $SYSTEMTESTTOP/stop.pl --use-rndc --port ${CONTROLPORT} mkeys ns6
302b22
+rm -f ns6/managed-keys.bind*
302b22
+nextpart ns6/named.run > /dev/null
302b22
+$PERL $SYSTEMTESTTOP/start.pl --noclean --restart --port ${PORT} mkeys ns6
302b22
+# log when an unsupported algorithm is encountered during startup
302b22
+wait_for_log "skipping managed key for 'unsupported\.': algorithm is unsupported" ns6/named.run
302b22
+if [ $ret != 0 ]; then echo_i "failed"; fi
302b22
+status=`expr $status + $ret`
302b22
+
302b22
+n=`expr $n + 1`
302b22
+echo_i "skipping unsupported algorithm in managed-keys ($n)"
302b22
+ret=0
302b22
+mkeys_status_on 6 > rndc.out.$n 2>&1
302b22
+# there should still be only two keys listed (for . and rsasha256.)
302b22
+count=`grep -c "keyid: " rndc.out.$n`
302b22
+[ "$count" -eq 2 ] || ret=1
302b22
+# two lines indicating trust status
302b22
+count=`grep -c "trust" rndc.out.$n`
302b22
+[ "$count" -eq 2 ] || ret=1
302b22
+
302b22
+n=`expr $n + 1`
302b22
+echo_i "introduce unsupported algorithm rollover in authoritative zone ($n)"
302b22
+ret=0
302b22
+cp ns1/root.db ns1/root.db.orig
302b22
+ksk=`cat ns1/managed.key`
302b22
+zsk=`cat ns1/zone.key`
302b22
+cat "ns1/${ksk}.key" "ns1/${zsk}.key" ns1/unsupported.key >> ns1/root.db
302b22
+grep "\..*IN.*DNSKEY.*257 3 255" ns1/root.db > /dev/null || ret=1
302b22
+$SIGNER -K ns1 -N unixtime -o . ns1/root.db $ksk $zsk > /dev/null 2>/dev/null || ret=1
302b22
+grep "DNSKEY.*257 3 255" ns1/root.db.signed > /dev/null || ret=1
302b22
+cp ns1/root.db.orig ns1/root.db
302b22
+if [ $ret != 0 ]; then echo_i "failed"; fi
302b22
+status=`expr $status + $ret`
302b22
+
302b22
+n=`expr $n + 1`
302b22
+echo_i "skipping unsupported algorithm in rollover ($n)"
302b22
+ret=0
302b22
+mkeys_reload_on 1
302b22
+mkeys_refresh_on 6
302b22
+mkeys_status_on 6 > rndc.out.$n 2>&1
302b22
+# there should still be only two keys listed (for . and rsasha256.)
302b22
+count=`grep -c "keyid: " rndc.out.$n`
302b22
+[ "$count" -eq 2 ] || ret=1
302b22
+# two lines indicating trust status
302b22
+count=`grep -c "trust" rndc.out.$n`
302b22
+[ "$count" -eq 2 ] || ret=1
302b22
+# log when an unsupported algorithm is encountered during rollover
302b22
+wait_for_log "Cannot compute tag for key in zone \.: algorithm is unsupported" ns6/named.run
302b22
+if [ $ret != 0 ]; then echo_i "failed"; fi
302b22
+status=`expr $status + $ret`
302b22
+
302b22
 echo_i "exit status: $status"
302b22
 [ $status -eq 0 ] || exit 1
302b22
diff --git a/lib/dns/include/dst/dst.h b/lib/dns/include/dst/dst.h
302b22
index e8c1a3c287..91f4a6e300 100644
302b22
--- a/lib/dns/include/dst/dst.h
302b22
+++ b/lib/dns/include/dst/dst.h
302b22
@@ -67,8 +67,7 @@ typedef struct dst_context 	dst_context_t;
302b22
 #define DST_ALG_HMACSHA512	165	/* XXXMPA */
302b22
 #define DST_ALG_INDIRECT	252
302b22
 #define DST_ALG_PRIVATE		254
302b22
-#define DST_ALG_EXPAND		255
302b22
-#define DST_MAX_ALGS		255
302b22
+#define DST_MAX_ALGS		256
302b22
 
302b22
 /*% A buffer of this size is large enough to hold any key */
302b22
 #define DST_KEY_MAXSIZE		1280
302b22
diff --git a/lib/dns/zone.c b/lib/dns/zone.c
302b22
index 055b2417eb..96c98d585c 100644
302b22
--- a/lib/dns/zone.c
302b22
+++ b/lib/dns/zone.c
302b22
@@ -3903,9 +3903,10 @@ compute_tag(dns_name_t *name, dns_rdata_dnskey_t *dnskey, isc_mem_t *mctx,
302b22
 			     dns_rdatatype_dnskey, dnskey, &buffer);
302b22
 
302b22
 	result = dns_dnssec_keyfromrdata(name, &rdata, mctx, &dstkey);
302b22
-	if (result == ISC_R_SUCCESS)
302b22
+	if (result == ISC_R_SUCCESS) {
302b22
 		*tag = dst_key_id(dstkey);
302b22
-	dst_key_free(&dstkey);
302b22
+		dst_key_free(&dstkey);
302b22
+	}
302b22
 
302b22
 	return (result);
302b22
 }
302b22
@@ -9364,6 +9365,17 @@ keyfetch_done(isc_task_t *task, isc_event_t *event) {
302b22
 
302b22
 		dns_keydata_todnskey(&keydata, &dnskey, NULL);
302b22
 		result = compute_tag(keyname, &dnskey, mctx, &keytag);
302b22
+		if (result != ISC_R_SUCCESS) {
302b22
+			/*
302b22
+			 * Skip if we cannot compute the key tag.
302b22
+			 * This may happen if the algorithm is unsupported
302b22
+			 */
302b22
+			dns_zone_log(zone, ISC_LOG_ERROR,
302b22
+				"Cannot compute tag for key in zone %s: %s "
302b22
+				"(skipping)",
302b22
+				namebuf, dns_result_totext(result));
302b22
+			continue;
302b22
+		}
302b22
 		RUNTIME_CHECK(result == ISC_R_SUCCESS);
302b22
 
302b22
 		/*
302b22
@@ -9475,6 +9487,17 @@ keyfetch_done(isc_task_t *task, isc_event_t *event) {
302b22
 			continue;
302b22
 
302b22
 		result = compute_tag(keyname, &dnskey, mctx, &keytag);
302b22
+		if (result != ISC_R_SUCCESS) {
302b22
+			/*
302b22
+			 * Skip if we cannot compute the key tag.
302b22
+			 * This may happen if the algorithm is unsupported
302b22
+			 */
302b22
+			dns_zone_log(zone, ISC_LOG_ERROR,
302b22
+				"Cannot compute tag for key in zone %s: %s "
302b22
+				"(skipping)",
302b22
+				namebuf, dns_result_totext(result));
302b22
+			continue;
302b22
+		}
302b22
 		RUNTIME_CHECK(result == ISC_R_SUCCESS);
302b22
 
302b22
 		revoked = ISC_TF(dnskey.flags & DNS_KEYFLAG_REVOKE);
302b22
-- 
302b22
2.20.1
302b22