From 1b432b36337c81ef94022d1ca9e4b19602874b6f Mon Sep 17 00:00:00 2001 From: Mark Andrews Date: Wed, 24 Apr 2019 08:05:27 +1000 Subject: [PATCH 1/2] compute the RSAMD5 key id (cherry picked from commit ffaa5a07ddca3e98e0a5c471c587e1d8b18701ff) --- lib/dns/key.c | 26 +++++++++++++++++++++----- 1 file changed, 21 insertions(+), 5 deletions(-) diff --git a/lib/dns/key.c b/lib/dns/key.c index df4aab4a6f..99fd14302e 100644 --- a/lib/dns/key.c +++ b/lib/dns/key.c @@ -38,11 +38,17 @@ dst_region_computeid(const isc_region_t *source) { p = source->base; size = source->length; - for (ac = 0; size > 1; size -= 2, p += 2) - ac += ((*p) << 8) + *(p + 1); + if (source->base[3] == DST_ALG_RSAMD5) { + return ((p[size - 3] << 8) + p[size - 2]); + } - if (size > 0) + for (ac = 0; size > 1; size -= 2, p += 2) { + ac += ((*p) << 8) + *(p + 1); + } + + if (size > 0) { ac += ((*p) << 8); + } ac += (ac >> 16) & 0xffff; return ((uint16_t)(ac & 0xffff)); @@ -60,13 +66,23 @@ dst_region_computerid(const isc_region_t *source) { p = source->base; size = source->length; + if (source->base[3] == DST_ALG_RSAMD5) { + ac = (p[size - 3] << 8) + p[size - 2]; + if (size == 4U) { + ac |= (DNS_KEYFLAG_REVOKE<<8); + } + return (ac); + } + ac = ((*p) << 8) + *(p + 1); ac |= DNS_KEYFLAG_REVOKE; - for (size -= 2, p +=2; size > 1; size -= 2, p += 2) + for (size -= 2, p +=2; size > 1; size -= 2, p += 2) { ac += ((*p) << 8) + *(p + 1); + } - if (size > 0) + if (size > 0) { ac += ((*p) << 8); + } ac += (ac >> 16) & 0xffff; return ((uint16_t)(ac & 0xffff)); From c15805d74d4fdd07ca7065fb913ca2ec28204acb Mon Sep 17 00:00:00 2001 From: Mark Andrews Date: Wed, 24 Apr 2019 08:19:08 +1000 Subject: [PATCH 2/2] add CHANGES (cherry picked from commit 11cddb689fcc7e3a2c0404d54d3025be140fb17c) --- CHANGES | 2 ++ 1 file changed, 2 insertions(+) diff --git a/CHANGES b/CHANGES index df4f810ac8..dd70abdeb6 100644 --- a/CHANGES +++ b/CHANGES @@ -1,3 +1,5 @@ +5217. [bug] Restore key id calculation for RSAMD5. [GL #996] + 5215. [bug] Change #5124 was incomplete; named could still return FORMERR instead of SERVFAIL in some cases. [GL #990]