Blame


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