Blame


1 db6608bd 2003-11-23 devnull #include "os.h"
2 db6608bd 2003-11-23 devnull #include <libsec.h>
3 db6608bd 2003-11-23 devnull
4 db6608bd 2003-11-23 devnull typedef struct State{
5 db6608bd 2003-11-23 devnull QLock lock;
6 db6608bd 2003-11-23 devnull int seeded;
7 db6608bd 2003-11-23 devnull uvlong seed;
8 db6608bd 2003-11-23 devnull DES3state des3;
9 db6608bd 2003-11-23 devnull } State;
10 db6608bd 2003-11-23 devnull static State x917state;
11 db6608bd 2003-11-23 devnull
12 db6608bd 2003-11-23 devnull static void
13 db6608bd 2003-11-23 devnull X917(uchar *rand, int nrand)
14 db6608bd 2003-11-23 devnull {
15 db6608bd 2003-11-23 devnull int i, m, n8;
16 db6608bd 2003-11-23 devnull uvlong I, x;
17 db6608bd 2003-11-23 devnull
18 db6608bd 2003-11-23 devnull /* 1. Compute intermediate value I = Ek(time). */
19 db6608bd 2003-11-23 devnull I = nsec();
20 db6608bd 2003-11-23 devnull triple_block_cipher(x917state.des3.expanded, (uchar*)&I, 0); /* two-key EDE */
21 db6608bd 2003-11-23 devnull
22 db6608bd 2003-11-23 devnull /* 2. x[i] = Ek(I^seed); seed = Ek(x[i]^I); */
23 db6608bd 2003-11-23 devnull m = (nrand+7)/8;
24 db6608bd 2003-11-23 devnull for(i=0; i<m; i++){
25 db6608bd 2003-11-23 devnull x = I ^ x917state.seed;
26 db6608bd 2003-11-23 devnull triple_block_cipher(x917state.des3.expanded, (uchar*)&x, 0);
27 db6608bd 2003-11-23 devnull n8 = (nrand>8) ? 8 : nrand;
28 db6608bd 2003-11-23 devnull memcpy(rand, (uchar*)&x, n8);
29 db6608bd 2003-11-23 devnull rand += 8;
30 db6608bd 2003-11-23 devnull nrand -= 8;
31 db6608bd 2003-11-23 devnull x ^= I;
32 db6608bd 2003-11-23 devnull triple_block_cipher(x917state.des3.expanded, (uchar*)&x, 0);
33 db6608bd 2003-11-23 devnull x917state.seed = x;
34 db6608bd 2003-11-23 devnull }
35 db6608bd 2003-11-23 devnull }
36 db6608bd 2003-11-23 devnull
37 db6608bd 2003-11-23 devnull static void
38 db6608bd 2003-11-23 devnull X917init(void)
39 db6608bd 2003-11-23 devnull {
40 db6608bd 2003-11-23 devnull int n;
41 db6608bd 2003-11-23 devnull uchar mix[128];
42 db6608bd 2003-11-23 devnull uchar key3[3][8];
43 db6608bd 2003-11-23 devnull ulong *ulp;
44 db6608bd 2003-11-23 devnull
45 db6608bd 2003-11-23 devnull ulp = (ulong*)key3;
46 db6608bd 2003-11-23 devnull for(n = 0; n < sizeof(key3)/sizeof(ulong); n++)
47 db6608bd 2003-11-23 devnull ulp[n] = truerand();
48 db6608bd 2003-11-23 devnull setupDES3state(&x917state.des3, key3, nil);
49 db6608bd 2003-11-23 devnull X917(mix, sizeof mix);
50 db6608bd 2003-11-23 devnull x917state.seeded = 1;
51 db6608bd 2003-11-23 devnull }
52 db6608bd 2003-11-23 devnull
53 db6608bd 2003-11-23 devnull void
54 db6608bd 2003-11-23 devnull genrandom(uchar *p, int n)
55 db6608bd 2003-11-23 devnull {
56 db6608bd 2003-11-23 devnull qlock(&x917state.lock);
57 db6608bd 2003-11-23 devnull if(x917state.seeded == 0)
58 db6608bd 2003-11-23 devnull X917init();
59 db6608bd 2003-11-23 devnull X917(p, n);
60 db6608bd 2003-11-23 devnull qunlock(&x917state.lock);
61 db6608bd 2003-11-23 devnull }