diff options
author | itojun <> | 2003-12-10 07:21:01 +0000 |
---|---|---|
committer | itojun <> | 2003-12-10 07:21:01 +0000 |
commit | 9c20b7b4c98d055a80e331deead893ae6180eff2 (patch) | |
tree | 8e9aca1cd8996540d85743c8eb41bcd68518820d | |
parent | 69c7506e35ed76129bf0240740001b973c27cb33 (diff) | |
download | openbsd-9c20b7b4c98d055a80e331deead893ae6180eff2.tar.gz openbsd-9c20b7b4c98d055a80e331deead893ae6180eff2.tar.bz2 openbsd-9c20b7b4c98d055a80e331deead893ae6180eff2.zip |
correct non-repetitive ID code, based on comments from niels provos.
- seed2 is necessary, but use it as "seed2 + x" not "seed2 ^ x".
- skipping number is not needed, so disable it for 16bit generator (makes
the repetition period to 30000)
-rw-r--r-- | src/lib/libc/net/res_random.c | 28 |
1 files changed, 16 insertions, 12 deletions
diff --git a/src/lib/libc/net/res_random.c b/src/lib/libc/net/res_random.c index c739e4a952..82d81e038a 100644 --- a/src/lib/libc/net/res_random.c +++ b/src/lib/libc/net/res_random.c | |||
@@ -1,4 +1,4 @@ | |||
1 | /* $OpenBSD: res_random.c,v 1.12 2002/06/27 10:14:02 itojun Exp $ */ | 1 | /* $OpenBSD: res_random.c,v 1.13 2003/12/10 07:21:01 itojun Exp $ */ |
2 | 2 | ||
3 | /* | 3 | /* |
4 | * Copyright 1997 Niels Provos <provos@physnet.uni-hamburg.de> | 4 | * Copyright 1997 Niels Provos <provos@physnet.uni-hamburg.de> |
@@ -111,9 +111,9 @@ pmod(u_int16_t gen, u_int16_t exp, u_int16_t mod) | |||
111 | 111 | ||
112 | while (u) { | 112 | while (u) { |
113 | if (u & 1) | 113 | if (u & 1) |
114 | s = (s*t) % mod; | 114 | s = (s * t) % mod; |
115 | u >>= 1; | 115 | u >>= 1; |
116 | t = (t*t) % mod; | 116 | t = (t * t) % mod; |
117 | } | 117 | } |
118 | return (s); | 118 | return (s); |
119 | } | 119 | } |
@@ -146,7 +146,7 @@ res_initid() | |||
146 | ru_b = (tmp & 0xfffe) | 1; | 146 | ru_b = (tmp & 0xfffe) | 1; |
147 | ru_a = pmod(RU_AGEN, (tmp >> 16) & 0xfffe, RU_M); | 147 | ru_a = pmod(RU_AGEN, (tmp >> 16) & 0xfffe, RU_M); |
148 | while (ru_b % 3 == 0) | 148 | while (ru_b % 3 == 0) |
149 | ru_b += 2; | 149 | ru_b += 2; |
150 | 150 | ||
151 | tmp = arc4random(); | 151 | tmp = arc4random(); |
152 | j = tmp % RU_N; | 152 | j = tmp % RU_N; |
@@ -159,17 +159,17 @@ res_initid() | |||
159 | */ | 159 | */ |
160 | 160 | ||
161 | while (noprime) { | 161 | while (noprime) { |
162 | for (i=0; i<PFAC_N; i++) | 162 | for (i = 0; i < PFAC_N; i++) |
163 | if (j%pfacts[i] == 0) | 163 | if (j % pfacts[i] == 0) |
164 | break; | 164 | break; |
165 | 165 | ||
166 | if (i>=PFAC_N) | 166 | if (i >= PFAC_N) |
167 | noprime = 0; | 167 | noprime = 0; |
168 | else | 168 | else |
169 | j = (j+1) % RU_N; | 169 | j = (j + 1) % RU_N; |
170 | } | 170 | } |
171 | 171 | ||
172 | ru_g = pmod(RU_GEN,j,RU_N); | 172 | ru_g = pmod(RU_GEN, j, RU_N); |
173 | ru_counter = 0; | 173 | ru_counter = 0; |
174 | 174 | ||
175 | gettimeofday(&tv, NULL); | 175 | gettimeofday(&tv, NULL); |
@@ -189,18 +189,22 @@ res_randomid() | |||
189 | if (!tmp) | 189 | if (!tmp) |
190 | tmp = arc4random(); | 190 | tmp = arc4random(); |
191 | 191 | ||
192 | #if 0 | ||
192 | /* Skip a random number of ids */ | 193 | /* Skip a random number of ids */ |
193 | n = tmp & 0x7; tmp = tmp >> 3; | 194 | n = tmp & 0x7; tmp = tmp >> 3; |
194 | if (ru_counter + n >= RU_MAX) | 195 | if (ru_counter + n >= RU_MAX) |
195 | res_initid(); | 196 | res_initid(); |
197 | #else | ||
198 | n = 0; | ||
199 | #endif | ||
196 | 200 | ||
197 | for (i=0; i<=n; i++) | 201 | for (i = 0; i <= n; i++) |
198 | /* Linear Congruential Generator */ | 202 | /* Linear Congruential Generator */ |
199 | ru_x = (ru_a*ru_x + ru_b) % RU_M; | 203 | ru_x = (ru_a * ru_x + ru_b) % RU_M; |
200 | 204 | ||
201 | ru_counter += i; | 205 | ru_counter += i; |
202 | 206 | ||
203 | return (ru_seed ^ pmod(ru_g,ru_seed2 ^ ru_x,RU_N)) | ru_msb; | 207 | return (ru_seed ^ pmod(ru_g, ru_seed2 + ru_x, RU_N)) | ru_msb; |
204 | } | 208 | } |
205 | 209 | ||
206 | #if 0 | 210 | #if 0 |