Blame SOURCES/bind-9.11-CVE-2018-5745.patch

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