12345678910111213141516171819202122232425262728293031323334353637383940openMirage_crypto_rngletsrc=Logs.Src.create"mirage-crypto-rng.unix"~doc:"Mirage crypto RNG Unix"moduleLog=(valLogs.src_logsrc:Logs.LOG)externalgetrandom_buf:bytes->int->unit="mc_getrandom"[@@noalloc]letgetrandomsize=letbuf=Bytes.createsizeingetrandom_bufbufsize;Bytes.unsafe_to_stringbufletgetrandom_initi=letdata=getrandom128inEntropy.headeridataletrunning=Atomic.makefalseletinitialize(typea)?g(rng:agenerator)=ifAtomic.getrunningthenLog.debug(funm->m"Mirage_crypto_rng_unix.initialize has already been called, \
ignoring this call.")elsebegin(trylet_=default_generator()inLog.warn(funm->m"Mirage_crypto_rng.default_generator has already \
been set, check that this call is intentional");withNo_default_generator->());Atomic.setrunningtrue;letseed=letinit=Entropy.[bootstrap;whirlwind_bootstrap;bootstrap;getrandom_init]inList.mapi(funif->fi)init|>String.concat""inlet_=Entropy.register_source"getrandom"inset_default_generator(create?g~seedrng)end