🐇

/*!{"author_url":"https://rvklein.me/","modified":"2020-12-01T06:00:00Z"}!*/

function Rando ($$)
{
	function Rando ()
	{
	}

	var $={};

	$.timeNow=function()
	{
		return(1*(new Date()));
	};

	$.arrayPickItems=function(x,y)
	{
		var i=0,k=0,j=x.length,z=[];

		while(j>k++)
		{
			if(true===x[k])
			{
				z[i++]=y[k];
			}
		}

		return(z);
	};

	$.arrayFilledBoolTrue=function(n)
	{
		var i=0,z=[];

		while(n>i++)
		{
			z[i]=true;
		}

		return(z);
	};

	$.arrayOfI32SplitBytes=function(a)
	{
		var j=(a.length),i=0,z=[];
		var h=(4*j),k=0;

		while(h>i&&j>k)
		{
			z[i]=((a[k]>>24)&0xFF);
			z[i+1]=((a[k]>>16)&0xFF);
			z[i+2]=((a[k]>>8)&0xFF);
			z[i+3]=((a[k])&0xFF);
			i=(i+4);
			k++;
		}

		return(z);
	};

	$.numI32Reverse=function(n)
	{
		return(
			(	(((n>> 0)&1)<<31)|(((n>> 1)&1)<<30)
			|	(((n>> 2)&1)<<29)|(((n>> 3)&1)<<28)
			|	(((n>> 4)&1)<<27)|(((n>> 5)&1)<<26)
			|	(((n>> 6)&1)<<25)|(((n>> 7)&1)<<24)
			|	(((n>> 8)&1)<<23)|(((n>> 9)&1)<<22)
			|	(((n>>10)&1)<<21)|(((n>>11)&1)<<20)
			|	(((n>>12)&1)<<19)|(((n>>13)&1)<<18)
			|	(((n>>14)&1)<<17)|(((n>>15)&1)<<16)
			|	(((n>>16)&1)<<15)|(((n>>17)&1)<<14)
			|	(((n>>18)&1)<<13)|(((n>>19)&1)<<12)
			|	(((n>>20)&1)<<11)|(((n>>21)&1)<<10)
			|	(((n>>22)&1)<< 9)|(((n>>23)&1)<< 8)
			|	(((n>>24)&1)<< 7)|(((n>>25)&1)<< 6)
			|	(((n>>26)&1)<< 5)|(((n>>27)&1)<< 4)
			|	(((n>>28)&1)<< 3)|(((n>>29)&1)<< 2)
			|	(((n>>30)&1)<< 1)|(((n>>31)&1)<< 0)
			)
		);
	};

	$.lcgpm31=function(s)
	{
		return(
			function()
			{
				s=(s%0x7FFFFFFF);
				if(0>=s){s+=0x7FFFFFFE;}
				s=((s*0xBC8F)%0x7FFFFFFF);

				return(s);
			}
		);
	};

	$.mb32=function(a)
	{
		var t=((a+1831565813)|0);
		t=(Math.imul((t^t>>>15),(1|t)));
		t=(t+Math.imul(t^t>>>7,61|t)^t);
		t=((t^t>>>14)>>>0);

		return(t);
	};

	$.getTimeStartHash=function(t)
	{
		var f=($.mb32),r=($.numI32Reverse);
		var u=0xFFFFFFFF;
		var g=0x5A827999F;
		var k=(0^(0-g));
		var b=(t%u),a=(t>>>31),i=0;
		var s=((t%g)^k);

		while(u<(t>>>i++)){}

		return(f(f((f(f(r(u-b))^a^(t>>>i))+1)^(31-i))^(r(f(t-1)-1))^(f(f(s)))));
	};

	$.timedContentionIterator=function()
	{
		var t=($.timeNow);
		var f=($.mb32);
		var i=0,k=0,w=[],z=[];
		var a=(t());
		var g=($.lcgpm31($.getTimeStartHash(a)));
		var x=(t()),y=(t());

		if(x!=y)
		{
			x=(t());
			y=(t());
		}

		while(x==y)
		{
			w[i++]=(f(g()+f(i)));
			y=(t());
		}

		var d=(y-x);
		var h=(Math.floor(i/d));

		while(h>k)
		{
			z[k++]=(f(f(w[((k%h)+(k*h))])+g()));
		}

		return( [d,i,z] );
	};

	$.collectEntropy=function(n)
	{
		var k=0,i=0,c=0,d=0,r=[],q=[],p=[],z=[],h=null;

		while(p.length<=n)
		{
			h=($.timedContentionIterator());
			r[k]=h[0];
			q[k]=h[1];
			p=(p.concat(h[2].slice()));
			k++;
		}

		d=((p.length)-n);
		h=0;

		var x=($.arrayFilledBoolTrue(p.length));

		while(d>c)
		{
			h=((h+d)%n);

			if(x[h]===true)
			{
				x[h]=false;
				c++;
			}
			else
			{
				h++;
			}
		}

		z=($.arrayPickItems(x,p));

		return([r,q,z]);
	};

	$.createCSPRNG=function()
	{
		var c=768;
		var e=($.collectEntropy(c));
		var a=($.arrayOfI32SplitBytes(e[2]).reverse());
		var h=($$.SHA3._384.digest(a));

		var k=(new Uint8Array(h.slice(1,33)));
		var n=(new Uint8Array(h.slice(36,48)));

		return(new $$.ChaCha20(k,n));
	};

	Rando.prototype.timedContentionIterator=($.timedContentionIterator);
	Rando.prototype.collectEntropy=($.collectEntropy);
	Rando.prototype.createCSPRNG=($.createCSPRNG);

	return(new Rando());
}

var rando=(Rando({"SHA3":SHA3,"ChaCha20":ChaCha20}));


/**/
/*
// console.log( rando.collectEntropy(768) );
*/
/**/