123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657openMirage_crypto_rngmoduleUrandom=UrandommoduleGetentropy=Getentropyletuse_dev_urandom()=letg=create(moduleUrandom)inset_default_generatorgletuse_getentropy()=letg=create(moduleGetentropy)inset_default_generatorgletuse_default()=use_getentropy()letsrc=Logs.Src.create"mirage-crypto-rng.unix"~doc:"Mirage crypto RNG Unix"moduleLog=(valLogs.src_logsrc:Logs.LOG)externalgetrandom_buf:bytes->int->int->unit="mc_getrandom"[@@noalloc]letgetrandom_intobuf~off~len=getrandom_bufbufofflenletgetrandomsize=letbuf=Bytes.createsizeingetrandom_intobuf~off:0~len:size;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