]> git.ipfire.org Git - thirdparty/knot-resolver.git/commitdiff
kr_rand_uint: nitpicks
authorVladimír Čunát <vladimir.cunat@nic.cz>
Thu, 3 Aug 2017 12:59:48 +0000 (14:59 +0200)
committerVladimír Čunát <vladimir.cunat@nic.cz>
Thu, 3 Aug 2017 13:16:52 +0000 (15:16 +0200)
- the returned value is up to max-1 and not max (tiny bias)
- improve efficiency slightly
- unsigned -> uint32_t, as that's the range it supports (mostly equal)

daemon/lua/kres-gen.lua
lib/layer/iterate.c
lib/resolve.c
lib/utils.c
lib/utils.h
modules/cookies/cookiemonster.c

index 9d35ef8fcee4357d474dc4172da07c35886c7f80..fbe4208d930817a543e5a9a64d429d6175bcb0da 100644 (file)
@@ -193,7 +193,7 @@ struct kr_query *kr_rplan_push(struct kr_rplan *, struct kr_query *, const knot_
 int kr_rplan_pop(struct kr_rplan *, struct kr_query *);
 struct kr_query *kr_rplan_resolved(struct kr_rplan *);
 int kr_nsrep_set(struct kr_query *, size_t, const struct sockaddr *);
-unsigned int kr_rand_uint(unsigned int);
+uint32_t kr_rand_uint(uint32_t);
 void kr_pkt_make_auth_header(knot_pkt_t *);
 int kr_pkt_put(knot_pkt_t *, const knot_dname_t *, uint32_t, uint16_t, uint16_t, const uint8_t *, uint16_t);
 int kr_pkt_recycle(knot_pkt_t *);
index 0efccbb74e282ee845a989c4c507b90bee39600e..5c1017b8194a37b9930b5ebbf3bd53934979c7cc 100644 (file)
@@ -823,7 +823,8 @@ int kr_make_query(struct kr_query *query, knot_pkt_t *pkt)
        }
 
        /* Query built, expect answer. */
-       query->id = kr_rand_uint(UINT16_MAX);
+       uint32_t rnd = kr_rand_uint(0);
+       query->id = rnd ^ (rnd >> 16); /* cheap way to strengthen unpredictability */
        knot_wire_set_id(pkt->wire, query->id);
        pkt->parsed = pkt->size;
        WITH_VERBOSE {
index c8701768d66c3b0bdfef445c72d45e9018a0312b..2fdd47071eb4be8b8d04749e46ba3574a4f85b9b 100644 (file)
@@ -1413,7 +1413,7 @@ ns_election:
 
        /* Randomize query case (if not in safemode or turned off) */
        qry->secret = (qry->flags & (QUERY_SAFEMODE | QUERY_NO_0X20))
-                       ? 0 : kr_rand_uint(UINT32_MAX);
+                       ? 0 : kr_rand_uint(0);
        knot_dname_t *qname_raw = (knot_dname_t *)knot_pkt_qname(packet);
        randomized_qname_case(qname_raw, qry->secret);
 
index bc177a92c402f13fb65de37844c10bd90114674f..ab0189c1f936b61919a0244f365b153fc1c30295 100644 (file)
@@ -168,13 +168,15 @@ int kr_rand_reseed(void)
        return kr_ok();
 }
 
-unsigned kr_rand_uint(unsigned max)
+uint32_t kr_rand_uint(uint32_t max)
 {
-       if (!isaac_seeded) {
+       if (unlikely(!isaac_seeded)) {
                kr_rand_reseed();
                isaac_seeded = true;
        }
-       return isaac_next_uint(&ISAAC, max);
+       return max == 0
+               ? isaac_next_uint32(&ISAAC)
+               : isaac_next_uint(&ISAAC, max);
 }
 
 int kr_memreserve(void *baton, char **mem, size_t elm_size, size_t want, size_t *have)
index 3cbf989bd14c61352d3fcc581510b6281f19275c..3d6945ba39012ad08c735d131913cdda28e90cc1 100644 (file)
@@ -149,9 +149,12 @@ char* kr_strcatdup(unsigned n, ...);
 /** Reseed CSPRNG context. */
 int kr_rand_reseed(void);
 
-/** Get pseudo-random value. */
+/** Get pseudo-random value between zero and max-1 (inclusive).
+ *
+ * Passing zero means that any uint32_t should be returned (it's also faster).
+ */
 KR_EXPORT
-unsigned kr_rand_uint(unsigned max);
+uint32_t kr_rand_uint(uint32_t max);
 
 /** Memory reservation routine for knot_mm_t */
 KR_EXPORT
index 13f548959310cb60c9faca00cb25fce282aac508..bd838b7e84a58ecf94e91db033d50ff9530c1687 100644 (file)
@@ -414,7 +414,7 @@ int check_request(kr_layer_t *ctx)
        };
 
        struct kr_nonce_input nonce = {
-               .rand = kr_rand_uint(UINT32_MAX),
+               .rand = kr_rand_uint(0),
                .time = req->current_query->timestamp.tv_sec
        };