2 #include "../port/lib.h"
6 #include "../port/error.h"
10 /* machine specific hardware random number generator */
11 void (*hwrandbuf)(void*, ulong) = nil;
19 typedef struct Seedbuf Seedbuf;
32 randomsample(Ureg*, Timer *t)
36 if(s->randomcount == 0 || s->nbuf >= sizeof(s->buf))
38 s->bits = (s->bits<<2) ^ s->randomcount;
43 s->buf[s->nbuf++] ^= s->bits;
51 s = secalloc(sizeof(Seedbuf));
54 (*hwrandbuf)(s->buf, sizeof(s->buf));
56 /* Frequency close but not equal to HZ */
57 up->tns = (vlong)(MS2HZ+3)*1000000LL;
58 up->tmode = Tperiodic;
61 up->tf = randomsample;
63 while(s->nbuf < sizeof(s->buf)){
64 if(++s->randomcount <= 100000)
71 sha2_512(s->buf, sizeof(s->buf), s->buf, &s->ds);
72 setupChachastate(rs, s->buf, 32, s->buf+32, 12, 20);
83 rs = secalloc(sizeof(*rs));
84 qlock(rs); /* randomseed() unlocks once seeded */
85 kproc("randomseed", randomseed, nil);
89 randomread(void *p, ulong n)
100 /* copy chacha state and advance block counter */
104 rs->input[12] += (n + ChachaBsize-1)/ChachaBsize;
105 if(rs->input[12] < b) rs->input[13]++;
108 /* encrypt the buffer, can fault */
109 chacha_encrypt((uchar*)p, n, &c);
111 /* prevent state leakage */
112 memset(&c, 0, sizeof(c));
117 /* used by fastrand() */
119 genrandom(uchar *p, int n)