Lines Matching defs:prng
39 * - An attacker who sees the PRNG state cannot predict past outputs.
40 * - An attacker who sees a child's PRNG state cannot predict past or
46 * (b) sysctl(KERN_ARND) fails when reseeding the PRNG.
281 /* PRNG */
299 crypto_prng_seed(struct crypto_prng *prng, const void *seed)
302 (void)memcpy(prng->state, seed, crypto_prng_SEEDBYTES);
306 crypto_prng_buf(struct crypto_prng *prng, void *buf, size_t n)
312 __CTASSERT(sizeof prng->state + crypto_prng_MAXOUTPUTBYTES
315 crypto_core(output, nonce, prng->state, crypto_core_constant32);
316 (void)memcpy(prng->state, output, sizeof prng->state);
317 (void)memcpy(buf, output + sizeof prng->state, n);
352 struct crypto_prng prng;
358 crypto_prng_seed(&prng, seed);
359 crypto_prng_buf(&prng, output, 1);
360 crypto_prng_buf(&prng, output + 1, 30);
361 crypto_prng_buf(&prng, output + 31, 1);
528 arc4random_prng_addrandom(struct arc4random_prng *prng, const void *data,
541 crypto_prng_buf(&prng->arc4_prng, buf, sizeof buf);
556 /* reseed(SHA256(prng() || sysctl(KERN_ARND) || data)) */
557 crypto_prng_seed(&prng->arc4_prng, buf);
559 prng->arc4_epoch = epoch;
566 struct arc4random_prng *prng;
567 const size_t size = roundup(sizeof(*prng), sysconf(_SC_PAGESIZE));
569 prng = mmap(NULL, size, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANON, -1,
571 if (prng == MAP_FAILED)
573 if (minherit(prng, size, MAP_INHERIT_ZERO) == -1)
576 return prng;
578 fail1: (void)munmap(prng, size);
585 arc4random_prng_destroy(struct arc4random_prng *prng)
587 const size_t size = roundup(sizeof(*prng), sysconf(_SC_PAGESIZE));
589 (void)explicit_memset(prng, 0, sizeof(*prng));
590 (void)munmap(prng, size);
608 (void)explicit_memset(&arc4random_global.prng, 0,
609 sizeof arc4random_global.prng);
630 struct arc4random_prng *const prng = p;
632 arc4random_prng_destroy(prng);
654 * PRNG state on the stack reinitialized from the kernel
663 * For multithreaded builds, try to allocate a per-thread PRNG
682 struct arc4random_prng *prng = NULL;
688 /* Get or create the per-thread PRNG state. */
689 prng = __predict_true(arc4random_global.per_thread)
692 if (__predict_false(prng == NULL) && arc4random_global.per_thread) {
693 prng = arc4random_prng_create();
694 thr_setspecific(arc4random_global.thread_key, prng);
699 * If we can't create it, fall back to the global PRNG -- or an
700 * on-stack PRNG, in the unlikely event that pthread_atfork
704 if (__predict_false(prng == NULL)) {
707 prng = &arc4random_global.prng;
709 prng = fallback;
710 memset(prng, 0, sizeof(*prng));
714 /* Guarantee the PRNG is seeded. */
715 if (__predict_false(prng->arc4_epoch != entropy_epoch()))
716 arc4random_prng_addrandom(prng, NULL, 0);
718 return prng;
722 arc4random_prng_put(struct arc4random_prng *prng,
734 if (__predict_false(prng == fallback))
737 /* If we had fallen back to the global PRNG, unlock it. */
738 if (__predict_false(prng == &arc4random_global.prng))
747 struct arc4random_prng *prng, fallback;
750 prng = arc4random_prng_get(&fallback);
751 crypto_prng_buf(&prng->arc4_prng, &v, sizeof v);
752 arc4random_prng_put(prng, &fallback);
760 struct arc4random_prng *prng, fallback;
763 prng = arc4random_prng_get(&fallback);
764 crypto_prng_buf(&prng->arc4_prng, buf, len);
765 arc4random_prng_put(prng, &fallback);
769 prng = arc4random_prng_get(&fallback);
770 crypto_prng_buf(&prng->arc4_prng, seed, sizeof seed);
771 arc4random_prng_put(prng, &fallback);
781 struct arc4random_prng *prng, fallback;
801 prng = arc4random_prng_get(&fallback);
802 do crypto_prng_buf(&prng->arc4_prng, &r, sizeof r);
804 arc4random_prng_put(prng, &fallback);
812 struct arc4random_prng *prng, fallback;
814 prng = arc4random_prng_get(&fallback);
815 arc4random_prng_addrandom(prng, NULL, 0);
816 arc4random_prng_put(prng, &fallback);
826 struct arc4random_prng *prng, fallback;
830 prng = arc4random_prng_get(&fallback);
831 arc4random_prng_addrandom(prng, data, datalen);
832 arc4random_prng_put(prng, &fallback);
916 struct arc4random_prng *prng = NULL;
918 prng = arc4random_global.per_thread
922 if (prng == NULL)
923 prng = &arc4random_global.prng;
924 _exit(prng->arc4_epoch != 0);