]> git.ipfire.org Git - thirdparty/bind9.git/commitdiff
Implement signature jitter
authorMatthijs Mekking <matthijs@isc.org>
Thu, 1 Feb 2024 08:34:33 +0000 (09:34 +0100)
committerMatthijs Mekking <matthijs@isc.org>
Thu, 18 Apr 2024 07:50:10 +0000 (09:50 +0200)
When calculating the RRSIG validity, jitter is now derived from the
config option rather than from the refresh value.

lib/dns/include/dns/kasp.h
lib/dns/update.c
lib/dns/zone.c

index 3b8c68e0f25a20c71560df3df01419af0f588633..cd8a5bd13ff2dbfa4eea4a6a00e65e3c0aa57a4f 100644 (file)
@@ -117,6 +117,7 @@ struct dns_kasp {
 #define DNS_KASP_VALID(kasp) ISC_MAGIC_VALID(kasp, DNS_KASP_MAGIC)
 
 /* Defaults */
+#define DEFAULT_JITTER              (12 * 3600)
 #define DNS_KASP_SIG_JITTER         "PT12H"
 #define DNS_KASP_SIG_REFRESH        "P5D"
 #define DNS_KASP_SIG_VALIDITY       "P14D"
index cbcbe1c13903f641e63b98ad4cd94653f081f4f1..1302bb4dbaa88bf2192c36710ed37a96f036f602 100644 (file)
@@ -1477,23 +1477,25 @@ struct dns_update_state {
 };
 
 static uint32_t
-dns__jitter_expire(dns_zone_t *zone, uint32_t sigvalidityinterval) {
+dns__jitter_expire(dns_zone_t *zone) {
        /* Spread out signatures over time */
-       if (sigvalidityinterval >= 3600U) {
-               uint32_t expiryinterval =
-                       dns_zone_getsigresigninginterval(zone);
-
-               if (sigvalidityinterval < 7200U) {
-                       expiryinterval = 1200;
-               } else if (expiryinterval > sigvalidityinterval) {
-                       expiryinterval = sigvalidityinterval;
+       isc_stdtime_t jitter = DEFAULT_JITTER;
+       isc_stdtime_t sigvalidity = dns_zone_getsigvalidityinterval(zone);
+       dns_kasp_t *kasp = dns_zone_getkasp(zone);
+
+       if (kasp != NULL) {
+               jitter = dns_kasp_sigjitter(kasp);
+               sigvalidity = dns_kasp_sigvalidity(kasp);
+       }
+
+       if (sigvalidity >= 3600U) {
+               if (sigvalidity > 7200U) {
+                       sigvalidity -= isc_random_uniform(jitter);
                } else {
-                       expiryinterval = sigvalidityinterval - expiryinterval;
+                       sigvalidity -= isc_random_uniform(1200);
                }
-               uint32_t jitter = isc_random_uniform(expiryinterval);
-               sigvalidityinterval -= jitter;
        }
-       return (sigvalidityinterval);
+       return (sigvalidity);
 }
 
 isc_result_t
@@ -1549,8 +1551,7 @@ dns_update_signaturesinc(dns_update_log_t *log, dns_zone_t *zone, dns_db_t *db,
                state->now = isc_stdtime_now();
                state->inception = state->now - 3600; /* Allow for some clock
                                                         skew. */
-               state->expire = state->now +
-                               dns__jitter_expire(zone, sigvalidityinterval);
+               state->expire = state->now + dns__jitter_expire(zone);
                state->soaexpire = state->now + sigvalidityinterval;
                state->keyexpire = dns_zone_getkeyvalidityinterval(zone);
                if (state->keyexpire == 0) {
index c444709917a665242e6ee968cf9d7c501386ab9b..5d6a2428aecde816c73d4a6f734fb53c47971c8c 100644 (file)
@@ -6919,19 +6919,18 @@ calculate_rrsig_validity(dns_zone_t *zone, isc_stdtime_t now,
        REQUIRE(soaexpire != NULL);
        /* expire and fullexpire are optional */
 
-       isc_stdtime_t sigvalidityinterval =
-               dns_zone_getsigvalidityinterval(zone);
-       isc_stdtime_t expiryinterval = dns_zone_getsigresigninginterval(zone);
-       isc_stdtime_t normaljitter = 0, fulljitter = 0;
+       isc_stdtime_t jitter = DEFAULT_JITTER;
+       isc_stdtime_t sigvalidity = dns_zone_getsigvalidityinterval(zone);
+       isc_stdtime_t shortjitter = 0, fulljitter = 0;
 
-       *inception = now - 3600; /* Allow for clock skew. */
-       *soaexpire = now + sigvalidityinterval;
-       if (expiryinterval > sigvalidityinterval) {
-               expiryinterval = sigvalidityinterval;
-       } else {
-               expiryinterval = sigvalidityinterval - expiryinterval;
+       if (zone->kasp != NULL) {
+               jitter = dns_kasp_sigjitter(zone->kasp);
+               sigvalidity = dns_kasp_sigvalidity(zone->kasp);
        }
 
+       *inception = now - 3600; /* Allow for clock skew. */
+       *soaexpire = now + sigvalidity;
+
        /*
         * Spread out signatures over time if they happen to be
         * clumped.  We don't do this for each add_sigs() call as
@@ -6941,16 +6940,16 @@ calculate_rrsig_validity(dns_zone_t *zone, isc_stdtime_t now,
         * period we need to ensure that the clusters don't become
         * synchronised by using the full jitter range.
         */
-       if (sigvalidityinterval >= 3600U) {
-               if (sigvalidityinterval > 7200U) {
-                       normaljitter = isc_random_uniform(3600);
-                       fulljitter = isc_random_uniform(expiryinterval);
+       if (sigvalidity >= 3600U) {
+               if (sigvalidity > 7200U) {
+                       shortjitter = isc_random_uniform(3600);
+                       fulljitter = isc_random_uniform(jitter);
                } else {
-                       normaljitter = fulljitter = isc_random_uniform(1200);
+                       shortjitter = fulljitter = isc_random_uniform(1200);
                }
        }
 
-       SET_IF_NOT_NULL(expire, *soaexpire - normaljitter - 1);
+       SET_IF_NOT_NULL(expire, *soaexpire - shortjitter - 1);
        SET_IF_NOT_NULL(fullexpire, *soaexpire - fulljitter - 1);
 }