From: Vladimír Čunát Date: Thu, 3 Aug 2017 12:59:48 +0000 (+0200) Subject: kr_rand_uint: nitpicks X-Git-Tag: v1.3.3~4^2 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=c2dbf7200727beb56ce3d1b250babb6c49781109;p=thirdparty%2Fknot-resolver.git kr_rand_uint: nitpicks - 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) --- diff --git a/daemon/lua/kres-gen.lua b/daemon/lua/kres-gen.lua index 9d35ef8fc..fbe4208d9 100644 --- a/daemon/lua/kres-gen.lua +++ b/daemon/lua/kres-gen.lua @@ -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 *); diff --git a/lib/layer/iterate.c b/lib/layer/iterate.c index 0efccbb74..5c1017b81 100644 --- a/lib/layer/iterate.c +++ b/lib/layer/iterate.c @@ -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 { diff --git a/lib/resolve.c b/lib/resolve.c index c8701768d..2fdd47071 100644 --- a/lib/resolve.c +++ b/lib/resolve.c @@ -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); diff --git a/lib/utils.c b/lib/utils.c index bc177a92c..ab0189c1f 100644 --- a/lib/utils.c +++ b/lib/utils.c @@ -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) diff --git a/lib/utils.h b/lib/utils.h index 3cbf989bd..3d6945ba3 100644 --- a/lib/utils.h +++ b/lib/utils.h @@ -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 diff --git a/modules/cookies/cookiemonster.c b/modules/cookies/cookiemonster.c index 13f548959..bd838b7e8 100644 --- a/modules/cookies/cookiemonster.c +++ b/modules/cookies/cookiemonster.c @@ -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 };