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 *);
}
/* 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 {
/* 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);
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)
/** 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
};
struct kr_nonce_input nonce = {
- .rand = kr_rand_uint(UINT32_MAX),
+ .rand = kr_rand_uint(0),
.time = req->current_query->timestamp.tv_sec
};