Lines Matching refs:rng

164 chacha_reinit(isc_rng_t *rng, isc_uint8_t *buffer, size_t n) {
165 REQUIRE(rng != NULL);
170 chacha_keysetup(&rng->cpctx, buffer, CHACHA_KEYSIZE * 8, 0);
171 chacha_ivsetup(&rng->cpctx, buffer + CHACHA_KEYSIZE);
181 isc_rng_t *rng;
199 rng = isc_mem_get(mctx, sizeof(*rng));
200 if (rng == NULL)
203 chacha_reinit(rng, rnd.rnd, sizeof(rnd.rnd));
205 rng->have = 0;
206 memset(rng->buffer, 0, CHACHA_BUFFERSIZE);
209 result = isc_mutex_init(&rng->lock);
211 isc_mem_put(mctx, rng, sizeof(*rng));
216 rng->mctx = NULL;
217 isc_mem_attach(mctx, &rng->mctx);
220 rng->count = 0;
221 rng->entropy = entropy; /* don't have to attach */
222 rng->references = 1;
223 rng->magic = RNG_MAGIC;
225 *rngp = rng;
244 destroy(isc_rng_t *rng) {
246 REQUIRE(VALID_RNG(rng));
248 rng->magic = 0;
249 isc_mutex_destroy(&rng->lock);
250 isc_mem_putanddetach(&rng->mctx, rng, sizeof(isc_rng_t));
255 isc_rng_t *rng;
260 rng = *rngp;
263 LOCK(&rng->lock);
265 INSIST(rng->references > 0);
266 rng->references--;
267 if (rng->references == 0)
269 UNLOCK(&rng->lock);
272 destroy(rng);
276 chacha_rekey(isc_rng_t *rng, u_char *dat, size_t datlen) {
277 REQUIRE(VALID_RNG(rng));
280 memset(rng->buffer, 0, CHACHA_BUFFERSIZE);
284 chacha_encrypt_bytes(&rng->cpctx, rng->buffer, rng->buffer,
293 rng->buffer[i] ^= dat[i];
297 chacha_reinit(rng, rng->buffer,
299 memset(rng->buffer, 0, CHACHA_KEYSIZE + CHACHA_IVSIZE);
300 rng->have = CHACHA_BUFFERSIZE - CHACHA_KEYSIZE - CHACHA_IVSIZE;
304 chacha_getuint16(isc_rng_t *rng) {
307 REQUIRE(VALID_RNG(rng));
309 if (rng->have < sizeof(val))
310 chacha_rekey(rng, NULL, 0);
312 memmove(&val, rng->buffer + CHACHA_BUFFERSIZE - rng->have,
315 memset(rng->buffer + CHACHA_BUFFERSIZE - rng->have,
317 rng->have -= sizeof(val);
323 chacha_stir(isc_rng_t *rng) {
330 REQUIRE(VALID_RNG(rng));
332 if (rng->entropy != NULL) {
336 result = isc_entropy_getdata(rng->entropy, rnd.rnd,
345 chacha_rekey(rng, rnd.rnd, sizeof(rnd.rnd));
350 rng->have = 0;
351 memset(rng->buffer, 0, CHACHA_BUFFERSIZE);
358 rng->count = 1600000;
362 isc_rng_random(isc_rng_t *rng) {
365 REQUIRE(VALID_RNG(rng));
367 LOCK(&rng->lock);
369 rng->count -= sizeof(isc_uint16_t);
370 if (rng->count <= 0)
371 chacha_stir(rng);
372 result = chacha_getuint16(rng);
374 UNLOCK(&rng->lock);
380 isc_rng_uniformrandom(isc_rng_t *rng, isc_uint16_t upper_bound) {
383 REQUIRE(VALID_RNG(rng));
405 r = isc_rng_random(rng);